<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>Cloudflare on 或る阿呆の記</title><link>https://hack-le.com/tags/cloudflare/</link><description>Recent content in Cloudflare on 或る阿呆の記</description><generator>Hugo -- gohugo.io</generator><language>ja</language><lastBuildDate>Thu, 17 Sep 2026 14:21:15 +0900</lastBuildDate><atom:link href="https://hack-le.com/tags/cloudflare/index.xml" rel="self" type="application/rss+xml"/><item><title>Ubuntu 24.04 で cloudflaredのアンインストール</title><link>https://hack-le.com/ubuntu-24-04-cloudflared-uninstall/</link><pubDate>Wed, 18 Feb 2026 10:49:54 +0900</pubDate><guid>https://hack-le.com/ubuntu-24-04-cloudflared-uninstall/</guid><description>&lt;p&gt;なんか公式ドキュメント見て見つからなかったのでメモ。Claude生成だがまぁあってそう。&lt;/p&gt;&#10;&lt;p&gt;環境&lt;/p&gt;&#10;&lt;ul&gt;&#10;&lt;li&gt;Ubuntu 24.04.3&lt;/li&gt;&#10;&lt;li&gt;cloudflaredはパッケージでインストール&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;p&gt;とりあえず停止。&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;sudo systemctl stop cloudflared&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;sudo systemctl disable cloudflared&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;パッケージでインストールした場合は以下。&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# パッケージをアンインストール&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;sudo apt remove cloudflared&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# 設定ファイルも含めて完全削除&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;sudo apt purge cloudflared&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# 不要な依存関係を削除&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;sudo apt autoremove&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# サービスファイルを削除&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;sudo rm /etc/systemd/system/cloudflared.service&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# Drop-In設定ディレクトリも削除&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;sudo rm -rf /etc/systemd/system/cloudflared.service.d&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# systemdをリロード&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;sudo systemctl daemon-reload&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;確認コマンド&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# cloudflaredが残っていないか確認&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;which cloudflared&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# プロセスが残っていないか確認&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;ps aux &lt;span class="p"&gt;|&lt;/span&gt; grep cloudflared&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# サービスの状態確認&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;systemctl status cloudflared&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;以上。&lt;/p&gt;&#10;</description></item><item><title>Cloudflareはなぜインターネットにご迷惑をおかけできたのか</title><link>https://hack-le.com/cloudflare-internet/</link><pubDate>Sun, 11 Jan 2026 00:00:00 +0900</pubDate><guid>https://hack-le.com/cloudflare-internet/</guid><description>&lt;p&gt;いまさら擦るのもなんですが、昨年(2025年)末にあったCloudflareの大規模障害について、思うことがあります。&lt;/p&gt;&#10;&lt;h2 id="一度目の障害"&gt;一度目の障害&#10;&lt;/h2&gt;&lt;p&gt;まず最初に11月18日の大規模障害があり、これは多くの衝撃を界隈に与えました。当時のITmediaのトップニュースはCloudflare一色でした。侵食されている。&lt;/p&gt;&#10;&lt;p&gt;&lt;img loading="lazy" sizes="(max-width: 767px) calc(100vw - 30px), (max-width: 1023px) 700px, (max-width: 1279px) 950px, 1232px" src="https://hack-le.com/images/uploads/2025/11/image-13-700x1303.png"&gt;&lt;/p&gt;&#10;&lt;p&gt;印象的だったのは、なぜかAdobe民が悲鳴をあげていたことです。聞くところによると、なんだか起動するたびに毎度オンラインのライセンス認証が必要な仕様らしく、その門番がCloudflareだったようなんですね。&lt;/p&gt;&#10;&lt;p&gt;本質的にオフラインの作業なのにと、多くの人が嘆いていましたが、原因に気づけているだけましだったのではないでしょうか。原因すらわからず、多くの不要な作業をして、さらにそのミスで取り返しのつかない消失など憂き目にあった人もいたかもしれません。&lt;/p&gt;&#10;&lt;p&gt;この障害について、Cloudflareは即座にポストモーテムを出しました（「&lt;a class="link" href="https://blog.cloudflare.com/ja-jp/18-november-2025-outage/" target="_blank" rel="noopener"&#10; &gt;2025年11月18日のCloudflareの障害&lt;/a&gt;」）。それが非常に迅速であったこと、また障害自体はあるものだいう理解で、SNSを見る限り界隈はどちらかというと対応がはやい、さすがだ、と称賛のようなムードがあったと記憶しています。またポストモーテムにあった「インターネットに多大なるご迷惑をおかけしましたことを深くお詫び申し上げます」というぽエティックな文言について、「カッコいい」と無邪気にツイートするエンジニアを見かけました。&lt;/p&gt;&#10;&lt;p&gt;一方私は、このサイトにCloudflare Tunnelを使っていたもので思いっきり影響を受けており、特に障害を責め立てる気はないものの、&lt;strong&gt;障害を起こしてカッコいい、とは思えませんでした&lt;/strong&gt;。ついでにいえば、ご迷惑をかけたのはインターネットではなく私だと思うが、私のところにメールが来ていない、とあまり愉快ではない気持ちがありました。&lt;/p&gt;&#10;&lt;h2 id="二度目の障害"&gt;二度目の障害&#10;&lt;/h2&gt;&lt;p&gt;インターネットにご迷惑かけてからほんの二週間後の12月5日、Cloudflareは再び大規模障害を起こしました（「&lt;a class="link" href="https://blog.cloudflare.com/ja-jp/5-december-2025-outage/" target="_blank" rel="noopener"&#10; &gt;2025年12月5日のCloudflareの障害&lt;/a&gt;」）。この時は「またかよ」という気持ちで、あまり界隈のムードも観察していませんでしたが、どうだったんでしょうね。さすがに二度目は白けていたでしょうか。&lt;/p&gt;&#10;&lt;p&gt;こうなると、根本的な構造に対する批判の声もあがります（「&lt;a class="link" href="https://innovatopia.jp/blockchain/blockchain-news/76535/" target="_blank" rel="noopener"&#10; &gt;ヴィタリック・ブテリン、CloudflareとAWS障害受けDAppsによる分散化インフラを提唱&lt;/a&gt;」）。&lt;/p&gt;&#10;&lt;h2 id="なぜご迷惑があったか"&gt;なぜご迷惑があったか&#10;&lt;/h2&gt;&lt;p&gt;さて、この件についてお思うことはいろいろありますが、まず&lt;strong&gt;なぜ私のサイトが落ちたのかを私の視点から問い直せば、それた端的に「Cloudflare Tunnelを使っていたから」になります&lt;/strong&gt;。なぜ使っていたのかといえば、CDN的な機能がほしいというより、証明書やルーティングが楽にできるからです。あとなんかDDoSみたいなことがあってもCloudflareが前段で受けるしなぁとかいう意識もあるかとは思います。&lt;/p&gt;&#10;&lt;p&gt;まぁこのサイトは個人でやっているものなのでその程度の理由ですけれど、ビジネスユースでも利用の本質は大して変わらないんじゃないでしょうか。ちょっと腐しましたがCloudflareは便利なサービスを提供していると思います。結局私も便利だから使っていたのですね。&lt;/p&gt;&#10;&lt;p&gt;そうして&lt;strong&gt;皆が便利だからと合理的に判断して使った結果、Cloudflare自体がインターネット全体の単一障害…になっている、というのはちょっと笑えないし、これこそがあるべきではないこと&lt;/strong&gt;に思えます。もっといえば、&lt;strong&gt;一民間企業のCloudflareがインターネット全体にご迷惑をおかけできること自体がおかしい&lt;/strong&gt;。少なくともおかしいと思わなければならないでしょう。たとえそれが一人ひとりの選択の結果であったとしても、その結果がこれならば、全体として素直に間違えていたと考えるべきだと思います。&lt;/p&gt;&#10;&lt;p&gt;しかし、今それを社会的に合理とする根拠がありません。多くの組織人は自分のサービスについてまでは責任を持ちますが、インターネットに責任は持ちませんし、持てません。それはCloudflareも同様です。Cloudflareが責任を持てるのは自社のインフラまでであって、それはインターネットではありませんし、あるべきでもありません。&lt;/p&gt;&#10;&lt;p&gt;したがって、少し言葉遊びになりますが、&lt;strong&gt;全員が合理的にふるまうと合理的に壊れるならば、誰かが不合理にふるまうことが、全員にとって合理的&lt;/strong&gt;、だと言えます。その不合理が搾取や強制のためであれば救われませんが、それが偶然や信条であれば、問題はありません。むしろ、今まで我々はずっとそうしてきたのだと思います。&lt;strong&gt;個人の合理が全体の不合理であるように、個人の不合理が全体の合理となる&lt;/strong&gt;。そういうこともあります。&lt;/p&gt;&#10;&lt;p&gt;なのでとりあえず私は、手間暇かけて、Cloudflare Tunnelよりも性能が低い終端とトンネルを、自サイト向けに作っていこうかと思います。&lt;/p&gt;&#10;</description></item><item><title>Cloudflareの違和感：サイバー攻撃じゃないからなんなのか</title><link>https://hack-le.com/cloudflare-cyber-attack/</link><pubDate>Sat, 22 Nov 2025 00:00:00 +0900</pubDate><guid>https://hack-le.com/cloudflare-cyber-attack/</guid><description>&lt;p&gt;先日はCloudflare大爆発でインターネットが壊れ、CloudflareのCDN使っている当サイトも落ちたんですわ。ちょうどいいタイミングで来てくれた方すみません。まぁ、察し……だったかもしれませんが。&lt;/p&gt;&#10;&lt;p&gt;&lt;strong&gt;Cloudflare使っているのは端的に言うとTLS終端が面倒くさいから&lt;/strong&gt;なんだけど、そういう人けっこう多いんじゃないかな。つくづくhttpsは無駄どころか害悪というか、ボディブローのようにWeb全体にダメージを与えている……実質強制しよったGoogleさんェ……。&lt;/p&gt;&#10;&lt;p&gt;しかしこうして障害が起きたときに無力なの見ると、やっぱりめんどくさがらずにちゃんとやるべきか……。ぐぬー。Cloudflare使う方が可用性は高いとかじゃないんだ、&lt;strong&gt;俺のサイトが落ちて、俺がそれに気づいているのに、俺が何もできない、それは俺のサイトと言えるのか&lt;/strong&gt;って、そういう話なんだ。うむー……ちょっと考えます。&lt;/p&gt;&#10;&lt;p&gt;で、この件についてCloudflareから全然詫びメールこねぇなと思いつつ、Gigazineで記事になっているのを読んだ。&lt;/p&gt;&#10;&lt;p&gt;&lt;a class="link" href="https://gigazine.net/news/20251119-cloudflare-outage-cdn/" target="_blank" rel="noopener"&#10; &gt;Cloudflareが大規模障害の原因を発表、XやChatGPTなどインターネット全体に影響を及ぼした障害はサイバー攻撃ではなくシステムの問題 - GIGAZINE&lt;/a&gt;&lt;/p&gt;&#10;&#10; &lt;blockquote&gt;&#10; &lt;p&gt;Cloudflareによると、障害の原因はシステムの不備であってサイバー攻撃ではないとのこと。Cloudflareは「今回の障害は直接的にも間接的にもサイバー攻撃や悪意ある活動によって引き起こされたものではありません」と述べ、他者からのシステム侵入を強く否定しています。&lt;/p&gt;&#10;&#10; &lt;/blockquote&gt;&#10;&lt;p&gt;読んだ時、だからなんだと思ったよ。&lt;strong&gt;サイバー攻撃だろうとシステムの問題だろうと、起きたことが変わるわけじゃない&lt;/strong&gt;。もちろん原因追及自体は重要なことだけれど、殊更にシステム侵入ではないと強調されても、知らんがなと思う。&lt;/p&gt;&#10;&lt;p&gt;この「&lt;strong&gt;銀行強盗を撃退できない銀行は許されないが、銀行員のミスで大規模やらかしはしゃーなし&lt;/strong&gt;」のような奇妙な空気感は、IT業界全体としてあるように思われる。しゃーなしは言い過ぎにしても、「サイバー攻撃ではない」と強く否定するのは、実際的な影響の問題というより、そちらのほうが沽券に関わる、と考えているからじゃないか。&lt;/p&gt;&#10;&lt;p&gt;しかしユーザからすれば、サイバー攻撃なのかシステムのやらかしなのかは関係がない。&lt;strong&gt;システムダウンさせるのが悪意のある攻撃者なのか、悪意はないけど内部の&lt;/strong&gt;無邪気な阿呆なのか、前者ではないと強調する意義はよくわからない&lt;/strong&gt;。これからも無邪気な阿呆がダウンさせ続けたり情報漏洩させるなら、何も安心できないと思う。&lt;/p&gt;&#10;&lt;p&gt;システムのやらかしなら情報流出が起きないわけではなく、実際「違うユーザの情報が表示される」というマークシートがズレたみたいなやらかしは稀によくある。最近だとChatGPTのやらかしとかあった（「&lt;a class="link" href="https://www.itmedia.co.jp/news/articles/2303/25/news051.html" target="_blank" rel="noopener"&#10; &gt;ChatGPTで個人情報漏えい OpenAIが原因と対策を説明 - ITmedia NEWS&lt;/a&gt;」）。&lt;/p&gt;&#10;&lt;p&gt;システムは机上の論理的存在ではなく、現実に動くモノだ。&lt;strong&gt;価値が生まれるのは設計された時ではなく運用された時&lt;/strong&gt;で、&lt;strong&gt;設計と運用は一体&lt;/strong&gt;となっている。しかしながら、技術屋というのは設計に寄りがちな人種が多いらしい。確かにまぁ、設計のほうがより技術らしいというか、頭のいい感じにはなるんだがね。&lt;/p&gt;&#10;&lt;p&gt;外部からの攻撃ではないんだと言いたがるのは、設計の問題ではないんだとつまり言いたいのかもしれない。技術力の敗北ではないのだと。&lt;/p&gt;&#10;&lt;p&gt;だが原因がどこにあろうと、起きたことは大規模障害。結局、&lt;strong&gt;運用の敗北もまた技術の敗北&lt;/strong&gt;だ。&lt;/p&gt;&#10;&lt;p&gt;別にそれ自体が悪いってんじゃない。実際、100%防ぐことは不可能だ。それはそうだ。ただ、なんで僕は僕のサイトが落ちてるのに何もできないんだとか、全然詫びメールこねぇなぁとか、普段は「はやくアップデートしろ！攻撃されても知らんぞー！！」とアップデートを脅迫的にせっつくのに、現実には何をしたところで勝手にやらかすやんとか、そういうことは思うよ。&lt;/p&gt;&#10;&lt;p&gt;なんというか、対等じゃないし、こっちに目が向いてないな、ということはひしひし感じる。ブログにポストポーテム「&lt;a class="link" href="https://blog.cloudflare.com/ja-jp/18-november-2025-outage/" target="_blank" rel="noopener"&#10; &gt;2025年11月18日のCloudflareの障害&lt;/a&gt;」あがってるから読んだんだけどさ。&lt;/p&gt;&#10;&#10; &lt;blockquote&gt;&#10; &lt;p&gt;Cloudflareチーム全体を代表し、本日インターネットに多大なるご迷惑をおかけしましたことを深くお詫び申し上げます。&lt;/p&gt;&#10;&#10; &lt;/blockquote&gt;&#10;&lt;p&gt;&lt;strong&gt;君らが迷惑かけたのはインターネットじゃなくて俺だよ&lt;/strong&gt;。君らにとってはインターネットなんだろうけれど、俺にとってはたった一つのサイトなんさ。知ったこっちゃなかろうが。いや、一応ちゃんと前段で「お客様」にも詫びてるんだけどさ。まぁ、それだけの責任を感じているというレトリックなのはわかるよ。そうなんだろう。実は俺もたった一つのサイトってのは嘘だからな。けっこうサイトやってんのさ。CF使ってないサイトは落ちなかった。レトリックだよ。しかしそれにしても、メールこねぇな。&lt;/p&gt;&#10;&lt;p&gt;&lt;strong&gt;理念を見て人を見ない時代&lt;/strong&gt;。そういう違和感がずっとある。&lt;/p&gt;&#10;&lt;p&gt;&amp;lt;関連記事&amp;gt;&lt;/p&gt;&#10;&lt;div class="blog-card-wrapper"&gt;&#10; &lt;a href="https://hack-le.com/https63/" class="blog-card"&gt;&#10; &lt;div class="blog-card-content"&gt;&#10; &lt;div class="blog-card-label"&gt;&#10; &lt;svg xmlns="http://www.w3.org/2000/svg" width="13" height="13" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"&gt;&lt;path d="M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.71"&gt;&lt;/path&gt;&lt;path d="M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71"&gt;&lt;/path&gt;&lt;/svg&gt;&#10; &lt;span&gt;あわせて読みたい&lt;/span&gt;&#10; &lt;/div&gt;&#10; &lt;div class="blog-card-title"&gt;Google様の言いつけに従って、https化の準備をしなくてはならない&lt;/div&gt;&#10; &lt;div class="blog-card-url"&gt;/https63/&lt;/div&gt;&#10; &lt;/div&gt;&#10; &lt;div class="blog-card-thumbnail"&gt;&#10; &lt;img src="https://hack-le.com/images/uploads/2018/02/6e0afd72eb97b23f987496e5f090e9d3.webp" alt="Google様の言いつけに従って、https化の準備をしなくてはならない" loading="lazy" /&gt;&#10; &lt;/div&gt;&#10; &lt;/a&gt;&#10;&lt;/div&gt;&#10;&#10;&lt;div class="blog-card-wrapper"&gt;&#10; &lt;a href="https://hack-le.com/yaranakuteiikotobakarishiteiru/" class="blog-card"&gt;&#10; &lt;div class="blog-card-content"&gt;&#10; &lt;div class="blog-card-label"&gt;&#10; &lt;svg xmlns="http://www.w3.org/2000/svg" width="13" height="13" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"&gt;&lt;path d="M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.71"&gt;&lt;/path&gt;&lt;path d="M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71"&gt;&lt;/path&gt;&lt;/svg&gt;&#10; &lt;span&gt;あわせて読みたい&lt;/span&gt;&#10; &lt;/div&gt;&#10; &lt;div class="blog-card-title"&gt;やらなくていいことばかりしている&lt;/div&gt;&#10; &lt;div class="blog-card-url"&gt;/yaranakuteiikotobakarishiteiru/&lt;/div&gt;&#10; &lt;/div&gt;&#10; &lt;div class="blog-card-thumbnail"&gt;&#10; &lt;img src="https://hack-le.com/images/uploads/2025/05/zakki-scrible.webp" alt="やらなくていいことばかりしている" loading="lazy" /&gt;&#10; &lt;/div&gt;&#10; &lt;/a&gt;&#10;&lt;/div&gt;&#10;&#10;</description></item><item><title>LAN内のGiteaをCloudflare Tunnel経由で公開する</title><link>https://hack-le.com/lan-gitea-cloudflare-tunnel/</link><pubDate>Tue, 11 Nov 2025 00:00:00 +0900</pubDate><guid>https://hack-le.com/lan-gitea-cloudflare-tunnel/</guid><description>&lt;p&gt;LAN内でええやんと思っていたのだが、色々と面倒臭くなったので、結局外部公開する。例によってCloudflare Tunnel経由で……。&lt;/p&gt;&#10;&lt;h2 id="環境"&gt;環境&#10;&lt;/h2&gt;&lt;ul&gt;&#10;&lt;li&gt;M2 Pro Mac mini, Intel Mac mini 2018&lt;/li&gt;&#10;&lt;li&gt;macOS 14.7.7 (Sonoma)&lt;/li&gt;&#10;&lt;li&gt;gitea 1.24.5 (via brew)&lt;/li&gt;&#10;&lt;li&gt;&lt;code&gt;brew services start gitea&lt;/code&gt;で起動&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;h2 id="構成"&gt;構成&#10;&lt;/h2&gt;&lt;pre class="mermaid" style="visibility:hidden"&gt;graph TD&#10;cfi(Cloudflare)&#10;cfi --&gt; cf&#10;subgraph LAN&#10;cf(Cloudflare Tunnel)&#10;gitea(Gitea)&#10;end&#10;cf --&gt;|プライベートIP| gitea&lt;/pre&gt;&lt;p&gt;Giteaから見るとリバースプロキシを噛ませたような感じになる。&lt;/p&gt;&#10;&lt;h2 id="手順"&gt;手順&#10;&lt;/h2&gt;&lt;h3 id="サインアップの禁止"&gt;サインアップの禁止&#10;&lt;/h3&gt;&lt;div class="blog-card-wrapper"&gt;&#10; &lt;a href="https://hack-le.com/gitea-on-mac-signup/" class="blog-card"&gt;&#10; &lt;div class="blog-card-content"&gt;&#10; &lt;div class="blog-card-label"&gt;&#10; &lt;svg xmlns="http://www.w3.org/2000/svg" width="13" height="13" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"&gt;&lt;path d="M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.71"&gt;&lt;/path&gt;&lt;path d="M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71"&gt;&lt;/path&gt;&lt;/svg&gt;&#10; &lt;span&gt;あわせて読みたい&lt;/span&gt;&#10; &lt;/div&gt;&#10; &lt;div class="blog-card-title"&gt;Gitea on Macのサインアップ（登録）を禁止する&lt;/div&gt;&#10; &lt;div class="blog-card-url"&gt;/gitea-on-mac-signup/&lt;/div&gt;&#10; &lt;/div&gt;&#10; &lt;div class="blog-card-thumbnail"&gt;&#10; &lt;img src="https://hack-le.com/images/uploads/2025/10/output-73.webp" alt="Gitea on Macのサインアップ（登録）を禁止する" loading="lazy" /&gt;&#10; &lt;/div&gt;&#10; &lt;/a&gt;&#10;&lt;/div&gt;&#10;&#10;&lt;h3 id="既存リポジトリを最新に反映する"&gt;既存リポジトリを最新に反映する&#10;&lt;/h3&gt;&lt;p&gt;remoteと差分があると面倒くさくなるので、できるだけ最新を反映しておく。&lt;/p&gt;&#10;&lt;h3 id="web画面の設定"&gt;Web画面の設定&#10;&lt;/h3&gt;&lt;p&gt;Cloudflare TunnelでWebの外部公開用のサブドメインを作成する。&lt;/p&gt;&#10;&lt;p&gt;&lt;code&gt;app.ini&lt;/code&gt;の&lt;code&gt;[server]&lt;/code&gt;より以下となるようにする。&lt;/p&gt;&#10;&lt;table&gt;&#10;&#9;&lt;thead&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;th&gt;項目&lt;/th&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;th&gt;値&lt;/th&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;th&gt;説明&lt;/th&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&lt;/thead&gt;&#10;&#9;&lt;tbody&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;&lt;code&gt;PROTOCOL&lt;/code&gt;&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;&lt;code&gt;http&lt;/code&gt;&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;CloudflareがHTTPSを終端&lt;/td&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;&lt;code&gt;HTTP_ADDR&lt;/code&gt;（または&lt;code&gt;DOMAIN&lt;/code&gt;）&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;&lt;code&gt;127.0.0.1&lt;/code&gt;&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;Giteaが実際に待ち受けるアドレス&lt;/td&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;&lt;code&gt;HTTP_PORT&lt;/code&gt;&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;&lt;code&gt;3000&lt;/code&gt;&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;内部ポート（自由）&lt;/td&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;&lt;code&gt;ROOT_URL&lt;/code&gt;&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;&lt;code&gt;https://git.example.com/&lt;/code&gt;&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;外部公開URL&lt;/td&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&lt;/tbody&gt;&#10;&lt;/table&gt;&#10;&lt;p&gt;https経由ではこれでできる。&lt;/p&gt;&#10;&lt;h3 id="やるならsshの設定"&gt;（やるなら）sshの設定&#10;&lt;/h3&gt;&lt;p&gt;sshを使う場合、Cloudflareでssh用の別口のサブドメインを作成し、ssh over httpsでアクセスする。Web用の設定と併せて以下のような感じになる。&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="o"&gt;[&lt;/span&gt;server&lt;span class="o"&gt;]&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nv"&gt;PROTOCOL&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; http&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nv"&gt;DOMAIN&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; 127.0.0.1&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nv"&gt;HTTP_PORT&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; Web用ポート&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nv"&gt;ROOT_URL&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; https://Web用ドメイン&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nv"&gt;DISABLE_SSH&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nb"&gt;false&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nv"&gt;START_SSH_SERVER&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nb"&gt;true&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nv"&gt;SSH_DOMAIN&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; SSH用ドメイン&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nv"&gt;SSH_PORT&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="m"&gt;22&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nv"&gt;LFS_START_SERVER&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nb"&gt;true&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nv"&gt;LFS_JWT_SECRET&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; hoge&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nv"&gt;OFFLINE_MODE&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nb"&gt;false&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;サーバーは再起動する。&lt;/p&gt;&#10;&lt;p&gt;クライアント側でover httpsをとなるように &lt;code&gt;~/.ssh/config&lt;/code&gt;に以下を入れる。&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;Host SSH用ドメイン&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; ProxyCommand cloudflared access ssh --hostname %h&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; User SSHユーザ名&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h3 id="既存のリポジトリでremote変更"&gt;既存のリポジトリでremote変更&#10;&lt;/h3&gt;&lt;p&gt;現在の設定の確認。&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;git remove -v&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;これを置き換える。Web画面からリポジトリを見て、ssh用のcloneコマンドから以下のように置き換え。&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;git remote set-url origin SSHユーザ名@SSHドメイン:user/repo.git&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;動作確認。&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;git fetch origin&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;git push origin main&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;リモートにコミットがあってマージするなら &lt;code&gt;git pull --rebase origin master&lt;/code&gt;、強制的に上書きするときは&lt;code&gt;git push -f&lt;/code&gt;。&lt;/p&gt;&#10;</description></item><item><title>脱クラウドとは何か</title><link>https://hack-le.com/datsucloud/</link><pubDate>Mon, 27 Oct 2025 00:00:00 +0900</pubDate><guid>https://hack-le.com/datsucloud/</guid><description>&lt;p&gt;最近、サイトのビッグテーマとして、脱クラウドを掲げセルフホスト的な記事を書いていこうかなと思っている。ってか脱SaaSというほうがいいかもしれんね。&lt;/p&gt;&#10;&lt;p&gt;なんにせよ、そもそも脱クラウドとは何か？という問題があるかなぁ、とは思った。たとえば僕はガンガンCloudflare Tunnelを使っているし、またそれを前提とした構成を書いていくことになるのだが、脱クラウドなのにCloudflare Tunnelは使っていいの？という疑問は浮かぶように思われた。&lt;/p&gt;&#10;&lt;p&gt;これについての回答は、&lt;strong&gt;Cloudflare Tunnelの仕事は本質的に置き換え可能&lt;/strong&gt;だから問題ない、となる。Cloudflare Tunnelは色々やっているが、その本質的なコアはNAT越えとTLS終端だと思う。特にセルフホスト的な見方だとそうなる。これらはいずれも面倒くさいだけで、できないものではない。面倒くさいだけで。まぁ本当にしんどい。しんどかったので自宅サーバはおしまいみたいなこと考えていた。&lt;/p&gt;&#10;&lt;p&gt;&lt;strong&gt;脱クラウドとは、Webサービスを使わないことではないし、インターネットの外に出て行かないことではない。重要なことは、選択肢を奪われないこ&lt;/strong&gt;とだ。つまり、&lt;strong&gt;置き換えられないものをできるだけ使わない&lt;/strong&gt;、といえる。置き換えが難しいのは、たとえばデータや人間関係（信頼関係）を中央集権サーバに預けるようなものだ。その手のクラウドサービスは、データと人間関係を人質を取られているような感じなのでできれば避けたい。ビジネスロジックを預けるのも危険度は上がる。ロジックは頑張ればなんとかなると思うけど。データと人間関係については、リセットの覚悟が必要になるね。&lt;/p&gt;&#10;&lt;p&gt;表にすると、以下のようにまとめられる。&lt;/p&gt;&#10;&lt;table&gt;&#10;&#9;&lt;thead&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;th&gt;軸&lt;/th&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;th&gt;依存の種類&lt;/th&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;th&gt;判定&lt;/th&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&lt;/thead&gt;&#10;&#9;&lt;tbody&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;&lt;strong&gt;データ&lt;/strong&gt;&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;ストレージ・メタデータ・履歴を預けているか&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;危険&lt;/td&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;&lt;strong&gt;関係&lt;/strong&gt;&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;ID・アカウント・フォロー構造を預けているか&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;超危険&lt;/td&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;&lt;strong&gt;ロジック&lt;/strong&gt;&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;ビジネスルール・自動化・運用を預けているか&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;注意&lt;/td&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;&lt;strong&gt;経路&lt;/strong&gt;&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;通信や転送の経路を借りているだけか&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;安全寄り&lt;/td&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&lt;/tbody&gt;&#10;&lt;/table&gt;&#10;&lt;p&gt;Cloudflare Tunnelのコアは経路に相当する。なので、別に問題ない、という判断。本格的に機能を使い始めるとロジックも預けちゃうと思うけどね。そうしたら依存度は上がるね。&lt;/p&gt;&#10;&lt;p&gt;まぁでも、別に依存すること自体をああだこうだ言う気はないんだ。それぞれ事情があるだろうし。僕も使ってるし依存している——というより気づかない間に依存していた——サービスなんていっぱいあるし。そもそも&lt;strong&gt;DNSに依存してるし&lt;/strong&gt;。経路は安全寄りといったけど、DNSだけは別……というかDNSはその本質が関係なんだよねぇ。&lt;/p&gt;&#10;&lt;p&gt;いずれにせよ、何かしら依存しないとWebは成り立たないのはそう。っていうか普通に使っていると相当依存するよね。だからこそ脱クラウドとか言い始めているわけで、クラウド依存していなければそもそも脱する必要がない。&lt;/p&gt;&#10;&lt;p&gt;&lt;strong&gt;逆説的に、脱クラウドとはクラウド依存患者であることの告白&lt;/strong&gt;である。そして何故依存したのか？という個人的な問いなしに脱クラウドはありえない。そこには必ず何かを求めた経緯があるはずだ。それと向き合って、現実を見て、過去を振り返り、未来を考えて、何を求めたのか、求めたものは得られたのか、得られていないのか、まだ求めているのか、これからも求めるのか、そもそも本当に求めていたのか、そういう問いかけは必ずいる。&lt;/p&gt;&#10;&lt;p&gt;ゼロイチじゃないので、何をどうするのか、都度自分の判断になる。ああしろこうしろという気はまったくないし、逆に言われる気もない。各自勝手にやるがいい。あるいは、&lt;strong&gt;勝手にやれるべきだ&lt;/strong&gt;。まぁそんな感じだよ。&lt;/p&gt;&#10;&lt;p&gt;&amp;lt;関連記事&amp;gt;&lt;/p&gt;&#10;&lt;div class="blog-card-wrapper"&gt;&#10; &lt;a href="https://hack-le.com/45948138-2/" class="blog-card"&gt;&#10; &lt;div class="blog-card-content"&gt;&#10; &lt;div class="blog-card-label"&gt;&#10; &lt;svg xmlns="http://www.w3.org/2000/svg" width="13" height="13" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"&gt;&lt;path d="M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.71"&gt;&lt;/path&gt;&lt;path d="M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71"&gt;&lt;/path&gt;&lt;/svg&gt;&#10; &lt;span&gt;あわせて読みたい&lt;/span&gt;&#10; &lt;/div&gt;&#10; &lt;div class="blog-card-title"&gt;自宅サーバーは浪漫枠&lt;/div&gt;&#10; &lt;div class="blog-card-url"&gt;/45948138-2/&lt;/div&gt;&#10; &lt;/div&gt;&#10; &lt;div class="blog-card-thumbnail"&gt;&#10; &lt;img src="https://hack-le.com/images/uploads/2026/09/eyecatch_2738_1789453565.webp" alt="自宅サーバーは浪漫枠" loading="lazy" /&gt;&#10; &lt;/div&gt;&#10; &lt;/a&gt;&#10;&lt;/div&gt;&#10;&#10;</description></item><item><title>外出先からAndroidタブレットで自宅PCにSSHでログインしてターミナルによる開発生活</title><link>https://hack-le.com/android-pc-ssh/</link><pubDate>Tue, 14 Oct 2025 00:00:00 +0900</pubDate><guid>https://hack-le.com/android-pc-ssh/</guid><description>&lt;p&gt;やりたいことは表題のとおり。なんかこう、省エネで外から開発するのに最低限必要な、でも普段使いのブランジングとかには困らなくて、かさばらなくて……そういうのないかなぁMabは高いしなぁ、とか思っていたところ、タブレット良いのでは？という風に思われた。&lt;/p&gt;&#10;&lt;p&gt;まぁ現実的には色々と制約があるのだが、とりあえず最低限のことはできそう。&lt;/p&gt;&#10;&lt;h2 id="環境および前提"&gt;環境および前提&#10;&lt;/h2&gt;&lt;ul&gt;&#10;&lt;li&gt;Android&#10;&lt;ul&gt;&#10;&lt;li&gt;Lenovo Yoga Tab Plus&#10;&lt;ul&gt;&#10;&lt;li&gt;SoC: Snapdragon 8 Gen 3&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;/li&gt;&#10;&lt;li&gt;システムバージョン 17.0.12.046&lt;/li&gt;&#10;&lt;li&gt;Android 15&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;/li&gt;&#10;&lt;li&gt;ホストマシン&#10;&lt;ul&gt;&#10;&lt;li&gt;M2 Pro Mac mini&lt;/li&gt;&#10;&lt;li&gt;macOS 14.7.7&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;/li&gt;&#10;&lt;li&gt;インフラ&#10;&lt;ul&gt;&#10;&lt;li&gt;Cloudflare Tunnelを使う&#10;&lt;ul&gt;&#10;&lt;li&gt;またかよ&#10;&lt;ul&gt;&#10;&lt;li&gt;便利だからつい……&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;/li&gt;&#10;&lt;li&gt;つまり独自ドメイン必須&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;p&gt;今回いれたやつ&lt;/p&gt;&#10;&lt;ul&gt;&#10;&lt;li&gt;Termux&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;p&gt;JuiceSSHなどが有名らしいんだが、使って見ると見た目はモダンだけど逆にわかりづらかった。Termuxのほうがターミナル民にとっては親しみやすいのではないかと思うがどうか。無料だし。&lt;/p&gt;&#10;&lt;p&gt;ただ、マルチユーザでやると、Termuxはプライマリユーザでないと使えないという制約があった……。&lt;/p&gt;&#10;&lt;h2 id="lan内での接続"&gt;LAN内での接続&#10;&lt;/h2&gt;&lt;p&gt;まずLAN内でやる準備。ホストマシン側は既に受け入れ準備できているものとする。&lt;/p&gt;&#10;&lt;h3 id="androidの設定"&gt;Androidの設定&#10;&lt;/h3&gt;&lt;p&gt;まずTermuxをインストール。そしたら鍵認証の準備。pkgはaptのラッパーらしい。&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-yaml" data-lang="yaml"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="l"&gt;pkg install openssh&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="l"&gt;ssh-keygen -t ed25519 &lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="c"&gt;# 鍵ペア生成 rsa でも別に&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;なんらかの手段でホストマシンに鍵を送る。自分はAndroidストレージへのアクセスを許可をして、鍵をコピーし、さらにDropbox経由で転送するというよくわからない手順をした。&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-yaml" data-lang="yaml"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="l"&gt;termux-setup-storage &lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="c"&gt;# Androidストレージへアクセス許可&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c"&gt;# 公開鍵をMacに転送して設定&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;あとお好みでtmuxなど入れておくと良い。&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-yaml" data-lang="yaml"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="l"&gt;pkg install tmux&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="l"&gt;pkg install emacs&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h3 id="ホストマシン"&gt;ホストマシン&#10;&lt;/h3&gt;&lt;p&gt;&lt;code&gt;authorized_keys&lt;/code&gt;に公開鍵を追加する。&lt;/p&gt;&#10;&lt;h3 id="再びandroid"&gt;再びAndroid&#10;&lt;/h3&gt;&lt;p&gt;ログイン実験。&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-yaml" data-lang="yaml"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="l"&gt;ssh hogetaro@ホストマシンのIP&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;入れたらOK。&lt;/p&gt;&#10;&lt;h2 id="インターネットからの接続"&gt;インターネットからの接続&#10;&lt;/h2&gt;&lt;p&gt;LANがOKなら次はいよいよネットから。&lt;/p&gt;&#10;&lt;h3 id="cloudflare-tunnel"&gt;Cloudflare Tunnel&#10;&lt;/h3&gt;&lt;p&gt;例によってZero Trustから、ホストマシンのポート22に向けて送る設定をする。&lt;/p&gt;&#10;&lt;h3 id="ホストマシン-1"&gt;ホストマシン&#10;&lt;/h3&gt;&lt;p&gt;cloudflaredも入れて、受け入れ準備できているものとする、といったものの、一応鍵認証のみ、パスワード認証を受け付けない、程度のことは確認しておく。&lt;/p&gt;&#10;&lt;h3 id="android"&gt;Android&#10;&lt;/h3&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-yaml" data-lang="yaml"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="l"&gt;pkg install cloudflared&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;SSH over HTTPSとなるので、以下のように設定する。&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-yaml" data-lang="yaml"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c"&gt;# ~/.ssh/config に設定&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="l"&gt;Host 独自ドメイン&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l"&gt;ProxyCommand cloudflared access ssh --hostname %h&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l"&gt;User ユーザ名&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;そしたら以下で入れるかを確認する。&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-yaml" data-lang="yaml"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="l"&gt;ssh 独自ドメイン&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;入れたらOK。&lt;/p&gt;&#10;&lt;h2 id="所感課題など"&gt;所感、課題など&#10;&lt;/h2&gt;&lt;p&gt;とりあえずこれでターミナルライフを送れるようになる。そしてLenovo Yoga Tab PlusのPCモードはなかなか便利であるため、けっこう快適……に思うのだが、やはり&lt;strong&gt;日本語入力変換という壁が立ちはだかる&lt;/strong&gt;。日本語使わなければいいという豪の者もいるかもしれないが、普通にClaude Codeに日本語で相談しているんでさすがに。ファイル名日本語のものだってあるわけなのだし。&lt;/p&gt;&#10;&lt;p&gt;また、僕の場合はHHKB US配列という制約があるため、キーの数は少ないしでなかなか苦戦している。Braveでは日本語入力できるのだが、どういうわけかtmuxではできない……操作が競合している可能性とかあるかもしれない（Ctrl + Spaceで切り替えだったので）。このへんまだ調査が必要だけれど、とりあえず別途かなぁ。&lt;/p&gt;&#10;&lt;p&gt;なんかもうMacBook買えばよいのではないか？という気持ちになりつつも、今あるものは使わないとの精神。&lt;/p&gt;&#10;&lt;p&gt;[itemlink post_id=&amp;ldquo;17028&amp;rdquo;]&lt;/p&gt;&#10;</description></item><item><title>ConoHaのメールサーバ（アプリケーションサーバ）をやってみたが簡単過ぎて言うことがない</title><link>https://hack-le.com/conoha-mail-server/</link><pubDate>Wed, 24 Sep 2025 00:00:00 +0900</pubDate><guid>https://hack-le.com/conoha-mail-server/</guid><description>&lt;p&gt;うちのブログはConoHaのVPS上に構築しており、特に不満もないので、折に触れてConoHaの宣伝をしている。で、うちのサイトから契約して使ってみた人もいたようで、有り難いことにクーポンをもらった。&lt;/p&gt;&#10;&lt;p&gt;もらったからには何かしら試して報告しないとなぁと思ったものの、既にVPSは契約しているしどうしたもんかな、と思ったところで、前々から気になっていたアプリケーションサーバのメールサーバを試してみることにした。&lt;/p&gt;&#10;&lt;p&gt;なんか引っかかるかなと思ったのだけれど、契約して30分で普通にGmailと送受信できて拍子抜けしている。言うことがない。&lt;/p&gt;&#10;&lt;h2 id="契約から設定"&gt;契約から設定&#10;&lt;/h2&gt;&lt;p&gt;言うことがない、ではあまりにもなんなので、もう少し何か言うことにする。&lt;/p&gt;&#10;&lt;h3 id="契約"&gt;契約&#10;&lt;/h3&gt;&lt;p&gt;まず契約の仕方はコンソール画面から、サーバー追加でメールサーバを選ぶ。以上。&lt;/p&gt;&#10;&lt;p&gt;&lt;img loading="lazy" sizes="(max-width: 767px) calc(100vw - 30px), (max-width: 1023px) 700px, (max-width: 1279px) 950px, 1232px" src="https://hack-le.com/images/uploads/2025/09/95b24b1ccd585bb2a99cc2ca0d64dbca-700x423.webp"&gt;&lt;/p&gt;&#10;&lt;p&gt;&lt;em&gt;スナック菓子感覚で契約&lt;/em&gt;&lt;/p&gt;&#10;&lt;p&gt;起動したら、コンソールからメールサーバを選んで設定していく。手順は「&lt;a class="link" href="https://support.conoha.jp/v/mail-owned-domain/#02" target="_blank" rel="noopener"&#10; &gt;メールサーバーで独自ドメインを使う｜ConoHa VPSサポート&lt;/a&gt;」にあるけどさらっと書く。&lt;/p&gt;&#10;&lt;p&gt;「ドメインリスト」で+ドメインして、持っているドメインを追加する。&lt;/p&gt;&#10;&lt;p&gt;&lt;img loading="lazy" sizes="(max-width: 767px) calc(100vw - 30px), (max-width: 1023px) 700px, (max-width: 1279px) 950px, 1232px" src="https://hack-le.com/images/uploads/2025/09/image-8-700x90.png"&gt;&lt;/p&gt;&#10;&lt;p&gt;追加したらその下の「メールアドレスリスト」でほしいメールアドレスを追加する。&lt;/p&gt;&#10;&lt;h3 id="dnsの設定"&gt;DNSの設定&#10;&lt;/h3&gt;&lt;p&gt;で、早速使っていきたいところだが、ここで&lt;strong&gt;MX/DKIM/SPF/DMARCの設定をDNSでしないといけない&lt;/strong&gt;。MXはともかくDKIM/SPF/DMARCはなんぞ、という人もいると思われるが、これが何かについては下記の記事を参照。やらないと迷惑メール扱いになる可能性が上がってしまうのでやろう。個人的にはあんまり意味ないと思っているがこれも時代なので仕方が無い。&lt;/p&gt;&#10;&lt;div class="blog-card-wrapper"&gt;&#10; &lt;a href="https://hack-le.com/dkim-spf-dmarc/" class="blog-card"&gt;&#10; &lt;div class="blog-card-content"&gt;&#10; &lt;div class="blog-card-label"&gt;&#10; &lt;svg xmlns="http://www.w3.org/2000/svg" width="13" height="13" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"&gt;&lt;path d="M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.71"&gt;&lt;/path&gt;&lt;path d="M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71"&gt;&lt;/path&gt;&lt;/svg&gt;&#10; &lt;span&gt;あわせて読みたい&lt;/span&gt;&#10; &lt;/div&gt;&#10; &lt;div class="blog-card-title"&gt;独自ドメインでメールするために、DKIM/SPF/DMARCのお勉強&lt;/div&gt;&#10; &lt;div class="blog-card-url"&gt;/dkim-spf-dmarc/&lt;/div&gt;&#10; &lt;/div&gt;&#10; &lt;div class="blog-card-thumbnail"&gt;&#10; &lt;img src="https://hack-le.com/images/uploads/2026/09/eyecatch_14196_1789100822.webp" alt="独自ドメインでメールするために、DKIM/SPF/DMARCのお勉強" loading="lazy" /&gt;&#10; &lt;/div&gt;&#10; &lt;/a&gt;&#10;&lt;/div&gt;&#10;&#10;&lt;p&gt;作成したメールアドレスを開くと、DNS情報としてDKIMとSPFの情報があるので、それぞれホストと値をコピペして、各々が管理しているレジストラないしリセラーのところで編集作業。特に指定はない。&lt;strong&gt;ConoHaのDNSサービスを使わなくて良い&lt;/strong&gt;。僕はCloudflareに隷従している。&lt;/p&gt;&#10;&lt;ul&gt;&#10;&lt;li&gt;MX: 「サーバー情報」に載ってるやつを記載。優先度は10でいんじゃない&lt;/li&gt;&#10;&lt;li&gt;DKIM: メールアドレスを選択して載ってるv=DKIM1うんたらみたいなやつ&lt;/li&gt;&#10;&lt;li&gt;SPF: 同上。v=SPF1みたいなの&lt;/li&gt;&#10;&lt;li&gt;DMARC: 名前は 「_dmarc 」で値は「&amp;ldquo;v=DMARC1; p=none&amp;rdquo;」（小声）&#10;&lt;ul&gt;&#10;&lt;li&gt;ちゃんとやるなら、ちゃんとやる&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;p&gt;特にハマるところはないと思うんだが、既にレコード登録されている場合は削除が必要。設定した覚えなくても、各地を転々としていると設定されていることもある。実際、今回いじった時、以前レンサバ使っていた時に設定されたのか、MXとSPFのレコードが既に登録してあった。そういうこともある。&lt;/p&gt;&#10;&lt;h3 id="メールクライアントで試す"&gt;メールクライアントで試す&#10;&lt;/h3&gt;&lt;p&gt;コンソール画面よりメールアドレスを選択すると、接続先サーバでPOP、SMTP、IMAPのメールサーバのドメインが載っている。ので、アカウントとパスワード情報を持ち寄って設定。ポート番号とかの設定は「&lt;a class="link" href="https://support.conoha.jp/v/mail-owned-domain/#02" target="_blank" rel="noopener"&#10; &gt;メールサーバーで独自ドメインを使う｜ConoHa VPSサポート&lt;/a&gt;」の下部にあるけど、たいていのクライアントでは自動でいけるんじゃないか。Macのメール.appとVivaldiで試したが、どちらもつつがなく認識された。&lt;/p&gt;&#10;&lt;p&gt;送受信のテストはもちろんGmail。コイツがいけたらだいたいいけるだろう。いきなり送信もなんなので受信から。受信できたら送信して返す。送信を確認できたら動作確認完了。&lt;/p&gt;&#10;&lt;h2 id="所感楽には違いない"&gt;所感：楽には違いない&#10;&lt;/h2&gt;&lt;p&gt;ということで一通り完了です。契約してから30分くらいで送受信できてビックリした。っていうかDNSの反映も随分と早くなったものだね。確かに楽には違いない。楽ではあるが、600円/月と言われるとちょっと躊躇う。年間7,200円だからなぁ。&lt;/p&gt;&#10;&lt;p&gt;まぁせっかくなのでもうちょっと使ってみるかね。ってか結局長期運用しないと実態はわからないからなぁ。これだけじゃただのやってみた記事だし。まか今回はとりあえずサクッとやってみれたということで。&lt;/p&gt;&#10;&lt;p&gt;折を見てプログラムから送信くらいはするか。ブログドメインhack-le.comでメルマガでもやったろうか。誰も登録しない。&lt;/p&gt;&#10;&lt;p&gt;最後にいつものクーポン広告だが、以下のリンクです。&lt;/p&gt;&#10;&lt;p&gt;&lt;a class="link" href="https://www.conoha.jp/referral/?token=nNgrOjEEXwCVfvRYHJSDh.zn3QtmUyxWoTDKxWHvrZSWHGWKZ3o-HER" target="_blank" rel="noopener"&#10; &gt;お友達紹介&lt;/a&gt;&lt;/p&gt;&#10;&lt;p&gt;こっから飛んで使い始めてもらったら1000円分のクーポンがもらえる（&lt;a class="link" href="https://www.conoha.jp/conotomo/" target="_blank" rel="noopener"&#10; &gt;このとも ～友達紹介～｜レンタルサーバーならConoHa&lt;/a&gt;）。そして定常的に使ったら僕に2000円分のクーポンが入る。クーポンが入るとなんか色々遊んで適当にレビューするかもしれない。&lt;/p&gt;&#10;</description></item><item><title>レンサバのWordPressサイトを、既にWordPressコンテナを持っているVPSにデータベース共有で移行する</title><link>https://hack-le.com/wordpress-vps-server/</link><pubDate>Mon, 15 Sep 2025 00:00:00 +0900</pubDate><guid>https://hack-le.com/wordpress-vps-server/</guid><description>&lt;p&gt;自分でタイトル見直して笑った。これやりたい人日本に何人いるんだろう。&lt;/p&gt;&#10;&lt;p&gt;なお、レンサバはカラフルボックス。カラフルボックスで管理しているWordPressのサイトを、VPSに移行する。ただし、VPSには既にWordPressのコンテナをたてている。WordPressのマルチサイトはめんどくさいが、データベースをいっぱいつくるのはRAM的に嫌なので、DBは共有する。そういうニッチな手順。&lt;/p&gt;&#10;&lt;p&gt;個人サイトの移行であんまり真面目にやってないので、サイトはダウンする。ダウンタイムは許容する。&lt;/p&gt;&#10;&lt;h2 id="前提と構成"&gt;前提と構成&#10;&lt;/h2&gt;&lt;p&gt;今回のやること&lt;/p&gt;&#10;&lt;ul&gt;&#10;&lt;li&gt;現在、VPSでサイトAとサイトBを管理している（Docker管理）。VPSではCloudflare Tunnel経由でサイト公開している&lt;/li&gt;&#10;&lt;li&gt;サイトAとサイトBは同じDBを共有している&lt;/li&gt;&#10;&lt;li&gt;レンサバのカラフルボックスで管理しているサイトCを、VPSでサイトA、Bと一緒に管理したい&lt;/li&gt;&#10;&lt;li&gt;データベースは共有する&lt;/li&gt;&#10;&lt;li&gt;DNSは、リセラーとしてムームードメインで管理している&#10;&lt;ul&gt;&#10;&lt;li&gt;ムームードメインにはなんのこだわりもない。むしろ嫌な思い出すらある。完全に惰性&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;p&gt;つまり現在の構成は以下だ。&lt;/p&gt;&#10;&lt;pre class="mermaid" style="visibility:hidden"&gt;graph TD&#10;mumu(ムームードメイン)&#10;cff(Cloudflare)&#10;mumu --&gt; cff&#10;cff --&gt; cf&#10;subgraph VPS&#10;wp1(サイトA)&#10;wp2(サイトB)&#10;db(データベース)&#10;cf(Cloudflare Tunnel)&#10;end&#10;cf --&gt; wp1&#10;cf --&gt; wp2&#10;wp1 -.-&gt; db&#10;wp2 -.-&gt; db&#10;mumu --&gt;cldns&#10;subgraph カラフルボックス&#10;cldns(ドメイン管理)&#10;wp3(サイトC)&#10;end&#10;cldns --&gt; wp3&lt;/pre&gt;&lt;p&gt;これが以下のようになる。&lt;/p&gt;&#10;&lt;pre class="mermaid" style="visibility:hidden"&gt;graph TD&#10;mumu(ムームードメイン)&#10;cff(Cloudflare)&#10;mumu --&gt; cff&#10;cff --&gt; cf&#10;subgraph VPS&#10;wp1(サイトA)&#10;wp2(サイトB)&#10;wp3(サイトC)&#10;db(データベース)&#10;cf(Cloudflare Tunnel)&#10;end&#10;cf --&gt; wp1&#10;cf --&gt; wp2&#10;cf --&gt; wp3&#10;wp1 -.-&gt; db&#10;wp2 -.-&gt; db&#10;wp3 -.-&gt; db&lt;/pre&gt;&lt;p&gt;この絵を見て「？？？」となるなら、多分この記事はあまり役に立たない。しかしそもそもレンサバ使っている人がこんなことをするのか謎ではある。&lt;/p&gt;&#10;&lt;h2 id="この記事で説明しないこと"&gt;この記事で説明しないこと&#10;&lt;/h2&gt;&lt;p&gt;この記事には前提知識がある。以下のことはわかっている前提とする。&lt;/p&gt;&#10;&lt;ul&gt;&#10;&lt;li&gt;カラフルボックス、ムームードメインなどリセラー、レジストラの設定&lt;/li&gt;&#10;&lt;li&gt;Cloudflare Tunnelの設定&lt;/li&gt;&#10;&lt;li&gt;WordPressのバックアップ、復元の詳細手順&#10;&lt;ul&gt;&#10;&lt;li&gt;ローカルで練習することを強く推奨する&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;/li&gt;&#10;&lt;li&gt;NSの向け先を変える意味&lt;/li&gt;&#10;&lt;li&gt;dockerの基本&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;p&gt;この記事の内容は個人サイトとして最悪の事態を招く可能性があるので、わからないならやらないほうがいい。&lt;/p&gt;&#10;&lt;p&gt;LLMあたりに聞いてね。まぁこんなニッチな手順やる人はだいたいわかっている気はするが……。&lt;/p&gt;&#10;&lt;h2 id="バックアップ--古いサイトかどうか判別できるマーカを残す"&gt;バックアップ &amp;amp; 古いサイトかどうか判別できるマーカを残す&#10;&lt;/h2&gt;&lt;p&gt;まずは当然ながらバックアップ。バックアップのやり方は好きにすればいいが、個人的には UpdraftPlus を使っている。バックアップデータはDropboxに置いている。正直無料で使うのは申し訳ないくらいなんだが、買い切りモデルがないし、無料プランで十分なんだよなぁという。&lt;/p&gt;&#10;&lt;p&gt;で、バックアップした後、「サイト引っ越し作業中です」みたいなマーカを残しておく。これによって、サイト引っ越し後、「マーカがあったら古いサイトを見ている、なかったら新しいサイトを見ている」と判別できる。&lt;/p&gt;&#10;&lt;h2 id="vps側の準備"&gt;VPS側の準備&#10;&lt;/h2&gt;&lt;p&gt;ダウンタイムはなんだかんだで短くしたいので、VPS側の下準備。&lt;/p&gt;&#10;&lt;h3 id="設定の確認"&gt;設定の確認&#10;&lt;/h3&gt;&lt;p&gt;とりあえず &lt;code&gt;docker-compose.yml&lt;/code&gt;を確認する。以下はすでにサイト1,2があるとする。ポート番号は10880,10881とする。&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-yaml" data-lang="yaml"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nt"&gt;services&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="c"&gt;# サイト1: メインサイト&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;site1_wordpress&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;image&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l"&gt;wordpress:latest&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;ports&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;- &lt;span class="s2"&gt;&amp;#34;10880:80&amp;#34;&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;environment&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;WORDPRESS_DB_HOST&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l"&gt;wp_db&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;WORDPRESS_DB_USER&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l"&gt;${SITE1_DB_USER}&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;WORDPRESS_DB_PASSWORD&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l"&gt;${SITE1_DB_PASSWORD}&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;WORDPRESS_DB_NAME&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l"&gt;${SITE1_DB_NAME}&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;volumes&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;- &lt;span class="l"&gt;site1_wordpress_data:/var/www/html&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;- &lt;span class="l"&gt;./custom-php.ini:/usr/local/etc/php/conf.d/custom-php.ini&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;restart&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l"&gt;always&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;depends_on&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;- &lt;span class="l"&gt;wp_db&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="c"&gt;# サイト2: サブサイト&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;site2_wordpress&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;image&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l"&gt;wordpress:latest&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;ports&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;- &lt;span class="s2"&gt;&amp;#34;10881:80&amp;#34;&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;environment&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;WORDPRESS_DB_HOST&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l"&gt;wp_db&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;WORDPRESS_DB_USER&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l"&gt;${SITE2_DB_USER}&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;WORDPRESS_DB_PASSWORD&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l"&gt;${SITE2_DB_PASSWORD}&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;WORDPRESS_DB_NAME&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l"&gt;${SITE2_DB_NAME}&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;volumes&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;- &lt;span class="l"&gt;site2_wordpress_data:/var/www/html&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;- &lt;span class="l"&gt;./custom-php.ini:/usr/local/etc/php/conf.d/custom-php.ini&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;restart&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l"&gt;always&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;depends_on&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;- &lt;span class="l"&gt;wp_db&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="c"&gt;# 共有データベース&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;wp_db&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;image&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l"&gt;mariadb:latest&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;environment&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;MYSQL_ROOT_PASSWORD&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l"&gt;${MYSQL_ROOT_PASSWORD}&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;volumes&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;- &lt;span class="l"&gt;wp_db_data:/var/lib/mysql&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;restart&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l"&gt;always&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="c"&gt;# Cloudflareトンネル&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;cloudflared_main&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;image&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l"&gt;cloudflare/cloudflared:latest&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;network_mode&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;host&amp;#34;&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;command&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l"&gt;tunnel --no-autoupdate run --token ${CLOUDFLARED_TUNNEL_TOKEN_MAIN}&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;restart&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l"&gt;always&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nt"&gt;volumes&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;site1_wordpress_data&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;site2_wordpress_data&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;wp_db_data&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;&lt;code&gt;.env&lt;/code&gt;は以下とする。&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-yaml" data-lang="yaml"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c"&gt;# MariaDBルートパスワード&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="l"&gt;MYSQL_ROOT_PASSWORD=your_secure_root_password_here&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c"&gt;# サイト1のデータベース設定&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="l"&gt;SITE1_DB_USER=site1_user&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="l"&gt;SITE1_DB_PASSWORD=your_secure_password_1&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="l"&gt;SITE1_DB_NAME=site1_db&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c"&gt;# サイト2のデータベース設定&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="l"&gt;SITE2_DB_USER=site2_user&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="l"&gt;SITE2_DB_PASSWORD=your_secure_password_2&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="l"&gt;SITE2_DB_NAME=site2_db&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c"&gt;# Cloudflareトンネルトークン（メインドメイン用）&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="l"&gt;CLOUDFLARED_TUNNEL_TOKEN_MAIN=your_cloudflare_tunnel_token_here&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h3 id="dbでユーザとテーブルの作成"&gt;DBでユーザとテーブルの作成&#10;&lt;/h3&gt;&lt;p&gt;データベース共有するので、ユーザとテーブルを手動で追加する。&lt;/p&gt;&#10;&lt;p&gt;コンテナに入る&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-javascript" data-lang="javascript"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nx"&gt;docker&lt;/span&gt; &lt;span class="nx"&gt;ps&lt;/span&gt; &lt;span class="err"&gt;#&lt;/span&gt; &lt;span class="nx"&gt;コンテナ名を調べる&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nx"&gt;docker&lt;/span&gt; &lt;span class="nx"&gt;exec&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="nx"&gt;it&lt;/span&gt; &lt;span class="nx"&gt;コンテナ名&lt;/span&gt; &lt;span class="nx"&gt;mariadb&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="nx"&gt;u&lt;/span&gt; &lt;span class="nx"&gt;root&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="nx"&gt;p&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;パスワード聞かれるので答えて入る。&lt;/p&gt;&#10;&lt;p&gt;以下設定とその反映。&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-javascript" data-lang="javascript"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nx"&gt;CREATE&lt;/span&gt; &lt;span class="nx"&gt;DATABASE&lt;/span&gt; &lt;span class="nx"&gt;データベース名&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nx"&gt;CREATE&lt;/span&gt; &lt;span class="nx"&gt;USER&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;ユーザ&amp;#39;&lt;/span&gt;&lt;span class="err"&gt;@&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;%&amp;#39;&lt;/span&gt; &lt;span class="nx"&gt;IDENTIFIED&lt;/span&gt; &lt;span class="nx"&gt;BY&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;パスワードをここに入力&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nx"&gt;GRANT&lt;/span&gt; &lt;span class="nx"&gt;ALL&lt;/span&gt; &lt;span class="nx"&gt;PRIVILEGES&lt;/span&gt; &lt;span class="nx"&gt;ON&lt;/span&gt; &lt;span class="nx"&gt;データベース名&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="nx"&gt;TO&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;ユーザ&amp;#39;&lt;/span&gt;&lt;span class="err"&gt;@&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;%&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nx"&gt;FLUSH&lt;/span&gt; &lt;span class="nx"&gt;PRIVILEGES&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nx"&gt;SHOW&lt;/span&gt; &lt;span class="nx"&gt;DATABASES&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nx"&gt;SELECT&lt;/span&gt; &lt;span class="nx"&gt;User&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;Host&lt;/span&gt; &lt;span class="nx"&gt;FROM&lt;/span&gt; &lt;span class="nx"&gt;mysql&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;user&lt;/span&gt; &lt;span class="nx"&gt;WHERE&lt;/span&gt; &lt;span class="nx"&gt;User&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;ユーザ&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nx"&gt;EXIT&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;ここでユーザとデータベース名とパスワードはひかえる。そして &lt;code&gt;.env&lt;/code&gt; に追記する。&lt;/p&gt;&#10;&lt;p&gt;&lt;code&gt;docker-compose.yml&lt;/code&gt; に設定を追加する。新サイトのポート番号は10882とする。&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-yaml" data-lang="yaml"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nt"&gt;services&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="c"&gt;# サイト1: メインサイト&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;site1_wordpress&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;image&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l"&gt;wordpress:latest&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;ports&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;- &lt;span class="s2"&gt;&amp;#34;10880:80&amp;#34;&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;environment&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;WORDPRESS_DB_HOST&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l"&gt;wp_db&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;WORDPRESS_DB_USER&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l"&gt;${SITE1_DB_USER}&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;WORDPRESS_DB_PASSWORD&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l"&gt;${SITE1_DB_PASSWORD}&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;WORDPRESS_DB_NAME&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l"&gt;${SITE1_DB_NAME}&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;volumes&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;- &lt;span class="l"&gt;site1_wordpress_data:/var/www/html&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;- &lt;span class="l"&gt;./custom-php.ini:/usr/local/etc/php/conf.d/custom-php.ini&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;restart&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l"&gt;always&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;depends_on&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;- &lt;span class="l"&gt;wp_db&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="c"&gt;# サイト2: サブサイト&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;site2_wordpress&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;image&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l"&gt;wordpress:latest&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;ports&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;- &lt;span class="s2"&gt;&amp;#34;10881:80&amp;#34;&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;environment&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;WORDPRESS_DB_HOST&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l"&gt;wp_db&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;WORDPRESS_DB_USER&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l"&gt;${SITE2_DB_USER}&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;WORDPRESS_DB_PASSWORD&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l"&gt;${SITE2_DB_PASSWORD}&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;WORDPRESS_DB_NAME&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l"&gt;${SITE2_DB_NAME}&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;volumes&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;- &lt;span class="l"&gt;site2_wordpress_data:/var/www/html&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;- &lt;span class="l"&gt;./custom-php.ini:/usr/local/etc/php/conf.d/custom-php.ini&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;restart&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l"&gt;always&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;depends_on&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;- &lt;span class="l"&gt;wp_db&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="c"&gt;# サイト3: 追加サイト&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;site3_wordpress&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;image&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l"&gt;wordpress:latest&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;ports&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;- &lt;span class="s2"&gt;&amp;#34;10882:80&amp;#34;&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;environment&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;WORDPRESS_DB_HOST&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l"&gt;wp_db&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;WORDPRESS_DB_USER&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l"&gt;${SITE3_DB_USER}&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;WORDPRESS_DB_PASSWORD&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l"&gt;${SITE3_DB_PASSWORD}&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;WORDPRESS_DB_NAME&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l"&gt;${SITE3_DB_NAME}&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;volumes&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;- &lt;span class="l"&gt;site3_wordpress_data:/var/www/html&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;- &lt;span class="l"&gt;./custom-php.ini:/usr/local/etc/php/conf.d/custom-php.ini&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;restart&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l"&gt;always&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;depends_on&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;- &lt;span class="l"&gt;wp_db&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="c"&gt;# 共有データベース&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;wp_db&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;image&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l"&gt;mariadb:latest&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;environment&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;MYSQL_ROOT_PASSWORD&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l"&gt;${MYSQL_ROOT_PASSWORD}&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;volumes&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;- &lt;span class="l"&gt;wp_db_data:/var/lib/mysql&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;restart&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l"&gt;always&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="c"&gt;# Cloudflareトンネル（メインドメイン用）&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;cloudflared_main&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;image&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l"&gt;cloudflare/cloudflared:latest&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;network_mode&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;host&amp;#34;&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;command&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l"&gt;tunnel --no-autoupdate run --token ${CLOUDFLARED_TUNNEL_TOKEN_MAIN}&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;restart&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l"&gt;always&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nt"&gt;volumes&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;site1_wordpress_data&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;site2_wordpress_data&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;site3_wordpress_data&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="c"&gt;# 追加&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;wp_db_data&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;そして &lt;code&gt;.env&lt;/code&gt;は以下のようになる。&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-yaml" data-lang="yaml"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c"&gt;# MariaDBルートパスワード&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="l"&gt;MYSQL_ROOT_PASSWORD=your_secure_root_password_here&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c"&gt;# サイト1のデータベース設定&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="l"&gt;SITE1_DB_USER=site1_user&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="l"&gt;SITE1_DB_PASSWORD=your_secure_password_1&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="l"&gt;SITE1_DB_NAME=site1_db&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c"&gt;# サイト2のデータベース設定&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="l"&gt;SITE2_DB_USER=site2_user&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="l"&gt;SITE2_DB_PASSWORD=your_secure_password_2&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="l"&gt;SITE2_DB_NAME=site2_db&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c"&gt;# サイト3のデータベース設定 (追加分)&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="l"&gt;SITE3_DB_USER=site3_user&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="l"&gt;SITE3_DB_PASSWORD=your_secure_password_3&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="l"&gt;SITE3_DB_NAME=site3_db&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c"&gt;# Cloudflareトンネルトークン（メインドメイン用）&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="l"&gt;CLOUDFLARED_TUNNEL_TOKEN_MAIN=your_cloudflare_tunnel_token_here&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;そしてここまでの動作を確認するためコンテナ起動。&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-javascript" data-lang="javascript"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nx"&gt;docker&lt;/span&gt; &lt;span class="nx"&gt;compose&lt;/span&gt; &lt;span class="nx"&gt;up&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="nx"&gt;d&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;既にあるサイトにアクセスして、問題なく動作していることを確認。&lt;/p&gt;&#10;&lt;h3 id="なんとかしてwordpressの初期設定をする"&gt;なんとかしてWordPressの初期設定をする&#10;&lt;/h3&gt;&lt;p&gt;localhostなら問題ないが、VPS上にあるとそのまま直にはいけない。まぁやり方は色々あると思うんだが、ここでは既存のCloudflareで管理するドメインより、一時作業のサブドメインを払い出して、トンネル経由で初期画面を設定する。さすがに管理者ユーザとパスワードだけは設定しないといけないからね。&lt;/p&gt;&#10;&lt;p&gt;終わったら、「設定」からWordPressアドレスとサイトアドレスを、本来のドメインに変更する。これによって本来のドメインにぶっ飛ばされるため、移行管理画面には入れない。&lt;/p&gt;&#10;&lt;h2 id="cloudflareの準備"&gt;Cloudflareの準備&#10;&lt;/h2&gt;&lt;h3 id="オンボードの追加"&gt;オンボードの追加&#10;&lt;/h3&gt;&lt;p&gt;アカウントホームより、オンボードを追加する。現在のDNSをスキャンする。Aレコードとかは多分いらないので削除する。このへんは適切にやる。&lt;/p&gt;&#10;&lt;h3 id="nsの設定ダウンタイム発生"&gt;NSの設定（ダウンタイム発生）&#10;&lt;/h3&gt;&lt;p&gt;さてここからはダウンタイム発生となるが、NSの向け先を変更する。これによって、当然ながらサイトはめっちゃ不安定になる。ってかまぁ、落ちているのが正常、という状態。&lt;/p&gt;&#10;&lt;p&gt;設定はレジストラまたはリセラー次第となる。僕はムームードメインを惰性で使っているが、ドメイン一覧からドメインを選択すると、ネームサーバを取得できるようになる。&lt;/p&gt;&#10;&lt;p&gt;&lt;img loading="lazy" sizes="(max-width: 767px) calc(100vw - 30px), (max-width: 1023px) 700px, (max-width: 1279px) 950px, 1232px" src="https://hack-le.com/images/uploads/2025/09/image-4-700x408.png"&gt;&lt;/p&gt;&#10;&lt;p&gt;&lt;strong&gt;この設定をした段階で、サイトが新サイトと旧サイトの両方が参照されるようになる&lt;/strong&gt;。&lt;/p&gt;&#10;&lt;p&gt;CloudflareがNS向いたことを確認次第、トンネルを掘れるようになる。NSの設定後、トイレにいって戻ってきたらもう認識していた。はやい。Zero TrsutよりCloudflare Tunnelのパブリックホストで急いで設定。&lt;/p&gt;&#10;&lt;h2 id="新サイトで復元"&gt;新サイトで復元&#10;&lt;/h2&gt;&lt;p&gt;新サイトにアクセスする。このとき、ゲストプロファイルなどを使うと、新サイトが参照されやすい。新サイトにアクセスしたら急いで復元。復元後は、元サイトにつけたマーカの有無で、旧サイトか新サイトのどちらを参照しているかが今後はわかる。&lt;/p&gt;&#10;&lt;p&gt;&lt;strong&gt;うまくいけば数分くらいのダウンタイムで済む&lt;/strong&gt;。&lt;/p&gt;&#10;&lt;p&gt;以上。&lt;/p&gt;&#10;&lt;h2 id="ムームードメインの思い出"&gt;ムームードメインの思い出&#10;&lt;/h2&gt;&lt;p&gt;ところでムームードメインの嫌な思い出はこれ。&lt;/p&gt;&#10;&lt;div class="blog-card-wrapper"&gt;&#10; &lt;a href="https://hack-le.com/serverholdxyz/" class="blog-card"&gt;&#10; &lt;div class="blog-card-content"&gt;&#10; &lt;div class="blog-card-label"&gt;&#10; &lt;svg xmlns="http://www.w3.org/2000/svg" width="13" height="13" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"&gt;&lt;path d="M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.71"&gt;&lt;/path&gt;&lt;path d="M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71"&gt;&lt;/path&gt;&lt;/svg&gt;&#10; &lt;span&gt;あわせて読みたい&lt;/span&gt;&#10; &lt;/div&gt;&#10; &lt;div class="blog-card-title"&gt;ムームードメイン &amp;#43; .xyzドメイン で利用制限にかかる。この組み合わせはオススメしない&lt;/div&gt;&#10; &lt;div class="blog-card-url"&gt;/serverholdxyz/&lt;/div&gt;&#10; &lt;/div&gt;&#10; &lt;div class="blog-card-thumbnail"&gt;&#10; &lt;img src="https://hack-le.com/images/uploads/2026/09/eyecatch_2853_1789479186.webp" alt="ムームードメイン &amp;#43; .xyzドメイン で利用制限にかかる。この組み合わせはオススメしない" loading="lazy" /&gt;&#10; &lt;/div&gt;&#10; &lt;/a&gt;&#10;&lt;/div&gt;&#10;&#10;&lt;p&gt;ただこれは、ムームードメインよりも.xyzのレジストリ側の責任が大きいとは思う。&lt;/p&gt;&#10;&lt;p&gt;この時に、DNSってインターネットの根幹なんだなと思った。インターネットは脆いよ。&lt;/p&gt;&#10;</description></item><item><title>Android + CloudBeats + QNAP NAS + Cloudflareで外でNASの音楽をストリーミング&amp;オフライン再生する</title><link>https://hack-le.com/android-cloudbeats-qnap-nas-cloudflare%E3%81%A7%E5%A4%96%E3%81%A7nas%E3%81%AE%E9%9F%B3%E6%A5%BD%E3%82%92%E3%82%B9%E3%83%88%E3%83%AA%E3%83%BC%E3%83%9F%E3%83%B3%E3%82%B0%E3%82%AA%E3%83%95/</link><pubDate>Mon, 01 Sep 2025 10:46:57 +0900</pubDate><guid>https://hack-le.com/android-cloudbeats-qnap-nas-cloudflare%E3%81%A7%E5%A4%96%E3%81%A7nas%E3%81%AE%E9%9F%B3%E6%A5%BD%E3%82%92%E3%82%B9%E3%83%88%E3%83%AA%E3%83%BC%E3%83%9F%E3%83%B3%E3%82%B0%E3%82%AA%E3%83%95/</guid><description>&lt;p&gt;Androidスマホでお外でNASの音楽聴きたいなぁ、スマホのストレージはゴミだしmicroSDも挿せないからストリーミングしたいなぁ……という記事。&lt;/p&gt;&#10;&lt;p&gt;最初に言うとCloudBeatsは複数のクラウド接続とオフライン再生は有料アプリなので（非サブスク）、多少金は払うが、まぁでもNASやストレージの代金に比べたら誤差だし、なによりDropboxせいぜい1.5か月分くらいなので。&lt;/p&gt;&#10;&lt;p&gt;外で開くので独自ドメイン使う。外からの接続にはCloudflare Tunnel使う。このへんのネットワーク構成は好きにすればだけど&lt;/p&gt;&#10;&lt;h2 id="環境"&gt;環境&#10;&lt;/h2&gt;&lt;ul&gt;&#10;&lt;li&gt;QNAP NAS TS-233&#10;&lt;ul&gt;&#10;&lt;li&gt;FW: QTS 5.2.6.3195&lt;/li&gt;&#10;&lt;li&gt;CPU: Quad-core ARM Cortex-A55 Processor @ 2.0GHz&lt;/li&gt;&#10;&lt;li&gt;RAM: 2GB&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;/li&gt;&#10;&lt;li&gt;Androidスマホ Pixel 7 128GB&#10;&lt;ul&gt;&#10;&lt;li&gt;OS: Android 16&lt;/li&gt;&#10;&lt;li&gt;アプリ: CloudBeats 2.60.03&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;/li&gt;&#10;&lt;li&gt;独自ドメイン&#10;&lt;ul&gt;&#10;&lt;li&gt;Cloudflare管理&lt;/li&gt;&#10;&lt;li&gt;Cloudflare Tunnel利用&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;p&gt;NASはQNAPのエントリーレベルのやつだけど、WebDAVやる限りは別に問題ないね。&lt;/p&gt;&#10;&lt;p&gt;構成を図示すると以下。&lt;/p&gt;&#10;&lt;pre class="mermaid" style="visibility:hidden"&gt;graph LR&#10;subgraph Internet&#10;android(Android)&#10;cloudflare(Cloudflare)&#10;end&#10;subgraph Home&#10;nas(NAS)&#10;pc(PC)&#10;end&#10;android --&gt; cloudflare&#10;cloudflare --&gt;|Cloudflare Tunnel| pc&#10;pc --&gt;|webDAV| nas&lt;/pre&gt;&lt;p&gt;踏み台となっているPCは常時稼働サーバ前提ではある。少なくともお外に出ている時に起動しているもの。うちはMac miniがそれにあたる。&lt;/p&gt;&#10;&lt;div class="blog-card-wrapper"&gt;&#10; &lt;a href="https://hack-le.com/docker%e3%82%b3%e3%83%b3%e3%83%86%e3%83%8a%e3%82%b5%e3%83%bc%e3%83%90%e3%83%bc%e6%a9%9f%e3%81%a8%e3%81%97%e3%81%a6%e4%bd%99%e7%94%9f%e3%82%92%e7%94%9f%e3%81%8d%e3%82%8bintel-mac-mini-2018/" class="blog-card"&gt;&#10; &lt;div class="blog-card-content"&gt;&#10; &lt;div class="blog-card-label"&gt;&#10; &lt;svg xmlns="http://www.w3.org/2000/svg" width="13" height="13" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"&gt;&lt;path d="M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.71"&gt;&lt;/path&gt;&lt;path d="M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71"&gt;&lt;/path&gt;&lt;/svg&gt;&#10; &lt;span&gt;あわせて読みたい&lt;/span&gt;&#10; &lt;/div&gt;&#10; &lt;div class="blog-card-title"&gt;Dockerコンテナサーバー機として余生を生きるIntel Mac mini 2018&lt;/div&gt;&#10; &lt;div class="blog-card-url"&gt;/dockerコンテナサーバー機として余生を生きるintel-mac-mini-2018/&lt;/div&gt;&#10; &lt;/div&gt;&#10; &lt;div class="blog-card-thumbnail"&gt;&#10; &lt;img src="https://hack-le.com/images/uploads/2026/08/eyecatch_15372_1787719893.webp" alt="Dockerコンテナサーバー機として余生を生きるIntel Mac mini 2018" loading="lazy" /&gt;&#10; &lt;/div&gt;&#10; &lt;/a&gt;&#10;&lt;/div&gt;&#10;&#10;&lt;p&gt;AndroidアプリはCloudBeatsを使っているけれど、WebDAV扱える音楽アプリなら別になんでもいいと思う。僕は「オフライン再生 + ストリーミング再生 + クラウド接続」でこれに行き着いたが、他にいいのがあるなら別にそれはそれで。&lt;/p&gt;&#10;&lt;p&gt;費用についていえば、NASとスマホは既にある前提なら、CloudBeatsの有料オプションが1500円、ドメイン管理代が年間1500-2000円くらいかな。CloudBeatsの有料オプションは、オフライン再生と複数クラウドサービスを利用したい時用なので、厳密にはなくてもいいんだが……サブスクじゃないんだし買えばいいと思う。&lt;/p&gt;&#10;&lt;h2 id="経緯"&gt;経緯&#10;&lt;/h2&gt;&lt;p&gt;設計意図とかの経緯については下記記事。一言で言えば脱Dropboxだね。&lt;/p&gt;&#10;&lt;div class="blog-card-wrapper"&gt;&#10; &lt;a href="https://hack-le.com/dropboxnas-streaming-music/" class="blog-card"&gt;&#10; &lt;div class="blog-card-content"&gt;&#10; &lt;div class="blog-card-label"&gt;&#10; &lt;svg xmlns="http://www.w3.org/2000/svg" width="13" height="13" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"&gt;&lt;path d="M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.71"&gt;&lt;/path&gt;&lt;path d="M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71"&gt;&lt;/path&gt;&lt;/svg&gt;&#10; &lt;span&gt;あわせて読みたい&lt;/span&gt;&#10; &lt;/div&gt;&#10; &lt;div class="blog-card-title"&gt;脱Dropbox：NASの音楽ファイルをストリーミングで再生する試み&lt;/div&gt;&#10; &lt;div class="blog-card-url"&gt;/dropboxnas-streaming-music/&lt;/div&gt;&#10; &lt;/div&gt;&#10; &lt;div class="blog-card-thumbnail"&gt;&#10; &lt;img src="https://hack-le.com/images/uploads/2026/09/eyecatch_18950_1789090081.webp" alt="脱Dropbox：NASの音楽ファイルをストリーミングで再生する試み" loading="lazy" /&gt;&#10; &lt;/div&gt;&#10; &lt;/a&gt;&#10;&lt;/div&gt;&#10;&#10;&lt;h2 id="qnapの設定"&gt;QNAPの設定&#10;&lt;/h2&gt;&lt;p&gt;NASのWebアプリにログインして、コントロールパネルを開こう。基本的に権限設定周りのことをする。&lt;/p&gt;&#10;&lt;h3 id="webdavを有効化する"&gt;WebDAVを有効化する&#10;&lt;/h3&gt;&lt;p&gt;まず有効化する。&lt;/p&gt;&#10;&lt;p&gt;「コントロールパネル」→「ネットワークとファイル差ビス」→「Win/Mac/NFS/WebDAV」&lt;/p&gt;&#10;&lt;p&gt;&lt;img loading="lazy" sizes="(max-width: 767px) calc(100vw - 30px), (max-width: 1023px) 700px, (max-width: 1279px) 950px, 1232px" src="https://hack-le.com/images/uploads/2025/09/image-700x362.png"&gt;&lt;/p&gt;&#10;&lt;p&gt;そしたらWebDAVタブがあるので、「WebDAVを有効にする」と、「WebDAV権限」にチェック。ポートは占有ポート番号使っていいと思うよ。&lt;/p&gt;&#10;&lt;p&gt;&lt;img loading="lazy" sizes="(max-width: 767px) calc(100vw - 30px), (max-width: 1023px) 700px, (max-width: 1279px) 950px, 1232px" src="https://hack-le.com/images/uploads/2025/08/0ed8ea26e55e330a706d91df2b59d7c5-700x350.png"&gt;&lt;/p&gt;&#10;&lt;h3 id="webdav用の共有フォルダを作成する"&gt;WebDAV用の共有フォルダを作成する&#10;&lt;/h3&gt;&lt;p&gt;別に既存のフォルダでもいいかもしれないが、なんかあった時のためと整理のために、それ用のフォルダ作っていいかなと思う。そしたら最悪クラックされたとしても、WebDAV経由ではそのフォルダしか触れないように。&lt;/p&gt;&#10;&lt;h3 id="webdav用のユーザを作成する"&gt;WebDAV用のユーザを作成する&#10;&lt;/h3&gt;&lt;p&gt;まぁこれも必須じゃないんだけれど、上記と一緒。ファイル管理自体は普段の管理用ユーザだとなんかあったときの被害が広がる恐れもあるので、WebDAVアクセス用ユーザは作っておいたほうがよいかと。どうせ一手間なんだし。&lt;/p&gt;&#10;&lt;p&gt;ということでWebDAV用ユーザを作成する。言うまでもないが、外からのアクセスに使うものなので、適当なPWにしないように。WebDAV用ユーザは次の「権限の編集」でWebDAVの読み取り権限のみ付与する。&lt;/p&gt;&#10;&lt;h3 id="権限の編集をする"&gt;権限の編集をする&#10;&lt;/h3&gt;&lt;p&gt;QNAP曰く、下記のように権限設定が必要らしい。&lt;/p&gt;&#10;&lt;p&gt;&lt;img loading="lazy" sizes="(max-width: 767px) calc(100vw - 30px), (max-width: 1023px) 700px, (max-width: 1279px) 950px, 1232px" src="https://hack-le.com/images/uploads/2025/08/d986f6ff84f33be286ca7db0066bdde7-700x126.png"&gt;&lt;/p&gt;&#10;&lt;p&gt;WebDAV用の権限を与える。QNAPにおいては、「ユーザーとグループの権限」と、「WebDAVのアクセス」が分かれている。ファイル管理は「ユーザーとグループの権限」において、&lt;strong&gt;ファイル管理をしたいユーザ&lt;/strong&gt;で「R/W」を設定し、WebDAVアクセスについては&lt;strong&gt;作成したユーザ&lt;/strong&gt;に「読み取り専用」の権限を付与する。&lt;/p&gt;&#10;&lt;p&gt;こうすることで、&lt;strong&gt;お外からはWebDAV専用ユーザで、WebDAV専用フォルダを読み取りのみできる&lt;/strong&gt;、という状態になるため、クラックされても安心では別にないんだが、被害は抑えられる。&lt;/p&gt;&#10;&lt;h2 id="cloudflareの設定"&gt;Cloudflareの設定&#10;&lt;/h2&gt;&lt;p&gt;LAN内で動作確認したいところなんだが、CloudBeatsはhttp通信だとどうもクラウド接続に失敗するっぽい。このためだけに自己証明書だのなんだのも阿呆みたいだし、しゃーないので、ぶっつけでCloudflare側の設定をする。&lt;/p&gt;&#10;&lt;p&gt;やることは、独自ドメインを経由してLAN内NASにアクセスできるようにすること。&lt;/p&gt;&#10;&lt;p&gt;ってことでNASにアクセスするPCにCloudflareを導入。Cloudflare Tunnelの設定については下記記事の「Cloudflareでトンネル作成」の部分を参照。ただし、ここでは http://&amp;lt;NASのIPアドレス&amp;gt;:5000 とする。冷静に考えると一般的にはここが一番の難所の気がしなくもないが、それだけに説明もめんどくさい。雑ですまない。&lt;/p&gt;&#10;&lt;div class="blog-card-wrapper"&gt;&#10; &lt;a href="https://hack-le.com/calibre-cloudflare-tunnel/" class="blog-card"&gt;&#10; &lt;div class="blog-card-content"&gt;&#10; &lt;div class="blog-card-label"&gt;&#10; &lt;svg xmlns="http://www.w3.org/2000/svg" width="13" height="13" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"&gt;&lt;path d="M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.71"&gt;&lt;/path&gt;&lt;path d="M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71"&gt;&lt;/path&gt;&lt;/svg&gt;&#10; &lt;span&gt;あわせて読みたい&lt;/span&gt;&#10; &lt;/div&gt;&#10; &lt;div class="blog-card-title"&gt;Calibreの本棚(コンテンツサーバ)に外部からアクセスする環境を整えるメモ(Cloudflare Tunnel利用)&lt;/div&gt;&#10; &lt;div class="blog-card-url"&gt;/calibre-cloudflare-tunnel/&lt;/div&gt;&#10; &lt;/div&gt;&#10; &lt;div class="blog-card-thumbnail"&gt;&#10; &lt;img src="https://hack-le.com/images/uploads/2026/09/eyecatch_14279_1789096432.webp" alt="Calibreの本棚(コンテンツサーバ)に外部からアクセスする環境を整えるメモ(Cloudflare Tunnel利用)" loading="lazy" /&gt;&#10; &lt;/div&gt;&#10; &lt;/a&gt;&#10;&lt;/div&gt;&#10;&#10;&lt;h2 id="cloudbeatsでwebdav使ってサインイン"&gt;CloudBeatsでWebDAV使ってサインイン&#10;&lt;/h2&gt;&lt;p&gt;CloudBeatsの「クラウドサービスを追加」からwebDAVを選び（なぜwだけ小文字なのか）、以下の情報を追加する。&lt;/p&gt;&#10;&lt;ul&gt;&#10;&lt;li&gt;https://&amp;lt;独自ドメイン&amp;gt;/&amp;lt;作成したフォルダ名&amp;gt;&lt;/li&gt;&#10;&lt;li&gt;user: 作成したユーザID&lt;/li&gt;&#10;&lt;li&gt;pw: 作成したユーザPW&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;p&gt;そしたらアクセスできるようになるので、適当に音楽ファイルを置いて動作確認する。&lt;/p&gt;&#10;&lt;h2 id="おまけ-ファイル管理はfreefilesync"&gt;(おまけ) ファイル管理はFreeFileSync&#10;&lt;/h2&gt;&lt;p&gt;音楽ファイルの管理方法だが、これは好きにすればいい……んだけれど、個人的には「ローカルで構成しているフォルダ構成をそのままFreeFileSyncでFTP転送」としている。&lt;/p&gt;&#10;&lt;div class="blog-card-wrapper"&gt;&#10; &lt;a href="https://hack-le.com/mac-windows-freefilesync/" class="blog-card"&gt;&#10; &lt;div class="blog-card-content"&gt;&#10; &lt;div class="blog-card-label"&gt;&#10; &lt;svg xmlns="http://www.w3.org/2000/svg" width="13" height="13" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"&gt;&lt;path d="M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.71"&gt;&lt;/path&gt;&lt;path d="M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71"&gt;&lt;/path&gt;&lt;/svg&gt;&#10; &lt;span&gt;あわせて読みたい&lt;/span&gt;&#10; &lt;/div&gt;&#10; &lt;div class="blog-card-title"&gt;MacとWindowsのバックアップはNAS &amp;#43; FreeFileSyncを使っている&lt;/div&gt;&#10; &lt;div class="blog-card-url"&gt;/mac-windows-freefilesync/&lt;/div&gt;&#10; &lt;/div&gt;&#10; &lt;div class="blog-card-thumbnail"&gt;&#10; &lt;img src="https://hack-le.com/images/uploads/2026/09/eyecatch_15131_1789091100.webp" alt="MacとWindowsのバックアップはNAS &amp;#43; FreeFileSyncを使っている" loading="lazy" /&gt;&#10; &lt;/div&gt;&#10; &lt;/a&gt;&#10;&lt;/div&gt;&#10;&#10;&lt;p&gt;これは良いソフトウェアなので寄付してDonation Editionにしたらいいと思う。寄付すると並列でファイル転送できるようになる。寄付額はこちらで決められる。&lt;/p&gt;&#10;&lt;p&gt;ちなみにQNAPのNASでFTPを扱うには、QuFTP Serviceなるアプリをインストールする必要がある。まぁインストールしたらそのまんま使える。&lt;/p&gt;&#10;&lt;h2 id="使い勝手"&gt;使い勝手&#10;&lt;/h2&gt;&lt;p&gt;全然悪くない。ただファイル一覧が多すぎると表示に時間がかかる感じなので、一覧が多くなりすぎないようにしたほうがいいね。&lt;/p&gt;&#10;&lt;p&gt;でもそれくらいかな。音楽ファイルをフォルダ単位で整理していると、数年くらい忘れていた「音楽を管理する」という感覚が得られる。そうか、僕はこれがやりたかったんだなぁと、今さらながら思い出した。&lt;/p&gt;&#10;&lt;p&gt;いったいどうして、好きな音楽を雲の上に置くのがクールだなんて、意味不明なトレンドに乗ってしまったのだろうなぁ。まぁ、今となっては取り戻せることではない。これからまた、好きな音楽を聴いていこう。&lt;/p&gt;&#10;&lt;p&gt;[itemlink post_id=&amp;ldquo;15811&amp;rdquo;]&lt;/p&gt;&#10;</description></item><item><title>脱Dropbox：NASの音楽ファイルをストリーミングで再生する試み</title><link>https://hack-le.com/dropboxnas-streaming-music/</link><pubDate>Sat, 30 Aug 2025 21:49:44 +0900</pubDate><guid>https://hack-le.com/dropboxnas-streaming-music/</guid><description>&lt;p&gt;やろう、やろう、と思いながら、面倒臭くてずっとやらなかったNASの音楽ファイルをAndroidからストリーミング再生する環境をやっと構築した。ちょっと軽くランニングしてきた感じでは、十分使えているのではないかな、と思う。これでDropboxを使う大きな理由の一つをなくすことができたね。&lt;/p&gt;&#10;&lt;p&gt;はまりどころもあったので、そのうちにハウツー記事にしたいと思うが、今回はとりあえず所感をつらつらと。&lt;/p&gt;&#10;&lt;h2 id="ちょっとマニアックな構成"&gt;ちょっとマニアックな構成&#10;&lt;/h2&gt;&lt;p&gt;構成自体はちょっとマニアックな感じになってしまったかなと思う。&lt;/p&gt;&#10;&lt;pre class="mermaid" style="visibility:hidden"&gt;graph LR&#10;subgraph Internet&#10;android(Android)&#10;cloudflare(Cloudflare)&#10;end&#10;subgraph Home&#10;nas(NAS)&#10;pc(PC)&#10;end&#10;android --&gt; cloudflare&#10;cloudflare --&gt;|Cloudflare Tunnel| pc&#10;pc --&gt;|webDAV| nas&lt;/pre&gt;&lt;p&gt;この時点で特に技術系ではない一般ユーザにはオススメできない構成になってしまっているのはまぁそう。といっても別に何かコード書くわけじゃないし、頑張ればできると思うけど。&lt;/p&gt;&#10;&lt;p&gt;元々、構成的にはそりゃ出来るだろう、とは思っていたものの、WebDAV使えてストリーミングとオフライン両方できるAndroidアプリあるのかな、とか、NASでWebDAVの設定どうするのかな、とか個別に調べないといけないことも多くて、なかなか進まなかった。あと家の回線がJ:COMなので、クソザコ上り回線で大丈夫かなぁと思ったのもある。&lt;/p&gt;&#10;&lt;p&gt;まーでも、&lt;strong&gt;多少手こずったけれど、とりあえずうまくいったかなぁ&lt;/strong&gt;、という感じ。ただフォルダがたくさんあると一覧表示に時間かかるようで、これはスペックというよりネットワークの問題の気がする。このへんはもうちょっと整理がいるかな。&lt;/p&gt;&#10;&lt;p&gt;Androidアプリは&lt;strong&gt;CloudBeats&lt;/strong&gt;を使った。有料オプションは1500円くらいだったかな。オプションは複数のクラウド接続とオフライン再生に必要だった。妥当な料金じゃないかな。サブスクじゃないなら全然いいよ。だいたいNASとストレージの代金からすれば誤差みたいなもんだし。NASはQNAPのTS-233。ドメインは元々取得していてCloudflareで管理している自分用ドメインを流用した。&lt;/p&gt;&#10;&lt;p&gt;[itemlink post_id=&amp;ldquo;15811&amp;rdquo;]&lt;/p&gt;&#10;&lt;h2 id="世界線の修正作業"&gt;世界線の修正作業&#10;&lt;/h2&gt;&lt;p&gt;まぁもうちょっとしばらく使い混んで使い勝手は調べる必要があるかな。フォルダも整理しなおさないといけない。iTunes時代の名残で、全アーティストのフォルダがフラットに並んでしまっているんだよね。それで阿呆みたいに長いリストになってるからさ。&lt;/p&gt;&#10;&lt;p&gt;ああ&lt;strong&gt;iTunes、今にして思うと、僕にソフトウェアの進歩について強い疑念を抱かせた最初のアプリケーションだったかもしれない&lt;/strong&gt;。毎度毎度、強権的な仕様変更に振り回され、頼んでもない新機能を見せつけられ、その癖出来たことが出来なくなり、そしてファイルが壊される。&lt;strong&gt;途中Apple Musicなんて契約しようもんならもう最悪なことになる。なった&lt;/strong&gt;。&lt;/p&gt;&#10;&lt;p&gt;冷静に考えると、自前のライブラリを知らないサーバに置く必要はないし、ストレージが足りないならmicroSDを使えばいいし、microSDも挿せないならNASからストリーミングもあるし、別にプレイヤーを買ってもよかった。今でもiPodモドキはたくさん売ってるし。でもあの時は、なんかこれが未来なんかな、という気にさせられていたよね。実際このブログでもApple MusicとかiTunesで検索したら色々出てくるよ。懐かしい。&lt;/p&gt;&#10;&lt;p&gt;&lt;strong&gt;結果的には、間違えた世界線だったんだな&lt;/strong&gt;と思う。こうしてフォルダの再整理に勤しまねばならないのがもうね。っていうか消失している曲とかもあるんだよな。MOTHERっていうゲームのアレンジサントラでやけに凝ったのがあったんだけど、マニアックかつオムニバスでアーティストが分散しているのもあって、なんか気がついたら曲が何曲か見当たらない。一番気に入っていた曲は幸い（？）残っていたので、買い直すのもなんだかなぁ、みたいになってる。やれやれだなぁ。&lt;/p&gt;&#10;&lt;p&gt;[itemlink post_id=&amp;ldquo;18951&amp;rdquo;]&lt;/p&gt;&#10;&lt;p&gt;まぁ今からでも少しずつなおしていくさ。&lt;/p&gt;&#10;&lt;h2 id="dropboxに恨みはない"&gt;Dropboxに恨みはない&#10;&lt;/h2&gt;&lt;p&gt;一応言うと、僕はDropboxに対しては案外と好印象だったりする。実際最近このブログではクラウドについて腐していることが多いが、その中でも&lt;strong&gt;Dropboxに対して悪口めいたことは言ったことはないんじゃないかな&lt;/strong&gt;。Dropboxは便利だし、非常にマニアックな文字コード問題の対応、Linux対応などもあって、かゆいところに手が届くサービスだと思う。価格も決して高すぎるとは思わない。安いとも思わないけど。&lt;/p&gt;&#10;&lt;div class="blog-card-wrapper"&gt;&#10; &lt;a href="https://hack-le.com/data-self-hosting/" class="blog-card"&gt;&#10; &lt;div class="blog-card-content"&gt;&#10; &lt;div class="blog-card-label"&gt;&#10; &lt;svg xmlns="http://www.w3.org/2000/svg" width="13" height="13" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"&gt;&lt;path d="M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.71"&gt;&lt;/path&gt;&lt;path d="M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71"&gt;&lt;/path&gt;&lt;/svg&gt;&#10; &lt;span&gt;あわせて読みたい&lt;/span&gt;&#10; &lt;/div&gt;&#10; &lt;div class="blog-card-title"&gt;自分のデータは自分で守れ、雲の上で守ってもらえると思うな&lt;/div&gt;&#10; &lt;div class="blog-card-url"&gt;/data-self-hosting/&lt;/div&gt;&#10; &lt;/div&gt;&#10; &lt;div class="blog-card-thumbnail"&gt;&#10; &lt;img src="https://hack-le.com/images/uploads/2026/01/output-30.webp" alt="自分のデータは自分で守れ、雲の上で守ってもらえると思うな" loading="lazy" /&gt;&#10; &lt;/div&gt;&#10; &lt;/a&gt;&#10;&lt;/div&gt;&#10;&#10;&lt;p&gt;いつだったか不本意なアカウントBAN事件について書かれた個人の記事を見て「Dropboxもあるかー」と思ったことはある。しかし、少なくとも僕はこれまでアレゲなファイルも置いてきたが特にBANされたことはなく、またされたところで別に大して困らないので、使い続けている。まぁ、三年契約しちゃって、契約期間がまだあるからさ。&lt;/p&gt;&#10;&lt;p&gt;まーでも、次の契約更新はないかな。別にDropboxに恨みはないけれど、クラウド、サブスクはもう嫌だっていう気持ちのほうが強い。僕自身はこの流れから脱せられているわけではないけれど、せめてプライベートではまず離れたいところだね。&lt;/p&gt;&#10;</description></item><item><title>レンサバからVPSに帰ってきた</title><link>https://hack-le.com/return-vps/</link><pubDate>Sat, 24 May 2025 16:35:02 +0900</pubDate><guid>https://hack-le.com/return-vps/</guid><description>&lt;p&gt;このブログは12年……今年で13年の歴史があり、当初のLivedoorの無料ブログからインフラレベルで幾重の変遷を経て今に至るのだが、先日レンサバからVPSに帰ってきた。おおう、懐かしのConoHa VPSよ。このはちゃんのイラストはいらんから安くしてくれんかね……。とりあえずサービス維持調整費とかいう欺瞞は本当に早くやめてください。これ始まって2年以上たつけど、真面目な話なにかの法律に引っかからないんだろうか。&lt;/p&gt;&#10;&lt;p&gt;まぁそれでも3年分の契約で7割引きは十分お安い。VRAMは2GB。4GB欲しい。&lt;strong&gt;2GBの金で4GBほしい！！！！&lt;/strong&gt;&lt;/p&gt;&#10;&lt;h2 id="当サイトのインフラの歴史"&gt;当サイトのインフラの歴史&#10;&lt;/h2&gt;&lt;p&gt;当サイトのインフラは以下のように変遷している。&lt;/p&gt;&#10;&lt;ul&gt;&#10;&lt;li&gt;2012年：Livedoor無料ブログ&lt;/li&gt;&#10;&lt;li&gt;2016年&#10;&lt;ul&gt;&#10;&lt;li&gt;独自ドメインの取得&lt;/li&gt;&#10;&lt;li&gt;ConoHaのVPSに移行、WordPress構築&lt;/li&gt;&#10;&lt;li&gt;https対応&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;/li&gt;&#10;&lt;li&gt;2017年&#10;&lt;ul&gt;&#10;&lt;li&gt;PHP 5.4 -&amp;gt; 7.1&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;/li&gt;&#10;&lt;li&gt;2020年&#10;&lt;ul&gt;&#10;&lt;li&gt;PHP 7.1 -&amp;gt; 7.4&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;/li&gt;&#10;&lt;li&gt;2022年&#10;&lt;ul&gt;&#10;&lt;li&gt;PHP 7.4 -&amp;gt; 8.1&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;/li&gt;&#10;&lt;li&gt;2023年&#10;&lt;ul&gt;&#10;&lt;li&gt;ConoHaのVPSからレンタルサーバーのカラフルボックスに移行&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;/li&gt;&#10;&lt;li&gt;2025年&#10;&lt;ul&gt;&#10;&lt;li&gt;ConoHaのVPSに帰ってきた&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;p&gt;インフラの移行は面倒臭いしリスキーなのでそうあることではないのだが、こうしてみると2016年が大きな転機だったようだ。その後は基本的にせいぜいPHPのバージョンをあげる程度のことしかしていない。DBのバージョンはあげてなかった気がする。&lt;/p&gt;&#10;&lt;h2 id="httpsは本当にいらなかった"&gt;httpsは本当にいらなかった&#10;&lt;/h2&gt;&lt;p&gt;まぁやっぱり面倒臭かったのはhttps対応かなと思う。当時も「本当に必要かこれ」と思っていたけれど、今にして思うと本当に必要なかった。うちのサイトに暗号化しないといけない情報は特にないです。&lt;/p&gt;&#10;&lt;p&gt;とはいえ、やらないとブラウザの覇権を握ったGoogleから抹殺されてしまうために渋々従わざるを得なかったのだが、当時はGoogleが個人サイトそのものを抹殺するとはまだ思っていなかった。僕がGoogle嫌いなのは、Webサイトを運営していてGoogleの態度が変わっていくのを目の当たりにし、またジャイアントスイングされ続けてきたからだろう&lt;/p&gt;&#10;&lt;p&gt;Google検索しているだけだったら、「最近の検索クソだな」とは思っても、嫌いにまではならなかったと思う。実際プロダクトはウンコでもプロダクトの基礎となる部分では今なお大きな存在感を放っているし、エンジニア仲間の友人は今でもGoogle信者を自称している。実際色々な仕事をしているのはそうだ。しかし今の僕には、Googleがいなければ他の誰かが似たようなことをしていただろう、という風に感じられてしまう。少なくとも、僕がWebサイトを構築し運用することに関しては特に問題がなかっただろうし、もしかすると今よりも良い世界線だったかもしれない。&lt;/p&gt;&#10;&lt;h2 id="googleの影響力よ"&gt;Googleの影響力よ&#10;&lt;/h2&gt;&lt;p&gt;意図したわけではないのだが、何故かまたGoogleの愚痴になってしまった。色々な切り口がある中で、いつも最初にくるのはこれなんだが、逆説的にそれだけGoogleの影響力が大きかったということなんだろうなぁ。個人的にはGoogleはGAFAで最初に陥落するとすら思っているけれど、昨今のAI事情の中でどうなるか次第だ。&lt;/p&gt;&#10;&lt;p&gt;ちなみに僕は散々愚痴っといてなんだが、今はAIチャットボットとしてはGeminiに課金している。これについてはGeminiがいいというよりOpenAIが自滅し続けているだけという感覚だ。&lt;/p&gt;&#10;&lt;div class="blog-card-wrapper"&gt;&#10; &lt;a href="https://hack-le.com/chatgpt-yoisho/" class="blog-card"&gt;&#10; &lt;div class="blog-card-content"&gt;&#10; &lt;div class="blog-card-label"&gt;&#10; &lt;svg xmlns="http://www.w3.org/2000/svg" width="13" height="13" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"&gt;&lt;path d="M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.71"&gt;&lt;/path&gt;&lt;path d="M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71"&gt;&lt;/path&gt;&lt;/svg&gt;&#10; &lt;span&gt;あわせて読みたい&lt;/span&gt;&#10; &lt;/div&gt;&#10; &lt;div class="blog-card-title"&gt;ChatGPTの耐えられない軽さに解約：よいしょサンドイッチマンとかいう思考放棄の末路&lt;/div&gt;&#10; &lt;div class="blog-card-url"&gt;/chatgpt-yoisho/&lt;/div&gt;&#10; &lt;/div&gt;&#10; &lt;div class="blog-card-thumbnail"&gt;&#10; &lt;img src="https://hack-le.com/images/uploads/2026/08/eyecatch_17175_1787719685.webp" alt="ChatGPTの耐えられない軽さに解約：よいしょサンドイッチマンとかいう思考放棄の末路" loading="lazy" /&gt;&#10; &lt;/div&gt;&#10; &lt;/a&gt;&#10;&lt;/div&gt;&#10;&#10;&lt;p&gt;GeminiはChatGPTほどごますりしてこないので、Geminiを使っている。あと馴れ馴れしくないからさ……。&lt;/p&gt;&#10;&lt;p&gt;いつかローカルLLMがまともに使えるようになったら、なんとかそうしたい。現状はまだちょっと厳しい……。&lt;/p&gt;&#10;&lt;h2 id="https楽になったし検索ももう気にならない"&gt;https楽になったし、検索ももう気にならない&#10;&lt;/h2&gt;&lt;p&gt;さて、Googleの愚痴が本題ではなく、VPSに戻したことが本題なんだが、愚痴っていたらそれなりの文字数になってしまった。&lt;/p&gt;&#10;&lt;p&gt;しかしここまでの話でも言えることはあって、少なくとも以下の点はレンサバからVPSへの移行という面倒くさい作業をする背中を押した。&lt;/p&gt;&#10;&lt;ul&gt;&#10;&lt;li&gt;Cloudflareのおかげでhttps対応が楽になった&lt;/li&gt;&#10;&lt;li&gt;どうせもう検索ヒットは死んでるので、ダウンタイムの発生や移行ミスで検索順位が落ちるとかまったく気にしなくなった&lt;/li&gt;&#10;&lt;li&gt;botウザい&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;p&gt;https対応が楽になったというのは、まぁCloudflare Tunnelだなぁ。まぁLet&amp;rsquo;s Encryptのおかげで個人でも対応はできるんだけど、面倒くさいし定期的に証明書再発行ミスってサイトがマルウェア扱いされるみたいなことはよく起きる。っていうかあの作業がまず面倒臭いんだが、そういう無意味な構築・運用をしなくてよいっていうのは実際的にも精神的に楽だね。&lt;/p&gt;&#10;&lt;p&gt;そしてまぁ、移行はなんかミスると長時間のダウンタイムとかに繋がりかねず、そうすると検索順位が大きく落ちるなどのペナルティも発生しうるだけれど、既にジェノサイドされている個人サイトとしてはもはやどうでもいい。まぁと言いつつも当サイトのアクセスにおいて検索エンジン経由が多いのはそうなんだが、多いといったところでしれているし、そもそも&lt;strong&gt;検索で情報が見つからなくて困るのは検索している人であって僕ではない&lt;/strong&gt;。&lt;/p&gt;&#10;&lt;p&gt;まぁこれを言うと&lt;strong&gt;サイト運営の意義とは何か&lt;/strong&gt;という話なんだけれど、実際なんなんだろうと思いながらサイトを続けている。なんなんだろうね。ただ現状に納得いっていないことは確かだ。検索からすべて弾かれてももはや知ったことではないと思う。&lt;/p&gt;&#10;&lt;p&gt;そんなことより今は&lt;strong&gt;botがウザい&lt;/strong&gt;。たまにアクセス伸びてんなと思ったらだいたいフィルタリングしきれていないbotだよ。昔はまぁそれも大して気にならなかった、というのも検索エンジンなどに機械的に評価されようというならある程度のbotも仕方ない、という気持ちがあった。&lt;/p&gt;&#10;&lt;p&gt;しかし今となってはもうそんな気持ちもない。&lt;strong&gt;僕は何のためにブログを書いているのか、サイト運営を続けているのか、もはや僕自身にもわからない&lt;/strong&gt;。昔は利他と自己満足のないまぜのようなものと解釈していた。その気持ちは今もある。&lt;/p&gt;&#10;&lt;div class="blog-card-wrapper"&gt;&#10; &lt;a href="https://hack-le.com/cross/" class="blog-card"&gt;&#10; &lt;div class="blog-card-content"&gt;&#10; &lt;div class="blog-card-label"&gt;&#10; &lt;svg xmlns="http://www.w3.org/2000/svg" width="13" height="13" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"&gt;&lt;path d="M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.71"&gt;&lt;/path&gt;&lt;path d="M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71"&gt;&lt;/path&gt;&lt;/svg&gt;&#10; &lt;span&gt;あわせて読みたい&lt;/span&gt;&#10; &lt;/div&gt;&#10; &lt;div class="blog-card-title"&gt;ブログを続ける理由&lt;/div&gt;&#10; &lt;div class="blog-card-url"&gt;/cross/&lt;/div&gt;&#10; &lt;/div&gt;&#10; &lt;div class="blog-card-thumbnail"&gt;&#10; &lt;img src="https://hack-le.com/images/uploads/2026/09/eyecatch_9227_1789615824.webp" alt="ブログを続ける理由" loading="lazy" /&gt;&#10; &lt;/div&gt;&#10; &lt;/a&gt;&#10;&lt;/div&gt;&#10;&#10;&lt;p&gt;一方で、&lt;strong&gt;もはや自己も利他も薄っぺらく思える&lt;/strong&gt;ことも確かだ。しかしでは何かと言われるとわからない。だが少なくともGoogleの検索エンジンのためではないし、ましてbotのためではない。&lt;/p&gt;&#10;&lt;p&gt;レンサバだと対応が限られるが、VPS上なら対応の幅が広がるし、そもそもCloudflareの対応が有能である。やはりサイトは自由でなくては。&lt;/p&gt;&#10;&lt;h2 id="サイトは続くよ多分どこまでも"&gt;サイトは続くよ多分どこまでも&#10;&lt;/h2&gt;&lt;p&gt;そんなわけでまぁ、とりあえず2年ぶりのConoHaのVPSに帰ってきた。どういう形態になってもサイト自体は続けられることはありがたいと思う。本当はWordPressやDockerの話をしようかと考えていたんだがまったくしていない。まぁこれはまた別の機会に。&lt;/p&gt;&#10;&lt;p&gt;ConoHaはまぁGMOなんでGMOだけれど、とりあえず国内で安く使えるし、なんだかんだでいいと思うよ。&lt;/p&gt;&#10;&lt;p&gt;&lt;a class="link" href="https://www.conoha.jp/referral/?token=nNgrOjEEXwCVfvRYHJSDh.zn3QtmUyxWoTDKxWHvrZSWHGWKZ3o-HER" target="_blank" rel="noopener"&#10; &gt;お友達紹介&lt;/a&gt;&lt;/p&gt;&#10;&lt;p&gt;お友達紹介コードを貼っておしまい。こっから飛んで使い始めてもらったら1000円分のクーポンがもらえるはず（&lt;a class="link" href="https://www.conoha.jp/conotomo/" target="_blank" rel="noopener"&#10; &gt;このとも ～友達紹介～｜レンタルサーバーならConoHa&lt;/a&gt;）。そして定常的に使ったら僕に2000円分のクーポンが入る。クーポンのためにブログを続ける人生だった。&lt;/p&gt;&#10;&lt;p&gt;しかし今まで数百回クリックされているはずだが実際に使うとこまでいったのは1人だけである。もはやVPS流行らないのか。&lt;/p&gt;&#10;&lt;h2 id="関連記事"&gt;関連記事&#10;&lt;/h2&gt;&lt;div class="blog-card-wrapper"&gt;&#10; &lt;a href="https://hack-le.com/yaranakuteiikotobakarishiteiru/" class="blog-card"&gt;&#10; &lt;div class="blog-card-content"&gt;&#10; &lt;div class="blog-card-label"&gt;&#10; &lt;svg xmlns="http://www.w3.org/2000/svg" width="13" height="13" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"&gt;&lt;path d="M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.71"&gt;&lt;/path&gt;&lt;path d="M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71"&gt;&lt;/path&gt;&lt;/svg&gt;&#10; &lt;span&gt;あわせて読みたい&lt;/span&gt;&#10; &lt;/div&gt;&#10; &lt;div class="blog-card-title"&gt;やらなくていいことばかりしている&lt;/div&gt;&#10; &lt;div class="blog-card-url"&gt;/yaranakuteiikotobakarishiteiru/&lt;/div&gt;&#10; &lt;/div&gt;&#10; &lt;div class="blog-card-thumbnail"&gt;&#10; &lt;img src="https://hack-le.com/images/uploads/2025/05/zakki-scrible.webp" alt="やらなくていいことばかりしている" loading="lazy" /&gt;&#10; &lt;/div&gt;&#10; &lt;/a&gt;&#10;&lt;/div&gt;&#10;&#10;&lt;div class="blog-card-wrapper"&gt;&#10; &lt;a href="https://hack-le.com/cross/" class="blog-card"&gt;&#10; &lt;div class="blog-card-content"&gt;&#10; &lt;div class="blog-card-label"&gt;&#10; &lt;svg xmlns="http://www.w3.org/2000/svg" width="13" height="13" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"&gt;&lt;path d="M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.71"&gt;&lt;/path&gt;&lt;path d="M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71"&gt;&lt;/path&gt;&lt;/svg&gt;&#10; &lt;span&gt;あわせて読みたい&lt;/span&gt;&#10; &lt;/div&gt;&#10; &lt;div class="blog-card-title"&gt;ブログを続ける理由&lt;/div&gt;&#10; &lt;div class="blog-card-url"&gt;/cross/&lt;/div&gt;&#10; &lt;/div&gt;&#10; &lt;div class="blog-card-thumbnail"&gt;&#10; &lt;img src="https://hack-le.com/images/uploads/2026/09/eyecatch_9227_1789615824.webp" alt="ブログを続ける理由" loading="lazy" /&gt;&#10; &lt;/div&gt;&#10; &lt;/a&gt;&#10;&lt;/div&gt;&#10;&#10;&lt;div class="blog-card-wrapper"&gt;&#10; &lt;a href="https://hack-le.com/chatgpt-yoisho/" class="blog-card"&gt;&#10; &lt;div class="blog-card-content"&gt;&#10; &lt;div class="blog-card-label"&gt;&#10; &lt;svg xmlns="http://www.w3.org/2000/svg" width="13" height="13" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"&gt;&lt;path d="M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.71"&gt;&lt;/path&gt;&lt;path d="M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71"&gt;&lt;/path&gt;&lt;/svg&gt;&#10; &lt;span&gt;あわせて読みたい&lt;/span&gt;&#10; &lt;/div&gt;&#10; &lt;div class="blog-card-title"&gt;ChatGPTの耐えられない軽さに解約：よいしょサンドイッチマンとかいう思考放棄の末路&lt;/div&gt;&#10; &lt;div class="blog-card-url"&gt;/chatgpt-yoisho/&lt;/div&gt;&#10; &lt;/div&gt;&#10; &lt;div class="blog-card-thumbnail"&gt;&#10; &lt;img src="https://hack-le.com/images/uploads/2026/08/eyecatch_17175_1787719685.webp" alt="ChatGPTの耐えられない軽さに解約：よいしょサンドイッチマンとかいう思考放棄の末路" loading="lazy" /&gt;&#10; &lt;/div&gt;&#10; &lt;/a&gt;&#10;&lt;/div&gt;&#10;&#10;&lt;div class="blog-card-wrapper"&gt;&#10; &lt;a href="https://hack-le.com/escape/" class="blog-card"&gt;&#10; &lt;div class="blog-card-content"&gt;&#10; &lt;div class="blog-card-label"&gt;&#10; &lt;svg xmlns="http://www.w3.org/2000/svg" width="13" height="13" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"&gt;&lt;path d="M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.71"&gt;&lt;/path&gt;&lt;path d="M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71"&gt;&lt;/path&gt;&lt;/svg&gt;&#10; &lt;span&gt;あわせて読みたい&lt;/span&gt;&#10; &lt;/div&gt;&#10; &lt;div class="blog-card-title"&gt;サーバーも会社も学校も、いつでも逃げ出せることが大事&lt;/div&gt;&#10; &lt;div class="blog-card-url"&gt;/escape/&lt;/div&gt;&#10; &lt;/div&gt;&#10; &lt;div class="blog-card-thumbnail"&gt;&#10; &lt;img src="https://hack-le.com/images/uploads/2026/09/eyecatch_3612_1789491633.webp" alt="サーバーも会社も学校も、いつでも逃げ出せることが大事" loading="lazy" /&gt;&#10; &lt;/div&gt;&#10; &lt;/a&gt;&#10;&lt;/div&gt;&#10;&#10;</description></item><item><title>WPFormsでGmailのフリーアドレス経由で独自ドメインをfromにしてメール送信する</title><link>https://hack-le.com/wpforms-gmail/</link><pubDate>Fri, 02 Aug 2024 14:31:05 +0900</pubDate><guid>https://hack-le.com/wpforms-gmail/</guid><description>&lt;p&gt;なんかすごい長ったらしいけど、要は受信専用で使っていた独自ドメインのメールアドレスについて、WPFormsのSMTP機能でメール送信したくなり、Gmailのエイリアス機能を使って、Gmailアカウント経由でぶっ飛ばす、ということ。昨今の事情を考えるといつまで使えるのかわからないんだけれど、少なくとも今は使えるみたいなのでメモ。&lt;/p&gt;&#10;&lt;h2 id="前提"&gt;前提&#10;&lt;/h2&gt;&lt;p&gt;独自ドメインで、メール受信としてCloudflareのEメールルーティング→Gmailに飛ばしている。受信専用ならこれでいいやと思っていたが、WordPressの投稿フォームプラグイン、WPFormsを使って、Fromを独自ドメインのメールアドレスとなるように、メールを送信したい。フツーなら、投稿フォーム用のメールアドレスでSMTP認証で送信したらいいわけだが、受信専用なのでそうもいかない。&lt;/p&gt;&#10;&lt;p&gt;ということで、Gmailのフリーアドレスのアカウントを経由して飛ばす。以下のような感じ。&lt;/p&gt;&#10;&lt;pre class="mermaid" style="visibility:hidden"&gt;graph LR&#10;sender(WPForms)&#10;gmail(gmail.com)&#10;receiver(フォーム投稿者)&#10;sender --&gt; gmail&#10;gmail --&gt;|hoge.comとして内容確認メール送る| receiver&lt;/pre&gt;&lt;h2 id="やり方"&gt;やり方&#10;&lt;/h2&gt;&lt;p&gt;基本的には、gmail.comのアドレスを使って、独自ドメインのメールアドレスで送信するやり方を、WPFormsに適用する、という方法になる。そのやり方については下記の記事が非常に参考になりました。&lt;/p&gt;&#10;&lt;p&gt;&lt;a class="link" href="https://qiita.com/rokuosan/items/e3415ea30ad5e48d3b0f" target="_blank" rel="noopener"&#10; &gt;Cloudflare とGmail で独自ドメインのメールを無料で送受信する方法【Cloudflare Email Routing】 #cloudflare - Qiita&lt;/a&gt;&lt;/p&gt;&#10;&lt;p&gt;詳細は記事に参照として、送信側の設定としては、下記の操作をする。&lt;/p&gt;&#10;&lt;ol&gt;&#10;&lt;li&gt;Gmailのアカウントでアプリパスワードを設定する(既に非推奨だがキニシナイ)&lt;/li&gt;&#10;&lt;li&gt;Gmailにアドレスを追加する&lt;/li&gt;&#10;&lt;/ol&gt;&#10;&lt;ul&gt;&#10;&lt;li&gt;設定の「すべての設定を表示」&lt;/li&gt;&#10;&lt;li&gt;「アカウントとインポート」タブ&lt;/li&gt;&#10;&lt;li&gt;「他のメールアドレスを追加」&lt;/li&gt;&#10;&lt;li&gt;独自ドメインのメールアドレス + エイリアスとして扱いますにチェック&lt;/li&gt;&#10;&lt;li&gt;SMTPサーバの設定&#10;&lt;ul&gt;&#10;&lt;li&gt;SMTPサーバ: smtp.gmail.com&lt;/li&gt;&#10;&lt;li&gt;ユーザ名: ログインアカウントのメールアドレス&lt;/li&gt;&#10;&lt;li&gt;パスワード: アプリパスワード&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;p&gt;この設定後、同じようにSMTPを使ったメール送信をすると、追加した独自ドメインのメールアドレスで送信できることが確認できる。&lt;/p&gt;&#10;&lt;p&gt;WPFormsにおいても、SMTP認証を使って、上記のSMTPサーバの設定をすることで、送信することが確認できた。しかしながら、&lt;strong&gt;設定画面でSPF/DMARCの設定できてないよとWarningがでる&lt;/strong&gt;。でるが今は送れるので、いったんよしとする。&lt;/p&gt;&#10;&lt;h2 id="注意"&gt;注意&#10;&lt;/h2&gt;&lt;p&gt;メーラのSMTP設定でも同様にすることで、メールクライアントからメール飛ばすことも可能。しかし昨今の情勢を考えると、永続的に使えるとは思わないほうがよさそう。&lt;/p&gt;&#10;&lt;ul&gt;&#10;&lt;li&gt;アプリパスワードがdeprecated扱いでいつなくなってもおかしくない&lt;/li&gt;&#10;&lt;li&gt;DKIM/SPF/DMARC周りが厳しくなっている昨今、いつまでもちゃんと届くか不安&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;p&gt;なのでまぁ、一時的な措置としては本記事の内容でも良いと思うが、今後もずっと安定してSMTP使ってメール送りたいなら、やっぱりまぁちゃんとしておいたほうが安全かなぁと思う。さすがに自分でメールサーバたてる気合いは普通ないことを考えると、ConoHaのメールサーバを借りたり、あるいはZoho Mailあたり使うほうが良いかな。&lt;/p&gt;&#10;&lt;div class="blog-card-wrapper"&gt;&#10; &lt;a href="https://hack-le.com/zohomail/" class="blog-card"&gt;&#10; &lt;div class="blog-card-content"&gt;&#10; &lt;div class="blog-card-label"&gt;&#10; &lt;svg xmlns="http://www.w3.org/2000/svg" width="13" height="13" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"&gt;&lt;path d="M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.71"&gt;&lt;/path&gt;&lt;path d="M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71"&gt;&lt;/path&gt;&lt;/svg&gt;&#10; &lt;span&gt;あわせて読みたい&lt;/span&gt;&#10; &lt;/div&gt;&#10; &lt;div class="blog-card-title"&gt;格安メールを求めて、Zohomailを使い始めてみる&lt;/div&gt;&#10; &lt;div class="blog-card-url"&gt;/zohomail/&lt;/div&gt;&#10; &lt;/div&gt;&#10; &lt;div class="blog-card-thumbnail"&gt;&#10; &lt;img src="https://hack-le.com/images/uploads/2026/09/eyecatch_15015_1788944127.webp" alt="格安メールを求めて、Zohomailを使い始めてみる" loading="lazy" /&gt;&#10; &lt;/div&gt;&#10; &lt;/a&gt;&#10;&lt;/div&gt;&#10;&#10;</description></item><item><title>Amazon SES + Cloudflare Email Routing + Gmailで安上がりな独自ドメインのメール送受信</title><link>https://hack-le.com/amazon-ses-cloudflare-email-routing-gmail/</link><pubDate>Fri, 17 May 2024 19:01:27 +0900</pubDate><guid>https://hack-le.com/amazon-ses-cloudflare-email-routing-gmail/</guid><description>&lt;p&gt;Webサービスとかやると、ドメインごとにメールの送受信どうするかな問題が生じる。これの構成は無数に考えられるので、何が最適解かは状況によるだろうが、とりあえず「始めたばかりだしとにかく安上がりでさらっと済ませたい」という要求をかなえるため、送信はAmazon SES、受信はCloudflareのEmail Routing + Gmail(個人用)という構成を組んだ。今のところは問題なさげに動いている。&lt;/p&gt;&#10;&lt;p&gt;前提として、ドメインはCloudflareで管理する。&lt;/p&gt;&#10;&lt;p&gt;（追記 2024-05-19）この構成だと設定した独自ドメイン同士のメールでエラーが発生した。設定次第でなおせるんだろうか……&lt;/p&gt;&#10;&lt;h2 id="全体の構成"&gt;全体の構成&#10;&lt;/h2&gt;&lt;p&gt;全体の構成を図示しておく。&lt;/p&gt;&#10;&lt;p&gt;「自分」と「誰かさん」の間でメールを送受信する。&lt;strong&gt;送信経路を実線、受信経路を破線&lt;/strong&gt;とする。&lt;/p&gt;&#10;&lt;pre class="mermaid" style="visibility:hidden"&gt;graph TD&#10;jibun(自分)&#10;dareka(誰かさん)&#10;ses(Amazon SES)&#10;jibun --&gt;|送信: SMTP| ses --&gt; recv --&gt; dareka&#10;ses ---|情報登録| dns&#10;recv ---|参照する| dns&#10;cf(Cloudflare)&#10;gmail(Gmail)&#10;dareka -.-&gt; cf -.-&gt;|Email Routing| gmail -.-&gt;|受信| jibun&lt;/pre&gt;&lt;p&gt;普通にメールサービス使えばいいじゃないか説は有力というかそうすべきなんだろうなぁと思いつつ、そうは言ってもメールサービスは固定費もそこそこかかるし、システム的なメール配信まで考えるとAmazon SESは使えておきたいと思った。SES部分はResendとかでもいい。というかResendで似たようなことをやっている人がいた。&lt;/p&gt;&#10;&lt;p&gt;&lt;a class="link" href="https://zenn.dev/the_exile/articles/cloudflare-gmail-resend" target="_blank" rel="noopener"&#10; &gt;Cloudflare + Gmail + Resendで無料法人メールアドレスを作る&lt;/a&gt;&lt;/p&gt;&#10;&lt;p&gt;構成一緒だね。皆考えることは同じなのか……。&lt;/p&gt;&#10;&lt;h2 id="受信経路"&gt;受信経路&#10;&lt;/h2&gt;&lt;p&gt;まず先に受信から始める。構成部分は以下。&lt;/p&gt;&#10;&lt;pre class="mermaid" style="visibility:hidden"&gt;graph TD&#10;jibun(自分)&#10;dareka(誰かさん)&#10;cf(Cloudflare)&#10;gmail(Gmail)&#10;dareka -.-&gt; cf -.-&gt;|Email Routing| gmail -.-&gt;|受信| jibun&lt;/pre&gt;&lt;p&gt;これはCloudflareのEmail RoutingとGmailを利用する。まぁつまり、&lt;strong&gt;CloudflareのEmail Routing&lt;/strong&gt;の&lt;strong&gt;機能でメールをGmailに飛ばす&lt;/strong&gt;というものだ。機能については公式ページは以下。&lt;/p&gt;&#10;&lt;p&gt;&lt;a class="link" href="https://www.cloudflare.com/ja-jp/developer-platform/email-routing/" target="_blank" rel="noopener"&#10; &gt;Email Routing | アドレス作成とメール転送が簡単に | Cloudflare&lt;/a&gt;&lt;/p&gt;&#10;&lt;p&gt;無料で使える。よい。&lt;/p&gt;&#10;&lt;p&gt;Gmailについては転送先のアドレスとして使えれば良いので別にGmailでなくても良い。良いのだが、メールサービスによってはうまくいかない可能性もあるだろう（送信のところでこれについては触れる）。&lt;/p&gt;&#10;&lt;p&gt;さて、この受信についてはやることはあまり多くない。Cloudflareのダッシュボードでドメインを選択し、Email Routingを始め、アドレスと転送先のアドレスを指定するだけでよい。簡単過ぎてビビる。&lt;/p&gt;&#10;&lt;h2 id="送信経路"&gt;送信経路&#10;&lt;/h2&gt;&lt;p&gt;送信のほうは受信と違ってやや手間がかかる。メール送信については運用する側も考えることが多い。&lt;/p&gt;&#10;&lt;h3 id="dkimspfdmarcを知る"&gt;DKIM/SPF/DMARCを知る&#10;&lt;/h3&gt;&lt;p&gt;具体的にはDKIM/SPF/DMARCの仕組みを定性的に理解していなくてはいけない。これについては下記に記事を書いたので詳細については参考にされたい。&lt;/p&gt;&#10;&lt;p&gt;/dkim-spf-dmarc&#10;ややこしい&lt;/p&gt;&#10;&lt;p&gt;ざっくり言うと、&lt;strong&gt;DKIMはメールが改竄されてないことを保証する仕組み、SPFは送信者が信頼できることを保証する仕組み、DMARCはDKIMとSPFをどれくらい厳格に適用し、NGだったらどう対応するのかとかを標準化したポリシー&lt;/strong&gt;である。で、このためには送信側と受信側の両方できっちり対応している必要がある。&lt;/p&gt;&#10;&lt;p&gt;先の受信経路のところで、Gmailじゃなくてもいいけどちゃんと動くかはわからん、と書いたのは、メールサービスがどれくらいちゃんと対応しているかわからんからだ。今回のように転送が入るとややこしくなると思うので、サービスによってはどうなるかわからん。またGmailを使っていても送信側次第では転送落ちるとかありそうな気もする。わからん。怖い。怖いけどとりあえず今のところは使えている。&lt;/p&gt;&#10;&lt;h3 id="sesの設定"&gt;SESの設定&#10;&lt;/h3&gt;&lt;p&gt;さて、以上を踏まえたうえで、送信経路について改めて見てみよう。&lt;/p&gt;&#10;&lt;pre class="mermaid" style="visibility:hidden"&gt;graph TD&#10;jibun(自分)&#10;dareka(誰かさん)&#10;ses(Amazon SES)&#10;recv(受信側のサーバ)&#10;dns(DNSサーバ)&#10;jibun --&gt;|送信: SMTP| ses --&gt; recv --&gt; dareka&#10;ses -.-&gt;|情報登録| dns&#10;recv -.-&gt;|参照する| dns&lt;/pre&gt;&lt;p&gt;ポイントはDNSサーバである。DNSサーバに情報登録とあるが、これは何かと言うと、先に述べたDKIM/SPF/DMARCの対応である。&lt;strong&gt;DKIM/SPF/DMARCに必要な情報はDNSのレコードに登録する&lt;/strong&gt;のである。登録する情報の意味については先にあげた記事を参照。&lt;/p&gt;&#10;&lt;p&gt;実務的には、&lt;strong&gt;SESに「これ登録しろ」と言われるまま、Cloudflareのダッシュボードよりレコード登録をすればいい&lt;/strong&gt;。具体的な操作は、どうせいつか変わる操作よりも、多少面倒でもDKIM/SPF/DMARCはなんなのかをちゃんと理解するのが一番の近道だと思う。理解すれば何をどうすればいいかはわかる。&lt;/p&gt;&#10;&lt;p&gt;&lt;strong&gt;SESではDKIM対応がドメイン検証も兼ねている&lt;/strong&gt;ようだ。送信元の登録はSPF対応である。また、DMARCについても書かれているのをそのまま使えばいい。一点注意として、MXレコードの数字は優先順位である（まぁそのまんま値に入れようとしたら怒られるので察しはつくと思うが）。&lt;/p&gt;&#10;&lt;p&gt;登録できれば、とりあえずまずAPIで送信確認するとよい。メーラ使うにはSMTPの設定が必要なので、まずAPIで送信確認するほうが楽。SESは最初サンドボックス環境だが、サンドボックスでは認証したメールアドレスしか使えないことに注意。なので、先に受信側の対応をしたわけだ。&lt;/p&gt;&#10;&lt;p&gt;なおメールのサンプルコードは以下（By ChatGPT）。&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-python" data-lang="python"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="nn"&gt;boto3&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="kn"&gt;from&lt;/span&gt; &lt;span class="nn"&gt;botocore.exceptions&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;ClientError&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# SESクライアントの作成&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;ses_client&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;boto3&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;client&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;ses&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;region_name&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;ap-northeast-1&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="c1"&gt;# ご使用のリージョンに合わせて変更してください&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# メールのパラメータ&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;sender&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;sender@example.com&amp;#34;&lt;/span&gt; &lt;span class="c1"&gt;# 送信者のメールアドレス&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;recipient&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;recipient@example.com&amp;#34;&lt;/span&gt; &lt;span class="c1"&gt;# 受信者のメールアドレス&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;subject&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;Hello from Amazon SES&amp;#34;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;body_text&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;Hello,&lt;/span&gt;&lt;span class="se"&gt;\r\n&lt;/span&gt;&lt;span class="s2"&gt;This is a test email sent by Amazon SES using Boto3.&amp;#34;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="k"&gt;try&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="c1"&gt;# Send Email&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;response&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;ses_client&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;send_email&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;Source&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;sender&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;Destination&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;ToAddresses&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;recipient&lt;/span&gt;&lt;span class="p"&gt;]},&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;Message&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="s1"&gt;&amp;#39;Subject&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;Data&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;subject&lt;/span&gt;&lt;span class="p"&gt;},&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="s1"&gt;&amp;#39;Body&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;Text&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;Data&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;body_text&lt;/span&gt;&lt;span class="p"&gt;}}&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;}&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;)&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nb"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;Email sent! Message ID:&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;response&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;MessageId&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;])&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="k"&gt;except&lt;/span&gt; &lt;span class="n"&gt;ClientError&lt;/span&gt; &lt;span class="k"&gt;as&lt;/span&gt; &lt;span class="n"&gt;e&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nb"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;An error occurred:&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;e&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;response&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;Error&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;][&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;Message&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;])&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;boto3をインストールしているPCなら、送受信のメールアドレスだけ変えればそのまんま使える。こういうサンプルコード一瞬で出力してくれるだけでも有り難い。&lt;/p&gt;&#10;&lt;p&gt;送信できたら、次はSMTPで送れるかを確認する。SESのコンソールにSMTP設定があるのでそこから言われるままにやる……だとアレなんだが、俺たちのクラスメソッドさんに良い記事があるのでそれを参考にどうぞ。&lt;/p&gt;&#10;&lt;p&gt;&lt;a class="link" href="https://dev.classmethod.jp/articles/configured-smtp-authentication-settings-for-ses/" target="_blank" rel="noopener"&#10; &gt;Amazon SES に SMTP認証設定を追加してメールクライアントから SMTPサーバとして利用してみた | DevelopersIO&lt;/a&gt;&lt;/p&gt;&#10;&lt;p&gt;設定方法はメーラによる。SMTPサーバのみ設定したアカウントを作成する必要があり（受信側がエラー出る）、やや特殊な設定となる。とりあえずMacの標準メールアプリでは設定できた。OutlookはPOPとかでやろうとしてもサインインできないと言われて登録できなかった。あんまり本意気でOutlook使ってないのでわからんが、イマドキのOutlookだとできないのかもしれない。Thunderbirdはできるんじゃないかな多分。&lt;/p&gt;&#10;&lt;h2 id="運用"&gt;運用&#10;&lt;/h2&gt;&lt;p&gt;書くほどでもないが。&lt;/p&gt;&#10;&lt;p&gt;注意点として、SMTPのパスワード再発行はできない。したがって、パスワード紛失時はユーザの作り直しになる（つまり削除と登録）。&lt;/p&gt;&#10;&lt;h3 id="登録"&gt;登録&#10;&lt;/h3&gt;&lt;ol&gt;&#10;&lt;li&gt;Cloudflare&lt;/li&gt;&#10;&lt;/ol&gt;&#10;&lt;ul&gt;&#10;&lt;li&gt;転送先の宛先の追加&lt;/li&gt;&#10;&lt;li&gt;Routingで宛先に送るアカウントの追加&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;ol start="2"&gt;&#10;&lt;li&gt;SES&lt;/li&gt;&#10;&lt;/ol&gt;&#10;&lt;ul&gt;&#10;&lt;li&gt;SMTP認証情報の追加（IAMユーザができる）&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;h3 id="削除"&gt;削除&#10;&lt;/h3&gt;&lt;ol&gt;&#10;&lt;li&gt;Cloudflare&lt;/li&gt;&#10;&lt;/ol&gt;&#10;&lt;ul&gt;&#10;&lt;li&gt;アカウントの削除&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;ol start="2"&gt;&#10;&lt;li&gt;SES&lt;/li&gt;&#10;&lt;/ol&gt;&#10;&lt;ul&gt;&#10;&lt;li&gt;ユーザの削除&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;h2 id="所感"&gt;所感&#10;&lt;/h2&gt;&lt;p&gt;メールサービスは地味にそこそこの固定費がかかる。多少運用が面倒になってもいいから、とにかく安上がりで自由度があってすぐできることを目標にあれこれ検討した結果こうなった。これが最適解かはわからないけれど、とりあえずいいかなという感じ。そのうちに大きくなってきたらちゃんとメールサービスを使った方がいいかなと思う。&lt;/p&gt;&#10;</description></item><item><title>Calibreの本棚(コンテンツサーバ)に外部からアクセスする環境を整えるメモ(Cloudflare Tunnel利用)</title><link>https://hack-le.com/calibre-cloudflare-tunnel/</link><pubDate>Tue, 14 May 2024 10:40:37 +0900</pubDate><guid>https://hack-le.com/calibre-cloudflare-tunnel/</guid><description>&lt;p&gt;Calibreのコンテンツサーバ機能はとても便利だ。Webブラウザから蔵書を検索できるのは利便性が高い。できればインターネット上からアクセスできると、外で本をダウンロードできるし、また本屋で「これ積んでるっけ？」と悩まなくて済む（読め）。&lt;/p&gt;&#10;&lt;p&gt;ということで、Calibreの本棚（コンテンツサーバ）をインターネット上に公開しつつ、自分以外はアクセスできない状態にしたい。前提条件として、Cloudflareでドメイン管理していること（Cloudflareのサービスを利用するので）。&lt;/p&gt;&#10;&lt;p&gt;Calibreの機能としてはユーザアカウントを管理してパスワード保護したうえで外部公開、みたいなのがドキュメントにあるのだけれど（&lt;a class="link" href="https://manual.calibre-ebook.com/ja/server.html" target="_blank" rel="noopener"&#10; &gt;calibre コンテンツサーバー — calibre 7.10.0 ドキュメント&lt;/a&gt;）、Cloudflare使うほうが簡単かつ安全かなと思う。&lt;/p&gt;&#10;&lt;h2 id="前提と環境"&gt;前提と環境&#10;&lt;/h2&gt;&lt;p&gt;前提&lt;/p&gt;&#10;&lt;ul&gt;&#10;&lt;li&gt;Cloudflareでドメインを管理している&#10;&lt;ul&gt;&#10;&lt;li&gt;ネームサーバもCloudflare&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;p&gt;ホストマシンはMacを使うが、WindowsでもLinuxでもできるはず。以下の環境。&lt;/p&gt;&#10;&lt;ul&gt;&#10;&lt;li&gt;M2 Pro Mac mini 2023&lt;/li&gt;&#10;&lt;li&gt;macOS 14.4.1&lt;/li&gt;&#10;&lt;li&gt;cloudflared 2024.4.1 (built 2024-04-22T22:16:50Z)&lt;/li&gt;&#10;&lt;li&gt;Calibre 7.10&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;p&gt;Cloudflare Tunnelを利用する。これは使うと簡単にNAT越えっぽいことができる。構成的には以下のような感じになる。&lt;/p&gt;&#10;&lt;pre class="mermaid" style="visibility:hidden"&gt;graph LR&#10;client(Client)&#10;cf(Cloudflare)&#10;subgraph Mac&#10;calibre(Calibre)&#10;cloudflared(cloudflared)&#10;end&#10;client --&gt;|books.example.com| cf&#10;cf --&gt;|tunnel| cloudflared&#10;cloudflared --&gt;|http://localhost:8080| calibre&lt;/pre&gt;&lt;p&gt;つまり books.example.com にアクセスすることで、localhostのコンテンツサーバにアクセスできるようにする。これだけ見ると全世界に本棚公開やんけとなるが、&lt;strong&gt;素晴らしいことにGUIで設定ポチポチするだけで、メールアドレスによる認証ができる&lt;/strong&gt;。&lt;/p&gt;&#10;&lt;p&gt;Cloudflareのサービスをめっちゃ使うので、Cloudflareでドメイン管理していることが前提条件となる。&lt;/p&gt;&#10;&lt;h2 id="手順のメモ"&gt;手順のメモ&#10;&lt;/h2&gt;&lt;p&gt;UIとかどうせ変わりそうだから、かなり雑に手順。まぁだいたいわかるでしょくらいの感じで。&lt;/p&gt;&#10;&lt;h3 id="calibreでコンテンツサーバを起動する"&gt;Calibreでコンテンツサーバを起動する&#10;&lt;/h3&gt;&lt;p&gt;まぁまずは言わずもがなだけれど、Calibreで「接続/共有」よりコンテンツサーバを起動する。デフォルトだとlocalhostの8080だろう。&lt;/p&gt;&#10;&lt;h3 id="cloudflareでトンネル作成する"&gt;Cloudflareでトンネル作成する&#10;&lt;/h3&gt;&lt;ol&gt;&#10;&lt;li&gt;Cloudflareのコンパネにログイン&lt;/li&gt;&#10;&lt;li&gt;Zero Trustを起動してNetworksのTunnelsよりトンネルを作成する&lt;/li&gt;&#10;&lt;li&gt;流れに沿って設定していく。トンネル名はなんかわかりやすいヤツを適当に。ホストマシンに &lt;code&gt;cloudflared&lt;/code&gt; をインストールしてトンネル開通&lt;/li&gt;&#10;&lt;/ol&gt;&#10;&lt;ul&gt;&#10;&lt;li&gt;Macの場合はhomebrewでインストールのうえ、 &lt;code&gt;/Library/LaunchDaemons/com.cloudflare.cloudflared.plist&lt;/code&gt; にplistファイルが作成される&#10;&lt;ul&gt;&#10;&lt;li&gt;エラーログは &lt;code&gt;/Library/Logs/com.cloudflare.cloudflared.err.log&lt;/code&gt; に出るのでなんかおかしかったら見るとよい&lt;/li&gt;&#10;&lt;li&gt;デーモンの起動や停止は &lt;code&gt;launchctl start(stop) com.cloudflare.cloudflared&lt;/code&gt; で。&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;/li&gt;&#10;&lt;li&gt;疎通したらダッシュボードにその旨が出るので確認&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;ol start="4"&gt;&#10;&lt;li&gt;Public Hostnameからpublic hostnameを追加する。サブドメイン適当に決める&lt;/li&gt;&#10;&lt;/ol&gt;&#10;&lt;ul&gt;&#10;&lt;li&gt;ここで決めたサブドメインはDNSのレコードにCNAMEで登録される&lt;/li&gt;&#10;&lt;li&gt;疎通先を http://localhost:8080 にする&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;p&gt;これで設定したドメインにアクセスするとCalibreのコンテンツサーバにアクセスできるようになる。&lt;/p&gt;&#10;&lt;h3 id="accessで認証入れる"&gt;Accessで認証入れる&#10;&lt;/h3&gt;&lt;p&gt;このままだと全世界に自分の本棚が公開されてしまい、著作権法上も大きな問題であるし、自分の尊厳も問題になると思われるため（本棚による）認証を入れる。&lt;/p&gt;&#10;&lt;ol&gt;&#10;&lt;li&gt;Zero TrustよりAccess -&amp;gt; ApplicationsよりApplicationを追加&lt;/li&gt;&#10;&lt;li&gt;Self-hosted&lt;/li&gt;&#10;&lt;li&gt;名前はなんかわかりやすいやつにする。ドメインは上で設定したドメインにしてNext&lt;/li&gt;&#10;&lt;li&gt;ポリシーの名前はなんか適当に決める&lt;/li&gt;&#10;&lt;li&gt;Configure Rulesはメールアドレスにして、許可するメールアドレスを指定してNext&lt;/li&gt;&#10;&lt;/ol&gt;&#10;&lt;ul&gt;&#10;&lt;li&gt;IPアドレスの指定とかもできる&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;ol start="6"&gt;&#10;&lt;li&gt;CORSとかCookieの設定ができるが特に何もせずAdd an application&lt;/li&gt;&#10;&lt;/ol&gt;&#10;&lt;ul&gt;&#10;&lt;li&gt;必要があればやる&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;p&gt;これで当該ドメインにアクセスするとメールアドレスの認証が求められる。メールアドレスを入力すると、6桁の一時パスが送られるのでそれを使ってログイン。とても便利。&lt;/p&gt;&#10;&lt;h2 id="応用-dockerでコンテンツサーバを別のインスタンスで起動する"&gt;応用: Dockerでコンテンツサーバを別のインスタンスで起動する&#10;&lt;/h2&gt;&lt;p&gt;Dockerでコンテンツサーバのコンテナを作ることにより、自動的にサーバ起動させるとか、特定の本棚のみ公開するとかも可能だ。なんでわざわざDockerを使うかというと、calibre-serverのインスタンスは同時に複数起動できないためだ。なのでコンテンツサーバ専用のコンテナを作成する感じ。&lt;/p&gt;&#10;&lt;p&gt;これによってGUIのCalibreの起動状況を確認しなくてよくなったり、pdfなどの資料の共有をしたり、共有時にプライベートのあらやだ奥さんみたいな本が間違って目に入るような事故を起こさずにすんだりなど、けっこう便利に使えるのだが、書き始めるとそれだけで記事になってしまうため割愛。気が向いたら記事にする。&lt;/p&gt;&#10;&lt;p&gt;（追記）記事にした。&lt;/p&gt;&#10;&lt;div class="blog-card-wrapper"&gt;&#10; &lt;a href="https://hack-le.com/calibre-docker/" class="blog-card"&gt;&#10; &lt;div class="blog-card-content"&gt;&#10; &lt;div class="blog-card-label"&gt;&#10; &lt;svg xmlns="http://www.w3.org/2000/svg" width="13" height="13" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"&gt;&lt;path d="M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.71"&gt;&lt;/path&gt;&lt;path d="M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71"&gt;&lt;/path&gt;&lt;/svg&gt;&#10; &lt;span&gt;あわせて読みたい&lt;/span&gt;&#10; &lt;/div&gt;&#10; &lt;div class="blog-card-title"&gt;Calibreで特定の本棚を公開するだけのコンテンツサーバをコンテナ化&lt;/div&gt;&#10; &lt;div class="blog-card-url"&gt;/calibre-docker/&lt;/div&gt;&#10; &lt;/div&gt;&#10; &lt;div class="blog-card-thumbnail"&gt;&#10; &lt;img src="https://hack-le.com/images/uploads/2026/09/eyecatch_14315_1789096498.webp" alt="Calibreで特定の本棚を公開するだけのコンテンツサーバをコンテナ化" loading="lazy" /&gt;&#10; &lt;/div&gt;&#10; &lt;/a&gt;&#10;&lt;/div&gt;&#10;&#10;&lt;h2 id="所感-自宅サーバ復活の予感"&gt;所感: 自宅サーバ復活の予感&#10;&lt;/h2&gt;&lt;p&gt;10年くらい前に自宅サーバは浪漫枠みたいな記事を書いた。&lt;/p&gt;&#10;&lt;p&gt;/45948138-2&#10;2015年の記事だと……&lt;/p&gt;&#10;&lt;p&gt;しかし、Cloudflare TunnelとDockerのおかげで、一時は浪漫枠になったかと思われた自宅サーバに復活の機運を感じる。今までネットワークの設定とかインフラのメンテナンスがめんどくさすぎ問題のために、自宅サーバなんかもうやってられませんわという感じだったのだが、Cloudflare Tunnelで極めて楽にネットワークが構築できるようになり、さらにDockerを使えばソフト面の構築・運用も楽々。&lt;/p&gt;&#10;&lt;p&gt;まぁもちろん可用性の確保とかスケーラビリティとか考え出すと自宅サーバはキツいのだが、逆に言うとそこらへん適当でいいなら自宅サーバで全然OK。&lt;/p&gt;&#10;&lt;p&gt;で、こういう大量のデータを扱うコンテンツサーバは自宅サーバ向きの一つ。さらに言うと、最近のクラウドは検閲めいたことも平気でやるので、プライベートなデータを置いておくには不安で仕方ない。垢BAN気にしなくていいのは精神的にだいぶ楽。あと最近はAIが出てきたのもある。グラボも回したりベクトルデータ扱えるElasticsearchみたいなリッチなサーバもほしくなるが、このへんはクラウドでやると余裕で破産できるので、オンプレミスにも価値が出てきた。&lt;/p&gt;&#10;&lt;p&gt;そんなわけで、自宅サーバもアリなんじゃないかと思うようになってきた今日この頃である。&lt;/p&gt;&#10;&lt;h2 id="参考記事"&gt;参考記事&#10;&lt;/h2&gt;&lt;p&gt;ありがとうございました。&lt;/p&gt;&#10;&lt;ul&gt;&#10;&lt;li&gt;&lt;a class="link" href="https://zenn.dev/yakumo/articles/b1f0e1115cb5b6" target="_blank" rel="noopener"&#10; &gt;Cloudflare Tunnelで自宅サーバーを公開する(FreeプランOK)&lt;/a&gt;&lt;/li&gt;&#10;&lt;li&gt;&lt;a class="link" href="https://blog.cloudflare.com/ja-jp/ridiculously-easy-to-use-tunnels-ja-jp/" target="_blank" rel="noopener"&#10; &gt;驚くほど簡単に使えるTunnel&lt;/a&gt;&lt;/li&gt;&#10;&lt;li&gt;&lt;a class="link" href="https://zenn.dev/takajun/articles/fbd783e459c722" target="_blank" rel="noopener"&#10; &gt;Cloudflare Tunnel を使って自宅をデータセンターみたいにする&lt;/a&gt;&lt;/li&gt;&#10;&lt;/ul&gt;&#10;</description></item></channel></rss>