fix: ожидание PostgreSQL при старте, скрипт fix-db-connection
Co-authored-by: Cursor <cursoragent@cursor.com>
This commit is contained in:
@@ -252,6 +252,35 @@ shop.example.com {
|
|||||||
|
|
||||||
Порты **80/443** открыть; **5432** и **3000** наружу не публиковать.
|
Порты **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
|
### HTTP 502
|
||||||
|
|
||||||
```bash
|
```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` |
|
| Неверный `DATABASE_URL` | проверить `.env`, `psql` |
|
||||||
| Node не слушает 3000 | `journalctl -u shop -f` |
|
| Node не слушает 3000 | `journalctl -u shop -f` |
|
||||||
| Caddy без backend | сначала `curl /health`, потом `reload caddy` |
|
| Caddy без backend | сначала `curl /health`, потом `reload caddy` |
|
||||||
@@ -294,6 +324,7 @@ caddy/Caddyfile.example
|
|||||||
deploy/shop.service
|
deploy/shop.service
|
||||||
scripts/
|
scripts/
|
||||||
setup-postgres-ubuntu.sh
|
setup-postgres-ubuntu.sh
|
||||||
|
fix-db-connection.sh
|
||||||
diagnose-502.sh
|
diagnose-502.sh
|
||||||
server-update.sh
|
server-update.sh
|
||||||
src/
|
src/
|
||||||
|
|||||||
+4
-3
@@ -1,6 +1,7 @@
|
|||||||
[Unit]
|
[Unit]
|
||||||
Description=Shop Node.js
|
Description=Shop Node.js
|
||||||
After=network.target
|
After=network.target postgresql.service
|
||||||
|
Wants=postgresql.service
|
||||||
|
|
||||||
[Service]
|
[Service]
|
||||||
Type=simple
|
Type=simple
|
||||||
@@ -8,12 +9,12 @@ User=www-data
|
|||||||
Group=www-data
|
Group=www-data
|
||||||
WorkingDirectory=/opt/shop
|
WorkingDirectory=/opt/shop
|
||||||
EnvironmentFile=/opt/shop/.env
|
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
|
ExecStart=/usr/bin/node src/server.js
|
||||||
Restart=on-failure
|
Restart=on-failure
|
||||||
RestartSec=5
|
RestartSec=5
|
||||||
|
|
||||||
# Права на запись в data/ и node_modules (если нужно)
|
|
||||||
UMask=0022
|
UMask=0022
|
||||||
|
|
||||||
[Install]
|
[Install]
|
||||||
|
|||||||
@@ -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
|
||||||
@@ -1,5 +1,5 @@
|
|||||||
#!/bin/bash
|
#!/bin/bash
|
||||||
# PostgreSQL 17 на Ubuntu — пользователь и БД для магазина
|
# PostgreSQL 17 на Ubuntu — установка службы, пользователь и БД shop
|
||||||
# Запуск: sudo bash scripts/setup-postgres-ubuntu.sh
|
# Запуск: sudo bash scripts/setup-postgres-ubuntu.sh
|
||||||
set -euo pipefail
|
set -euo pipefail
|
||||||
|
|
||||||
@@ -8,11 +8,29 @@ DB_PASS="${DB_PASS:-shop}"
|
|||||||
DB_NAME="${DB_NAME:-shop}"
|
DB_NAME="${DB_NAME:-shop}"
|
||||||
|
|
||||||
if ! command -v psql >/dev/null; then
|
if ! command -v psql >/dev/null; then
|
||||||
echo "Установите PostgreSQL 17:"
|
echo "PostgreSQL не установлен."
|
||||||
echo " apt install -y postgresql-17 postgresql-client-17"
|
echo " apt install -y postgresql-17 postgresql-client-17"
|
||||||
|
echo " systemctl enable --now postgresql"
|
||||||
exit 1
|
exit 1
|
||||||
fi
|
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 <<EOF
|
sudo -u postgres psql -v ON_ERROR_STOP=1 <<EOF
|
||||||
DO \$\$
|
DO \$\$
|
||||||
BEGIN
|
BEGIN
|
||||||
@@ -24,9 +42,17 @@ END
|
|||||||
|
|
||||||
SELECT 'CREATE DATABASE ${DB_NAME} OWNER ${DB_USER}'
|
SELECT 'CREATE DATABASE ${DB_NAME} OWNER ${DB_USER}'
|
||||||
WHERE NOT EXISTS (SELECT FROM pg_database WHERE datname = '${DB_NAME}')\gexec
|
WHERE NOT EXISTS (SELECT FROM pg_database WHERE datname = '${DB_NAME}')\gexec
|
||||||
|
EOF
|
||||||
|
|
||||||
GRANT ALL PRIVILEGES ON DATABASE ${DB_NAME} TO ${DB_USER};
|
sudo -u postgres psql -v ON_ERROR_STOP=1 -d "${DB_NAME}" <<EOF
|
||||||
|
GRANT ALL ON SCHEMA public TO ${DB_USER};
|
||||||
|
ALTER DEFAULT PRIVILEGES IN SCHEMA public GRANT ALL ON TABLES TO ${DB_USER};
|
||||||
|
ALTER DEFAULT PRIVILEGES IN SCHEMA public GRANT ALL ON SEQUENCES TO ${DB_USER};
|
||||||
EOF
|
EOF
|
||||||
|
|
||||||
echo ""
|
echo ""
|
||||||
|
echo "PostgreSQL готов."
|
||||||
|
echo "Добавьте в /opt/shop/.env:"
|
||||||
echo "DATABASE_URL=postgresql://${DB_USER}:${DB_PASS}@127.0.0.1:5432/${DB_NAME}"
|
echo "DATABASE_URL=postgresql://${DB_USER}:${DB_PASS}@127.0.0.1:5432/${DB_NAME}"
|
||||||
|
echo ""
|
||||||
|
echo "Проверка: psql \"postgresql://${DB_USER}:${DB_PASS}@127.0.0.1:5432/${DB_NAME}\" -c 'SELECT 1'"
|
||||||
|
|||||||
@@ -83,6 +83,13 @@ async function start() {
|
|||||||
}
|
}
|
||||||
|
|
||||||
start().catch((err) => {
|
start().catch((err) => {
|
||||||
|
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);
|
console.error('Ошибка запуска:', err.message);
|
||||||
|
}
|
||||||
process.exit(1);
|
process.exit(1);
|
||||||
});
|
});
|
||||||
|
|||||||
Reference in New Issue
Block a user