How to use Taiga on ARM with virtualization

When trying to run docker container on ARM, you will see an error like this one:

taiga-* The requested image’s platform (linux/amd64) does not match the detected host platform (linux/arm64/v8) and no specific platform was requested

To solve this problem, you can use virtualization to emulate amd64.

Using virtualization can cause performance degradation, so make sure your server is sufficiently performant.

I’m using debian12 for an example to host a Taiga.

  1. Install QEMU and binfmt_misc
    sudo apt update
    sudo apt install qemu-system qemu-user-static binfmt-support
    
  2. Configure binfmt_misc to support AMD64 emulation
    docker run --rm --privileged tonistiigi/binfmt --install all
    
    This step will install the necessary binfiles and configure the system to emulate different architectures.
  3. Restart Docker
    sudo systemctl restart docker
    
  4. Modify the docker-compose.yml file
    For correct operation you need to add to services that require amd64 the line:
    platform: linux/amd64
    
    Your docker-compose.yml might look like this:
    version: "3.5"
    
    x-environment:
      &default-back-environment
      # These environment variables will be used by taiga-back and taiga-async.
      # Database settings
      POSTGRES_DB: "taiga"
      POSTGRES_USER: "${POSTGRES_USER}"
      POSTGRES_PASSWORD: "${POSTGRES_PASSWORD}"
      POSTGRES_HOST: "taiga-db"
      # Taiga settings
      TAIGA_SECRET_KEY: "${SECRET_KEY}"
      TAIGA_SITES_SCHEME: "${TAIGA_SCHEME}"
      TAIGA_SITES_DOMAIN: "${TAIGA_DOMAIN}"
      TAIGA_SUBPATH: "${SUBPATH}"
      # Email settings.
      EMAIL_BACKEND: "django.core.mail.backends.${EMAIL_BACKEND}.EmailBackend"
      DEFAULT_FROM_EMAIL: "${EMAIL_DEFAULT_FROM}"
      EMAIL_USE_TLS: "${EMAIL_USE_TLS}"
      EMAIL_USE_SSL: "${EMAIL_USE_SSL}"
      EMAIL_HOST: "${EMAIL_HOST}"
      EMAIL_PORT: "${EMAIL_PORT}"
      EMAIL_HOST_USER: "${EMAIL_HOST_USER}"
      EMAIL_HOST_PASSWORD: "${EMAIL_HOST_PASSWORD}"
      # Rabbitmq settings
      RABBITMQ_USER: "${RABBITMQ_USER}"
      RABBITMQ_PASS: "${RABBITMQ_PASS}"
      # Telemetry settings
      ENABLE_TELEMETRY: "${ENABLE_TELEMETRY}"
      # ...your customizations go here
    
    x-volumes:
      &default-back-volumes
      # These volumens will be used by taiga-back and taiga-async.
      - taiga-static-data:/taiga-back/static
      - taiga-media-data:/taiga-back/media
      # - ./config.py:/taiga-back/settings/config.py
    
    services:
      taiga-db:
        image: postgres:12.3
    	platform: linux/amd64
        environment:
          POSTGRES_DB: "taiga"
          POSTGRES_USER: "${POSTGRES_USER}"
          POSTGRES_PASSWORD: "${POSTGRES_PASSWORD}"
        healthcheck:
          test: ["CMD-SHELL", "pg_isready -U ${POSTGRES_USER}"]
          interval: 2s
          timeout: 15s
          retries: 5
          start_period: 3s
        volumes:
          - taiga-db-data:/var/lib/postgresql/data
        networks:
          - taiga
    
      taiga-back:
        image: taigaio/taiga-back:latest
    	platform: linux/amd64
        environment: *default-back-environment
        volumes: *default-back-volumes
        networks:
          - taiga
        depends_on:
          taiga-db:
            condition: service_healthy
          taiga-events-rabbitmq:
            condition: service_started
          taiga-async-rabbitmq:
            condition: service_started
    
      taiga-async:
        image: taigaio/taiga-back:latest
    	platform: linux/amd64
        entrypoint: ["/taiga-back/docker/async_entrypoint.sh"]
        environment: *default-back-environment
        volumes: *default-back-volumes
        networks:
          - taiga
        depends_on:
          taiga-db:
            condition: service_healthy
          taiga-events-rabbitmq:
            condition: service_started
          taiga-async-rabbitmq:
            condition: service_started
    
      taiga-async-rabbitmq:
        image: rabbitmq:3.8-management-alpine
        platform: linux/amd64
    	environment:
          RABBITMQ_ERLANG_COOKIE: "${RABBITMQ_ERLANG_COOKIE}"
          RABBITMQ_DEFAULT_USER: "${RABBITMQ_USER}"
          RABBITMQ_DEFAULT_PASS: "${RABBITMQ_PASS}"
          RABBITMQ_DEFAULT_VHOST: "${RABBITMQ_VHOST}"
        hostname: "taiga-async-rabbitmq"
        volumes:
          - taiga-async-rabbitmq-data:/var/lib/rabbitmq
        networks:
          - taiga
    
      taiga-front:
        image: taigaio/taiga-front:latest
    	platform: linux/amd64
        environment:
          TAIGA_URL: "${TAIGA_SCHEME}://${TAIGA_DOMAIN}"
          TAIGA_WEBSOCKETS_URL: "${WEBSOCKETS_SCHEME}://${TAIGA_DOMAIN}"
          TAIGA_SUBPATH: "${SUBPATH}"
          # ...your customizations go here
        networks:
          - taiga
        # volumes:
        #   - ./conf.json:/usr/share/nginx/html/conf.json
    
      taiga-events:
        image: taigaio/taiga-events:latest
    	platform: linux/amd64
        environment:
          RABBITMQ_USER: "${RABBITMQ_USER}"
          RABBITMQ_PASS: "${RABBITMQ_PASS}"
          TAIGA_SECRET_KEY: "${SECRET_KEY}"
        networks:
          - taiga
        depends_on:
          taiga-events-rabbitmq:
            condition: service_started
    
      taiga-events-rabbitmq:
        image: rabbitmq:3.8-management-alpine
    	platform: linux/amd64
        environment:
          RABBITMQ_ERLANG_COOKIE: "${RABBITMQ_ERLANG_COOKIE}"
          RABBITMQ_DEFAULT_USER: "${RABBITMQ_USER}"
          RABBITMQ_DEFAULT_PASS: "${RABBITMQ_PASS}"
          RABBITMQ_DEFAULT_VHOST: "${RABBITMQ_VHOST}"
        hostname: "taiga-events-rabbitmq"
        volumes:
          - taiga-events-rabbitmq-data:/var/lib/rabbitmq
        networks:
          - taiga
    
      taiga-protected:
        image: taigaio/taiga-protected:latest
        platform: linux/amd64
    	environment:
          MAX_AGE: "${ATTACHMENTS_MAX_AGE}"
          SECRET_KEY: "${SECRET_KEY}"
        networks:
          - taiga
    
      taiga-gateway:
        image: nginx:1.19-alpine
    	platform: linux/amd64
        ports:
          - "9000:80"
        volumes:
          - ./taiga-gateway/taiga.conf:/etc/nginx/conf.d/default.conf
          - taiga-static-data:/taiga/static
          - taiga-media-data:/taiga/media
        networks:
          - taiga
        depends_on:
          - taiga-front
          - taiga-back
          - taiga-events
    
    volumes:
      taiga-static-data:
      taiga-media-data:
      taiga-db-data:
      taiga-async-rabbitmq-data:
      taiga-events-rabbitmq-data:
    
    networks:
      taiga:
    
  5. Start Taiga
    docker compose up -d
    
    or
    ./launch-taiga.sh
    
1 Like

Thanks for the guide!

To be clear, installing Taiga from source should work just fine on ARM machines, but our docker images only support AMD architecture out of the box.

Best regards!

1 Like