# Развёртывание закрытой альфы 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-сертификата. До закрытия этих пунктов контур можно поднять для технической проверки домена, но не следует открывать форму реальным пользователям.