概要
以前、Windows 11上の「WSL2 + Docker」で自宅Nextcloudを構築・運用していました。
本記事では、Proxmox VE 上の LXC に Nextcloud AIO(All-in-One) を構築し、旧環境からデータを移行する手順を記します。
本環境のポイント
-
設計方針:
インターネットには公開せず、自宅LAN内限定でNextcloud AIOを利用する。
セキュリティを考慮し、自宅ルータのポート開放は一切行わない。 -
技術的課題:
Nextcloud AIOは、正規ドメインとHTTPS通信(SSL証明書)を強く求めてきますが、通常、SSL証明書(Let's Encryptなど)を取得・更新するには、自宅ルータのポート開放が必要になります。
また、自宅ルータにDNS設定機能がないため、ドメイン名をローカルIPアドレスに解決させる手段も必要です。 -
解決策:
「ポートは開けたくないが、HTTPS は使いたい」という矛盾を解決するため、以下の手法を採用しました。- CloudflareのAPI(DNS-01チャレンジ) を利用し、LAN内に閉じたままSSL証明書を自動取得・更新する。
- CloudflareのDNS で、ドメイン名を自宅のローカルIPアドレスへ名前解決させる。
イメージ図
関連記事
旧Nextcloud構築時の記事:
Windows11にwsl2+Dockerで自宅Nextcloud構築
自宅サーバ構築記シリーズ:
【自宅サーバ構築記①】自作PCの組み立てとProxmox VE導入
システム環境
物理構成(ホスト)
CPU: AMD Ryzen 7 7700 (8C/16T)
GPU: RTX 5060 Ti 16GB × 2枚
メモリ: ADATA DDR5-6000 64GB (32GB × 2)
マザーボード: MSI MAG B850 TOMAHAWK MAX WIFI
ストレージ: Samsung 870 EVO 500GB (SSD) / SANDISK WD_Black SN7100 1TB (NVMeSSD) / WD Red Plus 4TB (HDD)
電源: Corsair RM850e ATX 3.0 (850W)
ケース: Fractal Design Meshify 2 RGB Black TG Light Tint
CPUクーラー: Scythe Mugen 6 Black Edition
仮想環境(ゲスト:LXC)
本サービス用に Proxmox VE 上で割り当てたリソース構成です。
-
Nginx Proxy Manager
CPU: 1 Cores
メモリ: 1GB
ディスク: 20GB (SSD領域)
OS: Debian 12 (standard)
-
Nextcloud AIO
CPU: 8 Cores
メモリ: 4GB
ディスク: 50GB (SSD領域)
マウントポイント: /mnt/ncdata (HDD 2TBをマウント)
OS: Debian 13 (standard)
目次
- ドメインの取得とCloudflareへの登録
- Nginx Proxy Manager の構築
- Nextcloud AIO の構築
- クライアント(Windows PC および Android)とデータ同期
1. ドメインの取得とCloudflareへの登録
今回の構成の最大のポイントは、「インターネットに公開せず、自宅LAN内だけで使うのに、わざわざ独自ドメインを取得する」 という点です。
その背景には、以下の理由があります。
-
Nextcloud AIOの仕様
Nextcloud AIOはセキュリティ上、正規ドメインとHTTPS通信(SSL証明書) を強く求めてきます。基本的に、IPアドレス(http://192.168.xxx.xxx)のままでは初期セットアップの時点でエラーが出てうまくいきません。 -
ポート開放のリスク回避
通常、正規のSSL証明書(Let's Encrypt)を無料で取得するには、自宅ルータのポートを開けてインターネット側からアクセスさせる必要がありますが、セキュリティ上やりたくありません。
そこで「Cloudflare」を利用します。
CloudflareのDNS機能とAPIを使えば、自宅ルータのポートを開けることなく、正規のSSL証明書を自動取得・更新することができる「DNS-01チャレンジ」が利用可能になります。
1.1. Cloudflareでドメインを取得
Cloudflareでドメインを取得します。
ドメイン取得にはお金がかかります。
ここではドメイン名を hogehoge.com(仮) とします。
1.2. トークンの作成
画面右上の ユーザーアイコン > プロフィール > APIトークン > 「トークンを作成する」をクリック
→[APIトークンテンプレート(API token templates)]の下の ゾーンDNSを編集する(Edit zone DNS) の右の「テンプレートを使用する(Use template)」をクリック
→権限(Permissions)セクションで、ゾーン,DNS,編集が選択されていることを確認
→ゾーンリソースセクションで、「含む」「特定のゾーン」「hogehoge.com」を選択
→最終確認をして「トークンを作成する」をクリック。
※ここで表示されたトークンを控えておきます。
2. Nginx Proxy Manager の構築
次に、Nginx Proxy Manager(NPM)を構築します。NPMは、Cloudflare API による 「SSL証明書の自動取得・終端」と、ドメイン名による「Nextcloud AIO へのルーティング(リバースプロキシ)」を担います。
2.1. LXCコンテナの作成
ProxmoxのGUIから、Debian 12テンプレートを用いてLXCコンテナを作成します。
- CPU: 1 Cores
- メモリ: 1024 MiB
-
ネットワーク: Static IP (例:
192.168.0.102/24) - ディスク: 20GB (local-lvm / SSD領域)
- オプション: 作成後、コンテナの[Options]タブを開き、「keyctl」にチェックを入れます。
2.2. Docker環境のセットアップ
LXCのコンソールに入り、パッケージリストを更新後、Dockerをインストールします。
apt update
apt upgrade -y
apt install -y curl gnupg2 software-properties-common ca-certificates apt-transport-https
curl -fsSL https://get.docker.com -o get-docker.sh
sh get-docker.sh
2.3. NPM のデプロイ
Docker Compose を使って NPM を立ち上げる。
- ディレクトリ作成
mkdir -p /opt/npm
cd /opt/npm
- 設定ファイルの作成
nano docker-compose.yml を実行し、以下の内容を貼り付けて保存(Ctrl+O, Enter, Ctrl+X)します。
services:
app:
image: 'jc21/nginx-proxy-manager:latest'
restart: unless-stopped
ports:
- '80:80' # HTTP用
- '81:81' # 管理画面用
- '443:443' # HTTPS用
volumes:
- ./data:/data
- ./letsencrypt:/etc/letsencrypt
- 起動
docker compose up -d
2.4. NPM 初期ログインと管理画面の確認
ブラウザから NPM の管理画面にアクセスします。
- URL: http://192.168.0.102:81
- Full Name: root
- 初期メールアドレス: admin@example.com
-
初期パスワード: changeme
→名前、メールアドレス、パスワードを変更します。
NPM の画面上部にある Certificates > Add Certificate > 「Let's Encrypt via DNS」 を選択
-
Domain Names欄: 「例:
hogehoge.com」と「例:*.hogehoge.com」を入力。 - Key Type欄: ECDSA 256(デフォルトのまま)
- DNS Provider欄: 「Cloudflare」を選択。
- Credentials File Content欄: ※Cloudflareで取得したトークンに書き換える。
-
Propagation Seconds: 120
→Saveをクリックします。
→2分ほど待つとCertificates画面に遷移。追加されたことを確認します。
2.5. ドメイン(hogehoge.com)と Nextcloud AIO を紐付ける作業
ステップ1:Cloudflare で DNS 設定(Aレコード)の追加
家の中の端末が cloud.hogehoge.com にアクセスした時に、NPM(192.168.0.102)へ辿り着けるようにします。
- Cloudflare のダッシュボードで 「DNS」>「レコード」 を開く。
- 「レコードの追加」 をクリック。
タイプ: A
名前: cloud (これでcloud.hogehoge.comになる)
IPv4アドレス: 192.168.0.102 (NPM のローカルIP)
プロキシステータス: 「DNSのみ」
ステップ2:NPM で「Proxy Host」の設定
ドメインへのアクセスを、Nextcloud AIO コンテナへ受け流す設定を作ります。
- NPM 管理画面の 「Hosts」>「Proxy Hosts」 を開き、「Add Proxy Host」 をクリックします。
[Details]タブ
Domain Names: cloud.hogehoge.com
Scheme: http
Forward Hostname / IP: 192.168.0.101 (Nextcloud AIO LXCのIP)
Forward Port: 11000 (AIO の Apache コンテナが標準で待ち受けるポート)
Websockets Support: ON
[SSL]タブ
SSL Certificate: 先ほど作成した *「hogehoge.com, .hogehoge.com」 を選択します。
Force SSL: ON
HTTP/2 Support: ON
HSTS Enabled: ON
→「Save」 をクリック。STATUS が「Online」に変わったことを確認します。
3. Nextcloud AIO の構築
今回、ストレージは、パフォーマンスと容量単価を考慮し、「システム領域はSSD、データ保存先はHDD」 に分離する設計をとります。
3.1. LXCコンテナの作成
ProxmoxのGUIから、Debian 13テンプレートを用いてLXCコンテナを作成します。
- CPU: 8 Cores
- メモリ: 4096 MiB
-
ネットワーク: Static IP (例:
192.168.0.101/24) - ディスク: 50GB (local-lvm / SSD領域)
- オプション: 作成後、コンテナの[Options]タブを開き、「keyctl」にチェックを入れます。
※最初はCPUを2コアに設定していたのですが、HEVC(H.265)で撮影した動画を再生すると、音声だけが流れたり、そもそも再生が進まなかったりしました。原因は、Nextcloud(Memories)上でHEVC動画を再生するには、「サーバのCPUやGPUを使って、再生する瞬間にリアルタイムでH.264に変換しながらブラウザに送る」という処理が発生するため、2コアでは足りていなかったようです。本環境では、CPUを2コアから8コアに変更することで解消しました。
3.2. データ用HDD(ZFSプール)をコンテナにマウントする
ユーザがアップロードするファイルを物理HDDに保存するため、Proxmoxホスト上のZFSプール(data-hdd)の領域を、LXC内にマウントします。
- 左メニューから作成したコンテナ(例: 100 (nextcloud))を選択
- Resources > Add > Mount Point を開き、以下を設定
Storage: data-hdd
Disk size(GiB): 2000
Path: /mnt/ncdata
3.3. Docker環境のセットアップ
LXCのコンソールに入り、パッケージリストを更新後、Dockerをインストールします。
apt update
apt upgrade -y
apt install -y curl
curl -fsSL https://get.docker.com -o get-docker.sh
sh get-docker.sh
3.4. Nextcloud AIOのデプロイ
今回は前段にNginx Proxy Manager(NPM)を配置するため、Nextcloud AIOをリバースプロキシ対応オプション付きで起動します。ここで「データ保存先を先ほどマウントした物理HDD(/mnt/ncdata)に向ける」環境変数を指定します。
docker run \
--init \
--sig-proxy=false \
--name nextcloud-aio-mastercontainer \
--restart always \
--publish 8080:8080 \
--env APACHE_PORT=11000 \
--env APACHE_IP_BINDING=0.0.0.0 \
--env SKIP_DOMAIN_VALIDATION=true \
--env NEXTCLOUD_DATADIR="/mnt/ncdata" \
--volume nextcloud_aio_mastercontainer:/mnt/docker-aio-config \
--volume /var/run/docker.sock:/var/run/docker.sock:ro \
-d \
nextcloud/all-in-one:latest
ポイント1: 「APACHE_PORT=11000」を指定することで、AIO内部のWebサーバ(Apache)が443番ポート(HTTPS)を強制しなくなり、NPMからのHTTP(11000番) 通信を受け入れるようになります。
ポイント2: 「SKIP_DOMAIN_VALIDATION=true」を指定することで、ドメイン検証(AIOの自己診断)をスキップさせます。今回の構成はNPMがリバースプロキシとして前段に存在するため、ドメイン検証(AIOの自己診断)が失敗するのでスキップさせます。
ポイント3: 「NEXTCLOUD_DATADIR="/mnt/ncdata"」を指定することで、NextcloudのデータがHDDに保存されます。
3.5. 管理画面での初期設定
- ブラウザで
https://192.168.0.101:8080(AIO 管理画面) を開き、画面に表示されるパスフレーズを控えてログインします。 - 「New AIO instance」の画面で、リバースプロキシ(NPM)側で設定したドメイン(
cloud.hogehoge.com)を入力して「Submit domain」をクリックします。 - Additional Optional Containersは、「Imaginary」のみチェックを入れ、Community Containersは、「Computing container for facerecognition」と「Memories Transcoder」のみチェックを入れます。その他の重い機能(TalkやOfficeなど)はリソース節約のためにチェックを外します。
- 「Install Nextcloud Hub 26 Winter (if unchecked, Nextcloud Hub 25 Autumn will get installed)」にチェックを入れて、「Download and start containers」 をクリック。
→10分ほど待つと起動が完了した。
4. クライアント(Windows PC および Android)とデータ同期
今回はシンプルかつクリーンにデータ移行を済ませるため、「旧Nextcloudと同期を取っていたWindows PCから、新Nextcloudへ同期をかける」アプローチを採用します。
※ネットワーク経由で大量の同期処理が発生するため時間がかかります。今回は230GB程度だったのでこのアプローチを採用しました。
4.1. PC側の旧同期データベースの掃除
古い同期情報が残っていると、新サーバとの同期開始時に不要な競合エラーや警告の原因になる可能性があるため、念のため、事前に掃除を行います。
- Windows PCの同期対象フォルダ(例:
F:\Nextcloud_sync)を開きます。 - エクスプローラの「表示」>「隠しファイル」にチェックを入れます。
- フォルダ直下にある、以下の古いメタデータ・ログファイルを削除します。
.nextcloudsync.log.sync_xxxxxxxxxxxx.db.sync_xxxxxxxxxxxx.db-shm.sync_xxxxxxxxxxxx.db-wal
4.2. 新Nextcloud側でのユーザ受け入れ準備
NextcloudのWeb画面に管理者(admin)でログインし、旧Nextcloudと同様のユーザとグループを用意します。
4.3. Windows PC(クライアント)からの同期実行
- PCのNextcloudデスクトップアプリを開き、旧アカウントを「削除」します。
- 新NextcloudのURL(
https://cloud.hogehoge.com)にログインし、同期先として既存のフォルダ群(例: F:\Nextcloud_sync)を指定します。 - 「サーバーからすべてのファイルを同期する」「ローカルデータを保持」を選択して同期を開始します。これにより、PC内のフォルダ群(
例: F:\Nextcloud_sync)が新Nextcloudへアップロードされます。
4.4. スマホ(Android)からの同期実行
- 設定 > アプリ > Nextcloud > 「ストレージとキャッシュ」 > 「ストレージを消去(またはデータを消去)」 と 「キャッシュを削除」 の両方を実行する。(※これにより、旧Nextcloudの情報が消えて、アプリがインストール直後のまっさらな状態に戻る。)
- Nextcloudアプリを開き、新Nextcloudに新アカウントでログインする。(サーバーアドレスの欄に https://cloud.hogehoge.com と入力する。)
- 自動アップロードの設定は、「既存のファイルもアップロード」のチェックを外し、最終同期時点から現時点までの分は手動でアップロードする。
おわりに
旧Nextcloud環境はお試しのつもりでミニPCに構築していましたが、しばらく運用して便利だったので、今後も長期的に利用したいと考えるようになりました。
そこで、今回、自宅サーバへ移行すると同時に、通常のNextcloudからNextcloud AIOへの刷新を行いました。これにより、今後のアップデートや管理が、よりシンプルに運用できるようになりました。
次回は、ローカルLLM環境を構築していきます。
