How to easily install Redmine using Docker Images
Note: Also see this followup post on how to use custom themes in this setup and this followup post on how to backup Redmine using this setup.
This tutorial shows you step-by-step the easiest method of setting up a fresh redmine installation I have found so far. The commands have been tested on Ubuntu 18.04, but they should work with minimal modification on other DEB-based distributions
Installing Docker & Docker-Compose
Please follow the instructions in How to install docker and docker-compose on Ubuntu in 30 seconds
Creating the directory & docker-compose configuration
We will install redmine in /var/lib/redmine
which will host the data directories and the docker-compose
script.
# Create directories
sudo mkdir /var/lib/redmine
sudo mkdir -p /var/lib/redmine/redmine_data /var/lib/redmine/mariadb_data
# Set correct permissions for the directories
sudo chown -R $USER:docker /var/lib/redmine
sudo chown -R 1001:1001 /var/lib/redmine/redmine_data /var/lib/redmine/mariadb_data
Next, we’ll create /var/lib/redmine/docker-compose.yml
.
There’s a couple of things you need to change here:
- Set
REDMINE_EMAIL
to the email of the admin user you want to use (usually that is your email!) - Set the SMTP credentials (
SMTP_HOST
,SMTP_PORT
,SMTP_USER
andSMTP_PASSWORD
) to a valid SMTP server.SMTP_TLS
defaults to *true -*in the rare case that - The ports configuration, in this case
'3718:3000'
means that Redmine will be mapped to port 3718 on the local PC. This port is chosen somewhat arbitarily - as we will run redmine behind an nginx reverse proxy, the port does not need to be any port in particular (as long as you use the same port everywhere), but it may not be used by anything else. You can use any port here, provided that it’s not used for anything else. Leave3000
as-is and only change3718
if required.
Note that you do not need to change REDMINE_PASSWORD
- when you login for the first time, redmine will force you to change the password anyway.
services:
mariadb:
image: 'bitnami/mariadb:latest'
environment:
- ALLOW_EMPTY_PASSWORD=yes
volumes:
- '/var/lib/redmine/mariadb_data:/bitnami'
redmine:
image: 'bitnami/redmine:latest'
environment:
- REDMINE_USERNAME=admin
- REDMINE_PASSWORD=redmineadmin
- [email protected]
- SMTP_HOST=smtp.gmail.com
- SMTP_PORT=25
- [email protected]
- SMTP_PASSWORD=yourGmailPassword
ports:
- '3718:3000'
volumes:
- '/var/lib/redmine/redmine_data:/bitnami'
depends_on:
- mariadb
Setting up the systemd service
Next, we’ll configure the systemd service in /etc/systemd/system/redmine.service
.
Set User=...
to your current user in the [Service]
section.
[Unit]
Description=Redmine
Requires=docker.service
After=docker.service
[Service]
Restart=always
User=uli
Group=docker
# Shutdown container (if running) when unit is stopped
ExecStartPre=/usr/local/bin/docker-compose -f /var/lib/redmine/docker-compose.yml down -v
# Start container when unit is started
ExecStart=/usr/local/bin/docker-compose -f /var/lib/redmine/docker-compose.yml up
# Stop container when unit is stopped
ExecStop=/usr/local/bin/docker-compose -f /var/lib/redmine/docker-compose.yml down -v
[Install]
WantedBy=multi-user.target
After creating the file, we can enable and start the redmine service:
sudo systemctl enable redmine
sudo systemctl start redmine
The output of sudo systemctl start redmine
should be empty. In case it is
Job for redmine.service failed because the control process exited with error code.
See "systemctl status redmine.service" and "journalctl -xe" for details.
debug the issue using journalctl -xe
and journalctl -e
The first startup usually takes about 3 minutes, so grab a cup of coffee.
Now you can check if redmine is running using
wget -qO- http://localhost:3718/
(if you changed the port config before, you need to use your custom port in the URL).
If it worked, it will show a large HTML output, ending with
[...]
<div id="footer">
<div class="bgl"><div class="bgr">
Powered by <a href="https://www.redmine.org/">Redmine</a> © 2006-2018 Jean-Philippe Lang
</div></div>
</div>
</div>
</div>
</body>
</html>
If the output is empty, try wget -O- http://localhost:3718/
to see the error message
Setting up the nginx reverse proxy (optional but recommended)
We’ll use nginx to proxy the requests from a certain domain (Using Apache, if you use it already, is also possible but it is outside the scope of this tutorial to tell you how to do that). Install it using
sudo apt -y install nginx
First, you’ll need a domain name with DNS being configured. For this example, we’ll assume that your domain name is redmine.techoverflow.net
! You need to change it to your domain name!
First, we’ll create the config file in /etc/nginx/sites-enabled/redmine.conf
. Remember to replace redmine.techoverflow.net
**by your domain name!**If you use a port different from 3718, replace that as ewll.
server {
listen 80;
server_name redmine.techoverflow.net;
access_log /var/log/nginx/redmine.access_log;
error_log /var/log/nginx/redmine.error_log info;
location / {
proxy_pass http://127.0.0.1:3718; # docker-compose forwarded
proxy_read_timeout 3600s;
proxy_http_version 1.1;
}
}
Now run sudo nginx -t
to test if there are any errors in the config file. If everything is alright, you’ll see
nginx: the configuration file /etc/nginx/nginx.conf syntax is ok
nginx: configuration file /etc/nginx/nginx.conf test is successful
Once you have fixed all errors, if any, run sudo service nginx reload
to apply the configuration.
Test the setup by navigating your domain name in the browser. You should see the redmine interface:
Securing the nginx reverse proxy using Let’s Encrypt
First we need to install certbot
and the certbot nginx plugin in order to create & install the certificate in nginx:
sudo apt -y install python3-certbot python3-certbot-nginx
Fortunately certbot automates most of the process of installing & configuring SSL and the certificate. Run
sudo certbot --nginx
It will ask you to enter your Email address and agree to the terms of service and if you want to receive the EFF newsletter.
After that, certbot will ask you to select the correct domain name:
Which names would you like to activate HTTPS for?
-------------------------------------------------------------------------------
1: redmine.techoverflow.net
-------------------------------------------------------------------------------
Select the appropriate numbers separated by commas and/or spaces, or leave input
blank to select all options shown (Enter 'c' to cancel):
In this case, there is only one domain name (there will be more if you have more domains active on nginx!).
Therefore, enter 1
and press enter. certbot will now generate the certificate. In case of success you will see
Deploying Certificate to VirtualHost /etc/nginx/sites-enabled/redmine.techoverflow.net.conf
Now it will ask you whether to redirect all requests to HTTPS automatically:
Please choose whether or not to redirect HTTP traffic to HTTPS, removing HTTP access.
-------------------------------------------------------------------------------
1: No redirect - Make no further changes to the webserver configuration.
2: Redirect - Make all requests redirect to secure HTTPS access. Choose this for
new sites, or if you're confident your site works on HTTPS. You can undo this
change by editing your web server's configuration.
-------------------------------------------------------------------------------
Select the appropriate number [1-2] then [enter] (press 'c' to cancel):
Choose Redirect
here: Type 2
and press enter. Now you can login to redmine and finish the installation.
You need to renew the certificate every 3 months for it to stay valid, and run sudo service nginx reload
afterwards to use the new certificate. If you fail to do this, users will see certificate expired error messages and won’t be able to access Redmine easily! See this post for details on how to mostly automate this process!
Setting up Redmine
Go to your domain name (if you have followed the instructions above, it should automatically redirect you to HTTPS). Click Login at the top right and login with the username admin
and the default password redmineadmin
. Upon first login, it will require you to change the password to a new - and more secure password.
I won’t describe in detail how to setup Redmine for your project. However there’s two things you should take care of immediately after the first login:
- Configure the correct domain name: Go to Administration -> Settingsand set
Host name and path
to your domain name, e.g.redmine.techoverflow.net
. SetProtocol
toHTTPS
. You can also set a custom name for your Redmine installation underApplication Title
- Still under Administration -> Settings, go to the Email Notificationstab, set an approriate sender email address under
Emission email address
(usually you would use[email protected]
here, but you might want to use your SMTP username for some SMTP providers like GMail) - Scroll down to the bottom of the Email Notifications page and click
Send a test email
which will send a test email to the current redmine user’s email adress. Unless you have changed it, the default is the address configured inREDMINE_EMAIL
in/var/lib/redmine/docker-compose.yml
.
In case the email does not work, change SMTP_...=...
in /var/lib/redmine/docker-compose.yml
but you also have to change it in /var/lib/redmine/redmine_data/redmine/conf/configuration.yml
! After doing the changes, restart redmine by
sudo systemctl restart redmine
which will use the new configuration from the config file.
Block access to the forwarded port using ufw (optional)
ufw
is a simple Firewall for Ubuntu. Use sudo apt install ufw
to install it and sudo ufw enable
to activate it. The default configuration will allow SSH but it will block other ports, including port 3718 or any other custom port you might have used.
In order to enable it, use
sudo ufw enable
sudo ufw allow ssh
sudo ufw allow http
sudo ufw allow https
Remember to add any ports you need to have open to the list as well. See the ufw docs for more information.