Skip to main content

16 posts tagged with "homelab"

View All Tags

Wei Ji

背景

我的 Homelab 是透過筆電和 USB 外接 DAS (Direct Attached Storage) 建構的,並且採過一些小坑。最近在建置新的節點時,發現我把相關的資訊分散在不同的筆記和 IaC (Infrastructure as Code) 裡面,於是想說趁這個機會整理一下資訊。

電池充電上限

Framework 的話可以在 BIOS 設定充電上限:

(從 Framework 的論壇借用螢幕截圖

另外一台 Lenovo 的筆電則是靠這個設定:

https://github.com/makifdb/lenopow

我會把把充電上限設在 80% 避免筆電作為伺服器長時間插著充電造成電池膨脹。

筆電螢幕問題

讓筆電不會因為螢幕蓋上而進入休眠模式,編輯 /etc/systemd/logind.conf

HandleLidSwitch=ignore

執行指令重啟服務:

systemctl restart systemd-logind.service

但是上述設定會造成另外一個問題:螢幕蓋著還是繼續發光,於是還需要一個步驟,編輯 /etc/default/grub

GRUB_CMDLINE_LINUX_DEFAULT 插入 consoleblank=60

這會讓螢幕在 60 秒後熄滅。

完整 Ansible Playbook
- name: Setup laptop
hosts:
- arachne-node-beta
tasks:
- name: check if consoleblank is configured in the boot command
ansible.builtin.lineinfile:
backup: true
path: /etc/default/grub
regexp: '^GRUB_CMDLINE_LINUX_DEFAULT=".*consoleblank=60'
state: absent
check_mode: true
register: grub_cmdline_check
changed_when: false
- name: insert consoleblank if missing
ansible.builtin.lineinfile:
backrefs: true
path: /etc/default/grub
regexp: '^(GRUB_CMDLINE_LINUX_DEFAULT=".*)"$'
line: '\1 consoleblank=60"'
when: grub_cmdline_check.found == 0
notify: update grub
- name: Set HandleLidSwitch
ansible.builtin.lineinfile:
backrefs: true
path: /etc/systemd/logind.conf
regexp: "#?(HandleLidSwitch=)(?:.*)$"
line: '\1ignore'
notify: Restart logind
handlers:
- name: update grub
ansible.builtin.command: update-grub
- name: Restart logind
ansible.builtin.systemd_service:
name: systemd-logind
state: restarted

DAS 掛載

當服務透過 Docker 跑在容器內,持久化資料卻儲存在透過 USB 連線的外部儲存中,這個仰賴關係需要額外處理。

自動化載

編輯 /etc/fstab 加入以下內容:

# DAS
UUID=7f858b7e-f942-45b3-92dd-8c99b497b6a4 /mnt/das-storage ext4 defaults,nofail,x-systemd.automount 0 2

修改後執行:

systemctl daemon-reload
info

UUID 可以透過 lsblk -f 之類的指令獲得。

設定仰賴

新增檔案 /etc/systemd/system/docker.service.d/override.conf

[Unit]
After=mnt-das\\x2dstorage.automount
ConditionPathExists=/mnt/das-storage
systemctl restart docker.service

確保 Docker Daemon 在 DAS 掛載後才運行。

DAS SMART 檢查

因為電腦沒有直接和硬碟建立連線而是隔著一層 DAS,因此不能使用普通的 smartctl 指令確認,而必須使用額外的參數1

smartctl -a -d jmb39x-q,0 /dev/sdd
smartctl -a --device jmb39x-q,1 /dev/sdd
smartctl -a -d jmb39x-q,2 /dev/sdd
smartctl -a --device jmb39x-q,3 /dev/sdd

Footnotes

  1. QNAP External RAID Manager - Export SMART Data - QNAP NAS Community Forum. Retrieved 2026-01-03, from https://forum.qnap.com/viewtopic.php?p=873575&sid=573c6149a1276e4ab8d9f4785f1c6029#p873575

Wei Ji

最近在 Homelab 架了一個 PyPI 快取伺服器,選擇使用 devpi

Docker 映像檔則是使用:

然後遇到了一個怪問題,在這邊隨便紀錄一下:

INFO  [IDX] Committing 2500 new documents to search index.
[IDX] Error during indexing in /usr/local/lib/python3.13/site-packages/devpi_web/whoosh_index.py:401:handler whoosh.index.LockError

症狀就是服務長時間佔用 CPU 長達一、兩天,連進去容器下 top 看到一堆像是殭屍的 process(實際上暫用 CPU 的只有一個)。

最後只保留 /+files 這個資料夾、把其他快取的檔案刪掉再啟動伺服器就正常了。看起來像是 devpi 會下載整個 PyPI 的索引資料,但是同步完成前有什麼錯誤造成檔案損壞後無法從錯誤中恢復過來,所以一直保持「下載與處理索引」的狀態佔用 CPU。

Wei Ji

最近在清理我放在瀏覽器裡面的書籤,搭配最近架設的 Homelab ,以下是我的 SOP:

  1. 它是 GitHub 專案。
    1. 它超過兩個月沒更新:Clone 下來丟 Gitea
    2. 否則:餵給 Tiny Tiny RSS 訂閱1
  2. 它是 PDF:丟 Kavita
  3. 它是圖片:丟 Pinry
  4. 它是 YouTube 影片:丟 Jellyfin
  5. 它的主要價值是平台價值:暫時保留。
  6. 它是維基百科:暫時保留。
  7. 其他不宜直接備份原因:暫時保留。
  8. 否則:備份到 ArchiveBox

Footnotes

  1. RSS feeds for your Github releases, tags and activity. Retrieved 2025-04-28 from https://medium.com/@vilcins/cbda2c51373

Wei Ji

最近在自架 RSS 訂閱器,目前是使用 Tiny Tiny RSS,不過這裡還是把當時查資料時的其他候選方案簡單列一下。

參考

Wei Ji

最近在建置自己的 Homelab,入口網站或儀表板 (Dashboard) 的方案其實不少,我自己目前是使用 Dashy,不過這裡還是把當時查資料時的其他候選方案簡單列一下。

選擇 Dashy 沒有什麼特別的理由,就是星星數夠高、畫面簡單以及仍然保有擴充的潛力,這裡是它支援的資訊欄 (Widget)

其他參考資料

Wei Ji

最近在自架專案管理的工具,目前是使用 Vikunja,不過這裡還是把當時查資料時的其他候選方案簡單列一下。

Planka 明眼人都看得出來它是衝著 Trello 去的,因此作為一個「Kanban 本位主義」的專案管理軟體,使用案例著重在看板本身,對於卡片 (Ticket/Issue) 的管理就稍微薄弱,比如沒有人類友善的流水號可以辨別卡片。

OpenProject 則是側重卡片管理,可以堆疊巢狀結構也可以建立關聯,但是 UI 顯得比較老氣一點。

Wekan 和 Planka 一樣屬於「Kanban 本位主義」,可以從設定啟用人類友善流水號,不過對於卡片管理的功能比較缺乏,巢狀堆疊的設計不是很理想,而且沒辦法建立其他卡片關聯。