diff --git a/README.md b/README.md index 659e6aa..f71f0d8 100644 --- a/README.md +++ b/README.md @@ -252,6 +252,35 @@ shop.example.com { Порты **80/443** открыть; **5432** и **3000** наружу не публиковать. +### Ошибка `ECONNREFUSED 127.0.0.1:5432` + +Приложение обновилось на PostgreSQL, а сервер БД не запущен. + +**Быстрое исправление (одной командой):** + +```bash +cd /opt/shop +git pull +bash scripts/fix-db-connection.sh +``` + +**Вручную:** + +```bash +apt install -y postgresql-17 postgresql-client-17 +systemctl enable --now postgresql +pg_isready -h 127.0.0.1 -p 5432 + +cd /opt/shop +bash scripts/setup-postgres-ubuntu.sh +nano .env # DATABASE_URL=postgresql://shop:shop@127.0.0.1:5432/shop + +cp deploy/shop.service /etc/systemd/system/shop.service +systemctl daemon-reload +systemctl restart shop +curl -s http://127.0.0.1:3000/health +``` + ### HTTP 502 ```bash @@ -261,7 +290,8 @@ journalctl -u shop -n 50 --no-pager | Причина | Решение | |--------|---------| -| PostgreSQL не запущен | `systemctl start postgresql` | +| `ECONNREFUSED 127.0.0.1:5432` | PostgreSQL не запущен или не установлен — см. ниже | +| PostgreSQL не запущен | `systemctl enable --now postgresql` | | Неверный `DATABASE_URL` | проверить `.env`, `psql` | | Node не слушает 3000 | `journalctl -u shop -f` | | Caddy без backend | сначала `curl /health`, потом `reload caddy` | @@ -294,6 +324,7 @@ caddy/Caddyfile.example deploy/shop.service scripts/ setup-postgres-ubuntu.sh + fix-db-connection.sh diagnose-502.sh server-update.sh src/ diff --git a/deploy/shop.service b/deploy/shop.service index 6a85de9..a075f66 100644 --- a/deploy/shop.service +++ b/deploy/shop.service @@ -1,6 +1,7 @@ [Unit] Description=Shop Node.js -After=network.target +After=network.target postgresql.service +Wants=postgresql.service [Service] Type=simple @@ -8,12 +9,12 @@ User=www-data Group=www-data WorkingDirectory=/opt/shop EnvironmentFile=/opt/shop/.env -# Путь к node: which node (часто /usr/bin/node) +# Дождаться PostgreSQL (запуск от root, +) +ExecStartPre=+/bin/bash -c 'for i in $(seq 1 60); do pg_isready -h 127.0.0.1 -p 5432 -q && exit 0; sleep 1; done; echo "PostgreSQL не отвечает на 127.0.0.1:5432"; exit 1' ExecStart=/usr/bin/node src/server.js Restart=on-failure RestartSec=5 -# Права на запись в data/ и node_modules (если нужно) UMask=0022 [Install] diff --git a/scripts/fix-db-connection.sh b/scripts/fix-db-connection.sh new file mode 100644 index 0000000..c0c7587 --- /dev/null +++ b/scripts/fix-db-connection.sh @@ -0,0 +1,37 @@ +#!/bin/bash +# Быстрое исправление ECONNREFUSED 127.0.0.1:5432 +set -euo pipefail + +cd /opt/shop 2>/dev/null || cd "$(dirname "$0")/.." + +echo "=== Исправление подключения к PostgreSQL ===" + +if ! dpkg -l | grep -q postgresql; then + echo "Установка PostgreSQL 17..." + apt update + apt install -y postgresql-17 postgresql-client-17 || { + echo "Если пакет не найден — см. README (репозиторий PGDG)" + exit 1 + } +fi + +bash scripts/setup-postgres-ubuntu.sh + +if [ -f .env ] && ! grep -q '^DATABASE_URL=' .env; then + echo "DATABASE_URL=postgresql://shop:shop@127.0.0.1:5432/shop" >> .env + echo "Добавлен DATABASE_URL в .env" +fi + +cp -f deploy/shop.service /etc/systemd/system/shop.service +systemctl daemon-reload +systemctl restart shop +sleep 2 + +if curl -sf http://127.0.0.1:3000/health; then + echo "" + echo "OK — магазин работает" + systemctl reload caddy 2>/dev/null || true +else + echo "Ошибка — смотрите: journalctl -u shop -n 20 --no-pager" + exit 1 +fi diff --git a/scripts/setup-postgres-ubuntu.sh b/scripts/setup-postgres-ubuntu.sh index a8a3f26..ff56393 100644 --- a/scripts/setup-postgres-ubuntu.sh +++ b/scripts/setup-postgres-ubuntu.sh @@ -1,5 +1,5 @@ #!/bin/bash -# PostgreSQL 17 на Ubuntu — пользователь и БД для магазина +# PostgreSQL 17 на Ubuntu — установка службы, пользователь и БД shop # Запуск: sudo bash scripts/setup-postgres-ubuntu.sh set -euo pipefail @@ -8,11 +8,29 @@ DB_PASS="${DB_PASS:-shop}" DB_NAME="${DB_NAME:-shop}" if ! command -v psql >/dev/null; then - echo "Установите PostgreSQL 17:" + echo "PostgreSQL не установлен." echo " apt install -y postgresql-17 postgresql-client-17" + echo " systemctl enable --now postgresql" exit 1 fi +echo "Запуск PostgreSQL..." +systemctl enable postgresql 2>/dev/null || true +systemctl start postgresql + +for i in $(seq 1 30); do + if pg_isready -h 127.0.0.1 -p 5432 -q 2>/dev/null; then + break + fi + sleep 1 + if [ "$i" -eq 30 ]; then + echo "Ошибка: PostgreSQL не слушает 127.0.0.1:5432" + echo " journalctl -u postgresql -n 30 --no-pager" + exit 1 + fi +done + +echo "Создание пользователя и базы..." sudo -u postgres psql -v ON_ERROR_STOP=1 < { - console.error('Ошибка запуска:', err.message); + if (err.code === 'ECONNREFUSED' && String(err.message).includes('5432')) { + console.error('PostgreSQL недоступен на 127.0.0.1:5432'); + console.error(' systemctl start postgresql'); + console.error(' bash scripts/setup-postgres-ubuntu.sh'); + console.error(' Проверьте DATABASE_URL в .env'); + } else { + console.error('Ошибка запуска:', err.message); + } process.exit(1); });