docs: Server-Operations — универсальное развёртывание без привязки к домену

Co-authored-by: Cursor <cursoragent@cursor.com>
This commit is contained in:
shop
2026-05-17 13:34:25 +03:00
parent d31a63829c
commit 561fbd22e0
11 changed files with 336 additions and 402 deletions
+179
View File
@@ -0,0 +1,179 @@
# Сервер: установка и обновление
Инструкция **без привязки к конкретному домену или хостингу**. Подставьте свои значения:
| Переменная | Что это | Пример |
|------------|---------|--------|
| `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).
---
## Обновление кода (сайт уже работает)
```bash
cd "$SHOP_ROOT"
bash scripts/git-sync.sh
bash scripts/server-update.sh
```
Или одной строкой (путь к скриптам в вашем клоне):
```bash
bash "$SHOP_ROOT/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).