未読ファビコンの墓場
今すぐブラウザを開いてみてください。もし「後で読む」つもりのチュートリアルが40個以上、判別不能なほど小さなファビコンの列となって並んでいるなら、それは「タブ破産」の状態です。デプロイの最中にBGPルーティングの深掘り記事や複雑なKubernetesマニフェストを見つけても、すぐには読めないためタブを開いたままにしてしまいます。やがて、それらの「不可欠な」ページを維持するためだけにChromeが4GBものメモリを消費し、32GBのRAMを搭載したPCですら悲鳴を上げ始めます。
多くの人は、リンクをSlackやTelegram、あるいは標準のブックマークに放り込むことで解決しようとしますが、大抵はうまくいきません。ようやく読む時間ができた時には、サイトが閉鎖されていたり、コンテンツが月額12ドルのペイウォールの背後に隠されていたり、あるいは自動再生動画が多すぎてコードに集中できなかったりすることがよくあります。必要なのは、壊れやすいURLではなく、コンテンツそのものをコントロールすることです。
「ポインタ」としてのブックマークの問題
標準的なブックマークは、他人のサーバーへの「ポインタ」に過ぎません。Internet Archiveのデータによると、ディープリンクのURL의約25%が10年以内に消失します。ソースが消えてしまえば、ブックマークは行き止まりになります。PocketやInstapaperのようなSaaSツールはページをキャッシュしてくれますが、エンジニアにとっては無視できない3つの大きな問題があります。
第一に、プライバシーとのトレードオフです。これらのプラットフォームはあなたが何を調査しているかを正確に追跡しており、独自のセキュリティ脆弱性を監査している場合などにはリスクとなります。第二に、全文検索のような重要な機能は、通常、年間50ドルのサブスクリプションに制限されています。
すでにHomeLabを運用しているなら、それはお金の無駄です。最後に、商用の「読みやすさ(readability)」パーサーは、しばしばコードブロックを台無しにします。インデントや構文ハイライトを取り除き、きれいなPythonスクリプトを判別不能なプレーンテキストの塊に変えてしまうのです。
セルフホストの選択肢
コミュニティでは、いくつかのオープンソースの選択肢が主流となっています:
- Shiori: Goベースの軽量マネージャー。非常に高速ですが、複雑なReactベースのドキュメントサイトのパースに失敗することがあります。
- Linkding: 高速なタグ付けとリンク管理に最適ですが、ネイティブの「集中モード」リーダー機能がありません。
- Wallabag: 本格的なアーカイブの標準。マルチユーザー対応、堅牢なAPI、KindleやKoboなどの電子書籍リーダーとの完璧な同期を提供します。
プロフェッショナルなワークフローにおいて、Wallabagは論理的な選択です。単にリンクをミラーリングするだけでなく、記事のテキスト、画像、フォーマットをスクレイピングし、自分が永久に所有するローカルの検索可能なデータベースに保存します。
設計図:Dockerによるデプロイ
WallabagをDockerで実行することは、PHPの依存関係やデータベース拡張機能を管理する唯一の賢明な方法です。本番環境で耐えうる構成にするため、壊れやすい単一のコンテナではなく、Docker Composeを使用してスタックをデプロイします。これにはストレージ用のMariaDBとキャッシュ用のRedisが含まれます。このセットアップは、5,000件以上の技術文書をインデックスした後でも軽快に動作します。
1. ファイルシステムの整理
スタック専用のディレクトリを作成します。適切に整理しておくことで、毎週のバックアップ管理が非常に楽になります。
mkdir -p ~/homelab/wallabag && cd ~/homelab/wallabag
mkdir -p images db_data redis_data
2. Docker Composeスタック
公式のWallabagイメージを使用します。私はこの構成で長年MariaDBを使用していますが、堅牢であり、バックアップのためのダンプも30秒以内に完了します。your-ip-or-domainを実際のサーバーのアドレスに置き換えてください。
version: '3.8'
services:
wallabag:
image: wallabag/wallabag
container_name: wallabag
environment:
- MYSQL_ROOT_PASSWORD=vault_secure_password
- SYMFONY__ENV__DATABASE_DRIVER=pdo_mysql
- SYMFONY__ENV__DATABASE_HOST=db
- SYMFONY__ENV__DATABASE_PORT=3306
- SYMFONY__ENV__DATABASE_NAME=wallabag
- SYMFONY__ENV__DATABASE_USER=wallabag
- SYMFONY__ENV__DATABASE_PASSWORD=wallabag_pass
- SYMFONY__ENV__DOMAIN_NAME=http://192.168.1.50:8080
- SYMFONY__ENV__REDIS_HOST=redis
- SYMFONY__ENV__FOSUSER_REGISTRATION=false
ports:
- "8080:80"
volumes:
- ./images:/var/www/wallabag/web/assets/images
depends_on:
- db
- redis
db:
image: mariadb
container_name: wallabag_db
environment:
- MYSQL_ROOT_PASSWORD=vault_secure_password
- MYSQL_DATABASE=wallabag
- MYSQL_USER=wallabag
- MYSQL_PASSWORD=wallabag_pass
volumes:
- ./db_data:/var/lib/mysql
redis:
image: redis:alpine
container_name: wallabag_redis
volumes:
- ./redis_data:/data
3. 起動
デタッチドモードでスタックを起動します。初回起動時には、Wallabagがデータベーススキーマの移行と内部フォルダのセットアップを行うため、約60秒待ってください。
docker-compose up -d
初期化ログを確認して、すべてが正しく接続されているか確かめます:
docker logs -f wallabag
ログが落ち着いたら、ブラウザで http://your-server-ip:8080 にアクセスします。デフォルトの認証情報 wallabag / wallabag を使用し、ログイン後はすぐにプロフィール設定から変更してください。
ワークフローの改善
空のデータベースは役に立ちません。Pocketを完全に置き換えるには、コンテンツ保存の手間を減らす必要があります。
ブラウザとの連携
ChromeまたはFirefox用のWallabag拡張機能をインストールしましょう。これにより、ワンクリックで記事を保存できるようになります。拡張機能の設定で、セルフホストしたURLを連携させ、Wallabag UIの「開発者」セクションからAPIトークンを生成します。商用の代替ツールと全く同じように動作しながら、データはローカルに保持されます。
モバイルとオフライン同期
AndroidおよびiOSアプリも非常に優れています。全文と画像をダウンロードしてオフラインで読むことができ、飛行機内や5Gが不安定な通勤中などに重宝します。バックエンドを自分でホストしているため、同期速度は自宅のアップロード速度にのみ依存します。
E-Inkデバイスでの読書
長いアーキテクチャのホワイトペーパーを27インチのモニターで読むのは苦痛です。Wallabagは未読リスト用のカスタムRSSフィードを生成します。「P2K」(Push to Kindle)などのツールを使えば、保存した記事を毎朝自動的に電子書籍リーダーに送信できます。これにより、難解な技術調査が、目に優しい本のような快適な体験に変わります。
長期的なメンテナンス
Wallabagの運用は低負荷です。コンテナ化されているため、アップデートは docker-compose pull と docker-compose up -d の2つのコマンドで完了します。週に一度、./db_data フォルダをNASやクラウドストレージにrsyncする簡単なcronジョブを設定しておきましょう。これで、これまでに見つけたあらゆる技術的発見を収めた、永続的で検索可能なライブラリが手に入ります。リンク切れも、広告もありません。あなたの知識を、あなたの管理下に。

