← Back
20261002_144526_localhost_
success localhost · 2026-10-02 14:45:26Z
Phases
1.Preflight
2.Backup
3.Pull
4.Recreate
5.Verify
Session Log
Session: 20261002_144526_localhost_
Target: root@localhost
Mode: deploy
Started: 2026-10-02T14:45:26Z
---
[2026-10-02T14:45:26Z] === Phase 1: Preflight ===
[2026-10-02T14:45:26Z] INFO: Checking SSH key: /home/khaled_bebo/.ssh/acrow_operator_key
[2026-10-02T14:45:26Z] INFO: Verifying remote prerequisites...
[2026-10-02T14:45:26Z] INFO: [dry-run] ssh root@localhost: set -e
command -v docker >/dev/null || { echo 'FAIL: docker not installed'; exit 10; }
docker info >/dev/null 2>&1 || { echo 'FAIL: docker daemon not running'; exit 11; }
docker compose version >/dev/null 2>&1 || { echo 'FAIL: docker compose v2 not available'; exit 12; }
test -d /opt/acrow-stack || { echo 'FAIL: /opt/acrow-stack missing'; exit 13; }
test -f /opt/acrow-stack/docker-compose.yml || { echo 'FAIL: docker-compose.yml missing'; exit 14; }
docker ps --filter name=acrow-api --format '{{.Status}}' | grep -q Up || { echo 'FAIL: acrow-api not running'; exit 15; }
docker ps --filter name=acrow-ui-container --format '{{.Status}}' | grep -q Up || { echo 'FAIL: acrow-ui-container not running'; exit 15; }
USED_PCT=$(df /opt --output=pcent | tail -1 | tr -d ' %')
[ "$USED_PCT" -lt 90 ] || { echo "FAIL: /opt is ${USED_PCT}% full"; exit 16; }
mkdir -p /opt/acrow/backups
echo "OK: prerequisites verified (disk ${USED_PCT}% used)"
[2026-10-02T14:45:26Z] [dry-run] ssh: set -e
command -v docker >/dev/null || { echo 'FAIL: docker not installed'; exit 10; }
docker info >/dev/null 2>&1 || { echo 'FAIL: docker daemon not running'; exit 11; }
docker compose version >/dev/null 2>&1 || { echo 'FAIL: docker compose v2 not available'; exit 12; }
test -d /opt/acrow-stack || { echo 'FAIL: /opt/acrow-stack missing'; exit 13; }
test -f /opt/acrow-stack/docker-compose.yml || { echo 'FAIL: docker-compose.yml missing'; exit 14; }
docker ps --filter name=acrow-api --format '{{.Status}}' | grep -q Up || { echo 'FAIL: acrow-api not running'; exit 15; }
docker ps --filter name=acrow-ui-container --format '{{.Status}}' | grep -q Up || { echo 'FAIL: acrow-ui-container not running'; exit 15; }
USED_PCT=$(df /opt --output=pcent | tail -1 | tr -d ' %')
[ "$USED_PCT" -lt 90 ] || { echo "FAIL: /opt is ${USED_PCT}% full"; exit 16; }
mkdir -p /opt/acrow/backups
echo "OK: prerequisites verified (disk ${USED_PCT}% used)"
[2026-10-02T14:45:26Z] OK: Docker 24+, compose v2, stack present, disk OK
[2026-10-02T14:45:26Z] INFO: Refreshing GHCR auth on target...
[2026-10-02T14:45:26Z] OK: GHCR token refreshed
[2026-10-02T14:45:26Z] OK: Phase 1 complete
[2026-10-02T14:45:26Z] === Phase 2: Backup ===
[2026-10-02T14:45:26Z] INFO: Creating backup dir: /opt/acrow/backups/pre-update-20261002_144526
[2026-10-02T14:45:26Z] INFO: [dry-run] ssh root@localhost: set -e
mkdir -p '/opt/acrow/backups/pre-update-20261002_144526'
cd /opt/acrow-stack
cp docker-compose.yml '/opt/acrow/backups/pre-update-20261002_144526/'
cp .env '/opt/acrow/backups/pre-update-20261002_144526/'
[ -d nginx-override ] && cp -r nginx-override '/opt/acrow/backups/pre-update-20261002_144526/' || true
echo ' -> compose, env, nginx-override copied'
[2026-10-02T14:45:26Z] [dry-run] ssh: set -e
mkdir -p '/opt/acrow/backups/pre-update-20261002_144526'
cd /opt/acrow-stack
cp docker-compose.yml '/opt/acrow/backups/pre-update-20261002_144526/'
cp .env '/opt/acrow/backups/pre-update-20261002_144526/'
[ -d nginx-override ] && cp -r nginx-override '/opt/acrow/backups/pre-update-20261002_144526/' || true
echo ' -> compose, env, nginx-override copied'
[2026-10-02T14:45:26Z] OK: Config backed up
[2026-10-02T14:45:26Z] INFO: Dumping database...
[2026-10-02T14:45:26Z] INFO: [dry-run] ssh root@localhost: set -e
docker exec acrow-postgres pg_dump -U acrowadmin -F c -f /tmp/acrow.dump acrowdb
docker cp acrow-postgres:/tmp/acrow.dump '/opt/acrow/backups/pre-update-20261002_144526/acrowdb.dump'
docker exec acrow-postgres rm -f /tmp/acrow.dump
SZ=$(stat -c%s '/opt/acrow/backups/pre-update-20261002_144526/acrowdb.dump')
echo " -> DB dump: $SZ bytes"
[2026-10-02T14:45:26Z] [dry-run] ssh: set -e
docker exec acrow-postgres pg_dump -U acrowadmin -F c -f /tmp/acrow.dump acrowdb
docker cp acrow-postgres:/tmp/acrow.dump '/opt/acrow/backups/pre-update-20261002_144526/acrowdb.dump'
docker exec acrow-postgres rm -f /tmp/acrow.dump
SZ=$(stat -c%s '/opt/acrow/backups/pre-update-20261002_144526/acrowdb.dump')
echo " -> DB dump: $SZ bytes"
[2026-10-02T14:45:26Z] OK: Database backed up
[2026-10-02T14:45:26Z] INFO: Recording image IDs...
[2026-10-02T14:45:26Z] INFO: [dry-run] ssh root@localhost: set -e
docker inspect acrow-api --format '{{.Image}}' > '/opt/acrow/backups/pre-update-20261002_144526/api-image-id.txt'
docker inspect acrow-ui-container --format '{{.Image}}' > '/opt/acrow/backups/pre-update-20261002_144526/ui-image-id.txt'
echo ' -> image IDs recorded'
[2026-10-02T14:45:26Z] [dry-run] ssh: set -e
docker inspect acrow-api --format '{{.Image}}' > '/opt/acrow/backups/pre-update-20261002_144526/api-image-id.txt'
docker inspect acrow-ui-container --format '{{.Image}}' > '/opt/acrow/backups/pre-update-20261002_144526/ui-image-id.txt'
echo ' -> image IDs recorded'
[2026-10-02T14:45:26Z] OK: Image IDs recorded
[2026-10-02T14:45:26Z] OK: Phase 2 complete
[2026-10-02T14:45:26Z] === Phase 3: Pull ===
[2026-10-02T14:45:26Z] INFO: Pulling latest images (1–2 min)...
[2026-10-02T14:45:26Z] INFO: [dry-run] ssh root@localhost: cd /opt/acrow-stack && docker compose pull acrow-api acrow-ui
[2026-10-02T14:45:26Z] [dry-run] ssh: cd /opt/acrow-stack && docker compose pull acrow-api acrow-ui
[2026-10-02T14:45:26Z] OK: Phase 3 complete
[2026-10-02T14:45:26Z] === Phase 4: Recreate ===
[2026-10-02T14:45:26Z] INFO: Recreating acrow-api and acrow-ui...
[2026-10-02T14:45:26Z] INFO: [dry-run] ssh root@localhost: cd /opt/acrow-stack && docker compose up -d --force-recreate acrow-api acrow-ui
[2026-10-02T14:45:26Z] [dry-run] ssh: cd /opt/acrow-stack && docker compose up -d --force-recreate acrow-api acrow-ui
[2026-10-02T14:45:26Z] OK: Phase 4 skipped (dry-run)
[2026-10-02T14:45:26Z] === Phase 5: Verify ===
[2026-10-02T14:45:26Z] OK: Phase 5 skipped (dry-run)
[2026-10-02T14:45:26Z] session ended: 20261002_144526_localhost_