Commento в Docker Compose: готовый файл
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
Дождитесь строки о том, что сервер слушает порт и подключился к базе. Дальше:
- Откройте
https://comments.example.comв браузере. - Зарегистрируйте первого пользователя — он автоматически станет владельцем (owner), если
COMMENTO_FORBID_NEW_OWNERSне выставлен вtrue. - Подтвердите почту по ссылке из письма (проверьте, что SMTP отработал — смотрите логи контейнера, если письмо не пришло).
- В панели управления создайте домен — это адрес вашего блога (например
blog.example.com), под который будет выдаваться код виджета. - Сразу после создания домена смените
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 ждёт. Для общения, пожалуйста, зарегистрируйтесь в нашем личном кабинете.
Перейти в сообщество →