Install Redmine with Docker Compose

By Atif

May 6, 2026

Redmine Docker compose

Here is ready-made Docker compose file to install Redmine in a multi-container project using Redmine, MySQL and Nginx containers. It uses volumes to save MySQL data and Redmine file if you want to migrate away or clone the project.

# Installs and setup Redmine using Redmine contianer
# MySQL container for database
# Nginx container for serving
services:
  redmine-mysql:
    image: mysql:8.4.7
    restart: always
    environment:      
      MYSQL_USER: redmine
      MYSQL_PASSWORD: wBtLHgP*l@qnz5En
      MYSQL_DATABASE: redmine
      # MYSQL_ROOT_PASSWORD: redmine
      MYSQL_RANDOM_ROOT_PASSWORD: 1
    volumes:
      - .\data\mysql:/var/lib/mysql
    
  redmine:
    image: redmine:6.1.0
    restart: always
    ports:
      - "3000:3000"
    environment:
      REDMINE_DB_MYSQL: redmine-mysql
      REDMINE_DB_DATABASE: redmine
      REDMINE_DB_USERNAME: redmine
      REDMINE_DB_PASSWORD: wBtLHgP*l@qnz5En
    volumes:
      - ./data/redmine/files:/usr/src/redmine/files
      - ./data/redmine/config/configuration.yml:/usr/src/redmine/config/configuration.yml
    depends_on:
      - redmine-mysql

  nginx:
    image: nginx:1.29
    restart: always
    ports:
      - "80:80"
      - "443:443"
    volumes:
      - ./data/nginx/conf:/etc/nginx/conf.d:ro
      - ./data/nginx/ssl:/etc/nginx/ssl:ro
    depends_on:
      - redmine    

Nginx .conf file

Nginx configuration file to setup, serve and secure the Redmine install with SSL certificates.

server {
    listen       80;
    listen  [::]:80;
    server_name  redmine.your-domain.com;

    # Redirect all HTTP traffic permanently (301) to the HTTPS version
    return 301 https://$host$request_uri;
    error_log /etc/nginx/conf.d/log/redmine.log;
}
server {
    listen 443 ssl;
    server_name  redmine.your-domain.com;

    ssl_certificate /etc/nginx/ssl/certificate.pem;  # Your Origin Certificate
    ssl_certificate_key /etc/nginx/ssl/private.key; # Your Private Key

    # Standard SSL settings (improves security)
    ssl_protocols TLSv1.2 TLSv1.3;
    ssl_ciphers 'TLS_AES_256_GCM_SHA384:TLS_CHACHA20_POLY1305_SHA256:TLS_AES_128_GCM_SHA256:ECDHE-RSA-AES256-GCM-SHA384:ECDHE-RSA-AES128-GCM-SHA256';
    ssl_prefer_server_ciphers off;

    location / {
        proxy_pass   http://redmine:3000;

        proxy_set_header Host $host;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header X-Forwarded-Proto $scheme;
    }

    #access_log  /var/log/nginx/host.access.log  main;
    error_log /etc/nginx/conf.d/log/redmine.log;


    #error_page  404              /404.html;

    # redirect server error pages to the static page /50x.html
    #
    error_page   500 502 503 504  /50x.html;
    location = /50x.html {
        root   /usr/share/nginx/html;
    }
}

Redmine email setup

Redmine email setup with google workspace

email_delivery:
  delivery_method: :smtp
  smtp_settings:
    enable_starttls_auto: true
    address: "smtp.gmail.com"
    port: 587
    domain: "your-domain.com" # 'your.domain.com' for GoogleApps
    authentication: :plain
    user_name: "[email protected]"
    password: "your-google-app-password"

To learn how it’s all working read the detailed guide on How to Install Redmine with Docker Containers . In this guide you will also learn how to secure your install using Cloudflare’s free SSL-Certificates.

Hey! how u doing 🙂