church-website/infra/scripts/deploy.sh
2026-04-10 11:39:02 +02:00

61 lines
No EOL
1.9 KiB
Bash
Executable file

#!/bin/bash
set -euo pipefail
ENV_NAME=$1 # "staging" or "test"
APP_PORT=$2 # 3001 or 3002
REPO_DIR="/opt/church-website/repo"
ENV_DIR="/opt/church-website/envs/${ENV_NAME}"
CONTAINER_NAME="app-${ENV_NAME}"
IMAGE_NAME="church-website:${ENV_NAME}"
MIGRATE_IMAGE="church-website-migrate:${ENV_NAME}"
NETWORK_NAME="church-website-net"
if [ ! -f "${ENV_DIR}/.env" ]; then
echo "Error: ${ENV_DIR}/.env not found"
exit 1
fi
echo "==> Building app image ${IMAGE_NAME}..."
docker build \
--build-arg NEXT_PUBLIC_SERVER_URL="$(grep NEXT_PUBLIC_SERVER_URL "${ENV_DIR}/.env" | cut -d= -f2-)" \
--build-arg NEXT_PUBLIC_SITE_ID="$(grep NEXT_PUBLIC_SITE_ID "${ENV_DIR}/.env" | cut -d= -f2-)" \
-t "${IMAGE_NAME}" \
"${REPO_DIR}"
echo "==> Building migration image..."
docker build \
--target builder \
--build-arg NEXT_PUBLIC_SERVER_URL="$(grep NEXT_PUBLIC_SERVER_URL "${ENV_DIR}/.env" | cut -d= -f2-)" \
--build-arg NEXT_PUBLIC_SITE_ID="$(grep NEXT_PUBLIC_SITE_ID "${ENV_DIR}/.env" | cut -d= -f2-)" \
-t "${MIGRATE_IMAGE}" \
"${REPO_DIR}"
echo "==> Running database migrations..."
docker run --rm \
--network "${NETWORK_NAME}" \
--env-file "${ENV_DIR}/.env" \
"${MIGRATE_IMAGE}" \
npx payload migrate
echo "==> Stopping old container..."
docker stop "${CONTAINER_NAME}" 2>/dev/null || true
docker rm "${CONTAINER_NAME}" 2>/dev/null || true
echo "==> Starting new container on port ${APP_PORT}..."
docker run -d \
--name "${CONTAINER_NAME}" \
--restart unless-stopped \
--network "${NETWORK_NAME}" \
--env-file "${ENV_DIR}/.env" \
-v "uploads-${ENV_NAME}-media:/app/media" \
-v "uploads-${ENV_NAME}-documents:/app/documents" \
-p "127.0.0.1:${APP_PORT}:3000" \
"${IMAGE_NAME}"
echo "==> Fixing volume permissions..."
docker exec -u 0 "${CONTAINER_NAME}" chown -R 1001:1001 /app/media /app/documents
echo "==> Cleaning up old images..."
docker image prune -f
echo "==> Done! ${ENV_NAME} deployed on port ${APP_PORT}"