なーのブログ

nan1sa の個人ブログ

NextCloud を導入した

2024-04-11 備忘録

カレンダーアプリをセルフホストしたいなと思い色々と調べていたところ、NextCloud をホストするのが楽という結論になったので NextCloud を導入しました。

前提

  • ポートを開放したくないので Cloudflare Tunnel を使います
  • せっかく Cockpit で podman の管理ができるので podman-compose を使って管理します

導入方法

正直、書かなくても5分で終わる内容ですが、書かないと尺が持たないので書きます。

docker-compose.yml を書く

適当な名前のディレクトリを作成して GitHub に書いてあるやつを書きます。MYSQL_ROOT_PASSWORDMYSQL_PASSWORD はパスワードジェネレーターでも使って適当に設定してください。

version: '2'

volumes:
  nextcloud:
  db:

services:
  db:
    image: mariadb:10.6
    restart: always
    command: --transaction-isolation=READ-COMMITTED --log-bin=binlog --binlog-format=ROW
    volumes:
      - db:/var/lib/mysql
    environment:
      - MYSQL_ROOT_PASSWORD=
      - MYSQL_PASSWORD=
      - MYSQL_DATABASE=nextcloud
      - MYSQL_USER=nextcloud

  app:
    image: nextcloud
    restart: always
    ports:
      - 8080:80
    links:
      - db
    volumes:
      - nextcloud:/var/www/html
    environment:
      - MYSQL_PASSWORD=
      - MYSQL_DATABASE=nextcloud
      - MYSQL_USER=nextcloud
      - MYSQL_HOST=db

podman-compose up -d で試しに起動して、起動できることが確認できたら podman-compose down で落とします。

systemctl で自動起動するようにする

podman は docker と違ってデーモンを持たないので、systemd を使って起動してあげる必要があります。今回はユーザー管理下のデーモンを作成して自動起動します。

まず、以下の内容で ~/.config/systemd/user/nextcloud.service にデーモンを作成します。この記事を読んでいる人はなーのドッペルゲンガーじゃないはずなので、ユーザー名の部分は自分の名前に置き換えてください。

[Unit]
Description=service for nextcloud
 
[Service]
Restart=always
ExecStart=/usr/bin/podman-compose -f /home/nan1sa/nextcloud/docker-compose.yml up
ExecStop=/usr/bin/podman-compose -f /home/nan1sa/nextcloud/docker-compose.yml down
 
[Install]
WantedBy=default.target

デーモンを作成したら読み込み直して起動します。ユーザーがログインしなくても自動で起動するように linger も有効化します。

$ systemctl --user daemon-reload
$ systemctl --user enable --now nextcloud
$ sudo loginctl enable-linger nan1sa

Cloudflare Tunnel の設定をする

cloudflared は導入済みと仮定します。ログインしてトンネル掘ってサービスを登録します。既に使っている人は適当に無視してください。

# cloudflared tunnel login
# cloudflared tunnel create トンネルの名前 # ここで UUID が出てくるのでメモる
# cloudflared tunnel route dns UUID ドメイン
# mkdir /etc/cloudflared/
# vim /etc/cloudflared/config.yml # ファイルの内容は後述
# cloudflared service install
# systemctl restart cloudflared

config.yml の中身はこんなのです。

tunnel: UUID
credentials-file: /root/.cloudflared/UUID.json

ingress:
    - hostname: ドメイン
      service: http://127.0.0.1:8080
    - service: http_status:404

ブラウザでアクセスする

設定したドメインにアクセスして初期設定画面が表示されれば完了です。もし表示されなかったら頑張ってください。

クライアントでログインできない場合の解決方法

SSL 周りで不都合があるらしく、このままだとスマホアプリやパソコン用同期アプリでログインができないのでログインをできるようにします。

$ podman cp nextcloud_app_1:/var/www/html/config/config.php ./
$ vim config.php # 設定ファイルに 'overwriteprotocol' => 'https' を追加する
$ podman cp config.php nextcloud_app_1:/var/www/html/config/
$ podman exec -it nextcloud_app_1 chown www-data:www-data /var/www/html/config/config.php
$ podman exec -it nextcloud_app_1 chmod 755 /var/www/html/config/config.php

まとめ

クラウドストレージのアプリなのになぜかノートアプリだったりメールクライアントだったりカレンダーアプリだったりが使えるの便利すぎる。

参考にしたサイト