
把任務(wù)清單這種日常工具自托管起來是很多折騰過Docker的人都會(huì)動(dòng)過的念頭。市面上Todo類應(yīng)用不少但數(shù)據(jù)在自己手里、界面能用、部署不復(fù)雜的開源方案我最后選了Vikunja。它用GoVue寫的一個(gè)Docker鏡像就能跑起來前五分鐘我就能在瀏覽器里看到登錄頁后面花時(shí)間反而不在安裝本身而是Docker環(huán)境、數(shù)據(jù)庫選型、數(shù)據(jù)持久化這些細(xì)枝末節(jié)。這篇文章就按我實(shí)際部署的順序?qū)懸槐閺腄ocker環(huán)境準(zhǔn)備、為什么選Vikunja、單容器快速跑通到compose編排數(shù)據(jù)庫和反向代理、再到安裝過程中最常踩的幾個(gè)報(bào)錯(cuò)最后聊幾個(gè)裝完立刻要做的事。如果你正打算在服務(wù)器或自己電腦上裝一個(gè)隱私可控的待辦清單工具對Docker只停留在“聽說過”的層面這篇就是照著做就能跑通的實(shí)操記錄。1. 先搞定Docker環(huán)境這是攔路的第一道坎1.1 這個(gè)報(bào)錯(cuò)不等于安裝失敗先看CPU虛擬化開關(guān)最近被問得最多的Docker問題不是Vikunja裝不上而是Docker Desktop壓根啟動(dòng)不了報(bào)錯(cuò)里帶著一句virtualization support was not detected。說實(shí)話這個(gè)問題跟Docker本身關(guān)系不大絕大多數(shù)情況是Windows的CPU虛擬化沒開或者WSL2功能沒啟用。判斷方法很簡單打開任務(wù)管理器切到“性能”選項(xiàng)卡看左下角的CPU信息里面有個(gè)“虛擬化”狀態(tài)。如果顯示“已禁用”直接關(guān)機(jī)進(jìn)BIOS不同主板按鍵不同一般是Del或F2找Intel VT-x或AMD-V/SVM的開關(guān)打開后保存重啟。這一步做完再啟動(dòng)Docker Desktop大概率就正常了。如果你確認(rèn)虛擬化已經(jīng)啟用但Docker Desktop還是報(bào)同樣的錯(cuò)那要注意一下啟動(dòng)方式。Docker Desktop在Windows上有兩種后端Hyper-V和WSL2。新版本默認(rèn)用WSL2這也是我推薦的選擇——鏡像啟動(dòng)更快、內(nèi)存占用更可控。但WSL2本身需要在“啟用或關(guān)閉Windows功能”里把“適用于Linux的Windows子系統(tǒng)”勾上同時(shí)“虛擬機(jī)平臺”也要啟用。兩個(gè)功能都開重啟電腦再打開Docker Desktop就會(huì)好很多。1.2 Docker Desktop安裝完還要調(diào)兩個(gè)設(shè)置很多教程到安裝完就結(jié)束了其實(shí)裝完Docker Desktop后有兩個(gè)設(shè)置直接決定你后面順不順。第一個(gè)是設(shè)置里的“Resources”內(nèi)存分配。Docker Desktop默認(rèn)內(nèi)存可能是2GB跑Vikunja這種輕量應(yīng)用夠用但如果你同時(shí)跑數(shù)據(jù)庫、反代容器建議調(diào)到4GB以上。留意別把宿主機(jī)內(nèi)存全部給出去WSL2會(huì)動(dòng)態(tài)占用但給得太多會(huì)讓W(xué)indows本身變卡。第二個(gè)是鏡像加速。國內(nèi)拉Docker官方鏡像經(jīng)常慢到懷疑人生尤其是第一次拉vikunja/vikunja這種上百M(fèi)B的鏡像。解決辦法是找到Docker Desktop的“Docker Engine”配置JSON加入一個(gè)國內(nèi)鏡像加速地址不同云廠商提供的加速器地址不一樣找一個(gè)在你網(wǎng)絡(luò)環(huán)境下速度穩(wěn)定的就行。配置完重啟Docker Desktop再拉鏡像速度會(huì)上來一大截。“啟動(dòng)docker服務(wù)失敗”這類報(bào)錯(cuò)之前見過不少大多是Docker Desktop安裝過程中Windows服務(wù)沒有注冊成功或者跟殺毒軟件有沖突。修復(fù)路徑基本是卸載重裝Docker Desktop裝完后把Docker相關(guān)的幾個(gè)Windows服務(wù)狀態(tài)確認(rèn)一遍必要時(shí)重啟電腦。1.3 Linux服務(wù)器上的dockersock權(quán)限問題如果你是在云服務(wù)器上跑Docker而不是Windows桌面那遇到的第一個(gè)報(bào)錯(cuò)大概率是這種permission denied while trying to connect to the Docker daemon socket at unix:///var/run/docker.sock這個(gè)錯(cuò)誤特別容易讓新手以為是Docker服務(wù)沒啟動(dòng)其實(shí)不是。它只是因?yàn)楫?dāng)前用戶不在docker用戶組里沒有權(quán)限訪問Docker的socket文件。解決方法sudo usermod -aG docker $USER newgrp docker docker run hello-world第一行把自己加進(jìn)docker組第二行讓用戶組立刻生效第三行驗(yàn)證。如果還是不行確認(rèn)一下當(dāng)前的Docker服務(wù)狀態(tài)sudo systemctl status docker服務(wù)狀態(tài)是active就可以放心往下走了。2. 為什么我選Vikunja以及它和純Docker單容器方案的匹配點(diǎn)2.1 待辦工具那么多選Vikunja的三個(gè)理由選Vikunja之前我試過幾類方案在線網(wǎng)站的看板工具確實(shí)漂亮但任務(wù)數(shù)據(jù)全部放在別人服務(wù)器上一旦免費(fèi)額度收緊或賬號出問題數(shù)據(jù)很難干凈導(dǎo)出用文本文件做清單又太原始手機(jī)上沒辦法快速查看和勾選。Vikunja正好在兩者之間找到了平衡點(diǎn)開源、可以完全自托管界面卻是現(xiàn)代Web應(yīng)用的水準(zhǔn)。它的核心能力覆蓋了一個(gè)人能用到、小團(tuán)隊(duì)也夠用的幾乎所有場景支持列表視圖、看板視圖、甘特圖視圖和表格視圖而看板模式下拖拽操作流暢度相當(dāng)高任務(wù)可以設(shè)置優(yōu)先級、截止時(shí)間、重復(fù)周期和標(biāo)簽還能指派給團(tuán)隊(duì)成員每個(gè)列表、每個(gè)項(xiàng)目都能生成日歷訂閱鏈接可以在手機(jī)日歷里看到截止日期支持PWA方式添加到手機(jī)主屏用起來接近原生App最關(guān)鍵的是Vikunja不依賴重型第三方服務(wù)一個(gè)Docker容器加上可選的數(shù)據(jù)庫就能完整運(yùn)行。這正是我想要的“能自己掌控一切”的部署方式。2.2 一個(gè)容器還是兩個(gè)容器先讀懂Vikunja的架構(gòu)網(wǎng)上搜Vikunja的安裝教程能看到兩種完全不同的說法。一種說拉兩個(gè)鏡像一個(gè)后端API加一個(gè)前端頁面部署時(shí)要配反代、處理跨域另一種說一個(gè)鏡像直接跑起來。兩種說法都沒錯(cuò)但屬于不同時(shí)期的架構(gòu)。Vikunja的官方鏡像在較新的版本里已經(jīng)把后端Go寫的API服務(wù)和前端Vue構(gòu)建的頁面打包在一起了?,F(xiàn)在直接從Docker Hub拉vikunja/vikunja這個(gè)鏡像一個(gè)容器就能同時(shí)提供前端頁面和API接口不再需要單獨(dú)搞兩個(gè)容器。這個(gè)小細(xì)節(jié)很重要。很多老教程還在按“兩個(gè)鏡像”的思路寫照著做不是不行但多了一堆不必要的配置項(xiàng)對新手很不友好。我下面的操作都是基于新版全棧鏡像容器內(nèi)部前端頁面監(jiān)聽80端口API服務(wù)在容器內(nèi)占用3456端口對外我們只需要暴露一個(gè)80端口就行。2.3 數(shù)據(jù)放哪SQLite和PostgreSQL的選擇邏輯Vikunja支持三種數(shù)據(jù)存儲方式內(nèi)置SQLite、PostgreSQL、MySQL/MariaDB。很多第一次部署的人會(huì)在這里糾結(jié)其實(shí)選擇邏輯很直接。如果只是個(gè)人使用任務(wù)量不大、并發(fā)很低直接用內(nèi)置SQLite是最省事的——不用額外管理數(shù)據(jù)庫容器一個(gè)鏡像把所有事情都干了。但要注意SQLite模式下數(shù)據(jù)庫文件是落在容器里的必須把數(shù)據(jù)目錄持久化出來否則容器一重建任務(wù)全丟。如果是多人使用或者部署在公網(wǎng)服務(wù)器上建議直接用PostgreSQL。PostgreSQL在并發(fā)寫入、備份恢復(fù)、數(shù)據(jù)安全性上都明顯優(yōu)于SQLite而且后續(xù)做定時(shí)備份用pg_dump也順手。我的建議是不管什么場景既然都用了Docker多跑一個(gè)PostgreSQL容器并不復(fù)雜踏踏實(shí)實(shí)把數(shù)據(jù)放在外置數(shù)據(jù)庫里省得以后再遷移。后面我會(huì)給出完整的compose配置。3. 用docker run快速跑起來先讓界面出現(xiàn)在瀏覽器里3.1 最簡啟動(dòng)命令與參數(shù)逐項(xiàng)拆解先把Vikunja跑起來看看效果是最有成就感的階段。不急著上compose用一條docker run命令就能完成。單容器快速啟動(dòng)docker run -d \ --name vikunja \ -p 3456:80 \ -v /opt/vikunja/files:/app/vikunja/files \ -v /opt/vikunja/db:/app/vikunja/db \ --restart unless-stopped \ vikunja/vikunja:latest拆開看每個(gè)參數(shù)的意思-d后臺運(yùn)行不占用當(dāng)前終端--name vikunja給容器起名字后續(xù)docker logs vikunja、docker restart vikunja都靠這個(gè)名字-p 3456:80宿主機(jī)3456端口映射到容器內(nèi)80端口瀏覽器訪問http://服務(wù)器IP:3456-v /opt/vikunja/files:/app/vikunja/files把容器內(nèi)附件、上傳文件目錄掛載到宿主機(jī)-v /opt/vikunja/db:/app/vikunja/db把SQLite數(shù)據(jù)庫文件目錄掛載出來這個(gè)掛載至關(guān)重要--restart unless-stopped服務(wù)器重啟或Docker重啟時(shí)自動(dòng)拉起容器這段命令里db目錄的掛載很容易被忽略。Vikunja用內(nèi)置SQLite時(shí)數(shù)據(jù)庫文件就存放在這個(gè)目錄里。只掛載files目錄不做db掛載的話容器重建時(shí)任務(wù)數(shù)據(jù)會(huì)全部歸零。3.2 首次登錄、初始化管理員和立刻要做的安全設(shè)置命令執(zhí)行完后等幾秒鐘讓容器完成啟動(dòng)然后用瀏覽器訪問http://你的服務(wù)器IP:3456首次打開是Vikunja的登錄頁面。默認(rèn)管理員賬號是admin密碼也是admin。第一次進(jìn)入后立刻去用戶設(shè)置里把密碼改掉同時(shí)把個(gè)人頭像、時(shí)區(qū)、默認(rèn)語言設(shè)置好。之所以強(qiáng)調(diào)這一步是因?yàn)槿绻惆逊?wù)映射到了公網(wǎng)默認(rèn)的admin密碼等于把大門敞開了。哪怕是個(gè)人NAS或者內(nèi)網(wǎng)部署養(yǎng)成改默認(rèn)密碼的習(xí)慣也很有必要。登錄進(jìn)去之后可以先建一個(gè)測試列表隨便加兩個(gè)任務(wù)試試。到這里Vikunja已經(jīng)跑通了你已經(jīng)擁有了一個(gè)完全自托管的待辦清單。3.3 單容器方案的兩個(gè)數(shù)據(jù)持久化坑docker run跑通之后有兩件事不要急著跳過。第一確認(rèn)掛載目錄的屬主權(quán)限。Vikunja容器內(nèi)默認(rèn)以固定的UID運(yùn)行通常是1000如果宿主機(jī)掛載目錄的所有者是root或其他用戶容器寫入數(shù)據(jù)時(shí)可能會(huì)報(bào)sqlite unable to open database file。保險(xiǎn)起見創(chuàng)建目錄后執(zhí)行一下sudo mkdir -p /opt/vikunja/files /opt/vikunja/db sudo chown -R 1000:1000 /opt/vikunja第二改密碼、改配置之前想清楚。用docker run方式啟動(dòng)后如果要改配置項(xiàng)通常是用-e環(huán)境變量但每次新增環(huán)境變量都要重新創(chuàng)建容器。這時(shí)候你會(huì)發(fā)現(xiàn)用compose管理配置要方便得多。所以快速體驗(yàn)結(jié)束之后接下來就應(yīng)該轉(zhuǎn)入compose方案。4. 上生產(chǎn)docker compose 編排數(shù)據(jù)庫和反向代理4.1 compose 文件直接抄全棧鏡像 PostgreSQL真正穩(wěn)定運(yùn)行我推薦用Docker Compose。下面這個(gè)compose文件我直接貼在服務(wù)器上就能用services: db: image: postgres:16-alpine restart: unless-stopped environment: POSTGRES_USER: vikunja POSTGRES_PASSWORD: vikunja POSTGRES_DB: vikunja volumes: - db_data:/var/lib/postgresql/data healthcheck: test: [CMD-SHELL, pg_isready -U vikunja] interval: 5s timeout: 3s retries: 5 vikunja: image: vikunja/vikunja:latest restart: unless-stopped depends_on: db: condition: service_healthy ports: - 3456:80 environment: VIKUNJA_DATABASE_TYPE: postgres VIKUNJA_DATABASE_HOST: db VIKUNJA_DATABASE_USER: vikunja VIKUNJA_DATABASE_PASSWORD: vikunja VIKUNJA_DATABASE_NAME: vikunja volumes: - vikunja_files:/app/vikunja/files volumes: db_data: vikunja_files:使用方式mkdir -p /opt/vikunja cd /opt/vikunja # 把上面內(nèi)容保存成 docker-compose.yml docker compose up -d等待鏡像拉取完成后同樣訪問http://服務(wù)器IP:3456看到登錄頁就說明compose方案也跑通了。4.2 我為什么建議你給Vikunja配獨(dú)立數(shù)據(jù)庫而不是一直用SQLite有人會(huì)問既然SQLite也能跑為什么還要多加一個(gè)PostgreSQL容器我個(gè)人的體會(huì)是這取決于“任務(wù)數(shù)據(jù)”對你的價(jià)值。待辦清單里的任務(wù)可能包含了近期工作安排、家庭事項(xiàng)、項(xiàng)目計(jì)劃一旦損壞或丟失找回的代價(jià)遠(yuǎn)大于多維護(hù)一個(gè)容器的成本。PostgreSQL在幾個(gè)方面比SQLite更適合作為長期數(shù)據(jù)層備份恢復(fù)更成熟pg_dump可以一邊運(yùn)行一邊做邏輯備份不用停服務(wù)并發(fā)寫入更穩(wěn)健多人同時(shí)創(chuàng)建任務(wù)、勾選任務(wù)時(shí)不會(huì)出現(xiàn)鎖等待數(shù)據(jù)庫文件獨(dú)立存在命名卷里容器升級、鏡像重拉本質(zhì)上不影響數(shù)據(jù)compose里那個(gè)healthcheck也很關(guān)鍵。它保證數(shù)據(jù)庫完全就緒后Vikunja才開始連接。沒有這一步經(jīng)常出現(xiàn)Vikunja先啟動(dòng)、數(shù)據(jù)庫還沒打開端口最后報(bào)連接失敗的情況。4.3 用Caddy把Vikunja放到域名下并自動(dòng)HTTPS如果只用IP加端口訪問到這一步就可以停了。但如果你有自己的域名想讓Vikunja跑在標(biāo)準(zhǔn)443端口、自動(dòng)帶HTTPS加一個(gè)Caddy容器是最省力的方式。新建一個(gè)caddy目錄放配置你的域名 { reverse_proxy vikunja:80 }然后在compose文件里追加Caddy服務(wù)。Caddy最大的優(yōu)點(diǎn)是不用手動(dòng)搞證書它會(huì)自動(dòng)申請、續(xù)期HTTPS證書反向代理配置也簡潔到只有一行。它對家庭用戶非常友好不用像Nginx那樣寫大段server塊。注意這里的反代目標(biāo)是vikunja:80也就是compose網(wǎng)絡(luò)里的服務(wù)名而不用管容器內(nèi)部的3456端口。新版全棧鏡像已經(jīng)在容器內(nèi)部把API代理處理好了對外只暴露前端80端口即可。4.4 備份與恢復(fù)容器可以隨便重建數(shù)據(jù)不能丟裝好之后備份就是不得不談的話題。任務(wù)數(shù)據(jù)往往比程序本身重要得多。備份主要分兩塊數(shù)據(jù)庫和上傳文件。PostgreSQL備份docker compose exec db pg_dump -U vikunja vikunja vikunja_backup.sql恢復(fù)時(shí)docker compose exec -T db psql -U vikunja vikunja vikunja_backup.sql文件目錄備份就是打包命名卷里面Vikunja寫入的文件內(nèi)容路徑通常在宿主機(jī)對應(yīng)的volume目錄或者直接備份vikunja_files卷。就我實(shí)踐來看建議把pg_dump和文件打包放到一個(gè)腳本里用cron每天凌晨跑一次然后把備份文件同步到另一臺設(shè)備或?qū)ο蟠鎯?。這比任何容器高可用設(shè)置都靠譜。容器崩了隨時(shí)重建備份丟了才真的是大事。5. 安裝過程中最常見的報(bào)錯(cuò)和定位方法5.1 網(wǎng)頁打不開端口映射、防火墻和容器日志的排查順序容器啟動(dòng)后網(wǎng)頁打不開是我在排查時(shí)遇到最多的情況。不要瞎猜按順序檢查docker ps先看容器狀態(tài)如果STATUS顯示Up說明容器在運(yùn)行。接著在服務(wù)器本機(jī)測試curl http://127.0.0.1:3456本機(jī)能返回HTML頁面內(nèi)容但瀏覽器打不開那基本是云服務(wù)器的防火墻或安全組沒有放行3456端口。登錄云控制臺在安全組規(guī)則里加一條TCP端口3456的入站規(guī)則。本機(jī)也打不開就要看容器日志docker logs vikunja --tail 50Vikunja的日志通常會(huì)把監(jiān)聽地址、端口、數(shù)據(jù)庫連接狀態(tài)都打印出來很多問題一目了然。一個(gè)容易忽略的點(diǎn)是端口被占用。如果3456端口被其他進(jìn)程占了容器啟動(dòng)時(shí)端口映射會(huì)失敗docker ps也會(huì)顯示錯(cuò)誤狀態(tài)。換個(gè)端口映射比如-p 3457:80或者停掉占用進(jìn)程即可。5.2 sqlite unable to open database file掛載目錄權(quán)限和UID的坑第一次用docker run單容器方案時(shí)掛在文件目錄后啟動(dòng)容器日志里報(bào)unable to open database file一度以為是容器內(nèi)路徑寫錯(cuò)了。查了一圈才發(fā)現(xiàn)是掛載目錄權(quán)限問題。Vikunja容器內(nèi)進(jìn)程以非root用戶運(yùn)行UID通常是1000。宿主機(jī)上/opt/vikunja/files目錄如果是root創(chuàng)建、權(quán)限默認(rèn)755容器內(nèi)用戶沒有寫入權(quán)限自然會(huì)報(bào)錯(cuò)。解決辦法就是前面說的sudo chown -R 1000:1000 /opt/vikunja設(shè)置完重啟容器問題解決。這類問題不算罕見很多自托管應(yīng)用容器內(nèi)都用非root用戶運(yùn)行陌生的鏡像先看官方文檔中關(guān)于USER或PUID/PGID的說明能省不少排查時(shí)間。5.3 外置數(shù)據(jù)庫連接不上host該寫db而不是localhost切到compose方案后常見的坑是把數(shù)據(jù)庫連接地址寫成localhost或127.0.0.1。在compose網(wǎng)絡(luò)里每個(gè)服務(wù)名等同于一個(gè)主機(jī)名。Vikunja要連數(shù)據(jù)庫應(yīng)該填服務(wù)名db而不是本機(jī)回環(huán)地址。如果把VIKUNJA_DATABASE_HOST寫成localhostVikunja容器內(nèi)部找不到數(shù)據(jù)庫服務(wù)日志會(huì)報(bào)連接失敗。同理如果數(shù)據(jù)庫跑在宿主機(jī)上而不是容器里Vikunja容器要訪問宿主機(jī)數(shù)據(jù)庫得填Docker虛擬網(wǎng)關(guān)地址通常是172.17.0.1而不是localhost。這一點(diǎn)對新手來說比較容易繞進(jìn)去。出現(xiàn)數(shù)據(jù)庫認(rèn)證失敗時(shí)先確認(rèn)compose文件中的POSTGRES_USER、POSTGRES_PASSWORD和Vikunja這邊的VIKUNJA_DATABASE_USER、VIKUNJA_DATABASE_PASSWORD完全一致。密碼如果包含特殊字符注意環(huán)境變量里的轉(zhuǎn)義問題。5.4 常見報(bào)錯(cuò)速查表報(bào)錯(cuò)/現(xiàn)象可能原因排查與解決Docker Desktop提示virtualization support not detectedBIOS未開啟虛擬化開啟VT-x/AMD-V啟用WSL2功能permission denied while trying to connect to docker api用戶不在docker組sudo usermod -aG docker $USER后重新登錄鏡像拉取慢或超時(shí)未配置鏡像加速使用國內(nèi)鏡像加速地址配置后重啟Docker容器Up但網(wǎng)頁打不開安全組/防火墻攔截或端口映射異常本機(jī)curl驗(yàn)證檢查云安全組入站規(guī)則sqlite unable to open database file掛載目錄屬主不是UID 1000chown -R 1000:1000掛載目錄數(shù)據(jù)庫連接失敗Connection refused數(shù)據(jù)庫地址寫錯(cuò)或未就緒compose網(wǎng)絡(luò)內(nèi)寫服務(wù)名db確認(rèn)healthcheck通過password authentication failed for user vikunja數(shù)據(jù)庫賬號密碼不一致核對兩處環(huán)境變量6. 安裝完成之后這幾個(gè)設(shè)置我建議立刻做6.1 環(huán)境變量優(yōu)先VK_前綴的使用習(xí)慣Vikunja支持環(huán)境變量配置也支持掛載配置文件config.yml。我在容器化部署時(shí)更習(xí)慣用環(huán)境變量因?yàn)閏ompose文件本身就能承載全部配置不用額外準(zhǔn)備配置文件也方便用git管理。Vikunja的環(huán)境變量都以VK_開頭規(guī)則是把配置文件里的層級字段轉(zhuǎn)成大寫加下劃線。比如配置文件里是database.host環(huán)境變量就是VIKUNJA_DATABASE_HOSTservice.jwt_secret對應(yīng)VIKUNJA_SERVICE_JWT_SECRET。有一個(gè)變量強(qiáng)烈建議顯式設(shè)置就是JWT密鑰。如果不上配置Vikunja每次冷啟動(dòng)可能會(huì)生成新的臨時(shí)密鑰導(dǎo)致用戶登錄態(tài)丟失。在compose的environment里加一項(xiàng)固定的密鑰比登錄一次失效一次更省心。密鑰可以用openssl rand -base64 32生成一串隨機(jī)值這個(gè)值相對較長且難以猜測。6.2 注冊策略、深色模式、附件大小這些開箱配置Vikunja默認(rèn)開放用戶注冊。如果你部署在公網(wǎng)或者公司多人環(huán)境建議登錄管理員后臺把自助注冊關(guān)掉改為邀請注冊或管理員建號避免公網(wǎng)任意用戶都能注冊賬號。界面?zhèn)萔ikunja原生支持多主題和深色模式在個(gè)人設(shè)置里切一下就行不需要額外配置。附件上傳默認(rèn)限制大小如果團(tuán)隊(duì)協(xié)作中常用圖片和文檔附件建議根據(jù)實(shí)際需求調(diào)大上傳上限。這個(gè)配置在環(huán)境變量里對應(yīng)VK_FILES_MAX_SIZE單位是字節(jié)比如想允許50MB附件就寫52428800。注意不要超出服務(wù)器或反向代理的請求體大小限制否則會(huì)表現(xiàn)為“上傳失敗”而不是明確的報(bào)錯(cuò)信息。6.3 日歷訂閱把任務(wù)日歷同步到手機(jī)裝好Vikunja后最值得長期使用的一個(gè)功能是任務(wù)日歷訂閱。在Vikunja項(xiàng)目或列表設(shè)置里可以找到iCal訂閱鏈接。把這個(gè)鏈接添加到手機(jī)自帶日歷App或任意支持網(wǎng)絡(luò)訂閱的日歷應(yīng)用里任務(wù)截止日期就會(huì)自動(dòng)出現(xiàn)在日歷上雙向勾選后也會(huì)同步回去。這個(gè)功能對普通人來說是很實(shí)用的任務(wù)清單平時(shí)看Vikunja到了具體哪天該做什么直接看日歷就行不用在兩個(gè)應(yīng)用之間來回切。這也側(cè)面說明了為什么部署時(shí)要記得掛載好數(shù)據(jù)目錄、做好備份——日歷訂閱、附件、歷史任務(wù)這些數(shù)據(jù)都是用得越久越有價(jià)值前期部署時(shí)把基礎(chǔ)打牢后面才敢放心往里放真數(shù)據(jù)。我個(gè)人的經(jīng)驗(yàn)是不要一上來就追求把Vikunja的所有功能都用滿先跑通核心流程把任務(wù)清單和日歷訂閱用起來兩周后再回過頭優(yōu)化主題、維護(hù)策略、調(diào)整備份頻率。自托管工具的樂趣本就在這個(gè)逐步養(yǎng)成的過程中而這一步從Docker把它跑起來才算真正開始。