#!/usr/bin/env bash set -euo pipefail # Deploys laufschrift to docker.citysensor.de by: # 1) building and pushing a multi-platform image # 2) syncing compose/env files to the remote host # 3) pulling and restarting the service remotely REMOTE_HOST="${REMOTE_HOST:-docker.citysensor.de}" REMOTE_USER="${REMOTE_USER:-rxf}" REMOTE_PORT="${REMOTE_PORT:-22022}" REMOTE_DIR="${REMOTE_DIR:-/opt/laufschrift}" IMAGE_REPO="${IMAGE_REPO:-gitea.fuerst-stuttgart.de/admin/laufschrift}" IMAGE_TAG="${IMAGE_TAG:-$(date +%Y%m%d%H%M)}" PLATFORMS="${PLATFORMS:-linux/amd64,linux/arm64}" DEPLOY_ENV_FILE="${DEPLOY_ENV_FILE:-.env}" BUILD_PUSH="${BUILD_PUSH:-1}" FULL_IMAGE="${IMAGE_REPO}:${IMAGE_TAG}" REMOTE="${REMOTE_USER}@${REMOTE_HOST}" if [[ ! -f "docker-compose.yml" ]]; then echo "ERROR: docker-compose.yml not found in current directory." exit 1 fi if [[ ! -f "${DEPLOY_ENV_FILE}" ]]; then echo "ERROR: ${DEPLOY_ENV_FILE} not found." echo " Create it first, e.g. from .env.example" exit 1 fi if [[ "${BUILD_PUSH}" == "1" ]]; then echo "==> Building and pushing multi-platform image: ${FULL_IMAGE}" docker buildx build \ --platform "${PLATFORMS}" \ -f Dockerfile_laufschrift \ -t "${FULL_IMAGE}" \ --push \ . # Keep :latest in sync for simple rollbacks and manual usage. docker buildx imagetools create \ -t "${IMAGE_REPO}:latest" \ "${FULL_IMAGE}" fi echo "==> Syncing compose and env to ${REMOTE}:${REMOTE_DIR}" ssh -p "${REMOTE_PORT}" "${REMOTE}" "mkdir -p '${REMOTE_DIR}'" scp -P "${REMOTE_PORT}" docker-compose.yml "${REMOTE}:${REMOTE_DIR}/docker-compose.yml" scp -P "${REMOTE_PORT}" "${DEPLOY_ENV_FILE}" "${REMOTE}:${REMOTE_DIR}/.env" echo "==> Deploying ${FULL_IMAGE} on ${REMOTE_HOST}" ssh -p "${REMOTE_PORT}" "${REMOTE}" "cd '${REMOTE_DIR}' && IMAGE='${FULL_IMAGE}' docker compose pull app && IMAGE='${FULL_IMAGE}' docker compose up -d --no-build --remove-orphans" echo "==> Deployment finished" echo " Host: ${REMOTE_HOST}" echo " Image: ${FULL_IMAGE}"