From daf572e1f24438bcc168e3025e0d71f8b1297a20 Mon Sep 17 00:00:00 2001 From: mrleo1nid <43583385+mrleo1nid@users.noreply.github.com> Date: Tue, 6 Oct 2026 11:45:11 +0300 Subject: [PATCH] Deploy default status page to /var/www/statuspage Co-Authored-By: Claude Opus 5.5 --- README.md | 13 ++++++------ setup.sh | 49 +++++++++++++++++++++++++++---------------- statuspage/index.html | 1 + 3 files changed, 39 insertions(+), 24 deletions(-) create mode 100644 statuspage/index.html diff --git a/README.md b/README.md index 070008f..c0b7ab8 100644 --- a/README.md +++ b/README.md @@ -24,17 +24,18 @@ curl -fsSL https://gitea.hsrv.site/mrleo1nid/vps_installer/raw/branch/main/setup 5. fail2ban (jail sshd, ваш текущий IP в ignoreip) 6. UFW: SSH, 80, 443 7. Блокировка IP по внешнему списку — ipset + cron *(можно отключить)* -13. Запрет входа root по SSH, блокировка пароля root *(можно отключить)* +8. Заглушка 503 в `/var/www/statuspage/index.html` (из `statuspage/` репозитория; существующий файл не перезаписывается) +14. Запрет входа root по SSH, блокировка пароля root *(можно отключить)* Опционально (только установка): | # | ПО | Версия | Состояние после скрипта | |---|----|--------|-------------------------| -| 8 | Docker + Compose | из репо Docker | запущен, пользователь в группе `docker` | -| 9 | Telegraf | из репо InfluxData | установлен, **выключен** до настройки `telegraf.conf` | -| 10 | Nebula | **1.10.3** | бинарники + юнит, **не запущен** до появления сертификатов | -| 11 | 3x-ui | **v2.8.11** | официальный установщик (интерактивный), порт панели открыт в UFW | -| 12 | Caddy | из репо Caddy | установлен со стандартным Caddyfile | +| 9 | Docker + Compose | из репо Docker | запущен, пользователь в группе `docker` | +| 10 | Telegraf | из репо InfluxData | установлен, **выключен** до настройки `telegraf.conf` | +| 11 | Nebula | **1.10.3** | бинарники + юнит, **не запущен** до появления сертификатов | +| 12 | 3x-ui | **v2.8.11** | официальный установщик (интерактивный), порт панели открыт в UFW | +| 13 | Caddy | из репо Caddy | установлен со стандартным Caddyfile | Версии 3x-ui и Nebula задаются в начале `setup.sh` (`XUI_VERSION`, `NEBULA_VERSION`). В конце скрипт выводит список того, что осталось настроить. diff --git a/setup.sh b/setup.sh index b7e2574..f89946f 100755 --- a/setup.sh +++ b/setup.sh @@ -22,6 +22,8 @@ set -Eeuo pipefail XUI_VERSION="v2.8.11" NEBULA_VERSION="1.10.3" +REPO_RAW="https://gitea.hsrv.site/mrleo1nid/vps_installer/raw/branch/main" +STATUSPAGE_DIR="/var/www/statuspage" LOG_FILE="/var/log/vps-setup.log" DEFAULT_BLOCKLIST_URL="https://raw.githubusercontent.com/jahlib/somebody-knocked-my-ssh/refs/heads/main/ban.txt" BAN_SCRIPT_URL="https://raw.githubusercontent.com/jahlib/somebody-knocked-my-ssh/refs/heads/main/ban.sh" @@ -297,9 +299,20 @@ else step "7. Блокировка IP — пропущено" fi -# ---------- 8. Docker ---------- +# ---------- 8. Статус-страница ---------- +step "8. Статус-страница $STATUSPAGE_DIR" +if [[ -f $STATUSPAGE_DIR/index.html ]]; then + info "$STATUSPAGE_DIR/index.html уже есть — не трогаю" +else + install -d -m 755 "$STATUSPAGE_DIR" + curl -fsSL "$REPO_RAW/statuspage/index.html" -o "$STATUSPAGE_DIR/index.html" + chmod 644 "$STATUSPAGE_DIR/index.html" + ok "Заглушка положена в $STATUSPAGE_DIR/index.html" +fi + +# ---------- 9. Docker ---------- if [[ $INSTALL_DOCKER == y ]]; then - step "8. Docker + Docker Compose" + step "9. Docker + Docker Compose" for pkg in docker.io docker-doc docker-compose docker-compose-v2 podman-docker containerd runc; do dpkg -s "$pkg" &>/dev/null && apt-get remove -y -q "$pkg" done @@ -316,12 +329,12 @@ if [[ $INSTALL_DOCKER == y ]]; then info "$NEW_USER добавлен в группу docker" warn "Docker публикует порты в обход UFW — биндите на 127.0.0.1:PORT или фильтруйте в DOCKER-USER" else - step "8. Docker — пропущено" + step "9. Docker — пропущено" fi -# ---------- 9. Telegraf ---------- +# ---------- 10. Telegraf ---------- if [[ $INSTALL_TELEGRAF == y ]]; then - step "9. Telegraf" + step "10. Telegraf" mkdir -p /etc/apt/keyrings curl -fsSL https://repos.influxdata.com/influxdata-archive.key \ | gpg --batch --yes --dearmor -o /etc/apt/keyrings/influxdata.gpg @@ -349,12 +362,12 @@ EOF ok "$(telegraf --version) установлен, сервис выключен до настройки" todo "Telegraf: заполнить /etc/telegraf/telegraf.conf → telegraf --config /etc/telegraf/telegraf.conf --test → systemctl enable --now telegraf" else - step "9. Telegraf — пропущено" + step "10. Telegraf — пропущено" fi -# ---------- 10. Nebula ---------- +# ---------- 11. Nebula ---------- if [[ $INSTALL_NEBULA == y ]]; then - step "10. Nebula $NEBULA_VERSION" + step "11. Nebula $NEBULA_VERSION" NEBULA_TMP=$(mktemp -d) curl -fsSL "https://github.com/slackhq/nebula/releases/download/v$NEBULA_VERSION/nebula-linux-$ARCH.tar.gz" \ -o "$NEBULA_TMP/nebula.tar.gz" @@ -379,13 +392,13 @@ if [[ $INSTALL_NEBULA == y ]]; then ok "$(nebula -version | head -n1), юнит установлен, сервис не запущен (нет сертификатов)" todo "Nebula: положить ca.crt, .crt, .key и config.yml в /etc/nebula (пример: config.yml.example), chmod 600 /etc/nebula/*.key → systemctl enable --now nebula" else - step "10. Nebula — пропущено" + step "11. Nebula — пропущено" fi -# ---------- 11. 3x-ui ---------- +# ---------- 12. 3x-ui ---------- # ставим до Caddy: установщику 3x-ui для сертификата Let's Encrypt нужен свободный порт 80 if [[ $INSTALL_3XUI == y ]]; then - step "11. 3x-ui $XUI_VERSION" + step "12. 3x-ui $XUI_VERSION" XUI_INSTALLER=$(mktemp) curl -fsSL "https://raw.githubusercontent.com/mhsanaei/3x-ui/$XUI_VERSION/install.sh" -o "$XUI_INSTALLER" info "Дальше — вопросы установщика 3x-ui (порт панели, SSL)." @@ -404,12 +417,12 @@ if [[ $INSTALL_3XUI == y ]]; then fi rm -f "$XUI_INSTALLER" else - step "11. 3x-ui — пропущено" + step "12. 3x-ui — пропущено" fi -# ---------- 12. Caddy ---------- +# ---------- 13. Caddy ---------- if [[ $INSTALL_CADDY == y ]]; then - step "12. Caddy" + step "13. Caddy" apt_install debian-keyring debian-archive-keyring apt-transport-https curl -1sLf 'https://dl.cloudsmith.io/public/caddy/stable/gpg.key' \ | gpg --batch --yes --dearmor -o /usr/share/keyrings/caddy-stable-archive-keyring.gpg @@ -420,12 +433,12 @@ if [[ $INSTALL_CADDY == y ]]; then ok "Caddy $(caddy version | awk '{print $1}') установлен (стандартный Caddyfile)" todo "Caddy: заполнить /etc/caddy/Caddyfile → caddy validate --config /etc/caddy/Caddyfile && systemctl reload caddy" else - step "12. Caddy — пропущено" + step "13. Caddy — пропущено" fi -# ---------- 13. Отключение доступа root ---------- +# ---------- 14. Отключение доступа root ---------- if [[ $HARDEN_SSH == y ]]; then - step "13. Отключение доступа root" + step "14. Отключение доступа root" # вход новым пользователем — по паролю, поэтому PasswordAuthentication включён явно cat >"$SSHD_HARDENING" <<'EOF' PermitRootLogin no @@ -439,7 +452,7 @@ EOF passwd -l root >/dev/null ok "Вход root по SSH запрещён, пароль root заблокирован" else - step "13. Отключение доступа root — пропущено" + step "14. Отключение доступа root — пропущено" fi # ---------- итог ---------- diff --git a/statuspage/index.html b/statuspage/index.html new file mode 100644 index 0000000..955ad40 --- /dev/null +++ b/statuspage/index.html @@ -0,0 +1 @@ +503
ERROR 503
SERVICE_UNAVAILABLE
Incident ID—
Status—
Servernginx/1.42.0
system.log