From 84c27b7e1b4584ff053ca15c263d893135e6f97d Mon Sep 17 00:00:00 2001 From: deadcxap <36386824+deadcxap@users.noreply.github.com> Date: Sun, 24 Aug 2025 03:43:13 +0300 Subject: [PATCH] =?UTF-8?q?fix:=20=D0=BA=D0=BE=D1=80=D1=80=D0=B5=D0=BA?= =?UTF-8?q?=D1=82=D0=BD=D1=8B=D0=B9=20=D0=BF=D1=83=D1=82=D1=8C=20env=20?= =?UTF-8?q?=D0=B8=20=D0=BE=D0=B1=D0=BD=D0=BE=D0=B2=D0=BB=D0=B5=D0=BD=D0=B8?= =?UTF-8?q?=D0=B5=20=D0=BF=D0=B5=D1=80=D0=B5=D0=BC=D0=B5=D0=BD=D0=BD=D1=8B?= =?UTF-8?q?=D1=85?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- node/bootstrap/init.sh | 67 ++++++++++++++++++++++++++++++++++++++++-- 1 file changed, 65 insertions(+), 2 deletions(-) diff --git a/node/bootstrap/init.sh b/node/bootstrap/init.sh index 8bb5adc..3c24a2f 100644 --- a/node/bootstrap/init.sh +++ b/node/bootstrap/init.sh @@ -1,4 +1,67 @@ #!/usr/bin/env bash + +# Скрипт инициализации ноды. +# 1. Скачивает случайный шаблон сайта и разворачивает его в /var/www/html. +# 2. Создаёт докер-сеть, указанную в docker-compose.yml. +# 3. Запрашивает необходимые параметры у пользователя и записывает их в .env. +# 4. Открывает порт панели только для центрального сервера. +# 5. Запускает docker compose. + +set -euo pipefail + +# --- Шаг 1: загрузка случайного шаблона сайта --- +TMP_DIR=$(mktemp -d) +git clone --depth 1 https://github.com/SmallPoppa/sni-templates "$TMP_DIR" >/dev/null 2>&1 +TEMPLATE_DIR=$(find "$TMP_DIR" -mindepth 1 -maxdepth 1 -type d ! -name '.git' | shuf -n 1) + +if [ -d /var/www/html ] && [ "$(ls -A /var/www/html 2>/dev/null)" ]; then + rm -rf /var/www/html_bac + mv /var/www/html /var/www/html_bac +else + rm -rf /var/www/html +fi +mkdir -p /var/www/html +cp -R "$TEMPLATE_DIR"/. /var/www/html/ +rm -rf /var/www/html/.git "$TMP_DIR" + +# --- Шаг 2: создание докер-сети --- N=$(awk '/^networks:/,/^[^[:space:]]/{if($1=="name:"){print $2; exit}}' docker-compose.yml); N=${N:-proxy} -docker network inspect "$N" >/dev/null 2>&1 || docker network create --driver bridge "$N" -docker compose up -d \ No newline at end of file +docker network inspect "$N" >/dev/null 2>&1 || docker network create --driver bridge --attachable "$N" + +# --- Шаг 3: запрос параметров --- +read -rp "APP_PORT: " APP_PORT +read -rp "SSL_CERT: " SSL_CERT +read -rp "NODE_DOMAIN: " NODE_DOMAIN +read -rp "CW_CLIENT_AES_KEY_BASE64: " CW_CLIENT_AES_KEY_BASE64 +read -rp "CW_CLIENT_KEY_APIKEY: " CW_CLIENT_KEY_APIKEY +read -rp "CW_CLIENT_CERT_APIKEY: " CW_CLIENT_CERT_APIKEY + +SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)" +ENV_FILE="$SCRIPT_DIR/.env" +touch "$ENV_FILE" + +update_env_var() { + local key="$1" + local value="$2" + sed -i "/^${key}=.*/d" "$ENV_FILE" + printf '%s="%s"\n' "$key" "$value" >> "$ENV_FILE" +} + +update_env_var APP_PORT "$APP_PORT" +update_env_var SSL_CERT "$SSL_CERT" +update_env_var NODE_DOMAIN "$NODE_DOMAIN" +update_env_var CW_CLIENT_AES_KEY_BASE64 "$CW_CLIENT_AES_KEY_BASE64" +update_env_var CW_CLIENT_KEY_APIKEY "$CW_CLIENT_KEY_APIKEY" +update_env_var CW_CLIENT_CERT_APIKEY "$CW_CLIENT_CERT_APIKEY" + +# --- Шаг 4: открытие порта только для центрального сервера --- +read -rp "IP или домен центрального сервера: " CENTRAL_HOST +CENTRAL_IP=$(getent ahosts "$CENTRAL_HOST" | awk '{print $1; exit}') +if [ -n "$CENTRAL_IP" ]; then + iptables -C INPUT -p tcp -s "$CENTRAL_IP" --dport "$APP_PORT" -j ACCEPT 2>/dev/null \ + || iptables -I INPUT -p tcp -s "$CENTRAL_IP" --dport "$APP_PORT" -j ACCEPT +fi + +# --- Шаг 5: запуск docker compose --- +docker compose up -d +