25
Help us understand the problem. What are the problem?

posted at

updated at

クラウドから撤退して自前サーバに自分でwebアプリを建てるおはなし

はじめに

クラウド全盛の昨今ですが、あえてクラウド化に逆らうセルフホスティングの話をします。クラウドに任せるのではなく、自分のサーバの中に自分で使うwebサービスを建てる、そういうおはなしです。

Self-hosting (web services) - Wikipedia

今回はそんなself-hostingにおすすめのwebアプリケーションをドドーンと紹介します。

計算機の歴史は常に振り子でした。
集中処理と分散処理、逐次処理と並列処理、同期処理と非同期処理、RISCとCISC...
これらは決して排他的に対立するということもないのですが、どちらが主流かというのは時代のトレンドとともに振り子のように揺れ動いてきました。
「クラウドとオンプレ」「所有と非所有」というのもまたその一つですね。

利点と欠点

まず利点はなんといっても、自分のデータを自分の手元においておけることです。
データが手元にあり通信経路が暗号化されていれば、クラウド事業者が技術的問題・契約的・法的問題でデータを消したり見ることはありません。
すべてのデータは手元にあり、(適切に設定して運用していてソフトウェアに悪意ある穴がなければ)他人が見ることも消すこともありません。

また、事業者の気ままな変更に付き合う必要がないということも挙げられます。
たとえばEvernoteは度々、大幅なサービスの変更を行っいています。
これに追従できていればいいのですが、「余計な改定しやがっておかげで使えないぜ!」と憤慨しているユーザもたくさんいます。
Self-hostingであれば、ある時点で動くコードを永遠に死守することができます。とくにコンテナ環境であれば古いライブラリを封入しておくことも簡単です(脆弱性対策は自分でする必要はあります)。
「〇〇が使えないサービスになったから次は△△に引っ越し」などといっても、△△が第2の〇〇にならない保証はどこにもありません。
EvernoteからNotionに引っ越したところで、Notionが未来永劫安住の地となることはなく、サービス終了や値上げの心配は相変わらず残ります。
これを自前化することにより、Evernote朝からNotion朝への王朝交代ではなく、情報の主権を自らに取り戻すことができます。

独自の拡張や変更、サービス間の連携を自分で組めるといった点も利点です。
外部の事業者のサービスの場合は彼らが公開しているAPIしか使えないわけですが、自前で動かしているのであれば「APIでは届かないところを背後のsqlを直接操作して解決」「ファイルを直接書き換える」「rate limitを気にせず大量操作」といった力技も可能になります。

欠点はその適切に設定して運用し、脆弱性対策を自分でして、かつ穴がないことを確認する責任は常に自分にあるということです。
「ふくいナビ」事件を笑っていることはできません。そのような事件が起きたら自分で自分のデータのバックアップを探してきて自分で復旧しないといけないのです。
自由と自立にはそれなりの責任と手間、時には苦労が伴います...
フリーソフトにはないプロプラ製品の魅力とは、その責任や手間をお金で買うことができる、ということですね。

もちろん、サーバを買うお金、RAIDを組んでそのHDDのお世話をするお金、家庭用UPSをつけてピーピー鳴き始めたら電池を交換するお金、電気代といったものもかかります。

構成

  1. httpsを解釈するreverse proxy (VPS内)
  2. httpで動くアプリケーション (自宅サーバdocker内)

基本的には上記の構成です。
httpsを終端する場所でクライアント証明書を要求・検証することで、他人のアクセスを排除することも簡単にできます。

普通に作るとnginxやapacheを使うわけですが、それらを使わずに以下の右側のような経路にすることも可能です。

FFFE2488-9664-4F33-AAB3-815C9346576D.jpeg

  1. sslhでSNIを解釈して、SNIのホスト名で割り振る先のポートを変更する。sshやOpenVPNの場合も別のポートに流す。SNIでの振り分けはコマンドラインではできないが、configファイルを使うことで可能。
  2. stunnelでsslを終端して、サーバ側証明書処理やクライアント証明書の処理をおこなって平文のTCPを出す。
  3. httpで動くアプリケーション(docker内)に(VPN経由で)繋げる。

sslhというのはこういうものです。

SSLHでHTTPS, SSH, OpenVPNを443番ポートに共存させる - Qiita
1つのアドレス・ポートを SSH (over SSL) と HTTPS で使う - Qiita

httpsのみの利用であれば、stunnel(の比較的新しいバージョン)のみでSNI毎に接続先を変更させることもできます。

右側の構成の場合、sslh, stunnelはバーチャルサーキットを暗号化するレイヤ(TCPより上でHTTPより下、OSI参照モデルでL6あたり)のみ扱うので、websocketだろうが未知のHTTP変種・拡張だろうが関与せず何でも通るという利点があります(HTTP/3のUDPは除く)。
欠点はキャッシュもなく、ログ類も乏しく、セキュリティ上の応答ヘッダー追加、本当の接続元のIPアドレスを要求に追加するといった加工も不可能ということでしょうか。

さらに以下のようなものをつかうと、別のL4〜L6あたりのレイヤにそのまま対応することもできますね(ESNIはECHに変わるみたいですが...HTTP/3ってSCTPの夢を達成できるのでしょうかね)。

devopsext/esni-rev-proxy: Golang reverse proxy with ESNI support on top of TLS 1.3
WebサーバーのHTTP/3対応をNginxのリバースプロキシでするためのDockerイメージが出来ました - Qiita
QUIC及びHTTP/3対応のNGINXサーバーを構築 - Qiita

これらのうち、露出する頭だけVPSにおいておき、背後のアプリケーションは自宅においてVPNでつなげるというのが上の図の構成です。
これならVPSにかかるお金は最小限ですみますし、自宅サーバなのでバックアップなども簡単です。

なお、クライアント証明書を使う場合はその証明書がはいった端末が必要です。
ところが、iOS Safariではwebsocketには証明書をつけてくれませんし、アプリによってはクライアント証明書をつけてくれませんので、クライアント証明書以外の方法でも守ってあげる必要があります。

今回は443/tcpに山のように同居している連中を「ほどく」作業をVPSにやらせていますが、以下のように443をそのまま自宅まで引き回すという解決策もあります。

VPSをゲートウェイにして自宅サーバーで443番ポートを公開しhttpsを利用する - Qiita

このほうが構成はシンプルになります。
欠点としては、VPSは生きているのに自宅サーバ(あるはVPN)が落ちたときに503や502のエラーすら出てこなくなり、「すみません現在復旧作業中です」という案内をすぐ掲示することが困難ということが挙げられます。
私の場合、NextCloudで他人とファイルをシェアしているので案内が出せないのは困るためこの構成はとりませんでした。

自宅内からのアクセスのために自宅内にもhttpdを建てておくと、自宅内からのアクセス時に自宅-VPS-自宅の往復が発生することもなくなります。
自宅内のDNSサーバにはちゃんと自宅内のIPアドレスを返答するようにしてもらいます。

それにしても、443って今や2.4GHzみたいに便利なゴミ捨て場状態...

え、「VPSもクラウドだろ、撤退できてないじゃないか」ですって? 確かに💦

デスクトップ用アプリもほしい!

頑張ってElectronを書かなくても、以下のようなものを使えばこれらwebサービスはだいたいデスクトップアプリになります(オンラインでしか使えませんが)。

GitHub - jiahaog/nativefier: Make any web page a desktop application
Unite for macOS
Fluid – Turn any webpage into a real Mac App
lotato - lost in a sea of browser tabs?

使えるソフト

ということで...
以下、GPLなのかBSDなのか等は別として、すべてオープンソースです。
基本的には「有償・プロプラから撤退」という話の記事なので、redmineとかmediawikiとかは掲載していません。

特にここでリンクしていませんが、すべてDockerfileがgithubにあります。
OpenStackを自分で建ててAWSを代替するほど大変ではありませんのでご安心を!

NextCloud

代替対象: Dropbox, Google Drive, One Drive

Nextcloud

nextcloud.png

ファイルをどんどんおいて、共有したり共有しなかったり、プラグインで遊んだりと様々なことができます。
おそらく「self-hosting」といったときに一番有名なソフトでしょう。

PHPで動いているせいかちょっと重いこともあるのですが、安定稼働するとかなり便利です。

OnlyOfficeを追加すると、Google DocumentsやOffice 365の代わりにもなります。
どこまで使えるかどうかは人によるとはおもいますが、たいして複雑なオフィス文書の機能を使っていな私にとってはこれで十分です。

nextcloud - Qiita

PhotoPrism

代替対象: Google Photos, iCloud Photos, Amazon Photos

Browse Your Life in Pictures – PhotoPrism

photoprism.jpg

画像の山をtensorflowで食べて写っているものを認識して視覚化してくれます。

DAVも話せるので、DAVに写真をバックアップするようなアプリをスマホにいれれば同期してくれます。
そうではなくても、NextCloudの中身を直接(DAV経由などではなく)ファイルシステムからReadOnlyで読ませればスライドショー用UIになります。

似たものにPhotonixというのがありますが、まだあまりこなれていないのかPythonの例外がそのまま画面に出たりしました。

Photonix Photo Manager

gitbucket

代替対象: github

GitHub - gitbucket/gitbucket: A Git platform powered by Scala with easy installation, high extensibility & GitHub API compatibility

git.png

恥ずかしいコードも秘密のコードもgithubに置かなくてOK!
年収を診断することは出来ませんが流出の心配も減るでしょう、不正ログインされなければ。

GitBucketをdockerで構築 - Qiita

wallabag

代替対象: Pocket

GitHub - wallabag/wallabag: wallabag is a self hostable application for saving web pages: Save and classify articles. Read them later. Freely.

wallabag.png

以下に細かいお話があるのでどうぞ。

「後で読む」サービスのwallabagを自分で建てよう - Qiita

freshrss

代替対象: Feedly

FreshRSS, a free, self-hostable aggregator…

rss.png

RSSリーダです。

ちなみにうちでは、ファームウェア更新告知や声優さん等のwebのhtmlをとってきて、xpathや正規表現でゴミを捨ててからgitbucketにdiffを蓄積し、差分とスクショをfreshrssに出す自前プログラムを動かしています。
「はてなアンテナ」の代替ですね。
転売屋はこういうのを真剣にやって、在庫復活を捉えているんでしょうね...

ArchiveBox

代替対象: archive.org, 魚拓サービス, Evernote WebClipper

GitHub - ArchiveBox/ArchiveBox: 🗃 Open source self-hosted web archiving. Takes URLs/browser history/bookmarks/Pocket/Pinboard/etc., saves HTML, JS, PDFs, media, and more...

archivebox.png

自分でwebアーカイブを作るというものです。
上記のWallabagは登録したものをRSSで出力できますので、以下のような方法で連携することもできます。

ArchiveBox + Pocket + Fessで作る、いつでもどこでもマイ魚拓(全文検索付き) - Qiita

残念ながらArchiveBoxの出力としてRSSやgitを使うことはできないようです。
APIがありますので色々できます。

Leanote

代替対象: Evernote, Notion, Google Note

Leanote - open source alternative to Evernote · GitHub

leanote.png

日本ではあまり知られていないソフトですが、中国の人が開発しているようです。
Evernoteの代わりになります。
デスクトップアプリやiOSアプリもあります。
かなりよく出来ていて、お陰様で最近の私はEvernoteへの依存度がかなりヘリました。

markdownも使えますし、ビジュアルなエディッタも使えます。
デスクトップアプリからはenmlのインポートができます。
REST APIもあります。

標準ですといわゆる中華フォントなのですが、ソースのある場所で、

grep -l Hiragino -r . | xargs perl -i.bak -pe 's/Hiragino Sans GB/Hiragino Sans/g;'

という呪文を唱えるとあら不思議、日本語フォントになります(一部追加修正が必要)。
githubも中国語が多いですが、日本語話者でもだいたい何書いてあるかくらいはわかるし英語での質問には英語で答えてくれているのでそんなに困りません。
排外主義者・国粋主義者・右翼にはおすすめできないかもしれませんが、普通の人には普通におすすめできるソフトですね。

emacs用modeもあります。
aborn/leanote-emacs: A minor mode writing markdown note using leanote platform in emacs.

Vikunja

代替対象: todoist, wondrlist

Vikunja

vikunja.png

todoを管理するツールです。

そのままですと日本語変換を確定した瞬間に追加されてしまいますが、keyup.enterkeydown.enterに置換すれば治ります。

keydownとkeyupの違いに気をつけて!IME入力時に順番が違う! - Qiita

Wekan

代替対象: Trello

Wekan — Open-Source kanban

wekan.png

カンバン型タスク管理ツールです。
左にある「未着手」を右にある「進行中」にすすめていくあれです。
Trelloのおもらし事件のようにならないよう、「公開」には気をつけましょう。
他のvirtual hostも同じですが、やはり特に理由がない限りはクライアント証明書は必須にしておくのが安心ですね。

WekanをDockerで立てる! - Qiita

似たようなツールは他にもたくさんありますので、探してみるのも良さそうです。

11 Best Open Source Project Management Software [Self-hosted]

HedgeDoc

代替対象: HackMD

md.jpeg

HackMDのオープン版であるCodiMDが名前が変わってHedgeDocになりました。
qiitaの下書きにも使えますし、プレゼンテーションを作ったり共有したりもできます。

HackMD - Qiita

BulletNotes

代替対象: workflowy

BulletNotes.io

箇条書きするノートです。

Screenshot_2021-02-14 BulletNotes io.png

他にもvim風のものでvimflowyというのがあります。

GitHub - WuTheFWasThat/vimflowy: An open source productivity tool drawing inspiration from workflowy and vim
Vimflowy

日本語は環境によってはちょっと挙動が怪しいことがあります。
githubにパッチがあるので当てましょう。

開発が止まっていますが、Hackflowyというものもあります。
こちらはwebsocketを大量に生成する、日本語のキーイベント(229)が遅い等の問題が多くて実用できませんでした💧

GitHub - abhshkdz/HackFlowy: Workflowy clone, built using Backbone.js & Socket.io

agendav

代替対象: Googleカレンダー

GitHub - agendav/agendav: A CalDAV web client similar to Google Calendar

agendav.png

caldavのwebインターフェイスです。
なので背後にcaldavサーバを置くと、なんとgoogleカレンダーのようなものができます。
caldavサーバにはbaikalが使えます。

Baïkal - baikal

rainloop

代替対象: gmail, Yahoo mail

GitHub - RainLoop/rainloop-webmail: Simple, modern & fast web-based email client

rainloop.png

imapのwebインターフェイスです。
なので背後にimapサーバをおくと、なんと(以下略

RainLoop - Qiita

メール関連で必要なものを全部一つにまとめたコンテナとしてMailuというのがあります。
私はfetchmail, procmail, spamassassin, postfix, dovecot, DNS等の連携を自分で作ってしまったので利用したことはないのですが、昨今のメールのセキュア化(domainkey, SPF, MTA-STS, DANEなど)は結構大変なのでこういうのがあるのは良いですね。

Mailu/Mailu: Insular email distribution - mail server as Docker images

overleaf

代替対象: overleaf, sharelatex

GitHub - overleaf/overleaf: A web-based collaborative LaTeX editor

overleaf.png

これがあれば/usr/local/share/texmf/の巨漢にSSDを圧迫されて泣くことはもうありませんね。
-shell-escapeを追加して、apt install gnuplot graphvizしておけばグラフもこの中で作成できます。

Overleafを使った日本語論文の作成 - Qiita
Overleaf(旧sharelatex)環境の構築 - Qiita

bitwarden_rs

代替対象: lastpass, 1password

dani-garcia/bitwarden_rs: Unofficial Bitwarden compatible server written in Rust

bitwarden.png

世の中のwebサイトに数多あるパスワードを管理するサービスです。
でもそれをクラウドに置くのって安全なの?命綱を握られてない?という話は当然出てきます。

bitwardenはそういうサービスのうちの一つでして、サーバ側のコードが公開されています。
オープンソースのパスワード管理ソフトはたくさんありますが、iOSクライアントがあるか、多要素認証はできるか、とか言いだすと選択肢は狭まります。
bitwardenはこれらに対応しています。

公式のサーバはお金を払わないと使えない機能があったり、重かったりとあまり実用的ではありません。
そこで登場するのが、非公式互換サーバbitwarden_rsです。
資源をあまり必要としない上に、yubikeyによる多要素認証も可能になります。
公式のクライアントでは、ログイン画面の⚙️(歯車マーク)からサーバのURLを指定可能です。

bitwarden_rsでパスワード管理サーバーをセルフホスティング

bitwarden_rs自体を動かしているサーバが落ちた時にそれを再起動・再デプロイするのに必要な認証情報までbitwarden_rsに任せてしまうと「鍵が金庫の中にある」「缶切りが缶の中にある」という状態になります。
以下のものを使って、定期的にkeepass形式に変換して安全な場所に置いておきましょう(日本語を使っている場合はutf8を使うよう一部修正が必要です)。

davidnemec/bitwarden-to-keepass: Export (most of) your Bitwarden items into KeePass (kdbx) database. That includes logins - with TOTP seeds, URIs, custom fields, attachments and secure notes

Komga

代替対象: Apple BooksのiCloud連携

Komga

komga.jpeg

手元にあるPDFやepubをwebブラウザから読むことができます。
漫画向けなのでライブラリの中に「シリーズ」という概念があります。
この手のものではCalibre-webが有名ですが、ライブラリが大きくなると遅くてきついです。
Komgaは数万冊いれても動きます。
いくつかのiOSやAndroidのアプリと連携ができるので、それも便利です。

janeczku/calibre-web: Web app for browsing, reading and downloading eBooks stored in a Calibre database

Jellyfin

代替対象: iCloud Music Library

Jellyfin: The Free Software Media System

jellyfin.png

自分の手持ちの音楽をブラウザから再生することができるメディアサーバーです。
NextCloudやKomgaもそうですが、自分で買ったものを自分だけが再生できるようにするのなら著作権法上の問題はありません。
もちろん、自分だけがログインできるように守ってあげしまょう。

音声しかないのにm4aではなくmp4になっていると再生できずに止まってしまいます。
ffprobeでvideoがなかったらffmpegでm4aに-vn -c:a copyするようなshell scriptを書いて回してあげましょう。

Jellyfinでメディアサーバを作ろう - Qiita
【Jellyfin】自分だけのメディアサーバー - Qiita

paperless-ng

代替対象: ScanSnap Home

jonaswinkler/paperless-ng: A supercharged version of paperless: scan, index and archive all your physical documents

paperless.jpg

スキャンされたレシート、ハガキ、チラシといった紙切れのPDFを管理するシステムです。
tesseractのOCR精度は売り物ほど良くはありませんし、分かち書き言語を前提とした検索システムなので日本語の検索はしにくいですし、QRコードの認識といったこともしてくれませんが、djangoのREST APIが使えるので扱いやすいです。

ScanSnapで一万冊の本をスキャンして管理して読むおはなし #書籍以外の紙 - Qiita

Exment

代替対象: MS Access, Excel, Googleスプレッドシート

Exment | エクスメント - システム無料、基本機能充実。シンプルで軽快なオープンソースWebデータベースをあなたに

ement.jpeg

Webデータベースソフトです。
大昔のHyperCard, 桐みたいなやつですね。
本体はPHP、バックエンドはmysql類でREST APIでも操作できます。

別のテーブルを参照することもできるので第3正規形もできますし、カード画面でjavascriptを入れることができるので(セキュリティはさておき)なんでもし放題、ちょっとしたデータ管理なら十分ですね。
うちは同じ型が幾つもあるタイプのごちゃごちゃしたファイルの管理に使っています。

ただ、残念ながら以下ような欠点があるようです。

  • APIのエラーメッセージまで日本語
  • datetime型にTimeZoneという概念がない
  • 「金額」のデータタイプの通貨が限られる
  • APIでsql的なものは使えない
  • PHP8未対応

この会社は本体はOSSで配布して、商用サポートやプラグインの開発でお金を稼いでいるようです。
WordPress, MovableTypeとかと同じビジネスモデルですね。

exment-git/docker-exment: exment env
Exment - Qiita
Laravel製のオープンソースWebDB『Exment』が正式リリース2年なので、これまでとこれからをまとめてみた - Qiita

番外編: webssh

代替対象: ssh

GitHub - huashengdun/webssh: Web based ssh client

これはwebサービス代替というのとは少し違いますが、ブラウザからsshできるようになります。
便利なのかセキュリティホールなのかは微妙な気もしますが、何かあったときに便利かもしれません...

おわりに

と、これらのソフトの作者の皆様のおかげで、我々はプライバシーと財布をサブスク課金クラウドから取り返すことができます。
深く感謝です。

企業で建てたいけど面倒・管理が心配、という方は弊社までご連絡ください(嘘です😀)。
残念ながら「プライバシーを売りたくない、金も払いたくない、自力でやる元気もない、けど使いたい」というような都合の良い話はありません。

経済学にフリーランチはありません。
子ども食堂も教会の炊き出しも天から無料で降ってきたものではありません、誰かが労力や財力を寄付しているものなのです。
深く感謝しつつ、我々も寄付やコミットをしていきましょう。
「地獄は善意で満ちているが、天国は善行で満ちている」と申します、偽善でも売名でも自己満足でもいいので善行を積み重ねましょう。

参考リンク

こちらも参考にさせていただきました。

個人的にセルフホストしてるソフトウェア 2021 | 備忘ノート
Dockerで即実行できる、社内・自宅向けオープンソースWebアプリ - Qiita
セルフホスティングへの回帰 - hub
Awesome Self Hosted | LibHunt
Self-Hosted Alternatives to Popular Services
The Top 210 Self Hosted Open Source Projects

Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
25
Help us understand the problem. What are the problem?