start deplou
This commit is contained in:
170
DEPLOY.md
Normal file
170
DEPLOY.md
Normal file
@@ -0,0 +1,170 @@
|
||||
# Развёртывание 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;
|
||||
}
|
||||
```
|
||||
Reference in New Issue
Block a user