Vikunja 2.7.1 配置参数详解
基于 v2.7.1 官方 556 行配置样例逐项详解 config.yml 全配置段(service/database/mailer/log/ratelimit/files/auth/metrics 等 20+ 段):默认值、生产建议、环境变量 VIKUNJA_ 覆盖映射规则与配置修改生效实测,附生产配置基线。
Vikunja 2.7.1 配置参数详解
Vikunja 的全部运行行为由一份 YAML 配置文件(默认 config.yml)驱动,同时所有配置项都支持以环境变量覆盖。本文基于 v2.7.1 官方发行包内置的完整配置样例(config.yml.sample,共 556 行)逐项梳理各配置段的参数、默认值与生产建议,并实测验证配置加载优先级与修改生效流程。安装部署操作见本专栏《Ubuntu 22.04 安装 Vikunja 2.7.1 指南》与《Vikunja 2.7.1 Docker Compose 部署指南》。
一、配置体系概述
1.1 配置文件位置与查找顺序
Vikunja 按以下优先级查找配置文件,命中即止:
- 命令行参数
--config显式指定的文件(优先级最高); - 环境变量
VIKUNJA_SERVICE_ROOTPATH指向目录下的 config.yml; - 可执行文件同目录下的 config.yml;
/etc/vikunja/config.yml(Linux 系统级路径)。
不同安装方式的默认配置路径实测:
| 安装方式 | 配置文件 | 说明 |
|---|---|---|
| 官方二进制 | 自行创建 /etc/vikunja/config.yml 或放二进制旁 | 发行 zip 内附 config.yml.sample 作为全量参考 |
| APT 仓库 deb 包 | /etc/vikunja/config.yml | 共 560 行:第 1~555 行为全注释样例,仅文件末尾数行为实际生效块(含安装时自动生成的 service.secret) |
| Docker 镜像 | /app/vikunja/config.yml(容器内) | 通常不挂载配置文件,改用环境变量注入 |
1.2 环境变量覆盖规则
所有配置项均可被环境变量覆盖,映射规则为:VIKUNJA_ 前缀 + 配置层级用下划线 _ 拼接 + 全大写。例如:
| 配置项 | 环境变量 |
|---|---|
| service.publicurl | VIKUNJA_SERVICE_PUBLICURL |
| service.secret | VIKUNJA_SERVICE_SECRET |
| database.host | VIKUNJA_DATABASE_HOST |
| database.sslmode | VIKUNJA_DATABASE_SSLMODE |
| log.level | VIKUNJA_LOG_LEVEL |
该规则已实测:Docker Compose 部署中未提供任何配置文件,仅通过 VIKUNJA_DATABASE_*、VIKUNJA_SERVICE_* 环境变量即完成 PostgreSQL 连接与服务参数配置,API 信息接口返回的 frontend_url 与环境变量设定值一致。
1.3 配置修改与生效流程
Vikunja 不支持配置热加载,修改 config.yml 后需重启服务。以 systemd 部署为例的实测流程:在配置末尾的 service 块追加 motd(Message of the Day,会通过 /info 接口下发给前端):
service:
secret: "olKhSppGHa0BPCAkfNWifuWzEld48C9p"
publicurl: "http://192.168.146.131:3456/"
motd: "S9 验收实例 - 配置修改已生效"
重启并验证:
systemctl restart vikunja
systemctl is-active vikunja
curl -s http://localhost:3456/api/v1/info
回显(解析后):
active
motd: 'S9 验收实例 - 配置修改已生效' | version: v2.7.1
motd 出现在 /api/v1/info 响应中,证明配置修改已生效。
二、service 段:核心服务参数
service 段控制 Web 服务监听、会话安全与全局功能开关,是最重要的配置段。
| 参数 | 默认值 | 说明 |
|---|---|---|
| secret | 空(每次启动随机生成) | JWT 签名及加密操作的密钥。生产必填:不设置则每次重启后所有已签发令牌全部失效 |
| jwtttl | 259200(3 天) | 常规 JWT 令牌有效期(秒) |
| jwtttllong | 2592000(30 天) | 勾选「记住我」登录时的令牌有效期(秒) |
| jwtttlshort | 600(10 分钟) | 配合刷新令牌使用的短效令牌有效期(秒) |
| interface | ":3456" | Web 服务监听地址与端口 |
| unixsocket | "" | Unix Socket 路径,设置后替代 TCP 监听 |
| unixsocketmode | "" | Unix Socket 权限位,八进制需加 0o 前缀 |
| publicurl | "" | 对外访问完整 URL(末尾带斜杠),用于邮件链接与前后端通信。cors.enable 为 true(默认)时必填,缺失拒绝启动 |
| rootpath | 见说明 | 数据根目录(数据库、附件、日志、插件的基准路径)。systemd 下跟随 WorkingDirectory;--config 指定配置时默认为配置文件所在目录 |
| maxitemsperpage | 50 | API 单页最大返回条数 |
| enablecaldav | true | CalDAV 端点开关(对接日历客户端) |
| motd | "" | 公告信息,通过 /info 接口下发 |
| enablelinksharing | true | 项目链接分享开关 |
| enableregistration | true | 开放注册开关,私有化部署建议关闭 |
| enabletaskattachments | true | 任务附件开关 |
| timezone | "GMT" | 全局时区,须使用 tz 数据库标准名(如 Asia/Shanghai),UTC/GMT 偏移写法无效 |
| enabletaskcomments | true | 任务评论开关 |
| enabletotp | true | 双因素认证(TOTP)开关 |
| testingtoken | "" | 非空时开放 /test/{table} 调试接口(可任意写库)。生产严禁设置 |
| enableemailreminders | true | 任务到期邮件提醒(依赖 mailer) |
| enableuserdeletion | true | 允许用户自助注销账号 |
| maxavatarsize | 1024 | 头像最大请求尺寸(像素) |
| demomode | false | 演示模式,前端显示数据会被清空的红色警告 |
| enablepublicteams | false | 公开团队开关(团队可被非成员发现) |
| bcryptrounds | 11 | 密码哈希强度,每 +1 计算成本翻倍 |
| ipextractionmethod | "direct" | 客户端 IP 提取方式:direct(直连)/ xff(反向代理后推荐)/ realip |
| trustedproxies | "" | 可信代理 CIDR 列表(逗号分隔),配合 xff/realip 使用 |
最小生产配置示例:
service:
secret: "请替换为至少32位随机字符串"
publicurl: "https://vikunja.example.com/"
interface: ":3456"
timezone: "Asia/Shanghai"
enableregistration: false
三、database 段:数据库连接
| 参数 | 默认值 | 说明 |
|---|---|---|
| type | "sqlite" | 数据库类型:sqlite / mysql / postgres。Vikunja 支持 MySQL 8.0+、MariaDB 10.2+、PostgreSQL 12+ |
| user | "vikunja" | 数据库账号 |
| password | "" | 数据库密码 |
| host | "localhost" | 数据库主机,可带端口(如 db:5432) |
| database | "vikunja" | 数据库名 |
| path | "./vikunja.db" | SQLite 专用:数据库文件路径。生产建议用绝对路径 |
| maxopenconnections | 100 | 最大打开连接数(仅 mysql/postgres) |
| maxidleconnections | 50 | 最大空闲连接数 |
| maxconnectionlifetime | 1800000 | 单连接最大存活毫秒数(30 分钟) |
| sslmode | "disable" | PostgreSQL 专用:disable / require / verify-ca / verify-full |
| sslcert / sslkey / sslrootcert | "" | PostgreSQL 客户端证书、私钥、CA 路径 |
| tls | false | MySQL 专用:false / true / skip-verify / preferred |
| schema | "public" | PostgreSQL 专用:连接后固定 search_path 到该 schema |
PostgreSQL 生产示例:
database:
type: "postgres"
host: "192.168.1.10"
user: "vikunja"
password: "q1w2e3r4"
database: "vikunja"
sslmode: "verify-full"
sslrootcert: "/etc/vikunja/pgsql-ca.pem"
maxopenconnections: 100
四、redis 段与 keyvalue 段
redis 段(默认禁用)用于缓存与会话类数据;keyvalue 段定义键值存储后端,被限流计数器、指标缓存等内部模块使用。
| 参数 | 默认值 | 说明 |
|---|---|---|
| redis.enabled | false | Redis 开关 |
| redis.host | "localhost:6379" | Redis 地址(含端口) |
| redis.password | "" | Redis 密码 |
| redis.db | 0 | Redis 逻辑库编号 |
| keyvalue.type | "memory" | 键值存储后端:memory(单机)/ redis(多实例部署必选) |
单机部署保持默认即可;多副本水平扩展时必须启用 Redis 并将 keyvalue.type 设为 redis,否则各副本的限流计数与缓存互不可见。
五、cors 段:跨域访问
| 参数 | 默认值 | 说明 |
|---|---|---|
| enable | true | CORS 总开关。默认开启,这也是 publicurl 成为必填项的原因 |
| origins | ["http://127.0.0.1:", "http://localhost:"] | 允许跨域访问的来源列表(须含协议与端口) |
| maxage | 0 | 预检请求缓存秒数 |
前后端分离部署(前端与 API 不同域名/端口)时,须把前端来源加入 origins;使用官方内嵌前端保持默认即可。
六、mailer 段:邮件发送
| 参数 | 默认值 | 说明 |
|---|---|---|
| enabled | false | 邮件总开关。关闭时注册即激活、无法找回密码 |
| host / port | "" / 587 | SMTP 主机与端口。日志仅报 EOF 时尝试改为 25 |
| authtype | "plain" | 认证方式:plain / login / cram-md5 |
| username / password | - | SMTP 账号密码 |
| skiptlsverify | false | 跳过 TLS 证书校验(自签证书场景) |
| fromemail | "mail@vikunja" | 发件人地址 |
| queuelength | 100 | 邮件队列长度 |
| queuetimeout | 30 | SMTP 连接空闲超时(秒) |
| forcessl | false | 强制 SSL(默认走 STARTTLS) |
配置后可用 CLI 的 vikunja testmail 验证投递(用法见本专栏 CLI 篇)。
七、log 段:日志
| 参数 | 默认值 | 说明 |
|---|---|---|
| path | "<rootpath>logs" | 日志文件目录 |
| enabled | true | 日志总开关 |
| standard | "stdout" | 标准日志去向:stdout / stderr / file / off |
| level | "INFO" | 日志级别:ERROR / WARNING / INFO / DEBUG |
| format | "text" | 输出格式:text / structured(JSON,适合日志采集) |
| database | "off" | SQL 查询日志去向(排障时可设 stdout) |
| databaselevel | 跟随 level | SQL 日志级别 |
| http | "stdout" | HTTP 请求日志去向 |
| httplevel | 跟随 level | HTTP 日志级别(4xx 记 WARNING、5xx 记 ERROR) |
| events | "off" | 事件日志去向 |
| eventslevel | 跟随 level | 事件日志级别(仅 ERROR/INFO/DEBUG) |
| "off" | 邮件日志去向(不记录邮件正文) | |
| maillevel | 跟随 level | 邮件日志级别 |
systemd 部署保持 stdout 输出、由 journald 采集即可;需要文件落盘时把 standard/http 改为 file 并配置 log.path。
八、ratelimit 段:访问限流
| 参数 | 默认值 | 说明 |
|---|---|---|
| enabled | false | 限流总开关(面向公网建议开启) |
| kind | "user" | 限流维度:user / ip |
| period | 60 | 统计周期(秒) |
| limit | 100 | 周期内单用户/IP 最大请求数 |
| store | "keyvalue" | 计数器存储:keyvalue / memory / redis |
| noauthlimit | 10 | 未认证接口(登录、注册、找回密码等)每 IP 每分钟请求上限,不可禁用 |
| tokenrefreshlimit | 60 | 令牌刷新接口每 IP 每分钟上限(独立于 noauthlimit) |
| basicauthlimit | 10 | BasicAuth 失败(CalDAV、订阅源)每 IP 每分钟上限,仅计失败次数 |
九、files 段:附件存储
| 参数 | 默认值 | 说明 |
|---|---|---|
| basepath | "./files" | 附件存储目录 |
| maxsize | "20MB" | 单附件大小上限 |
| type | "local" | 存储后端:local / s3 |
| s3.endpoint | "" | S3 端点(兼容 MinIO、Backblaze B2 等) |
| s3.bucket / region | "" | 桶名与区域 |
| s3.accesskey / secretkey | "" | 访问凭据 |
| s3.usepathstyle | false | 路径风格寻址(自托管 S3 常需开启) |
| s3.disablesigning | false | 发送 UNSIGNED-PAYLOAD(兼容 Ceph RGW 等不校验签名实现,仅 HTTPS 下生效) |
十、migration 段:第三方数据迁移
Vikunja 内置从 Todoist、Trello、Microsoft Todo、Wekan、TickTick、CSV、Vikunja 导出文件等来源的迁移器。公共参数:
| 参数 | 默认值 | 说明 |
|---|---|---|
| migration.maxcsvrows | 100000 | CSV 导入最大行数 |
| migration.maxitems | 100000 | 单次迁移允许的最大条目数(项目+任务+评论+附件) |
| migration.claimtimeout | "5m" | 迁移槽位心跳超时,实例中途崩溃后允许同用户再次发起迁移 |
| migration.vikunjafile.maxsize | "256MB" | Vikunja 导出包解压后总大小上限 |
| migration.vikunjafile.maxfiles | 10000 | 单导出包文件数上限 |
| migration.vikunjafile.maxuserstorage | "1GB" | 单用户通过导入占用的存储上限 |
Todoist / Trello / Microsoft Todo 三个迁移器默认关闭,各自需要到对应平台注册 OAuth 应用获得 clientid/clientsecret(Trello 为 key),并把 redirecturl 配置为 <service.publicurl>/migrate/<迁移器名>。
十一、auth 段:认证体系
11.1 local(本地认证)
auth.local.enabled 默认 true,基于数据库账号密码登录注册,无需额外配置。
11.2 openid(OpenID Connect)
| 参数 | 默认值 | 说明 |
|---|---|---|
| openid.enabled | false | OIDC 总开关 |
| providers[].name | "" | 前端显示名 |
| providers[].authurl | "" | 提供商认证地址 |
| providers[].logouturl | "" | 登出跳转地址(可空) |
| providers[].clientid / clientsecret | "" | 客户端凭据 |
| providers[].scope | "openid email profile" | 请求 scope;需要 OIDC 建团队时追加 vikunja_scope |
| providers[].usernamefallback | false | 允许按用户名匹配本地账号(有劫持风险,慎用) |
| providers[].emailfallback | false | 允许按邮箱匹配本地账号(要求 email_verified: true) |
| providers[].forceuserinfo | false | 强制走 UserInfo 端点取用户信息 |
| providers[].requireavailability | false | 启动时连不上提供商则直接退出(便于编排系统重启重试) |
注意:用环境变量配置 providers 时,配置文件中须先声明 provider 键,否则 Vikunja 无法感知该 provider 存在。
11.3 ldap(目录服务认证)
| 参数 | 默认值 | 说明 |
|---|---|---|
| ldap.enabled | false | LDAP 总开关 |
| host / port | localhost / 389 | LDAP 服务地址 |
| basedn | "" | 搜索基准 DN |
| userfilter | "" | 用户过滤器,%[1]s 为登录名占位符 |
| usetls / verifytls | true / true | TLS 连接与证书校验 |
| binddn / bindpassword | "" | 搜索用服务账号 |
| groupsyncenabled | false | 登录时自动同步 LDAP 组为 Vikunja 团队 |
| groupsyncfilter | 见样例 | 组过滤器,支持 {userdn}、{username} 占位符 |
| groupsyncuseserviceaccount | false | 组同步前重新以服务账号绑定 |
| avatarsyncattribute | "" | 头像属性(原始字节) |
| attribute.username / email / displayname | uid / mail / displayName | 账号字段映射 |
| attribute.memberid | "member" | 组成员属性 |
| attribute.id | "" | 不可变标识(AD 用 objectGUID、OpenLDAP 用 entryUUID),保证改名/移动后账号不丢失 |
十二、metrics 段:监控
| 参数 | 默认值 | 说明 |
|---|---|---|
| enabled | false | 开启 /api/v1/metrics Prometheus 端点 |
| username / password | "" | 非空时该端点启用 BasicAuth |
| pprof | false | 暴露 /debug/pprof/ 性能分析端点(与 metrics 共用认证)。仅限内网实例 |
十三、defaultsettings 段:新用户默认偏好
该段只影响新注册用户的初始设置,修改后不回溯老用户。
| 参数 | 默认值 | 说明 |
|---|---|---|
| avatar_provider | "initials" | 头像来源:gravatar / initials / upload / marble |
| email_reminders_enabled | false | 邮件提醒默认开关 |
| discoverable_by_name / discoverable_by_email | false / false | 是否可被按姓名/邮箱搜索到 |
| overdue_tasks_reminders_enabled | true | 每日逾期任务汇总邮件 |
| overdue_tasks_reminders_time | "9:00" | 汇总邮件发送时间 |
| default_project_id | 0 | 默认项目 ID(须确保用户有权访问) |
| week_start | 0 | 一周起始日(0=周日,1=周一) |
| language | 跟随浏览器 | 界面语言(ISO 639-1 + ISO 3166-1) |
| timezone | 跟随 service.timezone | 个人时区(影响提醒与邮件时间) |
十四、webhooks 与 outgoingrequests 段:外发请求安全
| 参数 | 默认值 | 说明 |
|---|---|---|
| webhooks.enabled | true | Webhook 总开关 |
| webhooks.timeoutseconds | 30 | Webhook 请求超时 |
| webhooks.proxyurl / proxypassword / allownonroutableips | - | 已废弃,迁移至 outgoingrequests 同名项 |
| outgoingrequests.allownonroutableips | false | 外发请求(Webhook、头像下载、迁移导入、许可证校验)允许解析到内网地址;默认 false 防 SSRF |
| outgoingrequests.proxyurl | "" | 外发请求统一代理(建议配合 mole 等专用出口代理) |
| outgoingrequests.proxypassword | "" | 代理密码 |
多用户实例强烈建议配置出口代理并保持 allownonroutableips 为 false,防止用户通过 Webhook 探测内网。
十五、audit 段:审计日志(付费功能)
| 参数 | 默认值 | 说明 |
|---|---|---|
| audit.enabled | false | 审计日志开关(需含 audit_logs 特性的许可证) |
| audit.logfile | "" | 日志文件路径(JSONL 格式,默认写 log 目录下 audit.log) |
| audit.rotation.maxsizemb | 100 | 单文件超过该 MB 数后轮转(0 关闭) |
| audit.rotation.maxage | 30 | 轮转文件保留天数(0 永久) |
十六、autotls 段:自动 HTTPS
| 参数 | 默认值 | 说明 |
|---|---|---|
| autotls.enabled | false | 自动向 Let's Encrypt 申请证书并直接以 TLS 提供服务(启用即同意 LE 条款) |
| autotls.email | "" | 证书注册邮箱(必填) |
| autotls.renewbefore | "30d" | 到期前续期窗口 |
使用前提:publicurl 配置为带有效 TLD 的公网域名,建议 interface 改为 :443。已有 Nginx/Caddy 反代时无需此功能。
十七、plugins 段与 license 段
| 参数 | 默认值 | 说明 |
|---|---|---|
| plugins.enabled | false | 插件系统开关 |
| plugins.dir | "<rootpath>plugins" | 插件目录 |
| plugins.loader | "native" | 加载器:yaegi(Go 源码目录)/ native(编译后的 .so,已废弃) |
| license.key | "" | 商业许可证密钥;留空为社区模式,所有非付费功能可用 |
十八、sentry、avatar、backgrounds、legal 段速览
| 参数 | 默认值 | 说明 |
|---|---|---|
| sentry.enabled / frontendenabled | false / false | 匿名错误上报(API / 前端) |
| sentry.dsn / frontenddsn | 官方 DSN | 自定义 Sentry 接收地址 |
| avatar.gravatarexpiration | 3600 | Gravatar 缓存秒数 |
| avatar.gravatarbaseurl | gravatar.com | 兼容服务地址(如 Libravatar) |
| backgrounds.enabled | true | 项目背景图总开关 |
| backgrounds.providers.upload.enabled | true | 允许上传背景图 |
| backgrounds.providers.unsplash.enabled | false | Unsplash 图源(需 accesstoken + applicationid) |
| legal.imprinturl / privacyurl | "" | 页脚法律链接(德国等市场合规需要) |
十九、生产配置基线建议
综合各段分析,面向公网的生产实例建议基线如下:
service:
secret: "<32位以上随机串>"
publicurl: "https://vikunja.example.com/"
timezone: "Asia/Shanghai"
enableregistration: false
ipextractionmethod: "xff"
trustedproxies: "10.0.0.0/8,172.16.0.0/12"
database:
type: "postgres"
host: "<数据库主机>"
user: "vikunja"
password: "<强口令>"
database: "vikunja"
sslmode: "verify-full"
mailer:
enabled: true
host: "<SMTP主机>"
fromemail: "vikunja@example.com"
ratelimit:
enabled: true
log:
format: "structured"
metrics:
enabled: true
username: "metrics"
password: "<独立口令>"
outgoingrequests:
allownonroutableips: false
要点回顾:secret 必须固定、publicurl 必须与实际访问地址一致、注册开关按需关闭、数据库跨机必开 TLS、反代后正确配置 IP 提取方式。
二十、参考链接
- Vikunja 官方配置文档:https://vikunja.io/docs/config-options/
- v2.7.1 发行包内置 config.yml.sample(随 https://dl.vikunja.io/vikunja/v2.7.1/ 下载)
- Vikunja 反向代理文档:https://vikunja.io/docs/reverse-proxy/
- OpenID 配置文档:https://vikunja.io/docs/openid/