# Развёртывание InviteMe в production ## 1. Сервер и DNS Используйте отдельный Linux-сервер с актуальными Docker Engine и Docker Compose. Создайте `A`/`AAAA`-запись домена InviteMe и направьте её на сервер. Разрешите входящие TCP 80/443 и UDP 443. Не публикуйте наружу PostgreSQL, Redis и порт 8888. ## 2. Конфигурация ```bash cp .env.example .env openssl rand -hex 32 openssl rand -hex 32 openssl rand -hex 32 ``` Запишите полученные значения в `SECRET_KEY`, `CREDENTIAL_ENCRYPTION_KEY` и `POSTGRES_PASSWORD`. В `DOMAIN` укажите публичное имя сервера без схемы и пути. Ограничьте доступ к файлу конфигурации: ```bash chmod 600 .env ``` `CREDENTIAL_ENCRYPTION_KEY` защищает сохранённые SMTP/EWS/IMAP-пароли. При его потере или изменении расшифровать эти пароли будет невозможно, поэтому сохраните ключ в менеджере паролей. ## 3. Первый запуск ```bash docker compose up -d --build docker compose ps docker compose exec inviteme flask --app run.py create-admin ``` В `docker compose ps` должны быть запущены приложение, отдельный `worker`, PostgreSQL, Redis и Caddy. Массовая рассылка выполняется worker-процессом и не зависит от открытой страницы браузера. Веб-страница первичной настройки в production отключена. Команда создания администратора проверяет сложность пароля и не принимает пароль аргументом командной строки. Проверьте состояние приложения: ```bash curl -fsS https://events.example.com/healthz ``` Замените адрес на значение `DOMAIN`. После создания пользователей откройте каждое мероприятие и назначьте сотрудников на входе. Неназначенный сотрудник не видит мероприятие и его гостей. ## 4. Резервное копирование Копируйте и PostgreSQL, и закрытый том приложения. Дамп базы не содержит фотографии гостей, QR-коды и сгенерированные билеты. ```bash docker compose exec -T database pg_dump -U inviteme -d inviteme -Fc > inviteme.dump docker run --rm --volumes-from "$(docker compose ps -q inviteme)" \ -v "$PWD":/backup alpine \ tar -czf /backup/inviteme-uploads.tar.gz -C /app/instance . ``` Храните резервные копии в зашифрованном виде и регулярно проверяйте восстановление. Никогда не добавляйте `.env` и бэкапы в Git. ## 5. Обновление Сначала создайте свежую резервную копию, затем выполните: ```bash git pull --ff-only docker compose build --pull docker compose up -d docker compose ps ``` Перед запуском Waitress сервис автоматически выполняет `flask db upgrade`. При ошибке миграции приложение не стартует — восстановите резервную копию или исправьте миграцию до повторного запуска. ## 6. Переход с существующего SQLite Не подключайте старый SQLite-файл к production-стеку. Сначала сохраните полную копию `instance/`. Новая версия при локальном запуске переносит старые файлы из `app/static/uploads` в закрытый каталог, но записи из SQLite в PostgreSQL нужно переносить как отдельную контролируемую операцию и проверять до переключения DNS. После переноса данных назначьте сотрудников нужным мероприятиям: новая production-модель не даёт роли `staff` автоматический доступ ко всем событиям. ## 7. Эксплуатация ```bash docker compose logs -f --tail=200 inviteme docker compose logs -f --tail=200 worker docker compose restart inviteme docker compose restart worker docker compose exec inviteme flask --app run.py routes ``` Контролируйте свободное место, ответы HTTP 5xx, состояние worker, неудачные входы, ошибки отправки почты и возраст последней резервной копии PostgreSQL. Ротацию секретов выполняйте только как плановое обслуживание.