MAATRIX / Блог / Commento в Docker Compose: готовый файл

Commento в Docker Compose: готовый файл

MAATRIX

Disqus тянет на страницу свои трекеры, рекламу и требует согласия на куки — для статического блога или документации это часто перебор. Commento решает ту же задачу — комментарии под постом — без слежки за читателями и без сторонней рекламы, а хранится всё на вашем сервере. Ниже — рабочий docker-compose.yml, разбор переменных окружения и то, как подключить виджет к статическому сайту на Hugo, Astro или любом другом генераторе.

Обсудить статью, задать вопрос или начать новую тему

Есть вопрос по этой статье, идея для обсуждения или просто хотите поделиться опытом? Сообщество MAATRIX ждёт. Для общения, пожалуйста, зарегистрируйтесь в нашем личном кабинете.

Перейти в сообщество →

Что такое Commento и чем он отличается от Disqus

Commento — open-source платформа комментариев, написанная на Go с бэкендом на PostgreSQL. Идея простая: лёгкий JS-виджет, который встраивается в HTML-страницу одной строкой, и сервер, который хранит комментарии, модерирует их и шлёт уведомления по почте.

Ключевые отличия от Disqus и похожих SaaS-сервисов:

Commento (self-hosted)Disqus
Реклама в виджетенетда, на бесплатном тарифе
Трекинг читателейнетсторонние скрипты и куки
Хранение данныхваш серверсерверы Disqus
Markdown в комментарияхдаограниченно
Модерациявстроенная, без ограниченийс лимитами на бесплатном плане
Импорт из Disqus/WordPressесть готовый импортёр

Важный честный момент: разработка оригинального Commento почти остановилась примерно с 2021 года — автор перешёл к другим проектам. Проект по-прежнему работает и его можно развернуть, но если вам нужна активно поддерживаемая ветка с новыми функциями, посмотрите форк Comentario (бывший commento-plusplus) — он API-совместим с Commento и развивается сообществом. Всё, что описано ниже про docker-compose, окружение и встраивание виджета, применимо к обоим вариантам почти без изменений — достаточно поменять образ.

Готовый docker-compose.yml

Стек из двух контейнеров: PostgreSQL для данных и сам Commento. Между ними — внутренняя docker-сеть, наружу торчит только порт приложения, который потом закроем обратным прокси.

version: "3.8"

services:
  commento-db:
    image: postgres:15-alpine
    container_name: commento-db
    restart: unless-stopped
    environment:
      POSTGRES_USER: commento
      POSTGRES_PASSWORD: ${DB_PASSWORD}
      POSTGRES_DB: commento
    volumes:
      - commento_db_data:/var/lib/postgresql/data
    healthcheck:
      test: ["CMD-SHELL", "pg_isready -U commento"]
      interval: 10s
      timeout: 5s
      retries: 5
    networks:
      - commento_net

  commento:
    image: registry.gitlab.com/commento/commento:latest
    container_name: commento
    restart: unless-stopped
    depends_on:
      commento-db:
        condition: service_healthy
    environment:
      COMMENTO_ORIGIN: ${COMMENTO_ORIGIN}
      COMMENTO_PORT: "8080"
      COMMENTO_POSTGRES: postgres://commento:${DB_PASSWORD}@commento-db:5432/commento?sslmode=disable
      COMMENTO_COOKIE_SECRET: ${COOKIE_SECRET}
      COMMENTO_SMTP_ENABLE: "true"
      COMMENTO_SMTP_HOST: ${SMTP_HOST}
      COMMENTO_SMTP_PORT: ${SMTP_PORT}
      COMMENTO_SMTP_USERNAME: ${SMTP_USER}
      COMMENTO_SMTP_PASSWORD: ${SMTP_PASSWORD}
      COMMENTO_SMTP_FROM_ADDRESS: ${SMTP_FROM}
      COMMENTO_SMTP_FROM_NAME: "Comments"
      COMMENTO_FORBID_NEW_OWNERS: "false"
    ports:
      - "127.0.0.1:8080:8080"
    networks:
      - commento_net

networks:
  commento_net:

volumes:
  commento_db_data:

Порт привязан к 127.0.0.1, а не ко всем интерфейсам — снаружи Commento будет доступен только через nginx с SSL, напрямую по IP:8080 никто не достучится. Образ registry.gitlab.com/commento/commento — официальная сборка проекта; перед деплоем стоит проверить в реестре, что тег latest актуален, и при желании закрепить конкретный тег вместо плавающего latest, чтобы обновления не прилетали внезапно.

Нужен сервер под эту задачу?

Разверните VPS MAATRIX за пару минут: NVMe, AMD EPYC, root-доступ, локации UK, США, Франция и РФ. Оплата картой РФ и по СБП.

Арендовать сервер

Переменные окружения: .env файл

Рядом с docker-compose.yml создайте .env:

DB_PASSWORD=сгенерируйте_длинный_пароль
COOKIE_SECRET=сгенерируйте_случайную_строку_32+_символа
COMMENTO_ORIGIN=https://comments.example.com

SMTP_HOST=smtp.yourmailserver.com
SMTP_PORT=587
SMTP_USER=comments@example.com
SMTP_PASSWORD=пароль_от_smtp
SMTP_FROM=comments@example.com

Для DB_PASSWORD и COOKIE_SECRET сгенерируйте случайные значения, а не вписывайте что-то вручную:

openssl rand -base64 32

COMMENTO_ORIGIN — это публичный домен, на котором будет жить сам сервис Commento (не домен вашего блога — это отдельный поддомен вида comments.example.com). Виджет на статическом сайте будет обращаться именно к этому адресу.

SMTP нужен для двух вещей: подтверждение регистрации комментаторов по почте и уведомления модераторам о новых комментариях. Если у вас уже поднят почтовый сервер на этом же провайдере — используйте его; если нет, подойдёт любой внешний SMTP-провайдер с TLS на 587 порту.

Обязательно добавьте .env в .gitignore, если храните конфиг в git — пароли к базе и cookie-секрет не должны попасть в репозиторий.

Nginx как обратный прокси и SSL

Commento слушает 8080 только на localhost, поэтому наружу его открывает nginx (или Caddy — сравнение подходов есть в статье про Caddy или nginx). Конфиг для домена comments.example.com:

server {
    listen 80;
    server_name comments.example.com;
    location / {
        proxy_pass http://127.0.0.1:8080;
        proxy_set_header Host $host;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header X-Forwarded-Proto $scheme;
    }
}

Подробный разбор такого конфига — в статье про nginx как обратный прокси. После того как nginx проксирует HTTP, выпустите сертификат:

sudo certbot --nginx -d comments.example.com

Certbot сам перепишет конфиг на 443 порт с HTTPS и добавит редирект с 80. Без валидного SSL виджет комментариев не будет работать корректно на HTTPS-сайтах — браузер заблокирует смешанный контент.

Первый запуск и создание владельца

Поднимаем стек:

docker compose up -d
docker compose logs -f commento

Дождитесь строки о том, что сервер слушает порт и подключился к базе. Дальше:

  1. Откройте https://comments.example.com в браузере.
  2. Зарегистрируйте первого пользователя — он автоматически станет владельцем (owner), если COMMENTO_FORBID_NEW_OWNERS не выставлен в true.
  3. Подтвердите почту по ссылке из письма (проверьте, что SMTP отработал — смотрите логи контейнера, если письмо не пришло).
  4. В панели управления создайте домен — это адрес вашего блога (например blog.example.com), под который будет выдаваться код виджета.
  5. Сразу после создания домена смените COMMENTO_FORBID_NEW_OWNERS на true в .env и перезапустите docker compose up -d commento, чтобы никто посторонний не мог зарегистрироваться как ещё один владелец.

Встраивание виджета на статический сайт

В панели домена Commento выдаёт готовый сниппет — но общая логика одна для любого генератора статики. В шаблон страницы (в конец, где должен быть блок комментариев) добавляете:

<div id="commento"></div>
<script defer src="https://comments.example.com/js/commento.js"></script>

Для Hugo это обычно партиал layouts/partials/comments.html, подключённый в шаблон одиночной статьи. Если сайт собран через Hugo в Docker Compose или другой SSG, принцип тот же — вставить <div id="commento"> туда, где должны появиться комментарии, скрипт подключить один раз глобально или только на страницах постов.

Виджет сам подтянет комментарии для текущего URL страницы — привязка идёт по window.location.href, поэтому если у сайта меняются пути (например, при переезде на новый домен), старые комментарии "отвяжутся" от статей, если URL изменился.

Модерация, бан по IP, экспорт в CSV, встроенное голосование за комментарии (upvote/downvote) — всё доступно из панели администратора без дополнительной настройки.

Бэкапы, обновления и честные ограничения

Все данные Commento — в PostgreSQL, поэтому бэкап сводится к дампу базы:

docker exec commento-db pg_dump -U commento commento > commento_backup_$(date +%F).sql

Восстановление:

cat commento_backup_2026-08-20.sql | docker exec -i commento-db psql -U commento -d commento

Разумно повесить это в cron и держать несколько последних дампов вне сервера — подробная схема с ротацией и volume-бэкапами описана в статье про бэкап Docker volume на VPS. Если объём комментариев растёт и PostgreSQL на этом сервере обслуживает не только Commento, стоит заранее продумать тюнинг — базовая настройка описана в статье про установку и настройку PostgreSQL на VPS.

Что стоит знать заранее, прежде чем завязываться на Commento:

  • Проект развивается медленно — не ждите быстрых ответов на баги или новых интеграций от мейнтейнера. Форк Comentario активнее в этом смысле.
  • Импорт из Disqus работает через официальный экспорт Disqus (XML), но перед миграцией стоит протестировать на копии — формат экспорта у Disqus периодически меняется.
  • SSO через GitHub/GitLab/Google требует создания OAuth-приложения на стороне провайдера и добавления ключей в переменные окружения (COMMENTO_GITHUB_KEY и аналогичные) — без этого доступна только регистрация по e-mail.
  • Ресурсы под сервис скромные: связке Commento + PostgreSQL для блога с обычной посещаемостью хватает 1 vCPU и 1 ГБ RAM с запасом; для крупных проектов с сотнями комментариев в день стоит смотреть в сторону отдельного сервера под базу.

Нужен сервер под эту задачу?

Разверните VPS MAATRIX за пару минут: NVMe, AMD EPYC, root-доступ, локации UK, США, Франция и РФ. Оплата картой РФ и по СБП.

Арендовать сервер

Нужны сами нейросети для контента?

Генерируйте изображения, видео и озвучку нейросетями на falapi.io — десятки моделей в одном окне. Оплата картой РФ и по СБП.

Частые вопросы

Commento бесплатный и правда без ограничений?

Да, self-hosted версия — open source (MIT), без лимитов на количество комментариев, доменов или модераторов — в отличие от бесплатного тарифа Disqus.

Можно перенести комментарии с Disqus?

Да, в панели администратора Commento есть импорт из XML-экспорта Disqus. Перед боевым переносом проверьте импорт на тестовом домене.

Нужен ли отдельный сервер только под Commento?

Нет, для небольшого блога достаточно развернуть его рядом с самим сайтом на одном VPS — ресурсов уходит немного, а трафик к API комментариев обычно на порядок меньше, чем к статике.

Что делать, если проект Commento заброшен окончательно?

Формат данных в PostgreSQL простой и открытый, миграция на форк (Comentario) или на другую self-hosted систему комментариев технически не заблокирована — данные не привязаны к конкретному бинарнику.

Виджет замедляет загрузку страницы?

Скрипт подключается с defer, поэтому не блокирует рендер основного контента — комментарии подгружаются уже после отрисовки страницы.

Обсудить статью, задать вопрос или начать новую тему

Есть вопрос по этой статье, идея для обсуждения или просто хотите поделиться опытом? Сообщество MAATRIX ждёт. Для общения, пожалуйста, зарегистрируйтесь в нашем личном кабинете.

Перейти в сообщество →