欢迎光临!
若无相欠,怎会相见

Synology 部署开源项目管理工具 Taiga

序言

闲着没事搞自己的小项目, 结果搞了半天经常有遗漏的地方, 因此打算搞起之前用过 Taiga 项目

Taiga 项目是一个开源的 Django 开发的项目管理工具, 这次就在自己 NAS 上用 Docker 部署一个。

安装

Taiga 使用到 9 个镜像, 需要 7 个 Docker 映像, 采用的是 docker-compose 安装方式, 需要准备 3 个配置文件。

env.txt

env.txt 是环境变量文件, 本来是 .env 文件的, 但是在群晖上 .env 文件无法使用文本编辑器套件编辑, 为了方便修改, 故改为 env.txt 文件。

它是在官方的 6.8.0 版本的 .env 文件基础上修改而成, 源文件地址: https://github.com/taigaio/taiga-docker/blob/6.8.0/.env

# Taiga's URLs - Variables to define where Taiga should be served
TAIGA_SCHEME=http  # serve Taiga using "http" or "https" (secured) connection
TAIGA_DOMAIN=<你的设备IP>:9000  # Taiga's base URL
SUBPATH="" # it'll be appended to the TAIGA_DOMAIN (use either "" or a "/subpath")
WEBSOCKETS_SCHEME=ws  # events connection protocol (use either "ws" or "wss")

# Taiga's Secret Key - Variable to provide cryptographic signing
# Please, change it to an unpredictable value!!
SECRET_KEY="<随机输入一长串即可>"

# Taiga's Database settings - Variables to create the Taiga database and connect to it
POSTGRES_USER=taiga  # user to connect to PostgreSQL
POSTGRES_PASSWORD=taiga  # database user's password

# Taiga's SMTP settings - Variables to send Taiga's emails to the users
EMAIL_BACKEND=smtp  # use an SMTP server or display the emails in the console (either "smtp" or "console")
EMAIL_HOST=smtp.qq.com  # SMTP server address
EMAIL_PORT=465   # default SMTP port
EMAIL_HOST_USER=<你的 QQ 邮箱>  # user to connect the SMTP server
EMAIL_HOST_PASSWORD=<授权码>  # SMTP user's password
EMAIL_DEFAULT_FROM=<你的 QQ 邮箱>  # default email address for the automated emails
# EMAIL_USE_TLS/EMAIL_USE_SSL are mutually exclusive (only set one of those to True)
EMAIL_USE_TLS=True  # use TLS (secure) connection with the SMTP server
EMAIL_USE_SSL=False  # use implicit TLS (secure) connection with the SMTP server

# Taiga's RabbitMQ settings - Variables to leave messages for the realtime and asynchronous events
RABBITMQ_USER=taiga  # user to connect to RabbitMQ
RABBITMQ_PASS=taiga  # RabbitMQ user's password
RABBITMQ_VHOST=taiga  # RabbitMQ container name
RABBITMQ_ERLANG_COOKIE=secret-erlang-cookie  # unique value shared by any connected instance of RabbitMQ

# Taiga's Attachments - Variable to define how long the attachments will be accesible
ATTACHMENTS_MAX_AGE=360  # token expiration date (in seconds)

# Taiga's Telemetry - Variable to enable or disable the anonymous telemetry
ENABLE_TELEMETRY=False

taiga.conf

taiga.conf 是 Nginx 的配置文件, 由多个块组成, 定义了不同的请求处理规则, 用于代理前端资源、 API 请求、 管理界面访问、 静态文件服务和媒体文件服务, 以及 WebSocket 事件通信。

该文件来自官方,未做任何修改,文件地址:https://github.com/taigaio/taiga-docker/blob/6.8.0/taiga-gateway/taiga.conf

server {
    listen 80 default_server;

    client_max_body_size 100M;
    charset utf-8;

    # Frontend
    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;
    }

    # API
    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;
    }

    # Admin
    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;
    }

    # Static
    location /static/ {
        alias /taiga/static/;
    }

    # Media
    location /_protected/ {
        internal;
        alias /taiga/media/;
        add_header Content-disposition "attachment";
    }

    # Unprotected section
    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;
    }

    # Events
    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;
    }
}

docker-compose.yml

在官方的基础上, 做了微调, 添加了 container_name 字段以及更新了 postgres 为 13, 官方源文件地址:https://github.com/taigaio/taiga-docker/blob/6.8.0/docker-compose.yml

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
  PUBLIC_REGISTER_ENABLED: "True"
  SESSION_COOKIE_SECURE: "False"
  CSRF_COOKIE_SECURE: "False"

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:13
    container_name: taiga-db
    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
    container_name: taiga-back
    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
    container_name: taiga-async
    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
    container_name: 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}"
    hostname: "taiga-async-rabbitmq"
    volumes:
      - ./taiga-async-rabbitmq-data:/var/lib/rabbitmq
    networks:
      - taiga

  taiga-front:
    image: taigaio/taiga-front:latest
    container_name: taiga-front
    environment:
      TAIGA_URL: "${TAIGA_SCHEME}://${TAIGA_DOMAIN}"
      TAIGA_WEBSOCKETS_URL: "${WEBSOCKETS_SCHEME}://${TAIGA_DOMAIN}"
      TAIGA_SUBPATH: "${SUBPATH}"
      # ...your customizations go here
      PUBLIC_REGISTER_ENABLED: "true"
    networks:
      - taiga
    # volumes:
    #   - ./conf.json:/usr/share/nginx/html/conf.json

  taiga-events:
    image: taigaio/taiga-events:latest
    container_name: taiga-events
    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
    container_name: 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}"
    hostname: "taiga-events-rabbitmq"
    volumes:
      - ./taiga-events-rabbitmq-data:/var/lib/rabbitmq
    networks:
      - taiga

  taiga-protected:
    image: taigaio/taiga-protected:latest
    container_name: taiga-protected
    environment:
      MAX_AGE: "${ATTACHMENTS_MAX_AGE}"
      SECRET_KEY: "${SECRET_KEY}"
    networks:
      - taiga

  taiga-gateway:
    image: nginx:1.19-alpine
    container_name: taiga-gateway
    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:

OK, 三个配置文件准备完毕, 开始下一步。

然后在三个配置文件的同级目录创建 docker-compose.yml 文件中 volumes 下面的5个文件夹。

紫色框的是配置文件, 和官方的目录结构一致 https://github.com/taigaio/taiga-docker。 红色的需要创建的目录。

也可以使用命令在配置文件的同级目录里快速创建:

mkdir -p ./{taiga-static-data,taiga-media-data,taiga-db-data,taiga-async-rabbitmq-data,taiga-events-rabbitmq-data}

然后可以执行如下命令

docker-compose -f docker-compose.yml --env-file env.txt up -d

如果出现如下错误

Pulling taiga-db (postgres:13)...
ERROR: Get "https://registry-1.docker.io/v2/": net/http: request canceled while waiting for connection (Client.Timeout exceeded while awaiting headers)

可以尝试在 Synology 控制面板中设置一个梯子, 在 docker 中手动下载如下 7 个映像, 其中  taiga-back 和 rabbitmq 各启动了两个

postgres:13
taigaio/taiga-back:latest
rabbitmq:3.8-management-alpine
taigaio/taiga-front:latest
taigaio/taiga-events:latest
taigaio/taiga-protected:latest
nginx:1.19-alpine

然后再执行上方的命令, 如下就是 OK 了

如上图就可以正常使用了。

最后一步就是创建一个超级管理员账号

# 进入 taiga-back 容器
docker exec -it taiga-back /bin/bash

# 创建管理员用户
python manage.py createsuperuser

可视化操作如下:

输入自己用户名, email 和密码就 OK 了。

可以用这个账号密码登录 Taiga 或后台管理。

另外, 也可以为群晖设置一个计划任务, 开机之后执行如下命令启动 Taiga

cd /volume1/1-Important/Docker/Taiga && docker-compose -f docker-compose.yml --env-file env.txt up -d

注意修改为自己路径。

也可以自行手动打开 Docker 启动。

结语

从元旦当天折腾到现在, 终于是弄好了, 这个是基于 6.8.0 版本搭建的, docker 映像是当前最新的 6.8.1 版本, 官方好像遗漏了 6.8.0 版本。

如有错误, 敬请指出, 感谢指正!  — 2025-01-02  21:25:24

赞(0) 打赏
转载请注明:飘零博客 » Synology 部署开源项目管理工具 Taiga
分享到: 更多 (0)

评论 抢沙发

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址

欢迎光临