メインコンテンツへスキップ
見出し画像

自宅サーバー構築記録③──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で接続してから直接アクセスします。

    1. WireGuard VPNに接続(記事②参照)

    2. ブラウザで http://10.0.0.1 にアクセス(ポート80、HTTP)

    3. ファイルサイズ制限なしでアップロード可能


    サービス管理コマンド

    # 起動・停止・再起動
    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が返ってくる

    1. OpenCloudコンテナが起動しているか確認 sudo docker ps | grep opencloud curl -s -o /dev/null -w "%{http_code}" http://localhost:9200

    2. Nginxが動いているか確認 sudo systemctl status nginx

    3. 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で外部公開するまでの手順を解説します。

     
     

    Sone

     
     
    新しいことを試すのが好きな趣味人。自宅サーバ構築やガジェット弄りなど、気になったらとりあえず手を動かしてみるタイプ。学んだことをここに残していきます。

    あなたへのおすすめ