Taiga project management app

i’m using Portainer, because in the past (at EEL release) i got few problems attacching my yaml with an app (photoprism) as custom app… but i don’t think is your case, i see that you have messed up with volumes, example

    volumes:
      - taiga-db-data:/mnt/.../Taiga/db-data

must be

    volumes:
      - /mnt/.../Taiga/db-data:/var/lib/postgresql/data

or define taiga-db-data as /mnt/.../Taiga/db-data and use it

services:
  taiga-db:
...
    volumes:
      - taiga-db-data:/var/lib/postgresql/data
...
volumes:
...
  taiga-db-data:
    driver: local
    driver_opts:
      type: none
      device: /mnt/.../Taiga/db-data
      o: bind
  taiga-async-r

taiga-async-rabbitmq is not defined (don’t know where the data is going, watching log i think ix volumes are filling this and IMHO is not good way to deploy an app); same for taiga-events-rabbitmq.
For taiga-gateway: static-data and media-data are not defined (the nginx conf looks good to me).

Also, not mandatory, but for taiga-db specify a port, or if another container is running postgres you can have collision

services:
  taiga-db:
    image: postgres:12.3
    environment:
      POSTGRES_DB: "taiga"
      POSTGRES_USER: "taiga"
      POSTGRES_PASSWORD: "***"
    healthcheck:
      test: ["CMD-SHELL", "pg_isready -U taiga"]
      interval: 2s
      timeout: 15s
      retries: 5
      start_period: 3s
    ports:
      - "25432:5432"     #left is the dest port you expose 
    volumes:
      - taiga-db-data:/var/lib/postgresql/data
    networks:
      - taiga
1 Like

:man_facepalming:. I changed the container side, not the host side.

Good point.

Still learning my way around the yaml-side,

Thanks

Let me know how is going with those fix, if you can deploy it.
For the permission: from my experience, if nested dataset are used, eg

📂 Docker
├── 📂 Taiga
│   ├── 📂DB 
│   ├── 📂Static
│   ├── 📂Upload
└── 📂 Other app

and you have well assigned the user netdata:docker (999:999) the right permission on DB dataset, but still have permission error… you should verify that they can traverse the upper dataset to reach theyr designed dataset

Nada. Still missing something.

[2025/03/13 20:55:32] (ERROR) app_lifecycle.compose_action():56 - Failed 'down' action for 'taiga' app: service "taiga-gateway" refers to undefined volume static-data: invalid compose project

[2025/03/13 20:55:32] (ERROR) app_lifecycle.compose_action():56 - Failed 'down' action for 'taiga' app: service "taiga-gateway" refers to undefined volume static-data: invalid compose project
taiga-gateway:
    image: nginx:1.19-alpine
    ports:   #{host}:{container}
      - 9009:80
    volumes:
      - /mnt/.../Taiga/taiga-gateway/taiga.conf:/etc/nginx/conf.d/default.conf
      - /mnt/Virtualization/Apps/Taiga/static-data:/var/taiga/static
      - /mnt/Virtualization/Apps/Taiga/media-data:/var/taiga/media

Thought I corrected that.

[2025/03/14 01:02:25] (ERROR) app_lifecycle.compose_action():56 - Failed 'down' action for 'taiga' app: validating /mnt/.ix-apps/app_configs/taiga/versions/1.0.0/templates/rendered/docker-compose.yaml: services.taiga-db.ports must be a list

[2025/03/14 01:02:25] (ERROR) app_lifecycle.compose_action():56 - Failed 'down' action for 'taiga' app: validating /mnt/.ix-apps/app_configs/taiga/versions/1.0.0/templates/rendered/docker-compose.yaml: services.taiga-db.ports must be a list

[2025/03/14 01:14:45] (ERROR) app_lifecycle.compose_action():56 - Failed 'down' action for 'taiga' app: validating /mnt/.ix-apps/app_configs/taiga/versions/1.0.0/templates/rendered/docker-compose.yaml: services.taiga-db.ports must be a list

As for this, I have no clue. “services.taiga-db.ports” isn’t in the config file.

From the Apps directory down (not the root directory of my pool), I have 999:999 full control set.

dumb question, did you replace the dot right? :smiley:

odd. try to add it as i suggested above, be carefull on formatting. You can leave it at default 5423:5423

1 Like

Here’s the full line

      - /mnt/Virtualization/Apps/Taiga/taiga-gateway/taiga.conf:/etc/nginx/conf.d/default.conf

Yup, called it. lol. I left out the dash at the beginning.

Ok, tenth time’s a charm :laughing: :crossed_fingers:

1 Like

Progress. I only have 1 error this time.

Error response from daemon: failed to create task for container: failed to create shim task: OCI runtime create failed: runc create failed: unable to start container process: error during container init: error mounting "/mnt/Virtualization/Apps/Taiga/taiga-gateway/taiga.conf" to rootfs at "/etc/nginx/conf.d/default.conf": mount /mnt/Virtualization/Apps/Taiga/taiga-gateway/taiga.conf:/etc/nginx/conf.d/default.conf (via /proc/self/fd/6), flags: 0x5000: not a directory: unknown: Are you trying to mount a directory onto a file (or vice-versa)? Check if the specified host path exists and is the expected type

did you create the taiga.conf empty file? probably something i missed to specify in the previous post :grimacing:

Did now.

Instead of creating a file, it created a folder.

@oxyde GOAT!!

Completes successfully now.

Thank you much.

I just have a piddly little issue with not being able to access the webUI. But that’s now an easy fix, as I can rebuild the container as much as I need until I figure it out.

I should at least be able to do that on my own.

1 Like

taiga-docker-compose-template.yml (4.6 KB)

I replaced the parts specific to my setup with placeholders, in case anyone wants to use it.

Code if you want to look without downloading.

x-environment:
&default-back-environment

These environment variables will be used by taiga-back and taiga-async.

Database settings

POSTGRES_DB: taiga
POSTGRES_USER: taiga
POSTGRES_PASSWORD: taiga
POSTGRES_HOST: taiga-db

Taiga settings

TAIGA_SECRET_KEY: {SECRET_KEY}
TAIGA_SITES_SCHEME: http
TAIGA_SITES_DOMAIN: localhost:9000
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: taiga
RABBITMQ_PASS: taiga

Telemetry settings

ENABLE_TELEMETRY: True

…your customizations go here

x-volumes: #{host}:{container}
&default-back-volumes

These volumens will be used by taiga-back and taiga-async.

  • {LOCAL_DIRECTORY}taiga-static-data:/taiga-back/static
  • {LOCAL_DIRECTORY}/taiga-media-data:/taiga-back/media

- ./config.py:/taiga-back/settings/config.py

services:
taiga-db:
image: postgres:latest
environment:
POSTGRES_DB: taiga
POSTGRES_USER: taiga
POSTGRES_PASSWORD: taiga
healthcheck:
test: [“CMD-SHELL”, “pg_isready -U taiga”]
interval: 2s
timeout: 15s
retries: 5
start_period: 3s
ports: #{host}:{container}
- 25432:25432
volumes: #{host}:{container}
- {LOCAL_DIRECTORY}/db-data:/var/lib/postgresql/data

networks:
  - taiga

taiga-back:
image: taigaio/taiga-back:latest
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
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:latest
environment:
RABBITMQ_ERLANG_COOKIE: secret-erlang-cookie
RABBITMQ_DEFAULT_USER: taiga
RABBITMQ_DEFAULT_PASS: taiga
RABBITMQ_DEFAULT_VHOST: taiga
hostname: taiga-async-rabbitmq
volumes: #{host}:{container}
- {LOCAL_DIRECTORY}/taiga-async-rabbitmq-data:/var/lib/rabbitmq
networks:
- taiga

taiga-front:
image: taigaio/taiga-front:latest
environment:
TAIGA_URL: http://localhost9000
TAIGA_WEBSOCKETS_URL: ws://localhost:9000

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
environment:
RABBITMQ_USER: taiga
RABBITMQ_PASS: taiga
TAIGA_SECRET_KEY: {SECRET_KEY}
networks:
- taiga
depends_on:
taiga-events-rabbitmq:
condition: service_started

taiga-events-rabbitmq:
image: rabbitmq:latest
environment:
RABBITMQ_ERLANG_COOKIE: secret-erlang-cookie
RABBITMQ_DEFAULT_USER: taiga
RABBITMQ_DEFAULT_PASS: taiga
RABBITMQ_DEFAULT_VHOST: taiga
hostname: taiga-events-rabbitmq
volumes: #{host}:{container}
- {LOCAL_DIRECTORY}/events-rabbitmq-data:/var/lib/rabbitmq
networks:
- taiga

taiga-protected:
image: taigaio/taiga-protected:latest
environment:
MAX_AGE: 360
SECRET_KEY: {SECRET_KEY}
networks:
- taiga

taiga-gateway:
image: nginx:1.19-alpine
ports: #{host}:{container}
- 9000:80
volumes: #{host}:{container}
- {LOCAL_DIRECTORY}/taiga-gateway/taiga.conf:/etc/nginx/conf.d/default.conf # Need to create an empty file named “taiga.conf”
- {LOCAL_DIRECTORY}/static-data:/var/taiga/static
- {LOCAL_DIRECTORY}/media-data:/var/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:

Just replying to the general question here. If you use the ACL options in the app install wizard they’ll allow you to map an ACE for any UID or GID. The container side ID does not need to match user or group name in TrueNAS, nor does the group or user even have to exist outside the container.

Good to know for setting up other containers.

I had enough trouble getting it going using the yaml. Trying to figure out how to do this via the GUI is opening up another can of worms I’m not ready to tackle just yet. As this yaml pulled multiple containers, and had a “depends on” (I’m assuming that would be added as an environment variable).