序言
闲着没事搞自己的小项目, 结果搞了半天经常有遗漏的地方, 因此打算搞起之前用过 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
如上图就可以正常使用了。
最后一步就是创建一个超级管理员账号
# 进入 taiga-back 容器
docker exec -it taiga-back /bin/bash
# 创建管理员用户
python manage.py createsuperuser
输入自己用户名, email 和密码就 OK 了。
另外, 也可以为群晖设置一个计划任务, 开机之后执行如下命令启动 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
最新评论
这个软件有bug的,客户端windows有些键不能用如逗号、句号
没有收到邮件通知
我的评论通知貌似坏掉了,定位一下问题
测试一下重新部署后的邮件功能
居然看到自己公司的MIB库,诚惶诚恐
那可能是RobotFramework-ride的版本问题。我装的1.7.4.2,有这个限制。我有空再尝试下旧版本吧,感谢回复。
你好!我在python2.7中安装RobotFramework-ride的时候提示wxPython的版本最高是2.18.12,用pip下载的wxPython版本是4.10,而且我在那个路径下没有找到2
真的太好了,太感谢了,在bilibili和CSDN上都找遍了,终于在你这里找到了