Files
hobbs-iac/tv app/Hobbs-Family-Organizer-Self-Hosted-v1.0.0/scripts/backup.sh
T
jeremy e9c7e9df1a feat: self-host Hobbs Family Organizer (Shield TV dashboard) on hf-pdocker-02:8340
- tv app/Hobbs-Family-Organizer-Self-Hosted-v1.0.0: release bundle (Next.js app + Shield APK v1.4 + source)
- compose/hf-pdocker-02/hobbs-organizer: override (local-disk secrets, watchtower off), .env (port 8340), Shield provisioning script
- CLAUDE.md: service tree + internal ports
Trusted-LAN mode. Secrets live only on .100 /var/lib/hobbs-organizer/secrets (not in git).

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01E9NnVEico3WvFxLyjy1iW3
2026-11-04 18:27:22 -06:00

62 lines
2.3 KiB
Bash

#!/usr/bin/env bash
set -Eeuo pipefail
umask 077
SCRIPT_DIRECTORY="$(cd -- "$(dirname -- "${BASH_SOURCE[0]}")" && pwd -P)"
PROJECT_ROOT="$(cd -- "$SCRIPT_DIRECTORY/.." && pwd -P)"
DESTINATION_DIRECTORY="${1:-$PROJECT_ROOT/backups}"
ENVIRONMENT_FILE="$PROJECT_ROOT/.env"
CALENDAR_FILE="$PROJECT_ROOT/secrets/calendar_ical_urls.json"
TOKEN_FILE="$PROJECT_ROOT/secrets/organizer_access_token.txt"
for required_file in "$ENVIRONMENT_FILE" "$CALENDAR_FILE" "$TOKEN_FILE"; do
if [[ ! -f "$required_file" ]]; then
printf '%s\n' "Required configuration is missing. Run scripts/configure.sh before creating a backup." >&2
exit 1
fi
done
command -v tar >/dev/null 2>&1 || { printf '%s\n' "tar is required to create a backup." >&2; exit 1; }
mkdir -p -- "$DESTINATION_DIRECTORY"
DESTINATION_DIRECTORY="$(cd -- "$DESTINATION_DIRECTORY" && pwd -P)"
chmod 700 -- "$DESTINATION_DIRECTORY"
timestamp="$(date -u +%Y%m%d-%H%M%S)"
archive_path="$DESTINATION_DIRECTORY/hobbs-organizer-config-$timestamp.tar.gz"
archive_counter=1
while [[ -e "$archive_path" ]]; do
archive_path="$DESTINATION_DIRECTORY/hobbs-organizer-config-$timestamp-$archive_counter.tar.gz"
((archive_counter += 1))
done
staging_path="$(mktemp -d "$DESTINATION_DIRECTORY/.backup-staging-XXXXXXXX")"
cleanup_staging() {
[[ -n "${staging_path:-}" && -d "$staging_path" ]] && rm -rf -- "$staging_path"
}
trap cleanup_staging EXIT HUP INT TERM
mkdir -p -- "$staging_path/config" "$staging_path/secrets"
cp -- "$ENVIRONMENT_FILE" "$staging_path/config/environment.env"
cp -- "$CALENDAR_FILE" "$staging_path/secrets/calendar_ical_urls.json"
cp -- "$TOKEN_FILE" "$staging_path/secrets/organizer_access_token.txt"
chmod 600 -- "$staging_path/config/environment.env" "$staging_path/secrets/calendar_ical_urls.json" "$staging_path/secrets/organizer_access_token.txt"
{
printf '%s\n' 'format=HOBBS_ORGANIZER_CONFIG_BACKUP_V1'
printf 'created_utc=%s\n' "$(date -u +%Y-%m-%dT%H:%M:%SZ)"
printf '%s\n' 'contains_secrets=true'
} >"$staging_path/manifest.txt"
(
cd -- "$staging_path"
tar -czf "$archive_path" config secrets manifest.txt
)
chmod 600 -- "$archive_path"
rm -rf -- "$staging_path"
staging_path=""
trap - EXIT HUP INT TERM
printf 'Created a protected configuration backup at: %s\n' "$archive_path"
printf '%s\n' "The archive contains secrets. Store it in an encrypted or access-controlled backup system."