Vikunja 2.7.1 配置参数详解

基于 v2.7.1 官方 556 行配置样例逐项详解 config.yml 全配置段(service/database/mailer/log/ratelimit/files/auth/metrics 等 20+ 段):默认值、生产建议、环境变量 VIKUNJA_ 覆盖映射规则与配置修改生效实测,附生产配置基线。

VikunjaVikunja任务管理自托管Linux2026/10/25

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 按以下优先级查找配置文件,命中即止:

  1. 命令行参数 --config 显式指定的文件(优先级最高);
  2. 环境变量 VIKUNJA_SERVICE_ROOTPATH 指向目录下的 config.yml;
  3. 可执行文件同目录下的 config.yml;
  4. /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.publicurlVIKUNJA_SERVICE_PUBLICURL
service.secretVIKUNJA_SERVICE_SECRET
database.hostVIKUNJA_DATABASE_HOST
database.sslmodeVIKUNJA_DATABASE_SSLMODE
log.levelVIKUNJA_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 签名及加密操作的密钥。生产必填:不设置则每次重启后所有已签发令牌全部失效
jwtttl259200(3 天)常规 JWT 令牌有效期(秒)
jwtttllong2592000(30 天)勾选「记住我」登录时的令牌有效期(秒)
jwtttlshort600(10 分钟)配合刷新令牌使用的短效令牌有效期(秒)
interface":3456"Web 服务监听地址与端口
unixsocket""Unix Socket 路径,设置后替代 TCP 监听
unixsocketmode""Unix Socket 权限位,八进制需加 0o 前缀
publicurl""对外访问完整 URL(末尾带斜杠),用于邮件链接与前后端通信。cors.enable 为 true(默认)时必填,缺失拒绝启动
rootpath见说明数据根目录(数据库、附件、日志、插件的基准路径)。systemd 下跟随 WorkingDirectory;--config 指定配置时默认为配置文件所在目录
maxitemsperpage50API 单页最大返回条数
enablecaldavtrueCalDAV 端点开关(对接日历客户端)
motd""公告信息,通过 /info 接口下发
enablelinksharingtrue项目链接分享开关
enableregistrationtrue开放注册开关,私有化部署建议关闭
enabletaskattachmentstrue任务附件开关
timezone"GMT"全局时区,须使用 tz 数据库标准名(如 Asia/Shanghai),UTC/GMT 偏移写法无效
enabletaskcommentstrue任务评论开关
enabletotptrue双因素认证(TOTP)开关
testingtoken""非空时开放 /test/{table} 调试接口(可任意写库)。生产严禁设置
enableemailreminderstrue任务到期邮件提醒(依赖 mailer)
enableuserdeletiontrue允许用户自助注销账号
maxavatarsize1024头像最大请求尺寸(像素)
demomodefalse演示模式,前端显示数据会被清空的红色警告
enablepublicteamsfalse公开团队开关(团队可被非成员发现)
bcryptrounds11密码哈希强度,每 +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 专用:数据库文件路径。生产建议用绝对路径
maxopenconnections100最大打开连接数(仅 mysql/postgres)
maxidleconnections50最大空闲连接数
maxconnectionlifetime1800000单连接最大存活毫秒数(30 分钟)
sslmode"disable"PostgreSQL 专用:disable / require / verify-ca / verify-full
sslcert / sslkey / sslrootcert""PostgreSQL 客户端证书、私钥、CA 路径
tlsfalseMySQL 专用: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.enabledfalseRedis 开关
redis.host"localhost:6379"Redis 地址(含端口)
redis.password""Redis 密码
redis.db0Redis 逻辑库编号
keyvalue.type"memory"键值存储后端:memory(单机)/ redis(多实例部署必选)

单机部署保持默认即可;多副本水平扩展时必须启用 Redis 并将 keyvalue.type 设为 redis,否则各副本的限流计数与缓存互不可见。

五、cors 段:跨域访问

参数默认值说明
enabletrueCORS 总开关。默认开启,这也是 publicurl 成为必填项的原因
origins["http://127.0.0.1:", "http://localhost:"]允许跨域访问的来源列表(须含协议与端口)
maxage0预检请求缓存秒数

前后端分离部署(前端与 API 不同域名/端口)时,须把前端来源加入 origins;使用官方内嵌前端保持默认即可。

六、mailer 段:邮件发送

参数默认值说明
enabledfalse邮件总开关。关闭时注册即激活、无法找回密码
host / port"" / 587SMTP 主机与端口。日志仅报 EOF 时尝试改为 25
authtype"plain"认证方式:plain / login / cram-md5
username / password-SMTP 账号密码
skiptlsverifyfalse跳过 TLS 证书校验(自签证书场景)
fromemail"mail@vikunja"发件人地址
queuelength100邮件队列长度
queuetimeout30SMTP 连接空闲超时(秒)
forcesslfalse强制 SSL(默认走 STARTTLS)

配置后可用 CLI 的 vikunja testmail 验证投递(用法见本专栏 CLI 篇)。

七、log 段:日志

参数默认值说明
path"<rootpath>logs"日志文件目录
enabledtrue日志总开关
standard"stdout"标准日志去向:stdout / stderr / file / off
level"INFO"日志级别:ERROR / WARNING / INFO / DEBUG
format"text"输出格式:text / structured(JSON,适合日志采集)
database"off"SQL 查询日志去向(排障时可设 stdout)
databaselevel跟随 levelSQL 日志级别
http"stdout"HTTP 请求日志去向
httplevel跟随 levelHTTP 日志级别(4xx 记 WARNING、5xx 记 ERROR)
events"off"事件日志去向
eventslevel跟随 level事件日志级别(仅 ERROR/INFO/DEBUG)
mail"off"邮件日志去向(不记录邮件正文)
maillevel跟随 level邮件日志级别

systemd 部署保持 stdout 输出、由 journald 采集即可;需要文件落盘时把 standard/http 改为 file 并配置 log.path。

八、ratelimit 段:访问限流

参数默认值说明
enabledfalse限流总开关(面向公网建议开启)
kind"user"限流维度:user / ip
period60统计周期(秒)
limit100周期内单用户/IP 最大请求数
store"keyvalue"计数器存储:keyvalue / memory / redis
noauthlimit10未认证接口(登录、注册、找回密码等)每 IP 每分钟请求上限,不可禁用
tokenrefreshlimit60令牌刷新接口每 IP 每分钟上限(独立于 noauthlimit)
basicauthlimit10BasicAuth 失败(CalDAV、订阅源)每 IP 每分钟上限,仅计失败次数

九、files 段:附件存储

参数默认值说明
basepath"./files"附件存储目录
maxsize"20MB"单附件大小上限
type"local"存储后端:local / s3
s3.endpoint""S3 端点(兼容 MinIO、Backblaze B2 等)
s3.bucket / region""桶名与区域
s3.accesskey / secretkey""访问凭据
s3.usepathstylefalse路径风格寻址(自托管 S3 常需开启)
s3.disablesigningfalse发送 UNSIGNED-PAYLOAD(兼容 Ceph RGW 等不校验签名实现,仅 HTTPS 下生效)

十、migration 段:第三方数据迁移

Vikunja 内置从 Todoist、Trello、Microsoft Todo、Wekan、TickTick、CSV、Vikunja 导出文件等来源的迁移器。公共参数:

参数默认值说明
migration.maxcsvrows100000CSV 导入最大行数
migration.maxitems100000单次迁移允许的最大条目数(项目+任务+评论+附件)
migration.claimtimeout"5m"迁移槽位心跳超时,实例中途崩溃后允许同用户再次发起迁移
migration.vikunjafile.maxsize"256MB"Vikunja 导出包解压后总大小上限
migration.vikunjafile.maxfiles10000单导出包文件数上限
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.enabledfalseOIDC 总开关
providers[].name""前端显示名
providers[].authurl""提供商认证地址
providers[].logouturl""登出跳转地址(可空)
providers[].clientid / clientsecret""客户端凭据
providers[].scope"openid email profile"请求 scope;需要 OIDC 建团队时追加 vikunja_scope
providers[].usernamefallbackfalse允许按用户名匹配本地账号(有劫持风险,慎用)
providers[].emailfallbackfalse允许按邮箱匹配本地账号(要求 email_verified: true)
providers[].forceuserinfofalse强制走 UserInfo 端点取用户信息
providers[].requireavailabilityfalse启动时连不上提供商则直接退出(便于编排系统重启重试)

注意:用环境变量配置 providers 时,配置文件中须先声明 provider 键,否则 Vikunja 无法感知该 provider 存在。

11.3 ldap(目录服务认证)

参数默认值说明
ldap.enabledfalseLDAP 总开关
host / portlocalhost / 389LDAP 服务地址
basedn""搜索基准 DN
userfilter""用户过滤器,%[1]s 为登录名占位符
usetls / verifytlstrue / trueTLS 连接与证书校验
binddn / bindpassword""搜索用服务账号
groupsyncenabledfalse登录时自动同步 LDAP 组为 Vikunja 团队
groupsyncfilter见样例组过滤器,支持 {userdn}、{username} 占位符
groupsyncuseserviceaccountfalse组同步前重新以服务账号绑定
avatarsyncattribute""头像属性(原始字节)
attribute.username / email / displaynameuid / mail / displayName账号字段映射
attribute.memberid"member"组成员属性
attribute.id""不可变标识(AD 用 objectGUID、OpenLDAP 用 entryUUID),保证改名/移动后账号不丢失

十二、metrics 段:监控

参数默认值说明
enabledfalse开启 /api/v1/metrics Prometheus 端点
username / password""非空时该端点启用 BasicAuth
pproffalse暴露 /debug/pprof/ 性能分析端点(与 metrics 共用认证)。仅限内网实例

十三、defaultsettings 段:新用户默认偏好

该段只影响新注册用户的初始设置,修改后不回溯老用户。

参数默认值说明
avatar_provider"initials"头像来源:gravatar / initials / upload / marble
email_reminders_enabledfalse邮件提醒默认开关
discoverable_by_name / discoverable_by_emailfalse / false是否可被按姓名/邮箱搜索到
overdue_tasks_reminders_enabledtrue每日逾期任务汇总邮件
overdue_tasks_reminders_time"9:00"汇总邮件发送时间
default_project_id0默认项目 ID(须确保用户有权访问)
week_start0一周起始日(0=周日,1=周一)
language跟随浏览器界面语言(ISO 639-1 + ISO 3166-1)
timezone跟随 service.timezone个人时区(影响提醒与邮件时间)

十四、webhooks 与 outgoingrequests 段:外发请求安全

参数默认值说明
webhooks.enabledtrueWebhook 总开关
webhooks.timeoutseconds30Webhook 请求超时
webhooks.proxyurl / proxypassword / allownonroutableips-已废弃,迁移至 outgoingrequests 同名项
outgoingrequests.allownonroutableipsfalse外发请求(Webhook、头像下载、迁移导入、许可证校验)允许解析到内网地址;默认 false 防 SSRF
outgoingrequests.proxyurl""外发请求统一代理(建议配合 mole 等专用出口代理)
outgoingrequests.proxypassword""代理密码

多用户实例强烈建议配置出口代理并保持 allownonroutableips 为 false,防止用户通过 Webhook 探测内网。

十五、audit 段:审计日志(付费功能)

参数默认值说明
audit.enabledfalse审计日志开关(需含 audit_logs 特性的许可证)
audit.logfile""日志文件路径(JSONL 格式,默认写 log 目录下 audit.log)
audit.rotation.maxsizemb100单文件超过该 MB 数后轮转(0 关闭)
audit.rotation.maxage30轮转文件保留天数(0 永久)

十六、autotls 段:自动 HTTPS

参数默认值说明
autotls.enabledfalse自动向 Let's Encrypt 申请证书并直接以 TLS 提供服务(启用即同意 LE 条款)
autotls.email""证书注册邮箱(必填)
autotls.renewbefore"30d"到期前续期窗口

使用前提:publicurl 配置为带有效 TLD 的公网域名,建议 interface 改为 :443。已有 Nginx/Caddy 反代时无需此功能。

十七、plugins 段与 license 段

参数默认值说明
plugins.enabledfalse插件系统开关
plugins.dir"<rootpath>plugins"插件目录
plugins.loader"native"加载器:yaegi(Go 源码目录)/ native(编译后的 .so,已废弃)
license.key""商业许可证密钥;留空为社区模式,所有非付费功能可用

十八、sentry、avatar、backgrounds、legal 段速览

参数默认值说明
sentry.enabled / frontendenabledfalse / false匿名错误上报(API / 前端)
sentry.dsn / frontenddsn官方 DSN自定义 Sentry 接收地址
avatar.gravatarexpiration3600Gravatar 缓存秒数
avatar.gravatarbaseurlgravatar.com兼容服务地址(如 Libravatar)
backgrounds.enabledtrue项目背景图总开关
backgrounds.providers.upload.enabledtrue允许上传背景图
backgrounds.providers.unsplash.enabledfalseUnsplash 图源(需 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 提取方式。

二十、参考链接