Redmine 3 + Nginx + Passenger + MySQL + CentOS 7

Установку приложений и самого Redmine будем выполнять в рамках отдельного пользователя - appuser .

  • Создадим нового пользователя
useradd appuser -s /sbin/nologin
  • Разрешим использовать sudo
visudo
...
appuser ALL=(ALL)       ALL
...
appuser ALL=(ALL)       NOPASSWD: ALL
...

yum install http://www.percona.com/downloads/percona-release/redhat/0.1-4/percona-release-0.1-4.noarch.rpm
yum update -y
yum install zlib-devel curl-devel openssl-devel httpd-devel apr-devel apr-util-devel mysql-devel ftp wget ImageMagick-devel gcc-c++ patch readline readline-devel zlib libyaml-devel libffi-devel make bzip2 autoconf automake libtool bison iconv-devel gcc epel-release

iptables

Если предпочитаете работать с iptables вместо firewalld, то вначале выполним подготовительные работы

  • Отключаем firewalld
systemctl stop firewalld
systemctl disable firewalld
  • Устанавливаем компоненты iptables
yum install iptables-services -y
systemctl enable iptables.service
systemctl start iptables.service
  • Добавляем правила
iptables -I INPUT -p tcp -m state --state NEW -m tcp --dport 80 -j ACCEPT
iptables -I INPUT -p tcp -m state --state NEW -m tcp --dport 443 -j ACCEPT
service iptables save

firewalld

  • Добавляем правила
firewall-cmd --permanent --zone=internal --add-service=http
firewall-cmd --permanent --zone=internal --add-service=https
firewall-cmd --reload

  • Устанавливаем Percona Server 5.7
yum remove Percona-Server-devel-56-5.6.35-rel80.0.el7.x86_64
yum install Percona-Server-server-57.x86_64
  • Ищем пароль root
grep 'temporary password' /var/log/mysqld.log

Желательно пароль изменить: Сброс пароля root

  • Настройка Percona Server

Оптимальный конфиг можно генерировать инструментами Percona на сайте tools.percona.com. Необходима регистрация.

  • Для удобства создаём локальный конфиг
vim /root/.my.cnf 
[client]
user=root
password='temp_password'
socket=/mysql-data-directory/mysql.sock
  • Создание базы данных и пользователя
CREATE DATABASE redmine CHARACTER SET utf8; 
CREATE USER 'redmine'@'localhost' IDENTIFIED BY 'my_password'; 
GRANT ALL privileges ON redmine.* TO 'redmine'@'localhost';
FLUSH privileges;

  • Запускаем shell под пользователем
sudo -uappuser bash
cd ~
  • Устанавливаем RVM и Ruby
gpg2 --keyserver hkp://keys.gnupg.net --recv-keys 409B6B1796C275462A1703113804BB82D39DC0E3
curl -L https://get.rvm.io | bash -s stable --ruby=2.2.5
  • Настраиваем окружение
source ~/.rvm/scripts/rvm
echo 'source ~/.rvm/scripts/rvm' >> ~/.bashrc
  • Проверяем
ruby -v
ruby 2.2.5p319 (2016-04-26 revision 54774) [x86_64-linux]
rvm -v
rvm 1.28.0 (latest) by Wayne E. Seguin <wayneeseguin@gmail.com>, Michal Papis <mpapis@gmail.com> [https://rvm.io/]

  • Устанавливаем Passenger и Nginx
gem install passenger --no-ri --no-rdoc
rvmsudo passenger-install-nginx-module

Если столкнулись с ошибкой, что приложение gem не найдено, выполните

source ~/.rvm/scripts/rvm

а так же проверьте, корректно ли добавили эту строку в файл .bashrc



По умолчанию Nginx будет установлен в каталог /opt/nginx


  • Для удобства создаём симлинк
sudo ln -s /opt/nginx/conf/ /etc/nginx
  • Создаём виртуальный хост
sudo mkdir -p /etc/nginx/vhost
sudo vim /etc/nginx/vhost/redmine.conf
server {
        listen       80;
        server_name  www.redmine.co;
 
        root /home/appuser/redmine/public;
        passenger_enabled on;
        client_max_body_size      10m; # Max attachemnt size
 
        # redirect server error pages to the static page /50x.html
        #
        error_page   500 502 503 504  /50x.html;
        location = /50x.html {
            root   html;
        }
    }
  • Меняем пользователя, от которого будет работать Nginx
sudo vim /etc/nginx/nginx.conf
...
user  appuser;
...
  • Создаём Unit в systemd
sudo vim /lib/systemd/system/nginx.service
[Unit]
Description=The NGINX HTTP and reverse proxy server
After=syslog.target network.target remote-fs.target nss-lookup.target
 
[Service]
Type=forking
PIDFile=/opt/nginx/logs/nginx.pid
ExecStartPre=/opt/nginx/sbin/nginx -t
ExecStart=/opt/nginx/sbin/nginx
ExecReload=/bin/kill -s HUP $MAINPID
ExecStop=/bin/kill -s QUIT $MAINPID
PrivateTmp=true
 
[Install]
WantedBy=multi-user.target
systemctl daemon-reload
systemctl start nginx
  • Проверяем, что Nginx запустился
netstat -nlpt | grep nginx
tcp        0      0 0.0.0.0:80              0.0.0.0:*               LISTEN      6883/nginx: master

Продолжаем работу под пользователем appuser.

  • Загружаем Redmine
cd ~
wget http://www.redmine.org/releases/redmine-3.3.2.tar.gz
tar -zxvf redmine-3.3.2.tar.gz
mv redmine-3.3.2 redmine
cd redmine
mkdir -p tmp tmp/pdf public/plugin_assets
sudo chmod -R 775 files log tmp public/plugin_assets

Redmine использует Bundler для управления зависимостями gems пакетов.

  • Устанавливаем Boundler
gem install bundler
  • Устанавливаем зависимости, необходимые Redmine
bundle install --without development test postgresql sqlite
  • Генерируем новый ключ для хранения сессий
bundle exec rake generate_secret_token
  • Создаём структуру базы данных Redmine и загружаем в неё данные
RAILS_ENV=production bundle exec rake db:migrate
RAILS_ENV=production bundle exec rake redmine:load_default_data
  • Настраиваем подключение к базе данных
vim /home/appuser/redmine/config/database.yml
...
production:
  adapter: mysql2
  database: redmine
  host: localhost
  username: redmine
  password: "my_password"
  encoding: utf8
...

  • Перезапускаем Nginx
systemctl restart nginx
  • Добавляем на локальном компьютере домен в список хостов (если использовали произвольный, вместо купленного и привязанного к серверу)
  • Открываем по домену главную страницу Redmine в браузере


duplicated key at line 466 ignored: "inodot"

  • Ошибка в логе Nginx /opt/nginx/logs/error.log
App 20662 stderr: /home/appuser/.rvm/gems/ruby-2.2.5/gems/htmlentities-4.3.1/lib/htmlentities/mappings/expanded.rb:465: warning: duplicated key at line 466 ignored: "inodot"

Решается удалением дублирующей строки в файле expanded.rb

vim /home/appuser/.rvm/gems/ruby-2.2.5/gems/htmlentities-4.3.1/lib/htmlentities/mappings/expanded.rb +466

Ошибка приложения при добавлении пользователя с данными в кириллице

Столкнулся при создании нового пользователя, когда указывал ФИО в кириллице.

  • В логе приложения (/home/appuser/redmine/log/production.log) видим
ActiveRecord::StatementInvalid (Mysql2::Error: Incorrect string value: '\xD0\x95\xD0\xB2\xD0\xB3...' for column 'firstname' at row 1: INSERT INTO `users` (`type`, `firstname`, `lastname`, `language`, `status`, `login`, `salt`, `hashed_password`, `passwd_changed_on`, `created_on`, `updated_on`, `mail_notification`) VALUES ('User', 'Вася', 'Пупкин', 'ru', 2, 'vasya', '4df3f211052e2d51e89d4d5477a0e1c9256', 'e19d6e6f21d2afa14f23a1d4b5121f82ac8e8de0ed', '2017-02-14 15:42:50', '2017-02-14 15:42:50', '2017-02-14 15:42:50', 'only_my_events')):

Проблема заключалась в том, что база была создана с кодировкой по умолчанию latin1

  • Проверяем
mysql redmine
SHOW VARIABLES LIKE 'character_set_database';
+------------------------+---------+
| Variable_name          | Value   |
+------------------------+---------+
| character_set_database | latin1  |
+------------------------+---------+
1 row in set (0.01 sec)
  • Конвертируем
# предварительно сделаем бэкап
mysqldump redmine > redmine.sql
# а теперь займёмся конвертацией
mysqldump --add-drop-table redmine | replace CHARSET=latin1 CHARSET=utf8 | iconv -f latin1 -t utf8 | mysql redmine

  • redmine_3_nginx_passenger_mysql_centos_7.txt
  • Последние изменения: 2017/02/15 00:00
  • (внешнее изменение)