<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>Docker on 或る阿呆の記</title><link>https://hack-le.com/tags/docker/</link><description>Recent content in Docker on 或る阿呆の記</description><generator>Hugo -- gohugo.io</generator><language>ja</language><lastBuildDate>Fri, 23 Oct 2026 21:15:44 +0900</lastBuildDate><atom:link href="https://hack-le.com/tags/docker/index.xml" rel="self" type="application/rss+xml"/><item><title>AIによるサイバー攻撃時代の個人サイト・個人ブログのセキュリティ</title><link>https://hack-le.com/ai-cyber-attack/</link><pubDate>Sat, 24 Oct 2026 00:00:00 +0900</pubDate><guid>https://hack-le.com/ai-cyber-attack/</guid><description>&lt;p&gt;定期的にくる全裸待機イベントがPHPに襲来。&lt;/p&gt;&#10;&lt;p&gt;&lt;a class="link" href="https://www.google.com/preferences/source?q=https://www.itmedia.co.jp" target="_blank" rel="noopener"&#10; &gt;PHPに「緊急」レベルの脆弱性2件 修正版を日本時間21日深夜に公開へ、事前準備を呼び掛け - ITmedia NEWS&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;技術的な詳細が不明なのは仕方無いですが、「とにかくやべぇからPHPユーザは全員23時全裸な！」ということで、こういうことがあると、WordPressユーザとしては限界みを感じます。特に昨今はAIのせいでサイバー攻撃が激化していることもあり、それは自動ですから、場末の当サイトも常にアタックを受けていることを思うと、対策しないわけにもいきません。&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/2026/10/ae95058eacfff45e2ba2c1dfd4feedce-698x208.webp"&gt;&lt;/p&gt;&#10;&lt;p&gt;で、23時前からしばらく落としました。&lt;/p&gt;&#10;&lt;p&gt;それでまぁしばらくは、X上でも様々な人が話題にしていて、少し本当にお祭りのような気分になりテンションも上がりました。&lt;/p&gt;&#10;&lt;p&gt;&lt;a class="link" href="https://www.itmedia.co.jp/news/article/2610/21/2000002472/" target="_blank" rel="noopener"&#10; &gt;著名ITサービス相次いで緊急メンテへ コドモン、シャドバ、BASE、さくらのレンタルサーバなど 「PHP」脆弱性に起因か（1/2 ページ） - ITmedia NEWS&lt;/a&gt;&lt;/p&gt;&#10;&lt;p&gt;当サイトはDocker版のため、大元のPHPの更新から降ってくるまでけっこう時間がかかりました。一人ポチポチと下記コマンドでDocker版の更新はまだかなぁと確認していました。&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;curl -s &lt;span class="s2"&gt;&amp;#34;https://hub.docker.com/v2/repositories/library/wordpress/tags/latest&amp;#34;&lt;/span&gt; &lt;span class="p"&gt;|&lt;/span&gt; grep -o &lt;span class="s1"&gt;&amp;#39;&amp;#34;last_updated&amp;#34;:&amp;#34;[^&amp;#34;]*&amp;#34;&amp;#39;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;これの結果が2026-10-21T14:00より後になったらOKなのですが、結局&lt;code&gt;&amp;quot;last_updated&amp;quot;:&amp;quot;2026-10-21T17:50:57.852281Z&amp;quot;&lt;/code&gt;を確認できたのは夜中の3時くらいだったかな。お、と思ってイメージ更新して、バージョンを確認します。&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;$ docker run --rm wordpress:latest php -v&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;PHP 8.3.36 &lt;span class="o"&gt;(&lt;/span&gt;cli&lt;span class="o"&gt;)&lt;/span&gt; &lt;span class="o"&gt;(&lt;/span&gt;built: Oct &lt;span class="m"&gt;21&lt;/span&gt; &lt;span class="m"&gt;2026&lt;/span&gt; 15:57:18&lt;span class="o"&gt;)&lt;/span&gt; &lt;span class="o"&gt;(&lt;/span&gt;NTS&lt;span class="o"&gt;)&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;OK、ということでサイト復活。この頃になると大方みんな対策が終わっており、Docker版を話題にしている人はほとんどおらず、なにしてるんだろうなぁという気分になっていました。&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/2026/10/a20dfba51fcc24faca752c3396908ed7-697x232.webp"&gt;&lt;/p&gt;&#10;&lt;p&gt;せっかく頑張ったので青帯で頑張りましたの告知を誰に向けたわけでもなくしています。複数サイトやってるので対策は複数やったのですが、このサイトでしか帯は出していません。所詮個人サイト、告知というより祭り参加表明だったので…。場末でも一応今も技術系のサイトのつもりだしね。&lt;/p&gt;&#10;&lt;h2 id="実際の所脅威はどれくらいだったの"&gt;実際の所脅威はどれくらいだったの？&#10;&lt;/h2&gt;&lt;p&gt;終わってみると、かねてより考えてはやめていた脱WordPress計画も現実味を帯びてきます。今回のようなことが今後もけっこうありそうだな、とまず思えました。地味にNode.jsも騒がれていましたしね（「&lt;a class="link" href="https://forest.watch.impress.co.jp/docs/news/2150169.html" target="_blank" rel="noopener"&#10; &gt;「Node.js」にセキュリティ更新 ～10件の脆弱性を修正、「eMudhra」の侵害にも対応 - 窓の杜&lt;/a&gt;」）。&lt;/p&gt;&#10;&lt;p&gt;しかし実際のところ、今回の脅威（後にphp2shellとされる）が本当にどれほどの被害をもたらすものだったのかは謎です。真の影響力について実はちょっと疑っています。CVSSスコア9.2とか数字ばかり独り歩きし、対策しなければサービスにあらずみたいな空気が醸成されても、本当のところどうだったのかはわからないわけでしょう。試みがあったということ自体は既に「&lt;a class="link" href="https://www.itmedia.co.jp/news/article/2610/22/2000002516/" target="_blank" rel="noopener"&#10; &gt;PHP「緊急」脆弱性悪用の試み、数百万件に CloudflareのCEOが報告 - ITmedia NEWS&lt;/a&gt;」のようにニュースになっていますけれど、ではそれでどうかなったのか…。&lt;/p&gt;&#10;&lt;p&gt;この手のものは、何か起きていた時にはもう遅いのだとか、未来の危機を予言した預言者が迫害されるとか、まぁそんな話になるわけですが、しかし今回については、&lt;strong&gt;PHPサイトの有名どころとしてアンサイクロペディアがノーガード戦法だったらしい&lt;/strong&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/2026/10/be247649b0f4f71ec274c138f61f82e2-698x355.webp"&gt;&lt;/p&gt;&#10;&lt;p&gt;&lt;a class="link" href="https://ansaikuropedia.org/wiki/UnNews:PHP%E3%81%AB%E5%8F%B2%E4%B8%8A%E6%9C%80%E6%82%AA%E7%B4%9A%E3%81%AE%E7%A9%B4%E3%80%81%E4%B8%96%E7%95%8C%E3%81%8C%E4%BA%88%E9%98%B2%E5%81%9C%E6%AD%A2%E3%81%99%E3%82%8B%E4%B8%AD%E3%82%A2%E3%83%B3%E3%82%B5%E3%82%A4%E3%82%AF%E3%83%AD%E3%83%9A%E3%83%87%E3%82%A3%E3%82%A2%E3%81%A0%E3%81%91%E6%AD%A2%E3%82%81%E3%82%89%E3%82%8C%E3%82%8B%E4%BA%BA%E3%81%8C%E3%81%8A%E3%82%89%E3%81%9A%E5%B9%B3%E5%B8%B8%E9%81%8B%E8%BB%A2%E3%80%82" target="_blank" rel="noopener"&#10; &gt;UnNews:PHPに史上最悪級の穴、世界が予防停止する中アンサイクロペディアだけ止められる人がおらず平常運転。 - アンサイクロペディア&lt;/a&gt;&lt;/p&gt;&#10;&lt;p&gt;サイト内でもネタにされています。しかしまだやってたんですね。元気そうでなにより。&lt;/p&gt;&#10;&lt;p&gt;ま、&lt;strong&gt;だからといって事前に脅威を告知されればやらないわけにはいかない&lt;/strong&gt;んですが…今回の脅威はOpenAIが検知したとのことでしたけれど、世界中が一斉に全裸待機するほどのものだったのかな…とは少し思います。個人的には見えている脅威はそりゃ対応すべきだと思うんですが、祭り状態になるのも何か違和があります。&lt;/p&gt;&#10;&lt;p&gt;今後こんな感じでAIにより新たな脆弱性発見！深刻度9.3…9.4…100だーーーー！全裸で待て！とか毎日のように言われることになったら、みんなどこまでついていくんだろう。&lt;strong&gt;どうせ侵入されても詫びメール一本で済ます癖に&lt;/strong&gt;…（余計なこと）。今回総理大臣までツイートしていましたが、総理のツイートは脆弱性の報告で埋まるんでしょうか。&lt;/p&gt;&#10;&lt;p&gt;怪しいもんです。対応した中の人はこれが技術的に必要なことだという思いで対応されたかもしれませんが、組織の観点では、やるべきことはやりましたというポージング、免責の観点でコストを払っているように思われます。でなければ、&lt;strong&gt;事前対応は熱心なのに、いざ本当にインシデントが起きたら詫びメール1本で済ませようとする態度&lt;/strong&gt;は説明がつきません…。ま、情報漏洩のエース・タイムズカーはPHPではなかったようですが（永遠に言い続ける）。&lt;/p&gt;&#10;&lt;h2 id="クラウドなら安心伝説"&gt;クラウドなら安心伝説&#10;&lt;/h2&gt;&lt;p&gt;まぁそうはいっても、現実上のセキュリティリスクは確かに上がっているのでしょう。&lt;strong&gt;求められるセキュリティパッチの適用であるとか、対策なんかは、これから目に見えて高まっていくのかなぁ&lt;/strong&gt;、という感じはしています。&lt;/p&gt;&#10;&lt;p&gt;これについて、中小まして個人が防ぎ切るのはもう無理だ、クラウドに任せよう！みたいな論調も最近はちらほら見かけるのですが、大手クラウドなら信用できるのか？と思います。実際、最近俺たちのGMOがやられました。&lt;/p&gt;&#10;&lt;p&gt;&lt;a class="link" href="https://www.itmedia.co.jp/news/article/2610/21/2000002442/" target="_blank" rel="noopener"&#10; &gt;「お名前.com デスクトップクラウド」不正プログラム設置で全プラン停止 FX用VPS、2万6739サーバに影響か - ITmedia NEWS&lt;/a&gt;&lt;/p&gt;&#10;&lt;p&gt;これは記事だと実際どこまで基盤に侵入されたのかわからないんですが、&lt;strong&gt;不正にプログラム設置されてる&lt;/strong&gt;んですよね。少なくともそこにおいては実行権限まで取られている中で、本当にGMOの言う通り情報閲覧があるかも程度の被害なのかな…僕がユーザだったらちょっと信じられないですけどね。まぁ実際被害者は滅茶苦茶可哀想ですよ、FX自動取引の基盤でしょう。つらすぎる（実感）。&lt;/p&gt;&#10;&lt;p&gt;……とか書いて予約投稿していたんですが、Xを見ていたら次の展開が。&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/2026/10/image-2-699x833.png"&gt;&lt;/p&gt;&#10;&lt;p&gt;&lt;em&gt;&lt;a class="link" href="https://x.com/yutoriineet/status/2113264833307267254?s=20" target="_blank" rel="noopener"&#10; &gt;https://x.com/yutoriineet/status/2113264833307267254?s=20&lt;/a&gt;&lt;/em&gt;&lt;/p&gt;&#10;&lt;p&gt;口座破綻させられているのあまりにも悲惨で可哀想過ぎる。ご愁傷さまです……。これマジで洒落にならない金額の被害が出ているのでは。やっぱり情報閲覧程度じゃなかったのか。攻撃されたといえば企業は被害者だが、&lt;strong&gt;本当の被害者は企業を信じて情報を預けたのに漏洩されたユーザで、企業はその被害を隠蔽と過小申告するモチベがある&lt;/strong&gt;から信じられない。&lt;strong&gt;報道する側も企業側の言うことをそのまんま垂れ流すだけじゃダメ&lt;/strong&gt;だし、&lt;strong&gt;見る側ももっと疑う必要がある&lt;/strong&gt;。……と言い始めるとちょっと話が完全に逸れるので、本件滅茶苦茶興味深いけどここまでにしておいて…。&lt;/p&gt;&#10;&lt;p&gt;まぁこういう投資にかかるサービスで、クラウドを銘打ったサービスで、GMOがやられた、というのはこれは重たいんじゃないでしょうか（GMOだけど）。いや、ここでいうクラウドとはAWS/GCP/Azure/OCIとかそのへんのことを言うのだ、&lt;strong&gt;AWSにあらずんばクラウドにあらず&lt;/strong&gt;みたいなことは言えるかもしれないし、実際信用レベルでいえばまだかなり差があるのはそうなんですけれど、しかしAWSだから大丈夫だ、は原理原則の話をするならやはりあり得ず、それは&lt;strong&gt;技術的判断というより信仰&lt;/strong&gt;というべきではないでしょうか。&lt;/p&gt;&#10;&lt;p&gt;一方でAWSがやられたらもう仕方ない、は現実的な妥協点として言えるかもしれません。もしかしたらそういう気持ちは業界としてあるのかなぁという気もするし、正直私も組織のエンジニアの立場ならそう言ってしまう気はします。ただ一人の場末の管理者として考えた時、それはすごく納得できません。&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;p&gt;まぁイメージとしては高い壁に囲まれたデカくて整った街にレンタルオフィスを構えるか、孤島に手作りの拠点を構えるのかという違いになるわけですけれど、&lt;strong&gt;AIがあろうがなかろうが、リスクのトレードオフの本質が変わらない以上、どちらが間違っているとも言えない&lt;/strong&gt;んじゃないでしょうか。少なくとも私は討ち死にするならせめて自分の居場所で死にたい。&lt;/p&gt;&#10;&lt;p&gt;まぁそうは言っても、自動攻撃も今後激しくなっていくことは予想され、無駄にアタックサーフェスが多いことから、WordPressはちょっと限界を感じています。そろそろ10年ぶりくらいのサイト大改造に着手する時がきたのだろうか…。&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/timescar/" 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;タイムズカー情報漏洩被弾しました＼(^o^)／前代未聞の運転免許証シェアリングサービスここに爆誕！！&lt;/div&gt;&#10; &lt;div class="blog-card-url"&gt;/timescar/&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/10/eyecatch_53293_1790784350.webp" alt="タイムズカー情報漏洩被弾しました＼(^o^)／前代未聞の運転免許証シェアリングサービスここに爆誕！！" 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/timescar-yakinikuking/" 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;/timescar-yakinikuking/&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/10/eyecatch_53550_1791737979.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/securityrisk/" 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;セキュリティリスク再考 KADOKAWAの情報漏洩レベルでも特損36億円らしい&lt;/div&gt;&#10; &lt;div class="blog-card-url"&gt;/securityrisk/&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_15193_1789095846.webp" alt="セキュリティリスク再考 KADOKAWAの情報漏洩レベルでも特損36億円らしい" loading="lazy" /&gt;&#10; &lt;/div&gt;&#10; &lt;/a&gt;&#10;&lt;/div&gt;&#10;&#10;</description></item><item><title>WordPress が Web サーバーにアクセスする必要があります。 次に進むには FTP の認証情報を入力してください（大嘘）</title><link>https://hack-le.com/wordpress-web-ftp/</link><pubDate>Sun, 04 Oct 2026 00:00:00 +0900</pubDate><guid>https://hack-le.com/wordpress-web-ftp/</guid><description>&lt;p&gt;早くWordPressを更新しろ！間に合わなくなっても知らんぞーーー！！って脅してくるから更新しようとしたら&lt;/p&gt;&#10;&#10; &lt;blockquote&gt;&#10; &lt;p&gt;要求されたアクションを実行するには、WordPress が Web サーバーにアクセスする必要があります。 次に進むには FTP の認証情報を入力してください。 認証情報が思い出せない場合は、ホスティング担当者に問い合わせてください。&lt;/p&gt;&#10;&#10; &lt;/blockquote&gt;&#10;&lt;p&gt;などと意味不明な供述をしてきたときの対応。多分DockerでWordPress使っている時によく出てくる、と思われる。大昔ネイティブで運用していた頃には見たことなかった気がする。&lt;/p&gt;&#10;&lt;p&gt;次に進むには FTP の認証情報を入力してください。（大嘘）だし、そもそもホスティング担当者（私）なので、例によって全然違う対応をする必要があります。&lt;/p&gt;&#10;&lt;h2 id="環境"&gt;環境&#10;&lt;/h2&gt;&lt;p&gt;Docker版だよ。&lt;/p&gt;&#10;&lt;ul&gt;&#10;&lt;li&gt;Linux Mint Xfce 22.3&lt;/li&gt;&#10;&lt;li&gt;Docker version 29.8.1, build 4a63305&#10;&lt;ul&gt;&#10;&lt;li&gt;WordPress 7.1 -&amp;gt; 7.12&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;h2 id="原因"&gt;原因&#10;&lt;/h2&gt;&lt;p&gt;Webサーバドキュメントルートの&lt;code&gt;/var/www/html&lt;/code&gt;の権限問題が発生していると思われます。なんで発生しているのかは知らん。なぜなの？&lt;/p&gt;&#10;&lt;h2 id="コンテナ内でのパーミッション修復手順"&gt;コンテナ内でのパーミッション修復手順&#10;&lt;/h2&gt;&lt;p&gt;&lt;code&gt;docker-compose.yml&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;docker compose &lt;span class="nb"&gt;exec&lt;/span&gt; wordpress bash&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;違ったら&lt;code&gt;docker compose ps&lt;/code&gt;でSERVICE列を確認します。&lt;/p&gt;&#10;&lt;p&gt;&lt;code&gt;/var/www/html&lt;/code&gt;にいる状態から始まります。で、&lt;code&gt;ls -ld&lt;/code&gt;すると所有権が&lt;code&gt;root&lt;/code&gt;になっていました。&lt;/p&gt;&#10;&lt;p&gt;以下のコマンドを実行して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;chown -R www-data:www-data /var/www/html&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;実行後、Web画面から再度更新を実行して、通ればOK。&lt;/p&gt;&#10;&lt;h2 id="エラーメッセージは永遠に"&gt;エラーメッセージは永遠に&#10;&lt;/h2&gt;&lt;p&gt;どうでもいいんですけど、IT関係のエラーメッセージの不親切さは永遠なんでしょうかね。あまりにも意味不明過ぎて逆に検索適応性が高いという謎の事象も発生。AI革命だのAIでもう知識労働は不要だのAIで人類絶滅だのなんかセンセーショナルな記事ばかり出てきますが、結局わからないのはAIツールの吐き出す謎のエラーメッセージ、そして何よりエラーの原因であったりします。&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/2026/10/f977b4dfd34f035cec1e79800272b8cf.webp"&gt;&lt;/p&gt;&#10;&lt;p&gt;&lt;em&gt;GoogleのAIコーディングツール、Antigravityでよく見るエラーメッセージ&lt;/em&gt;&lt;/p&gt;&#10;&lt;p&gt;あの日見たエラーメッセージがなんだったのか僕たちは永遠に知らない…。&lt;/p&gt;&#10;</description></item><item><title>セルフホストしたUmamiでWordPressサイトのアクセス解析</title><link>https://hack-le.com/umami-wordpress/</link><pubDate>Fri, 21 Aug 2026 00:00:00 +0900</pubDate><guid>https://hack-le.com/umami-wordpress/</guid><description>&lt;p&gt;Google Analytics代替として候補にあがる、セルフホストのアクセス解析ソフトUmamiを使っていく。&lt;/p&gt;&#10;&lt;p&gt;&lt;a class="link" href="https://github.com/umami-software/umami" target="_blank" rel="noopener"&#10; &gt;GitHub - umami-software/umami: Umami is a privacy-first analytics platform. Traffic, campaigns, behavior, conversions, and revenue in one place — no cookies, no tracking, self-hosted or in the cloud. · GitHub&lt;/a&gt;&lt;/p&gt;&#10;&lt;p&gt;なお公式サイトはisドメインなんだけれど、なぜか弾かれる。Cloudflare経由で接続するといけるのでおまかんっぽいんだがアイスランドに嫌われるようなことしたっけ？&lt;/p&gt;&#10;&lt;p&gt;まぁそれはいいとして、今回インストールでは「&lt;a class="link" href="https://www.bitdoze.com/umami-analytics-install/" target="_blank" rel="noopener"&#10; &gt;How to Install Umami Analytics on Docker (2026 Guide)&lt;/a&gt;」の記事を参考にさせていただきました、っていうか正直うちの記事よりこの記事のほうが詳しいからこっち見たほうがいいよｗ&lt;/p&gt;&#10;&lt;p&gt;じゃあなんで書くのかというと、記事は消えるから……。10年以上もブログやっていると「この記事が詳しいです！」で雑に案内だけ貼ったリンクが消える消える。まぁ微妙に情報補足と雑なWordPress案内も追加したので…。&lt;/p&gt;&#10;&lt;h2 id="環境"&gt;環境&#10;&lt;/h2&gt;&lt;ul&gt;&#10;&lt;li&gt;&lt;a class="link" href="mailto:Umami@3.2.0" &gt;Umami@3.2.0&lt;/a&gt;&lt;/li&gt;&#10;&lt;li&gt;自宅サーバ&#10;&lt;ul&gt;&#10;&lt;li&gt;ThinkPad L390, Core i5-8265U, 32GB RAM&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;/li&gt;&#10;&lt;li&gt;Linux Mint Xfce 22.3&#10;&lt;ul&gt;&#10;&lt;li&gt;docker 29.7.2&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;/li&gt;&#10;&lt;li&gt;Cloudflare Tunnel&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;h2 id="インストールと最初の設定"&gt;インストールと最初の設定&#10;&lt;/h2&gt;&lt;h3 id="docker-composeyml"&gt;&lt;code&gt;docker-compose.yml&lt;/code&gt;&#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-javascript" data-lang="javascript"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nx"&gt;openssl&lt;/span&gt; &lt;span class="nx"&gt;rand&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="nx"&gt;hex&lt;/span&gt; &lt;span class="mi"&gt;32&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;code&gt;.env&lt;/code&gt;を作成する。以下の&lt;code&gt;APP_SECRET&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;&lt;span class="nv"&gt;POSTGRES_USER&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;umami&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nv"&gt;POSTGRES_PASSWORD&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;your-secure-password&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nv"&gt;POSTGRES_DB&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;umami&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nv"&gt;APP_SECRET&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;run-openssl-rand-hex-32-to-generate&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nv"&gt;DISABLE_TELEMETRY&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="m"&gt;1&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;docker-compose.yml&lt;/code&gt;を編集。元記事からimageのURLだけ差し替えた（エラー出たので）。ポート番号は変えたかったら変える。バージョン固定したかったらする。ちなみにvつかないらしい（v3.2.0ではなく3.2.0）。&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;services:&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; umami:&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; image: umamisoftware/umami:postgresql-latest&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; ports:&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; - &lt;span class="s2"&gt;&amp;#34;3000:3000&amp;#34;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; environment:&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; DATABASE_URL: postgresql://&lt;span class="si"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;POSTGRES_USER&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;:&lt;span class="si"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;POSTGRES_PASSWORD&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;@umami-db:5432/&lt;span class="si"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;POSTGRES_DB&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; APP_SECRET: &lt;span class="si"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;APP_SECRET&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; DISABLE_TELEMETRY: &lt;span class="si"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;DISABLE_TELEMETRY&lt;/span&gt;&lt;span class="k"&gt;:-&lt;/span&gt;&lt;span class="nv"&gt;1&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; depends_on:&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; umami-db:&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; condition: service_healthy&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; init: &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; restart: always&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; healthcheck:&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; test: &lt;span class="o"&gt;[&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;CMD-SHELL&amp;#34;&lt;/span&gt;, &lt;span class="s2"&gt;&amp;#34;curl http://localhost:3000/api/heartbeat&amp;#34;&lt;/span&gt;&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; interval: 5s&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; timeout: 5s&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; retries: &lt;span class="m"&gt;5&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; umami-db:&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; image: postgres:15-alpine&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; environment:&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; POSTGRES_DB: &lt;span class="si"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;POSTGRES_DB&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; POSTGRES_USER: &lt;span class="si"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;POSTGRES_USER&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; POSTGRES_PASSWORD: &lt;span class="si"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;POSTGRES_PASSWORD&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; TZ: UTC&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; volumes:&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; - ./umami-db-data:/var/lib/postgresql/data&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; restart: always&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; healthcheck:&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; test: &lt;span class="o"&gt;[&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;CMD-SHELL&amp;#34;&lt;/span&gt;, &lt;span class="s2"&gt;&amp;#34;pg_isready -U &lt;/span&gt;&lt;span class="nv"&gt;$$&lt;/span&gt;&lt;span class="s2"&gt;{POSTGRES_USER} -d &lt;/span&gt;&lt;span class="nv"&gt;$$&lt;/span&gt;&lt;span class="s2"&gt;{POSTGRES_DB}&amp;#34;&lt;/span&gt;&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; interval: 5s&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; timeout: 5s&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; retries: &lt;span class="m"&gt;5&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;ここで、参考記事によると、Cloudflare Tunnelを使っている場合、Umamiから見ると全部CloudflareのIPを取ってしまうので、&lt;code&gt;docker-compose.yml&lt;/code&gt;の&lt;code&gt;environment&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;CLIENT_IP_HEADER: cf-connecting-ip&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;VPSとかで直接公開してCaddyをリバースプロキシにしている場合はヘッダの付与よしなにしているから不要なはず。&lt;/p&gt;&#10;&lt;p&gt;準備が出来たら、&lt;code&gt;docker compose up&lt;/code&gt;でエラーが出ないことを確認する。いけたら&lt;code&gt;docker compose up -d&lt;/code&gt;でバックグラウンド起動。&lt;/p&gt;&#10;&lt;h3 id="最初の設定"&gt;最初の設定&#10;&lt;/h3&gt;&lt;p&gt;&lt;code&gt;http://&amp;lt;IPアドレス&amp;gt;:&amp;lt;ポート&amp;gt;&lt;/code&gt;にアクセスして、ユーザ名&lt;code&gt;admin&lt;/code&gt;とパスワード&lt;code&gt;umami&lt;/code&gt;でログイン。&lt;/p&gt;&#10;&lt;p&gt;当然危ないので、管理者設定からパスワードを変更する。ユーザ名も変更できる。&lt;/p&gt;&#10;&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;全体の流れは以下 by AI。&lt;/p&gt;&#10;&lt;pre class="mermaid" style="visibility:hidden"&gt;sequenceDiagram&#10;autonumber&#10;actor Client as クライアント&#10;participant WP as WPサーバー(ブログサイト)&#10;participant Umami as Umamiサーバー(セルフホスト)&#10;Note over Client, Umami: 1. ブログページの読み込み&#10;Client-&gt;&gt;WP: ① ページリクエスト (アクセス)&#10;WP--&gt;&gt;Client: ② HTML返却 (Umamiのscriptタグを含む)&#10;Note over Client, Umami: 2. アクセス解析データの送信 (クライアント直接)&#10;Client-&gt;&gt;Umami: ③ script.jsの読み込みリクエスト&#10;Umami--&gt;&gt;Client: ④ script.jsの返却&#10;Client-&gt;&gt;Umami: ⑤ 閲覧データ(PV等)を直接送信 [要グローバル公開]&lt;/pre&gt;&lt;p&gt;うちの場合は例によってCloudflare Tunnelで開通している。&lt;/p&gt;&#10;&lt;p&gt;ここでサブドメインだが、参考記事によると&lt;code&gt;analytics&lt;/code&gt;とか使うと広告ブロッカーに遮断される率が上がるらしい。参考記事では&lt;code&gt;stats&lt;/code&gt;や&lt;code&gt;metrics&lt;/code&gt;や&lt;code&gt;track&lt;/code&gt;などにせよと言われている。&lt;/p&gt;&#10;&lt;h2 id="wordpressサイトの解析"&gt;WordPressサイトの解析&#10;&lt;/h2&gt;&lt;p&gt;別にWordPressサイトじゃなくてもやることは同じ。&lt;/p&gt;&#10;&lt;h3 id="トラッキングコードの取得"&gt;トラッキングコードの取得&#10;&lt;/h3&gt;&lt;p&gt;サイドバーの「Webサイト」より、管理したいドメインを追加する。&lt;/p&gt;&#10;&lt;p&gt;追加したら、Editを開くと以下のようなトラッキングコードが取得できる。&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="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nx"&gt;script&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;defer&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;src&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;https://your-umami-domain.com/script.js&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="nx"&gt;data&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="nx"&gt;website&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="nx"&gt;id&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx&amp;#34;&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="err"&gt;/script&amp;gt;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;基本はこれを&amp;lt;head&amp;gt;タグに貼り付けること。&lt;/p&gt;&#10;&lt;h3 id="タグの貼り付け"&gt;タグの貼り付け&#10;&lt;/h3&gt;&lt;p&gt;プラグイン「Integrate Umami」があるが、&amp;lt;head&amp;gt;タグに貼り付けるだけなのでプラグイン使う必要はないかなと思う。&lt;/p&gt;&#10;&lt;p&gt;うちはテーマとしてSwellを使っているので、「外観」「カスタマイズ」「高度な設定」から「headタグ終了直前に出力するコード」にコードを貼り付け。&lt;/p&gt;&#10;&lt;p&gt;自分だけ除外とかするなら &lt;code&gt;functions.php&lt;/code&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/2026/08/image-700x380.png"&gt;&lt;/p&gt;&#10;&lt;p&gt;まぁなんか動いてそう。使い方についてはおいおい見ていこうと思う。&lt;/p&gt;&#10;&lt;p&gt;以上。ちなみに最初AIに聞いて作業していたんだが、古いバージョンの情報に惑わされて完全に無能だった。&lt;/p&gt;&#10;</description></item><item><title>セルフホストしたWebアプリになぜかうまくアクセスできない時のチェック</title><link>https://hack-le.com/selfhost-webapps-down/</link><pubDate>Mon, 10 Aug 2026 00:00:59 +0900</pubDate><guid>https://hack-le.com/selfhost-webapps-down/</guid><description>&lt;p&gt;私的メモ。そりゃそうだ集。症状は様々なので症状から逆引きというより流し読みして心当たりあるやつを思い出す集。構成が複雑になるほど、「端末Aでは症状A&amp;rsquo;になるが端末Bでは症状B&amp;rsquo;になる」など発生する。がんばれ。&lt;/p&gt;&#10;&lt;h2 id="環境"&gt;環境&#10;&lt;/h2&gt;&lt;p&gt;Linuxが基本。メインはLinux Mint Xfce。&lt;/p&gt;&#10;&lt;h2 id="一般"&gt;一般&#10;&lt;/h2&gt;&lt;h3 id="localhost以外からのアクセスを許可してない"&gt;localhost以外からのアクセスを許可してない&#10;&lt;/h3&gt;&lt;p&gt;症状: ローカル端末からはアクセスできるし正常に起動しているが、他端末からアクセスできない。&lt;/p&gt;&#10;&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;/p&gt;&#10;&lt;p&gt;ファイアウォールの設定確認する。&lt;code&gt;ufw&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;sudo ufw status&#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;sudo ufw allow &amp;lt;ポート番号&amp;gt;&#10;&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;AWSをはじめとするクラウドとかVPSで、そもそもネットワークインタフェースに到達していないケース。許可しよう。&lt;/p&gt;&#10;&lt;h3 id="ポートの競合"&gt;ポートの競合&#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-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;sudo lsof -i :8080&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id="adguardhomeaghとかlan内dnsを使っている場合"&gt;AdGuardHome(AGH)とかLAN内DNSを使っている場合&#10;&lt;/h2&gt;&lt;h3 id="lan内dnsに向いてない"&gt;LAN内DNSに向いてない&#10;&lt;/h3&gt;&lt;p&gt;症状: LAN内ドメインだけ名前解決できない&lt;/p&gt;&#10;&lt;p&gt;そもそも論としてLAN内DNSに向いてない。ルータでDNSをLAN内のやつ指定するか、あるいは各クライアントでそれぞれ設定するか。&lt;/p&gt;&#10;&lt;h3 id="agh側でdns書き換え設定を忘れている"&gt;AGH側でDNS書き換え設定を忘れている&#10;&lt;/h3&gt;&lt;p&gt;症状: LAN内ドメインだけ名前解決できない&lt;/p&gt;&#10;&lt;p&gt;稀によくある。設定しよう。&lt;/p&gt;&#10;&lt;p&gt;サブドメインの法則決めてワイルドカード使うのが楽ではある（ワイルドカードを使えばサブドメインの証明書発行を知られないというのもある。まぁサブドメイン知られたところで別にLAN内限定公開なら問題ないかもしれないが気持ち悪いので…）。&lt;/p&gt;&#10;&lt;h3 id="ipv6が優先されている"&gt;IPv6が優先されている&#10;&lt;/h3&gt;&lt;p&gt;症状: 名前解決できない。端末によってはできることもある。&lt;/p&gt;&#10;&lt;p&gt;AdGuardHomeで頑張ってIPv6対応するか、ルータで切れるならIPv6切るか、あるいはクライアントでIPv6を切るか。クライアントで切る場合は対応はOSによって異なる。Macは基本的にDNSサーバをIPv4で設定すればいけると思うのだが、Windows/Linuxは明示的にやる必要あり。Androidはアプリ使う必要がある。自分はRethinkDNSを使っている。iOSは持ってないから知らない。&lt;/p&gt;&#10;&lt;p&gt;このとおり、OSによって状況が異なるため「端末AではいけるけどBではいけない」ということが起きうる。さらに同じOSでも設定してたりしてなかったりすると、それでも異なる症状になったりする。めんどくさい。&lt;/p&gt;&#10;&lt;div class="blog-card-wrapper"&gt;&#10; &lt;a href="https://hack-le.com/landnsipv6windowsipv6/" 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;LAN内DNSでIPv6は使わないのでWindowsでIPv6を無効化する&lt;/div&gt;&#10; &lt;div class="blog-card-url"&gt;/landnsipv6windowsipv6/&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/07/eyecatch_50770_1785034008.webp" alt="LAN内DNSでIPv6は使わないのでWindowsでIPv6を無効化する" 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/android-lan-agh-dns/" 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;AndroidでLAN内DNS(AdGuard Home)にIPv4アドレスでアクセスする&lt;/div&gt;&#10; &lt;div class="blog-card-url"&gt;/android-lan-agh-dns/&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_50782_1786019566.webp" alt="AndroidでLAN内DNS(AdGuard Home)にIPv4アドレスでアクセスする" loading="lazy" /&gt;&#10; &lt;/div&gt;&#10; &lt;/a&gt;&#10;&lt;/div&gt;&#10;&#10;&lt;h2 id="caddyを使っている時"&gt;Caddyを使っている時&#10;&lt;/h2&gt;&lt;p&gt;AGH + Caddyまで持っていくとだいぶ捗るけど構築は面倒くさい。DNS-01チャレンジを利用しているとエラーパターンが増える。&lt;/p&gt;&#10;&lt;h3 id="caddyfileの設定を忘れている間違えている"&gt;Caddyfileの設定を忘れている、間違えている&#10;&lt;/h3&gt;&lt;p&gt;稀によくある。設定しよう。ドメインの前にスペース空いてないとかよくある &lt;code&gt;examp.com{&lt;/code&gt;。&lt;code&gt;caddy validate&lt;/code&gt;と&lt;code&gt;caddy fmt --overwrite&lt;/code&gt;しよう。Docker版ならサービス名caddyの時&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;docker compose &lt;span class="nb"&gt;exec&lt;/span&gt; caddy caddy validate --config /etc/caddy/Caddyfile&#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;docker compose &lt;span class="nb"&gt;exec&lt;/span&gt; caddy caddy fmt --overwrite /etc/caddy/Caddyfile&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h3 id="caddyfileの設定を読み込むのを忘れている"&gt;Caddyfileの設定を読み込むのを忘れている&#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;caddy reload&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Docker版&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;docker compose &lt;span class="nb"&gt;exec&lt;/span&gt; caddy caddy reload --config /etc/caddy/Caddyfile&#10;&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;/p&gt;&#10;&lt;p&gt;自己証明書以外のとき。ログを見て判断。利用しているレジストラに対応したCaddyを使っているか確認。あとAPIの権限を確認。&lt;/p&gt;&#10;&lt;h3 id="証明書を発行していない"&gt;証明書を発行していない&#10;&lt;/h3&gt;&lt;p&gt;症状: 証明書エラー&lt;/p&gt;&#10;&lt;p&gt;Docker版で &lt;code&gt;docker compose up -d&lt;/code&gt;リロード代わりにした場合、証明書が発行されないまま。&lt;code&gt;docker compose down&lt;/code&gt;してから起動し直す。&lt;/p&gt;&#10;&lt;h3 id="docker利用時-バインドマウントを忘れている"&gt;(Docker利用時) バインドマウントを忘れている&#10;&lt;/h3&gt;&lt;p&gt;症状: 404エラーがでる&lt;/p&gt;&#10;&lt;p&gt;Docker版Caddyを使っている時。ホストマシンのディレクトリをそのまんまfile_serverとか使ってホスティングする場合、バインドマウントしないと当然見えない。&lt;/p&gt;&#10;&lt;h2 id="tailscaleを使っている場合"&gt;Tailscaleを使っている場合&#10;&lt;/h2&gt;&lt;p&gt;最近使ってないけど、使っていたときはややこしかった。特にAGH、Caddyと併用するとカオス。&lt;/p&gt;&#10;&lt;h3 id="magicdnsがうまく機能しない"&gt;MagicDNSがうまく機能しない&#10;&lt;/h3&gt;&lt;p&gt;Tailscaleから付与されるIPアドレスを直打ちするほうが無難。&lt;/p&gt;&#10;&lt;h3 id="aghと一緒に使う"&gt;AGHと一緒に使う&#10;&lt;/h3&gt;&lt;p&gt;TailscaleのDNSをAGHに向けること。&lt;/p&gt;&#10;&lt;p&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/splitdns/" 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;自宅内のアプリに、同一のドメインで、LAN内とインターネットの外からの両方に対応する（スプリットDNS）構成編&lt;/div&gt;&#10; &lt;div class="blog-card-url"&gt;/splitdns/&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/04/eyecatch_49425_1776895341.webp" alt="自宅内のアプリに、同一のドメインで、LAN内とインターネットの外からの両方に対応する（スプリットDNS）構成編" loading="lazy" /&gt;&#10; &lt;/div&gt;&#10; &lt;/a&gt;&#10;&lt;/div&gt;&#10;&#10;&lt;h2 id="cloudflare-tunnelとか使っている場合"&gt;Cloudflare Tunnelとか使っている場合&#10;&lt;/h2&gt;&lt;h3 id="トンネルが落ちている接続されていない間違えている"&gt;トンネルが落ちている、接続されていない、間違えている&#10;&lt;/h3&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;Docker版とネイティブ版両方動かしていたりとか、よくわからないことをすると起きる。&lt;/p&gt;&#10;</description></item><item><title>WordPress(Docker)をコンテナとボリュームごと別マシンに移行するスクリプト</title><link>https://hack-le.com/wordpressdocker-script/</link><pubDate>Sun, 14 Jun 2026 15:37:33 +0900</pubDate><guid>https://hack-le.com/wordpressdocker-script/</guid><description>&lt;p&gt;以下の記事の自動化スクリプト。&lt;/p&gt;&#10;&lt;div class="blog-card-wrapper"&gt;&#10; &lt;a href="https://hack-le.com/container-wp/" 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;コンテナ構築のWordPressサイトを別マシンに移行する&lt;/div&gt;&#10; &lt;div class="blog-card-url"&gt;/container-wp/&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/05/eyecatch_50016_1779164478.webp" alt="コンテナ構築のWordPressサイトを別マシンに移行する" 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;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;やらないこと&#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;strong&gt;バックアップ中はダウンタイムとなるので注意&lt;/strong&gt;。&lt;/p&gt;&#10;&lt;pre class="mermaid" style="visibility:hidden"&gt;flowchart TD&#10;subgraph Local["ローカルマシン (移行元)"]&#10;direction TB&#10;A[YAMLからボリューム一覧を取得] --&gt; B[移行対象のボリュームを選択]&#10;B --&gt; C[元マシンのコンテナ停止]&#10;C --&gt; D[選択ボリュームのバックアップvackup export]&#10;D --&gt; E[元マシンのコンテナ再開ダウンタイム短縮]&#10;E --&gt; F[設定ファイル一式とバックアップを転送rsync]&#10;end&#10;subgraph Remote["リモートマシン (移行先) SSH経由で自動実行"]&#10;direction TB&#10;G[作業ディレクトリに移動]&#10;H[ボリュームのリストアvackup import]&#10;I[ネスト構造の解消vackup-volumeを直下へ移動]&#10;J[移行先コンテナ起動docker compose up -d]&#10;K[リモートの一時バックアップ削除]&#10;end&#10;F --&gt;|ネットワーク転送| G&#10;G --&gt; H&#10;H -.各ボリュームごとにループ.-&gt; I&#10;I --&gt; J&#10;J --&gt; K&#10;subgraph Local_Cleanup["ローカルマシン (完了後)"]&#10;L[ローカルの一時バックアップ削除]&#10;end&#10;K --&gt;|処理完了| L&lt;/pre&gt;&lt;h2 id="準備"&gt;準備&#10;&lt;/h2&gt;&lt;ul&gt;&#10;&lt;li&gt;移行元から移行先に、sshで転送できるようにしておく。&#10;&lt;ul&gt;&#10;&lt;li&gt;移行元はLAN内のマシンで、移行先はVPSとする。&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;/li&gt;&#10;&lt;li&gt;移行元と移行先に&lt;code&gt;docker&lt;/code&gt;と&lt;code&gt;docker compose&lt;/code&gt;と&lt;code&gt;vackup&lt;/code&gt;を入れる。&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;p&gt;vackupについては以下。&lt;/p&gt;&#10;&lt;div class="blog-card-wrapper"&gt;&#10; &lt;a href="https://hack-le.com/docker-volume-cli-backup/" 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のボリュームをCLIでバックアップ・復元する&lt;/div&gt;&#10; &lt;div class="blog-card-url"&gt;/docker-volume-cli-backup/&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/2024/09/docker-volume-cli-backup.webp" alt="DockerのボリュームをCLIでバックアップ・復元する" loading="lazy" /&gt;&#10; &lt;/div&gt;&#10; &lt;/a&gt;&#10;&lt;/div&gt;&#10;&#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;.&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;├── site1&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;│   ├── custom-php.ini&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;│   └── docker-compose.yml&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;├── site2&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;│   ├── ads.txt&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;│   ├── custom-php.ini&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;│   └── docker-compose.yml&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;└── migrate-wp.sh&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;上記のディレクトリ構成で、&lt;code&gt;migrate-wp.sh&lt;/code&gt;を実行すると、転送先のマシンにコンテナの設定とボリュームごともってく。ディレクトリごともっていくので、見えていないが&lt;code&gt;.env&lt;/code&gt;も含む。&lt;/p&gt;&#10;&lt;h2 id="スクリプトと実行"&gt;スクリプトと実行&#10;&lt;/h2&gt;&lt;p&gt;スクリプトは以下。AIが書いた。&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="cp"&gt;#!/bin/bash&#10;&lt;/span&gt;&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="nb"&gt;set&lt;/span&gt; -e&#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="k"&gt;if&lt;/span&gt; &lt;span class="o"&gt;[&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;&lt;/span&gt;&lt;span class="nv"&gt;$#&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;&lt;/span&gt; -ne &lt;span class="m"&gt;3&lt;/span&gt; &lt;span class="o"&gt;]&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="k"&gt;then&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;echo&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;Usage: &lt;/span&gt;&lt;span class="nv"&gt;$0&lt;/span&gt;&lt;span class="s2"&gt; &amp;lt;dir_name&amp;gt; &amp;lt;user@ip&amp;gt; &amp;lt;remote_base_path&amp;gt;&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="nb"&gt;echo&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;Example: &lt;/span&gt;&lt;span class="nv"&gt;$0&lt;/span&gt;&lt;span class="s2"&gt; site1 user@192.168.1.50 /home/user/wordpress&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="nb"&gt;exit&lt;/span&gt; &lt;span class="m"&gt;1&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;fi&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="nv"&gt;DIR_NAME&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="nv"&gt;$1&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;REMOTE_TARGET&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="nv"&gt;$2&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;REMOTE_BASE_PATH&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="nv"&gt;$3&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="nv"&gt;LOCAL_DIR&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;./&lt;/span&gt;&lt;span class="nv"&gt;$DIR_NAME&lt;/span&gt;&lt;span class="s2"&gt;&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="nv"&gt;REMOTE_DIR&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;&lt;/span&gt;&lt;span class="nv"&gt;$REMOTE_BASE_PATH&lt;/span&gt;&lt;span class="s2"&gt;/&lt;/span&gt;&lt;span class="nv"&gt;$DIR_NAME&lt;/span&gt;&lt;span class="s2"&gt;&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="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="k"&gt;if&lt;/span&gt; &lt;span class="o"&gt;[&lt;/span&gt; ! -d &lt;span class="s2"&gt;&amp;#34;&lt;/span&gt;&lt;span class="nv"&gt;$LOCAL_DIR&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;&lt;/span&gt; &lt;span class="o"&gt;]&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="k"&gt;then&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;echo&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;Error: Local directory &amp;#39;&lt;/span&gt;&lt;span class="nv"&gt;$LOCAL_DIR&lt;/span&gt;&lt;span class="s2"&gt;&amp;#39; does not exist.&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="nb"&gt;exit&lt;/span&gt; &lt;span class="m"&gt;1&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;fi&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="nb"&gt;echo&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;=== 1. ボリューム名の取得 ===&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="nb"&gt;cd&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;&lt;/span&gt;&lt;span class="nv"&gt;$LOCAL_DIR&lt;/span&gt;&lt;span class="s2"&gt;&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="c1"&gt;# docker compose config を使ってボリューム名一覧を取得&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;VOLUMES&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="k"&gt;$(&lt;/span&gt;docker compose config --volumes&lt;span class="k"&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="k"&gt;if&lt;/span&gt; &lt;span class="o"&gt;[&lt;/span&gt; -z &lt;span class="s2"&gt;&amp;#34;&lt;/span&gt;&lt;span class="nv"&gt;$VOLUMES&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;&lt;/span&gt; &lt;span class="o"&gt;]&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="k"&gt;then&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;echo&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;Error: No volumes found in docker compose config for &lt;/span&gt;&lt;span class="nv"&gt;$DIR_NAME&lt;/span&gt;&lt;span class="s2"&gt;.&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="nb"&gt;exit&lt;/span&gt; &lt;span class="m"&gt;1&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;fi&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="nb"&gt;echo&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;対象ボリューム:&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="nb"&gt;echo&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;&lt;/span&gt;&lt;span class="nv"&gt;$VOLUMES&lt;/span&gt;&lt;span class="s2"&gt;&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="nb"&gt;echo&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;=== 2. 元マシンのコンテナ停止 ===&amp;#34;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;docker compose stop&#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="nb"&gt;echo&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;=== 3. ボリュームのバックアップ (vackup) ===&amp;#34;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;mkdir -p volume-backups&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="k"&gt;for&lt;/span&gt; vol in &lt;span class="nv"&gt;$VOLUMES&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="k"&gt;do&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;echo&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;Exporting volume: &lt;/span&gt;&lt;span class="nv"&gt;$vol&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; vackup &lt;span class="nb"&gt;export&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;&lt;/span&gt;&lt;span class="nv"&gt;$vol&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;volume-backups/&lt;/span&gt;&lt;span class="nv"&gt;$vol&lt;/span&gt;&lt;span class="s2"&gt;.tar.gz&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="k"&gt;done&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="nb"&gt;echo&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;=== 4. 元マシンのコンテナ再開 (ダウンタイム短縮) ===&amp;#34;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;docker compose up -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="nb"&gt;echo&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;=== 5. 移行先へのファイル転送 (設定ファイル一式 + バックアップ) ===&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="nb"&gt;cd&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;ssh -o &lt;span class="nv"&gt;ServerAliveInterval&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="m"&gt;60&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;&lt;/span&gt;&lt;span class="si"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;REMOTE_TARGET&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;mkdir -p &lt;/span&gt;&lt;span class="si"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;REMOTE_DIR&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;&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="c1"&gt;# フォルダごとリモートへ同期&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;rsync -avz --progress -e &lt;span class="s2"&gt;&amp;#34;ssh -o ServerAliveInterval=60 -o ServerAliveCountMax=10&amp;#34;&lt;/span&gt; &lt;span class="se"&gt;\&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="s2"&gt;&amp;#34;&lt;/span&gt;&lt;span class="nv"&gt;$DIR_NAME&lt;/span&gt;&lt;span class="s2"&gt;/&amp;#34;&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;&lt;/span&gt;&lt;span class="si"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;REMOTE_TARGET&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;:&lt;/span&gt;&lt;span class="si"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;REMOTE_DIR&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;/&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="nb"&gt;echo&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;=== 6. 移行先でのボリュームリストアと起動 ===&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="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="nv"&gt;VOLUMES_ONELINE&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="k"&gt;$(&lt;/span&gt;&lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;&lt;/span&gt;&lt;span class="si"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;VOLUMES&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;&lt;/span&gt; &lt;span class="p"&gt;|&lt;/span&gt; tr &lt;span class="s1"&gt;&amp;#39;\n&amp;#39;&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39; &amp;#39;&lt;/span&gt;&lt;span class="k"&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="nv"&gt;REMOTE_SCRIPT&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="k"&gt;$(&lt;/span&gt;cat &lt;span class="s"&gt;&amp;lt;&amp;lt; EOF&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s"&gt;cd &amp;#34;${REMOTE_DIR}&amp;#34;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s"&gt;for vol in ${VOLUMES_ONELINE}; do&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s"&gt; echo &amp;#34;----------------------------------------&amp;#34;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s"&gt; echo &amp;#34;Processing volume on remote: \$vol&amp;#34;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s"&gt; &#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s"&gt; # リストアを実行&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s"&gt; vackup import &amp;#34;volume-backups/\$vol.tar.gz&amp;#34; &amp;#34;\$vol&amp;#34;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s"&gt; &#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s"&gt; # vackup-volume のネスト構造を修正&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s"&gt; echo &amp;#34;Fixing nested directory structure for \$vol...&amp;#34;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s"&gt; docker run --rm -v &amp;#34;\$vol&amp;#34;:/volume alpine sh -c &amp;#34;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s"&gt; if [ -d /volume/vackup-volume ]; then&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s"&gt; mv /volume/vackup-volume/* /volume/ 2&amp;gt;/dev/null || true&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s"&gt; mv /volume/vackup-volume/.[!.]* /volume/ 2&amp;gt;/dev/null || true&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s"&gt; rmdir /volume/vackup-volume 2&amp;gt;/dev/null || true&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s"&gt; fi&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s"&gt; &amp;#34;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s"&gt;done&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s"&gt;echo &amp;#34;----------------------------------------&amp;#34;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s"&gt;echo &amp;#34;Starting containers on remote host...&amp;#34;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s"&gt;docker compose up -d&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s"&gt;EOF&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;)&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;ssh -o &lt;span class="nv"&gt;ServerAliveInterval&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="m"&gt;60&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;&lt;/span&gt;&lt;span class="si"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;REMOTE_TARGET&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;&lt;/span&gt;&lt;span class="si"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;REMOTE_SCRIPT&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;&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="nb"&gt;echo&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;=== 7. ローカルの一時バックアップを削除 ===&amp;#34;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;rm -rf &lt;span class="s2"&gt;&amp;#34;&lt;/span&gt;&lt;span class="nv"&gt;$DIR_NAME&lt;/span&gt;&lt;span class="s2"&gt;/volume-backups&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="nb"&gt;echo&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;=== 移行プロセスが完了しました ===&amp;#34;&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;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;./migrate-wp.sh site1 VPSのユーザ@VPSのIPアドレス /home/VPSのユーザ/wordpress&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;これを実行すると、移行先に&lt;code&gt;~/wordpress/site1&lt;/code&gt;ができる。すでにコンテナの実行までされている。&lt;/p&gt;&#10;&lt;p&gt;なので、あとはDNSなどを操作して移行元から移行先に向けるとか、ルーティングで必要なことをやれば移行完了。&lt;/p&gt;&#10;&lt;p&gt;以上。&lt;/p&gt;&#10;</description></item><item><title>Growi (Docker) をコンテナごと別マシンに引っ越す</title><link>https://hack-le.com/growi-docker-container/</link><pubDate>Sat, 13 Jun 2026 13:10:29 +0900</pubDate><guid>https://hack-le.com/growi-docker-container/</guid><description>&lt;h2 id="環境"&gt;環境&#10;&lt;/h2&gt;&lt;ul&gt;&#10;&lt;li&gt;移行元&#10;&lt;ul&gt;&#10;&lt;li&gt;Intel Mac mini 2018&lt;/li&gt;&#10;&lt;li&gt;Docker Desktop&lt;/li&gt;&#10;&lt;li&gt;Growi 7.x&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;/li&gt;&#10;&lt;li&gt;移行先&#10;&lt;ul&gt;&#10;&lt;li&gt;Linux Mint Xfce 22.3&lt;/li&gt;&#10;&lt;li&gt;Docker 29.2.1&lt;/li&gt;&#10;&lt;li&gt;Growi 7.x&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;h2 id="基本的な手順"&gt;基本的な手順&#10;&lt;/h2&gt;&lt;p&gt;手順はWordPressのコンテナ移行とほぼ一緒なので、下記記事を参考にすること（雑）&lt;/p&gt;&#10;&lt;div class="blog-card-wrapper"&gt;&#10; &lt;a href="https://hack-le.com/container-wp/" 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;コンテナ構築のWordPressサイトを別マシンに移行する&lt;/div&gt;&#10; &lt;div class="blog-card-url"&gt;/container-wp/&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/05/eyecatch_50016_1779164478.webp" alt="コンテナ構築のWordPressサイトを別マシンに移行する" loading="lazy" /&gt;&#10; &lt;/div&gt;&#10; &lt;/a&gt;&#10;&lt;/div&gt;&#10;&#10;&lt;p&gt;全体の流れと微妙な差分を下記にメモ。&lt;/p&gt;&#10;&lt;ol&gt;&#10;&lt;li&gt;移行元でコンテナを停止してボリュームをバックアップし、移行先にアーカイブを送信&lt;/li&gt;&#10;&lt;li&gt;移行先でボリュームを復元&lt;/li&gt;&#10;&lt;/ol&gt;&#10;&lt;ul&gt;&#10;&lt;li&gt;ここでElasticsearchの書き込み権限がなかったりするので修正する&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;ol start="3"&gt;&#10;&lt;li&gt;移行先の&lt;code&gt;docker-compose.yml&lt;/code&gt;でボリューム名を指定する&lt;/li&gt;&#10;&lt;li&gt;&lt;code&gt;docker compose up&lt;/code&gt;してブラウザで動作確認&lt;/li&gt;&#10;&lt;/ol&gt;&#10;&lt;p&gt;の流れ。ボリューム名の定義と、権限の修正あたりが若干の追加要素となる。&lt;/p&gt;&#10;&lt;p&gt;ボリューム名は通常はフォルダ名にデフォ名つくような感じだろう。たとえばgrowiフォルダでは以下のようになっているだろう。&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="nb"&gt;local&lt;/span&gt; growi_es_data&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nb"&gt;local&lt;/span&gt; growi_growi_data&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nb"&gt;local&lt;/span&gt; growi_mongo_configdb&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nb"&gt;local&lt;/span&gt; growi_mongo_db&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;これらについて、&lt;code&gt;docker-compose.yml&lt;/code&gt;で&lt;code&gt;es_dataや&lt;/code&gt;growi_dataとなっているところをそれぞれ修正する。そして&lt;code&gt;external&lt;/code&gt;を&lt;code&gt;true&lt;/code&gt;にする。ここらへんは上記WordPress記事のymlを見て参考に。&lt;/p&gt;&#10;&lt;p&gt;&lt;code&gt;docker compose up&lt;/code&gt;で様子を見るが、もしかするとElasticsearchでエラーが出てしまうかもしれない。これはElasticsearchコンテナの権限問題であるため、以下のコマンドで修正する。&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;docker run --rm -v &amp;lt;ボリューム名、たとえばgrowi_es_data&amp;gt;:/mnt alpine chown -R 1000:1000 /mnt&#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>Docker版WordPressの更新でFTPの認証情報を求められた時</title><link>https://hack-le.com/docker-wordpress-update-ftp/</link><pubDate>Thu, 11 Jun 2026 10:19:31 +0900</pubDate><guid>https://hack-le.com/docker-wordpress-update-ftp/</guid><description>&lt;h2 id="環境"&gt;環境&#10;&lt;/h2&gt;&lt;ul&gt;&#10;&lt;li&gt;Linux Mint Xfce 22.3&lt;/li&gt;&#10;&lt;li&gt;Docker 29.5.3&lt;/li&gt;&#10;&lt;li&gt;WordPress 6.9.4 -&amp;gt; 7.0&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;h2 id="症状"&gt;症状&#10;&lt;/h2&gt;&lt;p&gt;WebブラウザでWordPressを更新しようとしたら、以下のようにFTPの接続情報を求められた。&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/2026/06/8a83e6adea4b3eb00050acd193edf3f9-700x403.webp"&gt;&lt;/p&gt;&#10;&lt;h2 id="原因と対応"&gt;原因と対応&#10;&lt;/h2&gt;&lt;p&gt;Webサーバのユーザが&lt;code&gt;www-data&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;docker compose excc &amp;lt;wordpress&amp;gt; /bin/bash&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;ターミナルに入って、&lt;code&gt;/var/www/html&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;root@:/var/www# ls -l&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;total &lt;span class="m"&gt;4&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;drwxr-xr-x &lt;span class="m"&gt;5&lt;/span&gt; root root &lt;span class="m"&gt;4096&lt;/span&gt; May &lt;span class="m"&gt;18&lt;/span&gt; 03:05 html&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;oh&amp;hellip;。&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-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;docker compose &lt;span class="nb"&gt;exec&lt;/span&gt; &amp;lt;wordpress&amp;gt; chown -R www-data:www-data /var/www/html&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;この後、WebブラウザよりWordPressで更新を実行すると、更新できるようになる。&lt;/p&gt;&#10;&lt;p&gt;以上。&lt;/p&gt;&#10;</description></item><item><title>Trilium Notes (Docker) のマシンを移行する</title><link>https://hack-le.com/trilium-notes-docker-migration/</link><pubDate>Sun, 07 Jun 2026 21:21:36 +0900</pubDate><guid>https://hack-le.com/trilium-notes-docker-migration/</guid><description>&lt;p&gt;現在運用しているTrilium Notesについて、Intel Mac mini 2018 + Docker Desktop から Linux Mint Xfce 22.3のサーバマシンに移行する。&lt;/p&gt;&#10;&lt;h2 id="環境"&gt;環境&#10;&lt;/h2&gt;&lt;ul&gt;&#10;&lt;li&gt;Trilium Notesのlatest&lt;/li&gt;&#10;&lt;li&gt;移行元&#10;&lt;ul&gt;&#10;&lt;li&gt;Intel Mac mini 2018&#10;&lt;ul&gt;&#10;&lt;li&gt;macOS Sonoma 14.6.1&lt;/li&gt;&#10;&lt;li&gt;Docker Desktop for mac v4.76.0&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;/li&gt;&#10;&lt;li&gt;移行先&#10;&lt;ul&gt;&#10;&lt;li&gt;ThinkPad L390&lt;/li&gt;&#10;&lt;li&gt;Linux Mint Xfce 22.3&#10;&lt;ul&gt;&#10;&lt;li&gt;Docker 29.5.2&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;h2 id="手順"&gt;手順&#10;&lt;/h2&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;docker compose down&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;&lt;code&gt;docker-compose.yml&lt;/code&gt;でデータディレクトリを確認する。&lt;code&gt;TRILIUM_DATA_DIR&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;&lt;span class="c1"&gt;# Running `docker-compose up` will create/use the &amp;#34;trilium-data&amp;#34; directory in the user home&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;# Run `TRILIUM_DATA_DIR=/path/of/your/choice docker-compose up` to set a different directory&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;# To run in the background, use `docker-compose up -d`&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;services:&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; trilium:&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="c1"&gt;# Optionally, replace `latest` with a version tag like `v0.90.3`&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;# Using `latest` may cause unintended updates to the container&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; image: triliumnext/trilium:latest&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="c1"&gt;# Restart the container unless it was stopped by the user&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; restart: unless-stopped&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; environment:&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; - &lt;span class="nv"&gt;TRILIUM_DATA_DIR&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;/home/node/trilium-data&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; - &lt;span class="nv"&gt;TZ&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;Asia/Tokyo&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; ports:&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="c1"&gt;# By default, Trilium will be available at http://localhost:8080&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;# It will also be accessible at http://&amp;lt;host-ip&amp;gt;:8080&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;# You might want to limit this with something like Docker Networks, reverse proxies, or firewall rules,&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;# however be aware that using UFW is known to not work with default Docker installations, see:&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;# https://docs.docker.com/engine/network/packet-filtering-firewalls/#docker-and-ufw&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;8080:8080&amp;#39;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; volumes:&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="c1"&gt;# Unless TRILIUM_DATA_DIR is set, the data will be stored in the &amp;#34;trilium-data&amp;#34; directory in the home directory.&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;# This can also be changed with by replacing the line below with `- /path/of/your/choice:/home/node/trilium-data&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; - &lt;span class="si"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;TRILIUM_DATA_DIR&lt;/span&gt;&lt;span class="k"&gt;:-&lt;/span&gt;&lt;span class="p"&gt;~/trilium-data&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;:/home/node/trilium-data&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="c1"&gt;# - /etc/timezone:/etc/timezone:ro&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; - /etc/localtime:/etc/localtime:ro&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;ここでは&lt;code&gt;~/trilium-data&lt;/code&gt;となっている。ついでにMacで&lt;code&gt;/etc/timezone&lt;/code&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-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;tar -czvf trilium-data-backup.tar.gz ~/trilium-data&#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;scp trilium-data-backup.tar.gz ユーザ@IPアドレス:移行先のパス&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;新しいマシンで、これを保存先ディレクトリ上に展開する。今回は&lt;code&gt;trilium-data&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;tar -xzvf trilium-data-backup.tar.gz&#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;rm -f document.db-shm document.db-wal&#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;docker compose up&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;エラーなく起動したら、&lt;code&gt;http://IPアドレス:ポート&lt;/code&gt;にアクセスする。以前使っていたパスワードでログインできることを確認する。&lt;/p&gt;&#10;&lt;p&gt;問題なければOK。Ctrl-cで停止して、改めてバックグラウンドで起動する。&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;docker compose up -d&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;これでOK。しばらく動かして、安定していることを確認したら元のコンテナは削除してよい。&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/evernote-notion-trilium-notes/" 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;Evernote/Notion代替: Trilium NotesでインストールからWeb Clipまで&lt;/div&gt;&#10; &lt;div class="blog-card-url"&gt;/evernote-notion-trilium-notes/&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/03/image-4.png" alt="Evernote/Notion代替: Trilium NotesでインストールからWeb Clipまで" loading="lazy" /&gt;&#10; &lt;/div&gt;&#10; &lt;/a&gt;&#10;&lt;/div&gt;&#10;&#10;</description></item><item><title>コンテナ構築のWordPressサイトを別マシンに移行する</title><link>https://hack-le.com/container-wp/</link><pubDate>Sun, 24 May 2026 00:00:00 +0900</pubDate><guid>https://hack-le.com/container-wp/</guid><description>&lt;p&gt;現在常時稼働サーバがMac・Linuxと無意味に分かれている。Linuxマシンに統一してIntel Mac mini 2018には予備役となってもらうように、少しずつ機能を移行している。今回は自宅サーバのWebサイト。つまりこのサイト。&lt;/p&gt;&#10;&lt;h2 id="環境"&gt;環境&#10;&lt;/h2&gt;&lt;p&gt;Mac上で展開していたDocker + WordPressのサイトを、別マシンに移行する。前回の移行時はプラグインを使って復元したのだが、せっかくコンテナでやってるのにそれではかいがないと思い、今回はCLIで実施。&lt;/p&gt;&#10;&lt;ul&gt;&#10;&lt;li&gt;元マシン: Intel Mac mini 2018&#10;&lt;ul&gt;&#10;&lt;li&gt;Docker Desktop 4.73.0&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;/li&gt;&#10;&lt;li&gt;移行先マシン: Linux Mint Xfce 22.3&#10;&lt;ul&gt;&#10;&lt;li&gt;Docker 29.5.0&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;/li&gt;&#10;&lt;li&gt;&lt;a class="link" href="https://github.com/BretFisher/docker-vackup" target="_blank" rel="noopener"&#10; &gt;GitHub - BretFisher/docker-vackup: Script to easily backup and restore docker volumes · GitHub&lt;/a&gt;&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;p&gt;&lt;code&gt;vackup&lt;/code&gt;コマンドの中身については以下の記事を参照。&lt;/p&gt;&#10;&lt;div class="blog-card-wrapper"&gt;&#10; &lt;a href="https://hack-le.com/docker-volume-cli-backup/" 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のボリュームをCLIでバックアップ・復元する&lt;/div&gt;&#10; &lt;div class="blog-card-url"&gt;/docker-volume-cli-backup/&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/2024/09/docker-volume-cli-backup.webp" alt="DockerのボリュームをCLIでバックアップ・復元する" 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;全体は以下。&lt;/p&gt;&#10;&lt;ol&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;移行先：ボリュームをリストア&lt;/li&gt;&#10;&lt;li&gt;移行先：コンテナを起動&lt;/li&gt;&#10;&lt;li&gt;移行先：localhostにアクセスして復元されていることを確認する&lt;/li&gt;&#10;&lt;li&gt;リバースプロキシなどで向け先を移行先に。元サイトは落とす&lt;/li&gt;&#10;&lt;/ol&gt;&#10;&lt;h3 id="元マシンボリュームのバックアップ"&gt;元マシン：ボリュームのバックアップ&#10;&lt;/h3&gt;&lt;p&gt;コンテナは持ち運べるとして、問題は永続化ボリュームをコピーすること。&lt;code&gt;ここでは、docker-compose.yml&lt;/code&gt;は以下のようなものとする。変数は&lt;code&gt;.env&lt;/code&gt;で定義しているとする。内容は、WordPressとDBそれぞれコンテナたててるよ、それぞれボリュームを指定して使うよ、というもの。&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;services:&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; hp_wordpress:&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; image: wordpress:latest&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; ports:&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; - &lt;span class="s2"&gt;&amp;#34;ポート番号:80&amp;#34;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; environment:&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; WORDPRESS_DB_HOST: データベースコンテナ&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; WORDPRESS_DB_USER: &lt;span class="si"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;DB_USER&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; WORDPRESS_DB_PASSWORD: &lt;span class="si"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;DB_PASSWORD&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; WORDPRESS_DB_NAME: &lt;span class="si"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;_DB_NAME&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; volumes:&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; - hp_wordpress_data:/var/www/html&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; - ./custom-php.ini:/usr/local/etc/php/conf.d/custom-php.ini&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; restart: always&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; depends_on:&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; - db&#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; db:&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; image: mariadb:latest&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; environment:&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; MYSQL_ROOT_PASSWORD: &lt;span class="si"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;MYSQL_ROOT_PASSWORD&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; MYSQL_DATABASE: &lt;span class="si"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;DB_NAME&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; MYSQL_USER: &lt;span class="si"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;DB_USER&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; MYSQL_PASSWORD: &lt;span class="si"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;DB_PASSWORD&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; volumes:&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; - db_data:/var/lib/mysql&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; restart: always&#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;volumes:&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; hp_wordpress_data:&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; external: &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; db_data:&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; external: &lt;span class="nb"&gt;true&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;volumeとして、&lt;code&gt;hp_wordpress_data&lt;/code&gt;と&lt;code&gt;db_data&lt;/code&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-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;docker volume ls&#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-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;docker compose stop&#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;mkdir volume-backups&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;vackup &lt;span class="nb"&gt;export&lt;/span&gt; WPボリューム名 volume-bakcups/WPボリューム名.tar.gz&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;vackup &lt;span class="nb"&gt;export&lt;/span&gt; DBボリューム名 volume-bakcups/DBボリューム名.tar.gz&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;ダウンタイムを小さくしたいなら、この時点で元マシンを&lt;code&gt;docker compose up -d&lt;/code&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-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;rsync -avz --progress volume-backups ユーザ@移行先:移行先のパス/&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;容量大きくて途中でdisconnectされるときは&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;rsync -avz --progress -e &lt;span class="s2"&gt;&amp;#34;ssh -o ServerAliveInterval=60 -o ServerAliveCountMax=10&amp;#34;&lt;/span&gt; volume-backups ユーザ@移行先:移行先のパス/&#10;&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;/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;vackup import WPボリューム.tar.gz WPボリューム名&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;vackup import DBボリューム.tar.gz DBボリューム名&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;これで問題ないはずだが、なぜか自分の環境でよくわからんことになっていたので、ボリュームの中身を確認しておく。以下のように直下にされておらず&lt;code&gt;vakcup-volume&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;$ docker run --rm -v ボリューム:/volume alpine ls -lh /volume&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;total 4K &#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;drwxr-xr-x &lt;span class="m"&gt;6&lt;/span&gt; &lt;span class="m"&gt;999&lt;/span&gt; ping 4.0K May &lt;span class="m"&gt;18&lt;/span&gt; 02:53 vackup-volume&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;&lt;code&gt;vackup-volume&lt;/code&gt;なる親ディレクトリが出来ていて、その下にディレクトリがあるようだ。&lt;/p&gt;&#10;&lt;p&gt;この場合は以下のコマンドにより&lt;code&gt;vackup-volume&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;docker run --rm -v WPボリューム名:/volume alpine sh -c &lt;span class="s2"&gt;&amp;#34;mv /volume/vackup-volume/* /volume/ 2&amp;gt;/dev/null || true; mv /volume/vackup-volume/.[!.]* /volume/ 2&amp;gt;/dev/null || true; rmdir /volume/vackup-volume&amp;#34;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;もう一度ボリュームを確認したら直下に展開されていることがわかる。DBのほうのボリュームも同様に。&lt;/p&gt;&#10;&lt;p&gt;これでいけるが、なんかよくわからんことをしている。&lt;/p&gt;&#10;&lt;p&gt;後日実行したときは再現しなかったので、なんだかよくわからない。&lt;/p&gt;&#10;&lt;h3 id="起動と疎通確認"&gt;起動と疎通確認&#10;&lt;/h3&gt;&lt;p&gt;最後にもう一度&lt;code&gt;docker-compose.yml&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;docker compose up&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;エラーとか出ないかを確認するため、最初はフォアグラウンドで。&lt;code&gt;http://localhost:ポート&lt;/code&gt;にアクセスし、いつもの画面が表示されることを確認する。&lt;strong&gt;インストール画面が出たら初期化されちゃってます&lt;/strong&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-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;docker compose up -d&#10;&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;準備が整ったので、DNSやらリバースプロキシやらいじって、移行元から移行先に向ける。&lt;/p&gt;&#10;&lt;p&gt;この時点で移行元を落としていいが、いつ落とすかは考え方による。ダウンタイムを小さくするなら移行元をしばらく残しておいてもいい。しかし、変に残しておいてナイスタイミングでコメントついてしまい、消えてしまうみたいな事故が起きる可能性もあるので、何がいいとも言えない。僕はいらなくなったら落とす。&lt;/p&gt;&#10;&lt;h2 id="インフラはai無能"&gt;インフラはAI無能&#10;&lt;/h2&gt;&lt;p&gt;最初これくらいAIがすぐできるだろうと思ったけど何か色々ハマってしまって、結局手作業で心を込めてやりました。インフラ周りは固有の環境や設定が多すぎるので、汎用的な一般解を出し続けるAIは無能になりがち。&lt;/p&gt;&#10;&lt;p&gt;それにしてもこの手の作業をするとき、昔書いた記事を参考にすることがよくあるのだけれど、このサイト自身が対象のとき、失敗するとサイト自体が落ちてしまって閲覧することができないっていう。まぁそれを考えると、ニッチな記事でもnoteに転載していくのは保険としての意味もあるか。釈然としないけど。&lt;/p&gt;&#10;&lt;p&gt;今後Linuxマシンは色々なハードウェアを検証していくため、移行作業はスクリプト化してスムーズに検証できる体制を整えたい。&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/wordpressdocker-script/" 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;WordPress(Docker)をコンテナとボリュームごと別マシンに移行するスクリプト&lt;/div&gt;&#10; &lt;div class="blog-card-url"&gt;/wordpressdocker-script/&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/06/eyecatch_50180_1781419099.webp" alt="WordPress(Docker)をコンテナとボリュームごと別マシンに移行するスクリプト" loading="lazy" /&gt;&#10; &lt;/div&gt;&#10; &lt;/a&gt;&#10;&lt;/div&gt;&#10;&#10;</description></item></channel></rss>