Co-authored-by: Cursor <cursoragent@cursor.com>
5.8 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 -y postgresql-17 postgresql-client-17
systemctl enable postgresql
systemctl start postgresql
pg_isready -h 127.0.0.1 -p 5432
Если пакет postgresql-17 не найден — репозиторий PGDG:
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. Клонирование проекта
cd /opt
git clone https://git.evilfox.cc/test/shop10.git shop
cd shop
git checkout v0.10.0
4. База данных PostgreSQL
cd /opt/shop
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
npm install --omit=dev
При первом запуске приложение создаст таблицы и демо-товары (если каталог пуст).
7. Служба systemd
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/ не обязателен.
Логи:
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/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
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