Files
shop10/wiki/Install-Native.md
T

5.4 KiB

Установка без 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. Установка системных пакетов

apt update
apt install -y git curl ca-certificates

Node.js 20 LTS

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 автоматически:

sudo bash /opt/shop/shop10/scripts/install-postgresql-ubuntu.sh

3. Клонирование проекта

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

cd /opt/shop/shop10/shop10
bash scripts/setup-postgres-ubuntu.sh

Скрипт:

  • запускает PostgreSQL;
  • создаёт пользователя и БД shop (по умолчанию пароль shopсмените в production);
  • выводит строку DATABASE_URL.

Проверка:

psql "postgresql://shop:shop@127.0.0.1:5432/shop" -c "SELECT 1"

5. Файл окружения .env

cp .env.example .env
nano .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

Секрет сессии:

openssl rand -hex 32

HOST=127.0.0.1 — приложение доступно только локально; снаружи — через Caddy.

6. Установка зависимостей Node.js

cd /opt/shop/shop10
npm install --omit=dev

При первом запуске приложение создаст таблицы и демо-товары (если каталог пуст).

7. Служба systemd

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/ не обязателен.

Логи:

journalctl -u shop -f

8. Проверка backend

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:

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

Конфигурация:

cp /opt/shop/shop10/caddy/Caddyfile.example /etc/caddy/Caddyfile
nano /etc/caddy/Caddyfile

Пример (замените домен и email):

{
	email admin@example.com
}

shop.example.com {
	encode gzip zstd
	reverse_proxy 127.0.0.1:3000
}
caddy validate --config /etc/caddy/Caddyfile
systemctl enable caddy
systemctl reload caddy

Файрвол:

ufw allow 22/tcp
ufw allow 80/tcp
ufw allow 443/tcp
ufw enable

Зависимость Caddy от shop (опционально):

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. Обновление

cd /opt/shop/shop10/shop10
git config --global --add safe.directory "$(pwd)"
bash scripts/server-update.sh

Если клон в /opt/shop без подкаталога — используйте /opt/shop. Скрипт ищет package.json автоматически; можно запустить так:

bash /opt/shop/shop10/scripts/server-update.sh

Или вручную:

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. Резервное копирование БД

sudo -u postgres pg_dump shop > shop_backup_$(date +%F).sql

Восстановление:

sudo -u postgres psql shop < shop_backup_2026-05-17.sql