====== 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 Желательно пароль изменить: [[http://wiki.nareyko.by/mysql._sbros_parolja_root | Сброс пароля root]] * **Настройка Percona Server** Оптимальный конфиг можно генерировать инструментами Percona на сайте [[https://tools.percona.com/ | 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 , Michal Papis [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 {{::passenger1.png?nolink|}} \\ {{::passenger2.png?nolink|}} \\ По умолчанию 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 в браузере** {{::redmine1.png?nolink|}} ---- ===== Траблшутинг ===== ==== 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 ---- ===== Источники ===== * [[ http://www.redmine.org/projects/redmine/wiki/RusRedmineInstall | redmine.org ]] * [[ https://www.howtoforge.com/tutorial/how-to-install-redmine-3-with-nginx-on-centos-7 | howtoforge.com]]