
自宅サーバー構築記録③──OpenCloud導入
Docker + Nginx + Cloudflare Tunnelの構成でOpenCloudを構築した記録です。ポート開放なしにHTTPS公開するまでを解説します。
はじめに
自宅にプライベートなクラウドストレージを持つためにOpenCloudを導入しました。
OpenCloudはNextcloudのフォーク(後継プロジェクト)で、よりDocker・モダンな構成に最適化されています。自分はNextcloudのsnap版から手動PHP構成、さらにOpenCloudへと移行してきましたが、現在のDocker構成が圧倒的にシンプルで安定しています。
この記事では以下を構築します。
OpenCloudをDockerで起動
NginxをリバースプロキシとしてHTTPアクセスを中継
Cloudflare Tunnelでポート開放なしにHTTPS公開
スマホ・PCからアクセスできる環境
前提:
Ubuntu 24.04サーバーが稼働していること
DockerおよびDocker Composeがインストール済み
Cloudflareにドメインが登録済み(記事②参照)
なぜCloudflare Tunnelを使うか
v6プラス(IPoE)環境ではポート80・443を外部に開放できません。
Cloudflare Tunnelはサーバー側からCloudflareに向けてアウトバウンド接続するため、ファイアウォールのインバウンドポート開放が一切不要です。HTTPS証明書もCloudflareが自動で管理してくれます。
ステップ1:Cloudflare Tunnelの作成
cloudflaredのインストール
curl -L --output cloudflared.deb https://github.com/cloudflare/cloudflared/releases/latest/download/cloudflared-linux-amd64.deb
sudo dpkg -i cloudflared.deb
Tunnelの作成・認証
# Cloudflareへの認証(ブラウザが開く)
cloudflared tunnel login
# Tunnelを作成
cloudflared tunnel create my-server
実行後、以下が生成されます(いずれも重要):
Tunnel ID: xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx
認証ファイル: ~/.cloudflared/xxxxxxxx-...-xxxx.json
設定ファイルの作成
/etc/cloudflared/config.yml:
tunnel: YOUR_TUNNEL_ID
credentials-file: /home/your-username/.cloudflared/YOUR_TUNNEL_ID.json
ingress:
- hostname: cloud.your-domain.com
service: http://localhost:80
- service: http_status:404
DNS CNAMEレコードの追加
cloudflared tunnel route dns YOUR_TUNNEL_ID cloud.your-domain.com
またはCloudflare Dashboard → DNS → レコード追加:
タイプ: CNAME
名前: cloud
内容: YOUR_TUNNEL_ID.cfargotunnel.com
プロキシ: オン(オレンジ雲)
systemdサービスとして登録
sudo cloudflared service install
sudo systemctl enable --now cloudflared
ステップ2:ディレクトリ構成の準備
sudo mkdir -p /opt/opencloud/config
sudo mkdir -p /media/DATA/opencloud/data
/opt/opencloud/ ── docker-compose.ymlの置き場
/opt/opencloud/config/ ── OpenCloud設定ファイル(コンテナ内 /etc/opencloud にマウント)
/media/DATA/opencloud/data/ ── ユーザーデータ(コンテナ内 /var/lib/opencloud にマウント)
データを /media/DATA/ に置くことで、OSドライブとは別の大容量HDDに分離できます。
ステップ3:Nginxリバースプロキシの設定
OpenCloudコンテナはポート9200でHTTPを提供します。Cloudflare TunnelはNginxのポート80にリクエストを送り、Nginxがそれを9200のOpenCloudに転送します。
sudo apt install -y nginx
/etc/nginx/sites-available/opencloud:
server {
listen 80;
server_name localhost;
client_max_body_size 0;
location / {
proxy_pass http://127.0.0.1:9200;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto https;
proxy_read_timeout 3600;
proxy_send_timeout 3600;
proxy_buffering off;
}
}
sudo ln -s /etc/nginx/sites-available/opencloud /etc/nginx/sites-enabled/
sudo rm -f /etc/nginx/sites-enabled/default
sudo nginx -t && sudo systemctl reload nginx
client_max_body_size 0 は必須です。制限があると大きなファイルのアップロードが途中で失敗します。
ステップ4:docker-compose.yml の作成
/opt/opencloud/docker-compose.yml:
services:
opencloud:
image: opencloudeu/opencloud-rolling:latest
container_name: opencloud
restart: unless-stopped
environment:
- OC_INSECURE=false
- PROXY_HTTP_ADDR=0.0.0.0:9200
- OC_URL=https://cloud.your-domain.com
- OC_LOG_LEVEL=warn
- INITIAL_ADMIN_PASSWORD=your-strong-admin-password
volumes:
- /opt/opencloud/config:/etc/opencloud
- /media/DATA/opencloud/data:/var/lib/opencloud
ports:
- "9200:9200"
entrypoint: ["/bin/sh", "-c", "[ -f /etc/opencloud/opencloud.yaml ] || opencloud init; opencloud server"]
起動
cd /opt/opencloud
sudo docker compose up -d
# ログ確認
sudo docker logs opencloud --tail 50
初回起動時は設定の初期化が走るため、完了まで1〜2分かかります。
ステップ5:初期設定と管理者パスワードの変更
ブラウザで https://cloud.your-domain.com にアクセスします。
ログイン:
ユーザー名: admin
パスワード: docker-compose.ymlで設定した INITIAL_ADMIN_PASSWORD
ログイン後、必ず管理者パスワードを変更してください。
右上アバター → Settings → Security → Change password
変更後、docker-compose.ymlの INITIAL_ADMIN_PASSWORD も更新しておきます(コンテナを再作成した場合に備えて)。
ステップ6:クライアントアプリからの接続
Windows / Mac(ブラウザ): https://cloud.your-domain.com を開いてログイン
Windows(デスクトップ同期): Microsoft Store「OpenCloud」→ サーバーアドレスに https://cloud.your-domain.com
Android: Play ストア「OpenCloud」→ サーバーアドレスを入力
iPhone / iPad: App Store「OpenCloud」→ サーバーアドレスを入力
大容量ファイルはWireGuard経由で
Cloudflare Tunnelには100MBのアップロード制限があります。100MBを超えるファイルをアップロードする場合はWireGuard VPNで接続してから直接アクセスします。
WireGuard VPNに接続(記事②参照)
ブラウザで http://10.0.0.1 にアクセス(ポート80、HTTP)
ファイルサイズ制限なしでアップロード可能
サービス管理コマンド
# 起動・停止・再起動
cd /opt/opencloud
sudo docker compose up -d
sudo docker compose down
sudo docker compose restart opencloud
# ログ確認
sudo docker logs opencloud --tail 50
# バージョン確認
sudo docker exec opencloud opencloud version
# イメージ更新
sudo docker compose pull
sudo docker compose up -d
トラブルシューティング
Cloudflare TunnelにアクセスしてもHTTP 502が返ってくる
OpenCloudコンテナが起動しているか確認 sudo docker ps | grep opencloud curl -s -o /dev/null -w "%{http_code}" http://localhost:9200
Nginxが動いているか確認 sudo systemctl status nginx
cloudflaredが動いているか確認 sudo systemctl status cloudflared
コンテナは起動しているがcurlが000を返す
OpenCloudの初期化(opencloud init)が対話プロンプトを出してSTDIN待ちになっている可能性があります。
sudo docker logs opencloud --tail 30
ログに対話プロンプトが表示されていたら、entrypointを以下に変更してコンテナを再作成します:
entrypoint: ["/bin/sh", "-c", "yes | opencloud init || true; opencloud server"]
sudo docker compose down && sudo docker compose up -d
アップロードが途中で失敗する
Nginxの client_max_body_size 0 が設定されているか確認:
sudo nginx -T | grep client_max_body_size
まとめ
Cloudflare Tunnel でポート開放なしにHTTPS公開
Nginx をリバースプロキシとしてポート80 → 9200に中継
データは別ドライブ (/media/DATA/) に分離してOSと独立
100MB超のファイル はWireGuard VPN経由で直接アクセス
次の記事④では、Home AssistantをDockerで導入し、SwitchBotと連携させ、Cloudflare Tunnelで外部公開するまでの手順を解説します。