Files
shop10/README.md
T
2026-05-17 13:24:06 +03:00

10 KiB
Raw Blame History

Shop

v0.20.0 — интернет-магазин на Node.js и PostgreSQL 17.

Два способа установки: Docker Compose | без Docker (Ubuntu)

Подробности релиза: CHANGELOG.md · docs/RELEASE-0.20.md

Wiki (установка): https://git.evilfox.cc/test/shop10/wiki

Возможности

  • Каталог товаров с категориями и поиском
  • Корзина и оформление заказа
  • Регистрация, вход (пароль или passkey), сброс пароля по email
  • Личный кабинет: профиль, бронирования
  • Роли клиент / администратор, админ-панель
  • Согласие на cookies

Требования

  • Node.js 18+ и PostgreSQL 17 — или Docker / Docker Compose

Docker Compose (рекомендуется для теста)

Полный стек: PostgreSQL 17 + приложение Node.js.

cp .env.docker.example .env
# Отредактируйте SESSION_SECRET в .env

docker compose up -d --build
docker compose ps
curl -s http://127.0.0.1:3000/health

Сайт: http://localhost:3000

Команда Описание
docker compose up -d --build Сборка и запуск
docker compose logs -f app Логи приложения
docker compose down Остановка
docker compose down -v Остановка + удаление БД

Caddy в Docker (HTTPS, опционально)

# В .env: TRUST_PROXY=1
# Отредактируйте caddy/Caddyfile.docker.example (домен)
docker compose --profile proxy up -d --build

Порты: 80, 443 (Caddy) → app:3000.

Только PostgreSQL (разработка на хосте)

docker compose -f docker-compose.dev.yml up -d
cp .env.example .env
# DATABASE_URL=postgresql://shop:shop@127.0.0.1:5432/shop
npm install && npm run dev

Файлы

Файл Назначение
Dockerfile Образ приложения
docker-compose.yml app + postgres (+ caddy с профилем proxy)
docker-compose.dev.yml только postgres для npm run dev
.env.docker.example переменные для compose

PostgreSQL 17 (без Docker)

Ubuntu (сервер)

apt update
apt install -y postgresql-17 postgresql-client-17
systemctl enable postgresql
systemctl start postgresql

Если пакета postgresql-17 нет в репозитории Ubuntu, подключите 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

Пользователь и база shop:

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

Схема: postgres/init/01_schema.sql (применяется при старте приложения).

Сессии — таблица session в PostgreSQL (создаётся автоматически).


Быстрый развёртывание на Ubuntu

Одной командой (клон в /opt/shop/shop10, PostgreSQL через PGDG, systemd):

apt update && apt install -y git curl
git clone https://git.evilfox.cc/test/shop10.git /opt/shop/shop10
cd /opt/shop/shop10
sudo bash scripts/quick-deploy-ubuntu.sh

Уже установлен магазин — только обновить код:

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

Не выполняйте cd /opt/shop, если репозиторий в /opt/shop/shop10 — там нет package.json.

Ручная установка:

cd /opt/shop/shop10
sudo bash scripts/install-postgresql-ubuntu.sh   # PGDG, не apt install postgresql-17 напрямую
bash scripts/setup-postgres-ubuntu.sh
cp .env.example .env
# SESSION_SECRET, DATABASE_URL, SITE_URL
npm install --omit=dev
systemctl restart shop

Проверка:

curl -s http://127.0.0.1:3000/health
# {"ok":true,"service":"shop","database":"postgresql"}

Переменные .env

PORT=3000
HOST=127.0.0.1
NODE_ENV=production
TRUST_PROXY=1
SESSION_SECRET=длинный-секрет
DATABASE_URL=postgresql://shop:shop@127.0.0.1:5432/shop
Переменная Описание
DATABASE_URL Строка подключения PostgreSQL
PGHOST, PGPORT, PGUSER, PGPASSWORD, PGDATABASE Альтернатива DATABASE_URL
HOST 127.0.0.1 в production (доступ через Caddy)

Запуск как служба (systemd)

cp /opt/shop/shop10/deploy/shop.service /etc/systemd/system/shop.service

cd /opt/shop/shop10
cp .env.example .env   # при первой установке
# Заполните SESSION_SECRET и DATABASE_URL

npm install --omit=dev

# Не делайте chown -R www-data на весь /opt/shop (ломает git pull)
systemctl daemon-reload
systemctl enable shop
systemctl start shop
journalctl -u shop -f

EnvironmentFile=/opt/shop/shop10/.env должен содержать DATABASE_URL.


Проверка после установки

systemctl restart shop
sleep 1
curl -s http://127.0.0.1:3000/health
ss -tlnp | grep 3000
journalctl -u shop -n 5 --no-pager
# Магазин: http://127.0.0.1:3000 (PostgreSQL)

Обновление на сервере (git pull)

Каталог клона — там, где лежат package.json и scripts/ (часто /opt/shop или /opt/shop/shop10):

cd /opt/shop/shop10
bash scripts/git-sync.sh      # если detached HEAD или ошибка git pull
bash scripts/server-update.sh

Или одной командой (путь к скрипту в вашем клоне):

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

Скрипт сам найдёт корень репозитория. В deploy/shop.service поле WorkingDirectory должно указывать на тот же каталог.

Скрипт: git pullnpm install → проверка PostgreSQL → restart shopcurl /healthreload caddy.

Вручную:

cd /opt/shop/shop10
git pull
npm install --omit=dev
systemctl restart shop
curl -s http://127.0.0.1:3000/health
systemctl reload caddy

Caddy — SSL и reverse proxy

Перед Caddy: curl http://127.0.0.1:3000/health → OK.

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

caddy validate --config /etc/caddy/Caddyfile
systemctl enable caddy
systemctl reload caddy

Пример Caddyfile:

{
	email admin@example.com
}

shop.example.com {
	encode gzip zstd
	reverse_proxy 127.0.0.1:3000
}

Порты 80/443 открыть; 5432 и 3000 наружу не публиковать.

Ошибка ECONNREFUSED 127.0.0.1:5432

Приложение обновилось на PostgreSQL, а сервер БД не запущен.

Быстрое исправление (одной командой):

bash /opt/shop/shop10/scripts/fix-db-connection.sh

Вручную:

cd /opt/shop/shop10
sudo bash scripts/install-postgresql-ubuntu.sh
systemctl enable --now postgresql
pg_isready -h 127.0.0.1 -p 5432

bash scripts/setup-postgres-ubuntu.sh
nano .env   # DATABASE_URL=postgresql://shop:shop@127.0.0.1:5432/shop

cp deploy/shop.service /etc/systemd/system/shop.service
systemctl daemon-reload
systemctl restart shop
curl -s http://127.0.0.1:3000/health

HTTP 502

bash /opt/shop/shop10/scripts/diagnose-502.sh
journalctl -u shop -n 50 --no-pager
Причина Решение
ECONNREFUSED 127.0.0.1:5432 PostgreSQL не запущен или не установлен — см. ниже
PostgreSQL не запущен systemctl enable --now postgresql
Неверный DATABASE_URL проверить .env, psql
Node не слушает 3000 journalctl -u shop -f
Caddy без backend сначала curl /health, потом reload caddy

Локальная разработка

docker compose -f docker-compose.dev.yml up -d
cp .env.example .env
npm install
npm run dev

Скрипты npm

Команда Описание
npm start Запуск сервера
npm run dev С автоперезагрузкой
npm run seed Демо-товары (если каталог пуст)

Структура

Dockerfile
docker-compose.yml
docker-compose.dev.yml
postgres/init/01_schema.sql
caddy/Caddyfile.example
caddy/Caddyfile.docker.example
deploy/shop.service
scripts/
  setup-postgres-ubuntu.sh
  install-postgresql-ubuntu.sh
  quick-deploy-ubuntu.sh
  fix-db-connection.sh
  diagnose-502.sh
  server-update.sh
src/

Релиз 0.20.0

git clone https://git.evilfox.cc/test/shop10.git /opt/shop/shop10
cd /opt/shop/shop10
git checkout v0.20.0
Способ Команда
Docker docker compose up -d --build
Без Docker bash scripts/setup-postgres-ubuntu.shsystemctl start shop

Репозиторий

git clone https://git.evilfox.cc/test/shop10.git /opt/shop/shop10
cd /opt/shop/shop10