ブログ

  • 標準の境界線:Vultrと国内VPSの選択、およびメール閉塞を迂回する技術実録

    標準の境界線:Vultrと国内VPSの選択、およびメール閉塞を迂回する技術実録

    技術が生まれては消えていく、諸行無常のITの世界。個人が技術ログや検証環境を公開するための基盤として、クラウド(VPS)の選定は最初の分岐点となる。

    国内にはConoHa VPSやさくらのVPSといった、日本語のドキュメントが豊富で至れり尽くせりな環境が整っている。しかし、本ブログの公開基盤(node01)には、グローバルで圧倒的なポータビリティを持つ海外VPS「Vultr」を選定した。

    派手な広告やスペックシート上の数字に翻弄されず、インフラエンジニアの視点で両者の本質を比較し、さらに海外VPSの運用で必ず直面する「Outbound Port 25の沈黙」をサーバーレスで解決した実録をここに記す。


    1. 徹底比較:Vultrと国内VPSの境界線

    インフラを構築するにあたり、まずは国内大手VPSとVultrの特性を実直に比較した。

    インフラの柔軟性とポータビリティ

    Vultrの最大の利点は、OS選定の身軽さと秒単位の従量課金システムにある。国内VPSの多くは月額固定、あるいは時間単位の課金だが、Vultrは完全に使った分だけの請求となる。さらに、最新の Debian 13 (trixie) といったディストリビューションを即座にデプロイし、不要になればコンテナごと躊躇なく破棄・再構築できる。この圧倒的な機動性は、検証を繰り返すエンジニアにとって大きな価値がある。

    ネットワークとロケーション

    海外VPSと聞くとレイテンシ(遅延)を懸念するかもしれないが、Vultrは「東京リージョン」を完備している。実際に Chromebook(host)から東京リージョンの node01 へ通信を試みても、国内VPSと全く遜色ない極めて低レイテンシなレスポンスを維持している。地理的な制約は、東京リージョンを選ぶことで完全に無効化できる。

    運用の手軽さとサポート

    一方で、国内VPS(ConoHaなど)の優位性は、コントロールパネルの分かりやすさと日本語サポートの安心感にある。クレジットカードだけでなく、各種決済手段が標準で用意されている点も手軽だ。もし「インフラの細かい挙動に時間を取られたくない」「手早くWordPressを立ち上げたい」という場合は、ConoHa等の国内VPSを選ぶのが確実な選択肢になる。

    その中でも、初期費用が無料で時間課金にも対応し、初心者からエンジニアまで広く支持されているConoHa VPSは、手堅く堅牢な選択肢の一つと言える。


    2. 海外VPSが抱える「諸行無常の罠」:Outbound Port 25の沈黙

    Vultrを選択し、Docker Compose による LEMP スタック(Nginx, WordPress, MariaDB)を立ち上げた後、一つの制約に直面した。それは、外部へのメール送信(Outbound Port 25)の常時閉塞である。

    これは世界的なスパムメール抑制のための標準的なセキュリティ対策(OP25B)だ。国内VPSであれば、契約から一定時間(例:72時間)が経過すれば自動的に解除されることが多い。しかし、Vultrのような海外VPSにおいて、この制限は「原則として常時閉塞」であり、解除のためのサポート申請には厳格な身元確認や実績の提示という非常に泥臭いプロセスを要求される。

    システムから「お問い合わせの通知メール」や「監視アラート」を送信したいだけにもかかわらず、インフラの壁に阻まれてポートが沈黙する。

    ncコマンドを用いたPort 25の疎通検証。接続がタイムアウトし、Vultr側のネットワーク層で遮断されている証跡。
    Outbound Port 25の検証。国内VPSの多くが時間経過で自動開放するのに対し、Vultrは原則として常時閉塞の仕様をとる。ncコマンドによる接続試行の結果、IPv4(172.217.221.109)への通信はTCPハンドシェイクの段階でパケットが破棄され、タイムアウト(Connection timed out)を返している。また、IPv6においてNetwork is unreachableを返す挙動は、外部へのルーティングが設定されていない本環境のネットワーク構成を反映している。

    だが、インフラが閉じているなら、サーバーのMTA(Postfix等)をいじって消耗するのではなく、外部の信頼できるコンポーネントを組み合わせて「バイパス(迂回路)」を作ればいい。それこそがエンジニアリングの美学である。


    3. 技術実録:Resend + Cloudflare によるスマートな迂回

    サーバー内部に余計なメールサーバーの構築という不純物を入れず、完全に外部のサーバーレス基盤のみで、独自ドメイン([email protected])の送受信環境を構築した。

    メールの流動設計

    • 受信: 送信者 ➔ [email protected] ➔ 【Cloudflare Email Routing】 ➔ 個人Gmail
    • 送信: 個人Gmail ➔ 【Resend SMTP】(中継・認証) ➔ 宛先

    この設計であれば、VultrのOutbound Port 25制限の影響を一切受けない。

    1. Resendでのドメイン追加

    メール送信基盤には、開発者向けに実直なAPIを提供する「Resend」を採用した。ダッシュボードから it-mujo.com を追加し、Region に最寄りの東京(ap-northeast-1)を指定する。

    2. Cloudflare DNSでのレコード設定と統合

    Resendから提示されたドメイン認証用の各種レコード(TXT、MX)をCloudflareに登録する。この際、プロキシステータスが「DNSのみ」に設定されていることを確認する。

    さらに、メールの到達率を高め、なりすましを防ぐためのDMARCレコード(TXT)も指示通りに設定を完了させた。

    最も注意すべきはSPFレコード(TXT)の記述だ。すでに Cloudflare Email Routing のSPFが設定されているため、DNSへ個別にレコードを複数追加してはならない(SPFの仕様上、複数レコードの存在は認証エラーの対象となる)。

    既存のレコードを編集し、以下のように2つのinclude(識別子)を半角スペースで区切って統合する。

    v=spf1 include:_spf.mx.cloudflare.net include:amazonses.com ~all

    ※当ブログの表示幅の制約により上記レコードは2行に折り返されて表示されるが、実際のDNS設定においては改行を挟まず、すべて半角スペースで区切って入力する。

    ※Resendが送信基盤として利用している識別子を、既存の記述と適切に組み合わせることで、CloudflareとResendの両者からの送信を正当なものとして証明する。

    CloudflareのDNS設定画面。Email RoutingとResendの識別子を1行にまとめた、統合済みのSPFレコード(TXT)の登録状態。
    規格(RFC 7208)に準拠したSPFレコードの統合。複数レコードの設置による認証エラー(PermError)を回避するため、既存のCloudflare Email Routingの記述(_spf.mx.cloudflare.net)にResendの送信ドメイン(amazonses.com)をインクルード形式で統合している。

    3. GmailへのSMTP統合

    Resendで生成したAPIキー(re_から始まる認証文字列)をパスワードとし、Gmailの「他のメールアドレスを追加」から以下の通り設定を流し込む。

    • SMTPサーバー: smtp.resend.com
    • ポート: 587
    • ユーザー名: resend(固定値)
    • パスワード: 生成したAPIキーの文字列
    • 接続方式: TLSを使用した安全な接続
    CloudflareのDNS設定画面。Email RoutingとResendの識別子を1行にまとめた、統合済みのSPFレコード(TXT)の登録状態。
    Gmail上に設定された独自ドメインの送信元選択画面。Vultrのサーバーを経由せず、Gmailから直接Resendの中継サーバー(ポート587 / TLS)へ接続して送信するため、Vultr側のPort 25閉塞制限の影響を受けずに独自ドメインでのメール送信が可能となる。

    これにより、Vultrサーバーの負荷を高めることなく、Gmailの使い慣れたインターフェースから独自ドメインでの双方向通信が完全に開通した。


    4. 結び:制約を受け入れ、環境と共生する

    完璧なクラウドインフラなど存在しない。国内VPSの「至れり尽くせりな環境」も一つの正解だが、Vultrが持つ「海外VPS特有の制約」と対峙し、それを自らの手で美しく克服していく過程にこそ、本質的な運用の愉しみがある。

    制約を嘆くのではなく、与えられた環境の中で最適解を模索する。
    双方向の通信を確保した node01 は、これでまた一歩、どこにあっても私の思考を支える強固な「標準」へと近づいた。

    今回検証の舞台となったVultr(東京リージョン)は、独自の管理ツールによる事前設定を挟まず、OSを最小構成のままデプロイできる。従量課金で機動性の高い開発環境を求めるエンジニアにとって、今もなお有力な選択肢である。

    執筆環境: host (Chromebook / Debian 13)
    公開基盤: node01 (Vultr / Debian 13 / Docker)
    接続環境: NordVPN (NordLynx)

  • 旅先でのUSBテザリング再接続問題と格闘する:NordVPN Daemonの沈黙と解決ログ

    旅先でのUSBテザリング再接続問題と格闘する:NordVPN Daemonの沈黙と解決ログ

    技術が生まれては消えていく諸行無常の世界において、エンジニアの「現場」は常に移動し続ける。私は今、旅先の滞在施設でこの稿をまとめている。

    私の執筆環境は、Chromebook(Debian 13)を母艦とし、Google Pixel 8aによるUSBテザリングを通信の命綱としている。公衆Wi-Fiの不確実性を排し、自立した通信路を確保するための選択だ。しかし、この「移動する拠点」において、避けては通れない技術的トラブルに遭遇した。

    それは、物理的な接続解除に伴うVPN接続の「形骸化」だ。一度は再現性を失いかけたこのトラブルだが、journalctlのログの深層を遡ることで、その本質的な原因を特定することができた。
    本稿では、表面上のステータスに惑わされず、システムログから真実をデバッグし、解決に至るまでのNordVPN を用いた実直なプロセスを記録する。

    1. 現象:Status Connectedの裏側で死んでいる通信

    トラブルは、一旦席を外してUSBケーブルを抜き、再接続した際に発生した。

    通常通りテザリングを確立し、ブラウザを開く。しかし、ページは遷移しない。ターミナルを叩き、疎通を確認する。

    user@host:~$ curl ifconfig.me
    curl: (6) Could not resolve host: ifconfig.me

    典型的なDNS解決エラーだ。しかし、奇妙なことにNordVPNのステータスを確認すると、あたかも正常であるかのような応答が返ってくる。

    user@host:~$ nordvpn status
    Status: Connected
    (以下略)

    この時点ではステータスは「Connected」だが、実際には名前解決ができない。
    その後、GUIを立ち上げるとエラー画面が表示され、[Try again] ボタンが出現した。

    物理切断後、[Try again] をクリックしても接続が復旧せず、エラー画面が繰り返されるNordVPNのGUI。
    通信不能状態に陥ったNordVPNのGUI画面。CLI上で Connected と表示されていても、内部的な不整合により [Try again] による再試行が受理されず、この画面が執拗に繰り返される。

    その後、CLI上のステータスを確認すると、以下のような表示へと変化していた。

    user@host:~$ nordvpn status
    Status: Connecting

    「接続済み」から「接続中」へと推移しており、以降 [Try again] をクリックしてもこの状態から復旧することはなかった。CLIとGUI、そして実際の通信状態に不整合が生じている。この状況をログから紐解いていく。

    2. ログの解析:nordvpndが発していた悲鳴

    システムの状態を正確に把握するため、systemdのログを確認する。ここに、本質的な原因が刻まれていた。

    user@host:~$ sudo systemctl status nordvpnd
    (中略)
    May 06 16:49:46 host nordvpnd[4217]: 2026/05/06 16:49:46 [Info] notifying about data connect change event: {Status:{State:DISCONNECTED Technology:NORDLYNX Protocol:UDP IP:217.217.114.105 Name:Japan #805 Hostnam>
    (中略)
    May 06 16:50:20 host nordvpnd[4217]: Error: dial tcp: lookup applytics.nordvpn.com on 103.86.99.99:53: write udp 10.170.22.134:55141->103.86.99.99:53: write: operation not permitted

    ログには明確に DISCONNECTED の記録があり、その後、NordVPNのDNSサーバー(103.86.99.99)への問い合わせが operation not permitted で拒否されている。

    これは、物理的なインターフェース(usb0等)が一度消失したことで、NordVPNの強力なセキュリティ機能である「Kill Switch」やルーティングテーブルが、再接続後の新しいネットワークインターフェースを正しく認識できず、通信を遮断し続けている状態だと推測される。

    CLIが一時的に「Connected」を示した後に「Connecting」へと遷移し、そのまま停滞してしまうのは、物理レイヤーの切断によってVPNの仮想インターフェース(nordlynx)と物理デバイス間の不整合が生じ、再接続プロセスが正常に完遂できなくなっている状態を示唆している。

    systemctl のログで確認した operation not permitted は、このスタックした再接続試行が、自身のセキュリティ機能(Kill Switch等)によって阻害され続けている証左と言えるだろう。

    3. 解決:デーモンの再起動という「実直」な処方箋

    一時的な不整合を解消しようと、表面的な nordvpn disconnectnordvpn connect の再試行を試みた。

    user@host:~$ nordvpn disconnect
    You are disconnected from NordVPN.
    (以下略)
    
    user@host:~$ nordvpn connect Japan Tokyo
    Connecting to Japan #570 (jp570.nordvpn.com)
    We couldn't connect you to the VPN. Please check your internet connection and try again. If the issue persists, contact our customer support.
    

    disconnect は受理されるものの、その後の接続命令はインターネット接続エラーとして撥ねられてしまう。論理的な接続コマンド操作だけでは、OS側のルーティングやデーモン内部の目詰まりを解消できないことが明白となった。

    一度崩れたネットワークスタックの不整合を解消するには、高レイヤーの操作ではなく、サービスそのものをリセットするのが最も確実である。

    user@host:~$ sudo systemctl restart nordvpnd

    実行後、数秒のうちに事態は好転した。私の環境ではオートコネクト(Auto-connect)を有効にしているため、デーモンの起動に伴い、NordVPNは即座にバックグラウンドで最適なサーバーへの再接続を完了させた。

    ここで、前段で確認した「ステータスはConnectedだが実際には通信できない」という不整合が解消されたかを、実データで検証する。

    余談だが、ifconfig.me は出力末尾に改行を含まない。そのため、通常はターミナルのプロンプトがIPアドレスの直後に繋がってしまい、視認性が悪い。私はこれを嫌い、-w "\n" オプションを添えて実行した。

    user@host:~$ curl ifconfig.me -w "\n"
    93.118.42.176

    真っさらなターミナルに、正しいIPが一行、実直に刻まれる。

    Linux環境、特にDebian 13のような堅牢なOSにおいて、ネットワークスタックの不整合はデーモンの再起動という基本に立ち返ることで解決する。事実、再起動後の curl は、何事もなかったかのように正しい応答を返してきた。

    この静寂こそが、次なる記録に向かうための準備となる。

    デーモン再起動によりVPN接続が正常化し、テザリング環境下で十分な通信速度が得られていることを示す証跡。
    デーモン再起動により正常化した通信。curl ifconfig.me -w “\n” での疎通確認に加え、速度テストを実行。テザリング特有の揺らぎがある環境下でも、NordVPN (NordLynx)によって実用十分なスループットが確保されていることを証明した。

    4. 旅先での運用におけるNordVPNの価値

    NordVPNの設定画面にて、独自プロトコルであるNordLynxが有効になっていることを確認するログ。
    技術スタックの要となるNordLynx。WireGuardをベースとしたこのプロトコルは、移動中の不安定なテザリング環境下においても、再接続の即時性と低遅延という恩恵をもたらす。

    このようなトラブルは、一見すると手間のように思えるかもしれない。しかし、ネットワークエンジニアの視点で見れば、むしろ「挙動の透明性」こそが信頼の証である。

    市販の簡易的なVPNツールでは、原因不明のまま「繋がらない」で終わることが多い。しかし、NordVPNはLinuxのsystemdと密接に連携し、ログを通して何が起きているかを明確に提示してくれる。

    特に、独自プロトコルであるNordLynxの存在は大きい。

    
    user@host:~$ nordvpn settings
    Technology: NORDLYNX
    Firewall: enabled
    Firewall Mark: 0xe1f1
    Routing: enabled
    User Consent: disabled
    Kill Switch: enabled
    (以下略)

    WireGuardをベースとしたNordLynxは、従来のOpenVPN等と比較してオーバーヘッドが極めて少ない。今回のトラブルからの復帰後も、ホテルの共用Wi-Fiや移動中のテザリングといった、パケットロスが発生しやすい不安定な回線状況において、即座にフルスピードのスループットを維持してくれた。

    VPNが瞬時に再確立される「接続の速さ」と通信の安定性は、一度の中断が思考の断絶に直結するエンジニアの集中力を維持するための、絶対的な必要条件である。

    5. 結び:無常のネットワークを乗りこなす

    マニュアル通りの挙動を期待するのではなく、現場で起きている事象をログから読み解き、最適解を導き出す。これこそが、IT-MUJOの掲げる「実直な技術ログ」の在り方だ。

    USBテザリングという日常的な手段の中に潜む、物理切断に伴うルーティングの不整合。それを systemctl restart で乗り越え、私は再び、安全なトンネルの先にある node01(Vultr)へとアクセスを再開する。

    漂う先がどこであれ、この強力な防壁と解決策さえあれば、本質を記す手は止まらない。


    今回使用した技術スタック

    • VPNサービス: NordVPN (NordLynx)
    • 執筆環境: host (Chromebook / Debian 13)
    • 通信手段: Google Pixel 8a (USB Tethering)
    • 公開基盤: node01 (Vultr / Docker)

    ※本記事はNordVPNのプロモーションを含みますが、内容は実機検証に基づく一次情報です。

  • 無常を記録する装備:IT-MUJO 執筆・公開環境の総括

    無常を記録する装備:IT-MUJO 執筆・公開環境の総括

    技術が生まれては消えていく、諸行無常のITの世界において、本質を記すための「場所」を構築してきた。

    node01(公開基盤)の構築から始まり、バックアップ戦略と外部監視の完備。これらを経て、IT-MUJOは単なるログの集積体から、一つの完結した「システム」へと昇華した。

    本稿では、場所や環境に縛られない運用を支えている、執筆・公開環境の全容を総括する。


    1. 現場を支える最小限の装備

    特定のオフィスを持たず、あらゆる場所を執筆の現場とするために、私が手元に置いている装備は極めて限定的だ。

    ASUS Chromebook C523NA

    余計な装飾を排し、検証と記録に没頭するための母艦。ChromeOSを消し去り、SeaBIOSを経由してDebian 13をクリーンインストールした実録は第2記事に記している。また、標準の極致たるホスト名を与え、最小構成を選定したプロセスは第3記事の通りである。さらに、Chromebook特有のキーボード配列という制約に対し、Wayland環境下でkeydを用いてキーマップを最適化したログは第4記事に詳述している。Debian 13を核としたこの機体こそが、IT-MUJOの起点である。第1記事から今日に至るまで、すべてのログはこのキーボードから紡がれた。

    Google Pixel 8a(USBテザリング)

    不特定の公衆Wi-Fiに依存せず、自立した通信路を確保するための選択。第7記事で検証したVPN運用の基盤でもあり、ネットワークエンジニアとして通信の主権を握るための要(かなめ)だ。

    Transcend JetFlash 710

    第2記事においてDebianのインストールを完遂させた原点。現在は、緊急時のブートメディアとして常に携行している。極小の金属ボディに、環境再構築の可能性を封じ込めている。

    これらに加え、拠点における物理バックアップを担う Samsung T7 や、インフラの源泉たる Anker Nano II 65W。これらはこれまでの検証を経て、IT-MUJOを支える「標準装備」として定義済みだ。


    2. node01を支える三層の守り

    node01上で稼働する全Dockerコンテナのステータス画面。システムが正常に統合されていることを示している。
    node01を支えるコンテナ群。バックアップと監視を備え、安定した公開基盤として機能している。

    公開基盤である node01(Vultr / Docker Compose)は、以下の三層によってその静寂を守られている。

    1. 要塞化NordVPN / Cloudflare WAF):
      第7記事で構築したNordVPNによる暗号化に加え、第5記事で設定したCloudflareのファイアウォール機能であるWAF(Web Application Firewall)を活用したアクセス制限を適用。管理者以外の侵入を拒絶し、公開基盤の静寂を保っている。
    2. データのポータビリティ(Docker Backup):
      第8記事で実装した自動スクリプトにより、論理データは毎日アーカイブされ、物理メディアへの退避準備が整っている。拠点にある Samsung T7 への同期までを含めた、三重の備えだ。
    3. 生存の観測(Uptime Kuma):
      第9記事で導入した監視塔。異常を察知すれば、即座にDiscordへと通知が届く。主観的な「稼働しているはず」を排し、客観的なデータでサイトの生存を観測し続けている。

    3. 結び:記録を積み重ねるということ

    環境の構築は目的ではない。それは、技術の激しい流れの中に身を置きながら、ふと浮かび上がってきた「本質」を逃さず書き留めるための準備に過ぎない。

    システムは完成した。あとは、実直に記録を積み重ねるだけだ。


    執筆環境: host (Chromebook / Debian 13)
    公開基盤: node01 (Vultr / Debian 13 / Docker)
    接続環境: NordVPN (NordLynx)

  • 存在を観測する:Uptime Kumaによるnode01の死活監視

    存在を観測する:Uptime Kumaによるnode01の死活監視

    「動いているはず」という運営者の主観は、技術の世界では無力だ。サーバーが起動していても、Nginxがハングアップしているかもしれない。SSL証明書が期限切れを起こしているかもしれない。

    無常なインターネットの海において、node01の生存を客観的に証明するためには、外部からの継続的な観測が必要だ。本稿では、自前で構築できる監視ツール「Uptime Kuma」の導入と、その通信の保護について記す。


    1. 外部監視の必要性とセキュリティの担保

    node01の内部でプロセスを監視するだけでは、Cloudflareのプロキシ設定や証明書の不備を検知できない。ユーザーと同じ「外側」のネットワークから定期的にリクエストを送り続けることで、初めてサイトの生存が証明される。

    監視環境の構築にあたっては、node01とは別のインスタンスが理想だが、まずはnode01上で独立したコンテナとして稼働させる手順を記す。

    また、Uptime Kumaの管理画面にはログイン情報や通知トークンが含まれる。これらを平文のHTTPで流すのは、実直な運用とは言えない。既存のNginxをリバースプロキシとして機能させ、Cloudflare Origin CA証明書を用いたHTTPS環境下で運用する。


    2. DockerとNginxによるリバースプロキシ

    既存の docker-compose.yml に Uptime Kuma を追加し、Nginx経由でサブドメイン(monitor.it-mujo.com)を割り当てる。

    docker-compose.yml への追記

      uptime-kuma:
        image: louislam/uptime-kuma:1
        container_name: uptime-kuma
        restart: always
        volumes:
          - ./uptime-kuma:/app/data
        # 外部にポートは晒さず、Nginx経由でのみアクセスを許可する

    Nginx リバースプロキシ設定

    サブドメイン用の設定ファイル(monitor.conf)を作成。WebSocket通信(Upgradeヘッダ)を許可し、リアルタイムな監視状況の反映を確保する。

    Nginxの設定ファイル編集画面。サブドメイン monitor.it-mujo.com を Uptime Kuma コンテナへ転送するリバースプロキシ設定の様子。
    監視画面をHTTPS化し、安全な経路で観測データにアクセスするためのリバースプロキシ構成。

    3. 監視設定と通知の自動化

    HTTPS化された管理画面にアクセスし、監視対象と通知先を設定する。

    • HTTP(S)ステータス: https://it-mujo.com を定期的に監視。
    • SSL証明書の有効期限: 期限切れを事前に察知し、警告を発する。
    • 通知連携: DiscordのWebhook APIを使用。異常を察知した瞬間、host(Chromebook)へ即座に通知が届く体制を整える。
    Discordに届いたUptime Kumaからのテスト通知。即時通知網が正常に機能していることを示している。
    Discordに届いたテスト通知。監視システムとの正常な連携を確認する。

    もし特定のメッセージサービスに依存したくない場合は、Cloudflare Email Routingを活用したEmail通知も一つの選択肢となるだろう。

    こうした監視設定のバックアップ(JSON)には、機密情報が含まれる。取り扱いには細心の注意を払う。こうした微細な配慮の積み重ねこそが、実直なサーバー運用を形作る。


    結び

    監視を始めると、自分のサイトがいかに多くの「波」に晒されているかが可視化される。
    安定稼働を支えるのは、高度な技術だけではない。日々の微かな変化に気づき、静かに対応し続ける実直さである。


    執筆環境: host (Chromebook / Debian 13)
    公開基盤: node01 (Vultr / Debian 13 / Docker)
    接続環境: NordVPN (NordLynx)

  • node01の静寂を守る:Docker Composeによるバックアップと物理メディアへの退避

    node01の静寂を守る:Docker Composeによるバックアップと物理メディアへの退避

    技術が生まれては消えていく「諸行無常」のITにおいて、唯一の資産は積み上げた「記録」である。
    Vultrが提供するスナップショット機能は強力だが、それはプラットフォームという外部要素への依存を意味する。
    万が一、クラウド事業者のリージョン障害やアカウント閉鎖が起きた際、手元に「本質的なデータ」が残っていなければ、その記録は霧散する。

    本稿では、node01上のDocker Compose環境におけるバックアップ戦略と、物理メディアへの退避手順について記す。


    1. バックアップ対象の特定

    現在のLEMPスタックにおいて、バックアップすべき対象は以下の3点に集約される。

    1. MariaDBデータ(論理ダンプ): バインドマウントされたバイナリデータ(./mariadb)を直接コピーするのは整合性のリスクがあるため、mariadb-dumpによる論理バックアップを行う。
    2. WordPressコンテンツ: アップロードした画像やテーマファイル(./wordpress)。
    3. 設定ファイル一式: 再構築の設計図である docker-compose.yml および、証明書等を含む nginx ディレクトリ全体。

    これらをhost(Chromebook)を介し、最終的に外部ストレージへと物理的に退避させる。


    2. バックアップスクリプトの実装

    手作業によるバックアップは継続性を欠く。シェルスクリプトとcronによる自動化を実装する。

    スクリプトの作成

    /home/user/scripts/it-mujo-backup.sh として以下を作成。

    #!/bin/bash
    # IT-MUJO Backup Script
    
    BACKUP_DIR="/home/user/backups/daily"
    DATE=$(date +%Y%m%d)
    FILE_DATE=$(date +%Y%m%d)
    WP_STACK_DIR="/home/user/it-mujo"
    
    echo "--- Backup Start: $DATE ---"
    
    # ディレクトリ準備
    mkdir -p $BACKUP_DIR
    
    # 1. データベースの論理バックアップ
    sudo docker exec mujo-db mariadb-dump -u root -p'your_root_password' wordpress > $BACKUP_DIR/db_backup_$DATE.sql
    
    # 2. 設計図と静的ファイルのアーカイブ
    sudo tar -czf $BACKUP_DIR/files_backup_$DATE.tar.gz -C $WP_STACK_DIR docker-compose.yml wordpress nginx
    
    
    # 3. 権限の調整(生成されたバックアップファイルをuserが扱えるようにする)
    sudo chown user:user $BACKUP_DIR/*.sql $BACKUP_DIR/*.tar.gz
    
    # 4. 30日を経過した古いデータの削除 
    echo "Cleaning up old backups..."
    find $BACKUP_DIR -type f -mtime +30 -delete
    
    echo "--- Backup Completed: $(date "+%Y-%m-%d %H:%M:%S") ---"

    cronによる定期実行

    深夜3時に実行されるよう設定。静寂の中でバックアップを完結させる。

    0 3 * * * /home/user/scripts/it-mujo-backup.sh > /home/user/scripts/backup.log 2>&1
    Debian 13のcrontabエディタで、毎日深夜3時にバックアップスクリプトを実行するように設定した画面。
    運用を自動化し、データのポータビリティを継続的に確保するためのcron設定。

    3. 物理メディアへの退避:Samsung T7

    サーバー内部に保存したバックアップファイルを、定期的にhostへ引き出し、物理メディアへと書き出す。
    ここで使用するのが、NVMeの速度と堅牢性を備えた Samsung T7 である。

    選定理由:

    • 信頼性: NVMeベースの高速転送は、バックアップという「面倒な作業」の心理的ハードルを下げる。
    • 堅牢性: 移動先での執筆が多いエンジニアにとって、衝撃に強いアルミボディは必須だ。
    • 本質的価値: クラウドという虚空にあるデータを、確かな重みを持つ物理メディアに書き出した瞬間、記録は「自分のもの」になる。

    rsync を用い、host側のマウントポイント(T7)へデータを同期する。

    # node01からhostへ引き出し、そのままT7へ同期
    rsync -avz node01:/home/user/backups/daily/ /mnt/chromeos/removable/T7/it-mujo-backup/
    Chromebookのターミナルから、外部ストレージSamsung T7へバックアップデータを同期(rsync)している様子。
    rsyncによる物理メディアへの同期。クラウドのデータを自分の手に取り戻すプロセス。

    結び

    Vultrのスナップショットに甘んじず、自らスクリプトを書き、信頼できる物理メディアにデータを刻む。。

    流行が去り、インフラが変わっても、このデータさえあれば「IT-MUJO」はどこでも再建できる。その確信こそが、次の一歩を実直なものにする。


    執筆環境: host (Chromebook / Debian 13)
    公開基盤: node01 (Vultr / Debian 13 / Docker)
    接続環境: NordVPN (NordLynx)

  • テザリング環境におけるVPNの局在性:ChromebookへのNordVPN導入記

    テザリング環境におけるVPNの局在性:ChromebookへのNordVPN導入記

    「無常に漂う」執筆活動において、移動先での通信環境確保は避けられない課題である。私は主にスマートフォンによるUSBテザリングを選択している。Wi-Fiと比較して接続が安定し、同時に給電も行えるからだ。

    ここで一つ、インターネット上でしばしば曖昧に語られる「誤解」を解いておきたい。

    1. 検証:スマホ側VPNはPCを保護するか

    一般に「スマートフォン側でVPNを有効にしていれば、テザリング先のデバイスも保護される」という記述を見かけることがある。しかし、私の環境(AndroidからのUSBテザリング)において実機検証した結果、事実は異なった。

    スマートフォン側でNordVPNを有効にしても、USB経由で接続された「host(Chromebook/Debian 13)」の通信は、VPNトンネルを経由せず生のアドレスで送出されている。AndroidのOS仕様において、テザリングのトラフィックはVPNインターフェースをバイパスしてルーティングされるためだ。

    つまり、移動先での安全を担保するには、接続元である「host」側にも個別のVPNクライアントが不可欠である。

    2. hostへのNordVPN導入と環境構築

    結論として、私はhost(Debian 13)側にもNordVPNを導入した。

    導入プロセス

    Debian環境への導入は、公式が提供するインストール用スクリプトを利用した。GUI版を指定して実行することで、CLIを含めたクライアント一式がインストールされる。

    user@host:~$ sh ./install.sh -p nordvpn-gui

    インストール後、ログインを済ませることでGUI上からステータスの確認や詳細設定が可能となる。なお、プロトコルについてはデフォルトで高速な「NordLynx」が選択されており、特段の変更を必要とせず最適なパフォーマンスが得られた。

    Debian 13環境で動作するNordVPN GUI版の接続完了画面。
    host (Debian 13) 上で稼働するNordVPN GUI。視認性が高く、接続状況の把握に適している。

    通信経路の確定

    host側でVPNを確立した状態で curl ifconfig.me を実行し、グローバルIPアドレスがNordVPNサーバーのものに置換されていることを確認した。

    日本国内で信頼できるキャリア回線を利用している分には、VPNの必要性は低いかもしれない。しかし、海外の通信網を経由して node01 (Vultr) へSSH接続する局面においては、このトンネルこそが心理的な安全網となる。もちろん、国内外を問わず公衆Wi-Fiを利用する際にも、この設定は「標準」の防壁として機能する。

    3. 運用上の私見

    巷には「スマホ側でVPNをかければ万全」とする情報も散見されるが、スマートフォンOSのルーティング仕様を考えれば、PC側での個別接続が必須であることは明白である。

    複数のデバイスでVPNを動作させることは一見手間に思えるが、通信の出入り口をそれぞれの端末で独立して保護しておくことは、不確定要素の多い移動先でのエンジニアリングにおいて、極めて実直な選択であると考える。私のように移動先での安全を重視するエンジニアにとって、NordVPN は信頼に足るツールと言える。

    4. 結び:情報のデバッグ

    溢れる情報の中から真実を見極めるには、自身の環境での検証(デバッグ)に勝るものはない。

    USBテザリングという日常的な手段の中に潜むセキュリティの空白を、NordVPNの導入によって埋めることができた。これで再び、どこに漂っていても本質を記す準備が整った。

    5. 移動先でのエンジニアリングを支える機材

    今回の検証のような長時間の外出先での執筆・通信には、安定した電源供給が欠かせない。私は最小限の荷物で最大効率を得るため、以下の充電器を携行している。

    Anker Nano II 65W

    MacBookやChromebook(C523NA)を急速充電できる出力を持ちながら、極めてコンパクトな充電器。プラグを折り畳めるため、ガジェットポーチの中でも他の機材を傷つけない。


    執筆環境: host (Chromebook / Debian 13)
    公開基盤: node01 (Vultr / Debian 13 / Docker)
    接続環境: NordVPN (NordLynx)

  • 独自ドメインメールの最適解:Cloudflare Email Routingで運用コストを極限まで削る

    独自ドメインメールの最適解:Cloudflare Email Routingで運用コストを極限まで削る

    独自ドメインを取得した際、エンジニアが直面する「メールサーバーをどうするか」という問い。かつてはPostfixやDovecotを自前でビルドし、SPF、DKIM、DMARCの設定に心血を注ぐことが技術者の嗜みであった。

    しかし、現代において個人の技術ログを運用する上で、メールサーバーの維持管理、特にスパム対策やIPレピュテーションの監視にリソースを割くのは、本質的ではない。

    今回は、IT-MUJOの公開基盤であるCloudflareの「Email Routing」を活用し、サーバーレスで信頼性の高いメール受信環境を構築した記録を記す。

    1. 自前サーバーを「立てない」という選択

    ネットワークエンジニアとして、インフラを自前で構築する喜びは理解している。しかし、メールサーバーの運用は「負の資産」になりやすい。

    • 管理コスト: 絶え間ないセキュリティパッチの適用とスパムフィルタの調整。
    • リソースの最適化: 公開基盤 node01 (Vultr) のリソースは、検証やコンテンツ配信にこそ割くべきである。
    • 信頼性の担保: 大手プロバイダへの到達性を個人で維持し続けるのは困難を極める。

    「無常に漂い、本質を記す」本ブログにおいて、メール基盤は「堅牢かつ透明」であればそれで良い。Cloudflare Email Routingは、その最適解であった。

    2. Cloudflare Email Routing の構築

    構築は極めてシンプルである。Cloudflareのダッシュボード上で数回の操作を行うだけで完了する。

    設定プロセス

    1. Email Routingの有効化: Cloudflareのメニューから「メール」を選択し、機能を有効にする。
    2. ルートの作成: 「Get started with Email Routing」画面でカスタムアドレス [email protected] と、普段利用している転送先アドレスを入力する。
    3. DNSレコードの自動設定: Cloudflareが生成するMXレコードおよびTXT(SPF)レコードを確認し、ボタン一つでDNSへ適用する。

    技術的なポイント

    このプロセスで最も本質的なのは、Cloudflareがプロキシとして機能し、私たちのサーバー(node01)を介さずにメールを処理する点にある。サーバー側には一切のプロセスが発生しない。

    Cloudflare Email Routingの設定画面。admin@it-mujo.comの転送ステータスがActiveであることを示している。
    Cloudflareダッシュボードでの設定状況。ステータスがActiveであることを確認する。

    3. 疎通確認と運用の開始

    設定完了後、外部のアドレスから [email protected] 宛にテストメールを送信した。

    結果、わずか数秒で転送先の受信トレイに着信を確認。メールヘッダーを確認すると、Cloudflareのネットワークを経由して正しく処理されていることが証明された。

    この受信基盤が整ったことを受け、サイト内にお問い合わせページを新設した。

    4. 結び:エンジニアの引き算

    技術とは、足すことだけが進化ではない。不要な複雑さを削ぎ落とし、既存の堅牢なインフラを賢く利用することもまた、エンジニアリングの本質である。

    メールサーバーという重厚な装置を「メール転送」という軽量なサービスに置き換えたことで、私は再び、技術ログの執筆という本来のタスクに集中することができる。


    執筆環境: host (Chromebook / Debian 13)
    公開基盤: node01 (Vultr / Debian 13 / Docker)
    接続環境: NordVPN (NordLynx)

  • 拠点の構築:VultrとDocker、Cloudflareによる「基盤」の整備

    拠点の構築:VultrとDocker、Cloudflareによる「基盤」の整備

    1. はじめに:発信基盤としての node01

    手元の host で技術を研ぎ澄ます一方で、その本質を外の世界へ提示するための安定した拠点が必要になる。

    私は Vultr(東京リージョン)上に、本ブログの基盤となるサーバー node01 を構築した。特定の場所に縛られず、かつ実直な独立性を保つための「器」としての構築記録である。

    2. 構造:Docker Compose による LEMP スタック

    ホストOS(node01側のDebian 13)の環境を汚さず、移植性と再現性を確保するために、Docker Compose を採用した。これは現代のインフラ管理において合理的な選択である。

    • 構成: Nginx / MariaDB / WordPress (PHP-FPM)
    • 本質: ホストOSへの直接インストールを避け、コンテナとしてカプセル化(mujo-stack)することで、環境の「無」を維持しつつ、保守性を高めている。

    3. 防御:Cloudflare による多層防御

    ネットワークを外部に公開する以上、セキュリティを担保するのは管理上の「常識」である。過剰な装飾ではなく、実利に基づいた多層的な防御を敷いている。

    • 通信の保護: Cloudflare Origin CA 証明書を適用。Cloudflareと node01 間は Full (strict) モードで暗号化を完結させている。
    • WAFによるアクセス制御: 管理画面(/wp-admin 等)へのパスは Cloudflare WAF で常時遮断。執筆時のみ自身の特定IPを許可する「開門・封印」の運用を徹底している。
    • 境界防御: Vultr側のファイアウォールにて、HTTP/HTTPSポートのソースIPを Cloudflare のレンジのみに限定。直接の攻撃を物理的に遮断している。

    4. 結び:漂い続けるための静寂

    複雑に見える構成も、その目的は執筆に集中するための「静寂」を得ることに集約される。

    揺るぎない基盤が整い、ようやく「IT-MUJO」としての発信が本格的に始まる。


    執筆環境: host (Chromebook / Debian 13)
    公開基盤: node01 (Vultr / Debian 13 / Docker)
    接続環境: NordVPN (NordLynx)

  • 思考を加速させる:Wayland環境下での keyd によるキーマップ再定義

    思考を加速させる:Wayland環境下での keyd によるキーマップ再定義

    1. はじめに:Chromebookという「制約」との対峙

    ハードウェアとしてのChromebookは、Web端末として無駄を削ぎ落とした合理的な設計を持つ。その独特な制約を伴う構成は、Linuxを走らせる素材として興味深いが、一方でキーボードレイアウトにはエンジニアとして看過できない「欠落」がある。

    これらをいかにして自分の思考のリズムに合わせるか。今回は、Wayland環境下でも強力かつシンプルにキーマップを制御できる「keyd」を用いた解決策を記す。

    2. 標準機能の限界と keyd への移行

    当初は GNOME 標準の gsettings を用い、検索キー(Super)と左Ctrlの入れ替えを試みた。しかし、「物理キーの組み合わせ(例:Ctrl + Backspace を Delete にする)」といった柔軟な定義を実現するには、標準機能では力不足であった。

    複数の設定ツールが混在することは、管理の複雑化(不純物)を招く。私は gsettings の設定を「無」に戻し、すべてのキーマッピングを keyd という一つの器に集約することにした。

    3. keyd の導入と設定プロセス

    Debian 13 において keyd を導入し、設定ファイル /etc/keyd/default.conf を作成する。

    インストールと設定ファイルの作成

    user@host:~$ sudo apt update && sudo apt install keyd
    user@host:~$ sudo vi /etc/keyd/default.conf

    設定内容(/etc/keyd/default.conf)

    レイヤーの概念を用いることで、シンプルかつ強力にキーを再定義できる。

    [ids]
    # すべてのキーボードデバイスを対象にする
    *
    
    [main]
    # 1. 検索キー(leftmeta)と左Ctrl(leftcontrol)の入れ替え
    # 検索キーをcontrolレイヤーとして扱う
    leftmeta = layer(control)
    # 物理左Ctrlをmetaレイヤーとして扱う
    leftcontrol = layer(meta)
    
    # 2. 右AltをDeleteに割り当て
    rightalt = delete
    
    # 3. 物理左Ctrl + Backspace を Delete として扱う
    [meta]
    # metaレイヤー(物理左Ctrl押下時)のBackspaceをDeleteに定義
    backspace = delete

    4. サービスの有効化

    設定を反映させ、永続化するためにサービスを有効化・起動する。

    user@host:~$ sudo systemctl enable keyd
    user@host:~$ sudo systemctl start keyd

    5. 結び:指先が「標準」に馴染む

    設定を反映した瞬間、Chromebook特有の違和感は消え、私の指先は使い慣れた「標準」の操作感を取り戻した。

    「管理を一つに絞る」という判断が、環境の純度を高める。道具を自分に合わせることこそが、本質的な構築の醍醐味である。


    執筆環境: host (Chromebook / Debian 13)
    公開基盤: node01 (Vultr / Debian 13 / Docker)
    接続環境: NordVPN (NordLynx)

  • 標準の極致:ホスト名「host」の設定とDebian 13最小構成の選定

    標準の極致:ホスト名「host」の設定とDebian 13最小構成の選定

    1. はじめに:なぜ「host」という名を与えるのか

    Debianのインストールが完了した後、最初に行ったのは「個体名」の付与ではなく、標準への回帰である。

    私はこの機体に host というホスト名を与えた。RFC 1178では個性的で覚えやすい名前(固有名詞)の採用が推奨されているが、本ブログではあえてその対極を目指す。

    多くのRFCや技術文書において、host(あるいは mailns 等)は、特定の個体を示す名前ではなく、抽象的な役割や標準的なサンプルを示す記号として登場する。愛称を排し、あえてこの「記号」を名乗る。何者でもない「無」の状態から、私の本質的な構築が始まる。

    2. ホスト名の変更プロセス

    現代のDebianにおける、最も標準的でクリーンな変更手順を記す。

    user@debian:~$ sudo hostnamectl set-hostname host

    反映後の確認:

    user@host:~$ hostname
    host

    この user@host:~$ というプロンプトこそが、本ブログにおけるすべての技術ログの起点となる。

    3. 最小構成の確認と選定:プリインストールと追加パッケージ

    今回のDebian 13環境では、インストール直後の時点で sudocurl が既に利用可能な状態にあった。これら基本ツールが揃っていることを確認した上で、場所を問わず動作する開発環境を支える、最小限の構成を整える。

    プリインストール済み

    • sudo / curl: 既に導入済み。
    • vim.tiny: 標準で同梱。本格的なエディタや構成管理ツールへの移行は、今後の必要性に応じて検討する。

    追加インストールしたパッケージ

    • ufw: ファイアウォールの設定。不特定のネットワーク環境における入り口を絞る。
    • wget: 外部リソース取得の補完。
    • gnome-tweaks: デスクトップ環境における微調整用。
    user@host:~$ sudo apt update && sudo apt install -y ufw wget gnome-tweaks

    4. 結び:漂いのための地盤が整った

    ホスト名が決まり、最小限の道具と防御(ufw)が揃った。
    どこにあっても、この「host」が私の標準となる。ここからようやく、Wayland下でのキーマップ調整など、より深い本質の追求へと漂い始めることができる。


    執筆環境: host (Chromebook / Debian 13)
    公開基盤: node01 (Vultr / Debian 13 / Docker)
    接続環境: NordVPN (NordLynx)