diff --git a/README.md b/README.md index 7ef4bba..659e6aa 100644 --- a/README.md +++ b/README.md @@ -31,15 +31,31 @@ docker compose up -d ```bash apt update apt install -y postgresql-17 postgresql-client-17 - -# Пользователь и база shop -cd /opt/shop -sudo bash scripts/setup-postgres-ubuntu.sh +systemctl enable postgresql +systemctl start postgresql ``` -Схема таблиц: `postgres/init/01_schema.sql` (применяется при старте приложения и при первом запуске Docker). +Если пакета `postgresql-17` нет в репозитории Ubuntu, подключите [PGDG](https://www.postgresql.org/download/linux/ubuntu/): -Сессии хранятся в PostgreSQL (таблица `session`, создаётся автоматически). +```bash +apt install -y curl ca-certificates +install -d /usr/share/postgresql-common/pgdg +curl -o /usr/share/postgresql-common/pgdg/apt.postgresql.org.asc --fail https://www.postgresql.org/media/keys/ACCC4CF8.asc +sh -c 'echo "deb [signed-by=/usr/share/postgresql-common/pgdg/apt.postgresql.org.asc] https://apt.postgresql.org/pub/repos/apt $(. /etc/os-release && echo ${VERSION_CODENAME}-pgdg) main" > /etc/apt/sources.list.d/pgdg.list' +apt update +apt install -y postgresql-17 postgresql-client-17 +``` + +Пользователь и база `shop`: + +```bash +cd /opt/shop +bash scripts/setup-postgres-ubuntu.sh +``` + +Схема: `postgres/init/01_schema.sql` (применяется при старте приложения). + +Сессии — таблица `session` в PostgreSQL (создаётся автоматически). --- @@ -105,10 +121,12 @@ DATABASE_URL=postgresql://shop:shop@127.0.0.1:5432/shop cp /opt/shop/deploy/shop.service /etc/systemd/system/shop.service cd /opt/shop -git config --global --add safe.directory /opt/shop +cp .env.example .env # при первой установке +# Заполните SESSION_SECRET и DATABASE_URL + npm install --omit=dev -# Код — root, служба — www-data (только чтение кода достаточно) +# Не делайте chown -R www-data на весь /opt/shop (ломает git pull) systemctl daemon-reload systemctl enable shop systemctl start shop @@ -130,10 +148,71 @@ journalctl -u shop -n 5 --no-pager # Магазин: http://127.0.0.1:3000 (PostgreSQL) ``` -Обновление: +--- + +## Обновление на сервере (git pull) ```bash -bash /opt/shop/scripts/server-update.sh +cd /opt/shop +git config --global --add safe.directory /opt/shop +bash scripts/server-update.sh +``` + +Скрипт: `git pull` → `npm install` → проверка PostgreSQL → `restart shop` → `curl /health` → `reload caddy`. + +Вручную: + +```bash +cd /opt/shop +git pull +npm install --omit=dev +systemctl restart shop +curl -s http://127.0.0.1:3000/health +systemctl reload caddy +``` + +--- + +## Переход с SQLite на PostgreSQL 17 + +Если сервер уже работал на старой версии (файлы `data/*.db`): + +```bash +# 1. PostgreSQL +apt install -y postgresql-17 postgresql-client-17 +systemctl start postgresql + +# 2. Код +cd /opt/shop +git config --global --add safe.directory /opt/shop +git pull + +# 3. База shop +bash scripts/setup-postgres-ubuntu.sh + +# 4. .env — обязательно DATABASE_URL +cp -n .env.example .env +nano .env +# DATABASE_URL=postgresql://shop:shop@127.0.0.1:5432/shop +# HOST=127.0.0.1 +# NODE_ENV=production +# TRUST_PROXY=1 + +# 5. Зависимости и перезапуск +npm install --omit=dev +systemctl restart shop + +# 6. Проверка +curl -s http://127.0.0.1:3000/health +systemctl reload caddy +``` + +Каталог `data/` больше не используется. Демо-товары появятся при пустой таблице `products`. Аккаунты и заказы из SQLite не переносятся — нужна повторная регистрация или ручной импорт. + +Проверка PostgreSQL: + +```bash +psql "postgresql://shop:shop@127.0.0.1:5432/shop" -c '\dt' ``` --- @@ -220,10 +299,6 @@ scripts/ src/ ``` -## Миграция с SQLite - -Старая версия хранила данные в `data/*.db`. После перехода на PostgreSQL выполните `git pull`, настройте `DATABASE_URL`, `npm install` — при первом запуске создастся схема и демо-каталог (если таблица `products` пуста). Пользователей и заказы из SQLite нужно переносить вручную или заново зарегистрироваться. - ## Репозиторий ```bash diff --git a/scripts/server-update.sh b/scripts/server-update.sh index d4bff0d..fe4e103 100644 --- a/scripts/server-update.sh +++ b/scripts/server-update.sh @@ -9,6 +9,18 @@ git pull npm install --omit=dev +if [ -f .env ] && ! grep -q '^DATABASE_URL=' .env; then + echo "ВНИМАНИЕ: добавьте DATABASE_URL в .env (см. .env.example)" + exit 1 +fi + +if command -v pg_isready >/dev/null; then + pg_isready -h 127.0.0.1 -p 5432 >/dev/null || { + echo "PostgreSQL не отвечает. Запустите: systemctl start postgresql" + exit 1 + } +fi + if systemctl is-active --quiet shop 2>/dev/null; then systemctl restart shop sleep 1