diff --git a/Install-Native.-.md b/Install-Native.-.md new file mode 100644 index 0000000..601d515 --- /dev/null +++ b/Install-Native.-.md @@ -0,0 +1,244 @@ +# Установка без 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 (шаги 2–4) +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 +```