Files
shop10/wiki/Install-Native.md
T

245 lines
6.0 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# Установка без 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
```bash
apt install -y postgresql-17 postgresql-client-17
systemctl enable postgresql
systemctl start postgresql
pg_isready -h 127.0.0.1 -p 5432
```
Если пакет `postgresql-17` не найден — [репозиторий PGDG](https://www.postgresql.org/download/linux/ubuntu/):
```bash
apt install -y curl ca-certificates
install -d /usr/share/postgresql-common/pgdg
curl -o /usr/share/postgresql-common/pgdg/apt.postgresql.org.asc --fail \
https://www.postgresql.org/media/keys/ACCC4CF8.asc
sh -c 'echo "deb [signed-by=/usr/share/postgresql-common/pgdg/apt.postgresql.org.asc] https://apt.postgresql.org/pub/repos/apt $(. /etc/os-release && echo ${VERSION_CODENAME}-pgdg) main" > /etc/apt/sources.list.d/pgdg.list'
apt update
apt install -y postgresql-17 postgresql-client-17
```
## 3. Клонирование проекта
```bash
cd /opt
git clone https://git.evilfox.cc/test/shop10.git shop
cd shop
git checkout v0.10.0
```
## 4. База данных PostgreSQL
```bash
cd /opt/shop
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
npm install --omit=dev
```
При первом запуске приложение создаст таблицы и демо-товары (если каталог пуст).
## 7. Служба systemd
```bash
cp /opt/shop/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/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
git config --global --add safe.directory /opt/shop
bash 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. Переход с SQLite (старая версия)
1. Установите PostgreSQL (шаги 24)
2. Добавьте `DATABASE_URL` в `.env`
3. `git pull``npm install``systemctl restart shop`
4. Демо-товары появятся автоматически; пользователей нужно зарегистрировать заново
Быстрое исправление подключения к БД:
```bash
bash /opt/shop/scripts/fix-db-connection.sh
```
## 12. Архитектура
```
Интернет → Caddy :443 → 127.0.0.1:3000 (Node.js shop)
PostgreSQL 127.0.0.1:5432
```
## 13. Резервное копирование БД
```bash
sudo -u postgres pg_dump shop > shop_backup_$(date +%F).sql
```
Восстановление:
```bash
sudo -u postgres psql shop < shop_backup_2026-05-17.sql
```