61 lines
2.0 KiB
Bash
Executable File
61 lines
2.0 KiB
Bash
Executable File
#!/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}"
|