简介

Vikunja是一款功能强大的开源任务管理工具,它帮助用户以一种有组织的方式管理和跟踪所有待办事项。 就像一个拥有超能力的笔记本,Vikunja允许个人或团队轻松地规划、协作并完成项目。 无论是个人使用还是团队合作,Vikunja都提供了灵活性和定制性,让用户能够根据自己的需求调整任务管理方式



环境与安装方式

Vikunja支持二进制安装,docker安装,从源码自己构建安装,我这里使用的是二进制安装

我安装的环境是X86架构的linux(Almalinux)



项目官网/下载地址

和其他的开源程序不一样,这个再Github里面也可以找到,但是里面只有源码,没有编译好的二进制文件等,需要二进制文件的话可以到它的官网下载。

项目官网:https://vikunja.io/

github项目地址:https://github.com/go-vikunja/vikunja

官方下载仓库地址:https://dl.vikunja.io/vikunja/



下载/解压Vikunja

进入官方的下载仓库地址

1.png

点击最新版的版本号,这里注意,有的版本号带rc的,带rc的是候选版本,可以理解为测试版本,我们需要的是稳定版的

2.png

找到适合自己服务器软硬件的版本,鼠标右键,复制链接地址

3.png

使用ssh工具连接到服务器,然后根据自己的习惯创建一个文件夹,用于存放软件,我的习惯是自己安装的软件放在/opt/下面对应的文件夹里面

cd /opt
mkdir vikunja

4.png

进入刚刚创建的文件夹

cd vikunja

5.png

使用wget命令下载刚刚复制的链接

wget 刚刚再下载仓库复制的链接

wget https://dl.vikunja.io/vikunja/0.24.6/vikunja-v0.24.6-linux-amd64-full.zip

6.png

下载完成后可以使用ls命令查看下载的文件

7.png

下载下来的是一个zip包,使用unzip解压,解压完成后可以使用ls命令查看解压出来的文件

unzip vikunja-v0.24.6-linux-amd64-full.zip

8.png

为了方便管理,我们需要删除不需要的文件

rm LICENSE vikunja-v0.24.6-linux-amd64-full.zip vikunja-v0.24.6-linux-amd64.sha256

9.png

然后把二进制文件重命名一下,方便后续升级更新

mv vikunja-v0.24.6-linux-amd64 vikunja

10.png



配置Vikunja

刚刚解压出来的文件里面有一个config.yml.sample,这个是官方的配置示例文件,我们可以在这个文件上进行修改或者参考这个文件写一个新的config.yml文件

下面是翻译后的配置文件示例

service:
  # 此令牌用于验证签发的 JWT 令牌。
  # 默认是随机生成的,每次启动 Vikunja 都会生成新的。
  # (这意味着重启 Vikunja 后所有已签发的令牌都会失效)
  JWTSecret: "<jwt-secret>"
  # JWT 令牌有效期(秒),默认 259200 秒(3 天)
  jwtttl: 259200
  # “记住我”模式令牌有效期(秒),默认 2592000 秒(30 天)
  jwtttllong: 2592000
  # Web 服务器运行接口
  interface: ":3456"
  # Unix 套接字路径,如果设置,将使用套接字而不是 TCP
  unixsocket:
  # Unix 套接字权限,八进制值需以 0o 前缀,例如 0o660
  unixsocketmode:
  # 用户访问 Vikunja 的公共 URL,用于邮件和前后端通信
  publicurl: ""
  # 可执行文件和资源所在的根路径
  # Vikunja 也会在此路径查找配置文件
  rootpath: <rootpath>
  # 每页最大返回项目数
  maxitemsperpage: 50
  # 是否启用 CalDAV 接口
  enablecaldav: true
  # 设置每日消息(MOTD),通过 /info 接口可见
  motd: ""
  # 是否允许通过链接共享项目
  enablelinksharing: true
  # 是否允许新用户自行注册
  enableregistration: true
  # 是否允许任务附件
  enabletaskattachments: true
  # 所有时间戳使用的时区,需使用官方 tz 数据库名称(UTC/GMT 不可用)
  timezone: GMT
  # 是否启用任务评论
  enabletaskcomments: true
  # 是否启用 TOTP 双因素认证
  enabletotp: true
  # 如果不为空,将启用 /test/{table} 接口用于测试,可写入任意内容
  # 非常危险,除非明确知道用途,否则不要启用
  testingtoken: ''
  # 是否在任务到期时发送邮件提醒
  enableemailreminders: true
  # 是否允许用户请求删除账号
  enableuserdeletion: true
  # 用户头像最大尺寸(KB)
  maxavatarsize: 1024
  # 是否显示演示模式警告(数据会被清空)
  demomode: false
  # 是否允许根据节日更换图标
  allowiconchanges: true
  # 是否允许使用自定义 Logo
  customlogourl: ''
  # 是否启用公开团队功能,使团队可被发现
  enablepublicteams: false

sentry:
  # 是否启用 API 错误匿名跟踪(Sentry)
  enabled: false
  # 配置 Sentry DSN 用于 API 错误跟踪
  dsn: "https://440eedc957d545a795c17bbaf477497c@o1047380.ingest.sentry.io/4504254983634944"
  # 是否启用前端错误匿名跟踪
  frontendenabled: false
  # 配置 Sentry DSN 用于前端错误跟踪
  frontenddsn: "https://85694a2d757547cbbc90cd4b55c5a18d@o1047380.ingest.sentry.io/6024480"

database:
  # 数据库类型,可选 sqlite、mysql、postgres
  type: "sqlite"
  # 数据库用户名
  user: "vikunja"
  # 数据库密码
  password: ""
  # 数据库主机
  host: "localhost"
  # 数据库名称
  database: "vikunja"
  # 使用 sqlite 时数据库文件路径
  path: "./vikunja.db"
  # 数据库最大打开连接数(仅 mysql/postgres)
  maxopenconnections: 100
  # 数据库最大空闲连接数(仅 mysql/postgres)
  maxidleconnections: 50
  # 单个数据库连接最大存活时间(毫秒)
  maxconnectionlifetime: 10000
  # postgres 安全连接模式,可选 disable/require 等
  sslmode: disable
  # postgres 客户端证书路径
  sslcert: ""
  # postgres 客户端密钥路径
  sslkey: ""
  # postgres 根证书路径
  sslrootcert: ""
  # mysql 启用 SSL/TLS,可选 false/true/skip-verify/preferred
  tls: false

typesense:
  # 是否启用 Typesense 集成,启用后所有任务通过 Typesense 搜索
  enabled: false
  # Typesense 实例 URL
  url: ''
  # Typesense API key
  apikey: ''

redis:
  # 是否启用 Redis
  enabled: false
  # Redis 服务器地址和端口
  host: 'localhost:6379'
  # Redis 密码
  password: ''
  # 使用的数据库编号(0 为默认)
  db: 0

cors:
  # 是否启用 CORS 头
  enable: false
  # 允许访问 API 的来源列表(需包含协议 http:// 或 https://)
  origins:
    - "*"
  # 预检请求结果缓存时间(秒)
  maxage: 0

mailer:
  # 是否启用邮件功能,禁用后用户注册立即生效且无法重置密码
  enabled: false
  # SMTP 主机
  host: ""
  # SMTP 端口(若遇 EOF 错误可尝试改为 25)
  port: 587
  # SMTP 验证类型,可选 plain、login、cram-md5
  authtype: "plain"
  # SMTP 用户名
  username: "user"
  # SMTP 密码
  password: ""
  # 是否跳过 TLS 验证
  skiptlsverify: false
  # 默认发件人邮箱
  fromemail: "mail@vikunja"
  # 邮件队列长度
  queuelength: 100
  # 邮件连接超时时间(秒)
  queuetimeout: 30
  # 是否强制使用 SSL
  forcessl: false

log:
  # 日志文件保存目录
  path: <rootpath>logs
  # 是否启用日志
  enabled: true
  # 普通日志输出方式,可选 stdout/stderr/file/off
  standard: "stdout"
  # 日志级别,可选 CRITICAL/ERROR/WARNING/NOTICE/INFO/DEBUG
  level: "INFO"
  # 是否记录数据库查询(调试用),可选 stdout/stderr/file/off
  database: "off"
  databaselevel: "WARNING"
  # 是否记录 HTTP 请求
  http: "stdout"
  # Echo 日志,通常不需要
  echo: "off"
  # 是否记录事件日志
  events: "off"
  eventslevel: "info"
  # 是否记录邮件相关日志
  mail: "off"
  maillevel: "info"

ratelimit:
  # 是否启用速率限制
  enabled: false
  # 速率限制类型,可选 user 或 ip
  kind: user
  # 限制周期(秒)
  period: 60
  # 单位周期最大请求数
  limit: 100
  # 计数存储方式,可选 keyvalue/memory/redis
  store: keyvalue
  # 未认证用户每分钟访问限制(登录、注册、密码重置等接口)
  noauthlimit: 10

files:
  # 文件存储路径
  basepath: ./files # 相对于二进制文件
  # 文件最大体积
  maxsize: 20MB

migration:
  todoist:
    # 是否启用 Todoist 导入
    enable: false
    # Todoist API client id
    clientid:
    # Todoist API client secret
    clientsecret:
    # 授权后回调 URL
    redirecturl: <service.publicurl>/migrate/todoist
  trello:
    # 是否启用 Trello 导入
    enable: false
    key:
    redirecturl: <frontend url>/migrate/trello
  microsofttodo:
    # 是否启用 Microsoft ToDo 导入
    enable: false
    clientid:
    clientsecret:
    redirecturl: <frontend url>/migrate/microsoft-todo

avatar:
  # 使用 Gravatar 时缓存过期时间(秒)
  gravatarexpiration: 3600

backgrounds:
  # 是否启用项目背景
  enabled: true
  providers:
    upload:
      # 是否允许上传背景
      enabled: true
    unsplash:
      # 是否允许 Unsplash 背景
      enabled: false
      accesstoken:
      applicationid:

legal:
  # 法律相关 URL,会显示在前端
  imprinturl:
  privacyurl:

keyvalue:
  # 键值存储类型,可选 memory 或 redis
  type: "memory"

auth:
  # 本地认证设置
  local:
    enabled: true
  # OpenID 第三方认证
  openid:
    enabled: false
    providers:
      - name:
        authurl:
        logouturl:
        clientid:
        clientsecret:
        scope: openid email profile

metrics:
  # 是否启用 Prometheus /metrics 端点
  enabled: false
  username:
  password:

defaultsettings:
  # 新用户默认设置
  avatar_provider: initials
  avatar_file_id: 0
  email_reminders_enabled: false
  discoverable_by_name: false
  discoverable_by_email: false
  overdue_tasks_reminders_enabled: true
  overdue_tasks_reminders_time: 9:00
  default_project_id: 0
  week_start: 0
  language: <unset>
  timezone: <time zone set at service.timezone>

webhooks:
  # 是否启用 Webhooks
  enabled: true
  timeoutseconds: 30
  proxyurl:
  proxypassword:

配置文件修改位置

我的配置文件主要修改了以下几个地方:

1、service模块

JWTSecret 设置为固定的

publicurl 设置为域名

rootpath 改为二进制文件的绝对路径

timezone 改为 GMT

2、mailer模块

SMTP 邮箱配置改为你的 QQ 邮箱

password 改为邮箱授权码

3、log模块

日志路径改为 /opt/vikunja/log/

4、defaultsettings模块

language 改为 zh-CN

timezone 改为 Asia/Shanghai

下面是我修改后的配置文件

service:
  # 此令牌用于验证签发的 JWT 令牌。
  # 默认是随机生成的,每次启动 Vikunja 都会生成新的。
  # (这意味着重启 Vikunja 后所有已签发的令牌都会失效)
  JWTSecret: "12345678"
  # JWT 令牌有效期(秒),默认 259200 秒(3 天)
  jwtttl: 259200
  # “记住我”模式令牌有效期(秒),默认 2592000 秒(30 天)
  jwtttllong: 2592000
  # Web 服务器运行接口
  interface: ":3456"
  # Unix 套接字路径,如果设置,将使用套接字而不是 TCP
  unixsocket:
  # Unix 套接字权限,八进制值需以 0o 前缀,例如 0o660
  unixsocketmode:
  # 用户访问 Vikunja 的公共 URL,用于邮件和前后端通信
  publicurl: "https://task.ersansi.top"
  # 可执行文件和资源所在的根路径
  # Vikunja 也会在此路径查找配置文件
  rootpath: /opt/vikunja/
  # 每页最大返回项目数
  maxitemsperpage: 50
  # 是否启用 CalDAV 接口
  enablecaldav: true
  # 设置每日消息(MOTD),通过 /info 接口可见
  motd: ""
  # 是否允许通过链接共享项目
  enablelinksharing: true
  # 是否允许新用户自行注册
  enableregistration: true
  # 是否允许任务附件
  enabletaskattachments: true
  # 所有时间戳使用的时区,需使用官方 tz 数据库名称(UTC/GMT 不可用)
  timezone: GMT
  # 是否启用任务评论
  enabletaskcomments: true
  # 是否启用 TOTP 双因素认证
  enabletotp: true
  # 如果不为空,将启用 /test/{table} 接口用于测试,可写入任意内容
  # 非常危险,除非明确知道用途,否则不要启用
  testingtoken: ''
  # 是否在任务到期时发送邮件提醒
  enableemailreminders: true
  # 是否允许用户请求删除账号
  enableuserdeletion: true
  # 用户头像最大尺寸(KB)
  maxavatarsize: 1024
  # 是否显示演示模式警告(数据会被清空)
  demomode: false
  # 是否允许根据节日更换图标
  allowiconchanges: true
  # 是否允许使用自定义 Logo
  customlogourl: ''
  # 是否启用公开团队功能,使团队可被发现
  enablepublicteams: false

sentry:
  # 是否启用 API 错误匿名跟踪(Sentry)
  enabled: false
  # 配置 Sentry DSN 用于 API 错误跟踪
  dsn: "https://440eedc957d545a795c17bbaf477497c@o1047380.ingest.sentry.io/4504254983634944"
  # 是否启用前端错误匿名跟踪
  frontendenabled: false
  # 配置 Sentry DSN 用于前端错误跟踪
  frontenddsn: "https://85694a2d757547cbbc90cd4b55c5a18d@o1047380.ingest.sentry.io/6024480"

database:
  # 数据库类型,可选 sqlite、mysql、postgres
  type: "sqlite"
  # 数据库用户名
  user: "vikunja"
  # 数据库密码
  password: ""
  # 数据库主机
  host: "localhost"
  # 数据库名称
  database: "vikunja"
  # 使用 sqlite 时数据库文件路径
  path: "./vikunja.db"
  # 数据库最大打开连接数(仅 mysql/postgres)
  maxopenconnections: 100
  # 数据库最大空闲连接数(仅 mysql/postgres)
  maxidleconnections: 50
  # 单个数据库连接最大存活时间(毫秒)
  maxconnectionlifetime: 10000
  # postgres 安全连接模式,可选 disable/require 等
  sslmode: disable
  # postgres 客户端证书路径
  sslcert: ""
  # postgres 客户端密钥路径
  sslkey: ""
  # postgres 根证书路径
  sslrootcert: ""
  # mysql 启用 SSL/TLS,可选 false/true/skip-verify/preferred
  tls: false

typesense:
  # 是否启用 Typesense 集成,启用后所有任务通过 Typesense 搜索
  enabled: false
  # Typesense 实例 URL
  url: ''
  # Typesense API key
  apikey: ''

redis:
  # 是否启用 Redis
  enabled: false
  # Redis 服务器地址和端口
  host: 'localhost:6379'
  # Redis 密码
  password: ''
  # 使用的数据库编号(0 为默认)
  db: 0

cors:
  # 是否启用 CORS 头
  enable: false
  # 允许访问 API 的来源列表(需包含协议 http:// 或 https://)
  origins:
    - "*"
  # 预检请求结果缓存时间(秒)
  maxage: 0

mailer:
  # 是否启用邮件功能,禁用后用户注册立即生效且无法重置密码
  enabled: true
  # SMTP 主机
  host: "smtp.qq.com"
  # SMTP 端口(若遇 EOF 错误可尝试改为 25)
  port: 465
  # SMTP 验证类型,可选 plain、login、cram-md5
  authtype: "plain"
  # SMTP 用户名
  username: "11111111@qq.com"
  # SMTP 密码
  password: "11111111"
  # 是否跳过 TLS 验证
  skiptlsverify: false
  # 默认发件人邮箱
  fromemail: "11111111@qq.com"
  # 邮件队列长度
  queuelength: 100
  # 邮件连接超时时间(秒)
  queuetimeout: 30
  # 是否强制使用 SSL
  forcessl: true

log:
  # 日志文件保存目录
  path: /opt/vikunja/log/
  # 是否启用日志
  enabled: true
  # 普通日志输出方式,可选 stdout/stderr/file/off
  standard: "stdout"
  # 日志级别,可选 CRITICAL/ERROR/WARNING/NOTICE/INFO/DEBUG
  level: "INFO"
  # 是否记录数据库查询(调试用),可选 stdout/stderr/file/off
  database: "off"
  databaselevel: "WARNING"
  # 是否记录 HTTP 请求
  http: "stdout"
  # Echo 日志,通常不需要
  echo: "off"
  # 是否记录事件日志
  events: "off"
  eventslevel: "info"
  # 是否记录邮件相关日志
  mail: "off"
  maillevel: "info"

ratelimit:
  # 是否启用速率限制
  enabled: false
  # 速率限制类型,可选 user 或 ip
  kind: user
  # 限制周期(秒)
  period: 60
  # 单位周期最大请求数
  limit: 100
  # 计数存储方式,可选 keyvalue/memory/redis
  store: keyvalue
  # 未认证用户每分钟访问限制(登录、注册、密码重置等接口)
  noauthlimit: 10

files:
  # 文件存储路径
  basepath: ./files # 相对于二进制文件
  # 文件最大体积
  maxsize: 20MB

migration:
  todoist:
    # 是否启用 Todoist 导入
    enable: false
    # Todoist API client id
    clientid:
    # Todoist API client secret
    clientsecret:
    # 授权后回调 URL
    redirecturl: <service.publicurl>/migrate/todoist
  trello:
    # 是否启用 Trello 导入
    enable: false
    key:
    redirecturl: <frontend url>/migrate/trello
  microsofttodo:
    # 是否启用 Microsoft ToDo 导入
    enable: false
    clientid:
    clientsecret:
    redirecturl: <frontend url>/migrate/microsoft-todo

avatar:
  # 使用 Gravatar 时缓存过期时间(秒)
  gravatarexpiration: 3600

backgrounds:
  # 是否启用项目背景
  enabled: true
  providers:
    upload:
      # 是否允许上传背景
      enabled: true
    unsplash:
      # 是否允许 Unsplash 背景
      enabled: false
      accesstoken:
      applicationid:

legal:
  # 法律相关 URL,会显示在前端
  imprinturl:
  privacyurl:

keyvalue:
  # 键值存储类型,可选 memory 或 redis
  type: "memory"

auth:
  # 本地认证设置
  local:
    enabled: true
  # OpenID 第三方认证
  openid:
    enabled: false
    providers:
      - name:
        authurl:
        logouturl:
        clientid:
        clientsecret:
        scope: openid email profile

metrics:
  # 是否启用 Prometheus /metrics 端点
  enabled: false
  username:
  password:

defaultsettings:
  # 新用户默认设置
  avatar_provider: initials
  avatar_file_id: 0
  email_reminders_enabled: false
  discoverable_by_name: false
  discoverable_by_email: false
  overdue_tasks_reminders_enabled: true
  overdue_tasks_reminders_time: 9:00
  default_project_id: 0
  week_start: 0
  language: zh-CN
  timezone: Asia/Shanghai

webhooks:
  # 是否启用 Webhooks
  enabled: true
  timeoutseconds: 30
  proxyurl:
  proxypassword:

11.png

保存并退出

:wq

12.png

查看配置文件名称是否正确,配置文件名称为config.yml

13.png



测试启动

确定配置文件名称没问题后,测试一下是否可以正常启动,启动后没报错就是成功了

./vikunja 

14.png

这时候我们使用浏览器访问服务器地址加端口号就可以看到登录页面了

15.png



配置开机自启

只要看到登录页面就是正常了,接下来就是配置开机自启了

首先按【Ctrl】+【c】停止

然后进入服务文件目录

cd /etc/systemd/system

16.png

创建一个.service文件

vi vikunja.service

17.png

把下面内容根据自己实际情况修改,然后粘贴进去,注意把注释全部删掉

[Unit]
Description=Vikunja
After=syslog.target network.target
Requires=postgresql.service  # 根据实际数据库选择
#Requires=mysql.service
#Requires=redis.service

[Service]
Type=simple
WorkingDirectory=/opt/vikunja # 二进制文件所在目录路径
ExecStart=/opt/vikunja/vikunja #二进制文件路径
Restart=always
RestartSec=2s

[Install]
WantedBy=multi-user.target

18.png

保存并退出

19.png

修改文件权限

chmod +x vikunja.service

20.png

刷新system文件

sudo systemctl daemon-reload

21.png

启动vikunja

systemctl start vikunja.service

22.png

设置开机自启

systemctl enable vikunja.service

23.png



使用

第一次登录

vikunja是没有默认管理员账号密码的,第一次登录是需要先注册一个账号密码

而且vikunja是没有管理员的,所有用户注册后就是普通用户,想要修改配置等都需要手动修改config文件

24.png


创建待办任务

点击【项目】

25.png

点击【新建项目】

26.png

输入标题,然后点击【创建】

27.png

这样一个大项目就创建好了,可以在这个大项目下面创建小项目

点击大项目旁边的三个点,然后点击【创建项目】

28.png

输入项目标题,然后点击【创建】

29.png

这样就创建好小项目了

30.png

接下来创建任务

点击项目名称,然后输入任务名称,点击【添加】

31.png

任务创建好后需要设置任务,点击任务右边的两条杠

32.png

在里面设置任务内容,时间等

33.png


更新

首先进行备份,备份当前版本的二进制文件

只需将二进制文件替换为新版本,然后重新启动 Vikunja。它将自动运行所有必要的数据库迁移。

请务必查看新版本的更新日志,以免错过更新过程中可能涉及的任何手动步骤!



二维码

发表评论

已有 2 条评论

  1. wkay
    wkay
    美国
    Mac OS X 10.15.7 Mac OS X 10.15.7 / Google Chrome 147 Google Chrome 147
    回复

    请问最新版的vikunja使用webhook向ntfy发送通知的话配置应该怎么填呀,试了半天一直403,找不出问题

    1. king
      king 作者
      中国贵州省贵阳市联通
      Android 10 Android 10 / Google Chrome 147 Google Chrome 147
      回复
      @wkay

      这个我还真没研究过,但是403错误一般都是防火墙或者是端口问题,检查一下看看放行webhook所需的端口之类的没有,如果两个服务都是在同一台服务器就可以排除防火墙和端口的问题