Skip to content

Oracle Cloud Infrastructure (OCI) デプロイメントガイド

このガイドでは、本プロジェクトをOracle Cloud (OCI) のAlways Free枠(無料枠)を利用してインターネット上に公開する手順を解説します。 ユーザーの要望に基づき、学習用(自己署名証明書)ではなく、実運用を想定したLet's EncryptによるSSL化を含めた構成を行います。

目次

1. デプロイメントアーキテクチャ (C4 Model)

以下は、本ガイドで構築するシステムの全体像です。

2. 前提条件

  • Oracle Cloud アカウント: 有効なアカウントを持っていること。
  • 独自ドメイン: お名前.com、Google Domains、Cloudflareなどでドメインを取得済みであること(これがないとLet's Encryptは使えません)。
  • SSHクライアント: ローカルPCからSSH接続できる環境。

3. OCI仮想マシン (VM) の作成

  1. OCIコンソールにログインします。
  2. 左上のメニューから Compute -> Instances を選択し、Create Instance をクリックします。
  3. Name: 分かりやすい名前(例: inception-server)を入力。
  4. Image and Shape:
    • Image: Canoncial Ubuntu または Debian を推奨します(本書ではDebian/Ubuntuベースで解説)。
    • Shape: VM.Standard.E2.1.Micro (Always Free) または VM.Standard.A1.Flex (ARM, Always Free, 高性能) を選択。
    • Note: DockerはARMアーキテクチャでも動作しますが、マルチアーキテクチャビルドが必要になる場合があります。トラブルを避けるならAMDプロセッサの E2.1.Micro が無難です。
  5. Networking:
    • Create new virtual cloud network を選択(初回の場合)。
    • Create new public subnet を選択。
    • Assign a public IPv4 address が選択されていることを確認。
  6. Add SSH keys:
    • Generate a key pair for me を選び、Save Private Key をクリックして秘密鍵 (.keyファイル) をPCに保存します。これは再発行できないので絶対に無くさないでください。
  7. Create をクリックして作成開始。数分で Running 状態になります。

参考

4. ネットワーク設定 (VCN)

VMが作られましたが、初期状態では外部からのアクセス(Webアクセス)が遮断されています。ファイアウォールを開放します。

4.1 OCIセキュリティリストの設定 (クラウド側の設定)

  1. インスタンスの詳細画面から、Subnet: ... のリンクをクリックします。
  2. Security Lists のリンク(Default Security List...)をクリックします。
  3. Ingress Rules (入ってくる通信) に以下のルールを追加 (Add Ingress Rules) します。
Source CIDRIP ProtocolDestination Port RangeDescription
0.0.0.0/0TCP80HTTP (Let's Encrypt用)
0.0.0.0/0TCP443HTTPS (Docker Infrastructure本体)
0.0.0.0/0TCP22SSH (設定済みのはず)

4.2 VM内部のiptables設定 (OS側の設定)

OCIのUbuntu/Debianイメージは、OS内部でもiptables (netfilter) が有効になっていることが多く、クラウド側で開けても繋がりません。SSHでログインして開放します。

bash
# SSH接続 (秘密鍵のパーミッションは600にしておくこと)
chmod 600 path/to/your-key.key
ssh -i path/to/your-key.key ubuntu@<VMのPublic-IP>

# iptablesルールの全削除(開発用設定。本番ではもっと厳密に管理推奨)
sudo iptables -F
sudo netfilter-persistent save
# または、ufwを使う場合
sudo ufw allow 80/tcp
sudo ufw allow 443/tcp
sudo ufw allow 22/tcp
sudo ufw reload

参考

5. ドメインとDNS設定

取得したドメイン(例: example.com)が、作成したVMのIPアドレスを指すように設定します。

  1. OCIコンソールで、VMの Public IP Address をコピーします(例: 123.45.67.89)。
  2. ドメイン取得業者(レジストラ)の管理画面で、DNSレコード設定 を開きます。
  3. 以下のAレコードを追加します。
ホスト名レコードタイプ値 (Value)
@ (または空欄)A123.45.67.89 (VMのIP)
wwwCNAMEexample.com (または @)

反映まで数分〜数時間かかる場合があります。ping example.com でIPが返ってくるか確認してください。

参考

6. サーバー内でのSSL証明書取得 (Let's Encrypt)

本プロジェクトでは「自己署名証明書」を使いますが、実運用ではブラウザに警告が出ないよう、Let's Encrypt を使います。 Dockerコンテナ内ではなく、ホストOS側でCertbotを実行し、証明書をコンテナにマウントする 方法が最も簡単で管理しやすいです。

6.1 Certbotのインストール

SSH接続したサーバー上で実行します。

bash
sudo apt update
sudo apt install -y certbot

6.2 証明書の取得

※注意: 先にポート80が開放され、DNSが浸透している必要があります。 また、Docker InfrastructureのNginxコンテナがポート80/443を使っていると衝突するので、Dockerを起動する前に実行してください。

bash
# 80番ポートを使って証明書を取得 (Standaloneモード)
sudo certbot certonly --standalone -d example.com -d www.example.com

成功すると、以下のパスに証明書が保存されます。

  • 証明書 (CRT): /etc/letsencrypt/live/example.com/fullchain.pem
  • 秘密鍵 (KEY): /etc/letsencrypt/live/example.com/privkey.pem

参考

7. Docker Infrastructureのデプロイと起動

取得した証明書を使うように、Docker Infrastructureの設定を少し変更して起動します。

7.1 リポジトリのクローンと環境構築

bash
git clone https://github.com/YourRepo/Docker Infrastructure.git
cd Docker Infrastructure
# 必要なディレクトリ作成(Makefileがあれば make setup 等)
mkdir -p /home/ubuntu/data/wordpress
mkdir -p /home/ubuntu/data/mariadb

7.2 docker-compose.yml の修正 (または override)

自己署名証明書の代わりに、ホストのLet's Encrypt証明書を読み込むようにマウントパスを変更します。 直接編集するか、docker-compose.override.yml を作成します。

例: docker-compose.yml の volumes 修正イメージ

yaml
services:
  nginx:
    # ...
    volumes:
      - wordpress:/var/www/html
      # ホストの証明書ディレクトリを、コンテナの certs ディレクトリにマウント
      - /etc/letsencrypt/live/example.com:/etc/nginx/certs:ro
    # ...

注意: /etc/letsencrypt はroot権限が必要なため、Dockerコンテナから読み込めない場合があります。権限エラーが出る場合は、証明書をプロジェクト内の secrets ディレクトリ等にコピーするか、ACLを設定してください。 簡易的なコピー運用の例:

bash
sudo cp /etc/letsencrypt/live/example.com/fullchain.pem ./srcs/requirements/nginx/tools/server.crt
sudo cp /etc/letsencrypt/live/example.com/privkey.pem ./srcs/requirements/nginx/tools/server.key
# 権限調整
sudo chown $USER:$USER ./srcs/requirements/nginx/tools/server.*

(この場合、証明書更新のたびにコピーし直す必要があります。自動化するにはフックスクリプトが必要です)

7.3 Nginx設定の確認

srcs/requirements/nginx/conf/nginx.conf で指定している証明書ファイル名と、配置したファイル名が一致しているか確認してください。

nginx
ssl_certificate /etc/nginx/certs/fullchain.pem; # または server.crt
ssl_certificate_key /etc/nginx/certs/privkey.pem; # または server.key

7.4 起動

bash
make all
# または
docker compose -f srcs/docker-compose.yml up -d --build

ブラウザで https://example.com にアクセスし、鍵マークが正常に表示されれば成功です!

8. 補足: 証明書の自動更新

Let's Encryptの証明書は90日で切れます。 cron などで certbot renew を実行し、更新されたら Nginx コンテナを reload するスクリプトを組むのが一般的です。

bash
# 更新テスト
sudo certbot renew --dry-run

Released under the MIT License.