Реализация для дева с хот релоадом
This commit is contained in:
30
README.md
30
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
|
||||
|
||||
58
docker-compose.dev.yml
Normal file
58
docker-compose.dev.yml
Normal file
@@ -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
|
||||
"
|
||||
@@ -1,3 +1,5 @@
|
||||
# Продакшн конфигурация
|
||||
# Для разработки используйте: docker compose -f docker-compose.dev.yml up -d
|
||||
services:
|
||||
minio:
|
||||
image: minio/minio:latest
|
||||
|
||||
49
start_dev.py
Normal file
49
start_dev.py
Normal file
@@ -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()
|
||||
49
start_prod.py
Normal file
49
start_prod.py
Normal file
@@ -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()
|
||||
Reference in New Issue
Block a user