====== 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]]