feat: add production deployment for rf4spotter.ru
This commit is contained in:
@@ -0,0 +1,44 @@
|
||||
{
|
||||
email {$ACME_EMAIL}
|
||||
admin off
|
||||
}
|
||||
|
||||
{$SITE_DOMAIN} {
|
||||
encode zstd gzip
|
||||
|
||||
@admin path /admin/*
|
||||
handle @admin {
|
||||
basic_auth {
|
||||
{$ADMIN_BASIC_USER} {$ADMIN_BASIC_PASSWORD_HASH}
|
||||
}
|
||||
reverse_proxy web:4321
|
||||
}
|
||||
|
||||
@api path /api/* /health /ready
|
||||
handle @api {
|
||||
reverse_proxy api:8000
|
||||
}
|
||||
|
||||
handle {
|
||||
reverse_proxy web:4321
|
||||
}
|
||||
|
||||
header {
|
||||
-Server
|
||||
Strict-Transport-Security "max-age=31536000; includeSubDomains"
|
||||
X-Content-Type-Options "nosniff"
|
||||
Referrer-Policy "strict-origin-when-cross-origin"
|
||||
Permissions-Policy "camera=(), microphone=(), geolocation=()"
|
||||
}
|
||||
}
|
||||
|
||||
{$FILES_DOMAIN} {
|
||||
encode zstd gzip
|
||||
reverse_proxy minio:9000
|
||||
header {
|
||||
-Server
|
||||
Strict-Transport-Security "max-age=31536000; includeSubDomains"
|
||||
X-Content-Type-Options "nosniff"
|
||||
Referrer-Policy "no-referrer"
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,77 @@
|
||||
# Развёртывание закрытой альфы rf4spotter.ru
|
||||
|
||||
Production-контур рассчитан на один Linux-сервер с Docker Compose. Наружу публикуются только Caddy `80/443`; PostgreSQL, FastAPI и MinIO не имеют host-портов. Административные страницы защищены одновременно Caddy Basic Auth и API bearer token.
|
||||
|
||||
## 1. DNS и сервер
|
||||
|
||||
Создайте A-записи `rf4spotter.ru` и `files.rf4spotter.ru` на публичный IPv4 сервера. При наличии рабочего IPv6 добавьте AAAA для обоих имён. До запуска убедитесь, что извне доступны TCP 80/443 и UDP 443; SSH ограничьте своим IP или VPN. Порты 4321, 8000, 9000, 9001 и 5432 открывать нельзя.
|
||||
|
||||
Минимум для закрытой альфы: 2 vCPU, 4 ГБ RAM и 40 ГБ SSD. Рекомендуется 4 vCPU, 8 ГБ RAM и отдельное внешнее место для резервных копий.
|
||||
|
||||
## 2. Секреты
|
||||
|
||||
На сервере:
|
||||
|
||||
```bash
|
||||
cp .env.production.example .env.production
|
||||
chmod 600 .env.production
|
||||
openssl rand -base64 36 # повторить для пароля БД, ADMIN_TOKEN, RATE_LIMIT_SECRET и S3_SECRET_KEY
|
||||
docker run --rm caddy:2.10.2-alpine caddy hash-password --plaintext 'ОТДЕЛЬНЫЙ ADMIN-ПАРОЛЬ'
|
||||
```
|
||||
|
||||
Заполните `.env.production`. Если пароль PostgreSQL содержит специальные символы, в `DATABASE_URL` нужна URL-кодированная форма того же пароля. `.env.production` нельзя коммитить или пересылать вместе с логами.
|
||||
|
||||
## 3. Проверка и первый запуск
|
||||
|
||||
```bash
|
||||
docker compose --env-file .env.production -f compose.production.yaml config --quiet
|
||||
docker compose --env-file .env.production -f compose.production.yaml build
|
||||
docker compose --env-file .env.production -f compose.production.yaml up -d
|
||||
docker compose --env-file .env.production -f compose.production.yaml ps
|
||||
curl -fsS https://rf4spotter.ru/health
|
||||
curl -fsS https://rf4spotter.ru/ready
|
||||
```
|
||||
|
||||
API-контейнер перед стартом применяет Alembic-миграции и запускает seed. До альфы демонстрационные уловы следует убрать отдельной задачей; справочники должны остаться.
|
||||
|
||||
Проверка TLS и маршрутизации:
|
||||
|
||||
```bash
|
||||
curl -I https://rf4spotter.ru/
|
||||
curl -I https://files.rf4spotter.ru/minio/health/live
|
||||
```
|
||||
|
||||
MinIO health URL допустим для диагностики, но Console наружу не публикуется. Объекты доступны только по временным подписанным ссылкам.
|
||||
|
||||
## 4. Первичные данные
|
||||
|
||||
Официальный импорт запускается вручную после успешного readiness:
|
||||
|
||||
```bash
|
||||
docker compose --env-file .env.production -f compose.production.yaml exec api python -m app.cli import-records
|
||||
```
|
||||
|
||||
Автоматический scheduler не входит в production-файл. RF4MAP и RF4 Posts нельзя опрашивать чаще одного раза в 30 минут; до отдельной эксплуатационной задачи используйте только контролируемые ручные запуски и staging.
|
||||
|
||||
## 5. Обновление
|
||||
|
||||
```bash
|
||||
git pull --ff-only
|
||||
docker compose --env-file .env.production -f compose.production.yaml build
|
||||
docker compose --env-file .env.production -f compose.production.yaml up -d
|
||||
docker compose --env-file .env.production -f compose.production.yaml ps
|
||||
curl -fsS https://rf4spotter.ru/ready
|
||||
```
|
||||
|
||||
Перед обновлением со сменой схемы обязателен backup PostgreSQL. Не удаляйте volumes и не используйте `down -v`.
|
||||
|
||||
## 6. Что ещё блокирует приглашение альфа-пользователей
|
||||
|
||||
- проверенный backup/restore PostgreSQL и MinIO;
|
||||
- production-safe seed без демонстрационных уловов;
|
||||
- одноразовый секрет для повторной загрузки скриншота вместо одного UUID;
|
||||
- проверка полного bootstrap на пустых volumes;
|
||||
- политика хранения и удаления пользовательских данных;
|
||||
- базовый мониторинг `/ready`, диска и срока TLS-сертификата.
|
||||
|
||||
До закрытия этих пунктов контур можно поднять для технической проверки домена, но не следует открывать форму реальным пользователям.
|
||||
Reference in New Issue
Block a user