LoginSignup
152
173

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

Last updated at Posted at 2020-12-03

はじめに

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

Self-hosting (web services) - Wikipedia

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

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

利点と欠点

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

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

2022年、ロシアからさまざまなグローバル企業が撤退しました。
もし時の政権が変なことをして世界中から総スカンを食らった場合、自分のデータであってもアクセスできなくなるというリスクがあることが明らかとなってしまいました。
そのような政治的事態は起きないにこしたことはありませんが、これもクラウド依存のリスクといえるでしょう。

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

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

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

利点 欠点
クラウド
  • メンテナンス不要
  • 可用性が高い
  • 選択肢が多い
  • 出先からでも使える
  • 構築・運用知識がなくても使える
  • いつの間にか新機能が追加されて便利になることがある
  • (契約次第だが)事業者のサポートを受けることができる
  • (実際はどうだか知らないが)不正アクセス時に補償をうけることができる
  • 定期的な課金
  • プライバシーや権利の懸念
  • 技術的・経営的・政治的理由による突如の値上げ・改悪・停止リスク
  • ネットワークに接続していないと使えない
  • 「デジタル終活」が必要
  • 使用できるAPIが制限されている(欲しい機能がない、rate limitなど)
  • 不正アクセスの懸念
自前
  • 課金不要
  • 情報は常に自分で管理可能
  • スタンドアロンでも利用可能
  • 外部の問題に巻き込まれない
  • コードをいくらでも変更できる。必要なら背後のデータを直接書き換えることもできる
  • 自分が死んだらそのうち勝手に動かなくなる
  • 初期投資が必要
  • 電気代・減価償却がかかる
  • 選択肢が限られる
  • 構築、災害や障害対策、日々の運用、自分でコードを書いたり直したりcontribする知識と時間が必要
  • 作者または自分が新機能を追加しない限り、新機能は追加されない
  • 出先から使えるようにするにはVPNが必要
  • 管理者没後に遺族が遺産にアクセスするには遺族にも計算機の知識が必要
  • 不正アクセスの懸念

構成

基本的構成

わたしのサイトでは、基本的に以下のような形でつくってあります。

  • httpsを解釈するreverse proxy (VPS内)
  • httpで動くアプリケーション (自宅サーバdocker内)
  • 両者はsite-to-siteなVPNでつながる

基本構成.png

露出する頭だけVPSにおいておき、背後のアプリケーションは自宅においてVPNでつなげるというのが基本的な構成です。
そのこころは以下です。

  • 自分のノートパソコンやスマホは常時VPNでVPSに接続
  • リバースプロキシでSSLクライアント証明書を要求・検証することで、赤の他人のアクセスを排除
  • VPSでの処理を最小限にする(なるべく安いVPSを使う)
  • なるべく自宅サーバ側で処理をする
  • 自宅にグローバルIPをつけたくない

sslh

nginxやapacheの前段にsslhをつけるとsshとopenvpn(のtcp接続)も443に同居させることができます。
「tcpは80, 443以外禁止」といった公衆WiFiでも幸せになれます。

sslh利用.png

sslhはSNIの解釈も可能なので、SNIの処理もsslhにやらせるとnginxやapacheは不要になります。

sslhのみ.png

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

sslhの代わりにstunnel, haproxyを使うこともできますね。
Haproxyを用いて443ポートで複数サービスをホストする - Qiita

このnginxやapacheを用いない構成の場合、sslh, stunnel, haproxyはバーチャルサーキットを暗号化するレイヤのみ扱うので、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

iptablesでUDPも振り分ける

sslhを使うことで、443/tcpを2.4GHzみたいに便利なゴミ捨て場状態にすることができました。
そのゴミ捨て場精神をtcpからudpにも拡大し、53/udpや443/udpに対してdemulitiplexをすることができます。

fortiやpaloのようなガチDPIを導入しなくてもiptables -m stringで簡易DPI(deep?)できます。
例えば、以下のような方法で53/udpにやってきたdnsとwireguardを分離することができます。1

iptables -t nat -A PREROUTING \
  -p udp \
  -m udp --dport 53 \
  -m string --algo kmp --from 28 --to 31 --hex-string '|01000000|' \
  -j DNAT --to-destination 127.0.0.1:51820

Protocol & Cryptography - WireGuard

同じことを443/udpにすれば、sslhで443/tcpにopenvpn-tcpが同居していたのと同じことを、wireguardで行うことができます。
「udpは53, 443以外禁止」といった公衆WiFiでも幸せになれます。

iptables udp.png

実際はudpの規制をしているような公衆WiFiでは大抵443/udpも通らないので53/udpを使うことになります。

今後、ssh over QUICやNFS over QUICみたいなのが(公式に)登場して、「443/udpに同居する様々なQUICをリバースプロキシする」といった手法も登場してくることでしょう。
現在でもいろいろできそうです(うちはmosh over IPsec)。

Global options (Caddyfile) — Caddy Documentation
新幹線でもQUICで快適にSSHする #SSH - Qiita

OSIレイヤ分離的に気持ち悪い、レイヤバイオレーションだ、せっかく多数の/etc/protocols/etc/servicesが作られたのに全部443/udpに退化している、といえばそうなのですが、SSL-VPNのような製品が多数出回っているのに今更それを言ってもね、使えるプロトコルが規制されているのだから仕方ないじゃん、使えるものは便利に使おうぜ、という感じかもしれません。2

内部アクセス

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

内部アクセス.png

今時のブラウザは「出先からはhttps、自宅にいるときはhttp」といった構成は好みませんので(HSTSしましょう)、自宅にいるときでもssl接続できるように証明書の共有をうまく作る必要があります。
certbotが動いた後にはscpするようにしておきましょう。

蛇足になりますが、「VPN接続なんか面倒」と考えるのではなく、「VPN接続することでメリットがたくさんある、VPNはオンデマンドで自動で繋がるので手間もかからない」という状態にしておきましょう。3

その他の方式

今回は443/tcpに山のように同居している連中を「ほどく」作業をVPSにやらせていますが、以下のように443をそのまま自宅まで引き回すという解決策もあります。
VPSをゲートウェイにして自宅サーバーで443番ポートを公開しhttpsを利用する - Qiita

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

ホスト名(Viretual Host, SNI)増えすぎ問題

Webアプリの数だけホスト名をつけることになりますが、数個程度ならともかく数が増えてくるとnginxの設定ファイルやDNSを手で管理するのが面倒になってきます。
ということで、yamlにホスト名ごとにupstream, VPNのみなのかグローバルに公開するのか、ヘッダーを追加したり削除したりするのか、といったものを列挙しておくと設定ファイルを生成してreloadしてくれるジェネレータを書いておきましょう。

「VPSもクラウドだろ、撤退できてないじゃないか」問題

SaaSを使わずにIaaSだけを使う、という意味でこうしたわけですが「VPSも使いたくない」といった場合は素直に自宅にグローバル固定IPアドレスをつけるか、torを使って.onionドメインで公開という手になりますね。
自宅のラズパイを Tor Onion Service にして外から SSH 接続する - Qiita

あるいはVPSやEC2ではなくawsマネージドサービスだけ使うことにして、VPNとLBだけ使うといった構成もありでしょう。
オンプレサーバーをターゲットにしたALBリバースプロキシ環境を構築してみる | DevelopersIO

CloudflareのZero Trust(やその類似サービス)を使うという手もありますね。
今回ここで説明しているVPSとVPNの面倒からは解放される一方、今度はCloudflareの「改悪」「値上げ」「サービス終了」に怯えることになりますが...
「Cloudflare Zero Trust」の検索結果 - Qiita

セキュリティの確認

この手の作業をしていると、つい「正しいIDとPasswordを入れた時にうまくいく」ことばかり気にしていて、「正しくないIDやPasswordでは入れない」ことを確認し忘れるといったことがあります。
保護したつもりだったが全く保護してなかった、というミスもありえます。

そこで、「正しく受理している」のみならず「正しく拒否している」ことを確認するためのシェルスクリプトを作っておき、作業後には必ず実行するとともに、cronで毎日実行して失敗したらメールさせるようにしましょう。
curlに-w '%{http_code}\n'をつけると、200とか401とか帰ってきます。
--resolve hoge.example.com:80:192.168.1.1といった指定をすると、自宅内にいても強制的にvps側のアドレスに接続に行かせるとか、SNIやHost:に好きな値をいれることもできます。

また余談ですが、sshや他のプロトコルに対しても「間違った方法ではログインできないようになっている」ことを確認する方法を用意して仕込んでおくと安心です。
SMTPの場合はswaksが便利です。
Swaks - Swiss Army Knife for SMTP
Swaksをメール送信のテストで使う - Qiita

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

頑張って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?

ユーザ認証

以下で紹介しているwebアプリケーションの中にはユーザ認証機能を全くもっていないものもあります。
自分1人で使うだけならhttpsクライアント証明書4を必須にしたり、VPN接続している端末からのみ接続可能にしておけばそれで十分ですが、他人にもログインさせるとなるとそれでは少し困ります。

そのような場合もauth0みたいな外部サービスを頼るのではなく、keycloakを自分でたてて、webアプリケーションにoauth2を話させるかoauth2-proxyやkeycloak gatekeeperを入れることで幸せになれるかもしれません。
シングルユーザしか想定していないアプリの場合はどのユーザも同じ画面が表示されるわけですが、少なくとも見知らぬ赤の他人が接続することはなくなります。

Qiitaタグ検索: Keycloak

最小構成で OAuth2 Proxy を使ったHTTPなページでユーザー名を表示する - Qiita

問題はアプリ側が独自のログイン画面を持っているがoauth2に対応していない場合です。
ssoは諦めるか、oauth2-proxyが生成するX-Forwarded-EmailX-Forwarded-User(またはX-Forwarded-Preferred-Username)ヘッダーを信用するように改造する必要があります。

auth.png

この図ではアプリケーションサーバへの通信は必ずoauth2proxyを経由するかの如く表記していますが、実際はauth_requestを使って必要な通信だけoauth2proxyに飛ばす形にもできます。

Nginx + OAuth2 Proxy で静的 Web サイトに認証機能を追加してみる

長くなりましたが、ここまで前座でした。

webアプリカタログの歌 「GNUには1024人」

マダム、これがwebアプリのカタログです!
以下、GPLなのかBSDなのか等は別として、すべてオープンソースです。基本的には「有償・プロプラから撤退」という話の記事なので、redmineとかmediawikiとかは掲載していませんが一部そういうものも載せてあります。

特にここでリンクしていませんが、すべてDockerfileやcomposeがgithubにあります。
localstackを使わずに自分でawsもどきを立てよう、というほど大変ではありませんのでご安心を!

NextCloud

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

Nextcloud

nextcloud.png

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

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

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

Qiitaタグ検索: nextcloud

PhotoPrism

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

Browse Your Life in Pictures – PhotoPrism

photoprism.jpg

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

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

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

Photonix Photo Manager

immich

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

GitHub - immich-app/immich: Self-hosted photo and video backup solution directly from your mobile phone.

immich.jpeg

上記PhotoPrismと似たものですが、スマホとの連携を重視しているようです。
専用クライアントアプリがスマホ用にあり、いい感じにバックアップしてくれます。

必要なコンテナ数はPhotoPrismより多ですが、負荷としては大差ないように感じます。

写真や動画のためのオープンソースのバックアップソリューション・「Immich」 | かちびと.net

gitea

代替対象: github

Gitea

gitea.png

「githubもどき」がいろいろあります。
gitlabは重いですが、giteaは軽くていいかんじです。

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

「gitea」の検索結果 - Qiita

ghコマンド相当品のteaコマンドがあり、CLIからissueを立てたりごにょごにょできます。
git-flow-hookを一緒に使うと便利です。
gitea/tea: A command line tool to interact with Gitea servers - tea - Gitea: Git with a cup of tea
小規模開発のgit-flowの導入を楽にするブランチルールと拡張スクリプト配布 - Qiita

giteaのfork、forĝejoが登場したとのことです。
ownCloudに対するNextCloudみたいな経緯のようみにえます。
Forgejo – Beyond coding. We forge.
ユリアーモ辞書(エスペラント辞書)でforĝejo

github actionsの相当機能があります。dependabotは使えませんが、renovateという似たようなものが使えます。

Gitea Actionsが来てるやんけ #Docker - Qiita
renovatebot/renovate: Universal dependency update tool that fits into your workflows.

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や正規表現でゴミを捨ててからgitに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.

Joplin

代替対象: Evernote, Notion, Google Note

laurent22/joplin: Joplin - an open source note taking and to-do application with synchronisation capabilities for Windows, macOS, Linux, Android and iOS.

joplin-vieweb
(この画像はJoplin-viewebです)

上記Leanoteと同じようなノートアプリです。
「webアプリを建てるおはなし」と書いておいて恐縮ですが、このJoplinはデスクトップアプリが基本となりそのままではwebブラウザからノートの読み書き編集はできません(外部共有ノートの匿名閲覧用には使えます)。

同期サーバがhttp上で動き、Joplinアプリに対して専用の同期APIを提供します。
そのため、自分でREST APIを叩いてノートを読み書き編集するという作業はこのままではできないのですが、Joplinアプリに対して(同期APIとは別の)Joplin Data API (標準で41184/tcp)を使ってノートの操作ができます。
そのDATA APIを使うWebクライアントもあります。
joplin-vieweb/joplin-vieweb: A web viewer for Joplin app

joplin.png

DATA APIを使う側からみればJoplinアプリがサーバになるので常時立てておく、という方法でDATA APIによるノート操作ができます。
DATA API専用Joplinアプリはこれらのコンテナをベースに建てることができます。
jspiers/headless-joplin: Dockerized Joplin terminal client
joplin-vieweb/joplin-terminal-xapi

ということで、図中の青い部分をコンテナとして常時立ち上げておくとアプリからも自分で作った怪しげなAPI操作ツールからも、EvernoteやNotionみたいな感じで使えます。
私の場合、archiveタグのついたノートを別の検索可能な場所に移動するなど、いくつかのcron処理などをしています。

同期サーバは専用のものではなくs3やdavでもいけますので、minioやNextCloudでもOKです(共有ノートの公開はできません)。
同期サーバの背後にあるmysqlを含めると、4段構成ということになりますね。

注意が必要なのは同期のタイミングです。DATA APIを叩いている時には適度なタイミングで(ダーティなオブジェクトが多くなりすぎず、デスクトップアプリとの競合がおきにくく、sqliteがロックしたりパフォーマンスが落ちたりしないタイミングで)同期してあげる必要があります(上記コンテナでは5分に一回となっています)。

Joplin ことはじめ - Qiita

I, Librarian Free

代替対象: EndNote, Zoteroなど

mkucej/i-librarian-free: I, Librarian - open-source version of a PDF managing SaaS.

I Librarian Free.jpeg

大学も卒業・修了したし論文地獄ともおさらばだぜ!と思っていも、計算機界隈なんかにいたらなんだかんだいって論文は読みますし、自分が興味ある他の分野を調べていても論文にはよく遭遇します。

そういった論文のPDFはNextCloudやノートアプリに入れておいてもいいわけですが、溜まってくると整理に困ってしまいます。
そんな時に便利なのが、文献管理ソフト・サービス。

【ScrapeStorm】学術研究にオススメ | 文献管理ツール 5選 #論文 - Qiita

有償のものが多い中、I, Librarian (Free版)は無償で使用可能なWebアプリです。
和文、しかも日本国内ネタの社会学類ですとDOIでインポートできなかったりしますが、まぁ研究者ではない読み専なら困らないレベルだと思います。

WBO

代替対象: Google Jamboard

WBO — 協同作業できるオンラインホワイトボード
wbo.png

ブラウザの中で動くホワイトボード、お絵かき掲示板です。
同じURLを開いている複数のブラウザで同じ絵をみることができますので、zoomなどで画面共有しているときにちょっと図を描くのに便利です。
私はiPadのSafariでApplePencilで絵を描き、それをPCのブラウザ経由で画面共有するという使い方をしています。

lovasoa/whitebophir: Online collaborative Whiteboard that is simple, free, easy to use and to deploy

Vikunja

代替対象: todoist, wondrlistなど

Vikunja

vikunja.png

todoを管理するツールです。
ノートアプリで、チェックリストを使えば不要といえば不要かもしれませんが、まぁそこはお好みで。

NextCloudに「カレンダー」アプリ(いわゆるプラグイン)を追加すると、NextCloudがCalDAVサーバになります。
そして「タスク」アプリで、VTODOのWebUIが追加されます。
OS標準の「リマインダー」アプリ(AppleのものはCalDAVに対応しています)や2DoといったCalDAV対応ToDoアプリを使うのがいいかもしれません。

ToDo管理アプリというのは依存しはじめるとなかなか抜け出しにくいですね。

Wekan

代替対象: Trello

Wekan — Open-Source kanban

wekan.png

カンバン型タスク管理ツールです。
左にある「未着手」を右にある「進行中」にすすめていくあれです。
Trelloのおもらし事件のようにならないよう、「公開」には気をつけましょう。

WekanをDockerで立てる! - Qiita

似たようなツールは他にもたくさんありますので、自分にあうものを探してみましょう。

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

HedgeDoc

代替対象: HackMD

md.jpeg

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

Qiitaタグ検索: HackMD

BulletNotes

代替対象: workflowy

jean/BulletNotes: Personal Knowledgebase, Note Taking, Scheduling
BulletNotes.io

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

BulletNotes.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

Roundcube

代替対象: gmail, Yahoo mailなど

roundcube/roundcubemail: The Roundcube Webmail suite

roundcube.jpeg

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

似たようなものにRainLoopというのがありますが、こちらは開発がもうされていないようです。

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

RainLoop - Qiita

RoundCubeに限りませんが、Webアプリに脆弱性が報告されることはままありますので、ちゃんと対応しましょう...
【セキュリティ ニュース】ウェブメールクライアント「Roundcube」に深刻な脆弱性 - アップデートを強く推奨(1ページ目 / 全1ページ):Security NEXT

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

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

overleaf community edition

代替対象: overleaf, sharelatex

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

overleaf.png

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

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

FROM sharelatex/sharelatex:4

RUN apt update && \
    apt install -y graphviz gnuplot fonts-noto-cjk && \
    tlmgr update --self && \
    tlmgr install scheme-full && \
    cd /usr/local/bin && \
    ln -s /usr/local/texlive/2023/bin/x86_64-linux/platex  . && \
    ln -s /usr/local/texlive/2023/bin/x86_64-linux/ptex    . && \
    ln -s /usr/local/texlive/2023/bin/x86_64-linux/mendex  . && \
    ln -s /usr/local/texlive/2023/bin/x86_64-linux/pbibtex . && \
    apt clean && \
    rm -fr /var/cache/apt

overleafにcliからアクセスするoverleaf-syncというのがあります。
moritzgloeckl/overleaf-sync: Overleaf Two-Way Synchronization

2023/07現在、community editionまわりやBS, uploadにバグがあるのでissueに上がっているパッチを手マージします。

# ログイン(初回のみ)
$ ols login --ce-url=https://sharelatex.example.com --path ~/.olauth
# プロジェクト一覧
$ ols list --ce-url=https://sharelatex.example.com --path ~/.olauth
# 特定のプロジェクトのpdfをダウンロード
$ ols download --ce-url=https://sharelatex.example.com --path ~/.olauth --name お手紙
# 現在のディレクトリ名と同じプロジェクトの中身を同期
$ mkdir お手紙
$ cd $_
$ ols --ce-url=https://sharelatex.example.com --path ~/.olauth 

こんな感じのMakefileを書くと幸せになれます。

Makefile
OLSOPT=--store-path ~/.olauth -v --ce-url=https://sharelatex.example.com

output.pdf: main.tex
    ols $(OLSOPT)
	ols download $(OLSOPT)

vaultwarden (旧称bitwarden_rs)

代替対象: lastpass, 1password

dani-garcia/vaultwarden: Unofficial Bitwarden compatible server written in Rust, formerly known as bitwarden_rs

bitwarden.png

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

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

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

ユーザに非常事態が発生して長期に渡り連絡がとれない(つまり死亡)というときに、あらかじめ指定された者(つまり遺族)に非常アクセスを許可する仕組みもあります。
個人でも家族でも仲間内でも、こういうのを建てて緊急事態アクセスを設定しておくと「何か」あったときに残された人が苦労しないで済むかもしれません(残された人がこのサーバを維持管理できるかは分かりませんが、普通、サーバは一ヶ月程度は無保守でも動きますよね?)。
いつ誰が新型コロナウイルスに感染して戦線離脱するかわからないご時世、DR, BCPとして構成員個人のパスワード管理しなければなりませんね。切ないわ...

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

vaultwarden自体を動かしているサーバが落ちた時にそれを再起動・再デプロイするのに必要な認証情報までvaultwardenに任せてしまうと「缶切りが缶の中にある」という「函の中の鍵」状態になります。
以下のものを使って、定期的に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を書いて回してあげましょう。

DLNAにも対応していますが、その場合はnetwork=hostが必要になります。

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

DLNAだけが目的(WebUIでの再生は不要)なら、MiniDNLAがおすすめです。
複数のMiniDLNAインスタンスを起動して、アクセス制御する - Qiita

paperless-ngx

代替対象: ScanSnap Home

Paperless-ngx

paperless-ngx.jpeg

スキャンされたレシート、ハガキ、チラシといった紙切れのPDFを管理するシステムです(書籍向けではありません)。
djangoのREST APIが使えます。

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

Exment

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

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

ement.jpeg

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

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

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

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

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

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

webssh

代替対象: aws cloudshell, cloud9のターミナルなど

WebSSH.png

GitHub - huashengdun/webssh: Web based ssh client

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

おわりに

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

たたし、面倒・管理が心配だ、自信がない、という方はやめたほうがいいというのが正直なところです。
残念ながら「プライバシーを売りたくない、お金も払いたくない、自力でやる元気も技術もない、けど使いたい」というような都合の良い話はありません。

また、個人、趣味の仲間内や家族ならともかく、企業・法人であえてオンプレを建てるのもお勧めはしません。
JTCは内製が大好きですが、そんなことに力をかけるより比較優位なことで稼いで、そのお金で他人に任せたほうがいいですよ...

参考リンク

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

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

  1. DNSクエリーの頭はトランザクションIDですので、稀にマッチします。「稀」といっても誕生日のパラドクスが示す通り直感的に感じるより多いのですが、自分のドメイン名への多少のクエリーを捨てても自分は困らない(他人は困るかもしれない)ことでしょう。

  2. 実用に耐えるかどうかは別として、udp-over-icmpやssh-over-dnsみたいなものは大昔からたくさんありますね。「使えるものは便利に使わせてもらう」はハッカー文化の基本だと私は思っています。

  3. macosでしたら、hammerspoonからネットワーク変更やスリープを検出し、IPsecやwgを立ち上げるようにします。sshではなくmoshとtmux, gnu screenを常用するようにしましょう。そうすると、自宅でノートパソコンの蓋を閉じて出先で蓋をあければリモートでの作業が即座に継続できますし、いつ蓋を閉じても問題ない、という便利な環境になります。認証にしても、keycloakでFIDOすればセキュリティを損なうことなくパスワード不要になります。確かにその環境を構築するための手間はかかりますが、そんなものはChatGPTにでも手伝って貰えばいいわけで、その後の快適環境から得られるメリットのほうがはるかに大きくなります。
    「バリアフリーのためには不格好でも仕方ない」という建築家や「ユニバーサルデザインのためにはダサくても仕方ない」というデザイナーが二流であるのと同様、「セキュリティのためには不便でも仕方ない」などというエンジニアは二流です。両立させるのがプロの仕業というものです。

  4. httpsで使わなくても、オレオレCAは一つあると便利です。IPsecや802.1XのEAP-TLS、dockerの2376/tcpなど簡単にできます。イマドキならOpenSSLと格闘しなくてもeasy-rsaやeasy-caといったものでお手軽にできます。(FreeRADIUSが死んだ時にアクセスできなくならないよう、非常用の物理バックドア有線ポートも作っておきましょう)

152
173
4

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
152
173