diff --git a/.env b/.env new file mode 100644 index 0000000..f35b68a --- /dev/null +++ b/.env @@ -0,0 +1,10 @@ +#Пример .env файла. Используем его чтобы не указывать чувствительные данные (пароли, ключи, API и т.д.) напрямую в коде +# PostgreSQL +POSTGRES_USER=user +POSTGRES_PASSWORD=password +POSTGRES_DB=website +DB_HOST=database + +# Nginx bublick & private key +SSL_CERT_FILE=./nginx/ssl/domain.crt +SSL_KEY_FILE=./nginx/ssl/domain.key \ No newline at end of file diff --git a/README.md b/README.md index 0186ba6..60806e8 100644 --- a/README.md +++ b/README.md @@ -1 +1 @@ -Первый пуш, не гарантирую работоспособность этого кода \ No newline at end of file +Все в дом все в дом diff --git a/backend/requirements.txt b/backend/requirements.txt index 88c17be..6a1a434 100644 --- a/backend/requirements.txt +++ b/backend/requirements.txt @@ -1,2 +1,3 @@ Flask -psycopg2-binary \ No newline at end of file +psycopg2-binary +python-dotenv \ No newline at end of file diff --git a/backend/server.py b/backend/server.py index e70d1cf..c2e6566 100644 --- a/backend/server.py +++ b/backend/server.py @@ -1,20 +1,26 @@ from flask import Flask, request, render_template import psycopg2 +import os +from dotenv import load_dotenv +load_dotenv() app = Flask(__name__, template_folder='/media/frontend') - DATABASE = { - 'dbname': 'WebSite', - 'user': 'User', - 'password': 'Password', - 'host': 'DataBase', + 'dbname': os.getenv('POSTGRES_DB'), + 'user': os.getenv('POSTGRES_USER'), + 'password': os.getenv('POSTGRES_PASSWORD'), + 'host': os.getenv('DB_HOST') } def get_db_connection(): - conn = psycopg2.connect(**DATABASE) - return conn + try: + conn = psycopg2.connect(**DATABASE) + return conn + except psycopg2.Error as e: + print(f"Ошибка подключения к базе данных: {e}") + raise @app.route('/', methods=['GET']) def index(): @@ -23,45 +29,50 @@ def index(): @app.route('/submit', methods=['POST']) def submit(): action = request.form.get('action') + message = "" - if action == 'Login': - username = request.form.get('username') - password = request.form.get('password') - + try: conn = get_db_connection() cur = conn.cursor() - cur.execute('SELECT * FROM users WHERE username = %s AND password = %s', (username, password)) - user = cur.fetchone() + if action == 'Login': + username = request.form.get('username') + password = request.form.get('password') - cur.close() - conn.close() + cur.execute( + 'SELECT * FROM users WHERE username = %s AND password = %s', + (username, password) + ) + user = cur.fetchone() + + message = "Успешный вход!" if user else "Неправильные имя пользователя или пароль!" + + elif action == 'Register': + new_username = request.form.get('new_username') + new_password = request.form.get('new_password') + + cur.execute('SELECT * FROM users WHERE username = %s', (new_username,)) + if cur.fetchone(): + message = "Пользователь уже существует!" + else: + cur.execute( + 'INSERT INTO users (username, password) VALUES (%s, %s)', + (new_username, new_password) + ) + conn.commit() + message = "Успешная регистрация!" - if user: - message = "Login successful!" else: - message = "Invalid username or password." + message = "Неизвестное действие" - elif action == 'Register': - new_username = request.form.get('new_username') - new_password = request.form.get('new_password') - - conn = get_db_connection() - cur = conn.cursor() - - cur.execute('SELECT * FROM users WHERE username = %s', (new_username,)) - if cur.fetchone(): - message = "User already exists!" - else: - cur.execute('INSERT INTO users (username, password) VALUES (%s, %s)', (new_username, new_password)) - conn.commit() - message = "Registration successful!" - - cur.close() - conn.close() - - else: - message = "Invalid action." + except psycopg2.Error as e: + conn.rollback() + message = f"Ошибка базы данных: {e}" + finally: + if 'cur' in locals(): + cur.close() + if 'conn' in locals(): + conn.close() return render_template('index.html', message=message) diff --git a/conf/domain.crt b/conf/domain.crt deleted file mode 100644 index 4318e83..0000000 --- a/conf/domain.crt +++ /dev/null @@ -1 +0,0 @@ -Наш сертификат \ No newline at end of file diff --git a/conf/domain.key b/conf/domain.key deleted file mode 100644 index e04f70f..0000000 --- a/conf/domain.key +++ /dev/null @@ -1 +0,0 @@ -Приватный ключ \ No newline at end of file diff --git a/docker/init.sql b/db/init.sql similarity index 96% rename from docker/init.sql rename to db/init.sql index 1826275..6ca779b 100644 --- a/docker/init.sql +++ b/db/init.sql @@ -1,5 +1,5 @@ -CREATE TABLE users ( - id SERIAL PRIMARY KEY, - username VARCHAR(50) UNIQUE NOT NULL, - password VARCHAR(50) NOT NULL +CREATE TABLE users ( + id SERIAL PRIMARY KEY, + username VARCHAR(50) UNIQUE NOT NULL, + password VARCHAR(50) NOT NULL ); \ No newline at end of file diff --git a/docker-compose.yaml b/docker-compose.yaml new file mode 100644 index 0000000..ce6f781 --- /dev/null +++ b/docker-compose.yaml @@ -0,0 +1,51 @@ +services: + database: + image: postgres:17.4-alpine3.21 + container_name: database + ports: + - "5432:5432" + environment: + POSTGRES_DB: ${POSTGRES_DB} + POSTGRES_USER: ${POSTGRES_USER} + POSTGRES_PASSWORD: ${POSTGRES_PASSWORD} + +#Монтируем директорию на хосте, чтобы при повторных "docker-compose up" таблицы с нашими данными сохранялись + volumes: + - /database:/var/lib/postgresql/data + cpus: '0.15' + mem_limit: 256M + + healthcheck: + test: ["CMD-SHELL", "pg_isready -U admin -WebSite"] + interval: 5s + timeout: 5s + retries: 5 + + webserver: + image: nginx:1.27.4-alpine + container_name: webserver + ports: + - "80:80" + - "443:443" + volumes: + - /WebApp/frontend:/usr/share/nginx/html + - /WebApp/nginx/ssl:/etc/nginx/sites-available + - /WebApp/nginx/nginx.conf:/etc/nginx/nginx.conf + + depends_on: + - database + - backend + cpus: '0.15' + mem_limit: 256M + backend: + image: python:3.9 + container_name: backend_part + ports: + - "5000:5000" + volumes: + - /WebApp/backend:/media/backend + working_dir: /media/backend + command: > + sh -c "pip install -r requirements.txt && python server.py" + cpus: '0.35' + mem_limit: 256M diff --git a/docker/docker-compose.yml b/docker/docker-compose.yml deleted file mode 100644 index 4764d74..0000000 --- a/docker/docker-compose.yml +++ /dev/null @@ -1,51 +0,0 @@ -services: - - DataBase: - image: postgres:latest - container_name: DataBase - ports: - - "5432:5432" -#Так никто не делает в реальных кейсах, я просто даун, не умею работать с секретами (опция secrets) - environment: - POSTGRES_USER: user - POSTGRES_PASSWORD: password - POSTGRES_DB: WebSite - volumes: - - /home/git/myprojects/database:/var/lib/postgresql/data - cpus: '0.15' - mem_limit: 256M - - healthcheck: - test: ["CMD-SHELL", "pg_isready -U admin -WebSite"] - interval: 5s - timeout: 5s - retries: 5 - - webserver: - image: nginx:latest - container_name: WebServer - ports: - - "80:80" - - "443:443" - volumes: - - /home/git/myprojects/WorkServer/frontend:/usr/share/nginx/html - - /home/git/myprojects/WorkServer/conf:/etc/nginx/sites-available - - depends_on: - - DataBase - - backend - cpus: '0.15' - mem_limit: 256M - backend: - image: python:3.9 - container_name: backend_part - ports: - - "5000:5000" - volumes: - - /home/git/myprojects/WorkServer/backend:/media/backend - - /home/git/myprojects/WorkServer/frontend:/media/frontend - working_dir: /media/backend - command: > - sh -c "pip install -r requirements.txt && python server.py" - cpus: '0.35' - mem_limit: 256M diff --git a/docker/dockfile/Dockerfile b/docker/dockfile/Dockerfile deleted file mode 100644 index b3f3e81..0000000 --- a/docker/dockfile/Dockerfile +++ /dev/null @@ -1,3 +0,0 @@ -FROM nginx:v1 - -COPY nginx.conf /etc/nginx/nginx.conf diff --git a/frontend/index.html b/frontend/index.html new file mode 100644 index 0000000..37a49d8 --- /dev/null +++ b/frontend/index.html @@ -0,0 +1,36 @@ + + +
+ + +