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) の作成
- OCIコンソールにログインします。
- 左上のメニューから Compute -> Instances を選択し、Create Instance をクリックします。
- Name: 分かりやすい名前(例:
inception-server)を入力。 - 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が無難です。
- Image:
- Networking:
- Create new virtual cloud network を選択(初回の場合)。
- Create new public subnet を選択。
- Assign a public IPv4 address が選択されていることを確認。
- Add SSH keys:
- Generate a key pair for me を選び、Save Private Key をクリックして秘密鍵 (
.keyファイル) をPCに保存します。これは再発行できないので絶対に無くさないでください。
- Generate a key pair for me を選び、Save Private Key をクリックして秘密鍵 (
- Create をクリックして作成開始。数分で
Running状態になります。
参考
- Oracle Cloud Free Tier - 公式概要
- Creating an Instance - 公式マニュアル
4. ネットワーク設定 (VCN)
VMが作られましたが、初期状態では外部からのアクセス(Webアクセス)が遮断されています。ファイアウォールを開放します。
4.1 OCIセキュリティリストの設定 (クラウド側の設定)
- インスタンスの詳細画面から、Subnet: ... のリンクをクリックします。
- Security Lists のリンク(Default Security List...)をクリックします。
- Ingress Rules (入ってくる通信) に以下のルールを追加 (Add Ingress Rules) します。
| Source CIDR | IP Protocol | Destination Port Range | Description |
|---|---|---|---|
0.0.0.0/0 | TCP | 80 | HTTP (Let's Encrypt用) |
0.0.0.0/0 | TCP | 443 | HTTPS (Docker Infrastructure本体) |
0.0.0.0/0 | TCP | 22 | SSH (設定済みのはず) |
4.2 VM内部のiptables設定 (OS側の設定)
OCIのUbuntu/Debianイメージは、OS内部でもiptables (netfilter) が有効になっていることが多く、クラウド側で開けても繋がりません。SSHでログインして開放します。
# 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参考
- VCN and Subnets - 公式マニュアル
- Security Lists - 公式マニュアル
5. ドメインとDNS設定
取得したドメイン(例: example.com)が、作成したVMのIPアドレスを指すように設定します。
- OCIコンソールで、VMの Public IP Address をコピーします(例:
123.45.67.89)。 - ドメイン取得業者(レジストラ)の管理画面で、DNSレコード設定 を開きます。
- 以下のAレコードを追加します。
| ホスト名 | レコードタイプ | 値 (Value) |
|---|---|---|
@ (または空欄) | A | 123.45.67.89 (VMのIP) |
www | CNAME | example.com (または @) |
反映まで数分〜数時間かかる場合があります。ping example.com でIPが返ってくるか確認してください。
参考
- Overview of DNS Service - 公式マニュアル (OCI DNSを使う場合)
- DNSの仕組み - JPRS - 基礎知識
6. サーバー内でのSSL証明書取得 (Let's Encrypt)
本プロジェクトでは「自己署名証明書」を使いますが、実運用ではブラウザに警告が出ないよう、Let's Encrypt を使います。 Dockerコンテナ内ではなく、ホストOS側でCertbotを実行し、証明書をコンテナにマウントする 方法が最も簡単で管理しやすいです。
6.1 Certbotのインストール
SSH接続したサーバー上で実行します。
sudo apt update
sudo apt install -y certbot6.2 証明書の取得
※注意: 先にポート80が開放され、DNSが浸透している必要があります。 また、Docker InfrastructureのNginxコンテナがポート80/443を使っていると衝突するので、Dockerを起動する前に実行してください。
# 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 リポジトリのクローンと環境構築
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/mariadb7.2 docker-compose.yml の修正 (または override)
自己署名証明書の代わりに、ホストのLet's Encrypt証明書を読み込むようにマウントパスを変更します。 直接編集するか、docker-compose.override.yml を作成します。
例: docker-compose.yml の volumes 修正イメージ
services:
nginx:
# ...
volumes:
- wordpress:/var/www/html
# ホストの証明書ディレクトリを、コンテナの certs ディレクトリにマウント
- /etc/letsencrypt/live/example.com:/etc/nginx/certs:ro
# ...※ 注意: /etc/letsencrypt はroot権限が必要なため、Dockerコンテナから読み込めない場合があります。権限エラーが出る場合は、証明書をプロジェクト内の secrets ディレクトリ等にコピーするか、ACLを設定してください。 簡易的なコピー運用の例:
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 で指定している証明書ファイル名と、配置したファイル名が一致しているか確認してください。
ssl_certificate /etc/nginx/certs/fullchain.pem; # または server.crt
ssl_certificate_key /etc/nginx/certs/privkey.pem; # または server.key7.4 起動
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 するスクリプトを組むのが一般的です。
# 更新テスト
sudo certbot renew --dry-run