Lenovo ThinkPad T14 Gen 1 (AMD)を自宅サーバにする

View post on imgur.com

同じシリーズのGen 6に乗り換えて不要になったPCを活用していく。

Headless ThinkPad

冷却を考慮すると不要になるディスプレイユニット外したほうが良いんじゃね?って思って調べてこれを見る限り簡単そうだしそのつもりになっていたのだが、
よく考えてみると自宅サーバーで冷却気にしないと行けないほどCPUヘビーなことやらせないなと思ったのでやめた。

準備

BIOSのConfigからDisplay > UMA Frame buffer Size: 512MとPower > Lid Sensor: Disabledを設定した。
OSにはDebianを選択しインストールとセットアップの後に蓋の開閉が問題ないかやCPUに負荷をかけてちゃんとファンが回るかを確認した。

トラブル

Debianのインストール自体は正常終了するがブートメニューにDebianが無いしGRUBの再インストールなども効果が無くて困り果てていたが、
BIOSのStartup > Boot Order Lockが原因でこれをDisabledに戻したら解決した。
これは以前Windows 10で使っていた頃に突然再起動してWindowsを見失うという不安過ぎる挙動を起こしたときにEnabledにしたやつだった。

雑感

自宅サーバーとしてはRaspberry Pi 4(2.5インチ SSD, 6010ファン)のものが5年以上稼働中でこれでことは足りているので過剰性能ではある。
T14 Gen 1は右方排熱なのでそっちを手前にすれば本棚みたいなものにも入れやすいのが良い。

セットアップログ

echo "Defaults timestamp_timeout=120" | sudo tee -a /etc/sudoers
sudo apt install bat curl fd-find fzf git git-delta gpg libarchive-tools lsd ripgrep starship tmux vim xh zoxide

# [bat](https://github.com/sharkdp/bat)
sudo ln -s $(which batcat) /usr/local/bin/bat

# [fd](https://github.com/sharkdp/fd)
sudo ln -s $(which fdfind) /usr/local/bin/fd

# [fish](https://fishshell.com/)
echo 'deb http://download.opensuse.org/repositories/shells:/fish:/release:/4/Debian_13/ /' | sudo tee /etc/apt/sources.list.d/shells:fish:release:4.list
curl -fsSL https://download.opensuse.org/repositories/shells:fish:release:4/Debian_13/Release.key | gpg --dearmor | sudo tee /etc/apt/trusted.gpg.d/shells_fish_release_4.gpg > /dev/null
sudo apt update
sudo apt install fish

# [ghq](https://github.com/x-motemen/ghq)
curl -fLSs https://github.com/x-motemen/ghq/releases/latest/download/ghq_linux_amd64.zip | bsdtar xvf -
sudo cp ghq_linux_amd64/ghq /usr/local/bin/ && sudo chmod 755 /usr/local/bin/ghq

# [dotfiles](https://github.com/ebith/dotfiles)
ghq get ebith/dotfiles
cd ghq/github.com/ebith/dotfiles
./create_link.py .config .gitconfig .tmux.conf .vim 
mkdir -p ~/.vimlocal/{backup,swap,undo}
chsh -s $(which fish)
exec fish
rm .bash* .profile
curl -sL https://raw.githubusercontent.com/jorgebucaran/fisher/main/functions/fisher.fish | source && fisher install jorgebucaran/fisher
fisher update

# sudoedit
sudo update-alternatives --config editor

# ntp 
echo "NTP=ntp.nict.jp" | sudo tee -a /etc/systemd/timesyncd.conf

# sshd
mkdir ~/.ssh
curl -s https://github.com/ebith.keys | tee -a ~/.ssh/authorized_keys
echo "PasswordAuthentication no" | sudo tee -a /etc/ssh/sshd_config
sudo systemctl reload sshd

# network
echo "
interface enp5s0
static ip_address=192.168.0.111/24
static routers=192.168.0.1
static domain_name_servers=1.1.1.1 1.0.0.1
" | sudo tee -a /etc/dhcpcd.conf

その他

Tailscale

DNSのAレコードをTailscaleで割り振られる100.x.y.zに向けつつTraefikをリバースプロキシとして動かすことで、わかりやすいドメインで自宅サーバーで動いてるアプリ類にアクセスできて良い。
出先からアクセスするため大昔は沢山ポートを開けていたが今は外部に公開したいやつだけCloudflare Tunnel経由で受け入れる運用にしている。

Docker

なんでもDocker Composeで管理しておくと楽でありがたい。
ほぼ全部Bind Mountしてきたのだが設定ファイル類以外はNamed VolumeでDockerに任せておくのが良いというのを今更知った。

Traefik

設定が複雑というか公式のドキュメントがとっ散らかっててわかりにくいが、機能としてはやはり優れているしDocker Composeを活用してるなら便利。
設定の書き方自体はTraefik 3.x Quick Start Exampleを参考にしたりAIに頼った。

Kopia

シングルバイナリだけど他のものにあわせてdocker composeで管理しておく。
バックアップ対象の設定とかスケジュールの管理とか全部これだけに任せておけるところが良い。
ただバックアップのポリシーの設定にだいぶクセがあって特定のファイルだけのバックアップ頻度を下げるみたいなのはできないのが惜しい。

Fastladder

Fastladderが今もメンテされてるの本当にありがたい。
livedoor Reader, Live Dwango Reader, Inoreader, Feedeenと使ってきてその後はCommaFeedをしばらく使っていたがそもそもLDR/Fastladderが求めているフィードリーダーなのでセルフホストすべきはこれであった。
OPMLのインポートに失敗するのでRACK_QUERY_PARSER_PARAMS_LIMITを設定したり、それでもなんか一部しか登録されないので繰り返しインポートしたりする必要があったり、また登録済みフィードの管理の挙動も怪しかったが、
一度DB初期化してインポートするXMLを分割したり死んでるフィードを削除したりして整理したやつをインポートしたら問題なかった。

Grafana, Prometheus(Node exporter, cAdvisor), InfluxDB

この辺もそこそこややこしい、特にInfluxDBがマジでアレなんだが公式とRedditとAIを行ったり来たりすることでなんとかなった。
LibreHardwareMonitorにPrometheusサポートが入ったのありがたい。

Grafana Dashboard

Rybbit

かなり新し目のアクセス解析でセルフホスト向けのガイドも充実してて良い。
Cloudflare Tunnelsで/^/apiを別々に公開しつつ、Zero Trust(Cloudflare One)のAccess ControlでAPIはBypassしてDashboardはAllowで認証かけるってのをやった。
これでCloudflareが提供する防御を経由してからのアクセスだけが/apiに届くしアクセス解析自体もCloudflareの認証を突破してからでないとアクセスできない。

n8n

スクリプト書いたりするのでも良いんだけど書いた後の管理の方が面倒なのでこういうので済ませておきたい。
わかりやすいdocker-compose.yml用意してくれてるのも楽で良い。

昔ほど音楽も聞かなくなったがこの機会にデスクトップのHDDに入ってるのをサーバーに移してどこからでも再生できるようにした。

rep2

プレイ人口の少ないゲームとかの情報はまだ5chが現役というかどこが代わりになるのか知らない。

追記

ノートPC本体のディスプレイ付けっぱなこと忘れてたので対策した

sudoedit /etc/default/grub
  # GRUB_CMDLINE_LINUX_DEFAULT="quiet consoleblank=600"
sudo update-grub

バッテリー充電率の制限

sudoedit /etc/systemd/system/battery-charge-limit.service
  # [Unit]
  # Description=Set Battery Charge Limit to 60%
  # After=multi-user.target

  # [Service]
  # Type=oneshot
  # ExecStart=/bin/sh -c 'echo 50 > /sys/class/power_supply/BAT0/charge_control_start_threshold'
  # ExecStart=/bin/sh -c 'echo 60 > /sys/class/power_supply/BAT0/charge_control_end_threshold'
  # RemainAfterExit=yes

  # [Install]
  # WantedBy=multi-user.target
sudo systemctl daemon-reload
sudo systemctl enable --now battery-charge-limit.service