diff --git a/README.md b/README.md index 3b366a4..f84f827 100644 --- a/README.md +++ b/README.md @@ -100,7 +100,7 @@ apt install -y postgresql-17 postgresql-client-17 Пользователь и база `shop`: ```bash -cd /opt/shop +cd /opt/shop/shop10 bash scripts/setup-postgres-ubuntu.sh ``` @@ -112,32 +112,33 @@ bash scripts/setup-postgres-ubuntu.sh ## Быстрый развёртывание на Ubuntu +**Одной командой** (клон в `/opt/shop/shop10`, PostgreSQL через PGDG, systemd): + ```bash -# 1. Система + Node.js 20 -apt update -apt install -y git curl -curl -fsSL https://deb.nodesource.com/setup_20.x | bash - -apt install -y nodejs +apt update && apt install -y git curl +git clone https://git.evilfox.cc/test/shop10.git /opt/shop/shop10 +cd /opt/shop/shop10 +sudo bash scripts/quick-deploy-ubuntu.sh +``` -# 2. PostgreSQL 17 -apt install -y postgresql-17 postgresql-client-17 +**Уже установлен магазин — только обновить код:** -# 3. Код -cd /opt -git clone shop -cd shop +```bash +bash /opt/shop/shop10/scripts/server-update.sh +``` -# 4. БД +Не выполняйте `cd /opt/shop`, если репозиторий в `/opt/shop/shop10` — там нет `package.json`. + +Ручная установка: + +```bash +cd /opt/shop/shop10 +sudo bash scripts/install-postgresql-ubuntu.sh # PGDG, не apt install postgresql-17 напрямую bash scripts/setup-postgres-ubuntu.sh - -# 5. Окружение cp .env.example .env -sed -i "s/change-me-to-a-long-random-string/$(openssl rand -hex 32)/" .env -# Проверьте DATABASE_URL в .env - -# 6. Приложение +# SESSION_SECRET, DATABASE_URL, SITE_URL npm install --omit=dev -npm start +systemctl restart shop ``` Проверка: @@ -169,9 +170,9 @@ DATABASE_URL=postgresql://shop:shop@127.0.0.1:5432/shop ## Запуск как служба (systemd) ```bash -cp /opt/shop/deploy/shop.service /etc/systemd/system/shop.service +cp /opt/shop/shop10/deploy/shop.service /etc/systemd/system/shop.service -cd /opt/shop +cd /opt/shop/shop10 cp .env.example .env # при первой установке # Заполните SESSION_SECRET и DATABASE_URL @@ -184,7 +185,7 @@ systemctl start shop journalctl -u shop -f ``` -`EnvironmentFile=/opt/shop/.env` должен содержать `DATABASE_URL`. +`EnvironmentFile=/opt/shop/shop10/.env` должен содержать `DATABASE_URL`. --- @@ -276,19 +277,17 @@ shop.example.com { **Быстрое исправление (одной командой):** ```bash -cd /opt/shop -git pull -bash scripts/fix-db-connection.sh +bash /opt/shop/shop10/scripts/fix-db-connection.sh ``` **Вручную:** ```bash -apt install -y postgresql-17 postgresql-client-17 +cd /opt/shop/shop10 +sudo bash scripts/install-postgresql-ubuntu.sh 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 @@ -301,7 +300,7 @@ curl -s http://127.0.0.1:3000/health ### HTTP 502 ```bash -bash /opt/shop/scripts/diagnose-502.sh +bash /opt/shop/shop10/scripts/diagnose-502.sh journalctl -u shop -n 50 --no-pager ``` @@ -344,6 +343,8 @@ caddy/Caddyfile.docker.example deploy/shop.service scripts/ setup-postgres-ubuntu.sh + install-postgresql-ubuntu.sh + quick-deploy-ubuntu.sh fix-db-connection.sh diagnose-502.sh server-update.sh @@ -353,8 +354,8 @@ src/ ## Релиз 0.20.0 ```bash -git clone shop -cd shop +git clone https://git.evilfox.cc/test/shop10.git /opt/shop/shop10 +cd /opt/shop/shop10 git checkout v0.20.0 ``` @@ -366,6 +367,6 @@ git checkout v0.20.0 ## Репозиторий ```bash -git clone shop -cd shop +git clone https://git.evilfox.cc/test/shop10.git /opt/shop/shop10 +cd /opt/shop/shop10 ``` diff --git a/docs/RELEASE-0.10.md b/docs/RELEASE-0.10.md index 30b9b28..ccaac32 100644 --- a/docs/RELEASE-0.10.md +++ b/docs/RELEASE-0.10.md @@ -5,7 +5,7 @@ ## Вариант A — Docker Compose ```bash -git clone shop && cd shop +git clone https://git.evilfox.cc/test/shop10.git /opt/shop/shop10 && cd /opt/shop/shop10 git checkout v0.10.0 cp .env.docker.example .env @@ -27,7 +27,7 @@ docker compose --profile proxy up -d --build ## Вариант B — без Docker (Ubuntu) ```bash -git clone shop && cd shop +git clone https://git.evilfox.cc/test/shop10.git /opt/shop/shop10 && cd /opt/shop/shop10 git checkout v0.10.0 apt install -y git curl diff --git a/scripts/fix-db-connection.sh b/scripts/fix-db-connection.sh index 1723719..e629a85 100644 --- a/scripts/fix-db-connection.sh +++ b/scripts/fix-db-connection.sh @@ -2,29 +2,30 @@ # Быстрое исправление ECONNREFUSED 127.0.0.1:5432 set -euo pipefail -source "$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)/shop-root.sh" +SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)" +source "$SCRIPT_DIR/shop-root.sh" -echo "=== Исправление подключения к PostgreSQL ===" +echo "=== Исправление подключения к PostgreSQL ($SHOP_ROOT) ===" -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 - } +if ! command -v psql >/dev/null; then + bash "$SCRIPT_DIR/install-postgresql-ubuntu.sh" fi -bash scripts/setup-postgres-ubuntu.sh +bash "$SCRIPT_DIR/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=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 +if [ -f deploy/shop.service ]; then + cp -f deploy/shop.service /etc/systemd/system/shop.service + sed -i "s|WorkingDirectory=.*|WorkingDirectory=${SHOP_ROOT}|" /etc/systemd/system/shop.service + sed -i "s|EnvironmentFile=.*|EnvironmentFile=${SHOP_ROOT}/.env|" /etc/systemd/system/shop.service + systemctl daemon-reload +fi + +systemctl restart shop 2>/dev/null || true sleep 2 if curl -sf http://127.0.0.1:3000/health; then diff --git a/scripts/install-postgresql-ubuntu.sh b/scripts/install-postgresql-ubuntu.sh new file mode 100644 index 0000000..4508ce9 --- /dev/null +++ b/scripts/install-postgresql-ubuntu.sh @@ -0,0 +1,59 @@ +#!/bin/bash +# Установка PostgreSQL 17 (PGDG) или postgresql из Ubuntu +# sudo bash scripts/install-postgresql-ubuntu.sh +set -euo pipefail + +if command -v psql >/dev/null; then + echo "PostgreSQL уже установлен: $(psql --version | head -1)" + systemctl enable postgresql 2>/dev/null || true + systemctl start postgresql 2>/dev/null || true + exit 0 +fi + +echo "=== Установка PostgreSQL ===" +apt update +apt install -y curl ca-certificates gnupg lsb-release + +if [ ! -f /etc/os-release ]; then + echo "Ошибка: не найден /etc/os-release" + exit 1 +fi +# shellcheck source=/dev/null +. /etc/os-release +CODENAME="${VERSION_CODENAME:-}" +if [ -z "$CODENAME" ]; then + echo "Ошибка: не удалось определить VERSION_CODENAME (Ubuntu/Debian?)" + exit 1 +fi + +install -d /usr/share/postgresql-common/pgdg +curl -fsSL https://www.postgresql.org/media/keys/ACCC4CF8.asc \ + -o /usr/share/postgresql-common/pgdg/apt.postgresql.org.asc + +echo "deb [signed-by=/usr/share/postgresql-common/pgdg/apt.postgresql.org.asc] https://apt.postgresql.org/pub/repos/apt ${CODENAME}-pgdg main" \ + > /etc/apt/sources.list.d/pgdg.list + +apt update + +if apt install -y postgresql-17 postgresql-client-17; then + echo "Установлен PostgreSQL 17 (PGDG)" +else + echo "Пакет postgresql-17 недоступен — устанавливаем postgresql из репозитория Ubuntu..." + apt install -y postgresql postgresql-contrib +fi + +systemctl enable postgresql +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 + echo "pg_isready: OK" + psql --version | head -1 + exit 0 + fi + sleep 1 +done + +echo "PostgreSQL установлен, но не отвечает на 127.0.0.1:5432" +echo " journalctl -u postgresql -n 30 --no-pager" +exit 1 diff --git a/scripts/quick-deploy-ubuntu.sh b/scripts/quick-deploy-ubuntu.sh new file mode 100644 index 0000000..ee3c59e --- /dev/null +++ b/scripts/quick-deploy-ubuntu.sh @@ -0,0 +1,73 @@ +#!/bin/bash +# Быстрое развёртывание / обновление на Ubuntu (без Docker) +# sudo bash scripts/quick-deploy-ubuntu.sh +# +# Каталог по умолчанию: /opt/shop/shop10 +# Переопределение: SHOP_INSTALL_DIR=/opt/shop/shop10 SHOP_GIT_URL=https://... +set -euo pipefail + +INSTALL_DIR="${SHOP_INSTALL_DIR:-/opt/shop/shop10}" +GIT_URL="${SHOP_GIT_URL:-https://git.evilfox.cc/test/shop10.git}" + +if [ "$(id -u)" -ne 0 ]; then + echo "Запустите от root: sudo bash scripts/quick-deploy-ubuntu.sh" + exit 1 +fi + +echo "=== Shop: быстрое развёртывание ===" +echo "Каталог: $INSTALL_DIR" + +if ! command -v node >/dev/null; then + echo "Установка Node.js 20..." + apt update + apt install -y git curl ca-certificates + curl -fsSL https://deb.nodesource.com/setup_20.x | bash - + apt install -y nodejs +fi + +if [ ! -f "$INSTALL_DIR/package.json" ]; then + echo "Клонирование репозитория..." + mkdir -p "$(dirname "$INSTALL_DIR")" + git clone "$GIT_URL" "$INSTALL_DIR" +fi + +export SHOP_ROOT="$INSTALL_DIR" +cd "$INSTALL_DIR" +git config --global --add safe.directory "$INSTALL_DIR" 2>/dev/null || true +git pull + +bash scripts/install-postgresql-ubuntu.sh +bash scripts/setup-postgres-ubuntu.sh + +if [ ! -f .env ]; then + cp .env.example .env + if command -v openssl >/dev/null; then + SECRET=$(openssl rand -hex 32) + sed -i "s/change-me-to-a-long-random-string/${SECRET}/" .env + fi + if ! grep -q '^DATABASE_URL=' .env; then + echo 'DATABASE_URL=postgresql://shop:shop@127.0.0.1:5432/shop' >> .env + fi + echo "Создан .env — проверьте SITE_URL и SMTP" +fi + +npm install --omit=dev + +if [ -f deploy/shop.service ]; then + cp -f deploy/shop.service /etc/systemd/system/shop.service + # Подставить фактический путь в unit + sed -i "s|WorkingDirectory=.*|WorkingDirectory=${INSTALL_DIR}|" /etc/systemd/system/shop.service + sed -i "s|EnvironmentFile=.*|EnvironmentFile=${INSTALL_DIR}/.env|" /etc/systemd/system/shop.service + systemctl daemon-reload + systemctl enable shop 2>/dev/null || true + systemctl restart shop + sleep 2 + curl -sf http://127.0.0.1:3000/health && echo && echo "OK — shop запущен (systemd)" + systemctl reload caddy 2>/dev/null || true +else + echo "deploy/shop.service не найден — запустите: npm start" +fi + +echo "" +echo "Обновления в будущем:" +echo " bash ${INSTALL_DIR}/scripts/server-update.sh" diff --git a/scripts/setup-postgres-ubuntu.sh b/scripts/setup-postgres-ubuntu.sh index ff56393..a9ec8ab 100644 --- a/scripts/setup-postgres-ubuntu.sh +++ b/scripts/setup-postgres-ubuntu.sh @@ -1,16 +1,18 @@ #!/bin/bash -# PostgreSQL 17 на Ubuntu — установка службы, пользователь и БД shop -# Запуск: sudo bash scripts/setup-postgres-ubuntu.sh +# PostgreSQL — пользователь и БД shop (после install-postgresql-ubuntu.sh) +# sudo bash scripts/setup-postgres-ubuntu.sh set -euo pipefail +SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)" +SHOP_ROOT="${SHOP_ROOT:-$(cd "$SCRIPT_DIR/.." && pwd)}" + DB_USER="${DB_USER:-shop}" DB_PASS="${DB_PASS:-shop}" DB_NAME="${DB_NAME:-shop}" if ! command -v psql >/dev/null; then - echo "PostgreSQL не установлен." - echo " apt install -y postgresql-17 postgresql-client-17" - echo " systemctl enable --now postgresql" + echo "PostgreSQL не установлен. Запустите:" + echo " sudo bash $SCRIPT_DIR/install-postgresql-ubuntu.sh" exit 1 fi @@ -52,7 +54,7 @@ EOF echo "" echo "PostgreSQL готов." -echo "Добавьте в /opt/shop/.env:" +echo "Добавьте в ${SHOP_ROOT}/.env:" 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'" diff --git a/wiki/Home.md b/wiki/Home.md index cfaa658..424caeb 100644 --- a/wiki/Home.md +++ b/wiki/Home.md @@ -1,4 +1,4 @@ -# Shop — документация v0.10.0 +# Shop — документация v0.20.0 Интернет-магазин на **Node.js** и **PostgreSQL 17**. @@ -30,9 +30,15 @@ cp .env.docker.example .env && docker compose up -d --build ### Без Docker ```bash -git clone https://git.evilfox.cc/test/shop10.git && cd shop10 -git checkout v0.10.0 -# см. Install-Native +git clone https://git.evilfox.cc/test/shop10.git /opt/shop/shop10 +cd /opt/shop/shop10 +sudo bash scripts/quick-deploy-ubuntu.sh +``` + +Обновление на работающем сервере: + +```bash +bash /opt/shop/shop10/scripts/server-update.sh ``` ## Проверка работы diff --git a/wiki/Install-Native.md b/wiki/Install-Native.md index 2053e64..542ff25 100644 --- a/wiki/Install-Native.md +++ b/wiki/Install-Native.md @@ -26,38 +26,26 @@ node -v # v20.x ### PostgreSQL 17 -```bash -apt install -y postgresql-17 postgresql-client-17 -systemctl enable postgresql -systemctl start postgresql -pg_isready -h 127.0.0.1 -p 5432 -``` - -Если пакет `postgresql-17` не найден — [репозиторий PGDG](https://www.postgresql.org/download/linux/ubuntu/): +Не используйте `apt install postgresql-17` без PGDG — пакет не найдётся. Скрипт подключает PGDG автоматически: ```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 +sudo bash /opt/shop/shop10/scripts/install-postgresql-ubuntu.sh ``` ## 3. Клонирование проекта ```bash -cd /opt -git clone https://git.evilfox.cc/test/shop10.git shop -cd shop -git checkout v0.10.0 +git clone https://git.evilfox.cc/test/shop10.git /opt/shop/shop10 +cd /opt/shop/shop10/shop10 +git checkout v0.20.0 ``` +Или быстрая установка всего стека: `sudo bash scripts/quick-deploy-ubuntu.sh` + ## 4. База данных PostgreSQL ```bash -cd /opt/shop +cd /opt/shop/shop10/shop10 bash scripts/setup-postgres-ubuntu.sh ``` @@ -101,7 +89,7 @@ openssl rand -hex 32 ## 6. Установка зависимостей Node.js ```bash -cd /opt/shop +cd /opt/shop/shop10 npm install --omit=dev ``` @@ -110,7 +98,7 @@ npm install --omit=dev ## 7. Служба systemd ```bash -cp /opt/shop/deploy/shop.service /etc/systemd/system/shop.service +cp /opt/shop/shop10/deploy/shop.service /etc/systemd/system/shop.service systemctl daemon-reload systemctl enable shop systemctl start shop @@ -152,7 +140,7 @@ apt update && apt install -y caddy Конфигурация: ```bash -cp /opt/shop/caddy/Caddyfile.example /etc/caddy/Caddyfile +cp /opt/shop/shop10/caddy/Caddyfile.example /etc/caddy/Caddyfile nano /etc/caddy/Caddyfile ``` @@ -195,7 +183,7 @@ systemctl daemon-reload ## 10. Обновление ```bash -cd /opt/shop/shop10 +cd /opt/shop/shop10/shop10 git config --global --add safe.directory "$(pwd)" bash scripts/server-update.sh ``` diff --git a/wiki/Troubleshooting.md b/wiki/Troubleshooting.md index 2e66059..8437a8c 100644 --- a/wiki/Troubleshooting.md +++ b/wiki/Troubleshooting.md @@ -8,6 +8,28 @@ bash /opt/shop/shop10/scripts/diagnose-502.sh (замените путь на каталог вашего клона — где есть `package.json`) +## Ошибки при «быстром развёртывании» + +| Ошибка | Причина | Решение | +|--------|---------|---------| +| `Unable to locate package postgresql-17` | В Ubuntu нет PG 17 без PGDG | `sudo bash /opt/shop/shop10/scripts/install-postgresql-ubuntu.sh` | +| `URL_РЕПОЗИТОРИЯ: No such file` | Скопирован placeholder из README | Используйте реальный URL: `git clone https://git.evilfox.cc/test/shop10.git /opt/shop/shop10` | +| `package.json` в `/opt/shop` | Неверный каталог | Репозиторий в `/opt/shop/shop10` | +| Изменения не применились | `git pull` не в том каталоге | `bash /opt/shop/shop10/scripts/server-update.sh` | + +Полное развёртывание / обновление: + +```bash +cd /opt/shop/shop10 && git pull +sudo bash scripts/quick-deploy-ubuntu.sh +``` + +Только обновление кода (сайт уже работает): + +```bash +bash /opt/shop/shop10/scripts/server-update.sh +``` + ## scripts/server-update.sh: No such file or directory Вы не в каталоге репозитория или клон в подпапке (например `/opt/shop/shop10`): @@ -40,7 +62,7 @@ journalctl -u shop -n 30 --no-pager PostgreSQL не запущен или не установлен. ```bash -bash /opt/shop/scripts/fix-db-connection.sh +bash /opt/shop/shop10/scripts/fix-db-connection.sh ``` Или вручную: @@ -51,7 +73,7 @@ pg_isready -h 127.0.0.1 -p 5432 bash scripts/setup-postgres-ubuntu.sh ``` -Проверьте `DATABASE_URL` в `/opt/shop/.env`. +Проверьте `DATABASE_URL` в `/opt/shop/shop10/.env`. --- @@ -60,7 +82,7 @@ bash scripts/setup-postgres-ubuntu.sh В логе только «База уже содержит товары» без строки `Магазин: http://...`: ```bash -cd /opt/shop && git pull # нужен исправленный seed.js (v0.10.0+) +bash /opt/shop/shop10/scripts/server-update.sh systemctl restart shop ```