# Сервер: установка и обновление Инструкция **без привязки к конкретному домену или хостингу**. Подставьте свои значения: | Переменная | Что это | Пример | |------------|---------|--------| | `SHOP_ROOT` | Каталог клона, где лежат `package.json` и `scripts/` | `/opt/shop` | | `GIT_REPO_URL` | URL вашего git-репозитория | `https://forge.example.com/user/shop.git` | | `SITE_URL` | Публичный URL магазина (для писем и passkey) | `https://shop.example.com` | Проверка каталога: ```bash export SHOP_ROOT=/opt/shop test -f "$SHOP_ROOT/package.json" && echo OK || echo "Неверный SHOP_ROOT" ``` --- ## Первая установка (Ubuntu, без Docker) ```bash export SHOP_ROOT=/opt/shop export GIT_REPO_URL='https://ВАШ-FORGE/путь/к/shop.git' apt update && apt install -y git curl git clone "$GIT_REPO_URL" "$SHOP_ROOT" cd "$SHOP_ROOT" sudo SHOP_INSTALL_DIR="$SHOP_ROOT" SHOP_GIT_URL="$GIT_REPO_URL" \ bash scripts/quick-deploy-ubuntu.sh ``` Скрипт: Node.js (если нет), PostgreSQL (PGDG), `.env`, `npm install`, служба **shop** (systemd). --- ## Обновление кода (сайт уже работает) **Рекомендуется** — две команды (можно из любого каталога, не нужен `cd`): ```bash export SHOP_ROOT=/opt/shop/shop10 bash "$SHOP_ROOT/scripts/server-update.sh" ``` Подставьте свой путь к клону (где лежит `package.json`). Часто это `/opt/shop` или `/opt/shop/shop10`. Почему так надёжнее, чем `cd /opt/shop && git pull`: - явно задан каталог репозитория (`SHOP_ROOT`); - внутри выполняются `git-sync` (ветка `main`), `npm install`, перезапуск `shop`, проверка `/health`; - не перепутаете родительскую папку без `package.json` и скриптов. Проверка после обновления: ```bash systemctl status shop curl -s http://127.0.0.1:3000/health ``` Если git в detached HEAD отдельно: ```bash cd "$SHOP_ROOT" bash scripts/git-sync.sh bash scripts/server-update.sh ``` --- ## Скрипты в `scripts/` | Скрипт | Назначение | |--------|------------| | `quick-deploy-ubuntu.sh` | Первая установка / полный цикл | | `server-update.sh` | `git pull`, `npm install`, перезапуск shop | | `git-sync.sh` | Исправить detached HEAD, синхронизация с `main` | | `install-postgresql-ubuntu.sh` | PostgreSQL 17 через PGDG | | `setup-postgres-ubuntu.sh` | Пользователь и БД `shop` | | `install-shop-service.sh` | Установка systemd unit | | `free-port-3000.sh` | Освободить порт (старый `npm start`) | | `fix-db-connection.sh` | ECONNREFUSED :5432 | | `diagnose-502.sh` | HTTP 502, Caddy | | `diagnose-shop-service.sh` | Падение shop.service | Все скрипты сами ищут `SHOP_ROOT` (каталог, откуда вызван `scripts/`, или переменная окружения). --- ## Частые ошибки ### `Unable to locate package postgresql-17` В стандартном Ubuntu нет пакета 17. Не копируйте `apt install postgresql-17` из старых заметок. ```bash sudo bash "$SHOP_ROOT/scripts/install-postgresql-ubuntu.sh" bash "$SHOP_ROOT/scripts/setup-postgres-ubuntu.sh" ``` ### `URL_РЕПОЗИТОРИЯ: No such file` или placeholder в команде В документации иногда указан **шаблон**, а не команда. Клонируйте так: ```bash git clone 'https://ВАШ-FORGE/shop.git' "$SHOP_ROOT" ``` ### `package.json` ENOENT в `/opt/shop` Вы в **родительской** папке, а клон в подкаталоге (или наоборот). ```bash find /opt -name package.json 2>/dev/null export SHOP_ROOT=/путь/где/найден cd "$SHOP_ROOT" ``` ### `You are not currently on a branch` После `git checkout v0.x.x` репозиторий в detached HEAD. ```bash cd "$SHOP_ROOT" bash scripts/git-sync.sh ``` ### `scripts/...: No such file or directory` Запуск не из клона. Используйте полный путь: ```bash bash "$SHOP_ROOT/scripts/server-update.sh" ``` ### `Служба shop не установлена` / `Unit shop.service could not be found` ```bash cd "$SHOP_ROOT" sudo bash scripts/install-shop-service.sh ``` В `/etc/systemd/system/shop.service` поля `WorkingDirectory` и `EnvironmentFile` должны указывать на **`$SHOP_ROOT`**. ### `shop.service: status=1/FAILURE`, `activating (auto-restart)` 1. **Порт 3000 занят** (старый ручной Node) — health отвечает, systemd падает: ```bash sudo bash "$SHOP_ROOT/scripts/free-port-3000.sh" sudo systemctl restart shop systemctl status shop ``` 2. **PostgreSQL** — смотрите лог: ```bash journalctl -u shop -n 40 --no-pager bash "$SHOP_ROOT/scripts/diagnose-shop-service.sh" ``` 3. **`.env` не в `SHOP_ROOT`** — скопируйте с прежнего места: ```bash cp /старый/путь/.env "$SHOP_ROOT/.env" sudo bash "$SHOP_ROOT/scripts/install-shop-service.sh" ``` ### Изменения в git не видны на сайте Обновление делали не в том каталоге или служба смотрит на другой путь: ```bash cd "$SHOP_ROOT" && git log -1 --oneline grep WorkingDirectory /etc/systemd/system/shop.service bash scripts/server-update.sh ``` --- ## Проверка ```bash systemctl status shop curl -s http://127.0.0.1:3000/health ``` Ожидается: `{"ok":true,"service":"shop","database":"postgresql"}` и **`Active: active (running)`**. --- ## Caddy / HTTPS Пока `curl http://127.0.0.1:3000/health` не OK, reverse proxy будет отдавать **502**. Сначала backend, потом Caddy. См. также: [Решение проблем](Troubleshooting), [Установка без Docker](Install-Native).