#!/bin/sh set -eu SCRIPT_DIR=$(CDPATH= cd -- "$(dirname -- "$0")" && pwd) DOCKER=${DOCKER:-/usr/local/bin/docker} SUDO_CMD=${SUDO_CMD:-sudo} SRC=${SRC:-$SCRIPT_DIR} APP=${APP:-$(CDPATH= cd -- "$SRC/../plane-app" && pwd)} COMPOSE_PROJECT=${COMPOSE_PROJECT:-nodedc-tasker} COMPOSE_ENV_FILE=${COMPOSE_ENV_FILE:-.env.synology} COMPOSE_FILE=${COMPOSE_FILE:-docker-compose.yaml} COMPOSE_OVERRIDE_FILE=${COMPOSE_OVERRIDE_FILE:-docker-compose.synology.override.yml} BUILD_BACKEND=${BUILD_BACKEND:-1} BUILD_WEB=${BUILD_WEB:-1} BUILD_ADMIN=${BUILD_ADMIN:-0} BUILD_NETWORK=${BUILD_NETWORK:-host} BACKEND_BUILDKIT=${BACKEND_BUILDKIT:-0} WEB_BUILDKIT=${WEB_BUILDKIT:-0} ADMIN_BUILDKIT=${ADMIN_BUILDKIT:-0} ADMIN_REQUIRED=${ADMIN_REQUIRED:-0} PLANE_BACKEND_IMAGE=${PLANE_BACKEND_IMAGE:-nodedc/plane-backend:local} PLANE_FRONTEND_IMAGE=${PLANE_FRONTEND_IMAGE:-nodedc/plane-frontend:ru} PLANE_ADMIN_IMAGE=${PLANE_ADMIN_IMAGE:-nodedc/plane-admin:ru} VITE_NODEDC_LAUNCHER_URL=${VITE_NODEDC_LAUNCHER_URL:-https://hub.nodedc.ru} VITE_NODEDC_OIDC_LOGIN_ENABLED=${VITE_NODEDC_OIDC_LOGIN_ENABLED:-1} RUN_SMOKE=${RUN_SMOKE:-1} SMOKE_BASE_URL=${SMOKE_BASE_URL:-https://ops.nodedc.ru} SMOKE_RESOLVE=${SMOKE_RESOLVE:-ops.nodedc.ru:443:127.0.0.1} RECREATE_SERVICES="" DOCKER_BUILD_NETWORK_ARGS="" if [ -n "$BUILD_NETWORK" ]; then DOCKER_BUILD_NETWORK_ARGS="--network=$BUILD_NETWORK" fi run() { if [ -n "$SUDO_CMD" ]; then "$SUDO_CMD" "$@" else "$@" fi } run_env() { if [ -n "$SUDO_CMD" ]; then "$SUDO_CMD" env "$@" else env "$@" fi } compose_up() { cd "$APP" set -- compose -p "$COMPOSE_PROJECT" --env-file "$COMPOSE_ENV_FILE" -f "$COMPOSE_FILE" if [ -n "$COMPOSE_OVERRIDE_FILE" ] && [ -f "$COMPOSE_OVERRIDE_FILE" ]; then set -- "$@" -f "$COMPOSE_OVERRIDE_FILE" fi set -- "$@" up -d --no-build --force-recreate for service in $RECREATE_SERVICES; do set -- "$@" "$service" done run "$DOCKER" "$@" } curl_with_optional_resolve() { if [ -n "$SMOKE_RESOLVE" ]; then curl -k --resolve "$SMOKE_RESOLVE" "$@" else curl -k "$@" fi } if [ -n "$SUDO_CMD" ]; then printf "== sudo session ==\n" "$SUDO_CMD" -v fi if [ "$BUILD_BACKEND" = "1" ]; then printf "== backend image: %s ==\n" "$PLANE_BACKEND_IMAGE" cd "$SRC/apps/api" run_env DOCKER_BUILDKIT="$BACKEND_BUILDKIT" "$DOCKER" build \ $DOCKER_BUILD_NETWORK_ARGS \ -t "$PLANE_BACKEND_IMAGE" \ -f Dockerfile.api . RECREATE_SERVICES="$RECREATE_SERVICES api worker beat-worker" else printf "== skip backend image ==\n" fi if [ "$BUILD_WEB" = "1" ]; then printf "== frontend image: %s ==\n" "$PLANE_FRONTEND_IMAGE" cd "$SRC" run_env DOCKER_BUILDKIT="$WEB_BUILDKIT" "$DOCKER" build \ $DOCKER_BUILD_NETWORK_ARGS \ --build-arg "VITE_NODEDC_LAUNCHER_URL=$VITE_NODEDC_LAUNCHER_URL" \ --build-arg "VITE_NODEDC_OIDC_LOGIN_ENABLED=$VITE_NODEDC_OIDC_LOGIN_ENABLED" \ -t "$PLANE_FRONTEND_IMAGE" \ -f apps/web/Dockerfile.web.nas-legacy . RECREATE_SERVICES="$RECREATE_SERVICES web" else printf "== skip frontend image ==\n" fi if [ "$BUILD_ADMIN" = "1" ]; then printf "== admin image: %s ==\n" "$PLANE_ADMIN_IMAGE" cd "$SRC" if run_env DOCKER_BUILDKIT="$ADMIN_BUILDKIT" "$DOCKER" build \ $DOCKER_BUILD_NETWORK_ARGS \ --build-arg "VITE_NODEDC_LAUNCHER_URL=$VITE_NODEDC_LAUNCHER_URL" \ -t "$PLANE_ADMIN_IMAGE" \ -f apps/admin/Dockerfile.admin .; then RECREATE_SERVICES="$RECREATE_SERVICES admin" else admin_status=$? if [ "$ADMIN_REQUIRED" = "1" ] || [ -z "$RECREATE_SERVICES" ]; then printf "!! admin image build failed (exit %s); aborting\n" "$admin_status" >&2 exit "$admin_status" fi printf "!! admin image build failed (exit %s); continuing with:%s\n" "$admin_status" "$RECREATE_SERVICES" >&2 fi else printf "== skip admin image ==\n" fi if [ -z "$RECREATE_SERVICES" ]; then printf "== nothing to recreate ==\n" exit 0 fi printf "== recreate tasker services ==\n" compose_up printf "== containers ==\n" run "$DOCKER" ps \ --filter "name=$COMPOSE_PROJECT" \ --format "table {{.Names}}\t{{.Status}}\t{{.Ports}}" if [ "$RUN_SMOKE" = "1" ]; then printf "== smoke: logo ==\n" curl_with_optional_resolve -sSI \ "$SMOKE_BASE_URL/nodedc-logo.svg" \ | grep -Ei "HTTP/|content-type" || true printf "== smoke: websocket ==\n" curl_with_optional_resolve -i --http1.1 \ -H "Connection: Upgrade" \ -H "Upgrade: websocket" \ -H "Sec-WebSocket-Key: dGhlIHNhbXBsZSBub25jZQ==" \ -H "Sec-WebSocket-Version: 13" \ "$SMOKE_BASE_URL/live/nodedc/stream" \ --max-time 35 \ 2>/dev/null | sed -n "1,25p" || true else printf "== skip smoke checks ==\n" fi printf "== done ==\n"