- prod_district_: pipe-delimited format (multi-word names safe) + handleDistrictBack shows categories (admin sees disabled locations via getLocationsByCountryAndCityAdmin)\n- admin_users: handleUserListBack (viewUserPage(0) edit)\n- current_page/current_quantity/no_action: no-op exact routes (no 'No handler' warns)\n- Audit: all 78 generated callbacks cross-checked — no overlaps, none missing\n- 48 tests pass; bump v1.2.6\n\t\t\n\t\n\n
\n\t\t\n\t\t\t\n\t\t\t\t\n\t\t\t\tREADME.md\n\t\t\t\n\t\t\n\t\t\n\t
\n\n\tTelegram Shop Bot
\nТелеграм-бот для организации онлайн-продаж через Telegram с поддержкой криптовалют, WireGuard VPN и Tor-прокси для доступа к админ-панели через onion-адрес.
\nВозможности
\n- \n
- Каталог товаров с категориями и фильтрацией по локациям \n
- Покупки с оплатой криптовалютами (BTC, ETH, LTC, USDT, USDC) \n
- Управление криптокошельками (создание, пополнение, баланс) \n
- История транзакций и покупок \n
- SaaS-система с автоматическим расчётом комиссий \n
- Мультиязычность (i18n) — английский, испанский, немецкий с переключением в боте \n
- Админ-панель на порту 3001 с вкладкой локализации \n
- Tor-прокси с двумя onion-сервисами (SSH + админка) \n
- WireGuard VPN для безопасных транзакций \n
Быстрый старт (одна команда)
\nТребования
\n- \n
- Любое устройство с Docker: x86_64 (PC, сервер) или ARM64 (Orange Pi, Raspberry Pi) \n
- 512 МБ RAM минимум (Orange Pi Zero 2 поддерживается) \n
Установка
\ngit clone <repo-url> && cd telegram-shop\nbash install.sh\nСкрипт автоматически:
\n- \n
- Определит архитектуру (x86_64 / ARM64 / ARMv7) \n
- Установит Docker если не установлен \n
- Создаст
.envиз шаблона \n - Проверит обязательные переменные \n
- Соберёт Docker-образ под текущую архитектуру \n
- Запустит контейнер и проверит health-check \n
Ручная установка
\n# 1. Клонировать\ngit clone <repo-url> && cd telegram-shop\n\n# 2. Создать .env из шаблона\ncp .env.example .env\nnano .env # заполнить BOT_TOKEN, ADMIN_IDS, ENCRYPTION_KEY\n\n# 3. Собрать и запустить\ndocker compose up -d --build\n\n# 4. Проверить статус\ndocker compose ps\ncurl http://localhost:3001/health\nНастройка .env
\nСкопируйте .env.example в .env и заполните:
| Переменная | \nОбязательно | \nОписание | \n
|---|---|---|
BOT_TOKEN | \n✅ | \nТокен Telegram бота (@BotFather) | \n
ADMIN_IDS | \n✅ | \nID администраторов через запятую | \n
ENCRYPTION_KEY | \n✅ | \nКлюч шифрования (32 байта hex) | \n
ADMIN_SECRET | \n✅ | \nСекрет для админ-панели | \n
ADMIN_PORT | \n— | \nПорт админ-панели (по умолчанию 3001) | \n
ADMIN_URL | \n— | \nПолный URL админ-панели (для фото товаров) | \n
SUPER_ADMIN_IDS | \n— | \nID супер-админов | \n
SUPPORT_LINK | \n— | \nСсылка на поддержку | \n
DEFAULT_LANGUAGE | \n— | \nЯзык по умолчанию (en, es, de; по умолчанию en) | \n
SSH_HOST_IP | \n— | \nКуда Tor перенаправляет SSH (по умолчанию host.docker.internal) | \n
SHOP_CONTAINER | \n— | \nИмя контейнера магазина (по умолчанию telegram_shop_prod) | \n
WG_ENABLED | \n— | \ntrue / false (по умолчанию false) | \n
WG_PRIVATE_KEY | \n— | \nПриватный ключ WireGuard | \n
WG_PUBLIC_KEY | \n— | \nПубличный ключ WireGuard | \n
WG_PRESHARED_KEY | \n— | \nPre-shared ключ WireGuard | \n
WG_ENDPOINT | \n— | \nАдрес сервера WireGuard | \n
WG_ADDRESS | \n— | \nАдрес интерфейса WireGuard | \n
WG_DNS | \n— | \nDNS для WireGuard | \n
Генерация ключа шифрования:
\nnode -e \"console.log(require('crypto').randomBytes(32).toString('hex'))\"\nTor Proxy
\nПроект включает Tor-прокси для доступа к SSH и админ-панели через onion-адреса.
\nАрхитектура
\nInternet → Tor Network → tor-proxy контейнер\n ├── Onion #1 :22 → хост SSH\n └── Onion #2 :80 → telegram_shop_prod:3001\n (через Docker сеть tor_proxy_net)\nФайлы Tor-прокси
\n| Файл | \nНазначение | \n
|---|---|
tor-proxy/Dockerfile | \nAlpine + Tor образ | \n
tor-proxy/entrypoint.sh | \nГенерация torrc из env vars, валидация, запись onion-адресов | \n
tor-proxy/get-onions.sh | \nСкрипт чтения onion-адресов и обновления .env | \n
tor-proxy/hosts/ | \nДиректория для onion-hosts.txt (bind mount) | \n
После запуска
\nOnion-адреса автоматически сохраняются в tor-proxy/hosts/onion-hosts.txt. Обновить .env:
./tor-proxy/get-onions.sh\nВывод:
\n============================================================\n Onion services\n============================================================\n SSH : xxxxx.onion (port 22 -> host SSH)\n Admin : yyyyy.onion (port 80 -> telegram_shop_prod:3001)\n============================================================\n\nUsage:\n SSH : torify ssh user@xxxxx.onion\n Admin : open http://yyyyy.onion in Tor Browser\nПеременные Tor
\n| Переменная | \nПо умолчанию | \nОписание | \n
|---|---|---|
SSH_HOST_IP | \nhost.docker.internal | \nКуда Tor перенаправляет SSH | \n
SHOP_CONTAINER | \ntelegram_shop_prod | \nКонтейнер магазина | \n
ADMIN_PORT | \n3001 | \nПорт админки | \n
Поддерживаемые устройства
\n| Устройство | \nАрхитектура | \nRAM | \nСтатус | \n
|---|---|---|---|
| PC / Сервер | \nx86_64 | \n≥ 512 МБ | \n✅ | \n
| Orange Pi Zero 2 | \nARM64 (H616) | \n512 МБ | \n✅ | \n
| Raspberry Pi 4 | \nARM64 | \n≥ 1 ГБ | \n✅ | \n
| Raspberry Pi 3 | \nARM64 | \n1 ГБ | \n✅ | \n
| Raspberry Pi 2 | \nARMv7 | \n1 ГБ | \n✅ | \n
Docker автоматически собирает нативные модули (better-sqlite3, tiny-secp256k1) под архитектуру хоста.
Архитектура Docker
\n┌──────────────────────────────────────────────────────────┐\n│ docker-compose │\n│ │\n│ ┌────────────────────────┐ ┌─────────────────────────┐ │\n│ │ telegram_shop_prod │ │ tor-proxy │ │\n│ │ (node:22-alpine) │ │ (alpine:3.18 + tor) │ │\n│ │ │ │ │ │\n│ │ Port 3001 │◄─┤ HiddenService :80 │ │\n│ │ Bot + Admin Panel │ │ HiddenService :22 → SSH│ │\n│ │ │ │ │ │\n│ │ Net: default │ │ Net: default + proxy_net │ │\n│ │ + tor_proxy_net │ │ │ │\n│ └────────────────────────┘ └─────────────────────────┘ │\n│ │ │ │\n│ Volumes: Volumes: │\n│ db/, uploads/, .env tor_data, hosts/ │\n└──────────────────────────────────────────────────────────┘\nСети Docker
\n| Сеть | \nНазначение | \n
|---|---|
default | \nВнутренняя связь между контейнерами | \n
tor_proxy_net | \nСвязь tor-proxy ↔ telegram_shop_prod | \n
Команды управления
\n# Запуск\ndocker compose up -d\n\n# Пересборка после изменений\ndocker compose up -d --build\n\n# Логи\ndocker compose logs -f\n\n# Логи конкретного сервиса\ndocker compose logs -f tor-proxy\ndocker compose logs -f telegram_shop_prod\n\n# Стоп\ndocker compose down\n\n# Рестарт\ndocker compose restart\n\n# Статус\ndocker compose ps\n\n# Health-check\ncurl http://localhost:3001/health\n\n# Onion-адреса\ndocker exec tor-proxy cat /var/lib/tor/ssh/hostname\ndocker exec tor-proxy cat /var/lib/tor/admin/hostname\n\n# Обновить .env с onion-адресами\n./tor-proxy/get-onions.sh\nWireGuard
\nWireGuard по умолчанию отключен (WG_ENABLED=false). Для включения:
- \n
- Установите
WG_ENABLED=trueв.env\n - Заполните ключи WireGuard в
.env\n - Перезапустите:
docker compose restart\n
Контейнер требует NET_ADMIN и sysctl net.ipv4.conf.all.src_valid_mark=1 для WireGuard. Эти привилегии заданы в docker-compose.yml.
Мультиязычность (i18n)
\nБот поддерживает 3 языка: 🇬🇧 English, 🇪🇸 Español, 🇩🇪 Deutsch.
\nКак это работает
\n- \n
/start— всегда показывает выбор языка с флагами \n/language— команда для смены языка в любой момент \n- Профиль — кнопка «🌐 Change Language» рядом с «Set Location» \n
- Выбранный язык сохраняется в БД (
users.language) и используется во всех сообщениях \n - Интерполяция:
t('key', { param: value })→{{param}}в строках \n - Fallback: запрошенный язык → English → ключ \n
Структура i18n
\nsrc/i18n/\n├── index.js # tForUser(), tForLang(), LANGUAGE_NAMES, AVAILABLE_LANGUAGES\n└── locales/\n ├── en.json # 201 ключ, английский\n ├── es.json # 201 ключ, испанский\n └── de.json # 201 ключ, немецкий\nАдмин-панель локализации
\nВкладка «Локализация» в админ-панели (/locales) позволяет просматривать и редактировать все ключи перевода в таблице с сохранением в JSON-файлы.
Добавление нового языка
\n- \n
- Создать
src/i18n/locales/<code>.jsonпо шаблонуen.json\n - Добавить код в
AVAILABLE_LANGUAGESиLANGUAGE_NAMESвsrc/i18n/index.js\n - Язык автоматически появится в выборе при
/startи/language\n
Безопасность
\n- \n
.envмонтируется только для чтения (:ro) \n- Порт 3001 доступен из LAN и через Tor onion \n
- Onion-адреса сохраняются в volume (персистентность при перезапуске) \n
- Tor hidden services с валидацией env vars \n
- Нативные модули компилируются в builder-стейдже \n
devDependenciesне попадают в production-образ \n- Тестовые файлы исключены из Docker-образа (
.dockerignore) \n node_modulesхоста не попадают в образ (.dockerignore) \n
Устойчивость к ошибкам
\n- \n
- Бот не крашит контейнер при невалидном
BOT_TOKEN: 5 попыток с задержкой 5с, затем бот отключается, админка продолжает работать \n - Комиссионные кошельки не обязательны для старта: при отсутствии логируется предупреждение \n
- При потере связи с Telegram API: polling ошибки логируются, процесс продолжает работать \n
Структура проекта
\n├── src/\n│ ├── admin/ # Админ-панель (Express)\n│ │ ├── routes/ # Роуты админ-панели (вкл. /locales для i18n)\n│ │ ├── views/ # Шаблоны HTML\n│ │ ├── public/ # Статические файлы (CSS)\n│ │ ├── auth.js # Авторизация\n│ │ └── server.js # Express-сервер\n│ ├── config/ # Конфигурация (БД, крипто)\n│ ├── context/ # Контекст и состояния бота\n│ ├── handlers/ # Обработчики команд\n│ │ ├── adminHandlers/ # Обработчики админа\n│ │ └── userHandlers/ # Обработчики пользователя\n│ ├── i18n/ # Интернационализация\n│ │ ├── index.js # tForUser(), tForLang(), LANGUAGE_NAMES\n│ │ └── locales/ # en.json, es.json, de.json (201 ключ)\n│ ├── middleware/ # Промежуточные обработчики\n│ ├── migrations/ # Миграции БД\n│ ├── models/ # Модели данных\n│ ├── router/ # Роутинг Express\n│ ├── services/ # Бизнес-логика\n│ ├── utils/ # Утилиты (логирование, валидация, ошибки)\n│ └── index.js # Точка входа\n├── tor-proxy/ # Tor прокси для SSH и админки\n│ ├── Dockerfile # Alpine + Tor образ\n│ ├── entrypoint.sh # Генерация torrc, валидация env vars\n│ ├── get-onions.sh # Скрипт обновления .env с onion-адресами\n│ └── hosts/ # Директория для onion-hosts.txt\n├── wg/ # WireGuard конфигурация\n│ └── start.sh # Скрипт запуска контейнера\n├── db/ # SQLite база данных (volume)\n├── uploads/ # Загруженные фото (volume)\n├── Dockerfile # Multi-stage сборка магазина\n├── docker-compose.yml # Конфигурация обоих контейнеров\n├── install.sh # Установщик (POSIX sh)\n├── .dockerignore # Исключения из образа\n├── .env.example # Шаблон переменных\n└── package.json\nРазработка
\n# Установка зависимостей\nnpm install\n\n# Запуск в режиме разработки\nnpm run dev\n\n# Тесты\nnpm test\nЛицензия
\nMIT
\n\n\t\t\t\n\t\t