F7_nginx/install.sh

154 lines
6.2 KiB
Bash
Executable File
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

#!/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