Перейти к содержимому

Установка

  • Linux сервер или VPS
  • Установленные Docker и Docker Compose
  • Доменное имя с SSL-сертификатом
  • Реверс-прокси (Caddy или Nginx)
  • Установленная и настроенная панель Remnawave
  • Файл Docker образа приватной версии (.tar)

Выберите способ установки в зависимости от вашей конфигурации:

Используйте этот способ, если бот будет работать на том же сервере, что и панель Remnawave. Бот подключается к Remnawave через внутреннюю Docker-сеть.

  1. Создайте директорию проекта

    Окно терминала
    mkdir -p /opt/private-remnawave-telegram-shop-bot
    cd /opt/private-remnawave-telegram-shop-bot
  2. Загрузите Docker образ

    Скачайте файл образа из приватного канала.

    Окно терминала
    docker load -i rwp_shop-<VERSION>.tar
  3. Создайте необходимые директории

    Окно терминала
    mkdir -p uploads translations
    sudo chmod -R 777 uploads translations
  4. Скачайте файлы переводов

    Скачайте en.json и ru.json из приватного канала и поместите в папку translations:

    Окно терминала
    # Скопируйте скачанные файлы в директорию translations
    cp en.json ru.json ./translations/
  5. Создайте конфигурацию Docker Compose

    Окно терминала
    nano compose.yaml
    name: rwp_shop
    services:
    bot:
    image: rwp_shop:<VERSION>
    container_name: rwp_shop
    restart: unless-stopped
    ports:
    - "127.0.0.1:9912:8080"
    depends_on:
    db:
    condition: service_healthy
    volumes:
    - ./translations:/translations
    - ./uploads:/uploads
    - /etc/machine-id:/etc/machine-id:ro
    environment:
    - REMNAWAVE_URL=${REMNAWAVE_URL}
    - REMNAWAVE_TOKEN=${REMNAWAVE_TOKEN}
    - TELEGRAM_TOKEN=${TELEGRAM_TOKEN}
    - ADMIN_TELEGRAM_ID=${ADMIN_TELEGRAM_ID}
    - DATABASE_URL=postgres://${POSTGRES_USER}:${POSTGRES_PASSWORD}@db:5432/${POSTGRES_DB}?sslmode=disable
    - BOT_ADMIN_URL=${BOT_ADMIN_URL}
    - LOG_LEVEL=${LOG_LEVEL:-info}
    - ACCESS_LOG_ENABLED=${ACCESS_LOG_ENABLED:-true}
    - ACCESS_LOG_PATH=${ACCESS_LOG_PATH:-}
    - LICENSE_KEY=${LICENSE_KEY:-}
    networks:
    - remnawave-network
    db:
    image: postgres:17-alpine
    container_name: rwp_shop_db
    restart: unless-stopped
    environment:
    - POSTGRES_USER=${POSTGRES_USER}
    - POSTGRES_PASSWORD=${POSTGRES_PASSWORD}
    - POSTGRES_DB=${POSTGRES_DB}
    - TZ=UTC
    ports:
    - "127.0.0.1:9999:5432"
    volumes:
    - rwp_shop_db_data:/var/lib/postgresql/data
    healthcheck:
    test: ["CMD-SHELL", "pg_isready -U ${POSTGRES_USER} -d ${POSTGRES_DB}"]
    interval: 3s
    timeout: 10s
    retries: 3
    networks:
    - remnawave-network
    volumes:
    rwp_shop_db_data:
    networks:
    remnawave-network:
    name: remnawave-network
    external: true
  6. Создайте файл окружения

    Окно терминала
    nano .env
    Окно терминала
    # Подключение к Remnawave (внутренняя Docker-сеть)
    REMNAWAVE_URL=http://remnawave:3000
    REMNAWAVE_TOKEN=ваш_api_токен_remnawave
    # Telegram
    TELEGRAM_TOKEN=ваш_токен_telegram_бота
    ADMIN_TELEGRAM_ID=123456789,987654321
    # База данных
    POSTGRES_USER=postgres
    POSTGRES_PASSWORD=postgres
    POSTGRES_DB=postgres
    # URL админ-панели (требуется HTTPS)
    BOT_ADMIN_URL=https://bot.example.com
    # Логирование (опционально)
    # LOG_LEVEL=info
    # ACCESS_LOG_ENABLED=true
    # ACCESS_LOG_PATH=
    LICENSE_KEY=
  7. Добавьте volume machine-id для лицензии

    Лицензия привязана к уникальному идентификатору вашего сервера. Добавьте этот volume в compose.yaml в секцию bot:

    volumes:
    - ./translations:/translations
    - ./uploads:/uploads
    - /etc/machine-id:/etc/machine-id:ro
  8. Запустите бота

    Окно терминала
    docker compose up -d

Добавьте в Caddyfile:

bot.example.com {
@html path_regexp \.html$|^/$
header @html Cache-Control "no-cache, no-store, must-revalidate"
@assets_js path /assets/*.js
header @assets_js Cache-Control "no-cache, no-store, must-revalidate"
@immutable {
path /assets/*
not path *.js
}
header @immutable Cache-Control "public, max-age=31536000, immutable"
reverse_proxy 127.0.0.1:9912
}

Перезапустите Caddy:

Окно терминала
sudo systemctl reload caddy

Окно терминала
docker compose logs -f bot

Для записи access-логов в файл с автоматической ротацией:

  1. Создайте директорию для логов

    Окно терминала
    mkdir -p logs
    sudo chmod 777 logs
  2. Добавьте volume в compose.yaml

    В секции bot добавьте:

    volumes:
    - ./translations:/translations
    - ./uploads:/uploads
    - ./logs:/logs
  3. Укажите путь к логам в .env

    Окно терминала
    ACCESS_LOG_PATH=/logs/access.log
  4. Перезапустите бота

    Окно терминала
    docker compose up -d
  5. Установите logrotate (если не установлен)

    Окно терминала
    # Debian/Ubuntu
    sudo apt update && sudo apt install -y logrotate
    # CentOS/RHEL/Fedora
    sudo dnf install -y logrotate
  6. Создайте конфиг logrotate

    Окно терминала
    sudo nano /etc/logrotate.d/rwp-shop
    /opt/private-remnawave-telegram-shop-bot/logs/access.log {
    daily
    rotate 14
    compress
    delaycompress
    missingok
    notifempty
    copytruncate
    }
  7. Проверьте конфигурацию

    Окно терминала
    sudo logrotate -d /etc/logrotate.d/rwp-shop

    Флаг -d запускает в debug-режиме без реальной ротации.

  8. Тестовый запуск ротации

    Окно терминала
    sudo logrotate -f /etc/logrotate.d/rwp-shop

    Флаг -f принудительно выполняет ротацию.

ПараметрОписание
dailyРотация раз в день
rotate 14Хранить 14 архивов
compressСжимать архивы gzip
delaycompressСжимать со второго архива
missingokНе ругаться если файла нет
notifemptyНе ротировать пустой файл
copytruncateКопировать и обрезать без перезапуска

По умолчанию загруженные файлы (вложения поддержки, изображения FAQ, файлы партнёров) хранятся локально в директории ./uploads. Опционально можно использовать S3-совместимое хранилище (MinIO, RustFS, AWS S3 и др.) для лучшей масштабируемости и надёжности.

  1. Добавьте переменные S3 в .env

    Окно терминала
    # S3 хранилище (опционально)
    S3_ENABLED=true
    S3_ENDPOINT=http://rustfs:9000
    S3_ACCESS_KEY=your_access_key
    S3_SECRET_KEY=your_secret_key
    S3_PUBLIC_URL=https://s3.example.com
  2. Добавьте сервис S3 в compose.yaml (при использовании RustFS)

    rustfs:
    image: ghcr.io/rustfs/rustfs:latest
    container_name: rwp_shop_rustfs
    restart: unless-stopped
    command: server /data --console-address ":9001"
    environment:
    - RUSTFS_ROOT_USER=your_access_key
    - RUSTFS_ROOT_PASSWORD=your_secret_key
    volumes:
    - rustfs_data:/data
    ports:
    - "127.0.0.1:9001:9001"
    networks:
    - remnawave-network

    Добавьте volume:

    volumes:
    rwp_shop_db_data:
    rustfs_data:
  3. Настройте reverse proxy для S3

    Добавьте поддомен для публичного доступа к S3 (требуется для presigned URLs):

    s3.example.com {
    reverse_proxy rustfs:9000
    }
  4. Перезапустите бота

    Окно терминала
    docker compose up -d

СервисВнутренний портРекомендуемый внешний
Bot HTTP80809912 или 12345
PostgreSQL5432-

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

  1. Откройте https://bot.example.com в Telegram Mini App
  2. Войдите с вашим админским Telegram-аккаунтом
  3. Настройте параметры в админ-панели:
    • Платёжные системы
    • Тарифные планы
    • Брендинг
    • Роли и разрешения

Все остальные настройки управляются через UI админ-панели.


Чтобы добавить кнопку “Open” в Telegram, которая открывает личный кабинет вместо набора команд:

  1. Откройте @BotFather
  2. Выберите вашего бота
  3. Перейдите в Bot SettingsMenu Button
  4. Укажите URL вашего дашборда:
    https://bot.example.com

Это добавит кнопку в чате Telegram, которая открывает Mini App с личным кабинетом пользователя.