はじめに
この番外編では、シリーズで使っている開発環境の全体像を紹介します。自宅のサーバー、手元の PC の VS Code、GitHub が、それぞれ何を受け持ち、どうつながっているかを1枚の図で示します。
これまでの記事は、【入門編 第2回】からいきなりツールの開発に入っていました。そのため、「そもそもどんな環境で作っているの?」という部分の説明が抜けていました。組み込みでいえば、ファームの作り方は書いたのに、評価ボードと開発環境(コンパイラ、デバッガ、書き込み器)の構成を説明していなかった状態です。
なお、この記事は構成の紹介で、ゼロからのインストール手順ではありません。今のサーバーは以前から使っているもので、当時の手順が残っていないためです。VS Code の接続と GitHub への push の手順は、【番外編】VS Code の Remote-SSH で、自宅サーバーを直接開発するで詳しく紹介しています。
このシリーズに登場するドメイン名、URL のパス、ユーザー名、ポート番号などは、セキュリティのため実際とは異なる架空のものに置き換えています。
全体像:3つの場所に分かれている
開発環境は、手元の PC、自宅サーバー、インターネット上のサービス(Cloudflare と GitHub)の3か所に分かれています。

| 場所 | 置いているもの | 役割 | 組み込みでいえば |
|---|---|---|---|
| 手元の PC(Windows) | VS Code、ブラウザ | 画面を見て、キーボードで書く | 開発用の PC と IDE |
| 自宅サーバー(Linux) | ソース、ビルドの道具、動いているツール | ソースの保管、ビルド、実行、外部への提供 | 評価ボード+クロス開発環境 |
| Cloudflare | Tunnel、HTTPS、WAF | 外からの要求の受付と防御 | 外部とつなぐゲートウェイ |
| GitHub | 非公開リポジトリ | ソースの控えを置く金庫 | 構成管理サーバー |
ポイントは、ソースもビルドも実行も、すべてサーバーの上にあることです。手元の PC は、サーバーを操作するための「窓」にすぎません。組み込みでいえば、ターゲットボードに直接ログインして、その上でコンパイルして動かしているような形です。
自宅サーバー:仮想マシンの上の Linux
サーバーは、自宅のマシンの上で動く仮想マシンです。仮想マシンとは、1台の物理マシンの中に、ソフトウェアで作った「別のコンピューター」を動かす仕組みです。組み込みでいえば、実機の代わりにシミュレーター上でボードを動かしているイメージに近いです。
| 項目 | 内容 |
|---|---|
| 仮想化の仕組み | KVM(Linux に標準で入っている仮想化の機能) |
| OS | AlmaLinux 9(Red Hat Enterprise Linux 互換の無料の Linux) |
| CPU・メモリ・ディスク | 2コア、約8GB、約50GB |
| 更新 | OS のパッケージを毎日自動で更新 |
| バックアップ | 毎日、自宅の NAS にまとめて保存 |
Web のツールを動かすには、これで十分な大きさです。
入っているソフトと役割
サーバーには、役割の違うソフトが層になって入っています。

| ソフト | 役割 | 組み込みでいえば | このシリーズで使うところ |
|---|---|---|---|
| Apache | 外から来た要求を受け付け、URL のパスを見て担当に振り分ける | 受信したコマンドを宛先ごとのタスクに渡すディスパッチャ | 全回(入門編 第2回、第7回) |
| Node.js | TypeScript で書いたツールを動かす実行環境 | ファームを動かす CPU とランタイム | 全回 |
| nvm | Node.js のバージョンをユーザーごとに入れ分ける道具 | 複数のツールチェーンのバージョンを切り替える仕組み | 環境づくり |
| PM2 | ツールを常駐させ、落ちたら再起動し、サーバー起動時に自動で立ち上げる | ウォッチドッグ付きの起動管理 | 全回 |
| Git | ソースの変更履歴を管理する | 構成管理ツール | 全回(番外編 Git) |
| MariaDB | データベース | 検索や集計ができる不揮発メモリ | 実践編から |
| PHP | Wiki など、以前から使っているほかの用途 | ― | 使わない |
Node.js を nvm で入れた理由
OS に最初から入っている Node.js は、バージョン 20 でした。このバージョンは 2026年4月でサポートが終わっています。かといって OS の Node.js を入れ替えると、ほかの用途に影響が出るかもしれません。
そこで、開発用のユーザー(devuser)にだけ、nvm で新しいバージョン 24 を入れました。OS 全体は触らずに、自分の作業の中だけ新しい道具を使う形です。組み込みでいえば、共用のビルドサーバーの標準コンパイラはそのままにして、自分のプロジェクトだけ新しいツールチェーンを指定するのと同じです。
PM2 も同じ理由で、devuser の Node.js 24 の側に入れています。
確認してみる
サーバーに入って、それぞれのバージョンを表示すると、何が入っているかを確かめられます。
$ grep PRETTY_NAME /etc/os-release
$ httpd -v
$ node -v
$ pm2 -v
$ git --version行頭の $ は、一般ユーザーで実行するコマンドであることを示す記号(プロンプト)です。実際に入力するのは $ の後ろからです。
結果は次のようになります(細かいバージョン番号は x に置き換えています)。
PRETTY_NAME="AlmaLinux 9.x"
Server version: Apache/2.4.x (AlmaLinux)
v24.x.x
7.x.x
git version 2.x.xnode -v が v24 で始まっていれば、nvm で入れた Node.js が使われています。もし v20 が出たら、OS の Node.js が使われているので、nvm use 24 で切り替えます。
外への出し方:ポートを開けずに Cloudflare Tunnel
自宅のサーバーをインターネットから使えるようにするとき、よくある方法は、自宅のルーターで「ポートを開ける」ことです。外からの接続を、ルーターがサーバーへ通すように設定します。ただし、こうすると誰でもサーバーに直接つなぎに来られるようになり、自宅の IP アドレスも知られてしまいます。
このシリーズでは、Cloudflare Tunnel を使っています。サーバーの中で動く小さなプログラム(cloudflared)が、サーバーの側から Cloudflare に接続しに行き、その接続を通して要求を受け取る仕組みです。
| 方式 | 接続の向き | ルーターの設定 | 自宅の IP アドレス |
|---|---|---|---|
| ポートを開ける | 外 → 自宅(待ち受け) | ポートを開ける | 知られる |
| Cloudflare Tunnel | 自宅 → Cloudflare(自分からつなぎに行く) | 何もしない | Cloudflare の陰に隠れる |
組み込みでいえば、機器の側で受信ポートを開けて待ち受けるのではなく、機器の側からサーバーに接続しに行き、その接続の上でコマンドを受け取る形です。外から開いている入口がないので、守る場所が減ります。
Cloudflare は、ほかにも次のことを引き受けてくれます。
- HTTPS:
ブラウザとの間の暗号化と証明書の管理 - WAF(Web Application Firewall):管理画面などへの怪しいアクセスを、サーバーに届く前に止める
ツールには認証をかけている
作ったツールは、誰でも使える一般公開ではありません。https://example.com/apps/<ツール名>/ の下に置き、Apache の Basic 認証(ユーザー名とパスワードの入力画面)をかけて、決まった人だけが使えるようにしています。設定の詳しい内容は、【入門編 第2回】で紹介しています。
Apache は中継するだけ(2026年11月4日に追記)
ツールのファイルは、Apache の公開のフォルダ(/var/www/…)には置いていません。ツールは、それぞれのフォルダの中で、自分の小さな Web サーバー(Node.js)として動いていて、Apache は、届いた要求をそのツールに渡す(中継する)だけです。
| No. | 順番 | 受け持ち |
|---|---|---|
| 1 | ブラウザ → Cloudflare | HTTPS と WAF |
| 2 | Cloudflare → cloudflared → Apache | 自宅のサーバーまで届ける |
| 3 | Apache | /apps/ の下に Basic 認証をかけ、/apps/<ツール名>/ をツールに中継する |
| 4 | ツール(Node.js、127.0.0.1:5002) | 自分のフォルダの中の画面のファイルを返す。サーバーの中からしか受け付けない |
中継の設定は、ツールごとに数行です(値は架空のものです)。
ProxyPass "/apps/unitconv" "http://127.0.0.1:5002/apps/unitconv"
ProxyPassReverse "/apps/unitconv" "http://127.0.0.1:5002/apps/unitconv"
ProxyPass:/apps/unitconvに来た要求を、サーバーの中の 5002 番のツールに、パスを書き換えずに渡すProxyPassReverse:
ツールが返す「場所が変わった」の案内(/のないときの 301 など)を、外から見た URL に直して返す
この形にしているのは、次の理由です。
| No. | 理由 | 中身 |
|---|---|---|
| 1 | 見せたくないファイルが出ない | Apache の公開のフォルダにツールを置くと、設定のファイルやソースまで、URL で開けてしまうおそれがある。中継なら、ツールが返すと決めたファイルしか出ない |
| 2 | ツールごとに分かれる | ツールを止めたり、作り直したりしても、ほかのツールやブログに響かない |
| 3 | 認証は Apache でまとめてかける | 中継するパスには .htaccess が効かないので、/apps/ の下の Basic 認証は、Apache の設定の中でまとめてかけている |
組み込みでいえば、Apache は受付の窓口で、来た要求を、決まった番号の担当(ツール)に回すだけです。担当の机の中(ツールのフォルダ)を、窓口が直接見せることはありません。
手元の PC:VS Code はサーバーを操作する窓
手元の PC(Windows)に入れているのは、主に次の3つです。
| もの | 役割 |
|---|---|
| VS Code + 拡張機能 Remote – SSH | サーバーに接続し、サーバー上のファイルを開いて編集する。ターミナルもサーバー上で動く |
| SSH(Windows に標準で入っている OpenSSH) | サーバーへの接続。パスワードではなく SSH 鍵でログインする |
| ブラウザ | 作ったツールの画面を確かめる |
VS Code の画面は手元に出ていますが、開いているファイルも、ターミナルで動くコマンドも、すべてサーバーの上のものです。そのため、PC に Node.js や Git を入れる必要はありません。
SSH 鍵でログインする
SSH 鍵は、「秘密鍵」と「公開鍵」の組です。秘密鍵は手元の PC だけに置き、公開鍵をサーバーに登録しておくと、パスワードを打たずにログインできます。組み込みでいえば、機器に公開鍵を書き込んでおき、署名の検証が通ったときだけ接続を受け付ける、セキュアブートに近い考え方です。
PC の設定ファイル(.ssh/config)にサーバーを myserver という名前で登録しておくと、PowerShell からも、VS Code からも、この名前で接続できます。
$ ssh myserver手元の PC の PowerShell で実行します。パスワードを聞かれずに、サーバーのプロンプトが出れば、鍵でのログインができています。
ポート転送で開発中の画面を見る
開発中の画面(Vite の開発サーバー)は、サーバーの中だけで待ち受けていて、外からは見えません。VS Code のポート転送を使うと、SSH の接続の中を通して、手元のブラウザで http://localhost:5173/ のように開けます。外に入口を開けずに済むので安全です。
VS Code の接続、ポート転送、GitHub のサインインの手順は、【番外編】VS Code の Remote-SSH で、自宅サーバーを直接開発するで詳しく紹介しています。
GitHub:ソースの控えを置く金庫
ソースはサーバーの上で Git で管理し、区切りごとに GitHub へ送って(push して)控えを残しています。サーバーが壊れても、ソースは GitHub から取り戻せます。
| 決めごと | 内容 | 理由 |
|---|---|---|
| リポジトリの単位 | ツールごとに1つ(例:apps-hello、apps-unitconv) | ツールごとに履歴とタグを分けたい |
| 公開範囲 | 非公開(Private) | 個人の学習用で、設定の値も含むため |
| 送り先の形式 | HTTPS(https://github.com/example-user/apps-hello.git) | VS Code のサインインで認証できる |
| 認証 | 手元の VS Code で GitHub にサインインし、その認証をサーバーの git が借りる | サーバーに SSH 鍵もパスワードも置かない |
| 区切りの印 | Step が終わるたびにタグを付ける(例:step0-done) | どの時点のソースで完成したかを後から取り出せる |
タグは、組み込みでいえば出荷したファームのバージョン番号を、ソースの履歴に打っておくのと同じです。
認証の仕組みと、SSH 鍵での接続がうまくいかなかった話は、【番外編】VS Code の Remote-SSH で、自宅サーバーを直接開発するに、Git のつまずきは、【番外編】組み込みエンジニアが Git でつまずいた6つのことにまとめています。
1つのツールができるまでの流れ
ここまでの部品が、1つのツールを作るときにどう使われるかを、順に並べます。
- 書く:
手元の VS Code から Remote-SSH でサーバーに入り、/home/devuser/apps/<ツール名>/にソースとドキュメントを書く - 画面を確かめる:
サーバーで Vite の開発サーバーを動かし、ポート転送で手元のブラウザから見る - ビルドする:
サーバー上でnpm run build。TypeScript が JavaScript に変換される - 常駐させる:
PM2 にツールを登録する。ツールはサーバーの中だけで、ツール専用のポート(例:5001)で待ち受ける - 中継する:
Apache に、/apps/<ツール名>/への要求をそのポートへ渡す設定を1つ追加する - 外から確かめる:
ブラウザでhttps://example.com/apps/<ツール名>/を開く。Cloudflare、Tunnel、Apache、Node.js の順に届き、認証の画面のあとにツールが表示される - 控えを残す:
Git でコミットし、タグを付けて GitHub に push する
手順の 1〜3 は 入門編 第4回、4〜6 は 入門編 第7回、7 は 番外編 Git で、実際の手順と結果を紹介しています。
この記事に書いていないこと
自宅のサーバーを外から使えるようにしている以上、構成の細かい部分は攻撃の手がかりになります。そのため、次のことは記事に載せていません。
- 実際のドメイン名、URL のパス、ユーザー名、ポート番号(架空のものに置き換えています)
- WAF のルールの具体的な条件
- 自宅のネットワークの IP アドレスや、Cloudflare Tunnel の設定の詳細
- 認証に使うユーザー名や設定ファイルの名前
組み込みでいえば、製品の解説記事は書いても、デバッグポートの場所や保守用のパスワードは載せない、という感覚です。同じような環境を作るときも、こうした値は自分の環境に合わせて決めてください。
まとめ
- 開発環境は、手元の PC、自宅サーバー、インターネット上のサービス(Cloudflare、GitHub)の3か所に分かれている
- ソース、ビルド、実行はすべてサーバーの上。手元の VS Code は、Remote-SSH でサーバーを操作する窓
- 外からの要求は、ポートを開けずに Cloudflare Tunnel で受け、Apache が各ツールに振り分ける
- ソースの控えは GitHub の非公開リポジトリに置き、認証は VS Code のサインインに任せる
この記事は、シリーズ「組み込みエンジニアの Web 開発入門」の1本です。ほかの回は、シリーズの目次からどうぞ。



コメント