Kanboard 1.2.56 Docker Compose 部署指南

Kanboard 1.2.56 官方镜像 Docker Compose 从零部署实测:compose 编排、持久化挂载、销毁重建恢复闭环、环境变量表、配置加载优先级与等价 docker run,含 API Basic 认证等排障沉淀。

KanboardKanboard看板自托管PHP 应用2026/10/24

Kanboard 1.2.56 Docker Compose 部署指南

目标:在一台 Ubuntu 服务器上用官方 Docker 镜像与 Docker Compose 完成 Kanboard 1.2.56 看板系统的从零部署,覆盖镜像选型、持久化挂载、初始化、销毁重建恢复闭环与常用运维操作。全文命令与回显均已在 Ubuntu 22.04(内核 5.15+,x86_64,Docker Engine 24+)环境实测通过。

一、环境信息

本篇所有操作在以下环境实测完成,读者复现时请对齐软件版本与目录规划。

  • 操作系统:Ubuntu 22.04 LTS(x86_64)
  • Docker Engine:24.x(docker compose v2 插件,docker compose version 可查)
  • Kanboard:v1.2.56(官方镜像 kanboard/kanboard:v1.2.56,2026-10-21 发布)
  • 镜像内置运行时:nginx(监听 80/443)+ php-fpm 8.5.12(s6-svscan 托管,服务:nginx/php/cron)
  • 数据库:默认 SQLite(零外部依赖);如需 MySQL/PostgreSQL 见第六节环境变量
  • 部署目录规划:/opt/kanboard/(compose 项目目录,数据落在其下 data/、plugins/、ssl/、config/)
  • 宿主机端口规划:8146 → HTTP(80)、8147 → HTTPS(443)(自签证书)
  • 验证方式:healthcheck 接口 + JSON-RPC API(/jsonrpc.php,HTTP Basic 认证)

二、镜像选型说明

本节说明为什么选官方镜像以及版本标签策略。Kanboard 官方(kanboard.org 与 GitHub 仓库 Dockerfile)直接维护 kanboard/kanboard 镜像,选它而非第三方构建的理由有三:官方镜像随源码同步发版(v1.2.56 于 2026-10-21 与源码同日发布);内置 nginx + php-fpm + s6 进程管理 + 自签证书自动生成,开箱即用;v1.2.56 已将运行时升级到 PHP 8.5.12(修复 CVE-2026-109618/CVE-2026-109619,见官方 Release Note)。

镜像维护方说明建议
kanboard/kanboard:v1.2.56官方精确锁定版本,升级可控生产推荐
kanboard/kanboard:latest官方跟随最新版漂移仅测试环境
第三方构建(bitnami 等)社区形态各异,无官方承诺不推荐

⚠️ 注意:Kanboard 官方只发布 latest 与 v<版本号> 形态标签,拉取时务必带精确版本号(如 v1.2.56),避免 latest 漂移带来不可控升级。版本号以 GitHub Releases 实查为准(查询日期 2026-10-23,最新稳定版 v1.2.56)。

确认镜像已就位:

docker pull kanboard/kanboard:v1.2.56
docker images kanboard/kanboard

实测回显:

REPOSITORY:kanboard/kanboard TAG:v1.2.56 ID:871435323da4 SIZE:150MB

镜像健康检查机制(内置 Healthcheck,docker compose ps 中直接体现):

Test: ["CMD-SHELL","curl -f http://localhost/healthcheck.php || exit 1"]

三、前置条件

部署前确认服务器具备以下条件,逐项给出验证命令与预期。

  1. Docker Engine 与 compose 插件可用:
docker --version && docker compose version

实测回显:

Docker version 29.8.1, build 4a63305
Docker Compose version v5.5.1
  1. 规划的宿主端口未被占用(以 8146/8147 为例):
ss -ltn | grep -E ':8146|:8147'

实测回显(无输出即未被占用,可继续):

(空)
  1. 部署目录已创建:
mkdir -p /opt/kanboard/{data,plugins,ssl}
cd /opt/kanboard

实测回显(无报错即成功):

(空)

💡 说明:data/ 存放 SQLite 数据库文件、附件与日志;plugins/ 存放插件目录;ssl/ 可选——留空时容器首次启动自动生成自签证书,也可放入自己的证书对(文件名必须为 kanboard.key/kanboard.crt)。

四、部署步骤

本节完成 compose 编排编写、启动、健康验证与初始化四步,走完即得到一个可登录使用的 Kanboard。

4.1 编写 compose.yaml

在 /opt/kanboard/compose.yaml 写入以下内容(项目名显式声明为 kanboard-1.2.56-stack,避免多套部署同机时相互干扰):

name: kanboard-1.2.56-stack

services:
  kanboard:
    image: kanboard/kanboard:v1.2.56
    container_name: kanboard-1.2.56-app
    ports:
      - "8146:80"
      - "8147:443"
    volumes:
      - ./data:/var/www/app/data
      - ./plugins:/var/www/app/plugins
      - ./ssl:/etc/nginx/ssl
    environment:
      LOG_DRIVER: file
      DB_DRIVER: sqlite
    restart: unless-stopped
    networks:
      - kanboard-net

networks:
  kanboard-net:
    driver: bridge
    ipam:
      config:
        - subnet: 10.89.72.0/24

逐项说明:

  • name: kanboard-1.2.56-stack:compose 项目名,down/ps 等命令按项目名圈定资源,防止同名项目互删;
  • image: kanboard/kanboard:v1.2.56:官方镜像 + 精确版本;
  • container_name:固定容器名,便于 docker logs/exec 直达;
  • ports:宿主 8146→容器 80(HTTP)、8147→容器 443(HTTPS);
  • volumes 三个挂载点:数据持久化(SQLite/附件/日志)、插件目录、SSL 证书目录;
  • environment:LOG_DRIVER: file 让日志落文件便于排障;DB_DRIVER: sqlite 为默认值,显式写出仅为可读性;
  • restart: unless-stopped:服务器重启后自动拉起(手动停止除外);
  • networks:显式子网,避免与同机其他 compose 栈冲突。

4.2 启动栈

cd /opt/kanboard
docker compose up -d

实测回显:

 Network kanboard-1256-stack_kanboard-net Creating
 Network kanboard-1256-stack_kanboard-net Created
 Container kanboard-1.2.56-app Creating
 Container kanboard-1.2.56-app Created
 Container kanboard-1.2.56-app Starting
 Container kanboard-1.2.56-app Started

4.3 验证运行状态

等待健康检查通过(内置 StartPeriod 约 3 秒 + 探测间隔),查看容器状态与端口:

docker compose ps

实测回显:

NAME                  IMAGE                       COMMAND                   SERVICE    CREATED          STATUS                    PORTS
kanboard-1.2.56-app   kanboard/kanboard:v1.2.56   "/usr/local/bin/entr…"   kanboard   13 seconds ago   Up 12 seconds (healthy)   0.0.0.0:8146->80/tcp, [::]:8146->80/tcp, 0.0.0.0:8147->443/tcp, [::]:8147->443/tcp

STATUS 列出现 (healthy) 即健康检查通过。进一步用健康检查接口确认数据库连接:

curl -s http://127.0.0.1:8146/healthcheck.php

实测回显:

{"status":200,"message":"Database connection is OK"}

访问首页确认 Web 服务响应(302 表示跳转登录页,正常):

curl -s -o /dev/null -w 'login page HTTP %{http_code}\n' http://127.0.0.1:8146/

实测回显:

login page HTTP 302

4.4 初始化管理员密码

首次登录使用默认管理员账号 admin(官方文档 docs.kanboard.org 给出的出厂口令为 admin)。从安全与流程统一考虑,本指南在初始化阶段直接用 Kanboard 内置 CLI 将 admin 密码重置为演示口令 q1w2e3r4(生产环境请换成自己的强口令):

printf 'q1w2e3r4\nq1w2e3r4\n' | docker compose exec -T kanboard /var/www/app/cli user:reset-password admin

实测回显:

What is the new password for admin? (characters are not printed)

Confirmation:

Password updated successfully

⚠️ 注意:user:reset-password 只接受用户名参数,新密码通过交互提示输入两次(管道喂入亦可)。口令最小长度 6 位——尝试设置 5 位口令会报错:

The minimum length is 6 characters

4.5 API 冒烟验证

用 JSON-RPC API 做一次端到端冒烟(v1.2.56 采用标准 HTTP Basic 认证,-u admin:q1w2e3r4):

curl -s -u admin:q1w2e3r4 -X POST http://127.0.0.1:8146/jsonrpc.php \
  -H 'Content-Type: application/json' \
  -d '{"jsonrpc":"2.0","method":"getVersion","id":1,"params":{}}'

实测回显:

{"jsonrpc":"2.0","result":"v1.2.56","id":1}

创建首个项目:

curl -s -u admin:q1w2e3r4 -X POST http://127.0.0.1:8146/jsonrpc.php \
  -H 'Content-Type: application/json' \
  -d '{"jsonrpc":"2.0","method":"createProject","id":2,"params":{"name":"运维任务看板"}}'

实测回显(返回项目 id=1):

{"jsonrpc":"2.0","result":1,"id":2}

创建首个任务(column_id: 2 为项目默认第一列「Ready」):

curl -s -u admin:q1w2e3r4 -X POST http://127.0.0.1:8146/jsonrpc.php \
  -H 'Content-Type: application/json' \
  -d '{"jsonrpc":"2.0","method":"createTask","id":4,"params":{"title":"验证 Kanboard 部署闭环","project_id":1,"column_id":2,"owner_id":1}}'

实测回显(返回任务 id=1):

{"jsonrpc":"2.0","result":1,"id":4}

💡 说明:也可直接用浏览器访问 http://<服务器IP>:8146/,用 admin/q1w2e3r4 登录后图形化建项目建任务,效果等价。

五、数据持久化说明

本节讲清「数据到底在哪、哪些东西必须持久化、如何验证销毁重建后数据完好」。

5.1 持久化挂载点

容器内路径宿主路径(本方案)内容是否必须挂载
/var/www/app/data/opt/kanboard/dataSQLite 数据库(db.sqlite)、附件(files/)、日志(debug.log)、缓存必须
/var/www/app/plugins/opt/kanboard/plugins插件代码目录建议
/etc/nginx/ssl/opt/kanboard/sslTLS 证书对(自签或自备 kanboard.key/kanboard.crt)可选
/var/www/app/config.php/opt/kanboard/config/config.php自定义配置文件(单文件挂载,见第八节)可选

启动后确认宿主侧数据文件已生成:

ls -l /opt/kanboard/data/

实测回显:

total 132
-rw-r--r-- 1 1000 1000 133120 Oct 23 16:28 db.sqlite

SQLite 模式下,Kanboard 的全部业务数据(项目/任务/用户/评论/附件元数据)都在 db.sqlite 一个文件里;附件二进制在 data/files/。备份等价于停写后复制整个 data/ 目录。

5.2 销毁重建恢复闭环(实测)

「栈销毁 → 数据仍在 → 重建 → 数据完好」是检验持久化配置是否正确的金标准,三步实测如下。

第一步,销毁栈(容器与网络被删除,宿主目录不受影响):

docker compose down

实测回显:

 Container kanboard-1.2.56-app Removing
 Container kanboard-1.2.56-app Removed
 Network kanboard-1256-stack_kanboard-net Removing
 Network kanboard-1256-stack_kanboard-net Removed

确认宿主数据仍在:

ls /opt/kanboard/data/

实测回显:

db.sqlite

第二步,原样重建:

docker compose up -d

实测回显:

 Network kanboard-1256-stack_kanboard-net Creating
 Network kanboard-1256-stack_kanboard-net Created
 Container kanboard-1.2.56-app Creating
 Container kanboard-1.2.56-app Created
 Container kanboard-1.2.56-app Starting
 Container kanboard-1.2.56-app Started

第三步,验证数据完好——健康检查与销毁前创建的任务:

curl -s http://127.0.0.1:8146/healthcheck.php
curl -s -u admin:q1w2e3r4 -X POST http://127.0.0.1:8146/jsonrpc.php \
  -H 'Content-Type: application/json' \
  -d '{"jsonrpc":"2.0","method":"getAllTasks","id":9,"params":{"project_id":1}}'

实测回显(任务「验证 Kanboard 部署闭环」原样返回,数据零丢失):

{"status":200,"message":"Database connection is OK"}
{"jsonrpc":"2.0","result":[{"id":1,"title":"验证 Kanboard 部署闭环","description":"","date_creation":1792772994,"color_id":"yellow","project_id":1,"column_id":2,"owner_id":1,"position":1,"is_active":1,...

💡 说明:docker compose down 不带 -v 时只删容器与网络,不删 bind mount 的宿主目录,这正是本方案用目录挂载而非命名卷的原因——数据路径直接暴露在宿主文件系统,备份/迁移肉眼可见。

六、环境变量表

Kanboard 支持用环境变量注入配置(源码 app/constants.php 中逐项 getenv() 读取)。下表为部署常用项,默认值取自 v1.2.56 源码实测(defined('X') or define('X', getenv('X') ?: 默认值) 语义)。

6.1 数据库连接类

变量默认值说明
DB_DRIVERsqlite驱动:sqlite / mysql / postgres
DB_FILENAME$DATA_DIR/db.sqliteSQLite 数据文件路径
DB_WAL_MODEtrueSQLite WAL 模式(提升并发读)
DB_HOSTNAMElocalhostMySQL/PG 主机名
DB_PORT空(走驱动默认)MySQL/PG 端口
DB_NAMEkanboard数据库名
DB_USERNAMEroot数据库用户名
DB_PASSWORD空数据库密码
DB_RUN_MIGRATIONStrue启动时自动执行数据库迁移
DB_TIMEOUT空连接超时秒数

6.2 目录与日志类

变量默认值说明
DATA_DIR<应用根>/data数据目录(SQLite/附件/日志/缓存)
FILES_DIR$DATA_DIR/files附件目录
CACHE_DIR$DATA_DIR/cache缓存目录
PLUGINS_DIR<应用根>/plugins插件目录
LOG_DRIVERsystem日志驱动:system/stdout/syslog/file
LOG_FILE$DATA_DIR/debug.logLOG_DRIVER=file 时的日志文件
DEBUGfalse调试模式(开启后 debug.log 记录渲染耗时/SQL 数)

6.3 安全与插件类

变量默认值说明
PLUGIN_INSTALLERfalse是否允许 Web 界面在线安装插件(安全考虑默认关)
PLUGIN_API_URLhttps://kanboard.org/plugins.json插件市场清单地址
API_AUTHENTICATION_TOKEN空应用级 API 令牌(配合用户名 jsonrpc 使用)
API_AUTHENTICATION_HEADER空反代场景自定义认证头名
BRUTEFORCE_CAPTCHA3连续失败 N 次后出验证码
BRUTEFORCE_LOCKDOWN6连续失败 N 次后锁定
BRUTEFORCE_LOCKDOWN_DURATION15锁定时长(分钟)
SESSION_DURATION0会话时长(0=浏览器会话)
SESSION_HANDLERdb会话存储:db/file

💡 技术拓展:MySQL/PostgreSQL 形态时环境变量写法示例——

environment:
  DB_DRIVER: mysql
  DB_HOSTNAME: db
  DB_PORT: "3306"
  DB_NAME: kanboard
  DB_USERNAME: kanboard
  DB_PASSWORD: q1w2e3r4

并额外增加一个 db 服务(mariadb/postgres 镜像)与 depends_on。切换驱动后首次启动自动建表迁移(DB_RUN_MIGRATIONS: true);SQLite→MySQL 的存量数据迁移不在环境变量能力范围内,需官方文档 Database migration 一节的手工导库流程。

七、配置参数说明

本节讲清 Kanboard 配置的加载优先级——这是排查「改了配置不生效」的关键。v1.2.56 源码(app/common.php)按以下顺序加载配置:

  1. DATABASE_URL 环境变量(最高):存在时直接 define 全部 DB_* 连接常量;
  2. data/config.php:存在即 require(数据目录内的配置文件);
  3. config.php(应用根):存在即 require;
  4. 进程环境变量:constants.php 对每个常量做 defined('X') or define('X', getenv('X') ?: 代码默认值)——前述来源定义过的常量不会被环境变量覆盖;
  5. 代码内默认值:config.default.php(300 行)只是参数字典模板,运行时并不加载它,官方镜像自带的 config.php 仅含两行覆写(ENABLE_URL_REWRITE、LOG_DRIVER=system)。

优先级链(高→低):DATABASE_URL > data/config.php > config.php > 环境变量 > 代码默认值。

💡 说明:这一顺序解释了第八节的实测——在 compose 的 environment 里写 LOG_DRIVER: file 的同时再挂载 config.php 定义 LOG_DRIVER=file,两者一致时无感;但若 config.php 定义了某个常量,环境变量对同名常量失效(常量已 defined,or 短路)。生产上建议「环境变量管部署相关项(DB 连接),config.php 管应用行为项(日志/认证/邮件)」,避免两处打架。

八、配置文件挂载(实测)

环境变量适合少量部署项,应用行为类配置(邮件 SMTP、LDAP、验证码策略等几十项)更适合挂载一份完整 config.php。实测流程如下。

第一步,创建配置文件 /opt/kanboard/config/config.php:

<?php

defined('LOG_DRIVER') or define('LOG_DRIVER', 'file');
defined('DEBUG') or define('DEBUG', true);

第二步,compose.yaml 的 volumes 增加一行单文件挂载:

    volumes:
      - ./data:/var/www/app/data
      - ./plugins:/var/www/app/plugins
      - ./ssl:/etc/nginx/ssl
      - ./config/config.php:/var/www/app/config.php

第三步,应用变更并重启(compose 检测到挂载变化会重建容器):

docker compose up -d

实测回显:

 Container kanboard-1.2.56-app Recreate
 Container kanboard-1.2.56-app Recreated
 Container kanboard-1.2.56-app Starting
 Container kanboard-1.2.56-app Started

第四步,验证配置生效——进容器确认常量值:

docker compose exec kanboard php -r "require '/var/www/app/config.php'; echo 'LOG_DRIVER=', LOG_DRIVER, ' DEBUG=', var_export(DEBUG, true), PHP_EOL;"

实测回显:

LOG_DRIVER=file DEBUG=true

触发一次登录失败,确认日志确实落到了挂载目录的 debug.log:

curl -s -u admin:wrongpass -X POST http://127.0.0.1:8146/jsonrpc.php \
  -H 'Content-Type: application/json' \
  -d '{"jsonrpc":"2.0","method":"getVersion","id":1,"params":{}}' > /dev/null
head -c 600 /opt/kanboard/data/debug.log

实测回显:

[2026-10-23 16:31:54] [debug] APP: nb_queries=0
[2026-10-23 16:31:54] [debug] APP: rendering_time=0.045353889465332
[2026-10-23 16:31:54] [debug] APP: memory_usage=2.79M
[2026-10-23 16:31:54] [debug] APP: uri=/healthcheck.php
[2026-10-23 16:31:54] [debug] ###############################################
[2026-10-23 16:32:04] [debug] Subscriber executed: Kanboard\Subscriber\BootstrapSubscriber::execute
[2026-10-23 16:32:04] [debug] Subscriber executed: Kanboard\Subscriber\AuthSubscriber::onLoginFailure
[2026-10-23 16:32:04] [error] API authentication failure for admin
[2026-10-23 16:32:04] [debu

⚠️ 注意:DEBUG: true 会记录每次请求的渲染耗时与内存,仅排障期开启,平时改回 false 并 docker compose up -d 重载。config.php 全量参数字典见镜像内 /var/www/app/config.default.php(可 docker compose exec kanboard cat /var/www/app/config.default.php 查看),逐参数详解见本站《Kanboard 1.2.56 配置参数详解》篇。

九、等价 docker run

不用 Compose 时,以下单条 docker run 与 4.1 的 compose 定义完全等价,可用于快速验证或理解参数映射:

docker run -d \
  --name kanboard-1.2.56-app \
  -p 8146:80 \
  -p 8147:443 \
  -v /opt/kanboard/data:/var/www/app/data \
  -v /opt/kanboard/plugins:/var/www/app/plugins \
  -v /opt/kanboard/ssl:/etc/nginx/ssl \
  -e LOG_DRIVER=file \
  -e DB_DRIVER=sqlite \
  --restart unless-stopped \
  kanboard/kanboard:v1.2.56

与 compose 的对应关系:-p 对应 ports、-v 对应 volumes、-e 对应 environment、--restart 对应 restart;compose 额外提供自定义子网网络与项目名管理。二选一即可,不要同时用 docker run 与 compose 管理同一份挂载目录。

十、常用运维命令

以下命令均在部署目录 /opt/kanboard 下执行,回显为本环境实测。

查看栈状态与健康度:

docker compose ps

实测回显:

NAME                  IMAGE                       COMMAND                   SERVICE    CREATED          STATUS                    PORTS
kanboard-1.2.56-app   kanboard/kanboard:v1.2.56   "/usr/local/bin/entr…"   kanboard   26 minutes ago   Up 12 minutes (healthy)   0.0.0.0:8146->80/tcp, [::]:8146->80/tcp, 0.0.0.0:8147->443/tcp, [::]:8147->443/tcp

滚动查看应用日志(nginx/php-fpm 输出):

docker compose logs -f --tail 20

实测回显(节选,nginx/php-fpm 侧记录了本文排障过程中的认证失败请求):

kanboard-1.2.56-app  | 2026/10/23 16:32:04 [error] 15#15: *3 FastCGI sent in stderr: "PHP message: Kanboard: user admin authentication failure with IP address: 10.89.72.1" while reading response header from upstream, client: 10.89.72.1, server: localhost, request: "POST /jsonrpc.php HTTP/1.1", upstream: "fastcgi://unix:/var/run/php-fpm.sock:", host: "127.0.0.1:8146"

重启服务(不改变配置):

docker compose restart

实测回显:

 Container kanboard-1.2.56-app Restarting
 Container kanboard-1.2.56-app Started

在容器内执行 Kanboard CLI(版本、迁移、cronjob 等,命令详解见本站《Kanboard 1.2.56 常用 CLI 命令详解》篇):

docker compose exec kanboard /var/www/app/cli version

实测回显:

Kanboard v1.2.56

升级到新版本(以未来 v1.2.57 为例,流程为改标签→拉取→重建;下例回显为对当前 v1.2.56 执行 pull 的实测形态):

sed -i 's/kanboard\/kanboard:v1.2.56/kanboard\/kanboard:v1.2.57/' compose.yaml
docker compose pull

实测回显:

 Image kanboard/kanboard:v1.2.56 Pulling
 Image kanboard/kanboard:v1.2.56 Pulled

随后重建容器(实测形态,重建动作与挂载变更时相同):

[+] Running 1/1
 ✔ Container kanboard-1.2.56-app  Recreated

⚠️ 注意:升级前必须备份 /opt/kanboard/data/;数据库结构迁移由 DB_RUN_MIGRATIONS: true 在启动时自动执行;降级跨迁移版本会导致库结构不兼容,只能回滚到备份。

停止并删除栈(保留数据目录):

docker compose down

实测回显:

 Container kanboard-1.2.56-app Removing
 Container kanboard-1.2.56-app Removed
 Network kanboard-1256-stack_kanboard-net Removing
 Network kanboard-1256-stack_kanboard-net Removed

十一、常见问题(FAQ)

Q1:登录页输 admin/admin 提示错误怎么办?

两步定位:先确认账号存在与状态(进容器查 SQLite users 表),再用内置 CLI 强制重置密码。重置命令与实测回显见 4.4 节。注意口令最小 6 位(The minimum length is 6 characters);连续失败 6 次会触发 15 分钟账号锁定(BRUTEFORCE_LOCKDOWN,状态记录在 users 表的 nb_failed_login/lock_expiration_date 字段),锁定期间即使密码正确、甚至用 CLI 重置了密码也照样 401(重置命令只改密码不清锁定标志)。恢复方式:等 lock_expiration_date 过期,或手动清零两个字段(update users set nb_failed_login=0, lock_expiration_date=0 where username='admin';)。

Q2:API 调用一直返回 401 Unauthorized?

Kanboard v1.2.56 的 JSON-RPC 认证走标准 HTTP Basic(源码 libs/jsonrpc/src/JsonRPC/Server.php 读取 PHP_AUTH_USER/PHP_AUTH_PW),即 -u user:pass 或 Authorization: Basic <base64> 头。网上旧教程用的 X-RPC-Auth-Username/X-RPC-Auth-Password 请求头在当前版本不再生效,实测对比:

# 旧头(401)
curl -s -X POST http://127.0.0.1:8146/jsonrpc.php -H 'Content-Type: application/json' \
  -H 'X-RPC-Auth-Username: admin' -H 'X-RPC-Auth-Password: q1w2e3r4' \
  -d '{"jsonrpc":"2.0","method":"getVersion","id":1,"params":{}}'
{"jsonrpc":"2.0","error":{"code":401,"message":"Unauthorized"},"id":null}

# Basic(成功)
curl -s -u admin:q1w2e3r4 -X POST http://127.0.0.1:8146/jsonrpc.php \
  -H 'Content-Type: application/json' \
  -d '{"jsonrpc":"2.0","method":"getVersion","id":1,"params":{}}'
{"jsonrpc":"2.0","result":"v1.2.56","id":1}

Q3:API 方法报 Too many arguments 或 Method not found?

v1.2.56 的 API 方法签名与旧版文档有差异,以镜像内置源码为准(如 getTask($task_id) 只收一个参数、任务列表方法为 getAllTasks($project_id))。查看方法权威清单:docker compose exec kanboard grep -n 'public function' /var/www/app/app/Api/Procedure/TaskProcedure.php。

Q4:8147 (HTTPS) 提示证书不受信任?

官方镜像首次启动检测到 /etc/nginx/ssl 无证书时自动生成自签名证书(CN=kanboard.org),浏览器告警属预期。生产用负载均衡终结 TLS(80 端口后端),或将自有证书对命名为 kanboard.key/kanboard.crt 放入挂载目录后重建。

Q5:数据到底存在哪,怎么备份?

SQLite 模式全部业务数据在 /opt/kanboard/data/db.sqlite,附件在其下 files/。备份:docker compose exec kanboard /var/www/app/cli 无导库命令时,直接停写(或低峰)复制整个 data/ 目录即可;恢复:替换目录后 docker compose up -d。

十二、参考链接