Большая часть этих двадцати минут уйдёт не на команды, а на ожидание: пока обновится DNS-запись и пока certbot выпустит сертификат. Самих действий немного: три отредактированные строки в .env, один запуск скрипта и пара команд в контейнере. Если у вас уже есть VPS и домен, к настройке Telegram-канала можно перейти в течение получаса.

Ниже расписан весь путь от чистого сервера до рабочего бота, принимающего сообщения в Telegram-топиках.

Что понадобится

Если домена и VPS под рукой нет и вы просто хотите посмотреть, как работает бот, для этого есть отдельный вариант: поднять вебхук локально через Cloudflare Tunnel. Он не требует ни сервера, ни домена.

Шаг 1. Направьте домен на сервер

Зарегистрируйте домен и добавьте A-запись, указывающую на IP вашего VPS. Обновление DNS обычно занимает 15-20 минут, и это время можно провести не листая консоль, а параллельно создавая бота в Telegram (шаг 6 ниже).

Шаг 2. Склонируйте репозиторий и настройте .env

Подключитесь к серверу по SSH и создайте каталог проекта:

cd /home/
mkdir yourdomain.com && cd yourdomain.com
git clone https://github.com/prog-time/tg-support-bot.git .

Скопируйте шаблон конфигурации и откройте .env:

cp .env.example .env

В файле нужно поправить два блока: домен и данные для подключения к базе.

MAIN_DOMAIN=example.com
APP_URL=https://example.com

DB_CONNECTION=pgsql
DB_HOST=pgdb
DB_PORT=5432
DB_DATABASE=database_name
DB_USERNAME=username
DB_PASSWORD=password

Токены и ключи для Telegram, VK, AI и остальных интеграций сюда вписывать не нужно: они настраиваются позже прямо в админ-панели и хранятся в базе в зашифрованном виде.

Шаг 3. Запустите установочный скрипт

В корне проекта есть start.sh, который берёт на себя всю рутину: проверяет certbot, сверяет DNS-запись домена с реальным IP сервера, выпускает TLS-сертификат через Let’s Encrypt, подставляет домен в конфиг nginx, поднимает контейнеры и прогоняет миграции.

./start.sh

Внутри скрипт выполняет по порядку:

  1. Проверку и установку certbot, если его ещё нет.
  2. Сверку DNS-записи MAIN_DOMAIN с IP сервера. Если домен ещё не успел разрешиться, скрипт остановится с понятной ошибкой, тогда просто подождите ещё немного и запустите его снова.
  3. Выпуск сертификата (certbot certonly --standalone -d $MAIN_DOMAIN).
  4. Сборку и запуск контейнеров: app, pgdb, nginx, queue, scheduler.
  5. composer update, php artisan migrate, php artisan key:generate.

Первый запуск контейнера app занимает минуту-две: entrypoint ставит зависимости и собирает фронтенд. Прогресс видно через docker compose logs -f app.

Шаг 4. Проверьте, что всё поднялось

Откройте домен в браузере. Страница должна открыться по HTTPS без ошибок сертификата. Затем зайдите на https://ваш-домен/admin и убедитесь, что форма входа отображается корректно.

Шаг 5. Создайте первого администратора

Учётной записи для входа пока нет, она не создаётся автоматически. Зайдите в контейнер app и запустите интерактивную команду:

docker compose exec app bash
php artisan app:create-admin-user

Команда спросит имя, email, пароль и роль (администратор или менеджер). После этого можно входить в /admin/login.

Шаг 6. Подключите Telegram

Пока DNS обновлялся, у вас было время создать бота. Если ещё не создали, сделайте это через @BotFather: команда /newbot, имя, username, в ответ придёт токен.

Дальше:

  1. Создайте приватную Telegram-группу.
  2. Добавьте в неё бота и назначьте администратором.
  3. В настройках группы включите темы (топики), без этого бот не сможет создавать отдельный топик под каждого клиента.
  4. Узнайте ID группы, временно добавив в неё бота вроде @getMyId, затем удалите его.
  5. В админ-панели откройте Настройки → Интеграции → Telegram и вставьте туда токен бота, произвольный секретный ключ вебхука и ID группы.

С этого момента сообщения от пользователей бота будут приходить прямыми топиками в вашу группу.

Если что-то пошло не так

Из вещей, с которыми реально сталкиваются на этом шаге:

Certbot не может получить сертификат, потому что порт 80 занят системным nginx. Проверьте sudo netstat -ltnp | grep -w ':80' и, если порт держит системный nginx, остановите его: sudo systemctl stop nginx.

Контейнер падает с require(autoload.php): Failed to open stream. Значит зависимости Composer не установились, чаще всего из-за прерванного первого запуска. Выполните composer update внутри контейнера app.

Через пару дней после подключения вебхук перестаёт работать. Обычно это блокировка IP вашего VPS со стороны Telegram. Помогает пересоздать вебхук с явным указанием IP: setWebhook?...&ip_address=ваш_ip.

Что дальше

На этом Telegram-канал работает, а остальные (VK, Max, Avito, Email, виджет для сайта) подключаются в том же разделе Настройки → Интеграции, без пересборки контейнеров и без правки .env. Про Avito-интеграцию и её архитектуру расскажем отдельно: там есть нюансы, которые стоит понимать до подключения.