Files
news_all_spo/DEPLOY.md
2026-05-17 19:32:48 +05:00

171 lines
5.2 KiB
Markdown
Raw Permalink Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# Развёртывание news_flet
## Требования
- Docker & Docker Compose (20.10+)
- Git
- PostgreSQL 13+ (внешний сервер или локальный контейнер)
- MinIO S3 (локальный в Docker или облачный)
## Быстрый старт
### 1. Клонирование и подготовка
```bash
git clone <repo-url> 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=<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;
}
```