561fbd22e0
Co-authored-by: Cursor <cursoragent@cursor.com>
180 lines
5.5 KiB
Markdown
180 lines
5.5 KiB
Markdown
# Сервер: установка и обновление
|
||
|
||
Инструкция **без привязки к конкретному домену или хостингу**. Подставьте свои значения:
|
||
|
||
| Переменная | Что это | Пример |
|
||
|------------|---------|--------|
|
||
| `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).
|