feat: harden production data and backups
This commit is contained in:
+20
-5
@@ -32,7 +32,7 @@ curl -fsS https://rf4spotter.ru/health
|
||||
curl -fsS https://rf4spotter.ru/ready
|
||||
```
|
||||
|
||||
API-контейнер перед стартом применяет Alembic-миграции и запускает seed. До альфы демонстрационные уловы следует убрать отдельной задачей; справочники должны остаться.
|
||||
API-контейнер перед стартом применяет Alembic-миграции и запускает идемпотентный seed. В production он добавляет только минимальные справочники и точки; демонстрационные уловы жёстко отключены настройкой `SEED_DEMO_DATA=false`.
|
||||
|
||||
Проверка TLS и маршрутизации:
|
||||
|
||||
@@ -65,11 +65,26 @@ curl -fsS https://rf4spotter.ru/ready
|
||||
|
||||
Перед обновлением со сменой схемы обязателен backup PostgreSQL. Не удаляйте volumes и не используйте `down -v`.
|
||||
|
||||
## 6. Что ещё блокирует приглашение альфа-пользователей
|
||||
## 6. Резервное копирование и восстановление
|
||||
|
||||
- проверенный backup/restore PostgreSQL и MinIO;
|
||||
- production-safe seed без демонстрационных уловов;
|
||||
- одноразовый секрет для повторной загрузки скриншота вместо одного UUID;
|
||||
Храните копии вне диска приложения. Скрипт создаёт PostgreSQL dump, архив MinIO и контрольные суммы в новом каталоге с UTC-временем:
|
||||
|
||||
```bash
|
||||
./deploy/backup.sh /srv/rf4-backups
|
||||
```
|
||||
|
||||
Восстановление заменяет содержимое PostgreSQL и MinIO данными из выбранной копии, временно останавливая API, web и MinIO. Это намеренно защищённая подтверждением операция:
|
||||
|
||||
```bash
|
||||
CONFIRM_RESTORE=rf4-spotter ./deploy/restore.sh /srv/rf4-backups/20260906T120000Z
|
||||
curl -fsS https://rf4spotter.ru/ready
|
||||
```
|
||||
|
||||
Перед приглашением пользователей проведите учебное восстановление на отдельном сервере или с отдельным Compose project name. Одной только успешной архивации недостаточно. После проверки настройте ежедневный запуск `backup.sh`, шифрование/выгрузку копий во внешнее хранилище и уведомление при ошибке; храните минимум 7 ежедневных и 4 еженедельных копии.
|
||||
|
||||
## 7. Что ещё блокирует приглашение альфа-пользователей
|
||||
|
||||
- учебное восстановление PostgreSQL и MinIO на изолированном контуре;
|
||||
- проверка полного bootstrap на пустых volumes;
|
||||
- политика хранения и удаления пользовательских данных;
|
||||
- базовый мониторинг `/ready`, диска и срока TLS-сертификата.
|
||||
|
||||
Executable
+26
@@ -0,0 +1,26 @@
|
||||
#!/bin/sh
|
||||
set -eu
|
||||
|
||||
if [ "$#" -ne 1 ]; then
|
||||
echo "Usage: $0 ABSOLUTE_BACKUP_DIRECTORY" >&2
|
||||
exit 2
|
||||
fi
|
||||
|
||||
case "$1" in
|
||||
/*) ;;
|
||||
*) echo "Backup directory must be an absolute path" >&2; exit 2 ;;
|
||||
esac
|
||||
|
||||
backup_root=${1%/}
|
||||
stamp=$(date -u +%Y%m%dT%H%M%SZ)
|
||||
target="$backup_root/$stamp"
|
||||
mkdir -p "$target"
|
||||
chmod 700 "$target"
|
||||
export BACKUP_DIRECTORY="$backup_root"
|
||||
|
||||
compose="docker compose --env-file .env.production -f compose.production.yaml"
|
||||
$compose exec -T db sh -c 'pg_dump --format=custom --no-owner --no-acl -U "$POSTGRES_USER" -d "$POSTGRES_DB"' > "$target/postgres.dump"
|
||||
$compose run --rm storage-tool tar -czf "/backup/$stamp/minio.tar.gz" -C /data .
|
||||
sha256sum "$target/postgres.dump" "$target/minio.tar.gz" > "$target/SHA256SUMS"
|
||||
chmod 600 "$target/postgres.dump" "$target/minio.tar.gz" "$target/SHA256SUMS"
|
||||
echo "Backup created: $target"
|
||||
Executable
+27
@@ -0,0 +1,27 @@
|
||||
#!/bin/sh
|
||||
set -eu
|
||||
|
||||
if [ "$#" -ne 1 ] || [ "${CONFIRM_RESTORE:-}" != "rf4-spotter" ]; then
|
||||
echo "Usage: CONFIRM_RESTORE=rf4-spotter $0 ABSOLUTE_BACKUP_DIRECTORY/TIMESTAMP" >&2
|
||||
exit 2
|
||||
fi
|
||||
|
||||
case "$1" in
|
||||
/*) ;;
|
||||
*) echo "Backup directory must be an absolute path" >&2; exit 2 ;;
|
||||
esac
|
||||
|
||||
source_dir=${1%/}
|
||||
test -f "$source_dir/postgres.dump"
|
||||
test -f "$source_dir/minio.tar.gz"
|
||||
(cd "$source_dir" && sha256sum -c SHA256SUMS)
|
||||
backup_root=$(dirname "$source_dir")
|
||||
stamp=$(basename "$source_dir")
|
||||
export BACKUP_DIRECTORY="$backup_root"
|
||||
|
||||
compose="docker compose --env-file .env.production -f compose.production.yaml"
|
||||
$compose stop api web minio
|
||||
$compose exec -T db sh -c 'pg_restore --clean --if-exists --exit-on-error --no-owner --no-acl -U "$POSTGRES_USER" -d "$POSTGRES_DB"' < "$source_dir/postgres.dump"
|
||||
$compose run --rm storage-tool sh -c 'find /data -mindepth 1 -delete && tar -xzf "/backup/'"$stamp"'/minio.tar.gz" -C /data'
|
||||
$compose up -d minio api web proxy
|
||||
echo "Restore completed from: $source_dir"
|
||||
Reference in New Issue
Block a user