きっかけ
こどもが生まれて写真と動画を撮りまくっていたら、あっという間にクラウドが容量オーバーになりました。写真や動画を消すことがないとすると、課金が増える一方なので、いっそのことオンプレミスでサーバーを立てることにしました。
ゴール
- Raspberry Pi5に、DockerでNextCloudをインストール
- Apache2.4のリバースプロキシを利用して、サブディレクトリnextcloud以下で公開
- バックアップを設定
ハードウェア&OS
ルーター | ASUS RT-AX59U |
ラズパイ | Raspberry Pi5 |
Nvme HAT | Geekworm X1001 PCIe to M.2 Key-M |
SSD | Team M.2 2280 NVMe PCIe Gen4x4 SSD 8TB |
バックアップ用HDD | WDC WD80 EAZZ-00BKLB0 ×2 |
バックアップ用HDDケース | RATOC RS-EC32-U31RZ |
OSイメージを作成するため(あると便利) | M.2 NVME SSD-USBケース |
OS | Debian BookWorm 64bit |
ルーターの設定
-
ルーターに外部からアクセスできるようにDDNSを設定します
-
Webアクセス(特に443番ポート)をRaspberry Pi5に転送したいので、管理画面を8443にします
-
ラズパイ側でSSL証明書を利用できるように、ルーターにsshでログインできるようにします1
-
ラズパイには固定プライベートIPが割り当てられるようDHCPに設定します
-
ルーターの管理画面、詳細設定[WAN]の[ポートフォワーディング]から設定します
TCPの80番、TCPの443番、TCP/UDPの3478番(TALK用)、これらをDHCPに設定したIPへ飛ばします
ラズパイの設定
-
8TBのSSDからブートできるようにします2
-
ルーターからLet's Encrypt無料SSL証明書をとってきます
(例:/root/.ssh/id_rsaがルーターにコピーしたラズパイの証明書、ルーターへのssh接続が192.168.0.1の2022番ポート、hogehoge.asuscomm.comで公開)ssh -i /root/.ssh/id_rsa -p 2022 admin@192.168.0.1 "cat /jffs/.le/hogehoge.asuscomm.com_ecc/fullchain.pem" > /etc/letsencrypt/live/hogehoge.asuscomm.com/fullchain.pem ssh -i /root/.ssh/id_rsa -p 2022 admin@192.168.0.1 "cat /jffs/.le/hogehoge.asuscomm.com_ecc/domain.key" > /etc/letsencrypt/live/hogehoge.asuscomm.com/privkey.pem
ルーターにsshログインして、証明書の場所(/jffs/.le/hogehoge.asuscomm.com_ecc)は確認したほうがよさそうです
ついでに、cronにjob投入しておくとよいかもしれません -
NextCloudのインストール
-
公式3に従って、Dockerもaptパッケージではなく、公式からとってきます
curl -fsSL https://get.docker.com | sudo sh
-
NextCloudのインストール(127.0.0.1:11000を通じてReverse Proxyします)
# For Linux and without a web server or reverse proxy (like Apache, Nginx, Cloudflare Tunnel and else) already in place: sudo docker run \ --init \ --sig-proxy=false \ --name nextcloud-aio-mastercontainer \ --restart always \ --publish 8080:8080 \ --env APACHE_PORT=11000 \ --env APACHE_IP_BINDING=127.0.0.1 \ --volume nextcloud_aio_mastercontainer:/mnt/docker-aio-config \ --volume /var/run/docker.sock:/var/run/docker.sock:ro \ --env NEXTCLOUD_DATADIR="/storage/ncdata" \ nextcloud/all-in-one:latest
データの保存先は/storage/ncdataになってます
-
config.phpの編集
コンテナの中だとviしか使えないので、一旦ローカルに保存sudo docker cp nextcloud-aio-nextcloud:/var/www/html/config/config.php config.php
適当なエディタで編集
#'overwritehost'のあとにサブディレクトリを追加 'overwritewebroot' => '/nextcloud',#'htaccess.RewriteBase'は変更不要だった #最後に追加 'default_phone_region' => 'JP',
必ずUIDとGIDをwww-dataにしてから、コンテナにもどす
sudo chown www-data:www-data config.php sudo docker cp config.php nextcloud-aio-nextcloud:/var/www/html/config/config.php
-
-
Apache2の設定(インストールは、aptパッケージから)
- Reverse Proxy等に必要なモジュールの読み込み
sudo a2enmod proxy_http sudo a2enmod ssl sudo a2enmod headers
- NextCloudをサブディレクトリで運用する設定を/etc/apache2/sites-available/nextcloud.confに作成
<VirtualHost *:443> ServerName hogehoge.asuscomm.com # SSL configuration SSLEngine on SSLProtocol +TLSv1.2 +TLSv1.3 SSLCipherSuite HIGH:!MEDIUM:!LOW:!aNULL:!MD5:!RC4 SSLHonorCipherOrder on SSLCompression off SSLCertificateFile /etc/letsencrypt/live/hogehoge.asuscomm.com/fullchain.pem SSLCertificateKeyFile /etc/letsencrypt/live/hogehoge.asuscomm.com/privkey.pem AllowEncodedSlashes NoDecode # Specific proxy and security configurations for Nextcloud <Location /nextcloud> ProxyPreserveHost On # Reverse proxy configuration ProxyPass http://localhost:11000 nocanon ProxyPassReverse http://localhost:11000 RewriteRule ^/\.well-known/carddav /nextcloud/remote.php/dav [R=301,L] RewriteRule ^/\.well-known/caldav /nextcloud/remote.php/dav [R=301,L] RewriteRule ^/\.well-known/webfinger /nextcloud/index.php/.well-known/webfinger [R=301,L] RewriteRule ^/\.well-known/nodeinfo /nextcloud/index.php/.well-known/nodeinfo [R=301,L] # Security headers for Nextcloud Header always set Strict-Transport-Security "max-age=15768000; includeSubDomains" Header always set X-Content-Type-Options nosniff Header always set X-Frame-Options "SAMEORIGIN" Header always set X-XSS-Protection "1; mode=block" Header always set Referrer-Policy "no-referrer-when-downgrade" </Location> </VirtualHost>
- Apacheのリスタート
sudo a2ensite nextcloud sudo systemctl restart apache2
- Reverse Proxy等に必要なモジュールの読み込み
-
ブラウザーから、ラズパイIP:8080にアクセスして、urlをhogehoge.asuscomm.comに設定、NextCloud 29にチェックをいれる(29.0.1になって、初回ログインの不具合が解消されてます)
BorgBackupを有効化する前に、バックアップ用の外付けHDDディスクをマウントしておきます。わが子の成長記録を保存するので、かならずRAIDを組んで冗長化しておきます。万が一のサルベージのためにも、フォーマットはNTFSかext4がおすすめです。Docker版NextCloudはpostgreがインストールされ、データベースとして利用されるようです。データベースもバックアップを取らないと/storage/ncdataのバックアップだけではリストアできません。BorgBackupはまとめてバックアップを取ってくれますが、リストアしない限り、バックアップファイルから直接、写真などは戻せないのではないかと思います。
結果
iphoneやAndroidのNextCloudアプリから家族で写真を共有できるようになりました。
ラズパイのLAN接続は、Wifiではなく、1G対応ケーブルで有線接続がおすすめです。
5V5A環境では、NVMEをdtparam=pciex1_gen=3で安定的に稼働できています。
WebDav関係でセットアップに関する警告が出てますが、問題なくWebDavでファイル転送できてます。