diff --git a/README.md b/README.md index 7db3b46..299eb8d 100644 --- a/README.md +++ b/README.md @@ -11,43 +11,167 @@ ## Требования -- [Node.js](https://nodejs.org/) 18 или новее (вместе с npm) +- Node.js 18+ +- npm +- На Linux для сборки `better-sqlite3`: `build-essential`, `python3` -## Установка и запуск +--- + +## Быстрый развёртывание на Ubuntu + +Скопируйте блок целиком на чистый сервер Ubuntu 22.04 / 24.04 (от root или через `sudo`): + +```bash +# 1. Зависимости системы +apt update +apt install -y git curl build-essential python3 + +# 2. Node.js 20 LTS +curl -fsSL https://deb.nodesource.com/setup_20.x | bash - +apt install -y nodejs + +# 3. Клонирование (замените URL при необходимости) +cd /opt +git clone https://git.evilfox.cc/test/shop10.git shop +cd shop + +# 4. Настройка окружения +cp .env.example .env +# Сгенерируйте секрет сессии: +sed -i "s/change-me-to-a-long-random-string/$(openssl rand -hex 32)/" .env + +# 5. Установка и первый запуск +npm install --omit=dev +npm start +``` + +Сайт будет доступен на **http://IP_СЕРВЕРА:3000**. + +Порт можно изменить в `.env`: + +```env +PORT=3000 +SESSION_SECRET=ваш-длинный-секрет +``` + +При первом запуске создаются `data/shop.db`, `data/sessions.db` и демо-товары. + +--- + +## Запуск как служба (systemd) + +Чтобы магазин работал после перезагрузки сервера: + +```bash +cat > /etc/systemd/system/shop.service << 'EOF' +[Unit] +Description=Shop Node.js +After=network.target + +[Service] +Type=simple +User=www-data +WorkingDirectory=/opt/shop +Environment=NODE_ENV=production +ExecStart=/usr/bin/node src/server.js +Restart=on-failure +RestartSec=5 + +[Install] +WantedBy=multi-user.target +EOF + +# Права на каталог (если клонировали в /opt/shop) +chown -R www-data:www-data /opt/shop + +systemctl daemon-reload +systemctl enable shop +systemctl start shop +systemctl status shop +``` + +Логи: `journalctl -u shop -f` + +--- + +## Nginx (опционально, порт 80/443) + +```bash +apt install -y nginx + +cat > /etc/nginx/sites-available/shop << 'EOF' +server { + listen 80; + server_name shop.example.com; + + location / { + proxy_pass http://127.0.0.1:3000; + proxy_http_version 1.1; + proxy_set_header Host $host; + proxy_set_header X-Real-IP $remote_addr; + proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; + proxy_set_header X-Forwarded-Proto $scheme; + } +} +EOF + +ln -sf /etc/nginx/sites-available/shop /etc/nginx/sites-enabled/ +nginx -t && systemctl reload nginx +``` + +Замените `shop.example.com` на ваш домен. HTTPS: `apt install certbot python3-certbot-nginx && certbot --nginx`. + +--- + +## Обновление с Git + +```bash +cd /opt/shop +systemctl stop shop +git pull +npm install --omit=dev +systemctl start shop +``` + +--- + +## Локальная разработка ```bash npm install -cp .env.example .env # Windows: copy .env.example .env +cp .env.example .env npm run dev ``` Сайт: [http://localhost:3000](http://localhost:3000) -При первом запуске создаётся база `data/shop.db` и загружаются демо-товары. - ## Переменные окружения -| Переменная | Описание | По умолчанию | -|-------------------|-----------------------------------|--------------| -| `PORT` | Порт HTTP-сервера | `3000` | -| `SESSION_SECRET` | Секрет для подписи сессий | dev-значение | +| Переменная | Описание | По умолчанию | +|------------------|---------------------------|----------------| +| `PORT` | Порт HTTP-сервера | `3000` | +| `SESSION_SECRET` | Секрет для сессий | dev-значение | -## Скрипты +## Скрипты npm -| Команда | Описание | -|----------------|-----------------------------| -| `npm start` | Запуск сервера | -| `npm run dev` | Запуск с автоперезагрузкой | -| `npm run seed` | Заполнение каталога (если пуст) | +| Команда | Описание | +|----------------|----------------------------------| +| `npm start` | Запуск сервера (production) | +| `npm run dev` | Запуск с автоперезагрузкой | +| `npm run seed` | Заполнение каталога, если пуст | ## База данных -Данные хранятся локально в каталоге `data/`: +Локально в каталоге `data/`: - `shop.db` — товары, пользователи, заказы - `sessions.db` — сессии -Каталог `data/` не попадает в git (см. `.gitignore`). +Каталог `data/` в git не попадает (см. `.gitignore`). Делайте резервные копии: + +```bash +cp -a data/shop.db data/shop.db.bak +``` ## Структура проекта @@ -61,9 +185,8 @@ src/ public/css/ — стили ``` -## Git remote +## Репозиторий ```bash -git remote add origin https://git.evilfox.cc/admin/shop.git -git push -u origin main +git clone https://git.evilfox.cc/test/shop10.git ```