|
2 | 2 | ############################################################################### |
3 | 3 | # server-deploy.sh — Runs ON THE LIVE SERVER via SSH from GitHub Actions. |
4 | 4 | # |
5 | | -# Expects the tarball to already be uploaded to /opt/codecrow/releases/ |
| 5 | +# Expects docker-compose.prod.yml to be updated to point to GHCR. |
6 | 6 | # |
7 | 7 | # Flow: |
8 | 8 | # 1. Pre-flight config checks |
9 | 9 | # 2. Backup PostgreSQL database |
10 | | -# 3. Load new Docker images from tarball |
| 10 | +# 3. Pull new Docker images from Registry |
11 | 11 | # 4. Stop existing services |
12 | 12 | # 5. Start services (--no-build, --wait for healthchecks) |
13 | 13 | # 6. Verify health |
14 | | -# 7. Cleanup old releases & backups |
| 14 | +# 7. Cleanup old backups |
15 | 15 | # |
16 | 16 | # Usage: |
17 | | -# server-deploy.sh [tarball-name] |
18 | | -# |
19 | | -# Default tarball: codecrow-images.tar.zst |
| 17 | +# GITHUB_REPOSITORY_OWNER=username server-deploy.sh |
20 | 18 | ############################################################################### |
21 | 19 | set -euo pipefail |
22 | 20 |
|
23 | 21 | DEPLOY_DIR="/opt/codecrow" |
24 | | -RELEASES_DIR="$DEPLOY_DIR/releases" |
25 | 22 | CONFIG_DIR="$DEPLOY_DIR/config" |
26 | 23 | BACKUP_DIR="$DEPLOY_DIR/backups" |
27 | 24 | COMPOSE_FILE="$DEPLOY_DIR/docker-compose.prod.yml" |
28 | | -TARBALL_NAME="${1:-codecrow-images.tar.zst}" |
29 | | -TARBALL_PATH="$RELEASES_DIR/$TARBALL_NAME" |
| 25 | + |
| 26 | +# For GHCR pulling |
| 27 | +export GITHUB_REPOSITORY_OWNER="${GITHUB_REPOSITORY_OWNER:-codecrow}" |
| 28 | +export GITHUB_REPOSITORY_OWNER=$(echo "$GITHUB_REPOSITORY_OWNER" | tr '[:upper:]' '[:lower:]') |
30 | 29 |
|
31 | 30 | echo "==========================================" |
32 | 31 | echo " CodeCrow Server Deployment" |
33 | 32 | echo " $(date '+%Y-%m-%d %H:%M:%S')" |
34 | 33 | echo "==========================================" |
35 | 34 |
|
36 | 35 | # ── Pre-flight checks ───────────────────────────────────────────────────── |
37 | | -if ! command -v zstd &>/dev/null; then |
38 | | - echo "ERROR: zstd is not installed. Run: sudo apt-get install zstd" |
39 | | - exit 1 |
40 | | -fi |
41 | | - |
42 | | -if [ ! -f "$TARBALL_PATH" ]; then |
43 | | - echo "ERROR: Tarball not found: $TARBALL_PATH" |
44 | | - exit 1 |
45 | | -fi |
46 | 36 |
|
47 | 37 | if [ ! -f "$COMPOSE_FILE" ]; then |
48 | 38 | echo "ERROR: docker-compose.prod.yml not found: $COMPOSE_FILE" |
|
94 | 84 | echo " ⚠ PostgreSQL not running — skipping backup (first deploy?)" |
95 | 85 | fi |
96 | 86 |
|
97 | | -# ── 2. Load Docker images ───────────────────────────────────────────────── |
98 | | -echo "--- 2. Loading Docker images from tarball ---" |
99 | | -zstd -d --stdout "$TARBALL_PATH" | docker load |
100 | | -echo " ✓ Images loaded" |
| 87 | +# ── 2. Pull Docker images ───────────────────────────────────────────────── |
| 88 | +echo "--- 2. Pulling Docker images from registry ---" |
| 89 | +docker compose -f "$COMPOSE_FILE" pull |
| 90 | +echo " ✓ Images pulled" |
101 | 91 |
|
102 | 92 | # ── 3. Stop existing services ───────────────────────────────────────────── |
103 | 93 | echo "--- 3. Stopping existing services ---" |
@@ -129,12 +119,8 @@ echo " ✓ Services started and healthy" |
129 | 119 | echo "--- 5. Service status ---" |
130 | 120 | docker compose -f docker-compose.prod.yml ps |
131 | 121 |
|
132 | | -# ── 6. Cleanup old releases (keep last 5) ───────────────────────────────── |
133 | | -echo "--- 6. Cleaning up old releases and backups ---" |
134 | | -cd "$RELEASES_DIR" |
135 | | -ls -1t *.tar.zst 2>/dev/null | tail -n +6 | xargs -r rm -f |
136 | | -REMAINING=$(ls -1 *.tar.zst 2>/dev/null | wc -l) |
137 | | -echo " ✓ Keeping $REMAINING release(s)" |
| 122 | +# ── 6. Cleanup old backups ──────────────────────────────────────────────── |
| 123 | +echo "--- 6. Cleaning up old backups ---" |
138 | 124 |
|
139 | 125 | # Cleanup old DB backups (keep last 10) |
140 | 126 | cd "$BACKUP_DIR" |
|
0 commit comments