diff --git a/blueprints/taiga/docker-compose.yml b/blueprints/taiga/docker-compose.yml new file mode 100644 index 00000000..7649d283 --- /dev/null +++ b/blueprints/taiga/docker-compose.yml @@ -0,0 +1,145 @@ +version: "3.8" + +x-environment: &default-back-environment + POSTGRES_DB: taiga + POSTGRES_USER: ${POSTGRES_USER} + POSTGRES_PASSWORD: ${POSTGRES_PASSWORD} + POSTGRES_HOST: taiga-db + TAIGA_SECRET_KEY: ${SECRET_KEY} + TAIGA_SITES_SCHEME: ${TAIGA_SCHEME} + TAIGA_SITES_DOMAIN: ${TAIGA_DOMAIN} + TAIGA_SUBPATH: ${SUBPATH} + 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_USER: ${RABBITMQ_USER} + RABBITMQ_PASS: ${RABBITMQ_PASS} + RABBITMQ_VHOST: ${RABBITMQ_VHOST} + ENABLE_TELEMETRY: ${ENABLE_TELEMETRY} + PUBLIC_REGISTER_ENABLED: ${PUBLIC_REGISTER_ENABLED} + +x-back-volumes: &default-back-volumes + - taiga-static-data:/taiga-back/static + - taiga-media-data:/taiga-back/media + +services: + taiga-db: + image: postgres:12.3 + restart: unless-stopped + 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 + + taiga-back: + image: taigaio/taiga-back:latest + restart: unless-stopped + environment: *default-back-environment + volumes: *default-back-volumes + 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 + restart: unless-stopped + entrypoint: ["/taiga-back/docker/async_entrypoint.sh"] + environment: *default-back-environment + volumes: *default-back-volumes + 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 + restart: unless-stopped + hostname: taiga-async-rabbitmq + environment: + RABBITMQ_ERLANG_COOKIE: ${RABBITMQ_ERLANG_COOKIE} + RABBITMQ_DEFAULT_USER: ${RABBITMQ_USER} + RABBITMQ_DEFAULT_PASS: ${RABBITMQ_PASS} + RABBITMQ_DEFAULT_VHOST: ${RABBITMQ_VHOST} + volumes: + - taiga-async-rabbitmq-data:/var/lib/rabbitmq + + taiga-front: + image: taigaio/taiga-front:latest + restart: unless-stopped + environment: + TAIGA_URL: ${TAIGA_SCHEME}://${TAIGA_DOMAIN} + TAIGA_WEBSOCKETS_URL: ${WEBSOCKETS_SCHEME}://${TAIGA_DOMAIN} + TAIGA_SUBPATH: ${SUBPATH} + PUBLIC_REGISTER_ENABLED: ${PUBLIC_REGISTER_ENABLED_FRONT} + + taiga-events: + image: taigaio/taiga-events:latest + restart: unless-stopped + environment: + RABBITMQ_USER: ${RABBITMQ_USER} + RABBITMQ_PASS: ${RABBITMQ_PASS} + RABBITMQ_VHOST: ${RABBITMQ_VHOST} + TAIGA_SECRET_KEY: ${SECRET_KEY} + depends_on: + taiga-events-rabbitmq: + condition: service_started + + taiga-events-rabbitmq: + image: rabbitmq:3.8-management-alpine + restart: unless-stopped + hostname: taiga-events-rabbitmq + environment: + RABBITMQ_ERLANG_COOKIE: ${RABBITMQ_ERLANG_COOKIE} + RABBITMQ_DEFAULT_USER: ${RABBITMQ_USER} + RABBITMQ_DEFAULT_PASS: ${RABBITMQ_PASS} + RABBITMQ_DEFAULT_VHOST: ${RABBITMQ_VHOST} + volumes: + - taiga-events-rabbitmq-data:/var/lib/rabbitmq + + taiga-protected: + image: taigaio/taiga-protected:latest + restart: unless-stopped + environment: + MAX_AGE: ${ATTACHMENTS_MAX_AGE} + SECRET_KEY: ${SECRET_KEY} + + taiga-gateway: + image: nginx:1.19-alpine + restart: unless-stopped + expose: + - 80 + volumes: + - ../files/volumes/nginx/taiga.conf:/etc/nginx/conf.d/default.conf:ro + - taiga-static-data:/taiga/static:ro + - taiga-media-data:/taiga/media:ro + 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: diff --git a/blueprints/taiga/logo.png b/blueprints/taiga/logo.png new file mode 100644 index 00000000..064c83ef Binary files /dev/null and b/blueprints/taiga/logo.png differ diff --git a/blueprints/taiga/template.toml b/blueprints/taiga/template.toml new file mode 100644 index 00000000..c528fd32 --- /dev/null +++ b/blueprints/taiga/template.toml @@ -0,0 +1,114 @@ +[variables] +main_domain = "${domain}" +postgres_user = "taiga" +postgres_password = "${password:32}" +secret_key = "${password:64}" +rabbitmq_user = "taiga" +rabbitmq_password = "${password:32}" +rabbitmq_erlang_cookie = "${password:32}" + +[config] +env = [ + "TAIGA_SCHEME=https", + "TAIGA_DOMAIN=${main_domain}", + "WEBSOCKETS_SCHEME=wss", + "SUBPATH=", + "SECRET_KEY=${secret_key}", + "POSTGRES_USER=${postgres_user}", + "POSTGRES_PASSWORD=${postgres_password}", + "EMAIL_BACKEND=console", + "EMAIL_HOST=smtp.example.com", + "EMAIL_PORT=587", + "EMAIL_HOST_USER=user", + "EMAIL_HOST_PASSWORD=password", + "EMAIL_DEFAULT_FROM=changeme@example.com", + "EMAIL_USE_TLS=False", + "EMAIL_USE_SSL=False", + "RABBITMQ_USER=${rabbitmq_user}", + "RABBITMQ_PASS=${rabbitmq_password}", + "RABBITMQ_VHOST=taiga", + "RABBITMQ_ERLANG_COOKIE=${rabbitmq_erlang_cookie}", + "ATTACHMENTS_MAX_AGE=360", + "ENABLE_TELEMETRY=False", + "PUBLIC_REGISTER_ENABLED=False", + "PUBLIC_REGISTER_ENABLED_FRONT=false", +] + +[[config.domains]] +serviceName = "taiga-gateway" +port = 80 +host = "${main_domain}" +path = "/" + +[[config.mounts]] +filePath = "/volumes/nginx/taiga.conf" +content = """ +server { + listen 80 default_server; + + client_max_body_size 100M; + charset utf-8; + + location / { + proxy_pass http://taiga-front/; + proxy_pass_header Server; + proxy_set_header Host $http_host; + proxy_redirect off; + proxy_set_header X-Real-IP $remote_addr; + proxy_set_header X-Scheme $scheme; + } + + location /api/ { + proxy_pass http://taiga-back:8000/api/; + proxy_pass_header Server; + proxy_set_header Host $http_host; + proxy_redirect off; + proxy_set_header X-Real-IP $remote_addr; + proxy_set_header X-Scheme $scheme; + } + + location /admin/ { + proxy_pass http://taiga-back:8000/admin/; + proxy_pass_header Server; + proxy_set_header Host $http_host; + proxy_redirect off; + proxy_set_header X-Real-IP $remote_addr; + proxy_set_header X-Scheme $scheme; + } + + location /static/ { + alias /taiga/static/; + } + + location /_protected/ { + internal; + alias /taiga/media/; + add_header Content-disposition "attachment"; + } + + location /media/exports/ { + alias /taiga/media/exports/; + add_header Content-disposition "attachment"; + } + + location /media/ { + 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://taiga-protected:8003/; + proxy_redirect off; + } + + location /events { + proxy_pass http://taiga-events: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; + } +} +""" diff --git a/meta.json b/meta.json index 9e132a03..80889bb6 100644 --- a/meta.json +++ b/meta.json @@ -6654,6 +6654,24 @@ "backup" ] }, + { + "id": "taiga", + "name": "Taiga", + "version": "latest", + "description": "Taiga is a free and open-source project management platform for agile developers, designers and project managers.", + "logo": "logo.png", + "links": { + "github": "https://github.com/taigaio/taiga-docker", + "website": "https://taiga.io/", + "docs": "https://docs.taiga.io/" + }, + "tags": [ + "project-management", + "agile", + "scrum", + "kanban" + ] + }, { "id": "tailscale-exitnode", "name": "Tailscale Exit nodes",