Содержание
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;
Установка RVM и Ruby
- Запускаем 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/]
Установка Phusion Passenger и Nginx
- Устанавливаем Passenger и Nginx
gem install passenger --no-ri --no-rdoc rvmsudo passenger-install-nginx-module
Если столкнулись с ошибкой, что приложение gem не найдено, выполните
source ~/.rvm/scripts/rvm
а так же проверьте, корректно ли добавили эту строку в файл .bashrc
По умолчанию Nginx будет установлен в каталог /opt/nginx
Настройка 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
Установка Redmine
Продолжаем работу под пользователем 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