fix: диагностика 502, /health и unit systemd для Caddy

Co-authored-by: Cursor <cursoragent@cursor.com>
This commit is contained in:
shop
2026-05-16 21:08:02 +03:00
parent ccebf0d26d
commit c4891b428b
6 changed files with 157 additions and 20 deletions
+52 -19
View File
@@ -70,31 +70,24 @@ SESSION_SECRET=ваш-длинный-секрет
Чтобы магазин работал после перезагрузки сервера:
```bash
cat > /etc/systemd/system/shop.service << 'EOF'
[Unit]
Description=Shop Node.js
After=network.target
cp /opt/shop/deploy/shop.service /etc/systemd/system/shop.service
[Service]
Type=simple
User=www-data
WorkingDirectory=/opt/shop
EnvironmentFile=/opt/shop/.env
ExecStart=/usr/bin/node src/server.js
Restart=on-failure
RestartSec=5
# Зависимости и сборка (от root, до смены владельца)
cd /opt/shop
npm install --omit=dev
[Install]
WantedBy=multi-user.target
EOF
# Права на каталог (если клонировали в /opt/shop)
# Владелец — тот же пользователь, что в unit (www-data)
chown -R www-data:www-data /opt/shop
chmod +x /opt/shop/scripts/diagnose-502.sh
systemctl daemon-reload
systemctl enable shop
systemctl start shop
systemctl status shop
# Backend должен ответить:
curl -s http://127.0.0.1:3000/health
# {"ok":true,"service":"shop"}
```
Логи: `journalctl -u shop -f`
@@ -175,11 +168,47 @@ ufw enable
1. `shop` (Node.js на `127.0.0.1:3000`)
2. `caddy` (прокси + HTTPS)
### Типичные проблемы
### HTTP 502 при рабочем SSL
**SSL есть, 502 — значит Caddy жив, а Node на `127.0.0.1:3000` не отвечает.**
На сервере выполните:
```bash
bash /opt/shop/scripts/diagnose-502.sh
journalctl -u shop -n 50 --no-pager
curl -v http://127.0.0.1:3000/health
```
**Частые причины и исправление:**
| Причина | Что сделать |
|--------|-------------|
| Служба `shop` не запущена или падает | `systemctl restart shop`, смотрите логи `journalctl -u shop -f` |
| Нет `npm install` / сломан `better-sqlite3` | `cd /opt/shop && npm install --omit=dev` (нужны `build-essential`, `python3`) |
| Нет прав на `data/` у `www-data` | `mkdir -p /opt/shop/data && chown -R www-data:www-data /opt/shop` |
| В `.env` нет `HOST`/`PORT` | `HOST=127.0.0.1`, `PORT=3000`, затем `systemctl restart shop` |
| Неверный путь к `node` в systemd | `which node` → подставьте в `ExecStart` в `/etc/systemd/system/shop.service` |
| Caddy стартовал раньше shop | `cp deploy/caddy-after-shop.conf /etc/systemd/system/caddy.service.d/shop.conf` и `daemon-reload` |
**Быстрое восстановление:**
```bash
cd /opt/shop
git pull
npm install --omit=dev
chown -R www-data:www-data /opt/shop
systemctl restart shop
curl -s http://127.0.0.1:3000/health # должен быть {"ok":true,...}
systemctl reload caddy
```
Пока `curl http://127.0.0.1:3000/health` не возвращает OK — HTTPS через Caddy будет отдавать 502.
### Другие проблемы
| Симптом | Решение |
|--------|---------|
| 502 Bad Gateway | `systemctl status shop`, проверьте `curl http://127.0.0.1:3000` |
| Нет сертификата | DNS, порты 80/443, верный домен в `Caddyfile` |
| Редирект-цикл / нет cookies | В `.env`: `TRUST_PROXY=1`, `NODE_ENV=production` |
@@ -244,6 +273,10 @@ cp -a data/shop.db data/shop.db.bak
```
caddy/
Caddyfile.example — пример reverse proxy + SSL
deploy/
shop.service — unit для systemd
scripts/
diagnose-502.sh — проверка при 502
src/
server.js — точка входа
db.js — схема SQLite