One file, three commands, and a complete Redmine is running. This guide covers the way from nothing to the first login and ends with setting up Time Tracking. Prerequisite: a Linux server or virtual machine with Docker installed.
A new directory, inside it the file docker-compose.yml with this content. Replace the two passwords and the key with your own values – the key may be long and arbitrary, it is never typed anywhere.
services:
db:
image: postgres:16-alpine
restart: unless-stopped
environment:
POSTGRES_DB: redmine
POSTGRES_USER: redmine
POSTGRES_PASSWORD: change-me
volumes:
- ./data/db:/var/lib/postgresql/data
redmine:
image: redmine:6.1
restart: unless-stopped
depends_on: [db]
ports:
- "3000:3000"
environment:
REDMINE_DB_POSTGRES: db
REDMINE_DB_DATABASE: redmine
REDMINE_DB_USERNAME: redmine
REDMINE_DB_PASSWORD: change-me
SECRET_KEY_BASE: replace-with-a-long-random-string
volumes:
- ./data/files:/usr/src/redmine/files
- ./data/plugins:/usr/src/redmine/plugins
Then create the data directories – before the first start, so they belong to you and not to the container:
mkdir -p data/db data/files data/plugins
Database, attachments and plugins live there – that is everything you need to back up.
In the same directory:
docker compose up -d
docker compose exec redmine bundle exec rake redmine:load_default_data REDMINE_LANG=en RAILS_ENV=production
The first command pulls the images and starts both containers; the second creates roles, issue statuses and workflows – once. Redmine is then reachable at http://<server>:3000. Log in with admin / admin; Redmine asks for a new password right away.
Unzip the plugin from your purchase e-mail into the plugin directory create its database tables, restart:
unzip at_zeiterfassung-1.6.0.zip -d data/plugins/
docker compose exec redmine bundle exec rake redmine:plugins:migrate RAILS_ENV=production
docker compose restart redmine
In Redmine: Administration → Roles and permissions → give your staff's role the permission View own timesheet, create a project, add members. Time Tracking now sits in the top menu. The manual covers the rest.
For access from the internet put a reverse proxy with a certificate in front – Caddy does it with two lines of configuration, nginx or Traefik likewise. Inside the company network port 3000 is fine.
Copy the data/ directory regularly; for the database cleanly with docker compose exec db pg_dump -U redmine redmine > backup.sql.
Redmine: raise the image version in the file, docker compose up -d – the container migrates the database on start. Plugin: delete the old directory, unzip the new file, plugins:migrate, restart – exactly as on installation.