diff --git a/.dockerignore b/.dockerignore new file mode 100644 index 000000000..48c0d29e0 --- /dev/null +++ b/.dockerignore @@ -0,0 +1,27 @@ +.git +.gitignore +.github + +__pycache__ +*.pyc +*.pyo +*.pyd +*.log + +venv +.venv +env + +.DS_Store +.idea +.vscode + +README.md +LICENSE +schema.pdf + +haproxy +nginx + +.env +.env.* \ No newline at end of file diff --git a/.env b/.env index 0406ce614..f5ebdc1d3 100644 --- a/.env +++ b/.env @@ -1,5 +1,5 @@ -MYSQL_ROOT_PASSWORD="YtReWq4321" - -MYSQL_DATABASE="virtd" -MYSQL_USER="app" -MYSQL_PASSWORD="QwErTy1234" +MYSQL_ROOT_PASSWORD="YtReWq4321" + +MYSQL_DATABASE="virtd" +MYSQL_USER="app" +MYSQL_PASSWORD="QwErTy1234" diff --git a/Dockerfile b/Dockerfile index d68b868d6..511f5c1fa 100644 --- a/Dockerfile +++ b/Dockerfile @@ -1,6 +1,6 @@ -FROM python:3.12-slim - -# Ваш код здесь # - -# Запускаем приложение с помощью uvicorn, делая его доступным по сети +FROM python:3.12-slim + +# Ваш код здесь # + +# Запускаем приложение с помощью uvicorn, делая его доступным по сети CMD ["uvicorn", "main:app", "--host", "0.0.0.0", "--port", "5000"] \ No newline at end of file diff --git a/Dockerfile.python b/Dockerfile.python new file mode 100644 index 000000000..3d6354cda --- /dev/null +++ b/Dockerfile.python @@ -0,0 +1,11 @@ +FROM python:3.12-slim AS builder +WORKDIR /app +COPY requirements.txt . +RUN pip install --no-cache-dir --prefix=/install -r requirements.txt + +FROM python:3.12-slim AS runtime +WORKDIR /app +COPY --from=builder /install /usr/local +COPY . . +EXPOSE 5000 +CMD ["uvicorn", "main:app", "--host", "0.0.0.0", "--port", "5000"] \ No newline at end of file diff --git a/LICENSE b/LICENSE index 9cf106272..9dccfa49c 100644 --- a/LICENSE +++ b/LICENSE @@ -1,19 +1,19 @@ -MIT License - -Permission is hereby granted, free of charge, to any person obtaining a copy -of this software and associated documentation files (the "Software"), to deal -in the Software without restriction, including without limitation the rights -to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -copies of the Software, and to permit persons to whom the Software is -furnished to do so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in all -copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE -SOFTWARE. +MIT License + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. diff --git a/README.md b/README.md index ff1c2bec3..53c5af9ee 100644 --- a/README.md +++ b/README.md @@ -1,96 +1,96 @@ -# shvirtd-example-python - -Учебный проект FastAPI-приложения для изучения Docker Compose. - -## Описание проекта - -Это простое веб-приложение на FastAPI, предназначенное для изучения контейнеризации и работы с Docker Compose. Приложение демонстрирует: - -- Создание веб-сервиса на FastAPI -- Подключение к базе данных MySQL -- Работу с прокси-серверами (Nginx → HAProxy → FastAPI) -- Корректную настройку сетей Docker -- Передачу IP-адресов через заголовки прокси - -### Функциональность - -При обращении к главной странице приложение: -1. Определяет IP-адрес клиента -2. Записывает время запроса и IP-адрес в базу данных MySQL -3. Возвращает эту информацию пользователю - -**Важно для обучения:** Если обращаться к приложению напрямую (минуя прокси), вы получите подсказку о неправильном выполнении задания. - -## Способы запуска - -### 1. Запуск через Docker Compose - -**Архитектура при запуске через Docker Compose:** -``` -Клиент → Nginx (8090) → HAProxy (8080) → FastAPI App (5000) → MySQL -``` - -### 2. Локальный запуск для разработки - -```bash -# Создайте виртуальное окружение -python3 -m venv venv -source venv/bin/activate # в Windows: venv\Scripts\activate - -# Установите зависимости -pip install -r requirements.txt - -# Настройте переменные окружения для подключения к БД(не забудьте отдельно запустить БД) -export DB_HOST='127.0.0.1' -export DB_USER='app' -export DB_PASSWORD='very_strong' -export DB_NAME='example' - -# Запустите приложение -uvicorn main:app --host 0.0.0.0 --port 5000 --reload -``` - -**Требования для локального запуска:** -- Python 3.12+ -- Запущенный сервер MySQL -- База данных и пользователь, настроенные согласно переменным окружения - -## Настройка базы данных MySQL - -```sql -CREATE DATABASE example; -CREATE USER 'app'@'localhost' IDENTIFIED BY 'very_strong'; -GRANT ALL PRIVILEGES ON example.* TO 'app'@'localhost'; -FLUSH PRIVILEGES; -``` - -## Доступные эндпоинты - -- `GET /` - главная страница (записывает запрос в БД и возвращает время + IP) -- `GET /requests` - просмотр всех записей из базы данных -- `GET /debug` - отладочная информация о заголовках запроса -- `GET /docs` - автоматическая документация FastAPI (Swagger UI) - -## Переменные окружения - -| Переменная | Значение по умолчанию | Описание | -|------------|----------------------|----------| -| `DB_HOST` | `127.0.0.1` | Хост базы данных MySQL | -| `DB_USER` | `app` | Пользователь БД | -| `DB_PASSWORD` | `very_strong` | Пароль БД | -| `DB_NAME` | `example` | Имя базы данных | - -## Проверка работы - -```bash -# При правильной настройке через прокси -curl http://localhost:8090 - -# При прямом обращении (НЕПРАВИЛЬНО) -curl http://localhost:5000 -# Получите подсказку о том, что нужно использовать порт 8090 -``` - -## Лицензия - -Этот проект распространяется под лицензией MIT (подробности в файле `LICENSE`). +# shvirtd-example-python + +Учебный проект FastAPI-приложения для изучения Docker Compose. + +## Описание проекта + +Это простое веб-приложение на FastAPI, предназначенное для изучения контейнеризации и работы с Docker Compose. Приложение демонстрирует: + +- Создание веб-сервиса на FastAPI +- Подключение к базе данных MySQL +- Работу с прокси-серверами (Nginx → HAProxy → FastAPI) +- Корректную настройку сетей Docker +- Передачу IP-адресов через заголовки прокси + +### Функциональность + +При обращении к главной странице приложение: +1. Определяет IP-адрес клиента +2. Записывает время запроса и IP-адрес в базу данных MySQL +3. Возвращает эту информацию пользователю + +**Важно для обучения:** Если обращаться к приложению напрямую (минуя прокси), вы получите подсказку о неправильном выполнении задания. + +## Способы запуска + +### 1. Запуск через Docker Compose + +**Архитектура при запуске через Docker Compose:** +``` +Клиент → Nginx (8090) → HAProxy (8080) → FastAPI App (5000) → MySQL +``` + +### 2. Локальный запуск для разработки + +```bash +# Создайте виртуальное окружение +python3 -m venv venv +source venv/bin/activate # в Windows: venv\Scripts\activate + +# Установите зависимости +pip install -r requirements.txt + +# Настройте переменные окружения для подключения к БД(не забудьте отдельно запустить БД) +export DB_HOST='127.0.0.1' +export DB_USER='app' +export DB_PASSWORD='very_strong' +export DB_NAME='example' + +# Запустите приложение +uvicorn main:app --host 0.0.0.0 --port 5000 --reload +``` + +**Требования для локального запуска:** +- Python 3.12+ +- Запущенный сервер MySQL +- База данных и пользователь, настроенные согласно переменным окружения + +## Настройка базы данных MySQL + +```sql +CREATE DATABASE example; +CREATE USER 'app'@'localhost' IDENTIFIED BY 'very_strong'; +GRANT ALL PRIVILEGES ON example.* TO 'app'@'localhost'; +FLUSH PRIVILEGES; +``` + +## Доступные эндпоинты + +- `GET /` - главная страница (записывает запрос в БД и возвращает время + IP) +- `GET /requests` - просмотр всех записей из базы данных +- `GET /debug` - отладочная информация о заголовках запроса +- `GET /docs` - автоматическая документация FastAPI (Swagger UI) + +## Переменные окружения + +| Переменная | Значение по умолчанию | Описание | +|------------|----------------------|----------| +| `DB_HOST` | `127.0.0.1` | Хост базы данных MySQL | +| `DB_USER` | `app` | Пользователь БД | +| `DB_PASSWORD` | `very_strong` | Пароль БД | +| `DB_NAME` | `example` | Имя базы данных | + +## Проверка работы + +```bash +# При правильной настройке через прокси +curl http://localhost:8090 + +# При прямом обращении (НЕПРАВИЛЬНО) +curl http://localhost:5000 +# Получите подсказку о том, что нужно использовать порт 8090 +``` + +## Лицензия + +Этот проект распространяется под лицензией MIT (подробности в файле `LICENSE`). diff --git a/compose.yaml b/compose.yaml new file mode 100644 index 000000000..45c3ecb34 --- /dev/null +++ b/compose.yaml @@ -0,0 +1,45 @@ +version: "3.8" + +include: + - proxy.yaml + +services: + web: + build: + context: . + dockerfile: Dockerfile.python + restart: on-failure + networks: + backend: + ipv4_address: 172.20.0.5 + environment: + DB_HOST: db + DB_USER: ${MYSQL_USER} + DB_PASSWORD: ${MYSQL_PASSWORD} + DB_NAME: ${MYSQL_DATABASE} + depends_on: + db: + condition: service_healthy + + db: + image: mysql:8 + restart: on-failure + networks: + backend: + ipv4_address: 172.20.0.10 + environment: + MYSQL_ROOT_PASSWORD: ${MYSQL_ROOT_PASSWORD} + MYSQL_DATABASE: ${MYSQL_DATABASE} + MYSQL_USER: ${MYSQL_USER} + MYSQL_PASSWORD: ${MYSQL_PASSWORD} + volumes: + - mysql_data:/var/lib/mysql + healthcheck: + test: ["CMD-SHELL", "mysqladmin ping -uroot -p$${MYSQL_ROOT_PASSWORD} --silent"] + interval: 10s + timeout: 5s + retries: 10 + start_period: 30s + +volumes: + mysql_data: diff --git a/haproxy/reverse/haproxy.cfg b/haproxy/reverse/haproxy.cfg index 81d4d3f9a..fe8bb8969 100644 --- a/haproxy/reverse/haproxy.cfg +++ b/haproxy/reverse/haproxy.cfg @@ -1,17 +1,17 @@ -global - maxconn 1000 - -defaults -default-server init-addr none - -frontend http_front -bind *:8080 -mode http -default_backend http_back - - - -backend http_back -balance roundrobin -mode http -server web 172.20.0.5:5000 check +global + maxconn 1000 + +defaults +default-server init-addr none + +frontend http_front +bind *:8080 +mode http +default_backend http_back + + + +backend http_back +balance roundrobin +mode http +server web 172.20.0.5:5000 check diff --git a/main.py b/main.py index 936394a11..050f8cd98 100644 --- a/main.py +++ b/main.py @@ -1,187 +1,187 @@ -from datetime import datetime -import os -from contextlib import contextmanager, asynccontextmanager - -import mysql.connector -from fastapi import FastAPI, Request, Depends, Header, HTTPException -from typing import Optional - - -# --- 1. Конфигурация --- -# Считываем конфигурацию БД из переменных окружения -db_host = os.environ.get('DB_HOST', '127.0.0.1') -db_user = os.environ.get('DB_USER', 'app') -db_password = os.environ.get('DB_PASSWORD', 'very_strong') -db_name = os.environ.get('DB_NAME', 'example') - -@asynccontextmanager -async def lifespan(app: FastAPI): - # Код, который выполнится перед запуском приложения - print("Приложение запускается...") - if ensure_table_exists(): - print("Соединение с БД установлено и таблица 'requests' готова к работе.") - else: - print("БД недоступна при старте. Таблица будет создана при первом запросе.") - - yield - - # Код, который выполнится при остановке приложения - print("Приложение останавливается.") - - -# Создаем экземпляр FastAPI с использованием lifespan -app = FastAPI( - title="Shvirtd Example FastAPI", - description="Учебный проект, FastAPI+Docker.", - version="1.0.0", - lifespan=lifespan -) - - -# --- 2. Управление соединением с БД --- -@contextmanager -def get_db_connection(): - db = None - try: - db = mysql.connector.connect( - host=db_host, - user=db_user, - password=db_password, - database=db_name - ) - yield db - finally: - if db is not None and db.is_connected(): - db.close() - - -# --- 2.1. Функция создания таблицы --- -def ensure_table_exists(): - """Создает таблицу requests если она не существует""" - try: - with get_db_connection() as db: - cursor = db.cursor() - create_table_query = f""" - CREATE TABLE IF NOT EXISTS {db_name}.requests ( - id INT AUTO_INCREMENT PRIMARY KEY, - request_date DATETIME, - request_ip VARCHAR(255) - ) - """ - cursor.execute(create_table_query) - db.commit() - cursor.close() - return True - except mysql.connector.Error as err: - print(f"Ошибка при создании таблицы: {err}") - return False - - -# --- 3. Зависимость для получения IP --- -def get_client_ip(x_real_ip: Optional[str] = Header(None)): - return x_real_ip - - -# --- 5. Основной эндпоинт --- -@app.get("/") -def index(request: Request, ip_address: Optional[str] = Depends(get_client_ip)): - final_ip = ip_address # Только из X-Forwarded-For, без fallback - - now = datetime.now() - current_time = now.strftime("%Y-%m-%d %H:%M:%S") - - try: - with get_db_connection() as db: - cursor = db.cursor() - query = "INSERT INTO requests (request_date, request_ip) VALUES (%s, %s)" - values = (current_time, final_ip) - cursor.execute(query, values) - db.commit() - cursor.close() - except mysql.connector.Error as err: - ensure_table_exists() - with get_db_connection() as db: - cursor = db.cursor() - query = "INSERT INTO requests (request_date, request_ip) VALUES (%s, %s)" - values = (current_time, final_ip) - cursor.execute(query, values) - db.commit() - cursor.close() - - # Подсказка для студентов при неправильном обращении - if final_ip is None: - ip_display = "похоже, что вы направляете запрос в неверный порт(например curl http://127.0.0.1:5000). Правильное выполнение задания - отправить запрос в порт 8090." - else: - ip_display = final_ip - - return f'TIME: {current_time}, IP: {ip_display}' - - -# --- 5. Отладочный эндпоинт --- -@app.get("/debug") -def debug_headers(request: Request): - """Показывает все заголовки для отладки откуда берется IP""" - return { - "headers": dict(request.headers), - "client_host": request.client.host if request.client else None, - "x_forwarded_for": request.headers.get('x-forwarded-for'), - "real_ip": request.headers.get('x-real-ip'), - "forwarded": request.headers.get('forwarded') - } - - -# --- 6. Эндпоинт для просмотра записей в БД --- -@app.get("/requests") -def get_requests(): - """Возвращает все записи из таблицы requests для проверки""" - try: - with get_db_connection() as db: - cursor = db.cursor() - query = "SELECT id, request_date, request_ip FROM requests ORDER BY id DESC LIMIT 50" - cursor.execute(query) - records = cursor.fetchall() - cursor.close() - - # Преобразуем записи в читабельный формат - result = [] - for record in records: - result.append({ - "id": record[0], - "request_date": record[1].strftime("%Y-%m-%d %H:%M:%S") if record[1] else None, - "request_ip": record[2] - }) - - return { - "total_records": len(result), - "records": result - } - except mysql.connector.Error as err: - ensure_table_exists() - with get_db_connection() as db: - cursor = db.cursor() - query = "SELECT id, request_date, request_ip FROM requests ORDER BY id DESC LIMIT 50" - cursor.execute(query) - records = cursor.fetchall() - cursor.close() - - # Преобразуем записи в читабельный формат - result = [] - for record in records: - result.append({ - "id": record[0], - "request_date": record[1].strftime("%Y-%m-%d %H:%M:%S") if record[1] else None, - "request_ip": record[2] - }) - - return { - "total_records": len(result), - "records": result - } - - -# --- 7. Запуск приложения --- -# Для запуска этого файла используется ASGI-сервер, например, uvicorn. -# Команда: uvicorn main:app --reload -if __name__ == '__main__': - import uvicorn - uvicorn.run(app, host='0.0.0.0', port=5000) +from datetime import datetime +import os +from contextlib import contextmanager, asynccontextmanager + +import mysql.connector +from fastapi import FastAPI, Request, Depends, Header, HTTPException +from typing import Optional + + +# --- 1. Конфигурация --- +# Считываем конфигурацию БД из переменных окружения +db_host = os.environ.get('DB_HOST', '127.0.0.1') +db_user = os.environ.get('DB_USER', 'app') +db_password = os.environ.get('DB_PASSWORD', 'very_strong') +db_name = os.environ.get('DB_NAME', 'example') + +@asynccontextmanager +async def lifespan(app: FastAPI): + # Код, который выполнится перед запуском приложения + print("Приложение запускается...") + if ensure_table_exists(): + print("Соединение с БД установлено и таблица 'requests' готова к работе.") + else: + print("БД недоступна при старте. Таблица будет создана при первом запросе.") + + yield + + # Код, который выполнится при остановке приложения + print("Приложение останавливается.") + + +# Создаем экземпляр FastAPI с использованием lifespan +app = FastAPI( + title="Shvirtd Example FastAPI", + description="Учебный проект, FastAPI+Docker.", + version="1.0.0", + lifespan=lifespan +) + + +# --- 2. Управление соединением с БД --- +@contextmanager +def get_db_connection(): + db = None + try: + db = mysql.connector.connect( + host=db_host, + user=db_user, + password=db_password, + database=db_name + ) + yield db + finally: + if db is not None and db.is_connected(): + db.close() + + +# --- 2.1. Функция создания таблицы --- +def ensure_table_exists(): + """Создает таблицу requests если она не существует""" + try: + with get_db_connection() as db: + cursor = db.cursor() + create_table_query = f""" + CREATE TABLE IF NOT EXISTS {db_name}.requests ( + id INT AUTO_INCREMENT PRIMARY KEY, + request_date DATETIME, + request_ip VARCHAR(255) + ) + """ + cursor.execute(create_table_query) + db.commit() + cursor.close() + return True + except mysql.connector.Error as err: + print(f"Ошибка при создании таблицы: {err}") + return False + + +# --- 3. Зависимость для получения IP --- +def get_client_ip(x_real_ip: Optional[str] = Header(None)): + return x_real_ip + + +# --- 5. Основной эндпоинт --- +@app.get("/") +def index(request: Request, ip_address: Optional[str] = Depends(get_client_ip)): + final_ip = ip_address # Только из X-Forwarded-For, без fallback + + now = datetime.now() + current_time = now.strftime("%Y-%m-%d %H:%M:%S") + + try: + with get_db_connection() as db: + cursor = db.cursor() + query = "INSERT INTO requests (request_date, request_ip) VALUES (%s, %s)" + values = (current_time, final_ip) + cursor.execute(query, values) + db.commit() + cursor.close() + except mysql.connector.Error as err: + ensure_table_exists() + with get_db_connection() as db: + cursor = db.cursor() + query = "INSERT INTO requests (request_date, request_ip) VALUES (%s, %s)" + values = (current_time, final_ip) + cursor.execute(query, values) + db.commit() + cursor.close() + + # Подсказка для студентов при неправильном обращении + if final_ip is None: + ip_display = "похоже, что вы направляете запрос в неверный порт(например curl http://127.0.0.1:5000). Правильное выполнение задания - отправить запрос в порт 8090." + else: + ip_display = final_ip + + return f'TIME: {current_time}, IP: {ip_display}' + + +# --- 5. Отладочный эндпоинт --- +@app.get("/debug") +def debug_headers(request: Request): + """Показывает все заголовки для отладки откуда берется IP""" + return { + "headers": dict(request.headers), + "client_host": request.client.host if request.client else None, + "x_forwarded_for": request.headers.get('x-forwarded-for'), + "real_ip": request.headers.get('x-real-ip'), + "forwarded": request.headers.get('forwarded') + } + + +# --- 6. Эндпоинт для просмотра записей в БД --- +@app.get("/requests") +def get_requests(): + """Возвращает все записи из таблицы requests для проверки""" + try: + with get_db_connection() as db: + cursor = db.cursor() + query = "SELECT id, request_date, request_ip FROM requests ORDER BY id DESC LIMIT 50" + cursor.execute(query) + records = cursor.fetchall() + cursor.close() + + # Преобразуем записи в читабельный формат + result = [] + for record in records: + result.append({ + "id": record[0], + "request_date": record[1].strftime("%Y-%m-%d %H:%M:%S") if record[1] else None, + "request_ip": record[2] + }) + + return { + "total_records": len(result), + "records": result + } + except mysql.connector.Error as err: + ensure_table_exists() + with get_db_connection() as db: + cursor = db.cursor() + query = "SELECT id, request_date, request_ip FROM requests ORDER BY id DESC LIMIT 50" + cursor.execute(query) + records = cursor.fetchall() + cursor.close() + + # Преобразуем записи в читабельный формат + result = [] + for record in records: + result.append({ + "id": record[0], + "request_date": record[1].strftime("%Y-%m-%d %H:%M:%S") if record[1] else None, + "request_ip": record[2] + }) + + return { + "total_records": len(result), + "records": result + } + + +# --- 7. Запуск приложения --- +# Для запуска этого файла используется ASGI-сервер, например, uvicorn. +# Команда: uvicorn main:app --reload +if __name__ == '__main__': + import uvicorn + uvicorn.run(app, host='0.0.0.0', port=5000) diff --git a/nginx/ingress/default.conf b/nginx/ingress/default.conf index 0de4cafbb..4b2ba2aa1 100644 --- a/nginx/ingress/default.conf +++ b/nginx/ingress/default.conf @@ -1,17 +1,17 @@ -server { -listen 8090; -server_name _; - - -access_log /var/log/nginx/access.log proxied; - -location / { - proxy_pass http://127.0.0.1:8080; - - - proxy_set_header Host $host; - proxy_set_header X-Real-IP $remote_addr; - proxy_set_header X-Forwarded-For $remote_addr; - proxy_set_header X-Forwarded-Proto $http_x_forwarded_proto; - } -} +server { +listen 8090; +server_name _; + + +access_log /var/log/nginx/access.log proxied; + +location / { + proxy_pass http://127.0.0.1:8080; + + + proxy_set_header Host $host; + proxy_set_header X-Real-IP $remote_addr; + proxy_set_header X-Forwarded-For $remote_addr; + proxy_set_header X-Forwarded-Proto $http_x_forwarded_proto; + } +} diff --git a/nginx/ingress/nginx.conf b/nginx/ingress/nginx.conf index 1e1fe5e1d..6f4a4c091 100644 --- a/nginx/ingress/nginx.conf +++ b/nginx/ingress/nginx.conf @@ -1,32 +1,32 @@ -user nginx; -worker_processes auto; - -error_log /var/log/nginx/error.log notice; -pid /var/run/nginx.pid; - - -events { - worker_connections 1024; -} - - -http { - default_type application/octet-stream; - - log_format main '$remote_addr - $remote_user [$time_local] "$request" ' - '$status $body_bytes_sent "$http_referer" ' - '"$http_user_agent" "$http_x_forwarded_for"'; - - log_format proxied '$http_x_real_ip - $remote_user [$time_local] ' - '"$request" $status $bytes_sent ' - '"$http_referer" "$http_user_agent" "$proxy_add_x_forwarded_for";'; - - access_log /var/log/nginx/access.log main; - - sendfile on; - - keepalive_timeout 65; - - - include /etc/nginx/conf.d/*.conf; -} +user nginx; +worker_processes auto; + +error_log /var/log/nginx/error.log notice; +pid /var/run/nginx.pid; + + +events { + worker_connections 1024; +} + + +http { + default_type application/octet-stream; + + log_format main '$remote_addr - $remote_user [$time_local] "$request" ' + '$status $body_bytes_sent "$http_referer" ' + '"$http_user_agent" "$http_x_forwarded_for"'; + + log_format proxied '$http_x_real_ip - $remote_user [$time_local] ' + '"$request" $status $bytes_sent ' + '"$http_referer" "$http_user_agent" "$proxy_add_x_forwarded_for";'; + + access_log /var/log/nginx/access.log main; + + sendfile on; + + keepalive_timeout 65; + + + include /etc/nginx/conf.d/*.conf; +} diff --git a/proxy.yaml b/proxy.yaml index 7ade3f526..05485607d 100644 --- a/proxy.yaml +++ b/proxy.yaml @@ -1,27 +1,27 @@ -version: '3.8' -services: - - reverse-proxy: - image: haproxy:2.4 - restart: always - networks: - backend: {} - ports: - - "127.0.0.1:8080:8080" - volumes: - - ./haproxy/reverse/haproxy.cfg:/usr/local/etc/haproxy/haproxy.cfg:rw - - ingress-proxy: - image: nginx:latest - restart: always - network_mode: host - volumes: - - ./nginx/ingress/default.conf:/etc/nginx/conf.d/default.conf:rw - - ./nginx/ingress/nginx.conf:/etc/nginx/nginx.conf:rw - -networks: - backend: - driver: bridge - ipam: - config: - - subnet: 172.20.0.0/24 +version: '3.8' +services: + + reverse-proxy: + image: haproxy:2.4 + restart: always + networks: + backend: {} + ports: + - "127.0.0.1:8080:8080" + volumes: + - ./haproxy/reverse/haproxy.cfg:/usr/local/etc/haproxy/haproxy.cfg:rw + + ingress-proxy: + image: nginx:latest + restart: always + network_mode: host + volumes: + - ./nginx/ingress/default.conf:/etc/nginx/conf.d/default.conf:rw + - ./nginx/ingress/nginx.conf:/etc/nginx/nginx.conf:rw + +networks: + backend: + driver: bridge + ipam: + config: + - subnet: 172.20.0.0/24 diff --git a/requirements.txt b/requirements.txt index 5d944b9b7..fffbf56c6 100644 --- a/requirements.txt +++ b/requirements.txt @@ -1,3 +1,3 @@ -fastapi==0.104.1 -uvicorn[standard]==0.24.0 -mysql-connector-python==8.2.0 +fastapi==0.104.1 +uvicorn[standard]==0.24.0 +mysql-connector-python==8.2.0