Builds the customer-facing distribution: a curated distribution/ directory containing only what an end customer needs (production docker-compose.yml with no build: sections, install.sh/update.sh/uninstall.sh/healthcheck.sh/ backup.sh/restore.sh, a customer-facing CHANGELOG.md, and README/LICENSE/ NOTICE/THIRD_PARTY_LICENSES) — pushed as the initial content of the new public alleyviper/argus repo. install.sh: detects OS, validates Docker/Compose, fetches all deployment files, generates a secure DB password, creates the required Docker network, pulls images, starts the stack, waits for health, and rotates the default admin/admin credentials via the auth API — printing the generated password once at the end. update.sh/healthcheck.sh/backup.sh/restore.sh/uninstall.sh formalize what was previously ad-hoc README snippets into real, safe-by-default scripts (uninstall.sh keeps data unless --remove-data is explicitly passed and confirmed; restore.sh requires typed confirmation and documents that it targets a fresh install, not a live merge). Added a sync-distribution job to release.yml: after a successful release, mirrors distribution/ into the public repo and creates a matching (customer-facing, commit-log-free) release marker there. Needs a one-time setup step — a fine-grained PAT scoped to alleyviper/argus added as the ARGUS_PUBLIC_REPO_TOKEN secret — the job cleanly no-ops until that's added. Not yet done: GHCR package visibility (argus-secure-api/-ui/-nginx) is still private, which blocks a genuine end-to-end curl-install test from a clean, unauthenticated environment — deferred at the user's request until they flip it manually (GitHub does not expose this via API).
40 lines
1.2 KiB
Bash
Executable File
40 lines
1.2 KiB
Bash
Executable File
#!/usr/bin/env bash
|
|
#
|
|
# ARGUS backup — dumps the database and application data (certificates,
|
|
# uploaded config) into a single, timestamped archive.
|
|
#
|
|
# cd ~/argus && ./backup.sh [output-directory]
|
|
#
|
|
set -euo pipefail
|
|
|
|
INSTALL_DIR="${ARGUS_INSTALL_DIR:-$HOME/argus}"
|
|
OUT_DIR="${1:-$PWD}"
|
|
STAMP="$(date +%Y%m%d-%H%M%S)"
|
|
ARCHIVE="${OUT_DIR}/argus-backup-${STAMP}.tar.gz"
|
|
|
|
bold() { printf '\033[1m%s\033[0m\n' "$1"; }
|
|
ok() { printf ' \033[32m✓\033[0m %s\n' "$1"; }
|
|
fail() { printf ' \033[31m✗\033[0m %s\n' "$1" >&2; exit 1; }
|
|
|
|
[ -f "$INSTALL_DIR/docker-compose.yml" ] || fail "No ARGUS installation found at $INSTALL_DIR (set ARGUS_INSTALL_DIR if you installed elsewhere)."
|
|
cd "$INSTALL_DIR"
|
|
|
|
bold "Backing up ARGUS..."
|
|
|
|
WORKDIR="$(mktemp -d)"
|
|
trap 'rm -rf "$WORKDIR"' EXIT
|
|
|
|
docker compose exec -T db pg_dump -U "${DB_USER:-postgres}" "${DB_NAME:-argus}" | gzip > "$WORKDIR/db.sql.gz"
|
|
ok "Database dumped"
|
|
|
|
docker run --rm -v argus_api_data:/data -v "$WORKDIR":/backup alpine \
|
|
tar czf /backup/api-data.tar.gz -C /data . >/dev/null 2>&1
|
|
ok "Application data archived"
|
|
|
|
mkdir -p "$OUT_DIR"
|
|
tar czf "$ARCHIVE" -C "$WORKDIR" db.sql.gz api-data.tar.gz
|
|
ok "Backup written to ${ARCHIVE}"
|
|
|
|
echo
|
|
printf ' %s\n' "Restore with: ./restore.sh ${ARCHIVE}"
|