diff --git a/docker/README.md b/docker/README.md index 5f6cef07..55251528 100644 --- a/docker/README.md +++ b/docker/README.md @@ -217,6 +217,7 @@ The production stack includes automated PostgreSQL backups: - **Schedule:** Daily at 2am (configurable via `BACKUP_SCHEDULE`) - **Retention:** 7 daily, 4 weekly, 6 monthly - **Location:** `backup_data` Docker volume +- **Filestore:** When the `odoo_data` volume is mounted on the backup service, attachments under `/odoo_data/filestore/` are archived daily as `*_filestore_*.tar.gz` alongside the database dump To restore a backup: diff --git a/docker/backup.sh b/docker/backup.sh index 12f3c3e1..14e0de8f 100755 --- a/docker/backup.sh +++ b/docker/backup.sh @@ -11,6 +11,7 @@ # Environment variables: # PGHOST, PGPORT, PGUSER, PGPASSWORD, PGDATABASE (standard PostgreSQL vars) # BACKUP_DIR (default: /backups) +# FILESTORE_SRC (default: /odoo_data/filestore/$PGDATABASE) # BACKUP_KEEP_DAYS (default: 7) # BACKUP_KEEP_WEEKS (default: 4) # BACKUP_KEEP_MONTHS (default: 6) @@ -52,15 +53,33 @@ ln -sf "${BACKUP_FILE}" "${DAILY_DIR}/${PGDATABASE:-openspp}_latest.dump" echo "[$(date -Iseconds)] Daily backup complete: ${BACKUP_FILE}" +# Filestore backup (attachments, documents) when odoo data volume is mounted +FILESTORE_SRC="${FILESTORE_SRC:-/odoo_data/filestore/${PGDATABASE:-openspp}}" +FILESTORE_BACKUP_FILE="${PGDATABASE:-openspp}_filestore_${TIMESTAMP}.tar.gz" +if [ -d "${FILESTORE_SRC}" ]; then + echo "[$(date -Iseconds)] Starting filestore backup from ${FILESTORE_SRC}..." + tar -czf "${DAILY_DIR}/${FILESTORE_BACKUP_FILE}" -C "$(dirname "${FILESTORE_SRC}")" "$(basename "${FILESTORE_SRC}")" + ln -sf "${FILESTORE_BACKUP_FILE}" "${DAILY_DIR}/${PGDATABASE:-openspp}_filestore_latest.tar.gz" + echo "[$(date -Iseconds)] Filestore backup complete: ${FILESTORE_BACKUP_FILE}" +else + echo "[$(date -Iseconds)] Filestore not found at ${FILESTORE_SRC}; skipping filestore backup" +fi + # Weekly backup (Sunday) if [ "${DAY_OF_WEEK}" = "7" ]; then cp "${DAILY_DIR}/${BACKUP_FILE}" "${WEEKLY_DIR}/" + if [ -f "${DAILY_DIR}/${FILESTORE_BACKUP_FILE}" ]; then + cp "${DAILY_DIR}/${FILESTORE_BACKUP_FILE}" "${WEEKLY_DIR}/" + fi echo "[$(date -Iseconds)] Weekly backup saved" fi # Monthly backup (1st of month) if [ "${DAY_OF_MONTH}" = "01" ]; then cp "${DAILY_DIR}/${BACKUP_FILE}" "${MONTHLY_DIR}/" + if [ -f "${DAILY_DIR}/${FILESTORE_BACKUP_FILE}" ]; then + cp "${DAILY_DIR}/${FILESTORE_BACKUP_FILE}" "${MONTHLY_DIR}/" + fi echo "[$(date -Iseconds)] Monthly backup saved" fi @@ -69,12 +88,15 @@ echo "[$(date -Iseconds)] Cleaning up old backups..." # Remove daily backups older than BACKUP_KEEP_DAYS find "${DAILY_DIR}" -name "*.dump" -type f -mtime +${BACKUP_KEEP_DAYS} -delete 2>/dev/null || true +find "${DAILY_DIR}" -name "*_filestore_*.tar.gz" -type f -mtime +${BACKUP_KEEP_DAYS} -delete 2>/dev/null || true # Remove weekly backups older than BACKUP_KEEP_WEEKS weeks find "${WEEKLY_DIR}" -name "*.dump" -type f -mtime +$((BACKUP_KEEP_WEEKS * 7)) -delete 2>/dev/null || true +find "${WEEKLY_DIR}" -name "*_filestore_*.tar.gz" -type f -mtime +$((BACKUP_KEEP_WEEKS * 7)) -delete 2>/dev/null || true # Remove monthly backups older than BACKUP_KEEP_MONTHS months (approximate: 30 days per month) find "${MONTHLY_DIR}" -name "*.dump" -type f -mtime +$((BACKUP_KEEP_MONTHS * 30)) -delete 2>/dev/null || true +find "${MONTHLY_DIR}" -name "*_filestore_*.tar.gz" -type f -mtime +$((BACKUP_KEEP_MONTHS * 30)) -delete 2>/dev/null || true # Report disk usage echo "[$(date -Iseconds)] Backup sizes:" diff --git a/docker/docker-compose.nginx.yml b/docker/docker-compose.nginx.yml index ff91c81f..6211370f 100644 --- a/docker/docker-compose.nginx.yml +++ b/docker/docker-compose.nginx.yml @@ -427,6 +427,7 @@ services: - ./backup.sh:/backup.sh:ro,z - ./backup-entrypoint.sh:/backup-entrypoint.sh:ro,z - backup_data:/backups:rw,z + - odoo_data:/odoo_data:ro,z networks: - openspp-prod restart: unless-stopped diff --git a/docker/docker-compose.production.yml b/docker/docker-compose.production.yml index 0eba74f2..ab277f26 100644 --- a/docker/docker-compose.production.yml +++ b/docker/docker-compose.production.yml @@ -333,6 +333,7 @@ services: - ./backup.sh:/backup.sh:ro - ./backup-entrypoint.sh:/backup-entrypoint.sh:ro - backup_data:/backups + - odoo_data:/odoo_data:ro networks: - openspp-prod restart: always