NW c55ec47ea0 fix: admin product form - cascading location selectors + inline category creation
- Country → City → District cascading dropdowns with filtering
- Categories filtered by selected location (show all when no location)
- 'No category? Create one' row appears when location selected
- POST /catalog/categories/json endpoint for AJAX category creation
- Product form uses location_id from dropdown (not category lookup)
- Categories populate in select after inline creation
- district fallback shows city name when district is empty
2026-06-25 08:21:41 +01:00
2024-11-15 07:31:46 +03:00

Telegram Shop Bot

Телеграм-бот для организации онлайн-продаж через Telegram с поддержкой криптовалют, WireGuard VPN и Tor-прокси для доступа к админ-панели через onion-адрес.

Возможности

  • Каталог товаров с категориями и фильтрацией по локациям
  • Покупки с оплатой криптовалютами (BTC, ETH, LTC, USDT, USDC)
  • Управление криптокошельками (создание, пополнение, баланс)
  • История транзакций и покупок
  • SaaS-система с автоматическим расчётом комиссий
  • Админ-панель на порту 3001
  • Tor-прокси с двумя onion-сервисами (SSH + админка)
  • WireGuard VPN для безопасных транзакций

Быстрый старт (одна команда)

Требования

  • Любое устройство с Docker: x86_64 (PC, сервер) или ARM64 (Orange Pi, Raspberry Pi)
  • 512 МБ RAM минимум (Orange Pi Zero 2 поддерживается)

Установка

git clone <repo-url> && cd telegram-shop
bash install.sh

Скрипт автоматически:

  1. Определит архитектуру (x86_64 / ARM64 / ARMv7)
  2. Установит Docker если не установлен
  3. Создаст .env из шаблона
  4. Проверит обязательные переменные
  5. Соберёт Docker-образ под текущую архитектуру
  6. Запустит контейнер и проверит health-check

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

# 1. Клонировать
git clone <repo-url> && cd telegram-shop

# 2. Создать .env из шаблона
cp .env.example .env
nano .env  # заполнить BOT_TOKEN, ADMIN_IDS, ENCRYPTION_KEY

# 3. Собрать и запустить
docker compose up -d --build

# 4. Проверить статус
docker compose ps
curl http://localhost:3001/health

Настройка .env

Скопируйте .env.example в .env и заполните:

Переменная Обязательно Описание
BOT_TOKEN Токен Telegram бота (@BotFather)
ADMIN_IDS ID администраторов через запятую
ENCRYPTION_KEY Ключ шифрования (32 байта hex)
ADMIN_SECRET Секрет для админ-панели
ADMIN_PORT Порт админ-панели (по умолчанию 3001)
ADMIN_URL Полный URL админ-панели (для фото товаров)
SUPER_ADMIN_IDS ID супер-админов
SUPPORT_LINK Ссылка на поддержку
SSH_HOST_IP Куда Tor перенаправляет SSH (по умолчанию host.docker.internal)
SHOP_CONTAINER Имя контейнера магазина (по умолчанию telegram_shop_prod)
WG_ENABLED true / false (по умолчанию false)
WG_PRIVATE_KEY Приватный ключ WireGuard
WG_PUBLIC_KEY Публичный ключ WireGuard
WG_PRESHARED_KEY Pre-shared ключ WireGuard
WG_ENDPOINT Адрес сервера WireGuard
WG_ADDRESS Адрес интерфейса WireGuard
WG_DNS DNS для WireGuard

Генерация ключа шифрования:

node -e "console.log(require('crypto').randomBytes(32).toString('hex'))"

Tor Proxy

Проект включает Tor-прокси для доступа к SSH и админ-панели через onion-адреса.

Архитектура

Internet → Tor Network → tor-proxy контейнер
                              ├── Onion #1 :22  → хост SSH
                              └── Onion #2 :80  → telegram_shop_prod:3001
                                                  (через Docker сеть tor_proxy_net)

Файлы Tor-прокси

Файл Назначение
tor-proxy/Dockerfile Alpine + Tor образ
tor-proxy/entrypoint.sh Генерация torrc из env vars, валидация, запись onion-адресов
tor-proxy/get-onions.sh Скрипт чтения onion-адресов и обновления .env
tor-proxy/hosts/ Директория для onion-hosts.txt (bind mount)

После запуска

Onion-адреса автоматически сохраняются в tor-proxy/hosts/onion-hosts.txt. Обновить .env:

./tor-proxy/get-onions.sh

Вывод:

============================================================
  Onion services
============================================================
  SSH   : xxxxx.onion  (port 22 -> host SSH)
  Admin : yyyyy.onion  (port 80 -> telegram_shop_prod:3001)
============================================================

Usage:
  SSH    : torify ssh user@xxxxx.onion
  Admin  : open http://yyyyy.onion in Tor Browser

Переменные Tor

Переменная По умолчанию Описание
SSH_HOST_IP host.docker.internal Куда Tor перенаправляет SSH
SHOP_CONTAINER telegram_shop_prod Контейнер магазина
ADMIN_PORT 3001 Порт админки

Поддерживаемые устройства

Устройство Архитектура RAM Статус
PC / Сервер x86_64 ≥ 512 МБ
Orange Pi Zero 2 ARM64 (H616) 512 МБ
Raspberry Pi 4 ARM64 ≥ 1 ГБ
Raspberry Pi 3 ARM64 1 ГБ
Raspberry Pi 2 ARMv7 1 ГБ

Docker автоматически собирает нативные модули (better-sqlite3, tiny-secp256k1) под архитектуру хоста.

Архитектура Docker

┌──────────────────────────────────────────────────────────┐
│  docker-compose                                           │
│                                                           │
│  ┌────────────────────────┐  ┌─────────────────────────┐ │
│  │ telegram_shop_prod     │  │ tor-proxy               │ │
│  │ (node:22-alpine)       │  │ (alpine:3.18 + tor)     │ │
│  │                        │  │                         │ │
│  │ Port 3001              │◄─┤ HiddenService :80       │ │
│  │ Bot + Admin Panel      │  │ HiddenService :22 → SSH│ │
│  │                        │  │                         │ │
│  │ Net: default           │  │ Net: default + proxy_net │ │
│  │     + tor_proxy_net    │  │                         │ │
│  └────────────────────────┘  └─────────────────────────┘ │
│           │                         │                     │
│      Volumes:                  Volumes:                  │
│      db/, uploads/, .env      tor_data, hosts/          │
└──────────────────────────────────────────────────────────┘

Сети Docker

Сеть Назначение
default Внутренняя связь между контейнерами
tor_proxy_net Связь tor-proxy ↔ telegram_shop_prod

Команды управления

# Запуск
docker compose up -d

# Пересборка после изменений
docker compose up -d --build

# Логи
docker compose logs -f

# Логи конкретного сервиса
docker compose logs -f tor-proxy
docker compose logs -f telegram_shop_prod

# Стоп
docker compose down

# Рестарт
docker compose restart

# Статус
docker compose ps

# Health-check
curl http://localhost:3001/health

# Onion-адреса
docker exec tor-proxy cat /var/lib/tor/ssh/hostname
docker exec tor-proxy cat /var/lib/tor/admin/hostname

# Обновить .env с onion-адресами
./tor-proxy/get-onions.sh

WireGuard

WireGuard по умолчанию отключен (WG_ENABLED=false). Для включения:

  1. Установите WG_ENABLED=true в .env
  2. Заполните ключи WireGuard в .env
  3. Перезапустите: docker compose restart

Контейнер требует NET_ADMIN и sysctl net.ipv4.conf.all.src_valid_mark=1 для WireGuard. Эти привилегии заданы в docker-compose.yml.

Безопасность

  • .env монтируется только для чтения (:ro)
  • Порт 3001 доступен из LAN и через Tor onion
  • Onion-адреса сохраняются в volume (персистентность при перезапуске)
  • Tor hidden services с валидацией env vars
  • Нативные модули компилируются в builder-стейдже
  • devDependencies не попадают в production-образ
  • Тестовые файлы исключены из Docker-образа (.dockerignore)
  • node_modules хоста не попадают в образ (.dockerignore)

Устойчивость к ошибкам

  • Бот не крашит контейнер при невалидном BOT_TOKEN: 5 попыток с задержкой 5с, затем бот отключается, админка продолжает работать
  • Комиссионные кошельки не обязательны для старта: при отсутствии логируется предупреждение
  • При потере связи с Telegram API: polling ошибки логируются, процесс продолжает работать

Структура проекта

├── src/
│   ├── admin/            # Админ-панель (Express)
│   │   ├── routes/       # Роуты админ-панели
│   │   ├── views/        # Шаблоны HTML
│   │   ├── public/       # Статические файлы (CSS)
│   │   ├── auth.js       # Авторизация
│   │   └── server.js      # Express-сервер
│   ├── config/           # Конфигурация (БД, крипто)
│   ├── context/          # Контекст и состояния бота
│   ├── handlers/         # Обработчики команд
│   │   ├── adminHandlers/  # Обработчики админа
│   │   └── userHandlers/    # Обработчики пользователя
│   ├── middleware/        # Промежуточные обработчики
│   ├── migrations/        # Миграции БД
│   ├── models/            # Модели данных
│   ├── router/            # Роутинг Express
│   ├── services/          # Бизнес-логика
│   ├── utils/             # Утилиты (логирование, валидация, ошибки)
│   └── index.js           # Точка входа
├── tor-proxy/             # Tor прокси для SSH и админки
│   ├── Dockerfile         # Alpine + Tor образ
│   ├── entrypoint.sh      # Генерация torrc, валидация env vars
│   ├── get-onions.sh      # Скрипт обновления .env с onion-адресами
│   └── hosts/             # Директория для onion-hosts.txt
├── wg/                    # WireGuard конфигурация
│   └── start.sh           # Скрипт запуска контейнера
├── db/                    # SQLite база данных (volume)
├── uploads/               # Загруженные фото (volume)
├── Dockerfile              # Multi-stage сборка магазина
├── docker-compose.yml      # Конфигурация обоих контейнеров
├── install.sh              # Установщик (POSIX sh)
├── .dockerignore           # Исключения из образа
├── .env.example            # Шаблон переменных
└── package.json

Разработка

# Установка зависимостей
npm install

# Запуск в режиме разработки
npm run dev

# Тесты
npm test

Лицензия

MIT

Description
No description provided
Readme 1.1 MiB
Languages
JavaScript 91%
Shell 5.6%
CSS 3.1%
Dockerfile 0.3%