Project management + issue tracking. The PMA service tickets are tracked in (Golden Rule 1: every change starts with a Redmine ticket). Postgres-backed, OAuth SSO via Authentik, daily backup.
Redmine is the ticket system of record for PMA itself. Every
commit message references a Redmine ticket (#NNNN). Release
scripts are named after their ticket (releases/<ticket>-*.sh).
The MCP gateway gives AI agents a Redmine login so they file
their own work.
Upstream: redmine.org. Image:
redmine:5-alpine. Backend: Postgres.
| Use case | Verdict |
|---|---|
| Issue tracking + sprints for one team | ✓ — Redmine's sweet spot |
| Multi-project portfolio management | ✓ — projects, sub-projects, custom fields |
| Time tracking + billable hours | ✓ — built-in time entries |
| Kanban board UI (à la Jira) | △ — works via plugins, less polished than Jira |
| Helpdesk / external customer tickets | ✗ — use Zammad instead (separate PMA service) |
| Real-time chat about a ticket | ✗ — use Mattermost (n8n bridges the two) |
For "ticket lives somewhere PMA cares about", Redmine is the
default. Other services (Zammad for support, Mattermost for chat)
have their own purpose.
Already included in the enterprise, development, and
minimal profiles. To verify it's running:
just status redmine
# [asd-dev-redmine] ✓ healthy
# [asd-dev-redmine-postgres] ✓ healthy
grep ^REDMINE_URL= .env
# REDMINE_URL=https://redmine-xyz1.eu2.tn.example.com
If you're on a profile that doesn't include Redmine:
just profile enable redmine
just compose-generate
just up
For first-time install from a fresh repo:
just bootstrap-local enterprise # or development / minimal
# Redmine comes up as part of the bootstrap, SSO wired automatically
Manifest declares sso.type: oauth. Bootstrap created the
Authentik OAuth application + provider, registered the callback
URL (/login/oauth2/callback), wrote the client id/secret to
.env, configured Redmine's OAuth2 authentication strategy.
Result: log in to Redmine via "Login" button → Authentik handles
auth → land back in Redmine. Same Authentik session works for
Mattermost / Wiki.js / ERPNext.
If SSO drifts: just sso-fix redmine re-applies from the
manifest.
The claude_ai_PMA MCP server exposes Redmine operations to AI
agents:
| MCP tool | What it does |
|---|---|
redmine_create_ticket |
File a new ticket (with tracker, epic, description) |
redmine_issue |
Read one issue by ID |
redmine_issues |
Search issues by filter |
redmine_update_ticket |
Update status, description, assignee |
redmine_close_ticket |
Close with notes |
redmine_add_note |
Append a journal note |
redmine_attach_file |
Upload + attach a file (#3917 fixed the --json flag bug) |
redmine_epics |
List epics (tracker_id=4) |
AI agents authenticate as themselves via X-Redmine-Switch-User
(admin API key required) — full attribution in the journal.
n8n workflows shipped with the enterprise profile include:
Each lives in packages/n8n/workflows/ and gets imported during
bootstrap.
The standard just <svc>-* recipes:
just redmine-status # container health
just redmine-restart # restart redmine + postgres
just redmine-logs # follow container logs
just redmine-psql # psql shell as redmine user
just redmine-create-user EMAIL # create a Redmine user
just redmine-list-users # list all users
just backup redmine # take a backup
just restore redmine TIMESTAMP # restore from a specific backup
Plus the just ticket recipes (PMA-specific, hosted on the wiki's
/projects/asd-pma/commands/health-check legacy page):
just ticket epics # list open epics
just ticket create "Subject" --tracker=feature --epic=N
just ticket update ID --desc-file=/tmp/desc.txt
just ticket close ID --notes="Result: ..."
Manifest declares:
backup:
enabled: true
type: database
database:
user: redmine
name: redmine
fixes:
post_restore:
script: scripts/post_restore.py
functions:
- name: fix_migration_lock
description: Unlock stuck migration table after restore
targets: database
So just backup redmine dumps the postgres database to
.asd/workspace/backups/redmine/<timestamp>/dump.sql. just restore redmine TIMESTAMP loads the dump and walks the
post-restore functions — fix_migration_lock unlocks the
schema_migrations table which postgres restore can leave in a
"running" state.
For the multi-service restore order (Authentik first, then
postgres-backed services, etc.), use just restore-all — it
reads startup_priority from each manifest.
/usr/src/redmine/plugins/ — restoring from a backup thatakadmin account is the bootstrap admin. Created byinit-db.sh during install. Don't delete it; SSO/recovery/pma/learn/04-sso-everywhere — how the OAuth flow works./pma/learn/05-backup-and-restore — the restore drill./pma/services/mattermost — the chat side of the same workflow./pma/services/n8n — the automation that bridges Redmine + other services.