DebianDebian Based

How To Install Taiga on Debian 13

Install Taiga on Debian 13

Taiga stands out as a powerful open-source project management platform designed specifically for agile teams who need robust tools without recurring subscription costs. This comprehensive guide walks you through installing Taiga on Debian 13, transforming your server into a self-hosted project management powerhouse that rivals commercial solutions like Jira, Trello, and Asana. Whether you’re managing Scrum sprints, Kanban boards, or hybrid workflows, you’ll discover how to deploy a production-ready Taiga instance with proper security configurations and performance optimization. By following this step-by-step tutorial, you’ll gain complete control over your project data while building expertise in Linux server administration.

Understanding Taiga Architecture

Before diving into the installation process, understanding Taiga’s architecture helps you troubleshoot issues and customize your deployment effectively.

Core Components

Taiga operates through three primary components that work in harmony. The taiga-back serves as the backend API, built on Django and Python, handling all business logic, authentication, and database operations. The taiga-front provides the user-facing interface, constructed with Angular to deliver a responsive and intuitive experience. Finally, the optional taiga-events component functions as a WebSocket gateway, enabling real-time updates across team members’ browsers without manual refreshing.

System Architecture Overview

The complete Taiga stack comprises multiple layers working together seamlessly. PostgreSQL forms the database layer, storing all project data, user information, and configurations. Python virtual environments isolate the application layer, preventing dependency conflicts with system packages. Nginx acts as the reverse proxy and web server, efficiently serving static files while routing API requests to the backend. For installations requiring real-time collaboration, RabbitMQ provides message queue functionality, enabling instant notifications and updates. This layered architecture ensures scalability, allowing your Taiga instance to grow alongside your organization’s needs.

Prerequisites and System Requirements

Hardware Requirements

Your server must meet minimum specifications for stable Taiga operation. Allocate at least 2GB of RAM, though 4GB or more is strongly recommended for production environments handling multiple concurrent users. Reserve 10GB of storage space minimum, with additional capacity depending on expected file uploads and attachments. A dual-core processor suffices for small teams, but consider quad-core CPUs for larger organizations. Remember that compiling certain Python packages during installation temporarily increases resource demands.

Software Requirements

Start with a fresh Debian 13 installation to avoid conflicts with existing services. You’ll need root access or sudo privileges throughout this installation process. Having a domain name or static IP address ready facilitates access and SSL certificate configuration. While optional for testing environments, SSL certificates are essential for production deployments to protect sensitive project data.

Required Knowledge

This guide assumes familiarity with basic Linux command-line operations. You should feel comfortable using text editors like nano or vim to modify configuration files. Understanding fundamental networking concepts helps when configuring Nginx and firewall rules. Basic database management knowledge proves valuable during PostgreSQL setup, though we’ll cover each step in detail.

Step 1: Initial System Preparation

Update System Packages

Begin by refreshing your package repositories to ensure you’re installing the latest software versions:

sudo apt update
sudo apt upgrade -y

This critical security step patches known vulnerabilities and prevents compatibility issues. The process may take several minutes depending on your system’s current state.

Install Essential Dependencies

Taiga requires numerous development libraries and tools. Install everything needed with this comprehensive command:

sudo apt install -y build-essential git python3 python3-pip python3-dev python3-venv \
postgresql postgresql-contrib postgresql-server-dev-all libpq-dev \
libjpeg-dev libpng-dev libfreetype6-dev zlib1g-dev \
libxml2-dev libxslt1-dev libssl-dev libffi-dev curl

Each package serves specific purposes: build-essential provides compilation tools, git enables repository cloning, Python packages support the backend, PostgreSQL libraries facilitate database connectivity, and image processing libraries handle user avatars and file uploads.

Step 2: PostgreSQL Database Setup

Install and Configure PostgreSQL

Debian 13 includes PostgreSQL in its default repositories. Start and enable the database service:

sudo systemctl start postgresql
sudo systemctl enable postgresql
sudo systemctl status postgresql

The status command should confirm PostgreSQL is running actively. Green “active (running)” status indicates successful initialization.

Create Taiga Database and User

Switch to the PostgreSQL system user and access the database prompt:

sudo -u postgres psql

Execute these SQL commands to establish Taiga’s database infrastructure:

CREATE DATABASE taiga;
CREATE USER taiga WITH PASSWORD 'StrongPassword123!';
GRANT ALL PRIVILEGES ON DATABASE taiga TO taiga;
\q

Replace ‘StrongPassword123!’ with a genuinely strong, randomly generated password. Store this credential securely; you’ll need it for backend configuration. Strong passwords combine uppercase, lowercase, numbers, and special characters, minimizing unauthorized access risks.

Test your database connection to verify proper setup:

psql -U taiga -d taiga -h localhost

Enter your password when prompted. Successful login confirms your database is ready.

Step 3: Create Taiga System User

Running services under dedicated user accounts follows security best practices by limiting potential damage from compromised processes. Create the taiga user:

sudo adduser --system --group --home /home/taiga taiga

This command creates a system account without login capabilities, enhancing security. Switch to this user for installation steps:

sudo su - taiga

Create necessary directory structures within the taiga home:

mkdir -p ~/logs ~/media ~/static

These directories segregate log files, user uploads, and static assets, simplifying backups and maintenance.

Step 4: Install and Configure Taiga Backend

Clone Backend Repository

Navigate to the taiga user’s home directory and clone the official repository:

cd /home/taiga
git clone https://github.com/kaleidos-ventures/taiga-back.git taiga-back
cd taiga-back
git checkout stable

The stable branch receives thorough testing before release, making it appropriate for production deployments. Development branches contain cutting-edge features but may include bugs.

Set Up Python Virtual Environment

Virtual environments prevent dependency conflicts between Taiga and other Python applications:

python3 -m venv .venv
source .venv/bin/activate

Your prompt should now display “(.venv)” indicating activation. Install backend dependencies:

pip install --upgrade pip wheel
pip install -r requirements.txt

This installation process downloads and compiles numerous packages. Expect 5-10 minutes on modest hardware. If errors occur, verify all system dependencies installed correctly in Step 1.

Configure Backend Settings

Create the settings directory and configuration file:

mkdir -p ~/taiga-back/settings
nano ~/taiga-back/settings/config.py

Add this configuration, adjusting values for your environment:

from .common import *

DATABASES = {
    'default': {
        'ENGINE': 'django.db.backends.postgresql',
        'NAME': 'taiga',
        'USER': 'taiga',
        'PASSWORD': 'StrongPassword123!',
        'HOST': 'localhost',
        'PORT': '5432',
    }
}

SECRET_KEY = 'your-generated-secret-key-here'
DEBUG = False
PUBLIC_REGISTER_ENABLED = True

SITES = {
    "front": {
        "scheme": "http",
        "domain": "your-domain.com",
        "name": "taiga"
    },
    "api": {
        "scheme": "http",
        "domain": "your-domain.com",
        "name": "taiga"
    }
}

MEDIA_URL = "http://your-domain.com/media/"
STATIC_URL = "http://your-domain.com/static/"

Generate a secure SECRET_KEY using Python:

python -c 'import secrets; print(secrets.token_urlsafe(50))'

The SECRET_KEY protects session data and cryptographic operations. Never share this value publicly or commit it to version control.

Step 5: Initialize Database and Backend

Run Database Migrations

With your virtual environment still activated, initialize the database schema:

cd ~/taiga-back
source .venv/bin/activate
python manage.py migrate --noinput

Migrations create tables, indexes, and relationships required for Taiga’s operation. You’ll see numerous “Applying…” messages as Django builds your database structure.

Load Initial Data

Populate essential reference data:

python manage.py loaddata initial_user
python manage.py loaddata initial_project_templates
python manage.py loaddata initial_role
python manage.py createsuperuser

The createsuperuser command prompts for administrator credentials. Use a strong password and valid email address. This account provides full system access for initial configuration.

Collect static files into your designated directory:

python manage.py collectstatic --noinput
python manage.py compilemessages

These commands gather CSS, JavaScript, and translation files, preparing them for efficient serving by Nginx.

Step 6: Test Backend Installation

Verify your backend functions correctly before proceeding:

python manage.py runserver 0.0.0.0:8000

Open a web browser and navigate to http://your-server-ip:8000/api/v1/. You should see JSON output listing API endpoints. This confirms successful backend installation. Press Ctrl+C to stop the development server. Never use runserver in production; we’ll configure proper process management later.

Step 7: Install and Configure Taiga Frontend

Install Node.js and npm

Exit the taiga user session and return to your administrative account:

exit

Install Node.js from the official repository:

curl -fsSL https://deb.nodesource.com/setup_18.x | sudo -E bash -
sudo apt install -y nodejs
node --version
npm --version

Verify Node.js version 18 or higher installed successfully. Version compatibility matters for building frontend assets properly.

Clone and Configure Frontend

Switch back to the taiga user:

sudo su - taiga
cd /home/taiga
git clone https://github.com/kaleidos-ventures/taiga-front-dist.git taiga-front-dist
cd taiga-front-dist
git checkout stable

Create the configuration file:

nano ~/taiga-front-dist/dist/conf.json

Insert this configuration:

{
    "api": "http://your-domain.com/api/v1/",
    "eventsUrl": null,
    "debug": false,
    "publicRegisterEnabled": true,
    "feedbackEnabled": true,
    "privacyPolicyUrl": null,
    "termsOfServiceUrl": null,
    "maxUploadFileSize": 104857600,
    "contribPlugins": []
}

Set eventsUrl to your WebSocket URL if you’ll install taiga-events later. The maxUploadFileSize value controls attachment limits in bytes (100MB in this example).

Step 8: Install and Configure RabbitMQ (Optional)

Real-time updates require RabbitMQ and taiga-events. Skip this section if immediate notifications aren’t essential for your workflow.

Install RabbitMQ

Return to your administrative user and install RabbitMQ:

exit
sudo apt install -y rabbitmq-server
sudo systemctl start rabbitmq-server
sudo systemctl enable rabbitmq-server

RabbitMQ runs as a background service, handling message delivery between Taiga components.

Configure Taiga Events

Switch back to taiga user and clone the events repository:

sudo su - taiga
cd /home/taiga
git clone https://github.com/kaleidos-ventures/taiga-events.git
cd taiga-events
git checkout stable
npm install

Create the configuration file:

nano ~/taiga-events/config.json

Add connection details:

{
    "url": "amqp://guest:guest@localhost:5672",
    "secret": "your-same-secret-key-from-backend",
    "webSocketServer": {
        "port": 8888
    }
}

The secret value must match your backend SECRET_KEY exactly. This authenticates event publishing between components.

Step 9: Configure Nginx Web Server

Install Nginx

Install and start Nginx:

exit
sudo apt install -y nginx
sudo systemctl start nginx
sudo systemctl enable nginx

Create Taiga Server Block

Create a new Nginx configuration:

sudo nano /etc/nginx/sites-available/taiga

Add this comprehensive server block:

server {
    listen 80;
    server_name your-domain.com;
    
    large_client_header_buffers 4 32k;
    client_max_body_size 100M;
    charset utf-8;

    access_log /home/taiga/logs/nginx.access.log;
    error_log /home/taiga/logs/nginx.error.log;

    # Frontend
    location / {
        root /home/taiga/taiga-front-dist/dist/;
        try_files $uri $uri/ /index.html;
    }

    # Backend API
    location /api {
        proxy_set_header Host $http_host;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Scheme $scheme;
        proxy_set_header X-Forwarded-Proto $scheme;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_pass http://127.0.0.1:8001/api;
        proxy_redirect off;
    }

    # Admin panel
    location /admin {
        proxy_set_header Host $http_host;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Scheme $scheme;
        proxy_set_header X-Forwarded-Proto $scheme;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_pass http://127.0.0.1:8001/admin;
        proxy_redirect off;
    }

    # Static files
    location /static {
        alias /home/taiga/taiga-back/static;
    }

    # Media files
    location /media {
        alias /home/taiga/taiga-back/media;
    }

    # Events (if installed)
    location /events {
        proxy_pass http://127.0.0.1:8888/events;
        proxy_http_version 1.1;
        proxy_set_header Upgrade $http_upgrade;
        proxy_set_header Connection "upgrade";
        proxy_connect_timeout 7d;
        proxy_send_timeout 7d;
        proxy_read_timeout 7d;
    }
}

Enable the site and test configuration:

sudo ln -s /etc/nginx/sites-available/taiga /etc/nginx/sites-enabled/
sudo nginx -t
sudo systemctl reload nginx

The nginx -t command validates syntax before applying changes, preventing service disruptions from configuration errors.

For production deployments, obtain free SSL certificates from Let’s Encrypt:

sudo apt install -y certbot python3-certbot-nginx
sudo certbot --nginx -d your-domain.com

Certbot automatically modifies your Nginx configuration to enable HTTPS and redirect HTTP traffic.

Step 10: Set Up Process Management with Systemd

Development servers aren’t suitable for production. Systemd ensures Taiga starts automatically and restarts after crashes.

Create Backend Service

Create the backend service file:

sudo nano /etc/systemd/system/taiga-back.service

Insert this configuration:

[Unit]
Description=Taiga Backend
After=network.target postgresql.service

[Service]
Type=simple
User=taiga
Group=taiga
WorkingDirectory=/home/taiga/taiga-back
Environment="PYTHONUNBUFFERED=1"
ExecStart=/home/taiga/taiga-back/.venv/bin/gunicorn \
    --workers 4 \
    --timeout 60 \
    --bind 127.0.0.1:8001 \
    --log-level=info \
    --access-logfile /home/taiga/logs/gunicorn-access.log \
    --error-logfile /home/taiga/logs/gunicorn-error.log \
    taiga.wsgi
Restart=always
RestartSec=3

[Install]
WantedBy=multi-user.target

Install Gunicorn first:

sudo su - taiga
cd ~/taiga-back
source .venv/bin/activate
pip install gunicorn
exit

Create Events Service (Optional)

If you installed taiga-events, create its service file:

sudo nano /etc/systemd/system/taiga-events.service

Add this configuration:

[Unit]
Description=Taiga Events
After=network.target rabbitmq-server.service

[Service]
Type=simple
User=taiga
Group=taiga
WorkingDirectory=/home/taiga/taiga-events
ExecStart=/usr/bin/node /home/taiga/taiga-events/index.js
Restart=always
RestartSec=3

[Install]
WantedBy=multi-user.target

Enable and start all services:

sudo systemctl daemon-reload
sudo systemctl start taiga-back
sudo systemctl enable taiga-back
sudo systemctl start taiga-events  # if applicable
sudo systemctl enable taiga-events  # if applicable
sudo systemctl status taiga-back

Check logs if services fail to start:

sudo journalctl -u taiga-back -f

Step 11: Security Hardening

Firewall Configuration

Protect your server with a properly configured firewall:

sudo apt install -y ufw
sudo ufw allow 22/tcp
sudo ufw allow 80/tcp
sudo ufw allow 443/tcp
sudo ufw enable
sudo ufw status

UFW blocks all ports except those explicitly allowed. SSH access (port 22) remains available for remote administration.

Additional Security Measures

Change default PostgreSQL authentication by editing pg_hba.conf to use md5 instead of trust for local connections. Set restrictive file permissions:

sudo chmod 750 /home/taiga/taiga-back/settings
sudo chmod 640 /home/taiga/taiga-back/settings/config.py

Implement regular backup schedules using cron jobs. Export your database nightly:

sudo -u postgres pg_dump taiga > /backups/taiga-$(date +%Y%m%d).sql

Configure Nginx security headers by adding these lines to your server block:

add_header X-Frame-Options "SAMEORIGIN" always;
add_header X-Content-Type-Options "nosniff" always;
add_header X-XSS-Protection "1; mode=block" always;

Keep Taiga updated by regularly checking the official repository for new stable releases.

Step 12: Post-Installation Configuration

Access Taiga Interface

Open your web browser and navigate to your configured domain. You’ll see Taiga’s login screen. Use the superuser credentials created earlier to sign in.

The first login presents a configuration wizard. Set your organization name, default language, and timezone. Change the default admin password immediately through the user profile settings. Strong password practices prevent unauthorized access to your project management system.

Install Taiga on Debian 13

Initial Configuration

Create your first project by clicking the “New Project” button. Choose between Scrum, Kanban, or Issue tracking templates depending on your workflow preferences. Invite team members via email addresses. They’ll receive registration links to join your Taiga instance.

Configure email notifications through the Django admin panel at /admin/. Navigate to Settings → Email and enter your SMTP server details. Proper email configuration enables password resets, task assignments, and comment notifications.

Set up automated backups for both the database and media files. Create a backup script:

sudo nano /usr/local/bin/backup-taiga.sh

Add backup logic:

#!/bin/bash
BACKUP_DIR="/backups/taiga"
DATE=$(date +%Y%m%d_%H%M%S)

# Database backup
sudo -u postgres pg_dump taiga | gzip > $BACKUP_DIR/db-$DATE.sql.gz

# Media files backup
tar -czf $BACKUP_DIR/media-$DATE.tar.gz /home/taiga/taiga-back/media/

# Cleanup old backups (keep 30 days)
find $BACKUP_DIR -type f -mtime +30 -delete

Make executable and schedule:

sudo chmod +x /usr/local/bin/backup-taiga.sh
sudo crontab -e

Add this cron entry for daily 2 AM backups:

0 2 * * * /usr/local/bin/backup-taiga.sh

Troubleshooting Common Issues

Backend Issues

Database connection errors typically indicate incorrect credentials in config.py. Verify your PostgreSQL password matches exactly, including case sensitivity. Test database connectivity manually using psql.

Python dependency conflicts arise from version mismatches. Recreate your virtual environment and reinstall requirements.txt if pip reports incompatibilities. Always activate the virtual environment before running Django commands.

Static files not loading suggests collectstatic didn’t run successfully or Nginx can’t access the static directory. Check file permissions ensure the taiga user owns all files:

sudo chown -R taiga:taiga /home/taiga/taiga-back/static

Frontend Issues

API connection failures manifest as spinning loaders that never complete. Inspect your browser’s developer console for errors. Verify conf.json contains the correct API URL including the trailing slash.

CORS errors prevent frontend-backend communication. Ensure your config.py SITES settings match your actual domain exactly. Protocol mismatches (http vs https) commonly cause CORS problems.

Asset loading problems appear as unstyled pages or missing functionality. Clear your browser cache and verify Nginx serves files from the correct taiga-front-dist/dist/ directory.

Nginx and Network Issues

502 Bad Gateway errors indicate Nginx cannot reach the backend. Confirm taiga-back service runs properly:

sudo systemctl status taiga-back

Check that Gunicorn listens on 127.0.0.1:8001 by examining process bindings:

sudo netstat -tlnp | grep 8001

Timeout errors during large file uploads require increasing client_max_body_size in your Nginx configuration. Match this value with maxUploadFileSize in frontend conf.json.

WebSocket connection failures prevent real-time updates. Verify taiga-events service runs and RabbitMQ accepts connections. Test WebSocket connectivity using browser developer tools’ Network tab.

Review logs systematically when troubleshooting:

# Backend logs
sudo journalctl -u taiga-back -n 100

# Nginx logs
sudo tail -f /home/taiga/logs/nginx.error.log

# Events logs (if applicable)
sudo journalctl -u taiga-events -n 100

Maintenance and Updates

Keep your Taiga installation healthy through regular maintenance. Update the backend by pulling the latest stable branch:

sudo su - taiga
cd ~/taiga-back
source .venv/bin/activate
git pull origin stable
pip install -r requirements.txt --upgrade
python manage.py migrate
python manage.py collectstatic --noinput
exit
sudo systemctl restart taiga-back

Update the frontend similarly:

sudo su - taiga
cd ~/taiga-front-dist
git pull origin stable
exit
sudo systemctl reload nginx

Back up your database before major updates. PostgreSQL provides consistent backups even while Taiga runs:

sudo -u postgres pg_dump taiga | gzip > /backups/taiga-pre-update.sql.gz

Monitor Taiga performance using system tools. Watch CPU and memory usage:

htop

High memory consumption might indicate insufficient worker processes or memory leaks requiring service restarts.

Configure log rotation to prevent disk space exhaustion:

sudo nano /etc/logrotate.d/taiga

Add rotation rules:

/home/taiga/logs/*.log {
    daily
    rotate 14
    compress
    delaycompress
    notifempty
    missingok
    copytruncate
}

Upgrade Debian system packages quarterly to maintain security:

sudo apt update
sudo apt upgrade -y
sudo apt autoremove -y

Congratulations! You have successfully installed Taiga. Thanks for using this tutorial for installing the Taiga project management tool on the Debian 13 “Trixie” system. For additional help or useful information, we recommend you check the official Taiga website.

VPS Manage Service Offer
If you don’t have time to do all of this stuff, or if this is not your area of expertise, we offer a service to do “VPS Manage Service Offer”, starting from $10 (Paypal payment). Please contact us to get the best deal!

r00t

r00t is an experienced Linux enthusiast and technical writer with a passion for open-source software. With years of hands-on experience in various Linux distributions, r00t has developed a deep understanding of the Linux ecosystem and its powerful tools. He holds certifications in SCE and has contributed to several open-source projects. r00t is dedicated to sharing her knowledge and expertise through well-researched and informative articles, helping others navigate the world of Linux with confidence.
Back to top button