How to Self-Host Taiga with Docker Compose

What Is Taiga?

Taiga is an open-source agile project management platform for Scrum and Kanban teams. It includes sprint planning, backlogs, user stories, tasks, epics, wiki, and a clean UI that non-technical team members can use without training. It replaces Jira, Trello, and Asana for agile teams that want full control of their project data.

Prerequisites

  • A Linux server (Ubuntu 22.04+ recommended)
  • Docker and Docker Compose installed (guide)
  • 3 GB of free disk space
  • 2 GB of RAM (minimum)
  • A domain name (recommended — Taiga generates absolute URLs using the configured domain)

Docker Compose Configuration

Clone the official Taiga Docker repository and configure it:

git clone https://github.com/taigaio/taiga-docker.git ~/taiga
cd ~/taiga
git checkout stable
cp .env.example .env

Edit the .env file with your settings:

# Domain and scheme — change these to match your setup
TAIGA_SCHEME=http
TAIGA_DOMAIN=localhost:9000
SUBPATH=""
WEBSOCKETS_SCHEME=ws

# Security — MUST change these from defaults
TAIGA_SECRET_KEY=change-this-to-a-long-random-string
POSTGRES_PASSWORD=change-this-to-a-strong-password
RABBITMQ_PASS=change-this-to-another-password
RABBITMQ_ERLANG_COOKIE=change-this-random-erlang-cookie

# Database
POSTGRES_USER=taiga
POSTGRES_DB=taiga

# RabbitMQ
RABBITMQ_USER=taiga
RABBITMQ_VHOST=taiga

# Email — set to "smtp" for production
EMAIL_BACKEND=console
EMAIL_HOST=smtp.example.com
EMAIL_PORT=587
EMAIL_HOST_USER=[email protected]
EMAIL_HOST_PASSWORD=email-password
EMAIL_DEFAULT_FROM=[email protected]
EMAIL_USE_TLS=True
EMAIL_USE_SSL=False

# Optional
ENABLE_TELEMETRY=False

Generate secure values for the secrets:

sed -i "s/change-this-to-a-long-random-string/$(openssl rand -hex 32)/" .env
sed -i "s/change-this-to-a-strong-password/$(openssl rand -hex 16)/" .env
sed -i "s/change-this-to-another-password/$(openssl rand -hex 16)/" .env
sed -i "s/change-this-random-erlang-cookie/$(openssl rand -hex 24)/" .env

The official docker-compose.yml is included in the repository. It defines 9 services:

ServiceImagePurpose
taiga-dbpostgres:12.3PostgreSQL database
taiga-backtaigaio/taiga-back:latestDjango REST API
taiga-asynctaigaio/taiga-back:latestCelery worker for background tasks
taiga-async-rabbitmqrabbitmq:3.8-management-alpineMessage queue for async tasks
taiga-fronttaigaio/taiga-front:latestAngular frontend SPA
taiga-eventstaigaio/taiga-events:latestWebSocket server for real-time updates
taiga-events-rabbitmqrabbitmq:3.8-management-alpineMessage queue for events
taiga-protectedtaigaio/taiga-protected:latestSecure file serving
taiga-gatewaynginx:1.19-alpineNginx reverse proxy tying it all together

Start the stack:

./launch-taiga.sh

Or manually:

docker compose up -d

First startup takes 1-2 minutes while the database initializes.

Initial Setup

  1. Create an admin account:
cd ~/taiga
./taiga-manage.sh createsuperuser
  1. Open http://your-server-ip:9000 in your browser
  2. Log in with the superuser credentials you just created
  3. Create your first project — choose between Scrum (sprints, backlogs) or Kanban (board-only)
  4. Invite team members via email or share the registration link

Configuration

SettingVariableDescription
DomainTAIGA_DOMAINMust match exactly how users access Taiga (including port). Taiga generates absolute URLs using this value.
SchemeTAIGA_SCHEMEhttp or https. Set to https when behind SSL proxy.
WebSocketsWEBSOCKETS_SCHEMEws for HTTP, wss for HTTPS. Must match TAIGA_SCHEME.
Secret keyTAIGA_SECRET_KEYDjango secret key. Changing this invalidates all sessions and tokens.
EmailEMAIL_BACKENDSet to console (logs only) or smtp (sends email). SMTP required for invitations and notifications.
TelemetryENABLE_TELEMETRYAnonymous usage stats. Set to False to disable.

Important: TAIGA_DOMAIN must NOT include the scheme (no http://). Just the hostname and port: projects.example.com or localhost:9000.

Advanced Configuration (Optional)

HTTPS with Reverse Proxy

When putting Taiga behind a reverse proxy with SSL:

# In .env
TAIGA_SCHEME=https
TAIGA_DOMAIN=projects.example.com
WEBSOCKETS_SCHEME=wss

Remove the port mapping from taiga-gateway in docker-compose.yml and let your reverse proxy forward to port 9000.

OAuth Authentication (GitHub/GitLab)

Taiga supports OAuth login. Add to your .env:

ENABLE_GITHUB_AUTH=True
GITHUB_API_CLIENT_ID=your-client-id
GITHUB_API_CLIENT_SECRET=your-secret

Note: Public registration must be enabled for OAuth to work.

Custom Backend Configuration

For advanced Django settings, mount a custom config file:

# Add to taiga-back service in docker-compose.yml
volumes:
  - ./config.py:/taiga-back/settings/config.py

Reverse Proxy

Taiga exposes port 9000 through its built-in Nginx gateway. Put your external reverse proxy in front of that.

Important: Taiga uses WebSockets for real-time updates. Your reverse proxy must support WebSocket forwarding. Nginx Proxy Manager handles this automatically with the “WebSocket Support” toggle.

For detailed setup: Reverse Proxy Setup

Backup

Back up the database and media volumes:

# Database backup
docker exec taiga-docker-taiga-db-1 pg_dump -U taiga taiga > taiga-backup-$(date +%Y%m%d).sql

# Media backup (user uploads, attachments)
docker run --rm -v taiga-docker_taiga-media-data:/data -v $(pwd):/backup alpine \
  tar czf /backup/taiga-media-$(date +%Y%m%d).tar.gz -C /data .

Back up your .env file separately — it contains all configuration secrets. See Backup Strategy.

Troubleshooting

Taiga frontend shows “Unable to connect”

Symptom: Frontend loads but can’t reach the API. Fix: Verify TAIGA_DOMAIN matches your actual access URL. If you’re accessing via 192.168.1.100:9000, that’s what TAIGA_DOMAIN must be — not localhost:9000. Restart all services after changing.

WebSocket events not working (no real-time updates)

Symptom: Changes by other users don’t appear until page refresh. Fix: Check that WEBSOCKETS_SCHEME matches your setup (ws for HTTP, wss for HTTPS). If behind a reverse proxy, ensure WebSocket forwarding is enabled.

Email notifications not sending

Symptom: Invitations and notifications don’t arrive. Fix: Verify EMAIL_BACKEND=smtp (not console) and that your SMTP credentials are correct. You cannot use both EMAIL_USE_TLS=True and EMAIL_USE_SSL=True simultaneously — pick one.

RabbitMQ connection errors in logs

Symptom: Backend logs show Connection refused for RabbitMQ. Fix: RabbitMQ takes 10-20 seconds to start. The backend retries automatically. If persistent, check that RABBITMQ_PASS and RABBITMQ_ERLANG_COOKIE match between your .env and the running containers. Recreate the RabbitMQ volumes if credentials were changed after initial setup.

Database migration errors on upgrade

Symptom: Backend crashes after pulling a new image version. Fix: Migrations run automatically on startup. If they fail, check the backend logs: docker compose logs taiga-back. Common cause: insufficient disk space or corrupted migration state. Back up your database before any upgrade.

Resource Requirements

ResourceRequirement
RAM~1.5 GB idle (9 containers combined), ~2.5 GB under load
CPUMedium — Django backend is the heaviest component
Disk~2 GB for application, plus user uploads and database growth

Taiga is heavier than single-container tools like Planka or Kanboard due to its microservices architecture (9 containers). The trade-off is a much richer feature set.

Verdict

Taiga is the best self-hosted option for agile teams that follow Scrum or Kanban methodologies. Sprint planning, backlogs, user stories, epics, burndown charts — it has the full agile toolkit with a UI that’s cleaner than Jira. The 9-container architecture is complex but the official Docker setup handles orchestration well.

If you need Gantt charts and traditional project management, OpenProject is a better fit. If you just need a simple Kanban board without Scrum ceremonies, Planka or Plane are lighter alternatives. Taiga sits in the middle — full agile features without the enterprise complexity of OpenProject.