Help us understand the problem. What is going on with this article?

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

はじめに

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

Self-hosting (web services) - Wikipedia

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

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

利点と欠点

まず利点はなんといっても、自分のデータを自分の手元においておけることです。
クラウド事業者が技術的問題でデータを消したり中身を見ることも、契約的・法的問題でデータを消したり見ることもありません。
すべてのデータは手元にあり、(適切に設定して運用していれば)他人が見ることも消すこともありません。

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

欠点はその「適切に設定して運用」「脆弱性対策は自分で」する責任は常に自分にあり、バックアップも自分でやる必要があるということです。
「ふくいナビ」事件を笑っていることはできません。そのような事件が起きたら自分で自分のデータのバックアップを探してきて自分で復旧しないといけないのです。
自由と自立にはそれなりの責任と手間、時には苦労が伴います...

構成

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

基本的には上記の構成でしょう。
httpsを終端する場所でクライアント証明書を請求・検証することで、他人のアクセスを排除することも簡単にできます。
1をnginxやapacheを使わずに以下のような構成にすることも可能です。

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

  1. sslhやstunnelでSNIを解釈して、SNIのホスト名で割り振る先のポートを変更する(sslhはconfigファイルを使うとSNIで割り振りができる。stunnelは比較的新しいバージョンでSNI対応可能)
  2. sslhを使う場合、sslhからの接続をstunnelで受け取り、サーバ側証明書処理やクライアント証明書の処理をおこなって平文のTCPとしてトンネルする
  3. httpで動くアプリケーション(docker内)

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

1〜2はバーチャルサーキットを暗号化するレイヤ(TCPより上でHTTPより下、OSI参照モデルでL6あたり)のみ扱うので、websocketだろうが未知のHTTP拡張だろうが関与せず何でも通るという利点があります。
欠点はキャッシュもなく、ログ類も乏しく、セキュリティ上のヘッダー追加などの加工も不可能ということでしょうか。

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

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

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

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

このほうが構成はシンプルになります。
ただ、自宅(あるはVPN)が落ちたら503や502のエラーすら出てこなくなりますし、「すみません現在復旧作業中です」みたいな案内をすぐ掲示することもできなくなります。
NextCloudで他人とファイルをシェアしたりしている場合には必要なことですね。
自宅内にもhttpdを一つ立てておき、自宅内からのDNSは自宅内のhttpdのアドレスを返答するようにすると、自宅内からのアクセス時に自宅-VPS-自宅の往復が発生することもなくなります。

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

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

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

Evernoteのver.10からが使っているのがElectronですが、そこまでしなくても以下のようなものを使えばこれらwebサービスはだいたいデスクトップアプリになります。

GitHub - jiahaog/nativefier: Make any web page a desktop application
Unite for macOS
Fluid – Turn any webpage into a real Mac App

使えるソフト

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

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

NextCloud

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

Nextcloud

ファイルをどんどんおいて、共有したり共有しなかったり、プラグインで遊んだりと様々なことができます。

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

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

DAVも話せるので、DAVに写真をバックアップするようなアプリをスマホにいれておけば、Google PhotoやiCloud Photoの代わりにもなります。
画像認識のような賢いことはしてくれませんが、そのへんは自分でqiitaにたくさんあるAI関連記事に従って頑張りましょう。

nextcloud - Qiita

gitbucket

代替対象: github

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

恥ずかしいコードも秘密のコードも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を自分で建てよう - Qiita

freshrss

代替対象: Feedly

FreshRSS, a free, self-hostable aggregator…

RSSリーダです。

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

Leanote

代替対象: Evernote, Notion, Google Note

Leanote - open source alternative to Evernote · GitHub

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

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

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

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

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

myTinyTodo

代替対象: todoist, wondrlist

myTinyTodo - simple open source to-do list script written in PHP and jQuery

ToDo管理です。
課金Todoistのような細かいことはできないので、Todoistのカルマを大量に貯めるような生活をしている私にとってはあまり使えないのですが...

wekan

代替対象: Trello

Wekan — Open-Source kanban

カンバン型タスク管理ツールです。
左にある「未着手」を右にある「進行中」にすすめていくあれです。

WekanをDockerで立てる! - Qiita

vimflowy

代替対象: workflowy

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

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

Baïkal - baikal

rainloop

代替対象: gmail

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

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

RainLoop - Qiita

jitsi

代替対象: Zoom, WebEX

Jitsi Meet

Mattermost

代替対象: Slack

Mattermost: Open-source, high-trust, developer-centric collaboration platform

私はまだこれらを建てたことがないのですが、今どきのブラウザならカメラもマイクも使えるわけで...

overleaf

代替対象: overleaf, sharelatex

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

ここに載せるのはすこし文脈が違いますが、これがあれば/usr/local/share/texmf/の巨漢にSSDを圧迫されて泣くことはもうありません。

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

webssh

代替対象: ssh

GitHub - huashengdun/webssh: Web based ssh client

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

おわりに

と、これらのソフトの作者の皆様のおかげで、我々はプライバシーと財布をサブスク課金クラウドから取り返すことができます。
企業で建てたいけど面倒・管理が心配、という方は弊社までご連絡ください(嘘です... あ、大金つまれればやりますよw それで「プライバシーと財布」が戻ってくるかどうかは知りませんw)。

mtakatou
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