Restructure the monorepo into clear top-level directories: - backend/: Go module root (cmd, internal, pkg, configs, migrations, docs/swagger, scripts, tests, go.mod, Makefile, .air.toml) - deploy/: Docker (Dockerfile, docker-compose*), quickstart, fluentd - docs/: project documentation + reports/ (moved from repo root) - AGENTS.md: new AI coding-agent guide at repo root Update all references to the new layout: - Dockerfile: COPY backend/go.mod, COPY backend/ (context = repo root) - docker-compose files: context ../.., dockerfile deploy/docker/Dockerfile, env_file ../../.env, volume mounts ../../backend:/app - deploy/quickstart/compose.yaml: dockerfile deploy/docker/Dockerfile - CI: working-directory: backend for go commands, file deploy/docker/Dockerfile, coverage path backend/coverage.out, health_check backend/scripts/ - backend/Makefile: docker target uses -f ../deploy/docker/Dockerfile ../ - README: architecture tree, quickstart, config paths updated Move root stray scripts (rename_models.*, run_m11_tests.sh, verify_build.sh, gorm_bool_main.go) to backend/scripts/legacy/. All moves via git mv to preserve history. Build, vet, SQLite tests, and docker compose config verified.
39 lines
1.4 KiB
Bash
Executable File
39 lines
1.4 KiB
Bash
Executable File
#!/bin/bash
|
|
# GoChat Database Backup Script
|
|
# Reference: Chatwoot uses pg_dump for backup in production deployments
|
|
# Usage: ./scripts/db_backup.sh [env]
|
|
|
|
set -euo pipefail
|
|
|
|
ENV="${1:-production}"
|
|
TIMESTAMP=$(date +%Y%m%d_%H%M%S)
|
|
BACKUP_DIR="${GOCHAT_BACKUP_DIR:-/var/backups/gochat}"
|
|
DB_NAME="${POSTGRES_DB:-gochat_production}"
|
|
DB_USER="${POSTGRES_USER:-gochat}"
|
|
DB_HOST="${POSTGRES_HOST:-localhost}"
|
|
DB_PORT="${POSTGRES_PORT:-5432}"
|
|
RETENTION_DAYS="${GOCHAT_BACKUP_RETENTION_DAYS:-30}"
|
|
|
|
mkdir -p "${BACKUP_DIR}"
|
|
|
|
BACKUP_FILE="${BACKUP_DIR}/${DB_NAME}_${TIMESTAMP}.sql.gz"
|
|
|
|
echo "[$(date)] Starting backup of ${DB_NAME} on ${DB_HOST}:${DB_PORT}"
|
|
|
|
# pg_dump with compression — mirrors Chatwoot backup approach
|
|
PGPASSWORD="${POSTGRES_PASSWORD}" pg_dump -h "${DB_HOST}" -p "${DB_PORT}" -U "${DB_USER}" -d "${DB_NAME}" --format=custom --compress=9 | gzip > "${BACKUP_FILE}"
|
|
|
|
BACKUP_SIZE=$(du -h "${BACKUP_FILE}" | cut -f1)
|
|
echo "[$(date)] Backup complete: ${BACKUP_FILE} (${BACKUP_SIZE})"
|
|
|
|
# Prune old backups beyond retention period
|
|
find "${BACKUP_DIR}" -name "*.sql.gz" -mtime +"${RETENTION_DAYS}" -delete
|
|
echo "[$(date)] Pruned backups older than ${RETENTION_DAYS} days"
|
|
|
|
# Verify backup integrity
|
|
gunzip -t "${BACKUP_FILE}" && echo "[$(date)] Backup integrity verified" || {
|
|
echo "[$(date)] ERROR: Backup integrity check failed!"
|
|
rm -f "${BACKUP_FILE}"
|
|
exit 1
|
|
}
|