Why not Apache?
You should not use www-data
account to run Redmine. This is (I think) a mistake and you may have troubles with file permissions on certain files. (Private SSH keys for instance, that should be accessible for only one user and certainly not the www-data
user)
The best way to run Redmine and (Rails apps in general) is to create a separate standard user, lets say redmine
, and install Redmine within the user’s home. In that case, you should use Nginx and Puma (or other webservers) to serve Redmine.
Nginx will run with www-data
user but will communicate with Redmine via a UNIX socket and thus avoiding troubles with file permissions.
Requests will be send to and executed by Puma which runs with the redmine
user and has the needed permissions on sensitive files.
Often 600 on SSH private keys what you can’t do if you serve Redmine with Apache (at least 640 by using groups or worse 644).
Also it will permit you to keep your Redmine updated as it won’t depend on system librairies which bring the ‘Wrong dependency version’ issue.
So this tutorial :)
(step 1) Create the redmine
user
root# adduser --disabled-password redmine
(step 2) Install RVM
Ruby Version Manager (RVM) is a command-line tool which allows you to easily install, manage, and work with multiple ruby environments from interpreters to sets of gems.
root# su - redmine
redmine$ gpg --keyserver hkp://keys.gnupg.net --recv-keys 409B6B1796C275462A1703113804BB82D39DC0E3
redmine$ curl -sSL https://get.rvm.io | bash -s stable
Be sure to have this in /home/redmine/.profile
:
# Set PATH so it includes user's private bin if it exists
if [ -d "$HOME/bin" ] ; then
PATH="$HOME/bin:$PATH"
fi
# set PATH so it includes rvm bin if it exists
if [ -d "$HOME/.rvm/bin" ] ; then
PATH="$PATH:$HOME/.rvm/bin"
fi
if [ -s "$HOME/.rvm/scripts/rvm" ] ; then
source "$HOME/.rvm/scripts/rvm"
fi
if [ -s "$HOME/.rvm/scripts/completion" ] ; then
source "$HOME/.rvm/scripts/completion"
fi
Now you should logout from Redmine user with exit
then ‘relogin’ with su - redmine
to reload env vars properly.
(step 3) Install Ruby
redmine$ rvm install 2.1.4
(step 4) Install Redmine
Change current user then follow the Redmine installation tutorial with this user :
root# su - redmine
At the end of the Redmine installation, be sure to have :
/home/redmine
/home/redmine/bin
/home/redmine/etc
/home/redmine/redmine ----> /home/redmine/redmine-2.6.1 # Symbolic link
/home/redmine/redmine-2.6.1
/home/redmine/redmine-2.5.2
/home/redmine/redmine-2.5.1
/home/redmine/ssh_keys
The symbolic link is here to make Redmine upgrades easy.
- The
bin
dir will contain the services start script (Puma, Sidekiq …) - The
etc
dir will contain the services config file - The
ssh_keys
dir will contain the Gitolite admin key
(step 5) Install Puma
Install Puma gem :
redmine$ gem install puma
Create the Puma config file /home/redmine/etc/puma.rb
with this content.
Then create the Puma start script /home/redmine/bin/server_puma.sh
with this content and make it executable :
redmine$ chmod +x /home/redmine/bin/server_puma.sh
(step 6) Configure Nginx
This is a sample conf for Nginx :
upstream puma_redmine {
server unix:/home/redmine/redmine/tmp/sockets/redmine.sock fail_timeout=0;
#server 127.0.0.1:3000; #dev mode
}
server {
server_name redmine.example.com
listen 0.0.0.0:80;
root /home/redmine/redmine;
access_log /var/log/nginx/redmine.log;
error_log /var/log/nginx/redmine.log;
location / {
try_files $uri @ruby;
}
location @ruby {
#proxy_set_header X-Forwarded-Proto https; # unquote if you are in HTTPs
proxy_set_header Host $http_host;
proxy_redirect off;
proxy_read_timeout 300;
proxy_pass http://puma_redmine;
}
}
(step 7) Create Debian init script
If you’re using Debian you can create the file /etc/init.d/redmine
with this content.
This way, you can manage Redmine independantly of Nginx :
/etc/init.d/redmine start
/etc/init.d/redmine stop
or
root# su - redmine
redmine$ server_puma.sh start
redmine$ server_puma.sh stop