← Back
20261002_151146_localhost_
success localhost · 2026-10-02 15:11:46Z
Phases
1.Preflight
2.Backup
3.Pull
4.Recreate
5.Verify
Session Log
Session: 20261002_151146_localhost_
Target: root@localhost
Mode: deploy
Started: 2026-10-02T15:11:46Z
---
[2026-10-02T15:11:46Z] === Phase 1: Preflight ===
[2026-10-02T15:11:46Z] INFO: Checking SSH key: /home/khaled_bebo/.ssh/acrow_operator_key
[2026-10-02T15:11:46Z] INFO: Testing SSH connection...
[2026-10-02T15:11:47Z] OK: SSH reachable
[2026-10-02T15:11:47Z] INFO: Verifying remote prerequisites...
[2026-10-02T15:11:47Z] REMOTE: 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)"
OK: prerequisites verified (disk 1% used)
[2026-10-02T15:11:48Z] OK: Docker 24+, compose v2, stack present, disk OK
[2026-10-02T15:11:48Z] INFO: Refreshing GHCR auth on target...
Login Succeeded
[2026-10-02T15:11:49Z] OK: GHCR token refreshed
[2026-10-02T15:11:50Z] OK: Current API: sha256:e0f7638a26f8…
[2026-10-02T15:11:50Z] OK: Current UI: sha256:0836c3845697…
[2026-10-02T15:11:50Z] OK: Phase 1 complete
[2026-10-02T15:11:50Z] === Phase 2: Backup ===
[2026-10-02T15:11:50Z] INFO: Creating backup dir: /opt/acrow/backups/pre-update-20261002_151150
[2026-10-02T15:11:50Z] REMOTE: set -e
mkdir -p '/opt/acrow/backups/pre-update-20261002_151150'
cd /opt/acrow-stack
cp docker-compose.yml '/opt/acrow/backups/pre-update-20261002_151150/'
cp .env '/opt/acrow/backups/pre-update-20261002_151150/'
[ -d nginx-override ] && cp -r nginx-override '/opt/acrow/backups/pre-update-20261002_151150/' || true
echo ' -> compose, env, nginx-override copied'
-> compose, env, nginx-override copied
[2026-10-02T15:11:50Z] OK: Config backed up
[2026-10-02T15:11:50Z] INFO: Dumping database...
[2026-10-02T15:11:50Z] REMOTE: 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_151150/acrowdb.dump'
docker exec acrow-postgres rm -f /tmp/acrow.dump
SZ=$(stat -c%s '/opt/acrow/backups/pre-update-20261002_151150/acrowdb.dump')
echo " -> DB dump: $SZ bytes"
-> DB dump: 621189 bytes
[2026-10-02T15:11:51Z] OK: Database backed up
[2026-10-02T15:11:51Z] INFO: Recording image IDs...
[2026-10-02T15:11:51Z] REMOTE: set -e
docker inspect acrow-api --format '{{.Image}}' > '/opt/acrow/backups/pre-update-20261002_151150/api-image-id.txt'
docker inspect acrow-ui-container --format '{{.Image}}' > '/opt/acrow/backups/pre-update-20261002_151150/ui-image-id.txt'
echo ' -> image IDs recorded'
-> image IDs recorded
[2026-10-02T15:11:51Z] OK: Image IDs recorded
[2026-10-02T15:11:51Z] OK: Phase 2 complete
[2026-10-02T15:11:51Z] === Phase 3: Pull ===
[2026-10-02T15:11:51Z] INFO: Pulling latest images (1–2 min)...
[2026-10-02T15:11:51Z] REMOTE: cd /opt/acrow-stack && docker compose pull acrow-api acrow-ui
Image ghcr.io/trinnova-eg/acrow-abp--ui:latest Pulling
Image ghcr.io/trinnova-eg/acrow-abp--api:latest Pulling
Image ghcr.io/trinnova-eg/acrow-abp--api:latest Pulled
Image ghcr.io/trinnova-eg/acrow-abp--ui:latest Pulled
[2026-10-02T15:11:54Z] OK: New API: sha256:e0f7638a26f8…
[2026-10-02T15:11:54Z] OK: New UI: sha256:0836c3845697…
[2026-10-02T15:11:54Z] OK: Phase 3 complete
[2026-10-02T15:11:54Z] === Phase 4: Recreate ===
[2026-10-02T15:11:54Z] INFO: Recreating acrow-api and acrow-ui...
[2026-10-02T15:11:54Z] REMOTE: cd /opt/acrow-stack && docker compose up -d --force-recreate acrow-api acrow-ui
Container acrow-postgres Running
Container acrow-api Recreate
Container acrow-api Recreated
Container acrow-ui-container Recreate
Container acrow-ui-container Recreated
Container acrow-postgres Waiting
Container acrow-postgres Healthy
Container acrow-api Starting
Container acrow-api Started
Container acrow-ui-container Starting
Container acrow-ui-container Started
[2026-10-02T15:11:58Z] INFO: Waiting for API health (up to 90s)...
curl: (56) Recv failure: Connection reset by peer
curl: (56) Recv failure: Connection reset by peer
[2026-10-02T15:12:03Z] OK: API responding (200) after 6s
[2026-10-02T15:12:03Z] REMOTE: cd /opt/acrow-stack && docker compose ps
NAME IMAGE COMMAND SERVICE CREATED STATUS PORTS
acrow-api ghcr.io/trinnova-eg/acrow-abp--api:latest "dotnet Opex.Server.…" acrow-api 9 seconds ago Up 6 seconds (health: starting) 0.0.0.0:5001->5000/tcp, [::]:5001->5000/tcp
acrow-postgres postgres:16 "docker-entrypoint.s…" acrow-postgres 27 minutes ago Up 27 minutes (healthy) 127.0.0.1:5433->5432/tcp
acrow-ui-container ghcr.io/trinnova-eg/acrow-abp--ui:latest "/docker-entrypoint.…" acrow-ui 8 seconds ago Up 5 seconds 0.0.0.0:8181->80/tcp, [::]:8181->80/tcp
[2026-10-02T15:12:04Z] OK: Phase 4 complete
[2026-10-02T15:12:04Z] === Phase 5: Verify ===
[2026-10-02T15:12:05Z] OK: API 5001/health -> 200
[2026-10-02T15:12:05Z] OK: UI 8081/ -> 200
[2026-10-02T15:12:05Z] OK: PROXY 8081/api/login -> 400
[2026-10-02T15:12:05Z] OK: JWT__ValidIssuer = acrow-api
[2026-10-02T15:12:05Z] OK: Phase 5 complete
[2026-10-02T15:12:05Z] session ended: 20261002_151146_localhost_