фича: поддержка HTTPS через Certbot и исправление ошибок в добавлении сервисов
This commit is contained in:
parent
1365a12d86
commit
aba7407088
53
rproxy
53
rproxy
|
|
@ -11,6 +11,7 @@ PID_DIR="/opt/var/run/rproxy"
|
||||||
SSH_KEY="$CONF_DIR/id_ed25519"
|
SSH_KEY="$CONF_DIR/id_ed25519"
|
||||||
REMOTE_NGINX_DIR="/etc/nginx/sites-enabled"
|
REMOTE_NGINX_DIR="/etc/nginx/sites-enabled"
|
||||||
BASE_TUNNEL_PORT=10000
|
BASE_TUNNEL_PORT=10000
|
||||||
|
CERTBOT_EMAIL="" # Будет заполнено из конфига
|
||||||
|
|
||||||
# ─── Цвета ───────────────────────────────────────────────────────────
|
# ─── Цвета ───────────────────────────────────────────────────────────
|
||||||
RED='\033[0;31m'
|
RED='\033[0;31m'
|
||||||
|
|
@ -244,7 +245,7 @@ do_add_interactive() {
|
||||||
printf "\n"
|
printf "\n"
|
||||||
|
|
||||||
prompt "Название сервиса (латиницей, без пробелов): "
|
prompt "Название сервиса (латиницей, без пробелов): "
|
||||||
local name="$REPLY"
|
local name=$(echo "$REPLY" | tr ' ' '_' | tr -cd '[:alnum:]_-')
|
||||||
[ -z "$name" ] && { warn "Название не может быть пустым"; pause; return; }
|
[ -z "$name" ] && { warn "Название не может быть пустым"; pause; return; }
|
||||||
|
|
||||||
if [ -f "$SERVICES_DIR/$name.conf" ]; then
|
if [ -f "$SERVICES_DIR/$name.conf" ]; then
|
||||||
|
|
@ -265,17 +266,36 @@ do_add_interactive() {
|
||||||
|
|
||||||
local domain=""
|
local domain=""
|
||||||
local ext_port=""
|
local ext_port=""
|
||||||
|
local use_ssl="no"
|
||||||
|
|
||||||
if [ "$mode" = "1" ]; then
|
if [ "$mode" = "1" ]; then
|
||||||
prompt "Доменное имя (например, mysite.example.com): "
|
prompt "Доменное имя (например, mysite.example.com): "
|
||||||
domain="$REPLY"
|
domain="$REPLY"
|
||||||
[ -z "$domain" ] && { warn "Домен не указан"; pause; return; }
|
[ -z "$domain" ] && { warn "Домен не указан"; pause; return; }
|
||||||
ext_port=80
|
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
|
else
|
||||||
local suggested
|
local suggested
|
||||||
suggested=$(next_free_port)
|
suggested=$(next_free_port)
|
||||||
prompt "Внешний порт [$suggested]: "
|
prompt "Внешний порт [$suggested]: "
|
||||||
ext_port="${REPLY:-$suggested}"
|
ext_port="${REPLY:-$suggested}"
|
||||||
|
use_ssl="no"
|
||||||
fi
|
fi
|
||||||
|
|
||||||
# Разбор адреса
|
# Разбор адреса
|
||||||
|
|
@ -296,6 +316,7 @@ do_add_interactive() {
|
||||||
printf " ${BOLD}Туннель:${NC} порт $tunnel_port\n"
|
printf " ${BOLD}Туннель:${NC} порт $tunnel_port\n"
|
||||||
[ -n "$domain" ] && printf " ${BOLD}Домен:${NC} $domain\n"
|
[ -n "$domain" ] && printf " ${BOLD}Домен:${NC} $domain\n"
|
||||||
printf " ${BOLD}Внешний порт:${NC} $ext_port\n"
|
printf " ${BOLD}Внешний порт:${NC} $ext_port\n"
|
||||||
|
[ "$use_ssl" = "yes" ] && printf " ${BOLD}SSL:${NC} Включен (Certbot)\n"
|
||||||
draw_separator
|
draw_separator
|
||||||
|
|
||||||
prompt "Всё верно? Добавить сервис? (д/н) [д]: "
|
prompt "Всё верно? Добавить сервис? (д/н) [д]: "
|
||||||
|
|
@ -311,6 +332,8 @@ do_add_interactive() {
|
||||||
# Генерация конфига nginx
|
# Генерация конфига nginx
|
||||||
local nginx_conf=""
|
local nginx_conf=""
|
||||||
if [ -n "$domain" ]; then
|
if [ -n "$domain" ]; then
|
||||||
|
# Для домена всегда сначала создаем конфиг на 80 порт
|
||||||
|
# Если нужен SSL, Certbot сам его проапгрейдит
|
||||||
nginx_conf="# rProxy: $name
|
nginx_conf="# rProxy: $name
|
||||||
server {
|
server {
|
||||||
listen 80;
|
listen 80;
|
||||||
|
|
@ -354,6 +377,7 @@ server {
|
||||||
fi
|
fi
|
||||||
|
|
||||||
# Деплой nginx конфига на VPS
|
# Деплой nginx конфига на VPS
|
||||||
|
msg "Загружаю конфигурацию nginx..."
|
||||||
local tmp_file="/tmp/rproxy_nginx_$name.conf"
|
local tmp_file="/tmp/rproxy_nginx_$name.conf"
|
||||||
printf '%s' "$nginx_conf" > "$tmp_file"
|
printf '%s' "$nginx_conf" > "$tmp_file"
|
||||||
scp_cmd "$tmp_file" "$VPS_USER@$VPS_HOST:$REMOTE_NGINX_DIR/rproxy_$name.conf" || {
|
scp_cmd "$tmp_file" "$VPS_USER@$VPS_HOST:$REMOTE_NGINX_DIR/rproxy_$name.conf" || {
|
||||||
|
|
@ -364,13 +388,25 @@ server {
|
||||||
}
|
}
|
||||||
rm -f "$tmp_file"
|
rm -f "$tmp_file"
|
||||||
|
|
||||||
# Перезагрузка nginx
|
# Проверка и перезагрузка nginx
|
||||||
ssh_cmd "nginx -t && systemctl reload nginx" || {
|
ssh_cmd "nginx -t" >/dev/null 2>&1 || {
|
||||||
err "Ошибка конфигурации nginx на VPS"
|
err "Ошибка в конфигурации nginx на VPS"
|
||||||
ssh_cmd "rm -f $REMOTE_NGINX_DIR/rproxy_$name.conf"
|
ssh_cmd "rm -f $REMOTE_NGINX_DIR/rproxy_$name.conf"
|
||||||
pause
|
pause
|
||||||
return
|
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" <<EOF
|
cat > "$SERVICES_DIR/$name.conf" <<EOF
|
||||||
|
|
@ -381,6 +417,7 @@ SVC_TARGET_PORT="$target_port"
|
||||||
SVC_TUNNEL_PORT="$tunnel_port"
|
SVC_TUNNEL_PORT="$tunnel_port"
|
||||||
SVC_EXT_PORT="$ext_port"
|
SVC_EXT_PORT="$ext_port"
|
||||||
SVC_DOMAIN="$domain"
|
SVC_DOMAIN="$domain"
|
||||||
|
SVC_SSL="$use_ssl"
|
||||||
SVC_ENABLED="yes"
|
SVC_ENABLED="yes"
|
||||||
EOF
|
EOF
|
||||||
|
|
||||||
|
|
@ -790,6 +827,13 @@ do_setup() {
|
||||||
if ! grep -q \"include.*sites-enabled\" /etc/nginx/nginx.conf 2>/dev/null; then
|
if ! grep -q \"include.*sites-enabled\" /etc/nginx/nginx.conf 2>/dev/null; then
|
||||||
sed -i \"/http {/a\\\\ include /etc/nginx/sites-enabled/*.conf;\" /etc/nginx/nginx.conf 2>/dev/null
|
sed -i \"/http {/a\\\\ include /etc/nginx/sites-enabled/*.conf;\" /etc/nginx/nginx.conf 2>/dev/null
|
||||||
fi
|
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 enable nginx 2>/dev/null
|
||||||
systemctl start nginx 2>/dev/null
|
systemctl start nginx 2>/dev/null
|
||||||
echo OK
|
echo OK
|
||||||
|
|
@ -806,6 +850,7 @@ VPS_PORT="$vps_port"
|
||||||
VPS_USER="$vps_user"
|
VPS_USER="$vps_user"
|
||||||
VPS_AUTH="$vps_auth"
|
VPS_AUTH="$vps_auth"
|
||||||
VPS_PASS="$vps_pass"
|
VPS_PASS="$vps_pass"
|
||||||
|
CERTBOT_EMAIL="$CERTBOT_EMAIL"
|
||||||
EOF
|
EOF
|
||||||
chmod 600 "$CONF_FILE"
|
chmod 600 "$CONF_FILE"
|
||||||
|
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue