diff --git a/README.md b/README.md index 60cf6a8..452fcaf 100644 --- a/README.md +++ b/README.md @@ -280,6 +280,14 @@ docker compose -f docker-compose.gateway.yml build docker compose -f docker-compose.gateway.yml up -d ``` +Если сборку нужно выполнять на контейнере/хосте, который уже ходит через рабочий gateway, а запускать image на другом: + +```bash +BUILD_HOST=107 DEPLOY_HOST=111 ./scripts/build-on-107-deploy-111.sh +``` + +Скрипт собирает image на `BUILD_HOST`, переносит его на `DEPLOY_HOST` через `docker save | docker load` и запускает без `docker pull`. Если `107`/`111` не являются SSH-алиасами, укажите реальные адреса, например `BUILD_HOST=root@192.168.1.107 DEPLOY_HOST=root@192.168.1.111`. + UI доступен на `http://:3456`. На роутере указать шлюз по умолчанию (или нужные подсети) на IP контейнера. diff --git a/scripts/build-on-107-deploy-111.sh b/scripts/build-on-107-deploy-111.sh new file mode 100755 index 0000000..1c6d6e3 --- /dev/null +++ b/scripts/build-on-107-deploy-111.sh @@ -0,0 +1,41 @@ +#!/usr/bin/env bash +set -euo pipefail + +BUILD_HOST="${BUILD_HOST:-107}" +DEPLOY_HOST="${DEPLOY_HOST:-111}" +BUILD_PATH="${BUILD_PATH:-/opt/vpn-proxy-build}" +DEPLOY_PATH="${DEPLOY_PATH:-/opt/vpn-proxy}" +IMAGE_NAME="${IMAGE_NAME:-vpn-proxy-gateway}" +GIT_REF="$(git rev-parse --short HEAD 2>/dev/null || echo manual)" +IMAGE_TAG="${IMAGE_TAG:-${GIT_REF}-$(date +%Y%m%d%H%M%S)}" +GATEWAY_IMAGE="${GATEWAY_IMAGE:-${IMAGE_NAME}:${IMAGE_TAG}}" +BASE_IMAGE="${BASE_IMAGE:-debian:bookworm-slim}" +SINGBOX_VERSION="${SINGBOX_VERSION:-1.12.13}" + +echo "Build host: ${BUILD_HOST}" +echo "Deploy host: ${DEPLOY_HOST}" +echo "Image: ${GATEWAY_IMAGE}" + +echo "Syncing source to ${BUILD_HOST}:${BUILD_PATH}" +ssh "${BUILD_HOST}" "mkdir -p '${BUILD_PATH}'" +rsync -az --delete \ + --exclude '.git' \ + --exclude '.vpn-proxy' \ + --exclude 'node_modules' \ + --exclude 'dist' \ + ./ "${BUILD_HOST}:${BUILD_PATH}/" + +echo "Building image on ${BUILD_HOST}" +ssh "${BUILD_HOST}" \ + "cd '${BUILD_PATH}' && npm ci && npm run build && docker build --pull --build-arg BASE_IMAGE='${BASE_IMAGE}' --build-arg SINGBOX_VERSION='${SINGBOX_VERSION}' -t '${GATEWAY_IMAGE}' ." + +echo "Loading image into ${DEPLOY_HOST}" +ssh "${BUILD_HOST}" "docker save '${GATEWAY_IMAGE}'" | ssh "${DEPLOY_HOST}" "docker load" + +echo "Copying deploy script to ${DEPLOY_HOST}:${DEPLOY_PATH}" +ssh "${DEPLOY_HOST}" "mkdir -p '${DEPLOY_PATH}'" +rsync -az scripts/deploy-gateway.sh "${DEPLOY_HOST}:${DEPLOY_PATH}/deploy-gateway.sh" + +echo "Starting gateway on ${DEPLOY_HOST}" +ssh "${DEPLOY_HOST}" \ + "cd '${DEPLOY_PATH}' && chmod +x ./deploy-gateway.sh && DEPLOY_PATH='${DEPLOY_PATH}' GATEWAY_IMAGE='${GATEWAY_IMAGE}' PULL_IMAGE=false ./deploy-gateway.sh" diff --git a/scripts/deploy-gateway.sh b/scripts/deploy-gateway.sh index ca2339d..0dd03be 100644 --- a/scripts/deploy-gateway.sh +++ b/scripts/deploy-gateway.sh @@ -3,6 +3,7 @@ set -euo pipefail DEPLOY_PATH="${DEPLOY_PATH:-/opt/vpn-proxy}" GATEWAY_IMAGE="${GATEWAY_IMAGE:?GATEWAY_IMAGE is required}" +PULL_IMAGE="${PULL_IMAGE:-true}" echo "Preparing deploy directory: ${DEPLOY_PATH}" mkdir -p "${DEPLOY_PATH}" @@ -57,7 +58,11 @@ fi cd "${DEPLOY_PATH}" echo "Pulling image: ${GATEWAY_IMAGE}" -docker compose -f docker-compose.server.yml pull +if [ "${PULL_IMAGE}" = "true" ]; then + docker compose -f docker-compose.server.yml pull +else + echo "Skipping image pull; using local image ${GATEWAY_IMAGE}" +fi echo "Starting gateway..." docker compose -f docker-compose.server.yml up -d