docs: Server-Operations — универсальное развёртывание без привязки к домену
Co-authored-by: Cursor <cursoragent@cursor.com>
This commit is contained in:
+41
-160
@@ -1,225 +1,106 @@
|
||||
# Установка без Docker (Ubuntu)
|
||||
|
||||
Production-развёртывание на **Ubuntu 22.04 / 24.04**: Node.js 20, PostgreSQL 17, systemd, опционально Caddy.
|
||||
Production: Node.js 20, PostgreSQL 17, systemd, опционально Caddy.
|
||||
|
||||
**Полное руководство по ошибкам и обновлениям:** [Server-Operations](Server-Operations).
|
||||
|
||||
Задайте каталог клона:
|
||||
|
||||
```bash
|
||||
export SHOP_ROOT=/opt/shop
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## 1. Требования
|
||||
|
||||
- Сервер Ubuntu 22.04 или 24.04 (root или sudo)
|
||||
- Минимум 1 GB RAM, 10 GB диск
|
||||
- Открыты порты **22**, **80**, **443** (если используете Caddy)
|
||||
- Порт **3000** наружу не открывать — только localhost
|
||||
- Ubuntu 22.04 или 24.04
|
||||
- Порты 22, 80, 443 (для Caddy)
|
||||
- Порт 3000 только localhost
|
||||
|
||||
## 2. Установка системных пакетов
|
||||
## 2. Системные пакеты
|
||||
|
||||
```bash
|
||||
apt update
|
||||
apt install -y git curl ca-certificates
|
||||
```
|
||||
|
||||
### Node.js 20 LTS
|
||||
### Node.js 20
|
||||
|
||||
```bash
|
||||
curl -fsSL https://deb.nodesource.com/setup_20.x | bash -
|
||||
apt install -y nodejs
|
||||
node -v # v20.x
|
||||
apt install -y nodejs git curl
|
||||
```
|
||||
|
||||
### PostgreSQL 17
|
||||
|
||||
Не используйте `apt install postgresql-17` без PGDG — пакет не найдётся. Скрипт подключает PGDG автоматически:
|
||||
Не используйте `apt install postgresql-17` без PGDG:
|
||||
|
||||
```bash
|
||||
sudo bash /opt/shop/shop10/scripts/install-postgresql-ubuntu.sh
|
||||
sudo bash "$SHOP_ROOT/scripts/install-postgresql-ubuntu.sh"
|
||||
```
|
||||
|
||||
## 3. Клонирование проекта
|
||||
## 3. Клонирование
|
||||
|
||||
```bash
|
||||
git clone https://git.evilfox.cc/test/shop10.git /opt/shop/shop10
|
||||
cd /opt/shop/shop10/shop10
|
||||
git checkout v0.20.0
|
||||
export GIT_REPO_URL='<URL-вашего-репозитория>'
|
||||
git clone "$GIT_REPO_URL" "$SHOP_ROOT"
|
||||
cd "$SHOP_ROOT"
|
||||
```
|
||||
|
||||
Или быстрая установка всего стека: `sudo bash scripts/quick-deploy-ubuntu.sh`
|
||||
Или: `sudo SHOP_GIT_URL="$GIT_REPO_URL" bash scripts/quick-deploy-ubuntu.sh`
|
||||
|
||||
## 4. База данных PostgreSQL
|
||||
## 4. База данных
|
||||
|
||||
```bash
|
||||
cd /opt/shop/shop10/shop10
|
||||
cd "$SHOP_ROOT"
|
||||
bash scripts/setup-postgres-ubuntu.sh
|
||||
```
|
||||
|
||||
Скрипт:
|
||||
- запускает PostgreSQL;
|
||||
- создаёт пользователя и БД `shop` (по умолчанию пароль `shop` — **смените в production**);
|
||||
- выводит строку `DATABASE_URL`.
|
||||
|
||||
Проверка:
|
||||
|
||||
```bash
|
||||
psql "postgresql://shop:shop@127.0.0.1:5432/shop" -c "SELECT 1"
|
||||
```
|
||||
|
||||
## 5. Файл окружения `.env`
|
||||
## 5. `.env`
|
||||
|
||||
```bash
|
||||
cp .env.example .env
|
||||
nano .env
|
||||
```
|
||||
|
||||
Обязательные параметры:
|
||||
`SESSION_SECRET`, `DATABASE_URL`, `SITE_URL` (ваш публичный URL без привязки к конкретному домену в коде).
|
||||
|
||||
```env
|
||||
PORT=3000
|
||||
HOST=127.0.0.1
|
||||
NODE_ENV=production
|
||||
TRUST_PROXY=1
|
||||
SESSION_SECRET=сгенерируйте_длинную_строку
|
||||
DATABASE_URL=postgresql://shop:ВАШ_ПАРОЛЬ@127.0.0.1:5432/shop
|
||||
```
|
||||
|
||||
Секрет сессии:
|
||||
## 6. Зависимости
|
||||
|
||||
```bash
|
||||
openssl rand -hex 32
|
||||
```
|
||||
|
||||
`HOST=127.0.0.1` — приложение доступно только локально; снаружи — через Caddy.
|
||||
|
||||
## 6. Установка зависимостей Node.js
|
||||
|
||||
```bash
|
||||
cd /opt/shop/shop10
|
||||
npm install --omit=dev
|
||||
```
|
||||
|
||||
При первом запуске приложение создаст таблицы и демо-товары (если каталог пуст).
|
||||
|
||||
## 7. Служба systemd
|
||||
## 7. systemd
|
||||
|
||||
```bash
|
||||
cp /opt/shop/shop10/deploy/shop.service /etc/systemd/system/shop.service
|
||||
systemctl daemon-reload
|
||||
systemctl enable shop
|
||||
systemctl start shop
|
||||
systemctl status shop
|
||||
sudo bash scripts/install-shop-service.sh
|
||||
```
|
||||
|
||||
Unit ждёт PostgreSQL (`ExecStartPre` + `pg_isready`) и запускает Node от пользователя `www-data`.
|
||||
`WorkingDirectory` в unit = `$SHOP_ROOT`. Не делайте `chown -R www-data` на весь репозиторий.
|
||||
|
||||
**Важно:** не выполняйте `chown -R www-data /opt/shop` — это ломает `git pull`. Права на запись нужны только для каталога `data/` (если используется); с PostgreSQL каталог `data/` не обязателен.
|
||||
## 8. Caddy
|
||||
|
||||
Логи:
|
||||
После `curl http://127.0.0.1:3000/health` → OK:
|
||||
|
||||
```bash
|
||||
journalctl -u shop -f
|
||||
```
|
||||
|
||||
## 8. Проверка backend
|
||||
|
||||
```bash
|
||||
curl -s http://127.0.0.1:3000/health
|
||||
ss -tlnp | grep 3000
|
||||
```
|
||||
|
||||
В логах должно быть: `Магазин: http://127.0.0.1:3000 (PostgreSQL)`
|
||||
|
||||
## 9. Caddy — HTTPS и reverse proxy
|
||||
|
||||
Установка Caddy:
|
||||
|
||||
```bash
|
||||
apt install -y debian-keyring debian-archive-keyring apt-transport-https
|
||||
curl -1sLf 'https://dl.cloudsmith.io/public/caddy/stable/gpg.key' \
|
||||
| gpg --dearmor -o /usr/share/keyrings/caddy-stable-archive-keyring.gpg
|
||||
curl -1sLf 'https://dl.cloudsmith.io/public/caddy/stable/debian.deb.txt' \
|
||||
| tee /etc/apt/sources.list.d/caddy-stable.list
|
||||
apt update && apt install -y caddy
|
||||
```
|
||||
|
||||
Конфигурация:
|
||||
|
||||
```bash
|
||||
cp /opt/shop/shop10/caddy/Caddyfile.example /etc/caddy/Caddyfile
|
||||
nano /etc/caddy/Caddyfile
|
||||
```
|
||||
|
||||
Пример (замените домен и email):
|
||||
|
||||
```caddyfile
|
||||
{
|
||||
email admin@example.com
|
||||
}
|
||||
|
||||
shop.example.com {
|
||||
encode gzip zstd
|
||||
reverse_proxy 127.0.0.1:3000
|
||||
}
|
||||
```
|
||||
|
||||
```bash
|
||||
caddy validate --config /etc/caddy/Caddyfile
|
||||
systemctl enable caddy
|
||||
cp "$SHOP_ROOT/caddy/Caddyfile.example" /etc/caddy/Caddyfile
|
||||
# укажите ваш домен в Caddyfile
|
||||
systemctl reload caddy
|
||||
```
|
||||
|
||||
Файрвол:
|
||||
## 9. Обновление
|
||||
|
||||
```bash
|
||||
ufw allow 22/tcp
|
||||
ufw allow 80/tcp
|
||||
ufw allow 443/tcp
|
||||
ufw enable
|
||||
bash "$SHOP_ROOT/scripts/server-update.sh"
|
||||
```
|
||||
|
||||
Зависимость Caddy от shop (опционально):
|
||||
|
||||
```bash
|
||||
mkdir -p /etc/systemd/system/caddy.service.d
|
||||
cp /opt/shop/deploy/caddy-after-shop.conf /etc/systemd/system/caddy.service.d/shop.conf
|
||||
systemctl daemon-reload
|
||||
```
|
||||
|
||||
## 10. Обновление
|
||||
|
||||
```bash
|
||||
cd /opt/shop/shop10/shop10
|
||||
git config --global --add safe.directory "$(pwd)"
|
||||
bash scripts/server-update.sh
|
||||
```
|
||||
|
||||
Если клон в `/opt/shop` без подкаталога — используйте `/opt/shop`. Скрипт ищет `package.json` автоматически; можно запустить так:
|
||||
|
||||
```bash
|
||||
bash /opt/shop/shop10/scripts/server-update.sh
|
||||
```
|
||||
|
||||
Или вручную:
|
||||
|
||||
```bash
|
||||
git pull
|
||||
npm install --omit=dev
|
||||
systemctl restart shop
|
||||
curl -s http://127.0.0.1:3000/health
|
||||
systemctl reload caddy
|
||||
```
|
||||
|
||||
## 11. Архитектура
|
||||
## 10. Архитектура
|
||||
|
||||
```
|
||||
Интернет → Caddy :443 → 127.0.0.1:3000 (Node.js shop)
|
||||
Интернет → Caddy :443 → 127.0.0.1:3000 (Node.js)
|
||||
↓
|
||||
PostgreSQL 127.0.0.1:5432
|
||||
```
|
||||
|
||||
## 12. Резервное копирование БД
|
||||
## 11. Резервное копирование
|
||||
|
||||
```bash
|
||||
sudo -u postgres pg_dump shop > shop_backup_$(date +%F).sql
|
||||
```
|
||||
|
||||
Восстановление:
|
||||
|
||||
```bash
|
||||
sudo -u postgres psql shop < shop_backup_2026-05-17.sql
|
||||
```
|
||||
|
||||
Reference in New Issue
Block a user