--- title: "Nextcloudでなんかもう色々と所有する" date: 2023-10-08T21:18:07+09:00 draft: false tags: ['tech'] --- 時に単体のサービスでは奥深い機能が多すぎて使いきれなかったり、逆に賢くまとまりすぎていて連携力に乏しい場合がある。そんな状況下ではセルフホスト型でもあえて統合的なプロダクトの利用が検討される。[Nextcloud](https://nextcloud.com)はセルフホスト界の四天王――四天王のうちでどの位置かは人によるとしても――に相応しい強力な網羅性を持つ。 さしずめ、Google Workspaceのオープンソース版と言ったところか。ストレージがあり、フォトギャラリーがあり、カレンダーがあり、チャットがあり、オフィススイートがある。僕が知らないだけでたぶんもっと色々ある。それらを全部使うことも、一つか二つを選んで使うこともできる。 当初、僕はカレンダーの脱Googleを画策していて[Baïkal](https://sabre.io/baikal/)などのCalDAVサーバを物色していたが、調べていくうちに使いたい機能が他にいくつかある事態に気がついた。たとえば普段はNASにデータを保存していても、一部を外出ししたい時に検閲されないオンラインストレージがあると望ましい。 利用頻度が低いが使うであろう機能……そういった需要を満たす上では各々に個別のサービスをあてがうよりも、様々な機能をひと揃えにしている統合型プロダクトのスイスアーミーナイフ感がうまくフィットする。本稿ではDockerを利用したNextcloudの構築方法について記す。 ## docker-compose.ymlの編集 `docker`および`docker-compose`は導入済みと仮定する。巨大なサービスな割に記述量は意外と少ない。 ```docker version: '3.9' volumes: nextcloud: db: services: db: image: mariadb restart: always volumes: - db:/var/lib/mysql environment: - MYSQL_ROOT_PASSWORD=乱数生成 - MYSQL_PASSWORD=乱数生成 - MYSQL_DATABASE=nextcloud - MYSQL_USER=nextcloud app: image: nextcloud restart: always ports : - 7999:80 links: - db volumes: - ./app:/var/www/html environment: - MYSQL_PASSWORD=乱数生成 - MYSQL_DATABASE=nextcloud - MYSQL_USER=nextcloud - MYSQL_HOST=db - OVERWRITEPROTOCOL=https ``` `MYSQL_PASSWORD`の部分は`openssl rand -hex 16`で乱数生成する。定義が同じ箇所は同一の内容で揃えなければならない。編集後、`docker-compse pull`でファイル群を取得しておく。 ## リバースプロキシの設定 僕のブログをよく読んでいる人はサーバ構築系の記事が似通った構成で書かれていることに気づいたかもしれない。事実、Dockerを利用した構築作業は一部の例外を除いて大部分が反復的になりがちだ。つまり、やればやるほど楽勝になっていく。「こういうサービスが欲しいな」と思った時に、フリーミアムではなくまずセルフホスト型のOSSを探すようになる。そうなればしめたものだ。真に自由なインターネット生活はそこにある。 ```nginx server { server_name あんたのドメイン; location / { proxy_pass http://localhost:7999; proxy_set_header Host $host; proxy_set_header Connection $http_connection; proxy_set_header X-Scheme $scheme; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; } listen 443 ssl http2; ssl_certificate /etc/ssl/certs/あんたのドメイン.pem; ssl_certificate_key /etc/ssl/private/あんたのドメイン.key; client_max_body_size 10000M; } ``` 例によって、Cloudflareユーザでオリジンサーバ証明書を取得していない人はぜひ[この記事](https://riq0h.jp/2023/07/22/204725/)を参考に設置されたし。`nginx -t`で文法を検証してから`systemctl restart nginx`で再起動を行う。ちなみに、`client_max_body_size`はWeb UI上からファイルを送信する際に必要とされる。`10000M`で10GBまでのアップロードに対応できる。 ## 動作確認 `docker-compose up -d`で起動後、DNSの設定で紐づけたドメインにアクセスすると下記のようなログイン画面が現れる。UIの細部はバージョンや閲覧環境に応じて異なる。 ![](https://docs.nextcloud.com/server/latest/admin_manual/_images/install-wizard-a1.png) 我々はMariaDBのコンテナを用いているので`MySQL/MariaDB`を選択してから空欄を埋めていく。`Database user`が`MYSQL_ROOT_PASSWORD`、`Database passward`が`MYSQL_PASSWORD`、`Database name`が`MYSQL_DATABASE`、`Database host`が`MYSQL_HOST`に符合する。`Database host`は`db:3306`の形式でデータベースのポート番号を添えて記載しなければならない。デフォルトでは`3306`が指定されている。 以降はごく一般的な作りをしたWeb UIが展開される。順次触っていけばじきに慣れると思われる。内蔵アプリケーションの追加と削除は右上のアイコンから「アプリ」に進むと行える。プリインストールされているものでも特に動作に必須ではないので、使わないと思ったら速やかに消していく方がリソース節約の観点からも好ましい。 ## 僕が使っているアプリケーション **■ファイル** ![](/img/214.png) 言わずと知れたNextcloudの主力機能。Google DriveやDropboxとだいたい同じ。Web UIからファイルを送受信・共有可能なのはもちろん、ネイティブアプリケーションを用いればファイラ上にNextcloudをマウントして利用できる。置かれたファイルは自動的に同期されて常に最新の状況に保たれるが、実際の転送速度はサーバの性能やホストとの物理的距離に左右される。 当然、ストレージの空き容量もサーバ次第で決まる。僕のVPSのストレージ容量は200GBだが、実質的に使えるのはせいぜい100GB前後だろう。僕はもっぱらNASにファイルを保存しているので一時的な置き場としてはこれで差し支えない。容量を拡張する手段はサーバ自体に手を加える他に、Nextcloudの外部ストレージ機能を使う方法がある。 この機能を用いるとサーバ外のネットワークストレージを、あたかもNextcloud上のフォルダのように扱える。Nextcloud同士以外にも、おなじみのSMB/CIFSやFTP、Amazon S3互換のオブジェクトストレージに対応している。Cloudflare R2のバケットをここに追加すると月10GBまでファイルを流し込み放題の異次元ワープゲートが手に入る寸法だ。 また、NASの外部アクセスをこのNextcloud経由に限って開放すれば、公共のネットワークから比較的安全に自宅のNASにアクセスする手段を得られる。セキュアな外部アクセスはTailscaleなどでも可能だが、どうせNextcloudを用いるのならこちらの手法も検討したい。外部ストレージの追加は右上のアイコンから「管理者用設定 → 外部ストレージ」に進むと行える。 **■カレンダー** 癖のないカレンダー。Web UIかCalDAVに対応したアプリケーションを通じて使う。iOSは標準アプリからドメイン情報を入力するだけで追加可能だが、Androidの場合は少々ややこしい手順を踏まなければならない。まずは[DAVx](https://f-droid.org/packages/at.bitfire.davdroid/)をF-droidから入手して、諸々のパーミッション設定を済ませる。後述のToDoリスト(タスク)も同期させたい人は予め「Tasks」にチェックを入れておく。 ドメインとNextcloudのユーザ情報を登録するとひとまず連携の準備が整う。次にCalDAVに対応した任意のカレンダーアプリを導入する。おすすめは[Simple Calendar Pro](https://f-droid.org/packages/com.simplemobiletools.calendar.pro/)だ。ミニマルに機能が整っている。DAVxが機能していれば自動的にNextcloudのカレンダー情報が認識される。 こうしてみるとGoogleカレンダーがいかに思考停止で扱える優れものだったかよく解る。とはいえ、さすがにAndroid側でシステム的にCalDAVを読み込んでくれたっていいじゃないかとは思う。 **■連絡先** カレンダーがCalDAVを用いて同期するように、連絡先情報もCardDAVと呼ばれるプロトコルで通信を行っている。Nextcloudの「連絡先」にいくつかの宛先を追加してから、CardDAVに対応したアプリケーションにドメイン情報を登録してみれば判る。多くのユーザはiCloudやGoogle Workspaceの透過的な同期に慣れているせいか、こうした仕組みを意識する機会は極めて少ない。 Androidでは、DAVxの設定が済んでいれば連絡先アプリで同様にNextcloud上の情報を取得できる。スマホにプリインストールされているアプリでも構わないが、おすすめとしては[Simple Contacts Pro](https://f-droid.org/packages/com.simplemobiletools.contacts.pro/)を挙げたい。僕は標準アプリの大半をこのシリーズで置き換えている。 **■ToDoリスト(タスク)** 未だに僕が使いこなせない概念の一つ。Nextcloudには主にかんばん形式のものとリスト形式のものがあるが、前者はどうせ無理なので後者を導入している。今のところは「進捗度を示したい」、「近日中に終わらせたい」、「開始時刻に拘束されていない」といった条件に適合する予定をToDoリストにあてて、それ以外をカレンダーに割り振っている。 たとえば「歯医者の予約」や「ワクチンの接種」は進捗を示す意味がなく、開始時刻に拘束されているのでカレンダーに割り振る方が適当と考えられる。一方「群像新人賞締切」には進捗の概念が(まったく忌々しいことに!)ついて回るため、ToDoリストが向いている。「ゆで卵を作る」だとか「歯磨き粉を買う」だとかもToDoリスト向きだろう。仕事で活用するのは当分先になりそうだ。 このアプリケーションは既存のプロトコルに相乗りする形で情報を送受信している。CalDAVの設定が済んでいるなら対応アプリケーションで難なくNextcloudと同期が行えるはずだ。Androidアプリは[Tasks](https://f-droid.org/packages/org.tasks/)がDAVxとの連携に対応している。 **■ノート** メモアプリ。以前は[memos](https://github.com/usememos/memos)をセルフホストしていたが、僕にはやや親切すぎたのでもっと単純なメモアプリを探していた。ちょうど[Simplenote](https://simplenote.com)と似た操作感のサービスをセルフホストできたらいいと思っていたので、Nextcloudのこれはまさにうってつけだった。むしろ物足りなさを感じる人の方が多いかもしれない。 主な機能は同期、Markdown記法、画像の挿入、プレビューと編集画面の切り替え、フォルダ分けのみ。僕はメモの作り込みに熱心なタイプではないのでささっと書けて読めればそれで申し分ない。そこへいくと、嬉しいのは一つ一つのメモがNextcloud上のストレージにテキストファイルの形式で保存されているところだ。 それらのファイルはネイティブアプリケーションでファイラ上にマウントされたNextcloudフォルダ内にも存在している。なにもWeb UIに頼らずとも、Vimやお好みのエディタを使っていくらでもメモを書きまくれるのだ。親切設計のメモアプリほど内蔵のエディタを使わせようとする風潮の中、この放任的な仕様にはいたく好感を抱いた。 ストレージ用とは別に用意されているスマホのノートアプリも使い勝手がいい。絶妙に機能を厳選している印象だ。特にメモの中身をプレビューする表示モードが気に入っている。買い出しの際にしたためたメモも、こうすればいちいちファイルを開かずに情報を一瞥できる。 ![](/img/215.png) 技術者と物書きは日々メモをとる。他にどんな素晴らしい手法があるか毎日探し回っていると言っても過言ではない。だが、幸いにもこれで僕のメモアプリ探しの旅は落ち着いた。シンプルで、複数の端末間で同期が行えて、巨大資本に支配されず、突然のサ終に怯える心配もない。そして、そう、なによりVimで書ける。なんだかんだ言っても僕にはそれが一番良い話だ。 ## おわりに 通常、Nextcloudは複数人のユーザを登録して運用するサービスだが、単独での私的な用途でも柔軟なUI設計のおかげで煩雑さを覚えることなく使用できた。最初からあれもこれもと下手に気負わずとも漸次的に試していける。実は運用してすでに数ヶ月経っているがとても快適だ。 人々がその知名度と手軽さゆえに巨大資本に依存してしまうのは仕方がない。他方、一歩足を踏み出せばそれらに引けを取らないサービス群を手元に置ける時代でもある。100日後、1000日後の持続性を鑑みた際に果たしてどちらがより良い体験を得られるかは、おそらくIT技術者の間でも意見が別れるに違いない。 しかし、数多のサービスが自分の意図した通りに、自分自身の権限において淀みなく働いて日常に便益をもたらしてくれる快楽は他に代えがたい。昨今のコンテナ技術は管理運用の懸念を最小化するよう進歩を重ねてきている。この巨大なサービスを動かすのに必要な記述量は100行にも満たない。 然らば、とりあえず触る、動かしてみてから考える。そういう軽率なアプローチももはや問題ではない。なにしろNextcloudはNAS上でも動かせる。たとえごく一部でも人々が自前でサービスを賄う様式に馴染めば、そのぶんだけインターネットは本来の自由な姿に近づいていくのである。