Пошаговая инструкция · Самостоятельная установка
Как установить Zammad на сервер
Пошаговая инструкция для самостоятельной установки. Развернём Zammad официальным Docker Compose, подключим HTTPS и почтовый канал, проверим обработку заявок и настроим копирование с восстановлением.
Что подготовить и как читать инструкцию #
После установки получится служба поддержки по адресу support.example.org: обращения из почты становятся заявками, сотрудники отвечают из общего интерфейса, а история сохраняется в вашей базе. Используем официальный набор контейнеров Zammad с PostgreSQL, Redis, Memcached, Elasticsearch и собственным Nginx. Ручная сборка одного Rails-контейнера не заменяет этот набор.
Для Ubuntu 26.04 устанавливаем Docker Engine и актуальный Compose по подготовке сервера. Официальная конфигурация требует Compose не ниже 2.23.1; старый docker-compose из прежней инструкции может не распознать её. Требования к памяти, диску и нагрузке разобраны в выборе сервера Zammad. Назначение и возможности системы — на странице Zammad.
Команды выполняйте в терминале сервера после подключения по SSH, если шаг не указывает другое место. sudo даёт команде права администратора. Действия в браузере выполняйте на своём компьютере. Домены, IP-адреса и значения ВАШ_ПАРОЛЬ из примеров заменяйте своими до выполнения команды.
Двигайтесь по одному шагу и проверяйте результат перед следующим. Блок с <<EOF или другим именем завершения копируйте целиком: он записывает содержимое одного файла. При работе в nano сохраняйте файл клавишами Ctrl+O, Enter и выходите Ctrl+X. Если прервали SSH-сеанс, снова перейдите в указанный каталог; переменные предыдущего сеанса потребуется задать заново.
Настройка внешнего доступа использует обратный прокси Nginx и Certbot для Nginx. Приложение остаётся доступным на локальном порту; снаружи открыт его HTTPS-домен.
Шаг 1. Проверьте Compose #
Нужен Docker Compose v2 из общей подготовки Ubuntu; старый отдельный docker-compose не используем.
docker compose versionВывод показывает установленную версию Compose.
Шаг 2. Подготовьте настройку Elasticsearch #
Elasticsearch хранит поисковый индекс. vm.max_map_count увеличивает допустимое число отображений памяти; сохраняем настройку, чтобы она осталась после перезагрузки.
printf 'vm.max_map_count=262144\n' | sudo tee /etc/sysctl.d/90-zammad.conf
sudo sysctl --systemsysctl --system применил vm.max_map_count=262144 без ошибки.
Шаг 3. Скачайте официальный комплект #
Создадим каталог и получим релиз Compose v17.5.1. Все следующие команды выполняем в /opt/zammad.
sudo install -d -m 750 -o "$USER" -g "$USER" /opt/zammad
git clone --branch v17.5.1 --depth 1 https://github.com/zammad/zammad-docker-compose.git /opt/zammad
cd /opt/zammadРепозиторий скачан, текущий каталог верный.
Шаг 4. Создайте рабочий файл настроек #
Копируем образец .env.dist в .env и ограничиваем доступ. Сохраняйте прочие настройки комплекта.
cp .env.dist .env
chmod 600 .envФайл .env создан с правами 600.
Шаг 5. Подготовьте два пароля базы #
Сгенерируйте два разных значения: для приложения и административной роли PostgreSQL. Не используйте в рабочем файле слова ЗАМЕНИТЕ.
openssl rand -hex 32
openssl rand -hex 32Оба пароля сохранены и различаются.
Шаг 6. Заполните адрес и реквизиты #
Откройте nano .env, замените соответствующие строки по образцу. NGINX_EXPOSE_PORT оставляет внутренний сайт на localhost. TRUSTED_PROXIES ограничивает адреса, от которых приложение принимает сведения прокси.
COMPOSE_PROJECT_NAME=zammad
VERSION=7.2.1-0000
POSTGRES_PASS=ЗАМЕНИТЕ_ПАРОЛЕМ_ПРИЛОЖЕНИЯ
POSTGRES_SUPERUSER=postgres
POSTGRES_SUPERUSER_PASS=ЗАМЕНИТЕ_ДРУГИМ_ПАРОЛЕМ
NGINX_EXPOSE_PORT=127.0.0.1:8080
NGINX_SERVER_SCHEME=https
ZAMMAD_HTTP_TYPE=https
ZAMMAD_FQDN=support.example.org
RAILS_TRUSTED_PROXIES=127.0.0.1,::1,zammad-nginx
TZ=Europe/MoscowДомен ваш, оба пароля заменены, порт 8080 локальный.
Шаг 7. Проверьте Compose #
Прочитаем описание установки и переменные до скачивания.
cd /opt/zammad
docker compose config --quietconfig --quiet завершился без ошибки.
Шаг 8. Загрузите образы #
Загрузим согласованные компоненты выбранного комплекта: веб, базу, поиск и фоновые процессы.
docker compose pullpull завершился успешно.
Шаг 9. Запустите Zammad #
Первый запуск zammad-init готовит базу; это может занять время. Не запускайте параллельную установку.
docker compose up -dКонтейнеры созданы.
Шаг 10. Проверьте подготовку базы #
ps --all показывает в том числе одноразовый init. Завершившийся успешно init допустим; railsserver должен продолжать работу.
docker compose ps --all
docker compose logs --tail=80 zammad-init zammad-railsserverНет ошибки init и циклического перезапуска Rails.
Шаг 11. Уточните адрес прокси Docker #
Команда показывает gateway сети zammad_default. Добавьте полученный адрес в RAILS_TRUSTED_PROXIES файла .env, сохранив остальные доверенные значения. Затем примените настройки и проверьте localhost.
docker network inspect zammad_default --format '{{(index .IPAM.Config 0).Gateway}}'
nano .env
docker compose up -d
curl -I http://127.0.0.1:8080Внутренний сайт отвечает без ошибки доверия к прокси.
Шаг 12. Сохраните сайт Nginx #
Установите Nginx и Certbot по подготовке Ubuntu, если ещё не установили. Откройте sudo nano /etc/nginx/sites-available/zammad и вставьте файл ниже. Замените все домены своими. Nginx передаёт приложению домен, адрес клиента и протокол; Upgrade и Connection сохраняют WebSocket. До получения сертификата условие $scheme блокирует обычные HTTP-запросы кодом 403, чтобы вход не происходил без шифрования.
/etc/nginx/sites-available/zammadmap $http_upgrade $zammad_connection_upgrade {
default upgrade;
"" close;
}
server {
listen 80;
server_name support.example.org;
client_max_body_size 100m;
location / {
if ($scheme = http) { return 403; }
proxy_pass http://127.0.0.1:8080;
proxy_http_version 1.1;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-Host $host;
proxy_set_header X-Forwarded-For $remote_addr;
proxy_set_header X-Forwarded-Proto $scheme;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection $zammad_connection_upgrade;
proxy_read_timeout 3600s;
proxy_send_timeout 3600s;
proxy_buffering off;
}
}
Сохраните Ctrl+O, Enter, Ctrl+X. В файле пока нет путей к сертификатам: Nginx сможет проверить его до выпуска HTTPS.
Шаг 13. Подключите сайт и проверьте HTTP #
Ссылка подключает сохранённый сайт. nginx -t проверяет все настройки сервера; && разрешает перечитать их только при успешной проверке. curl проверяет ответ для вашего домена. При ошибке остановитесь, исправьте указанную строку и повторите проверку.
sudo ln -sfn /etc/nginx/sites-available/zammad /etc/nginx/sites-enabled/zammad
sudo nginx -t && sudo systemctl reload nginx
curl -I http://support.example.org/Ожидается successful от nginx -t и HTTP 403 для обычного запроса: до HTTPS это намеренная блокировка. DNS должен указывать на сервер, TCP 80/443 — быть доступен у провайдера. Ничего не вводите в форму входа по HTTP.
Шаг 14. Получите сертификат и включите HTTPS #
Каждое имя из команды должно указывать на этот сервер. Certbot проверит домены, сам добавит сертификат в сайт Nginx и включит перенаправление HTTP → HTTPS. Укажите свою почту при запросе и подтвердите условия Let’s Encrypt. Это отдельное действие после успешной проверки HTTP.
sudo /snap/bin/certbot --nginx -d support.example.org --redirectCertbot сообщил об успешной установке. Откройте HTTPS-адрес со своего компьютера: браузер не должен предупреждать о сертификате. Для закрытой панели используйте разрешённый IP. При ошибке исправьте DNS, в том числе AAAA, либо доступ к TCP 80; не повторяйте запросы выпуска подряд.
Шаг 15. Проверьте продление сертификата #
Certbot из snap создаёт службу автоматического продления. Dry-run выполняет пробное продление: настоящие сертификаты не заменяются. Затем проверьте, что таймер планирует следующий запуск. Сохраняйте доступ к TCP 80 для следующих проверок домена.
sudo /snap/bin/certbot renew --dry-run
systemctl list-timers --all 'snap.certbot.renew*'Пробное продление успешно, у таймера есть следующий запуск. Если тест не прошёл, проверьте /var/log/letsencrypt/letsencrypt.log; сначала исправьте причину. После этого можно создавать учётную запись и приглашать пользователей.
Шаг 16. Создайте администратора #
В браузере завершите первоначальный мастер: название организации, администратор и уникальный пароль. Сохраните выбранные реквизиты.
Администратор входит после выхода из первого сеанса.
Шаг 17. Подключите тестовый почтовый ящик #
В административной настройке Channels добавьте отдельный тестовый Email-канал по данным провайдера. Подготовьте входящий IMAP и исходящий SMTP либо выбранный поддерживаемый способ доступа.
Тестовое входящее письмо становится заявкой; ответ агента приходит отправителю.
Шаг 18. Проверьте обычного агента #
Создайте агента, группу обработки и дайте доступ только к этой группе. Назначьте ему тестовую заявку, измените состояние и ответьте.
Изменения сохранены; агент не получает административных прав.
Шаг 19. Создайте штатную копию #
Подготовим закрытый каталог и одноразовый запуск zammad-backup. Копирование выполняется после успешного backup; сохраните настройки вместе с результатом.
cd /opt/zammad
umask 077
ZAMMAD_BACKUP="$HOME/zammad-backup-$(date +%F-%H%M)"
mkdir -p "$ZAMMAD_BACKUP"
docker compose run --rm --env BACKUP_ONCE=true zammad-backup
docker compose cp zammad-backup:/var/tmp/zammad/. "$ZAMMAD_BACKUP/"
cp .env docker-compose.yml "$ZAMMAD_BACKUP/"Файлы копии и конфигурация перенесены во внешнее закрытое хранилище.
Шаг 20. Верните копию на отдельной машине #
Только на изолированном сервере той же версии остановите сервисы и замените /path/to/restore настоящим каталогом копии. Следующая команда подготавливает файлы для штатного восстановления. Рабочую установку не останавливайте ради этого теста.
cd /opt/zammad
docker compose stop
docker compose run --rm --no-deps --entrypoint bash -v /path/to/restore:/restore:ro zammad-backup -c 'cp -a /restore /var/tmp/zammad/'В тестовом backup-контейнере находятся файлы восстановления.
Шаг 21. Запустите восстановление и проверьте журнал #
На тестовой машине запустите комплект и прочитайте журнал backup. При ошибке восстановления не подключайте реальные почтовые каналы.
docker compose up -d
docker compose logs --tail=100 zammad-backupШтатное восстановление завершилось; тестовая заявка доступна.
Шаг 22. Перестройте поисковый индекс #
Поисковый индекс можно пересоздать из восстановленной базы. После завершения найдите тестовую заявку по тексту письма.
docker compose run --rm zammad-railsserver bundle exec rake zammad:searchindex:rebuildЗаявка находится и её переписка сохранена.
Если результат шага отличается #
Вернитесь к проверке того шага, на котором появилась ошибка. Первая ошибка в выводе обычно полезнее последних строк: последующие команды могли не получить нужный файл или работающую службу. Не повторяйте установку целиком поверх частично настроенного приложения.
Если страница не открывается, сначала проверьте домен и входящие порты, затем состояние приложения и его журнал. Если сайт открывается, но отдельное действие не работает, проверьте связанные компоненты — обработчик фоновых задач, почту или права пользователя. Официальные источники в конце статьи относятся к выбранному способу установки.
Настройки внешнего доступа храните вместе с копией приложения: /etc/nginx/sites-available/zammad и /etc/letsencrypt содержат сайт и сертификаты с закрытыми ключами. Архивируйте их с sudo в закрытое хранилище. После восстановления подключите сайт через sites-enabled, выполните sudo nginx -t, затем перечитайте Nginx. Для ошибки 502 сначала проверьте локальное приложение и /var/log/nginx/error.log; для сертификата — /var/log/letsencrypt/letsencrypt.log и таймер продления.