From 513ff3c144a0df4b597f9a4e11753aab68b86c5f Mon Sep 17 00:00:00 2001 From: Maksim Date: Mon, 1 Sep 2025 19:06:55 +0300 Subject: [PATCH] =?UTF-8?q?=D0=A0=D0=B5=D0=B0=D0=BB=D0=B8=D0=B7=D0=B0?= =?UTF-8?q?=D1=86=D0=B8=D1=8F=20=D0=B4=D0=BB=D1=8F=20=D0=B4=D0=B5=D0=B2?= =?UTF-8?q?=D0=B0=20=D1=81=20=D1=85=D0=BE=D1=82=20=D1=80=D0=B5=D0=BB=D0=BE?= =?UTF-8?q?=D0=B0=D0=B4=D0=BE=D0=BC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- README.md | 30 ++++++++++++++++++++-- docker-compose.dev.yml | 58 ++++++++++++++++++++++++++++++++++++++++++ docker-compose.yml | 2 ++ start_dev.py | 49 +++++++++++++++++++++++++++++++++++ start_prod.py | 49 +++++++++++++++++++++++++++++++++++ 5 files changed, 186 insertions(+), 2 deletions(-) create mode 100644 docker-compose.dev.yml create mode 100644 start_dev.py create mode 100644 start_prod.py diff --git a/README.md b/README.md index b980bb6..2eec9ed 100644 --- a/README.md +++ b/README.md @@ -11,11 +11,25 @@ - Docker и Docker Compose - Git -### Запуск всех сервисов +### Запуск всех сервисов (продакшн) ```bash -docker-compose up -d +docker compose up -d ``` +### Запуск в режиме разработки +```bash +# Автоматический запуск +python start_dev.py + +# Или вручную +docker compose -f docker-compose.dev.yml up -d +``` + +**Режим разработки** позволяет: +- Автоматически перезагружать Streamlit при изменении кода +- Монтировать исходный код напрямую в контейнер +- Видеть изменения без пересборки контейнеров + ### Доступ к сервисам - **FastAPI**: http://localhost:8000 - **Streamlit**: http://localhost:8501 @@ -72,6 +86,18 @@ python_parser_cf/ ## 🛠️ Разработка +### Режим разработки (рекомендуется) +```bash +# Запуск режима разработки +python start_dev.py + +# Остановка +docker compose -f docker-compose.dev.yml down + +# Возврат к продакшн режиму +python start_prod.py +``` + ### Локальная разработка FastAPI ```bash cd python_parser diff --git a/docker-compose.dev.yml b/docker-compose.dev.yml new file mode 100644 index 0000000..4327337 --- /dev/null +++ b/docker-compose.dev.yml @@ -0,0 +1,58 @@ +services: + minio: + image: minio/minio:latest + container_name: svodka_minio_dev + ports: + - "9000:9000" # API порт + - "9001:9001" # Консоль порт + environment: + MINIO_ROOT_USER: minioadmin + MINIO_ROOT_PASSWORD: minioadmin + command: server /data --console-address ":9001" + volumes: + - ./minio_data:/data + restart: unless-stopped + + fastapi: + build: ./python_parser + container_name: svodka_fastapi_dev + ports: + - "8000:8000" + environment: + - MINIO_ENDPOINT=minio:9000 + - MINIO_ACCESS_KEY=minioadmin + - MINIO_SECRET_KEY=minioadmin + - MINIO_SECURE=false + - MINIO_BUCKET=svodka-data + depends_on: + - minio + restart: unless-stopped + + streamlit: + image: python:3.11-slim + container_name: svodka_streamlit_dev + ports: + - "8501:8501" + environment: + - API_BASE_URL=http://fastapi:8000 + - API_PUBLIC_URL=http://localhost:8000 + - MINIO_ENDPOINT=minio:9000 + - MINIO_ACCESS_KEY=minioadmin + - MINIO_SECRET_KEY=minioadmin + - MINIO_SECURE=false + - MINIO_BUCKET=svodka-data + volumes: + # Монтируем исходный код для автоматической перезагрузки + - ./streamlit_app:/app + # Монтируем requirements.txt для установки зависимостей + - ./streamlit_app/requirements.txt:/app/requirements.txt + working_dir: /app + depends_on: + - minio + - fastapi + restart: unless-stopped + command: > + bash -c " + pip install --no-cache-dir -r requirements.txt && + streamlit run streamlit_app.py --server.port=8501 --server.address=0.0.0.0 --server.runOnSave=true + " \ No newline at end of file diff --git a/docker-compose.yml b/docker-compose.yml index d9326b8..9b63683 100644 --- a/docker-compose.yml +++ b/docker-compose.yml @@ -1,3 +1,5 @@ +# Продакшн конфигурация +# Для разработки используйте: docker compose -f docker-compose.dev.yml up -d services: minio: image: minio/minio:latest diff --git a/start_dev.py b/start_dev.py new file mode 100644 index 0000000..2c835f3 --- /dev/null +++ b/start_dev.py @@ -0,0 +1,49 @@ +#!/usr/bin/env python3 +""" +Скрипт для запуска проекта в режиме разработки +""" + +import subprocess +import sys +import os + +def run_command(command, description): + """Выполнение команды с выводом""" + print(f"🔄 {description}...") + try: + result = subprocess.run(command, shell=True, check=True, capture_output=True, text=True) + print(f"✅ {description} выполнено успешно") + return True + except subprocess.CalledProcessError as e: + print(f"❌ Ошибка при {description.lower()}:") + print(f" Команда: {command}") + print(f" Ошибка: {e.stderr}") + return False + +def main(): + print("🚀 Запуск проекта в режиме разработки") + print("=" * 50) + + # Останавливаем продакшн контейнеры если они запущены + if run_command("docker compose ps", "Проверка статуса контейнеров"): + if "Up" in subprocess.run("docker compose ps", shell=True, capture_output=True, text=True).stdout: + print("🛑 Останавливаю продакшн контейнеры...") + run_command("docker compose down", "Остановка продакшн контейнеров") + + # Запускаем режим разработки + print("\n🔧 Запуск режима разработки...") + if run_command("docker compose -f docker-compose.dev.yml up -d", "Запуск контейнеров разработки"): + print("\n🎉 Проект запущен в режиме разработки!") + print("\n📍 Доступные сервисы:") + print(" • Streamlit: http://localhost:8501") + print(" • FastAPI: http://localhost:8000") + print(" • MinIO Console: http://localhost:9001") + print("\n💡 Теперь изменения в streamlit_app/ будут автоматически перезагружаться!") + print("\n🛑 Для остановки используйте:") + print(" docker compose -f docker-compose.dev.yml down") + else: + print("\n❌ Не удалось запустить проект в режиме разработки") + sys.exit(1) + +if __name__ == "__main__": + main() \ No newline at end of file diff --git a/start_prod.py b/start_prod.py new file mode 100644 index 0000000..ee9d7d4 --- /dev/null +++ b/start_prod.py @@ -0,0 +1,49 @@ +#!/usr/bin/env python3 +""" +Скрипт для запуска проекта в продакшн режиме +""" + +import subprocess +import sys + +def run_command(command, description): + """Выполнение команды с выводом""" + print(f"🔄 {description}...") + try: + result = subprocess.run(command, shell=True, check=True, capture_output=True, text=True) + print(f"✅ {description} выполнено успешно") + return True + except subprocess.CalledProcessError as e: + print(f"❌ Ошибка при {description.lower()}:") + print(f" Команда: {command}") + print(f" Ошибка: {e.stderr}") + return False + +def main(): + print("🚀 Запуск проекта в продакшн режиме") + print("=" * 50) + + # Останавливаем контейнеры разработки если они запущены + if run_command("docker compose -f docker-compose.dev.yml ps", "Проверка статуса контейнеров разработки"): + if "Up" in subprocess.run("docker compose -f docker-compose.dev.yml ps", shell=True, capture_output=True, text=True).stdout: + print("🛑 Останавливаю контейнеры разработки...") + run_command("docker compose -f docker-compose.dev.yml down", "Остановка контейнеров разработки") + + # Запускаем продакшн режим + print("\n🏭 Запуск продакшн режима...") + if run_command("docker compose up -d --build", "Запуск продакшн контейнеров"): + print("\n🎉 Проект запущен в продакшн режиме!") + print("\n📍 Доступные сервисы:") + print(" • Streamlit: http://localhost:8501") + print(" • FastAPI: http://localhost:8000") + print(" • MinIO Console: http://localhost:9001") + print("\n💡 Для разработки используйте:") + print(" python start_dev.py") + print("\n🛑 Для остановки используйте:") + print(" docker compose down") + else: + print("\n❌ Не удалось запустить проект в продакшн режиме") + sys.exit(1) + +if __name__ == "__main__": + main() \ No newline at end of file