91 lines
5.1 KiB
Markdown
91 lines
5.1 KiB
Markdown
# Развёртывание 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. Ротацию секретов выполняйте только как плановое обслуживание.
|