Установка Redmine на Debian 11 и развёртывание через Apache/Passenger и Nginx (HTTPS)
Этот подробный пошаговый гид покажет, как установить и безопасно запустить Redmine на Debian 11: от настройки брандмауэра и баз данных до конфигурации Apache + Passenger и обратного прокси Nginx с HTTPS. Также включены рекомендации по резервному копированию, жёсткой настройке безопасности, отказоустойчивости и проверки приёмки.

Redmine — свободная система управления проектами и отслеживания задач, написанная на Ruby on Rails. Поддерживает интеграцию с системами контроля версий, содержит браузер репозитория и средство просмотра diff, вики и форумы проекта, учёт времени и ролевой доступ. Кросс-платформенная и кросс‑базовая, поддерживает многие языки.
В этом руководстве — пошаговая инструкция по установке Redmine на сервер под Debian 11 с использованием MySQL, RVM/Ruby, Apache + Phusion Passenger и Nginx в качестве обратного прокси с SSL.
Кому пригодится этот материал
- Системным администраторам, которым нужно развернуть Redmine на Debian 11.
- Девопс-инженерам, настраивающим безопасный внешний доступ через HTTPS.
- Командам, переходящим с тестовой инстанции на продакшен.
Что вы получите в итоге
- Рабочая инстанция Redmine, доступная по HTTPS через Nginx.
- Конфигурация Apache + Passenger для запуска Rails-приложения в продакшене.
- Шаблоны резервного копирования, политики безопасности и проверки приёмки.
Требования перед началом
- Сервер с Debian 11.
- Пользователь без постоянного sudo (non-sudo) с правами root через sudo.
- UFW (Uncomplicated Firewall) включён и работает.
- Набор вспомогательных пакетов (wget, curl, nano и др.).
Некоторые команды для установки пакетов (выполните как sudo):
$ sudo apt install wget curl nano software-properties-common dirmngr apt-transport-https gnupg2 ca-certificates lsb-release unzip debian-archive-keyring -yОбновите систему:
$ sudo apt update && sudo apt upgrade -yВажно: заменяйте примеры паролей, имён хостов и доменов на свои реальные значения.
Шаг 1 — Конфигурация брандмауэра (UFW)
Разрешите HTTP и HTTPS и временно порт Rails (3000).
Проверка статуса:
$ sudo ufw statusРазрешаем порты:
$ sudo ufw allow http
$ sudo ufw allow https
$ sudo ufw allow 3000Проверьте ещё раз:
$ sudo ufw statusПодсказка: после настройки Nginx порт 3000 можно закрыть командой sudo ufw delete allow 3000.
Шаг 2 — Установка Apache
Мы будем использовать Apache как сервер приложений вместе с Phusion Passenger.
$ sudo apt install apache2 -yПроверка статуса Apache:
$ sudo systemctl status apache2(Вы увидите вывод systemd — в примерах выше показан типичный ответ с Active: active (running)).
Шаг 3 — Установка и настройка MySQL
Debian 11 не содержит MySQL в стандартных репозиториях в тех же версиях, поэтому подключаем официальный репозиторий MySQL.
Импорт ключа GPG:
$ curl https://repo.mysql.com/RPM-GPG-KEY-mysql-2022 | gpg --dearmor | sudo tee /usr/share/keyrings/mysql.gpg >/dev/nullСоздаём файл репозитория:
$ echo "deb [signed-by=/usr/share/keyrings/mysql.gpg arch=amd64] http://repo.mysql.com/apt/debian/ `lsb_release -cs` mysql-8.0" | sudo tee /etc/apt/sources.list.d/mysql.listОбновляем список пакетов и устанавливаем MySQL:
$ sudo apt update
$ sudo apt install mysql-server -yВо время установки укажите сильный пароль для root. Redmine поддерживает caching_sha2_password — выберите современный механизм.
Запустите скрипт защиты установки MySQL:
$ sudo mysql_secure_installationРекомендуется включить Validate Password и выбрать уровень 2 (STRONG) для продакшена.
Пример создания базы и пользователя для Redmine:
$ mysql -u root -p
mysql> CREATE USER 'redmine'@'localhost' IDENTIFIED BY 'Your_password2';
mysql> CREATE DATABASE redmine CHARACTER SET utf8mb4;
mysql> GRANT ALL PRIVILEGES ON redmine.* TO 'redmine'@'localhost';
mysql> exitПримечание: используйте кодировку utf8mb4 для корректной поддержки эмодзи и многоязычных данных. Для старых версий MySQL (<5.7.7) используйте «utf8».
Шаг 4 — Установка Ruby и зависимостей (RVM)
Redmine 5.x совместим с Ruby 3.1.x. Debian 11 поставляет Ruby 2.7, поэтому используем RVM для установки актуальной версии.
Импорт ключа RVM:
$ gpg2 --keyserver keyserver.ubuntu.com --recv-keys 409B6B1796C275462A1703113804BB82D39DC0E3 7D2BAF1CF37B13E2069D6956105BD0E739499BDBУстановка RVM:
$ \curl -sSL https://get.rvm.io | bash -s stableЗагрузите скрипты RVM в текущую сессию:
$ source ~/.rvm/scripts/rvmУстановите Ruby (в примере — 3.1.3):
$ rvm install ruby-3.1.3
$ ruby -v
ruby 3.1.3p185 (2022-11-24 revision 1a6b16756e) [x86_64-linux]Установите системные зависимости, необходимые для сборки gem’ов и работы Redmine:
$ sudo apt install libxml2-dev libxslt1-dev zlib1g-dev imagemagick libmagickwand-dev libmysqlclient-dev apache2-dev build-essential libcurl4-openssl-dev -yШаг 5 — Установка Redmine
Скачайте архив Redmine (в примере 5.0.5):
$ wget https://www.redmine.org/releases/redmine-5.0.5.tar.gzЕсли получите ошибку сертификата, используйте флаг --no-check-certificate:
$ wget https://www.redmine.org/releases/redmine-5.0.5.tar.gz --no-check-certificateРаспакуйте и переместите файлы в директорию веб‑сервера:
$ tar xfz redmine-5.0.5.tar.gz
$ sudo mv redmine-5.0.5 /var/www/redmine
$ cd /var/www/redmineСкопируйте примеры конфигурационных файлов:
$ cp config/configuration.yml.example config/configuration.yml
$ cp config/database.yml.example config/database.yml
$ cp public/dispatch.fcgi.example public/dispatch.fcgiОтредактируйте config/database.yml и укажите данные MySQL (замените пароль):
production:
adapter: mysql2
database: redmine
host: localhost
username: redmine
password: "Your_password2"
encoding: utf8mb4Установите bundler и зависимости gem’ов:
$ gem install bundler
$ bundle config set --local without 'development test'
$ bundle installЕсли возникнут проблемы с версиями gem’ов, можно попробовать восстановить gem’ы:
$ gem pristine --allДобавьте зависимость webrick (нужно для некоторых версий Ruby/Rails):
$ bundle add webrickСгенерируйте секретный токен сессий:
$ bundle exec rake generate_secret_tokenСоздайте структуру базы и загрузите стандартные данные:
$ RAILS_ENV=production bundle exec rake db:migrate
$ RAILS_ENV=production REDMINE_LANG=en bundle exec rake redmine:load_default_dataСоздайте необходимые каталоги и выставьте права (корректируйте $USER):
$ mkdir -p tmp/pdf
$ mkdir -p public/plugin_assets
$ sudo chown -R $USER:$USER files log tmp public/plugin_assets
$ sudo chmod -R 755 /var/www/redmine/Для быстрой проверки можно запустить встроенный сервер WEBrick (только для теста):
$ bundle exec rails server -u webrick -e productionПосле запуска откройте http://

По умолчанию логин: admin, пароль: admin — систему попросит сменить пароль при первом входе.

После успешной авторизации вы попадёте на страницу аккаунта.

Нажмите Ctrl+C в терминале, чтобы остановить тестовый сервер WEBrick.
Шаг 6 — Установка Phusion Passenger (модуль Apache)
Passenger оптимально интегрируется с Apache и будет управлять Rails-процессами.
$ gem install passenger
$ passenger-install-apache2-moduleИнсталлятор покажет, какие строчки нужно добавить в конфигурацию Apache (LoadModule, PassengerRoot, PassengerDefaultRuby). Скопируйте их и не закрывайте инсталлятор до тех пор, пока не внесёте изменения.
Шаг 7 — Конфигурация Apache для Passenger и Redmine
Создайте файл конфигурации модуля Passenger:
$ sudo nano /etc/apache2/conf-available/00-passenger.confВставьте строки, которые предоставил инсталлятор Passenger, например:
LoadModule passenger_module /home/youruser/.rvm/gems/ruby-3.1.3/gems/passenger-6.0.17/buildout/apache2/mod_passenger.so
PassengerRoot /home/youruser/.rvm/gems/ruby-3.1.3/gems/passenger-6.0.17
PassengerDefaultRuby /home/youruser/.rvm/gems/ruby-3.1.3/wrappers/ruby
Создайте виртуальный хост для Redmine:
$ sudo nano /etc/apache2/sites-available/redmine.confПример содержимого:
Listen 3000
PassengerRoot /home/youruser/.rvm/gems/ruby-3.1.3/gems/passenger-6.0.17
PassengerDefaultRuby /home/youruser/.rvm/gems/ruby-3.1.3/wrappers/ruby
ServerName redmine.example.com
DocumentRoot "/var/www/redmine/public"
CustomLog ${APACHE_LOG_DIR}/redmine_access.log combined
ErrorLog ${APACHE_LOG_DIR}/redmine_error.log
LogLevel warn
Options Indexes ExecCGI FollowSymLinks
Require all granted
AllowOverride all
Примечание: замените /home/youruser/ на реальный путь пользователя, у которого установлен RVM.
Откройте основной конфиг Apache и убедитесь, что ServerName задан:
$ sudo nano /etc/apache2/apache2.conf(В Debian основной файл — /etc/apache2/apache2.conf или /etc/httpd/conf/httpd.conf в других системах). Найдите ServerName и укажите localhost.
Активируйте сайт и конфигурацию Passenger:
$ sudo a2ensite redmine.conf
$ sudo a2enconf 00-passenger.conf
$ sudo apachectl configtest
Syntax OK
$ sudo systemctl restart apache2Теперь Redmine доступен по адресу http://redmine.example.com:3000 (ещё без HTTPS).
Шаг 8 — Установка Nginx (обратный прокси)
Debian 11 содержит старую версию Nginx; для актуальной версии подключим официальный репозиторий.
Импорт ключа и добавление репозитория:
$ curl https://nginx.org/keys/nginx_signing.key | gpg --dearmor | sudo tee /usr/share/keyrings/nginx-archive-keyring.gpg >/dev/null
$ echo "deb [signed-by=/usr/share/keyrings/nginx-archive-keyring.gpg] http://nginx.org/packages/debian `lsb_release -cs` nginx" | sudo tee /etc/apt/sources.list.d/nginx.list
$ sudo apt update
$ sudo apt install nginx -y
$ sudo nginx -vЧтобы избежать конфликта портов, измените порт Apache с 80 на 8080:
$ sudo nano /etc/apache2/ports.confИзмените Listen 80 на:
Listen 8080Отключите сайт по умолчанию и перезапустите Apache:
$ sudo a2dissite 000-default.conf
$ sudo systemctl restart apache2Запустите Nginx:
$ sudo systemctl start nginx
$ sudo systemctl status nginxШаг 9 — Установка SSL (Certbot через Snap)
Установим Certbot через Snap для получения сертификата Let’s Encrypt.
$ sudo apt install snapd -y
$ sudo snap install core && sudo snap refresh core
$ sudo snap install --classic certbot
$ sudo ln -s /snap/bin/certbot /usr/bin/certbotЗапрос сертификата (пример):
$ sudo certbot certonly --nginx --agree-tos --no-eff-email --staple-ocsp --preferred-challenges http -m admin@example.com -d redmine.example.comСертификаты будут сохранены в /etc/letsencrypt/live/redmine.example.com.
Создайте Diffie-Hellman параметры для повышения безопасности TLS:
$ sudo openssl dhparam -dsaparam -out /etc/ssl/certs/dhparam.pem 4096Проверьте автоматическое обновление:
$ sudo certbot renew --dry-runЕсли dry-run проходит без ошибок, автоматическое обновление настроено.
Шаг 10 — Конфигурация Nginx как обратного прокси (HTTPS)
Создайте файл /etc/nginx/conf.d/redmine.conf и вставьте:
# Redirect all non-encrypted to encrypted
server {
listen 80;
server_name redmine.example.com;
return 301 https://$host$request_uri;
}
server {
listen 443 ssl http2;
server_name redmine.example.com;
ssl_certificate /etc/letsencrypt/live/redmine.example.com/fullchain.pem;
ssl_certificate_key /etc/letsencrypt/live/redmine.example.com/privkey.pem;
ssl_trusted_certificate /etc/letsencrypt/live/redmine.example.com/chain.pem;
ssl_session_timeout 5m;
ssl_session_cache shared:MozSSL:10m;
ssl_session_tickets off;
ssl_protocols TLSv1.2 TLSv1.3;
ssl_prefer_server_ciphers on;
ssl_ciphers ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-CHACHA20-POLY1305:ECDHE-RSA-CHACHA20-POLY1305:DHE-RSA-AES128-GCM-SHA256:DHE-RSA-AES256-GCM-SHA384;
ssl_ecdh_curve X25519:prime256v1:secp384r1:secp521r1;
ssl_stapling on;
ssl_stapling_verify on;
ssl_dhparam /etc/ssl/certs/dhparam.pem;
resolver 8.8.8.8;
access_log /var/log/nginx/redmine.access.log main;
error_log /var/log/nginx/redmine.error.log;
location / {
proxy_pass http://localhost:3000;
proxy_redirect off;
proxy_buffering off;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
}
}Добавьте в основной nginx.conf строку server_names_hash_bucket_size 64; перед include /etc/nginx/conf.d/*.conf; и проверьте конфигурацию:
$ sudo nginx -t
$ sudo systemctl restart nginxПосле этого Redmine должен быть доступен по адресу: https://redmine.example.com
Не забудьте удалить правило UFW для порта 3000, если оно больше не требуется:
$ sudo ufw delete allow 3000Резюме основных путей и портов
- Каталог Redmine: /var/www/redmine
- Публичная папка: /var/www/redmine/public
- Порты: Apache (внутренний) 3000, внешний через Nginx 80/443
- SSL-сертификаты: /etc/letsencrypt/live/redmine.example.com
- DH-параметры: /etc/ssl/certs/dhparam.pem
Безопасность и жёсткая настройка (рекомендации)
Important: всегда заменяйте дефолтные пароли и ключи, используйте отдельные учётные записи и минимальные привилегии.
Рекомендации:
- Запустите Redmine от отдельного системного пользователя или используйте права владельца каталогов только для нужных директорий.
- Ограничьте доступ к MySQL только с localhost или через сокет.
- Закройте ненужные порты в UFW (оставьте только 80/443 и SSH).
- Регулярно обновляйте систему и Ruby/gem’ы.
- Включите логирование доступа и ошибок, настройте ротацию логов (logrotate).
- Рассмотрите использование Fail2Ban для защиты от брут‑форса на /login.
- Применяйте строгие права на файлы: каталоги — 755, конфигурационные файлы — 640/600.
Пример базовой команды для выставления прав:
$ sudo chown -R www-data:www-data /var/www/redmine
$ sudo find /var/www/redmine -type d -exec chmod 755 {} \;
$ sudo find /var/www/redmine -type f -exec chmod 644 {} \;(Если вы используете другого пользователя Apache/Passenger, замените www-data на него.)
Резервное копирование и восстановление (SOP)
Минимальный план бэкапа для Redmine:
- Полный дамп базы данных.
- Копирование директорий: files, log, tmp, public/plugin_assets, config.
- Архивирование и перенос на удалённый носитель.
Пример скрипта резервного копирования (bash):
#!/bin/bash
BACKUP_DIR=/backup/redmine
TIMESTAMP=$(date +"%F_%H%M")
mkdir -p $BACKUP_DIR/$TIMESTAMP
# db dump
mysqldump -u root -p'ROOT_PASSWORD' redmine > $BACKUP_DIR/$TIMESTAMP/redmine.sql
# files and config
tar czf $BACKUP_DIR/$TIMESTAMP/redmine_files.tgz /var/www/redmine/files /var/www/redmine/config
# rotate: keep 7 last
ls -1dt $BACKUP_DIR/* | sed -n '8,$p' | xargs -r rm -rfВосстановление базы:
$ mysql -u root -p redmine < redmine.sqlКопируйте каталоги обратно и восстановите права.
Обновление Redmine — краткая методика
- Создайте бэкап БД и файлов (см. выше).
- Остановите приложение (если запущено как сервис).
- Замените кодовую базу Redmine на новую версию (или выполните
git/скачайте архив). - Обновите зависимости:
bundle install. - Выполните миграции:
RAILS_ENV=production bundle exec rake db:migrate. - Перезапустите Passenger/Apache и Nginx.
Проверьте совместимость плагинов перед обновлением.
Альтернативные подходы
- Docker: использовать официальные образы Redmine для изоляции окружения (быстрая развёртка, проще миграция, но требует опыта с контейнерами).
- PostgreSQL вместо MySQL: более предпочтительная СУБД для многих Rails-приложений; Redmine полностью поддерживает PostgreSQL.
- rbenv вместо RVM: альтернативный менеджер версий Ruby, более простой в средах CI/CD.
Когда этот подход не подходит:
- Нужна масштабируемость на уровне нескольких VM/контейнеров — рассмотрите кластер с базой данных и балансировкой нагрузки.
- Ограниченные ресурсы у сервера (низкая оперативная память) — используйте облегчённый стек или Docker с лимитами.
Отладка и типичные ошибки
- Проблемы с правами доступа к файлам — проверьте владельца и права каталогов files, tmp и log.
- Ошибки gem’ов при
bundle install— убедитесь в правильной версии Ruby и установленных dev-библиотеках (libmysqlclient-dev и т.д.). - Passenger не загружается — проверьте строки LoadModule/PassengerRoot/PassengerDefaultRuby и права на mod_passenger.so.
- Nginx проксирует 502/504 — проверьте, слушает ли Apache/Passenger на порту 3000 и запущен ли процесс Rails.
Полезные команды для диагностики:
$ sudo tail -n 200 /var/log/apache2/redmine_error.log
$ sudo tail -n 200 /var/log/nginx/redmine.error.log
$ sudo systemctl status apache2
$ sudo systemctl status nginx
$ ps aux | grep passenger
$ bundle exec rails server -e productionТесты и критерии приёмки
Критерии приёмки для продакшен-инстанции:
- Страница входа доступна по HTTPS и валидному сертификату.
- Вход по admin/пароль (с последующей сменой пароля) работает.
- Создание проекта, задача и комментирование проходят успешно.
- Загрузка и просмотр вложений (files) работают нормально.
- Резервное копирование базы выполняется и тестовый бэкап успешно восстанавливается.
Тест-кейсы (кратко):
- TC1: Открыть https://redmine.example.com — страница должна загрузиться без ошибок.
- TC2: Войти под admin, сменить пароль, выйти и войти снова.
- TC3: Создать проект, создать задачу, назначить участника.
- TC4: Загрузить файл в задачу, скачать и сравнить контрольную сумму.
- TC5: Выполнить
certbot renew --dry-run— без ошибок.
Контрольные шаблоны / чек‑листы по ролям
Sysadmin:
- Установить OS-обновления и патчи.
- Настроить UFW и Fail2Ban.
- Настроить бэкапы.
DevOps:
- Наладить CI для деплоя (если требуется).
- Настроить мониторинг и алертинг (Prometheus/Alertmanager, или сторонние решения).
Project Manager / Администратор Redmine:
- Сменить дефолтный пароль admin.
- Создать проекты, роли и права доступа.
- Настроить плагины и тестировать их на staging.
Советы по производительности
- Passenger управляет процессами автоматом; при высокой нагрузке настройте
PassengerMaxPoolSizeи related параметры. - Используйте кеширование (memcached/Redis) для ускорения страниц, если много одновременных пользователей.
- В случае большого объёма вложений храните их на выделённом диске или в S3‑совместимом хранилище (через плагины).
Плагины и совместимость
- Перед установкой плагинов проверяйте совместимость с версией Redmine и Ruby.
- Устанавливайте плагины через папку
plugins/и выполняйтеRAILS_ENV=production bundle exec rake redmine:plugins:migrate.
Переезд и миграция — советы
- Планируйте миграцию в окно технического обслуживания.
- Всегда делайте бэкап БД и каталога files до миграции.
- Проведите тестовую миграцию на staging-сервере.
Наглядная сводка (fact box)
- Внешние порты: 80, 443
- Внутренний порт приложения: 3000
- Рекомендуемая кодировка для MySQL: utf8mb4
- Рекомендуемая версия Ruby для Redmine 5.0.x: 3.1.x
Краткое объявление для команды (100–200 слов)
Готово: на сервере Debian 11 установлена и настроена инстанция Redmine 5.0.5. Стек: Apache + Passenger (Rails), MySQL 8.0, Nginx в роли обратного прокси с HTTPS (Let’s Encrypt). По умолчанию приложение доступно по адресу https://redmine.example.com. Перед использованием смените дефолтный пароль admin и настройте проекты и роли. Резервные копии БД и каталогов настроены по процедуре; проверьте задания cron для бэкапов. Для вопросов по доступу и интеграции CI запросите у саппорта штатные учётные записи и права.
Словарь в одной строке
- Passenger — модуль Apache для развёртывания Ruby/Rails-приложений; управляет процессами и интегрируется с Apache.
- RVM — менеджер версий Ruby.
- bundle — менеджер зависимостей Ruby (Bundler).
Частые вопросы и нюансы
Q: Можно ли использовать PostgreSQL? A: Да. Redmine полноценно поддерживает PostgreSQL; при установке меняйте adapter в database.yml на postgresql и установите соответствующие client‑пакеты.
Q: Можно ли запускать Redmine в Docker? A: Да. Docker-образы упрощают развёртывание и изоляцию, но требуют управления томами, бэкапами и сетью контейнеров.
Q: Как сменить домен? A: Обновите ServerName в Apache/Nginx и полученные сертификаты Let’s Encrypt для нового домена.
Заключение
Вы установили и настроили Redmine на Debian 11: база данных MySQL, Ruby через RVM, Apache+Passenger и Nginx как обратный прокси с SSL. Дополнительно даны методики резервного копирования, обновления, жёсткой настройки безопасности и тестов приёмки. При появлении вопросов — проверьте логи Apache/Nginx и Redmine, а затем задавайте конкретные вопросы с описанием ошибок.
Ключевые действия:
- Проверить доступность по HTTPS
- Сменить дефолтный пароль admin
- Настроить регулярные бэкапы
- Настроить мониторинг и ротацию логов
Если нужно, могу предоставить: systemd-шаблон для запуска Rails-сервера, пример Docker Compose для Redmine, или пошаговый план миграции на PostgreSQL.
Похожие материалы
Несколько аккаунтов Skype: Multi Skype Launcher
Журнал для работы: повысить продуктивность
Персональные звуки уведомлений на Android
Скачивание шоу Hulu для офлайн‑просмотра
Microsoft Start: персонализированная новостная лента