Files
shop10/wiki/Install-Native.md
T

226 lines
5.4 KiB
Markdown

# Установка без Docker (Ubuntu)
Production-развёртывание на **Ubuntu 22.04 / 24.04**: Node.js 20, PostgreSQL 17, systemd, опционально Caddy.
## 1. Требования
- Сервер Ubuntu 22.04 или 24.04 (root или sudo)
- Минимум 1 GB RAM, 10 GB диск
- Открыты порты **22**, **80**, **443** (если используете Caddy)
- Порт **3000** наружу не открывать — только localhost
## 2. Установка системных пакетов
```bash
apt update
apt install -y git curl ca-certificates
```
### Node.js 20 LTS
```bash
curl -fsSL https://deb.nodesource.com/setup_20.x | bash -
apt install -y nodejs
node -v # v20.x
```
### PostgreSQL 17
Не используйте `apt install postgresql-17` без PGDG — пакет не найдётся. Скрипт подключает PGDG автоматически:
```bash
sudo bash /opt/shop/shop10/scripts/install-postgresql-ubuntu.sh
```
## 3. Клонирование проекта
```bash
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/shop10/shop10
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`
```bash
cp .env.example .env
nano .env
```
Обязательные параметры:
```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
```
Секрет сессии:
```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
```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
```
Unit ждёт PostgreSQL (`ExecStartPre` + `pg_isready`) и запускает Node от пользователя `www-data`.
**Важно:** не выполняйте `chown -R www-data /opt/shop` — это ломает `git pull`. Права на запись нужны только для каталога `data/` (если используется); с PostgreSQL каталог `data/` не обязателен.
Логи:
```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
systemctl reload caddy
```
Файрвол:
```bash
ufw allow 22/tcp
ufw allow 80/tcp
ufw allow 443/tcp
ufw enable
```
Зависимость 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. Архитектура
```
Интернет → Caddy :443 → 127.0.0.1:3000 (Node.js shop)
PostgreSQL 127.0.0.1:5432
```
## 12. Резервное копирование БД
```bash
sudo -u postgres pg_dump shop > shop_backup_$(date +%F).sql
```
Восстановление:
```bash
sudo -u postgres psql shop < shop_backup_2026-05-17.sql
```