EXP-001 / STATUS: ONLINE

Building
Midnight Bench

Cloudflare + OCI + Docker + Caddy + GitHub Actionsで、 深夜の実験場を作る。
2026.09.06
※この記事に記載するホスト名、アカウント名、IPアドレスなどの 環境固有情報は、公開用に省略または一般化しています。
00 — INTRO

Things made after midnight.

Midnight Benchを始めることにした。

名前の通り、深夜に何かを作るための作業台。

Software / Hardware / Experiments.

Webサービスでもいい。ちょっとしたツールでもいい。 電子工作でも、キーボードでも、VUメーターでもいい。

完成品だけを並べる場所ではなく、 思いついたものを実際に作って、試して、 失敗も含めて記録する場所にしたい。

最初のExperimentは、
「Midnight Benchそのものを作る」 ことにした。
01 — DOMAIN

Domain

まず必要なのは名前と場所。

取得したドメインは、 midnightbench.com

ドメインの登録とDNS管理にはCloudflareを使用した。

今後、実験的サービスをサブドメインとして追加していける。

midnightbench.com
    │
    ├── app1.midnightbench.com
    ├── app2.midnightbench.com
    └── lab.midnightbench.com

実験して、本当に独立させる価値が出てきたサービスだけ 専用ドメインへ移す。

midnightbench.comを実験の母艦にする。
02 — SERVER

A Small Server

WebサーバはOracle Cloud Infrastructure(OCI)に作った。

Cloud          Oracle Cloud Infrastructure
OS             Ubuntu 24.04 LTS
Architecture   ARM64 / aarch64
Shape          VM.Standard.A1.Flex
CPU            1 OCPU
Memory         6 GB

静的なWebサイトや小さなWebサービス、 実験用アプリケーションを動かすところから始めるので、 まずはこれで十分。

Public IPv4は、構築途中でEphemeral Public IPから Reserved Public IPへ変更した。

03 — DOCKER

Dockerize the Bench

OCIへSSH接続して、DockerとDocker Composeをインストール。

docker run --rm hello-world

ARM64用コンテナが正常に起動した。

Midnight Benchでは、 できるだけホストOSへ直接アプリケーションを積み重ねない。

一つの実験を、
一つのコンテナとして追加していく。
Internet
    │
    ▼
  Caddy
    │
    ▼
  nginx
    │
    ▼
Midnight Bench
/opt/midnightbench
│
├── compose.yml
│
├── caddy/
│   └── Caddyfile
│
└── main/
    └── html/
        └── index.html
04 — FIRST BOOT

First Boot

最初のWebページは、ほとんど何もないHTMLだった。

<h1>MIDNIGHT BENCH</h1>

<p>Things made after midnight.</p>
<p>Software / Hardware / Experiments</p>
<p>Coming soon.</p>
docker compose up -d

ブラウザに表示されたのは、たったこれだけ。

MIDNIGHT BENCH

Things made after midnight.

Software / Hardware / Experiments

Coming soon.

ものすごく地味。

でもこれが、
Midnight Benchで最初に動いたもの。
05 — HTTPS

HTTPS

次はドメインとサーバをつなぐ。

Cloudflare DNSで midnightbench.com をOCIのReserved Public IPへ向ける。

midnightbench.com {
    reverse_proxy main:80
}

Caddyを使った理由の一つが、 Automatic HTTPSだった。

証明書の取得・更新をCaddyに任せられる。

構築中にはTLS証明書取得時に一度challengeが失敗したが、 別方式へフォールバックして最終的に証明書取得に成功した。

http://midnightbench.com
        ↓
https://midnightbench.com
06 — GIT

Put Everything in Git

ここまで作ったものをGitで管理する。

git init
git add .
git commit -m "Initial Midnight Bench site"

GitHub上のリポジトリ名は公開用に一般化すると、

<github-user>/midnightbench

認証情報や秘密鍵などはGitへ入れない。

07 — AUTOMATION

Automate Deployment

毎回OCIへSSH接続して手動で更新するのも面倒だ。

pushしたら勝手に本番まで持っていけばいい。
GitHub main
     │
     │ push
     ▼
GitHub Actions
     │
     │ SSH
     ▼
OCI Compute
     │
     ├── git pull
     │
     └── docker compose
cd /opt/midnightbench
git pull origin main
docker compose up -d

最初のWorkflowをpush。

GitHub Actionsが起動。

しばらく待つ。

Green.
08 — LOCAL

Build a Local Workbench

ここまではOCI側で作業していた。

しかし、これから毎回サーバへSSHして コードを書くつもりはない。

Windows
Visual Studio Code
Git for Windows
OpenSSH
ssh-keygen -t ed25519
ssh -T [email protected]
git clone [email protected]:<github-user>/midnightbench.git
09 — TROUBLE

A Small Problem

Windowsのユーザープロファイル名に一部の特殊文字が 含まれていたため、Git for Windows側からSSHを実行すると、 .sshディレクトリのパスを正常に扱えない問題が発生した。

Windows標準OpenSSHではGitHubへ正常に接続できたため、 Git側でもWindows標準OpenSSHを使うように変更した。

git config --global core.sshCommand \
"C:/Windows/System32/OpenSSH/ssh.exe"

再度clone。

On branch main
Your branch is up to date with 'origin/main'.

nothing to commit, working tree clean

こういう予定外の小さな問題も含めてExperimentだと思う。

10 — PIPELINE TEST

PC → GitHub → OCI

最後に、一連の流れが本当につながっているか試す。

Coming soon.

を、

Coming soon. Deployed from GitHub.

へ変更。

git add .
git commit -m "Test deployment from Windows PC"
git push

ここから先は何もしない。

GitHub Actionsが自動起動し、 OCIへデプロイされた。

ブラウザを更新すると、
変更が反映されていた。
11 — PIPELINE

The Pipeline

┌─────────────────────────┐
│ Windows PC              │
│ Visual Studio Code      │
└───────────┬─────────────┘
            │
         git push
            │
            ▼
┌─────────────────────────┐
│ GitHub                  │
│ main branch             │
└───────────┬─────────────┘
            │
            ▼
┌─────────────────────────┐
│ GitHub Actions          │
│ CI/CD                   │
└───────────┬─────────────┘
            │
            │ SSH
            ▼
┌─────────────────────────┐
│ OCI                     │
│ Ubuntu / ARM64          │
│ Docker Compose          │
└───────────┬─────────────┘
            │
            ▼
┌─────────────────────────┐
│ Caddy                   │
│ HTTPS                   │
└───────────┬─────────────┘
            │
            ▼
┌─────────────────────────┐
│ nginx                   │
│ Midnight Bench          │
└─────────────────────────┘

これから普段やることはかなり少ない。

git pull

# make something

git diff
git add .
git commit -m "Something new"
git push
12 — BUILD THE BENCH

Build the Bench

最後に仮ページも作り直した。

黒に近い背景。 オフホワイトの文字。 古い測定器を少し思わせるアンバー。

MIDNIGHT
BENCH

その下に、

Things made after midnight.

最初は単なる数行のHTMLだった場所が、 ようやく「作業台」らしくなった。

でも、中身はまだほとんどない。

それでいい。

作業台というものは、 最初から作品で埋まっているものではない。

これからここで、ソフトウェアを作る。 ハードウェアを作る。電子工作をする。 木を削るかもしれない。

役に立つものも作る。 まったく役に立たないものも作る。

完成したものだけでなく、 途中で失敗したものも残していく。

Midnight Benchの最初のExperimentは、
Midnight Benchそのものだった。

作業台はできた。
あとは、作るだけ。
EXP-001 / BUILD LOG
PROJECT
Midnight Bench Infrastructure
STATUS
ONLINE
DOMAIN
Cloudflare
COMPUTE
Oracle Cloud Infrastructure
ARCH
ARM64 / aarch64
OS
Ubuntu 24.04 LTS
CPU
1 OCPU
MEMORY
6 GB
CONTAINER
Docker Compose
REVERSE PROXY
Caddy
WEB SERVER
nginx
TLS
Automatic HTTPS
SOURCE
Git
REPOSITORY
GitHub
CI/CD
GitHub Actions
LOCAL
Windows
EDITOR
Visual Studio Code
SSH
OpenSSH