別記事では、GoogleとIEEEの契約変更により、まともにGoogleApps@IEEEが利用できなくなったことと、その暫定回避策を模索しました。
その後どうすべきかという検討を進め、やれるものはセルフホストしてなんとかしようと決めて、そのまま1ヶ月ほど運用を続けています。最後に言及しますが、結局前回から変わったのはGMail代替のセルフホスト、というオチはついています。ですが、これまでのいろいろな経緯を踏まえ、自身で制御できるものは自身で制御するという観点から、Google Workspace代替にとどまらない、広い範囲での検討結果として、今の私のセルフホストサービスの運用状況をログっておきます。
というわけで、現在、個人的・仲間内、あるいは公開サーバとしてセルフホストしているサービスのまとめを記述していきます。
はじめに
GAFAMにデータを預けることの個人のプライバシの問題やインターネットの中央集権化の議論が取り沙汰されて久しいです。計算機科学やネットワークは、自然科学に基づく工学ではなく、人間の「思想」に基づく工学という側面が強いと個人的に考えています。そういった思想や、その時代の潮流により、ネットワークやインターネットサービスの中央集権・分散などの議論が巻き起こってきました。今現在では、特にエドワードスノーデンの暴露事件以降でしょうか、分散という思想への揺り戻しが起きていると思います。
クラウドサービス、特にGoogle Workspace、Apple iCloud、MS Outlookなどに代表される中央集権的なサービスは、非常に便利であると同時に、
- サービスの突然の変更、値上げ
- 巨大企業にデータを吸われるプライバシの懸念
- など
を孕んでいます。そういった中央集権サービスに対して、ある程度自分のデータは自分の手元へ、という思想が巻き起こることは自然かなと思います。特に、個人のプライバシを尊重する思想が強い1ヨーロッパを中心に、例えば「DeGooglify (非Google化)」などというムーブメントが起きており、巨大企業のサービスではない、
- 自分のデータは自分の手元に置く; あるいは
- End-to-End暗号化などにより、自分と適切な受信者以外にはデータは渡さない
その極北というのが、セルフホスト、いわゆる自前サーバ・自宅サーバで自分専用のサービスを立ち上げること、でしょう。私のようなインターネット老人というか、古(いにしえ)のインターネットユーザは、1x〜2x年前は自宅で*NIX系OSのサーバを運用することが当たり前だった時代があるのですが、現在では少数派でしょう。また、脆弱性対策やハードウェア故障などへの対応は、全てが自己責任になることは言うまでもありません。
しかし、セルフホストは自分で自分のデータを管理できる上に、回線以外は大体自分で解決することができるという、理不尽なサービス変更やプライバシの問題に対して大きな強みを持ちます。
今回は、前回書いた「脱Google Workspace」に関して、現時点での検討、および2022年9月現在にセルフホストしているサービス一覧を記載しようと思います。
ぶっちゃけ以下の記事が面白かったから真似します。
構成
まずは構成を記載します。セルフホスト、と言いながらも自宅にはサーバを用意せず、いくつかのVPSを裏側でプライベートNWで繋いで利用しています。自宅サーバをするにも、日々値上がりする電気代が…、と言うわけで、今現在は基本的にはVPSで完結させています。
下図に構成の概略を記します。
基本的にはほぼ全てのサービスをdockerコンテナ化して動かしています。これにより、多少構成を変えやすくしています。K8s使うほど大規模なものではないので、docker-composeで管理しています。
構成上、セルフホストサービス群のサービスは、3種類に分類しています。
- 外部向けWebサービス
- 内部限定サービス
- 上記2つのあいのこ (メール)
外部向けWebサービス
外部からのHTTP/HTTPSリクエスト (TCP 80/443, UDP 443) は、マルチドメイン対応のHTTPSリバースプロキシで捌き、バックエンドのWebサービスのコンテナへルーティングしています。
このHTTPSリバースプロキシは、TLSに加えてHTTP/3・マルチドメイン名・SNI Sanitization等に対応するようrustで自作しています。素直な実装なのですが、かなり高速・軽量に動作します。
GitHub junkurihara/rust-rpxy: A simple and ultrafast http reverse proxy serving multiple domain names and terminating TLS over http/1.1, 2 and 3, written in Rust
TLSに必要な証明書については、legoをcronで定期実行してLet's Encryptからドメイン証明書を取得しています。
lego: Let’s Encrypt client and ACME library written in Go.
内部限定サービス
外部ネットワークからの接続要求が、自分自身か限られたメンバからのアクセスのみに限定できるようなサービスは、全てVPN経由でのみアクセス可能としています。そして、VPN接続は基本Split Tunneling、つまりVPNの内部アドレスへのアクセス以外はクライアントのデフォルトルートを通るよう、プロファイルを設定しています。
VPNに接続すると、VPN内部の自作のDNSリゾルバ (DNSの暗号化プロキシ) が規定のDNSリゾルバとして設定されるようにしています。このVPN内部のリゾルバによって、VPN内部の各サービスの名前解決も行っています。
GitHub junkurihara/doh-auth-proxy: Local DNS proxy for DNS over HTTPS (DoH), Oblivious DoH (ODoH) and Multiple-relay-based ODoH extension (Mutualized ODoH; MODoH), which additionally supports domain-based filtering and proxy/resolver authentication
また、外部向けWebサービスと同様に、VPN内部にリバースプロキシを設置し、VPN内部であってもHTTPSに対応しています。それを経由して内部利用のWebサービスにHTTPリクエストをルーティングしています。
あいのこ (メール)
メールについては、外部ネットワークからのアクセスを受け付けるSMTPは外部公開するが、POP/IMAPはVPN内部に隔離する、というキメラ状態にしています。
ホストしているサービス一覧 2022年9月現在
上で記載した構成図を、より詳細に記載したものが以下になります。個人で趣味でやるにしてはなかなかの規模になってきていますね。
以下では、上記構成でセルフホストしているサービスについて紹介していきます。
外部向けWebサービス (VPNを介さずアクセス)
VPN (Wireguard, OpenVPN)
隔離している内部限定サービスへアクセスするための、Split-tunnelingを行うVPNサーバです。基本はWireguardで充分なのですが、WireguardはUDPベースでの通信しかできないため、outbound UDPがフィルタリングされるような環境では使うことができません。7 そういった環境に対応するために、OpenVPNも用意しています。
- GitHub linuxserver/docker-wireguard
- GitHub kylemanna/docker-openvpn: 🔒 OpenVPN server in a Docker container complete with an EasyRSA PKI CA
上記のdockerイメージを自分向けにカスタマイズして利用しています。クライアントについては、Wireguardは純正クライアントを利用し、OpenVPNでは純正より使いやすいpritunlクライアントを利用しています。OpenVPNサーバもpritunlを使うのも良い選択肢だと思います。
TCPベースのVPNとして、DSVPN (dead simple VPN) も選択肢として挙げられます。とても設定が煩雑なOpenVPNと比べて、非常にシンプルで使いやすいです。ただし、iOS端末等からは利用できないことに注意です。
GitHub jedisct1/dsvpn: A Dead Simple VPN.
分散SNS (Mastodon, Misskey)
おひとり様、と行かないまでも小人数の公開インスタンスを立てています。仲間内でワイワイするためだったり、単に興味本位だったりです。Mastodonについては、Mastodonが盛り上がった2017年に立ち上げて、VPSを転々としながらホストを続けています。Misskeyは2年ほど前に興味本位で立ち上げて、Mastodonと併存させて遊んでいます。
-
Mastodon:
GitHub mastodon/mastodon: Your self-hosted, globally interconnected microblogging community
2017年に日本国内で一気に流行りました。分散SNSで一番有名だと思います。Ruby製。ActivityPubをしゃべるので、Mastodonだけではなく、MisskeyやPreloma等のサーバ(インスタンス)と連合することができます。だいぶ枯れてきているようです。 -
Misskey:
GitHub misskey-dev/misskey: 🌎 An interplanetary microblogging platform 🚀
日本人の方が開発を主導されている分散SNS。ActivityPubをしゃべるのでMastodonとも連合できます。構築・運用については、Misskeyの方がコンテナ数も少なく、簡単だと思います。開発も活発なので、最新版を追従していて楽しいです。Node.js製ですが、動作も軽快です。
Jitsi-Meet
Java製のWebミーティングサービスです。ZoomやGoogle Meetの代替です。ユーザ登録せずとも使えるのも便利です。オンライン飲み会に使うのがメインですが、ちょっとした会議でもたまに使います。
GitHub jitsi/docker-jitsi-meet
オフィシャルでdockerイメージが配布されているので簡単にセットアップできます。
Mailu (SMTPのみ)
今回、Mailuにて外部公開しているのは、SMTP (postfix) の外部からの接続用ポートだけです。VPN内部でホストしているもの、の説明と合わせて後述します。
内部限定サービス (VPNを経由してアクセス)
doh-auth-proxy
DNSパケットを暗号化、匿名化するための自作のDNSプロキシです。VPNに接続すると、デフォルトのDNSサーバとしてdoh-auth-proxy
のdockerコンテナのアドレスが設定されるようにしています。
doh-auth-proxy
は、DNS暗号化・匿名化の他、特定ドメイン名へのアクセスをブロックしたり、特定ドメインへのリクエストをオーバーライドして任意のアドレスへ誘導したりすることができます。このオーバーライド機能を利用して、VPN内部にホストしているサービスたちのコンテナの名前解決を行なっています。
- GitHub: junkurihara/doh-auth-proxy: Local DNS proxy for DNS over HTTPS (DoH), Oblivious DoH (ODoH) and Multiple-relay-based ODoH extension (Mutualized ODoH; MODoH), which additionally supports domain-based filtering and proxy/resolver authentication
- DockerHub: jqtype/doh-auth-proxy: DoH and Oblivious DoH local proxy supporting authenticated connection, written in Rust
- Projectページ: μODNS project
dnscrypt-proxyを使っても同じようにドメインのオーバーライドはできるのですが、せっかくより高度な匿名化手法 (μODNS) に対応した自作のものがあるので、これを利用しています。一番目に見える恩恵は、特定ドメインのフィルタリング (広告ブロック) かもしれません。これがあるだけで快適です。8
Miniflux
Golang (+PostgreSQL) 製のFeedアグリゲータです。Feedly、あるいは古のLivedoor ReaderやGoogle Readerの代替です。「ミニマリスト向け」「シンプル特化」と銘打っている通り、Webインターフェースは非常に簡素ですが、その分かなりサクサクと動作します。Pocketや後述のWallabagとも連携できます。
- Official Miniflux
- GitHub miniflux/v2: Minimalist and opinionated feed reader
国内では、FreshRSSやTinyTinyRSSの方が圧倒的にユーザが多そうです。しかし、実際に立ち上げて比較した結果、動作の軽快さとReadKitと連携できることから、Minifluxを選択しました。Webインターフェースは簡素ですが、ReadKitを使えばmacOSでもiOS端末でも快適です。
Wallabag
PHP製の「後で読む」サービスです。Pocketやブラウザのリーディングリストの代替です。PDFやePub形式でエクスポート可能なところが気に入っています。動作はちょっと重い気がしますが、iOSの「共有」や、ブラウザ拡張機能から、簡単にサイトを登録できるのでこれを愛用しています。Miniflux同様、Readkitと連携できます。
- Official https://wallabag.org/en
- GitHub wallabag/wallabag: wallabag is a self hostable application for saving web pages: Save and classify articles. Read them later. Freely.
他にも、Golang製のshiori (栞) も立ち上げて利用していますが、iOS連携・ブラウザ連携のためにWallabagをメインで使っています。動作の軽快さは、shioriの方が優れています。
GitHub go-shiori/shiori: Simple bookmark manager built with Go
Mailu (POP、IMAP、Webインターフェース)
Dockerでのホスティングを前提とした、メールサーバを構築するための全部入りソリューションです。postfix、dovecot、clamav、rspamd、rainloop等、必要なサービスが全てdockerで構築できるようになっています。docker導入済みの環境で動かすだけであれば、30分程度で構築可能。もちろん、独自ドメインを持っている前提です。
- Official Mailu
- GitHub Mailu/Mailu: Insular email distribution - mail server as Docker images
postfixのSMTP関連ポートだけ外部から接続できるようにし、他のPOP, IMAP, Webインターフェース等のポートはVPNからのみ接続可能としています。
マルチドメインやメール転送、メールエイリアスにも対応し、SPF、DKIM、DMARC等の設定値もいいように設定してくれます。メールサーバの運用は正直嫌だったのですが、Mailuのオールインワンソリューションであれば、なんとか運用が続けられそうです。
同じようなdockerベースのソリューションはいくつもあり、mailcowやdocker-mailserverなどが有名です。ただ、Mailuも含めてそこそこのマシンパワー・メモリ量を要求してきます。アンチウイルス(clamav)を動かす場合には、最低でもCPU 2 Core, RAM 2GB以上でないと重そうです。
- GitHub mailcow/mailcow-dockerized: mailcow: dockerized - 🐮 + 🐋 = 💕 - we stand with 🇺🇦
- GitHub docker-mailserver/docker-mailserver: Production-ready fullstack but simple mail server (SMTP, IMAP, LDAP, Antispam, Antivirus, etc.) running inside a container.
Vaultwarden (旧名: bitwarden_rs)
Rust製のBitwardenクローンで、パスワードマネージャサービスです。本家bitwardenのサーバもセルフホスト可能なのですが、.NET製だったりでサーバの要求が厳しいです。そのため、セルフホスト界隈(?)ではRust製クローンのVaultwardenを使うことが多いようです。
ソースを読み下して、Vaultwardenのログインパスワードのハッシュ化に、PBKDF2を利用していることが気になりました。PBKDF2でも実用上は特に問題はないのですが、Argon2というより新しく強固なアルゴリズムを利用する方が面白いので、改造しました。もちろんオリジナルは追従しつつ、それをdocker化しています。使い方は、オリジナルVaultwarden、私のフォークともども、Bitwarden本家と一緒です。
- Official: GitHub dani-garcia/vaultwarden: Unofficial Bitwarden compatible server written in Rust, formerly known as bitwarden_rs
- Argon2利用のフォーク: GitHub junkurihara/vaultwarden
- Argon2利用のdockerイメージ: DockerHub jqtype/vaultwarden-argon2
code-server
VSCodeをブラウザで利用するためのサービスです。もちろんVSCode同様にTypeScript (Node.js) 製。長期出張中にノートPCが壊れたときのため、iPad等からでもコーディングできるように立ち上げています。ただし私の使い方では、PCが壊れない限りはイマイチ出番がなく、オフィシャルのVisual Studio Code Serverも登場したので、将来的には使うことは無くなりそうです。
GitHub coder/code-server
Wordpress
言わずと知れたPHP (+MySQL) 製のブログエンジンです。日記というわけではないのですが、旅先から写真をログって後で見返すのが好きで、10年以上個人的フォトログとして利用しています。自分しか見ないのでVPNの中に入れてしまいました。
Docker Official: クィックスタート: Compose と WordPress
オフィシャルサイトにも載るくらい、Dockerでのデプロイは簡単です。
番外編: その他もはや個人的・仲間内とは言えないもの
DNS暗号化・匿名化サービス (DNSCrypt, DoH, μODNS)
前述したdoh-auth-proxy
やdnscrypt-proxyで暗号化されたDNSリクエストを受け取るサーバです。Golang製、あるいはRust製です。暗号化されたDNSクエリ・レスポンスを
- リレーして他のサーバへ転送し、匿名化
- 復号して同時にホストされるUnboundで名前解決
する仕事をします。DNSCrypt、DNS over HTTPS (DoH)、Oblivious DNS over HTTPS (ODoH)、Mutualized Oblivious DNS (μODNS, DNSCryptベース & ODoHベース)をサポートするサービスを運営・公開しています。ODoH、およびμODNSについては自前実装したサーバを利用しています。詳細は以下のサイトをご覧ください。
- DNSCrypt Official: DNSCrypt
- DNSCrypt GitHub: DNSCrypt/dnscrypt-resolvers
- ODoH RFC9230: Oblivious DNS over HTTPS
- μODNS: Projectページ
日本国内で利用できるDNSCryptサーバはそれほど多くなく、それゆえに相当数のクエリを捌いているようです。そのため、もはや個人的とか仲間内向けとか言えない状況です。VPSを複数分離して、サーバを管理運営しています。
DNS暗号化・匿名化サーバの監視 (Prometheus, Grafana)
前述のDNS関係のサーバのメトリクスを収集するのに、Prometheusを使っています。Prometheusで収集したMetricsを、VPN内のGrafanaで集約・可視化しています。
Grafanaは他にもStravaのトレーニングログなども可視化できるため、重宝しています。
- Grafana Official: GrafanaLabs
- Prometheus Official: Prometheus
参考になったサイト
GitHub: awesome-selfhosted/awesome-selfhosted, awesome-foss/awesome-sysadmin
セルフホストやシステム管理のためのソフトウェアの巨大なリストです。ほぼ全てがFLOSS (Free/Libre and Open Source Software)になっています。ここからプロジェクトを探していくと捗ります。
Reddit: r/selfhosted
Redditのセルフホストsubredditです。「最近何ホストしてる? (List what you have self hosted or plannning to) 」 とかが参考になります。メールサーバはMailuを使うかMailcowにするか、などに迷った時もここを検索するといろいろな意見が見られます。
- Reddit r/selfhosted
おわりに
Google Workspaceと一般Googleサービスの代替として、現在利用しているものが何かという結果を最後に記載します。
- Google Workspace:
- GMail → さくらのメールボックス → Mailuのセルフホスト
- Google Calendar → Apple iCloud Calendar (→ Baikalのセルフホスト予定)
- Google Drive → ローカルのNAS/Dropbox/Apple iCloud Drive (NextCloud使うべき)
- 一般Googleサービス:
- Google Public DNS → Cloudflare 1.1.1.1 → DNSCrypt/DoH/μODNSの自力実装・Unboundと共にセルフホスト
- Google Chrome Password Manager → KeepassXC/Vaultwardenのセルフホスト
- Google Meet → Jitsi-Meetのセルフホスト
- Google Play Music → ローカルのNASからストリーミング/Spotify
- Google Podcasts → PocketCasts/Spotify
- Google Photos → ローカルNASへのバックアップ/Dropbox/pCloud
- Google Search → Brave Search/DuckDuckGo
- Google Reminder → Apple iCloud Reminder (→ ???)
- Google Keep → Apple iCloud Notes (→ ???)
- Google Analytics → 解析自体やめた (Matomo使うべき)
- Google Maps → Apple Maps/OpenStreetMaps/OsmAnd
- Google Docs → 使うの自体やめた (必要に応じて対応予定)
- Google Form → 使うの自体やめた (必要に応じて類似ソフトを都度セルフホスト可能)
結局、純粋にGoogle Workspace代替としてセルフホストしているのは、現状ではメールのみとなっています。CalendarやDriveなどについては、NextCloudをホストすれば色々解決します。ただ、VPSのストレージサイズの問題から、現在は見送っています。高機能なNASを導入したらば、自宅でホストする方が良さそうですね。また、細々とAppleに依存するのはいいのかという話もありますので、その辺りも徐々に移行するつもりです。DNSについては、すでに代替とは言えないですね。
去年から今年にかけては、本当にGoogleのサービス変更に振り回されています。ここしばらくの検討を経て思うことは、やはり「依存しきっているようなサービスやアクセスできなくなると致命的なデータは、突然のサービス変更やBANに耐えうるよう、なるべく自分の制御下に置いておきたい」ということですね。自分の生殺与奪権は自分で握っておきたいものです。