# Развёртывание news_flet ## Требования - Docker & Docker Compose (20.10+) - Git - PostgreSQL 13+ (внешний сервер или локальный контейнер) - MinIO S3 (локальный в Docker или облачный) ## Быстрый старт ### 1. Клонирование и подготовка ```bash git clone news_flet cd news_flet cp .env.example .env ``` ### 2. Редактирование .env Заполнить критические переменные: ```bash DATABASE_URL=postgresql+asyncpg://user:password@host:5432/news JWT_SECRET=<генерируем на продакшене> ADMIN_PASSWORD=<сильный пароль> VK_SERVICE_TOKEN= ``` ### 3. Запуск контейнеров ```bash docker compose build docker compose up -d ``` Сервис поднимается на: - **Frontend (React)**: http://localhost:80 - **API**: http://localhost/api/ (за nginx) - **MinIO**: http://localhost:9000 (если локально) - **API Docs**: http://localhost/api/docs ### 4. Первый запуск При старте API: - Автоматически запускает Alembic миграции - Создаёт таблицы в БД (если нет) - Создаёт default админ юзера (если нет) Логин админ-панели: ``` URL: http://localhost/admin/login Username: admin Password: <из .env ADMIN_PASSWORD> ``` ## Структура docker-compose ```yaml services: api: # FastAPI + Alembic + VK-парсер web: # React SPA + nginx minio: # S3-совместимое хранилище (опционально) ``` ## Переменные окружения | Переменная | Обязательна | Описание | |-----------|-----------|---------| | `DATABASE_URL` | ✅ | PostgreSQL + asyncpg подключение | | `JWT_SECRET` | ✅ | Ключ для подписи JWT токенов | | `ADMIN_PASSWORD` | ✅ | Пароль дефолт админа | | `VK_SERVICE_TOKEN` | ✅ | Токен сервиса ВКонтакте | | `MINIO_ENDPOINT` | — | MinIO хост (default: `minio:9000`) | | `MINIO_PUBLIC_URL` | — | Публичный URL для доступа к файлам | | `LOG_LEVEL` | — | DEBUG/INFO/WARNING (default: INFO) | ## Архитектура ### Frontend (`web-react/`) - React 18 + React Router - Admin панель: управление статьями, медиа, источниками ВК - Публичный фид с поиском по категориям и тегам - TipTap редактор с поддержкой видео, картинок, таблиц ### Backend (`api/`) - FastAPI + SQLAlchemy async - VK-парсер: загрузка статей из групп/публичных страниц - yt-dlp: скачивание видео из ВК на MinIO - Slug-based медиа: организованное хранилище на S3 - JWT auth + role-based access control ### Storage (`minio/`) - S3-совместимое хранилище - Структура: `articles/{slug}-{uuid}/images/` - Публичный доступ к медиа через HTTP ## Миграции БД При запуске API проверяет и применяет миграции через Alembic: ```bash # Ручно (внутри контейнера api): docker compose exec api alembic upgrade head ``` Новая миграция при изменении схемы: ```bash docker compose exec api alembic revision --autogenerate -m "description" ``` ## Мониторинг ### Логи ```bash docker compose logs -f api docker compose logs -f web ``` ### API документация Доступна по адресу `/api/docs` (требует auth) ## Production рекомендации - 🔒 Установить SSL сертификат (Let's Encrypt) - 🔐 Сменить все default пароли и токены - 💾 Настроить резервное копирование БД - 📊 Включить мониторинг (Prometheus/Grafana) - 🛡️ Настроить firewall и rate limiting - 🌍 Использовать CDN для медиа-файлов ## Решение проблем ### БД не подключается ```bash # Проверить подключение: docker compose exec api python -c "import asyncio; from bd.database import engine; asyncio.run(engine.connect())" ``` ### MinIO не доступен ```bash # Проверить health: curl http://localhost:9000/minio/health/live ``` ### Миграции не применились ```bash # Ручной запуск: docker compose exec api alembic upgrade head ``` ## Развёртывание на сервере 1. SSH на сервер 2. `git clone ...` → `cd news_flet` 3. Скопировать и отредактировать `.env` 4. `docker compose up -d` 5. Проверить: `curl http://localhost/` Если используется reverse proxy (nginx): ```nginx location / { proxy_pass http://localhost:80; proxy_set_header Host $host; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; } ```