#!/bin/bash set -e # Переменные (передаются через окружение или аргументы) # client_f7cloud - домен для клиента # ip_client_f7cloud - IP адрес клиента # hpb_f7cloud - домен для HPB # ip_hpb_f7cloud - IP адрес HPB # certbot_email - почта для получения сертификатов через certbot usage() { echo "Использование: $0" echo "Обязательные переменные (через экспорт или перед вызовом):" echo " client_f7cloud - домен для клиента" echo " ip_client_f7cloud - IP адрес клиента" echo " hpb_f7cloud - домен для HPB" echo " ip_hpb_f7cloud - IP адрес HPB" echo "Необязательные переменные:" echo " certbot_email - почта для сертификатов certbot (нужна только если будете вызывать certbot)" echo "" echo "Пример:" echo " client_f7cloud=client.example.com ip_client_f7cloud=10.0.0.1 \\" echo " hpb_f7cloud=hpb.example.com ip_hpb_f7cloud=10.0.0.2 \\" echo " certbot_email=admin@example.com $0" exit 1 } for var in client_f7cloud ip_client_f7cloud hpb_f7cloud ip_hpb_f7cloud; do if [ -z "${!var}" ]; then echo "Ошибка: не задана переменная $var" usage fi done SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)" NGINX_SITES="/etc/nginx/sites-enabled" NGINX_SNIPPETS="/etc/nginx/snippets" NGINX_STREAM="/etc/nginx/stream-enabled" NGINX_CONF="/etc/nginx/nginx.conf" echo "Установка nginx..." apt-get update apt-get install -y nginx apt-get install -y libnginx-mod-stream echo "Установка certbot..." apt-get install -y certbot python3-certbot-nginx echo "Копирование конфигов с подстановкой переменных..." # Копируем sites-enabled (с заменой плейсхолдеров) mkdir -p "$NGINX_SITES" rsync -a --delete "$SCRIPT_DIR/sites-enabled/" "$NGINX_SITES/" for f in "$NGINX_SITES"/*.conf; do [ -f "$f" ] || continue sed -i \ -e "s|__CLIENT_F7CLOUD__|$client_f7cloud|g" \ -e "s|__IP_CLIENT_F7CLOUD__|$ip_client_f7cloud|g" \ -e "s|__HPB_F7CLOUD__|$hpb_f7cloud|g" \ -e "s|__IP_HPB_F7CLOUD__|$ip_hpb_f7cloud|g" \ "$f" done # Копируем snippets (с заменой плейсхолдеров) mkdir -p "$NGINX_SNIPPETS" rsync -a --delete "$SCRIPT_DIR/snippets/" "$NGINX_SNIPPETS/" for f in "$NGINX_SNIPPETS"/*.conf; do [ -f "$f" ] || continue sed -i \ -e "s|__CLIENT_F7CLOUD__|$client_f7cloud|g" \ -e "s|__IP_CLIENT_F7CLOUD__|$ip_client_f7cloud|g" \ -e "s|__HPB_F7CLOUD__|$hpb_f7cloud|g" \ -e "s|__IP_HPB_F7CLOUD__|$ip_hpb_f7cloud|g" \ "$f" done # Копируем stream-enabled (TURN/coturn — директива stream только в корне nginx.conf) if [ -d "$SCRIPT_DIR/stream-enabled" ]; then mkdir -p "$NGINX_STREAM" rsync -a --delete "$SCRIPT_DIR/stream-enabled/" "$NGINX_STREAM/" for f in "$NGINX_STREAM"/*.conf; do [ -f "$f" ] || continue sed -i \ -e "s|__CLIENT_F7CLOUD__|$client_f7cloud|g" \ -e "s|__IP_CLIENT_F7CLOUD__|$ip_client_f7cloud|g" \ -e "s|__HPB_F7CLOUD__|$hpb_f7cloud|g" \ -e "s|__IP_HPB_F7CLOUD__|$ip_hpb_f7cloud|g" \ "$f" done # Подключить stream в nginx.conf, если ещё не подключено if ! grep -q 'include /etc/nginx/stream-enabled' "$NGINX_CONF"; then if grep -q '^stream {' "$NGINX_CONF"; then # Заменить существующий блок stream на include NGINX_CONF="$NGINX_CONF" python3 << 'PYSTREAM' import os path = os.environ.get("NGINX_CONF", "/etc/nginx/nginx.conf") with open(path) as f: content = f.read() start = content.find("stream {") if start != -1: depth = 0 end = start for i in range(start, len(content)): if content[i] == "{": depth += 1 elif content[i] == "}": depth -= 1 if depth == 0: end = i; break replacement = "stream {\n include /etc/nginx/stream-enabled/*.conf;\n}" content = content[:start] + replacement + content[end+1:] with open(path, "w") as f: f.write(content) PYSTREAM else # Добавить блок stream в конец [ -n "$(tail -c1 "$NGINX_CONF")" ] && echo >> "$NGINX_CONF" echo 'stream { include /etc/nginx/stream-enabled/*.conf; }' >> "$NGINX_CONF" fi fi fi echo "Проверка конфигурации nginx..." nginx -t echo "Перезагрузка nginx..." systemctl reload nginx echo "Готово. Certbot установлен." if [ -n "$certbot_email" ]; then echo "Для получения сертификатов можно использовать:" echo " certbot --nginx -d $client_f7cloud -d $hpb_f7cloud --email $certbot_email --agree-tos" else echo "Переменная certbot_email не задана. Certbot можно вызвать вручную при необходимости." fi