# Установка без 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. Архитектура ``` Интернет → 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 ```