From 29fd3fd99efae4c1041f3dc3fd04cdd81fe83a68 Mon Sep 17 00:00:00 2001 From: Vladyslav Korzun Date: Mon, 17 Mar 2025 22:56:44 +0000 Subject: [PATCH] =?UTF-8?q?=D0=97=D0=B0=D0=B3=D1=80=D1=83=D0=B7=D0=B8?= =?UTF-8?q?=D1=82=D1=8C=20=D1=84=D0=B0=D0=B9=D0=BB=D1=8B=20=D0=B2=20=C2=AB?= =?UTF-8?q?/=C2=BB?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Dockerfile | 7 ++++++ app.py | 58 ++++++++++++++++++++++++++++++++++++++++++++++ docker-compose.yml | 33 ++++++++++++++++++++++++++ prepare-app.sh | 26 +++++++++++++++++++++ remove-app.sh | 13 +++++++++++ requirements.txt | 3 +++ start-app.sh | 24 +++++++++++++++++++ stop-app.sh | 5 ++++ 8 files changed, 169 insertions(+) create mode 100644 Dockerfile create mode 100644 app.py create mode 100644 docker-compose.yml create mode 100644 prepare-app.sh create mode 100644 remove-app.sh create mode 100644 requirements.txt create mode 100644 start-app.sh create mode 100644 stop-app.sh diff --git a/Dockerfile b/Dockerfile new file mode 100644 index 0000000..de09ef6 --- /dev/null +++ b/Dockerfile @@ -0,0 +1,7 @@ +FROM python:3.9 +WORKDIR /app +COPY requirements.txt . +RUN pip install -r requirements.txt +COPY . . +CMD ["python", "app.py"] + diff --git a/app.py b/app.py new file mode 100644 index 0000000..f0aa354 --- /dev/null +++ b/app.py @@ -0,0 +1,58 @@ +from flask import Flask, render_template, request, jsonify +import psycopg2 +import os + +app = Flask(__name__, template_folder="templates", static_folder="static") + +# Подключение к БД +def get_db_connection(): + conn = psycopg2.connect( + host="db", + database="mydatabase", + user="postgres", + password=os.getenv("POSTGRES_PASSWORD", "mysecretpassword") + ) + return conn + +# Главная страница с HTML +@app.route("/") +def home(): + conn = get_db_connection() + cur = conn.cursor() + cur.execute("SELECT id, name FROM users;") + users = cur.fetchall() + cur.close() + conn.close() + return render_template("index.html", users=users) + +# API для добавления пользователя +@app.route("/add_user", methods=["POST"]) +def add_user(): + name = request.form.get("name") + if name: + conn = get_db_connection() + cur = conn.cursor() + cur.execute("INSERT INTO users (name) VALUES (%s) RETURNING id;", (name,)) + user_id = cur.fetchone()[0] + conn.commit() + cur.close() + conn.close() + return jsonify({"id": user_id, "name": name}), 201 + return jsonify({"error": "Имя не может быть пустым"}), 400 + +# API для удаления пользователя +@app.route("/delete_user/", methods=["POST"]) +def delete_user(user_id): + conn = get_db_connection() + cur = conn.cursor() + cur.execute("DELETE FROM users WHERE id = %s RETURNING id;", (user_id,)) + deleted = cur.fetchone() + conn.commit() + cur.close() + conn.close() + if deleted: + return jsonify({"message": "Пользователь удален"}) + return jsonify({"error": "Пользователь не найден"}), 404 + +if __name__ == "__main__": + app.run(host="0.0.0.0", port=5000, debug=True) diff --git a/docker-compose.yml b/docker-compose.yml new file mode 100644 index 0000000..b019556 --- /dev/null +++ b/docker-compose.yml @@ -0,0 +1,33 @@ +version: "3.8" + +services: + web: + build: . + ports: + - "5000:5000" + depends_on: + - db + environment: + - POSTGRES_PASSWORD=mysecretpassword + + db: + image: postgres:13 + volumes: + - pgdata:/var/lib/postgresql/data + environment: + - POSTGRES_PASSWORD=mysecretpassword + - POSTGRES_DB=mydatabase + + pgadmin: + image: dpage/pgadmin4 + ports: + - "8080:80" + environment: + - PGADMIN_DEFAULT_EMAIL=user@domain.com + - PGADMIN_DEFAULT_PASSWORD=SuperSecret + depends_on: + - db + +volumes: + pgdata: + diff --git a/prepare-app.sh b/prepare-app.sh new file mode 100644 index 0000000..66add17 --- /dev/null +++ b/prepare-app.sh @@ -0,0 +1,26 @@ +#!/bin/bash +set -e + +echo "Vytvárame virtuálnu sieť..." +docker network create app_network || true + +echo "Vytvárame volume pre databázu..." +docker volume create pgdata || true + +echo "Budujeme obrazy..." +docker-compose build + +echo "Čakáme na spustenie databázy..." +sleep 5 # Dávame PostgreSQL čas na spustenie + +echo "Vytvárame tabuľku 'users' v databáze..." +docker-compose up -d db # Spustíme iba databázový kontajner +sleep 3 # Počkáme, kým sa PostgreSQL spustí + +docker exec $(docker-compose ps -q db) psql -U postgres -d mydatabase -c " +CREATE TABLE IF NOT EXISTS users ( + id SERIAL PRIMARY KEY, + name TEXT NOT NULL +);" + +echo "Príprava dokončená!" diff --git a/remove-app.sh b/remove-app.sh new file mode 100644 index 0000000..c3f6a19 --- /dev/null +++ b/remove-app.sh @@ -0,0 +1,13 @@ +#!/bin/bash +set -e + +echo "Odstraňujeme kontajnery..." +docker-compose down -v + +echo "Odstraňujeme volume..." +docker volume rm pgdata + +echo "Odstraňujeme virtuálnu sieť..." +docker network rm app_network + +echo "Odstránenie dokončené!" diff --git a/requirements.txt b/requirements.txt new file mode 100644 index 0000000..73adb22 --- /dev/null +++ b/requirements.txt @@ -0,0 +1,3 @@ +flask +psycopg2-binary + diff --git a/start-app.sh b/start-app.sh new file mode 100644 index 0000000..83ea49c --- /dev/null +++ b/start-app.sh @@ -0,0 +1,24 @@ +#!/bin/bash +set -e # Zastaví vykonávanie pri chybe + +echo "Spúšťame aplikáciu..." + +# Určujeme, ktorý príkaz `docker compose` je dostupný +if command -v docker-compose &> /dev/null; then + COMPOSE_CMD="docker-compose" +elif command -v docker &> /dev/null && docker compose version &> /dev/null; then + COMPOSE_CMD="docker compose" +else + echo "❌ Chyba: docker-compose alebo docker compose nie sú nainštalované!" + echo "Prosím, nainštalujte docker-compose:" + echo "sudo apt update && sudo apt install docker-compose-plugin -y" + exit 1 +fi + +# Spustenie kontajnerov +$COMPOSE_CMD up -d + +# Výstup informácií +echo "✅ Aplikácia bola úspešne spustená!" +echo "🌍 Otvorte webovú aplikáciu: http://localhost:5000" +echo "🗂 Otvorte pgAdmin: http://localhost:8080" diff --git a/stop-app.sh b/stop-app.sh new file mode 100644 index 0000000..d151321 --- /dev/null +++ b/stop-app.sh @@ -0,0 +1,5 @@ +#!/bin/bash +set -e + +echo "Zastavujeme kontajnery..." +docker-compose down