154 lines
6.2 KiB
Bash
Executable File
154 lines
6.2 KiB
Bash
Executable File
#!/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 "Проверка наличия SSL-сертификатов (если настроены в конфиге)..."
|
||
MISSING_SSL=0
|
||
if command -v grep >/dev/null 2>&1; then
|
||
while read -r cert_path; do
|
||
[ -z "$cert_path" ] && continue
|
||
if [ ! -f "$cert_path" ]; then
|
||
echo "ВНИМАНИЕ: файл сертификата не найден: $cert_path"
|
||
MISSING_SSL=1
|
||
fi
|
||
done < <(grep -RhoE 'ssl_certificate[_ ]+([^;]+);' /etc/nginx/sites-enabled /etc/nginx/conf.d 2>/dev/null | awk '{print $2}' | tr -d ';')
|
||
fi
|
||
|
||
if [ "$MISSING_SSL" -eq 1 ]; then
|
||
echo "SSL-сертификаты отсутствуют по указанным путям."
|
||
echo "Пропускаю nginx -t и перезагрузку. После установки сертификатов проверьте конфиг и перезапустите nginx вручную."
|
||
echo "Готово. Certbot установлен."
|
||
else
|
||
echo "Проверка конфигурации nginx..."
|
||
nginx -t
|
||
|
||
echo "Перезагрузка nginx..."
|
||
systemctl reload nginx
|
||
|
||
echo "Готово. Certbot установлен."
|
||
fi
|
||
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
|