From aba74070882b555700567a616563ff2acaa5ca89 Mon Sep 17 00:00:00 2001 From: Petro1990 Date: Fri, 13 Mar 2026 15:21:21 +0300 Subject: [PATCH] =?UTF-8?q?=D1=84=D0=B8=D1=87=D0=B0:=20=D0=BF=D0=BE=D0=B4?= =?UTF-8?q?=D0=B4=D0=B5=D1=80=D0=B6=D0=BA=D0=B0=20HTTPS=20=D1=87=D0=B5?= =?UTF-8?q?=D1=80=D0=B5=D0=B7=20Certbot=20=D0=B8=20=D0=B8=D1=81=D0=BF?= =?UTF-8?q?=D1=80=D0=B0=D0=B2=D0=BB=D0=B5=D0=BD=D0=B8=D0=B5=20=D0=BE=D1=88?= =?UTF-8?q?=D0=B8=D0=B1=D0=BE=D0=BA=20=D0=B2=20=D0=B4=D0=BE=D0=B1=D0=B0?= =?UTF-8?q?=D0=B2=D0=BB=D0=B5=D0=BD=D0=B8=D0=B8=20=D1=81=D0=B5=D1=80=D0=B2?= =?UTF-8?q?=D0=B8=D1=81=D0=BE=D0=B2?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- rproxy | 53 +++++++++++++++++++++++++++++++++++++++++++++++++---- 1 file changed, 49 insertions(+), 4 deletions(-) diff --git a/rproxy b/rproxy index 4c7750e..6fba70d 100644 --- a/rproxy +++ b/rproxy @@ -11,6 +11,7 @@ PID_DIR="/opt/var/run/rproxy" SSH_KEY="$CONF_DIR/id_ed25519" REMOTE_NGINX_DIR="/etc/nginx/sites-enabled" BASE_TUNNEL_PORT=10000 +CERTBOT_EMAIL="" # Будет заполнено из конфига # ─── Цвета ─────────────────────────────────────────────────────────── RED='\033[0;31m' @@ -244,7 +245,7 @@ do_add_interactive() { printf "\n" prompt "Название сервиса (латиницей, без пробелов): " - local name="$REPLY" + local name=$(echo "$REPLY" | tr ' ' '_' | tr -cd '[:alnum:]_-') [ -z "$name" ] && { warn "Название не может быть пустым"; pause; return; } if [ -f "$SERVICES_DIR/$name.conf" ]; then @@ -265,17 +266,36 @@ do_add_interactive() { local domain="" local ext_port="" + local use_ssl="no" if [ "$mode" = "1" ]; then prompt "Доменное имя (например, mysite.example.com): " domain="$REPLY" [ -z "$domain" ] && { warn "Домен не указан"; pause; return; } ext_port=80 + + printf "\n Включить SSL (HTTPS) через Certbot? (д/н) [н]: " + read -r use_ssl_ans + case "$use_ssl_ans" in + д|Д|y|Y|да|yes) + use_ssl="yes" + ext_port=443 + if [ -z "$CERTBOT_EMAIL" ]; then + prompt "Введите Email для регистрации сертификатов: " + CERTBOT_EMAIL="$REPLY" + # Сохраняем email в конфиг + sed -i "/CERTBOT_EMAIL=/d" "$CONF_FILE" + echo "CERTBOT_EMAIL=\"$CERTBOT_EMAIL\"" >> "$CONF_FILE" + fi + ;; + *) use_ssl="no" ;; + esac else local suggested suggested=$(next_free_port) prompt "Внешний порт [$suggested]: " ext_port="${REPLY:-$suggested}" + use_ssl="no" fi # Разбор адреса @@ -296,6 +316,7 @@ do_add_interactive() { printf " ${BOLD}Туннель:${NC} порт $tunnel_port\n" [ -n "$domain" ] && printf " ${BOLD}Домен:${NC} $domain\n" printf " ${BOLD}Внешний порт:${NC} $ext_port\n" + [ "$use_ssl" = "yes" ] && printf " ${BOLD}SSL:${NC} Включен (Certbot)\n" draw_separator prompt "Всё верно? Добавить сервис? (д/н) [д]: " @@ -311,6 +332,8 @@ do_add_interactive() { # Генерация конфига nginx local nginx_conf="" if [ -n "$domain" ]; then + # Для домена всегда сначала создаем конфиг на 80 порт + # Если нужен SSL, Certbot сам его проапгрейдит nginx_conf="# rProxy: $name server { listen 80; @@ -354,6 +377,7 @@ server { fi # Деплой nginx конфига на VPS + msg "Загружаю конфигурацию nginx..." local tmp_file="/tmp/rproxy_nginx_$name.conf" printf '%s' "$nginx_conf" > "$tmp_file" scp_cmd "$tmp_file" "$VPS_USER@$VPS_HOST:$REMOTE_NGINX_DIR/rproxy_$name.conf" || { @@ -364,13 +388,25 @@ server { } rm -f "$tmp_file" - # Перезагрузка nginx - ssh_cmd "nginx -t && systemctl reload nginx" || { - err "Ошибка конфигурации nginx на VPS" + # Проверка и перезагрузка nginx + ssh_cmd "nginx -t" >/dev/null 2>&1 || { + err "Ошибка в конфигурации nginx на VPS" ssh_cmd "rm -f $REMOTE_NGINX_DIR/rproxy_$name.conf" pause return } + ssh_cmd "systemctl reload nginx" >/dev/null 2>&1 + + # Получение SSL сертификата если нужно + if [ "$use_ssl" = "yes" ]; then + msg "Получаю SSL сертификат через Certbot (может занять время)..." + ssh_cmd "certbot --nginx -d $domain --non-interactive --agree-tos -m $CERTBOT_EMAIL" || { + warn "Certbot не смог получить сертификат. Проверьте DNS и доступность порта 80." + use_ssl="no" + ext_port=80 + } + fi + # Сохранение конфига сервиса cat > "$SERVICES_DIR/$name.conf" </dev/null; then sed -i \"/http {/a\\\\ include /etc/nginx/sites-enabled/*.conf;\" /etc/nginx/nginx.conf 2>/dev/null fi + + if ! command -v certbot >/dev/null 2>&1; then + echo \"Устанавливаю Certbot...\" + apt-get install -y -qq certbot python3-certbot-nginx >/dev/null 2>&1 || \ + yum install -y certbot python3-certbot-nginx >/dev/null 2>&1 + fi + systemctl enable nginx 2>/dev/null systemctl start nginx 2>/dev/null echo OK @@ -806,6 +850,7 @@ VPS_PORT="$vps_port" VPS_USER="$vps_user" VPS_AUTH="$vps_auth" VPS_PASS="$vps_pass" +CERTBOT_EMAIL="$CERTBOT_EMAIL" EOF chmod 600 "$CONF_FILE"