#!/usr/bin/env bash set -euo pipefail DEPLOY_PATH="${DEPLOY_PATH:-/opt/vpn-proxy}" CONTROL_IMAGE="${CONTROL_IMAGE:-${GATEWAY_IMAGE:-}}" DATAPLANE_IMAGE="${DATAPLANE_IMAGE:-${GATEWAY_IMAGE:-}}" CONTROL_IMAGE="${CONTROL_IMAGE:?CONTROL_IMAGE or GATEWAY_IMAGE is required}" DATAPLANE_IMAGE="${DATAPLANE_IMAGE:?DATAPLANE_IMAGE or GATEWAY_IMAGE is required}" UPDATE_DATAPLANE="${UPDATE_DATAPLANE:-false}" PULL_IMAGE="${PULL_IMAGE:-true}" echo "Preparing deploy directory: ${DEPLOY_PATH}" mkdir -p "${DEPLOY_PATH}" EXISTING_DATAPLANE_IMAGE="$(docker inspect --format '{{.Config.Image}}' vpn-proxy-dataplane 2>/dev/null || true)" FIRST_SPLIT_DEPLOY=false if [ -z "${EXISTING_DATAPLANE_IMAGE}" ]; then FIRST_SPLIT_DEPLOY=true elif [ "${UPDATE_DATAPLANE}" != "true" ]; then DATAPLANE_IMAGE="${EXISTING_DATAPLANE_IMAGE}" fi cat > "${DEPLOY_PATH}/docker-compose.server.yml" < "${DEPLOY_PATH}/.env" <<'EOF' PORT=3456 PROXY_PORT=8080 PROXY_BIND_IP=0.0.0.0 TPROXY_PORT=7895 TPROXY_MARK=1 TPROXY_TABLE=100 TPROXY_CHAIN=VPN_PROXY_TPROXY GATEWAY_FORWARD_CHAIN=VPN_PROXY_FORWARD GATEWAY_NAT_CHAIN=VPN_PROXY_NAT GATEWAY_CLIENT_CIDRS=10.0.0.0/8 172.16.0.0/12 192.168.0.0/16 LOG_LEVEL=info EOF echo "Created default .env. Edit ${DEPLOY_PATH}/.env if this server needs different ports." else echo "Preserving existing .env" fi cd "${DEPLOY_PATH}" echo "Control image: ${CONTROL_IMAGE}" echo "Dataplane image: ${DATAPLANE_IMAGE}" if [ "${PULL_IMAGE}" = "true" ]; then docker compose -f docker-compose.server.yml pull vpn-proxy-control if [ "${FIRST_SPLIT_DEPLOY}" = "true" ] || [ "${UPDATE_DATAPLANE}" = "true" ]; then docker compose -f docker-compose.server.yml pull vpn-proxy-dataplane fi else echo "Skipping image pull" fi if [ "${FIRST_SPLIT_DEPLOY}" = "true" ]; then echo "Migrating the legacy combined gateway to split services..." docker stop vpn-proxy-gateway 2>/dev/null || true docker rm vpn-proxy-gateway 2>/dev/null || true docker compose -f docker-compose.server.yml up -d --wait --wait-timeout 90 elif [ "${UPDATE_DATAPLANE}" = "true" ]; then echo "Updating control and dataplane..." docker compose -f docker-compose.server.yml up -d --wait --wait-timeout 90 else echo "Updating control; keeping dataplane running..." docker compose -f docker-compose.server.yml up -d --no-deps --wait --wait-timeout 90 vpn-proxy-control fi echo "Current containers:" docker ps --filter "name=vpn-proxy-gateway" --filter "name=vpn-proxy-dataplane"