пва
This commit is contained in:
@@ -169,3 +169,28 @@ curl http://127.0.0.1:3333/health
|
||||
```bash
|
||||
curl https://craftshop.твой-домен/api/health
|
||||
```
|
||||
|
||||
## 9. Бэкапы БД (systemd timer)
|
||||
|
||||
Установить таймер для автоматического бэкапа каждые 6 часов:
|
||||
|
||||
```bash
|
||||
# Установить sqlite3 для безопасного копирования
|
||||
apt-get install -y sqlite3
|
||||
|
||||
# Скопировать unit-файлы
|
||||
cp /opt/craftshop/scripts/craftshop-backup.service /etc/systemd/system/
|
||||
cp /opt/craftshop/scripts/craftshop-backup.timer /etc/systemd/system/
|
||||
|
||||
systemctl daemon-reload
|
||||
systemctl enable --now craftshop-backup.timer
|
||||
|
||||
# Проверить статус
|
||||
systemctl list-timers craftshop-backup.timer
|
||||
|
||||
# Ручной запуск для проверки
|
||||
systemctl start craftshop-backup.service
|
||||
ls /opt/craftshop/server/backups/
|
||||
```
|
||||
|
||||
Бэкапы хранятся 30 дней (настраивается в `scripts/backup-db.sh`).
|
||||
|
||||
@@ -0,0 +1,41 @@
|
||||
#!/usr/bin/env bash
|
||||
# Backup SQLite database — копирует .db файл с timestamp в директорию бэкапов.
|
||||
# Вызывается из systemd timer или cron.
|
||||
#
|
||||
# Использование: ./scripts/backup-db.sh [path-to-db] [backup-dir] [retention-days]
|
||||
# По умолчанию: db=server/prisma/prod.db, backup=server/backups, retention=30
|
||||
|
||||
set -euo pipefail
|
||||
|
||||
SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
|
||||
ROOT="$(cd "$SCRIPT_DIR/.." && pwd)"
|
||||
|
||||
DB_PATH="${1:-$ROOT/server/prisma/prod.db}"
|
||||
BACKUP_DIR="${2:-$ROOT/server/backups}"
|
||||
RETENTION_DAYS="${3:-30}"
|
||||
|
||||
if [[ ! -f "$DB_PATH" ]]; then
|
||||
echo "[$(date -Iseconds)] DB not found: $DB_PATH" >&2
|
||||
exit 1
|
||||
fi
|
||||
|
||||
mkdir -p "$BACKUP_DIR"
|
||||
|
||||
TIMESTAMP=$(date +%Y%m%d_%H%M%S)
|
||||
BACKUP_FILE="$BACKUP_DIR/craftshop_${TIMESTAMP}.db"
|
||||
|
||||
# SQLite-safe copy: use .backup to avoid copying a file mid-write
|
||||
if command -v sqlite3 &>/dev/null; then
|
||||
sqlite3 "$DB_PATH" ".backup '$BACKUP_FILE'"
|
||||
else
|
||||
# Fallback: plain copy (risk of inconsistent state if DB is being written)
|
||||
cp "$DB_PATH" "$BACKUP_FILE"
|
||||
fi
|
||||
|
||||
# Compress
|
||||
gzip -f "$BACKUP_FILE"
|
||||
|
||||
# Remove old backups
|
||||
find "$BACKUP_DIR" -name 'craftshop_*.db.gz' -mtime +"$RETENTION_DAYS" -delete
|
||||
|
||||
echo "[$(date -Iseconds)] Backup created: ${BACKUP_FILE}.gz"
|
||||
@@ -0,0 +1,7 @@
|
||||
[Unit]
|
||||
Description=Craftshop SQLite Database Backup
|
||||
After=network.target
|
||||
|
||||
[Service]
|
||||
Type=oneshot
|
||||
ExecStart=/opt/craftshop/scripts/backup-db.sh /opt/craftshop/server/prisma/prod.db /opt/craftshop/server/backups 30
|
||||
@@ -0,0 +1,9 @@
|
||||
[Unit]
|
||||
Description=Craftshop Database Backup Timer
|
||||
|
||||
[Timer]
|
||||
OnCalendar=*-*-* 00/6:00:00
|
||||
Persistent=true
|
||||
|
||||
[Install]
|
||||
WantedBy=timers.target
|
||||
Reference in New Issue
Block a user