From 33f4eabe8032b81671482d444eac2ca1c77fb609 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=D0=92=D0=B8=D0=BA=D1=82=D0=BE=D1=80?= Date: Mon, 25 May 2026 02:52:15 +0900 Subject: [PATCH] =?UTF-8?q?=D0=98=D1=81=D0=BF=D1=80=D0=B0=D0=B2=D0=BB?= =?UTF-8?q?=D0=B5=D0=BD=20nginx=20500=20=D0=B8=20=D0=B7=D0=B0=D0=BF=D1=83?= =?UTF-8?q?=D1=81=D0=BA=20=D1=81=D0=B5=D1=80=D0=B2=D0=B8=D1=81=D0=BE=D0=B2?= =?UTF-8?q?=20BotFactory=20v2.1.1?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- README.md | 16 +++++++ VERSION | 2 +- install.sh | 11 +++-- scripts/repair_server.sh | 94 ++++++++++++++++++++++++++++++++++++++++ 4 files changed, 118 insertions(+), 5 deletions(-) create mode 100644 scripts/repair_server.sh diff --git a/README.md b/README.md index f5deb48..952c5c1 100644 --- a/README.md +++ b/README.md @@ -16,6 +16,22 @@ SaaS-платформа для Telegram-магазинов: платформен - Добавлен индивидуальный постоплатный тариф: процент от выручки предыдущего месяца + день оплаты, назначается только администратором вручную. - Добавлены лёгкие миграции для новых полей биллинга. + +## Hotfix v2.1.1 + +- Исправлены права `/opt/botfactory`, из-за которых nginx мог отдавать `500 Internal Server Error` на главной странице. +- Добавлена проверка `frontend/dist/index.html` после сборки. +- Сервис `botfactory-bots` больше не привязан к успешному старту API, только к сети/PostgreSQL/Redis. +- Добавлен аварийный скрипт восстановления: `scripts/repair_server.sh`. + +### Быстрое восстановление на сервере + +```bash +cd /opt/botfactory-src +git pull origin main +bash scripts/repair_server.sh +``` + ## Чистая установка на Ubuntu 22.04 Под root: diff --git a/VERSION b/VERSION index 7ec1d6d..3e3c2f1 100644 --- a/VERSION +++ b/VERSION @@ -1 +1 @@ -2.1.0 +2.1.1 diff --git a/install.sh b/install.sh index 459ced6..45fbeb7 100644 --- a/install.sh +++ b/install.sh @@ -290,6 +290,7 @@ VITE_API_URL=/api FENV npm install --prefix "$FRONT_DIR" --silent --no-fund --no-audit npm run build --prefix "$FRONT_DIR" --silent +[[ -f "${FRONT_DIR}/dist/index.html" ]] || die "Frontend не собрался: нет ${FRONT_DIR}/dist/index.html" log "Frontend собран" step "Nginx" @@ -416,8 +417,8 @@ SERVICE cat > /etc/systemd/system/botfactory-bots.service << SERVICE [Unit] Description=BotFactory Bots Runner (platform + shops) -After=botfactory-api.service -Wants=botfactory-api.service +After=network-online.target postgresql.service redis-server.service +Wants=network-online.target postgresql.service redis-server.service [Service] Type=exec @@ -469,11 +470,13 @@ log "Fail2ban настроен" step "Права доступа" chown -R "$APP_USER:$APP_USER" "$APP_DIR" -chmod 750 "$APP_DIR" +chmod 755 "$APP_DIR" chmod 600 "$APP_DIR/.env" chmod -R 755 "${APP_DIR}/backend" "${APP_DIR}/frontend" +find "${FRONT_DIR}/dist" -type d -exec chmod 755 {} \; 2>/dev/null || true +find "${FRONT_DIR}/dist" -type f -exec chmod 644 {} \; 2>/dev/null || true chmod -R 770 "${APP_DIR}/logs" "${APP_DIR}/uploads" "${APP_DIR}/backups" -log "Права выставлены" +log "Права выставлены: nginx может читать frontend, .env закрыт" step "Logrotate" cat > /etc/logrotate.d/botfactory << LR diff --git a/scripts/repair_server.sh b/scripts/repair_server.sh new file mode 100644 index 0000000..881076d --- /dev/null +++ b/scripts/repair_server.sh @@ -0,0 +1,94 @@ +#!/usr/bin/env bash +# BotFactory v2.1.1 — emergency repair for nginx 500 + service diagnostics +set -euo pipefail + +APP_DIR="/opt/botfactory" +SRC_DIR="/opt/botfactory-src" +APP_USER="botfactory" +FRONT_DIR="${APP_DIR}/frontend" +API_PORT="8000" + +ok(){ echo -e "\033[0;32m[✓]\033[0m $*"; } +warn(){ echo -e "\033[1;33m[!]\033[0m $*"; } +err(){ echo -e "\033[0;31m[✗]\033[0m $*"; } + +[[ $EUID -eq 0 ]] || { err "Запустите от root: sudo bash scripts/repair_server.sh"; exit 1; } +[[ -d "$APP_DIR" ]] || { err "Нет ${APP_DIR}. Сначала установите BotFactory."; exit 1; } + +mkdir -p "${APP_DIR}/logs" "${APP_DIR}/uploads" "${APP_DIR}/backups" + +if id "$APP_USER" >/dev/null 2>&1; then + chown -R "${APP_USER}:${APP_USER}" "$APP_DIR" +else + warn "Пользователь ${APP_USER} не найден" +fi + +# Важно: nginx должен пройти по /opt/botfactory и читать frontend/dist. +chmod 755 /opt || true +chmod 755 "$APP_DIR" +chmod 755 "${APP_DIR}/frontend" 2>/dev/null || true +chmod 755 "${APP_DIR}/frontend/dist" 2>/dev/null || true +find "${APP_DIR}/frontend/dist" -type d -exec chmod 755 {} \; 2>/dev/null || true +find "${APP_DIR}/frontend/dist" -type f -exec chmod 644 {} \; 2>/dev/null || true +chmod 755 "${APP_DIR}/backend" 2>/dev/null || true +find "${APP_DIR}/backend" -type d -exec chmod 755 {} \; 2>/dev/null || true +find "${APP_DIR}/backend" -type f -name '*.py' -exec chmod 644 {} \; 2>/dev/null || true +chmod 770 "${APP_DIR}/logs" "${APP_DIR}/uploads" "${APP_DIR}/backups" 2>/dev/null || true +[[ -f "${APP_DIR}/.env" ]] && chmod 600 "${APP_DIR}/.env" +ok "Права исправлены" + +if [[ -d "$SRC_DIR" ]]; then + if [[ -d "$SRC_DIR/backend" ]]; then + rsync -a --delete "${SRC_DIR}/backend/" "${APP_DIR}/backend/" + ok "Backend синхронизирован из ${SRC_DIR}" + fi + if [[ -d "$SRC_DIR/frontend" ]]; then + rsync -a --delete "${SRC_DIR}/frontend/" "${APP_DIR}/frontend/" + ok "Frontend синхронизирован из ${SRC_DIR}" + fi +fi + +if [[ -f "${APP_DIR}/backend/requirements.txt" && -x "${APP_DIR}/venv/bin/pip" ]]; then + "${APP_DIR}/venv/bin/pip" install -q -r "${APP_DIR}/backend/requirements.txt" + ok "Python-зависимости проверены" +fi + +if [[ -f "${APP_DIR}/frontend/package.json" ]]; then + npm install --prefix "${APP_DIR}/frontend" --silent --no-fund --no-audit + npm run build --prefix "${APP_DIR}/frontend" --silent + [[ -f "${APP_DIR}/frontend/dist/index.html" ]] || { err "Frontend build failed: нет dist/index.html"; exit 1; } + find "${APP_DIR}/frontend/dist" -type d -exec chmod 755 {} \; + find "${APP_DIR}/frontend/dist" -type f -exec chmod 644 {} \; + ok "Frontend пересобран" +fi + +if [[ -f /etc/nginx/sites-available/botfactory ]]; then + nginx -t + systemctl reload nginx || systemctl restart nginx + ok "Nginx проверен и перезагружен" +else + warn "Конфиг /etc/nginx/sites-available/botfactory не найден" +fi + +systemctl daemon-reload +systemctl restart botfactory-api || true +sleep 2 +systemctl restart botfactory-bots || true +sleep 2 + +ok "Статусы сервисов:" +systemctl --no-pager --full status botfactory-api || true +systemctl --no-pager --full status botfactory-bots || true + +echo +ok "Проверка HTTP:" +curl -sS -i "http://127.0.0.1:${API_PORT}/api/health" || true +echo +curl -sS -I "http://127.0.0.1/" || true + +echo +warn "Если бот не стартует, сразу пришлите вывод команд:" +echo "journalctl -u botfactory-bots -n 120 --no-pager" +echo "journalctl -u botfactory-api -n 120 --no-pager" +echo "tail -n 120 ${APP_DIR}/logs/bots-error.log" +echo "tail -n 120 ${APP_DIR}/logs/api-error.log"