Исправлен nginx 500 и запуск сервисов BotFactory v2.1.1
Этот коммит содержится в:
@@ -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
|
## Чистая установка на Ubuntu 22.04
|
||||||
|
|
||||||
Под root:
|
Под root:
|
||||||
|
|||||||
+1
-1
@@ -1 +1 @@
|
|||||||
2.1.0
|
2.1.1
|
||||||
|
|||||||
+7
-4
@@ -290,6 +290,7 @@ VITE_API_URL=/api
|
|||||||
FENV
|
FENV
|
||||||
npm install --prefix "$FRONT_DIR" --silent --no-fund --no-audit
|
npm install --prefix "$FRONT_DIR" --silent --no-fund --no-audit
|
||||||
npm run build --prefix "$FRONT_DIR" --silent
|
npm run build --prefix "$FRONT_DIR" --silent
|
||||||
|
[[ -f "${FRONT_DIR}/dist/index.html" ]] || die "Frontend не собрался: нет ${FRONT_DIR}/dist/index.html"
|
||||||
log "Frontend собран"
|
log "Frontend собран"
|
||||||
|
|
||||||
step "Nginx"
|
step "Nginx"
|
||||||
@@ -416,8 +417,8 @@ SERVICE
|
|||||||
cat > /etc/systemd/system/botfactory-bots.service << SERVICE
|
cat > /etc/systemd/system/botfactory-bots.service << SERVICE
|
||||||
[Unit]
|
[Unit]
|
||||||
Description=BotFactory Bots Runner (platform + shops)
|
Description=BotFactory Bots Runner (platform + shops)
|
||||||
After=botfactory-api.service
|
After=network-online.target postgresql.service redis-server.service
|
||||||
Wants=botfactory-api.service
|
Wants=network-online.target postgresql.service redis-server.service
|
||||||
|
|
||||||
[Service]
|
[Service]
|
||||||
Type=exec
|
Type=exec
|
||||||
@@ -469,11 +470,13 @@ log "Fail2ban настроен"
|
|||||||
|
|
||||||
step "Права доступа"
|
step "Права доступа"
|
||||||
chown -R "$APP_USER:$APP_USER" "$APP_DIR"
|
chown -R "$APP_USER:$APP_USER" "$APP_DIR"
|
||||||
chmod 750 "$APP_DIR"
|
chmod 755 "$APP_DIR"
|
||||||
chmod 600 "$APP_DIR/.env"
|
chmod 600 "$APP_DIR/.env"
|
||||||
chmod -R 755 "${APP_DIR}/backend" "${APP_DIR}/frontend"
|
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"
|
chmod -R 770 "${APP_DIR}/logs" "${APP_DIR}/uploads" "${APP_DIR}/backups"
|
||||||
log "Права выставлены"
|
log "Права выставлены: nginx может читать frontend, .env закрыт"
|
||||||
|
|
||||||
step "Logrotate"
|
step "Logrotate"
|
||||||
cat > /etc/logrotate.d/botfactory << LR
|
cat > /etc/logrotate.d/botfactory << LR
|
||||||
|
|||||||
@@ -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"
|
||||||
Ссылка в новой задаче
Block a user