Replace Portainer-based redeployment with direct SSH approach: - Auto-detect podman/docker for local builds - SCP compose file to Unraid - Generate Postgres password in .env if missing - Pull images and (re)start containers via SSH Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
81 lines
3.3 KiB
Bash
Executable File
81 lines
3.3 KiB
Bash
Executable File
#!/usr/bin/env bash
|
|
set -euo pipefail
|
|
|
|
# ── Configuration ──────────────────────────────────────────────
|
|
REGISTRY="gitea.nerdboden.de"
|
|
OWNER="thefurya"
|
|
IMAGES=("nuzlocke-tracker-api" "nuzlocke-tracker-frontend")
|
|
DOCKERFILES=("backend/Dockerfile.prod" "frontend/Dockerfile.prod")
|
|
CONTEXTS=("./backend" "./frontend")
|
|
|
|
if command -v podman &>/dev/null; then
|
|
CONTAINER_CMD="podman"
|
|
elif command -v docker &>/dev/null; then
|
|
CONTAINER_CMD="docker"
|
|
else
|
|
echo "Neither podman nor docker found." >&2; exit 1
|
|
fi
|
|
|
|
UNRAID_SSH="root@192.168.1.10"
|
|
UNRAID_DEPLOY_DIR="/mnt/user/appdata/nuzlocke-tracker"
|
|
|
|
# ── Helpers ────────────────────────────────────────────────────
|
|
RED='\033[0;31m'
|
|
GREEN='\033[0;32m'
|
|
YELLOW='\033[1;33m'
|
|
NC='\033[0m'
|
|
|
|
info() { echo -e "${GREEN}[✓]${NC} $1"; }
|
|
warn() { echo -e "${YELLOW}[!]${NC} $1"; }
|
|
error() { echo -e "${RED}[✗]${NC} $1"; exit 1; }
|
|
|
|
# ── Preflight checks ──────────────────────────────────────────
|
|
BRANCH=$(git rev-parse --abbrev-ref HEAD)
|
|
if [[ "$BRANCH" != "main" ]]; then
|
|
warn "You are on branch '$BRANCH', not 'main'."
|
|
read -rp "Continue anyway? [y/N] " confirm
|
|
[[ "$confirm" =~ ^[Yy]$ ]] || exit 0
|
|
fi
|
|
|
|
if ! git diff --quiet || ! git diff --cached --quiet; then
|
|
warn "You have uncommitted changes."
|
|
read -rp "Continue anyway? [y/N] " confirm
|
|
[[ "$confirm" =~ ^[Yy]$ ]] || exit 0
|
|
fi
|
|
|
|
# ── Build and push images ─────────────────────────────────────
|
|
for i in "${!IMAGES[@]}"; do
|
|
IMAGE="${REGISTRY}/${OWNER}/${IMAGES[$i]}:latest"
|
|
info "Building ${IMAGES[$i]}..."
|
|
$CONTAINER_CMD build -t "$IMAGE" -f "${DOCKERFILES[$i]}" "${CONTEXTS[$i]}"
|
|
info "Pushing ${IMAGES[$i]}..."
|
|
$CONTAINER_CMD push "$IMAGE"
|
|
done
|
|
|
|
info "All images built and pushed."
|
|
|
|
# ── Sync compose file to Unraid ──────────────────────────────────
|
|
info "Copying docker-compose.prod.yml to Unraid..."
|
|
scp docker-compose.prod.yml "${UNRAID_SSH}:${UNRAID_DEPLOY_DIR}/docker-compose.yml" \
|
|
|| error "Failed to copy compose file to Unraid."
|
|
info "Compose file synced."
|
|
|
|
# ── Ensure .env with Postgres password exists ────────────────────
|
|
info "Checking for .env on Unraid..."
|
|
ssh "${UNRAID_SSH}" "
|
|
if [ ! -f '${UNRAID_DEPLOY_DIR}/.env' ]; then
|
|
PASS=\$(head -c 32 /dev/urandom | base64 | tr -dc 'A-Za-z0-9' | head -c 32)
|
|
echo \"POSTGRES_PASSWORD=\${PASS}\" > '${UNRAID_DEPLOY_DIR}/.env'
|
|
echo 'Generated new .env with POSTGRES_PASSWORD'
|
|
else
|
|
echo '.env already exists, skipping'
|
|
fi
|
|
" || error "Failed to check/create .env on Unraid."
|
|
|
|
# ── Pull images and (re)start on Unraid ──────────────────────────
|
|
info "Pulling images and starting containers on Unraid..."
|
|
ssh "${UNRAID_SSH}" "cd '${UNRAID_DEPLOY_DIR}' && docker compose pull && docker compose up -d" \
|
|
|| error "Failed to start containers on Unraid."
|
|
|
|
info "Deploy complete!"
|