<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>VPS on 或る阿呆の記</title><link>https://hack-le.com/tags/vps/</link><description>Recent content in VPS on 或る阿呆の記</description><generator>Hugo -- gohugo.io</generator><language>ja</language><lastBuildDate>Sun, 25 Oct 2026 05:15:18 +0900</lastBuildDate><atom:link href="https://hack-le.com/tags/vps/index.xml" rel="self" type="application/rss+xml"/><item><title>【GMO】お名前.comデスクトップクラウドで理不尽な資金蒸発がFX戦士を襲う</title><link>https://hack-le.com/gmo-fx-desktop-cloud/</link><pubDate>Sun, 25 Oct 2026 00:00:00 +0900</pubDate><guid>https://hack-le.com/gmo-fx-desktop-cloud/</guid><description>&lt;p&gt;GMOにやらかされたFX民が同じFX民としてあまりにも可哀想。&lt;/p&gt;&#10;&lt;p&gt;&lt;a class="link" href="https://news.yahoo.co.jp/articles/87a02b4f1d41ed78590b04c1494969e0777afbc8" target="_blank" rel="noopener"&#10; &gt;2秒で失った400万円 GMO系サービスで「意図しないFX取引」（朝日新聞） - Yahoo!ニュース&lt;/a&gt;&lt;/p&gt;&#10;&#10; &lt;blockquote&gt;&#10; &lt;p&gt;わずか2秒ほどの間に400万円超の損失を出していた。その後も2分近く身に覚えのない取引が続き、損害は600万円を超えた。&lt;/p&gt;&#10;&#10; &lt;/blockquote&gt;&#10;&#10; &lt;blockquote&gt;&#10; &lt;p&gt;同じサービスを使っていた愛知県内の女性会社員（29）は22日朝、いつものようにFX取引の状況を確認して「頭が真っ白になった」。&lt;/p&gt;&#10;&lt;p&gt;その日の午前5時前から短時間で意図していない大量の取引が繰り返されていた。口座残高は6768円しかなく、430万円余りの資金はほぼ底をついていた。&lt;/p&gt;&#10;&#10; &lt;/blockquote&gt;&#10;&lt;p&gt;&lt;strong&gt;情報漏洩ってレベルじゃねぇぞ！&lt;/strong&gt; さすがにドン引きというか本当に可哀想過ぎる。しかもこの後の展開がゲームみたいになってる。&lt;/p&gt;&#10;&lt;p&gt;ただこの事件、金融系のFXとIT系のクラウド・VPSの事情両方をある程度知らないと、詳細がよくわからないニュースでもあります。このサイトに足を運ばれる方はIT民が多いのかと思いますが、私はIT民と同時にFX民でもあるので、軽く&lt;strong&gt;FX周りの解説も交えつつ所感&lt;/strong&gt;を書いていきます。&lt;/p&gt;&#10;&lt;h2 id="何が起きたってかfxって何なんでお名前comが出てくるの"&gt;何が起きた？ってかFXって何？なんでお名前.comが出てくるの？&#10;&lt;/h2&gt;&lt;h3 id="事件の概要"&gt;事件の概要&#10;&lt;/h3&gt;&lt;p&gt;何が起きたかというと、お名前.comデスクトップクラウドなるサービスが侵入を受けたようです。このサービスは、ITmediaの記事を引用しますと&lt;/p&gt;&#10;&#10; &lt;blockquote&gt;&#10; &lt;p&gt;お名前.com デスクトップクラウドは、FXの自動売買ソフト（「MetaTrader 4」「MetaTrader 5」など）を、自宅のPCを使わずにクラウド上のサーバで24時間動かし続けるためのサービス&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;&#10; &lt;/blockquote&gt;&#10;&lt;p&gt;というものです。で、このFXの自動売買ソフトをクラウド上のサーバで動かすGMOのサービスがあって、今回それが侵入を受けて、盛大にやらかして冒頭の悲劇が起きた、という感じです。&lt;/p&gt;&#10;&lt;h3 id="そもそもfxとは"&gt;そもそもFXとは？&#10;&lt;/h3&gt;&lt;p&gt;うちのサイトの場合VPS云々は何かわかるがFX正味知らんという人が多そうなので、こちらのを少し詳しめに説明します。&lt;/p&gt;&#10;&lt;p&gt;ネットでは昔から失敗した人間の断末魔などが面白おかしく取り上げられ、また昨今FX戦士くるみちゃんのアニメ化という狂気もあって、&lt;strong&gt;FXはやべーやつの印象かもしれませんが、なんのことはなくて一言で言えば為替取引&lt;/strong&gt;です。が、&lt;strong&gt;レバレッジかけてやるのが特徴&lt;/strong&gt;ですね。1万ドル単位で売買するのが普通です。&lt;/p&gt;&#10;&lt;p&gt;1万ドルって1ドル150円だと150万円ですので、それが1単位って貴族の遊びか？って感じですが、ここに25倍のレバレッジをかけると、6万円で1万ドル売買できたりします。ここでドル円が151円になると、150万円が151万円になるので1万円の儲けになります。6万円が7万円になります。夢がある。そしてもちろん1円下がれば、1万円の損になります。6万円が5万円になります。しにます。さらに5円下がったら？0円です。飛びます。10円下がったら？-4万円ですこんにちは借金。&lt;/p&gt;&#10;&lt;p&gt;まぁそれは&lt;strong&gt;FX戦士の世界観&lt;/strong&gt;で、実際はセーフティネットはあるし、そもそもそんな丁半どっちみたいなことをすることはなく、&lt;strong&gt;1倍や2倍くらいのゆるーい倍率で長くまったりやっている人&lt;/strong&gt;もけっこういます。僕もだいたい3-5倍くらいかなぁ。目論見外すと8倍くらいになって焦ることもあるって感じ。まぁコロナショックの時などの急激な変動ではロスカが見えてきて泡吹いていたこともありましたが…知人はあんとき300万くらいロスカされたって言ってたな(；´Д｀)&lt;/p&gt;&#10;&lt;h3 id="なんでお名前comが出てくるのか"&gt;なんでお名前.comが出てくるのか&#10;&lt;/h3&gt;&lt;p&gt;さてここまでいくと、完全に金融投資のコンテクストで、なんでVPSだのデスクトップクラウドなんだのが出てくるのかですが、&lt;strong&gt;ソフトウェアを使って自動トレードするユーザとそのサービスがターゲットになっているから&lt;/strong&gt;、ですね。&lt;/p&gt;&#10;&lt;p&gt;基本的に取引所経由でやることになるんですけれど、&lt;strong&gt;仮想通貨の取引所と違ってAPI環境があることは稀で、自動トレードやろうと思ったら記事に出たMT4/MT5みたいな専用ソフトウェアかつそれに対応した取引所を使う必要があります&lt;/strong&gt;。&lt;/p&gt;&#10;&lt;p&gt;一応専用の環境を用意せずとも、ループイフダンとかトライオートとか、システムトレードができることをウリにした取引所はあるんですが、手数料やスプレッド（実質手数料と思え）が高いし融通のきかないシンプルなロジックしか組めないので、本格的に自動トレードやりたいぞってなるとどうしてもそうなってしまうんですね。&lt;/p&gt;&#10;&lt;p&gt;といっても私はMT4/MT5は使っていないので詳細な操作や手数料の体系なんかは知りませんけれど、&lt;strong&gt;常駐させて対応取引所と自動トレードし続けるソフトウェア&lt;/strong&gt;、ということは言えるでしょう。で、&lt;strong&gt;そのためのインフラ基盤としてGMOの出しているお名前.comデスクトップクラウドが一つ定番だったのかな&lt;/strong&gt;。ちょっと業界の定番までは知りませんが、記事にはみんな使っていたから安心だと思った的な感じで書かれてましたね。&lt;/p&gt;&#10;&lt;p&gt;まぁ確かに市井のFX民にとって自動トレードは長らくハードル高めだったと思いますので、&lt;strong&gt;GMOがそのニーズを拾い上げた感じ&lt;/strong&gt;でしょうか、色々な意味でGMO感あります。&lt;/p&gt;&#10;&lt;h2 id="核心なぜ被害が広がったのか"&gt;核心：なぜ被害が広がったのか？&#10;&lt;/h2&gt;&lt;p&gt;で、最初に返りまして、今回やらかしたのはこのGMOの基盤部分、ということになります。ここまでの説明のとおりソフトウェアを置いているだけなので、直接のやりとりはここから複数の取引所それぞれ、となります。もちろん連携が取れているわけではありません。&lt;/p&gt;&#10;&lt;p&gt;ここが&lt;strong&gt;ポイントの一つ&lt;/strong&gt;です。&lt;strong&gt;GMOは取引所そのものではなく、取引所に注文をするソフトウェアを置いているサーバをユーザに提供している&lt;/strong&gt;、というポジションです。&lt;/p&gt;&#10;&lt;p&gt;つまり、&lt;strong&gt;GMOがやらかしたことなど取引所は知ったことでないので、取引は続行されます&lt;/strong&gt;。&lt;/p&gt;&#10;&lt;p&gt;これを絵にするとこうなります。&lt;strong&gt;この絵がこの記事のすべて&lt;/strong&gt;です。&lt;/p&gt;&#10;&lt;pre class="mermaid" style="visibility:hidden"&gt;flowchart TB&#10;U["FX利用者資金・取引口座を保有"]&#10;A["攻撃者"]&#10;subgraph VPS["GMOのサービス領域"]&#10;direction TB&#10;G["GMOVPS・実行環境の提供"]&#10;M["自動売買ソフトMT4 / MT5"]&#10;G --&gt;|"実行環境を提供"| M&#10;end&#10;B["FX業者注文の受付・執行"]&#10;U -.-&gt;|"取引設定・認証情報"| M&#10;M --&gt;|"売買注文"| B&#10;B --&gt;|"約定・損益"| U&#10;A -.-&gt;|"不正侵入"| VPS&#10;style VPS fill:#E8F1FF,stroke:#477BC0,stroke-width:2px,color:#222&#10;style B fill:#E5F5E8,stroke:#39804A,stroke-width:2px,color:#222&#10;style U fill:#FFF0E6,stroke:#C66B32,color:#222&#10;style A fill:#FFE8E8,stroke:#C44,color:#222&#10;style G fill:#FFFFFF,stroke:#477BC0,color:#222&#10;style M fill:#FFFFFF,stroke:#477BC0,color:#222&lt;/pre&gt;&lt;p&gt;&lt;strong&gt;ユーザ、GMO、各事業者がそれぞれ疎結合になっているのがシステムとして見た時のポイントになります&lt;/strong&gt;。&lt;/p&gt;&#10;&lt;p&gt;なので、&lt;strong&gt;犯人にGMO部分を乗っ取られた場合、取れる手段はユーザ-FX事業者部分の対応になります&lt;/strong&gt;。&lt;strong&gt;GMO自身は直接は何もできない&lt;/strong&gt;んです。それでGMOはFX事業者に注文通すラインそのものを切断してくれという連絡をしているわけです。&lt;/p&gt;&#10;&lt;p&gt;……応急措置ですが。乗っられた時点で厳しい。犯人が既にセッション確立している場合、ユーザアクションのログオフで全セッション切断できるのかも事業者次第だろうし。まぁ実際、その後も破壊活動が止まってないようですし。&lt;/p&gt;&#10;&lt;p&gt;とはいえやるべきことであるのは確かです。&lt;strong&gt;GMOのやるべきことは全顧客にあらゆる手段でユーザに直接連絡して対応をお願いすること&lt;/strong&gt;だと思いますけどね。実際はその真逆ですが。実は&lt;strong&gt;21日水曜日の第一報の時点ではGMOの報告内容は比較的穏やかで、「不正侵入受けた！ユーザは情報閲覧とかあるかも！」くらいの感じだった&lt;/strong&gt;んですわ。で、このニュースを見たのも21日なんですが、僕はちょっと違和感あったんですね。そんときのツイートがこれ。&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/6de325f2fd6f674f904be6fee0ae9d4c.webp"&gt;&lt;/p&gt;&#10;&lt;p&gt;&lt;em&gt;&lt;a class="link" href="https://x.com/tamasan774/status/2112848040856072501?s=20" target="_blank" rel="noopener"&#10; &gt;https://x.com/tamasan774/status/2112848040856072501?s=20&lt;/a&gt;&lt;/em&gt;&lt;/p&gt;&#10;&#10; &lt;blockquote&gt;&#10; &lt;p&gt;GMOのクラウド基盤がやられたの…？どこまでやられたんだろう。本当に情報閲覧程度なんか。プログラム設置されたなら少なくともそこはWriteと実行権限とられてるよな。。&#10;いろんな意味でやられたらダメだろのサービス内容と事業者ではある&lt;/p&gt;&#10;&#10; &lt;/blockquote&gt;&#10;&lt;p&gt;これは元記事見ると不正にプログラムを設置されたとあったので、そこまでされているのに本当に情報閲覧されたかもなんて程度なんだろうか？と違和感があったんです。結果的にフラグだったわけですが……しかしまさか本当に&lt;strong&gt;ここまで盛大にやらかしている&lt;/strong&gt;とはこの時は思いませんでした。&lt;/p&gt;&#10;&lt;p&gt;だってそうなら言うべきでしょう。確かにすべてを言えない事情はあるかもしれないけれど、&lt;strong&gt;事態の深刻さは伝えられたはずで、そうしていえれば、この時点で直ちに取引所に連絡してすべての注文を止めるとか、そういうことは出来た可能性もあるとのではないでしょうか&lt;/strong&gt;。なにしろ大金がかかっている。みんな必死だよ。&lt;/p&gt;&#10;&lt;p&gt;まぁもちろん&lt;strong&gt;そのときにはそこまでのことがわからなったといえるかもしれない&lt;/strong&gt;んですが、&lt;strong&gt;現場のエンジニアがそんな悠長なこと考えていたとも思えない&lt;/strong&gt;んですよねぇ…。最悪のケースは現場レベルでは共有されてたんじゃないのかなぁ。第三者の僕が、このニュース一つで「ほんとにその程度？」って引っかかってるくらいですし。謎のプログラム見つけた時点で、青ざめたんじゃねぇのかな…それともこの会社で働くヒトはそんなタマじゃないかしら。&lt;/p&gt;&#10;&lt;p&gt;それで実は激ヤバでしたってゲロった第2報が既に色々あったあとの木曜日16時59分（&lt;a class="link" href="https://group.gmo/info/alert/20261022/" target="_blank" rel="noopener"&#10; &gt;【重要】「お名前.com デスクトップクラウド」への不正アクセスに関するお詫びとお知らせ（第2報） | GMOインターネットグループ株式会社&lt;/a&gt;）、ここで各事業者単位でのログオフ（セッション切断）が対応としてあるんですけど、まぁそれはそうなんですが、どこまで伝わったのか。記事の人なんかはそもそもこの時点で時既に遅しですし。第3報「&lt;a class="link" href="https://group.gmo/info/alert/20261023/" target="_blank" rel="noopener"&#10; &gt;【重要】「お名前.com デスクトップクラウド」への不正アクセスに関するお詫びとお知らせ（第3報） | GMOインターネットグループ株式会社&lt;/a&gt;」はその対応をより強く書いたのがほとんどですね。この時金曜日16時10分。FXって平日しかやってないんだよ(^_^;)&lt;/p&gt;&#10;&lt;h2 id="fx訴訟戦士爆誕待ったなし"&gt;FX訴訟戦士爆誕待ったなし？&#10;&lt;/h2&gt;&lt;p&gt;まぁ真相はこれから訴訟沙汰になった時にわかることかもしれません。いや、本当になりそうな気配が。&lt;strong&gt;被害金額がもう泣き寝入りできる金額じゃない&lt;/strong&gt;。&lt;/p&gt;&#10;&lt;p&gt;かなり醜悪なんですが、攻撃者はわざとユーザの口座を破壊しているっぽいんですね。具体的にはフルレバでガンガン注文入れて資産を蒸発させていたようです。ひでぇ…相対取引のFXの仕組み上、そんなことしてもブローカーが儲かるだけで攻撃者の得にはならないはず。&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/227f6087bd7121f4459268733254e1ec.webp"&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;&#10; &lt;blockquote&gt;&#10; &lt;p&gt;今出回ってる脅迫文マジです&#10;私の破綻させられた口座の番号、被害額一致しました&lt;/p&gt;&#10;&#10; &lt;/blockquote&gt;&#10;&lt;p&gt;本当？となるわけですが、第三報には攻撃者から連絡があっても返事するなという旨が書かれていることなどみると、どうもマジっぽい。しかもこの文章えげつないですよ。まぁちょっと意訳しますけど、&lt;/p&gt;&#10;&lt;p&gt;&lt;strong&gt;犯罪者「あなた達は悪くありません。しかしGMOが交渉に応じないので口座破壊しました。GMOを訴訟すればきっと全額戻ってきます。私たちが支援します！」&lt;/strong&gt;&lt;/p&gt;&#10;&lt;p&gt;サイコパスか？&lt;/p&gt;&#10;&lt;p&gt;つまり&lt;strong&gt;口座を破壊されて泣き寝入りできなくなったユーザを、GMOを攻撃するためのファンネルに仕立て上げようとしている&lt;/strong&gt;んでしょう。人の心とかないんか？&lt;/p&gt;&#10;&lt;p&gt;しかしもしGMOが今回のユーザの被害についてなんら補償を示さなかった場合、ユーザは自分の金を取り戻すには、自分の財布を燃やした犯人の支援を受けて、利用されているとわかりながらGMOを訴えるしかない。地獄か？&lt;/p&gt;&#10;&lt;p&gt;なかなか絶望的です。IT系じゃないとGMOのイメージはなさそうですが、決して評判の良い会社とは言えません。一般ユーザにとってもお名前.comのダークパターンは有名ですし、色々あったのか、ツイートを見ていると「このまま倒産してしまえ」という類のものが散見されました。&lt;strong&gt;第三報を見ても、具体的なことは何もわからないが、とりあえず法務を通しているということだけビンビンに伝わってくる、自己保身しか感じないものでした&lt;/strong&gt;。GMOェ…&lt;/p&gt;&#10;&lt;p&gt;顧客の口座を燃やし尽くし、裁判では我々はサイトで連絡した、何もしなかった顧客が悪いで通す気なんだろうか…いやまさかさすがに通らんだろう…。&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;&lt;strong&gt;悪いのは犯罪者だ理論はそれはそうなんですが、それでユーザのお金は戻ってきません&lt;/strong&gt;。テロリストに屈するな！というのも正論ですが、&lt;strong&gt;テロリストが人質にしてるのはGMOの金じゃなくてユーザの金&lt;/strong&gt;です。&lt;strong&gt;攻撃者vs企業において企業は被害者ですが、企業vsユーザにおいては守るべきものを守れなかったものと被害者&lt;/strong&gt;です。&lt;/p&gt;&#10;&lt;p&gt;また企業の対応を見ると、本当にそこに過失がなかったのか…なんならいわゆる重過失がなかったのかも、けっこう疑問があります。&lt;/p&gt;&#10;&lt;p&gt;SNSでは「GMOは規約でガチガチに固めてる。さすが」みたいなのもありましたが、AIに法的な有効性を考えさせてみると「&lt;strong&gt;BtoCで全部免責は消費者契約法第8条第1項第1号により無効&lt;/strong&gt;やから、訴訟になったら使えんと思うわ。諦めさせるためのポーズちゃう？」とのこと。また「一部免責でも重過失が認められた無効やな。法人の場合もそれはそう。&lt;strong&gt;重過失が認められるかが焦点になる&lt;/strong&gt;と思うわ」とのことなので、まぁ係争の余地はありそうです。&lt;/p&gt;&#10;&lt;p&gt;まぁGMOがしっかりしていればいいんですが…このままだと合理的には自分の金を取り戻すには自分の口座を破壊した犯人の支援を受けるハメに…。支援は恐らく証拠ログみたいなもんと思われ、犯人の証拠が使えるのか？という疑問がありますがが、これまたAIに聞いてみたところそこは使える可能性が高いで、とのこと。AI便利。さっきの図もAIに書かせた。AIは使い方次第……。&lt;/p&gt;&#10;&lt;h2 id="vpsはもはや危険"&gt;VPSはもはや危険？&#10;&lt;/h2&gt;&lt;p&gt;思い出したのは同じくGMO系列であるConoHa VPSで半年前にあった大規模障害です。あれもユーザ間では荒れました。あれば別にサイバー攻撃ではなく、単に設計・運用のまずさだったんじゃないかと思いますが…。&lt;/p&gt;&#10;&lt;p&gt;しかしこういうことが立て続けに起きていると、&lt;strong&gt;既にVPSレベルだとセキュリティの観点でオンプレと逆転現象が起きているのかもしれない&lt;/strong&gt;と思います。さすがにメガクラウドにまでなれば話もまた変わりますが…いずれにせよ記事の主旨とだいぶ変わってくるので別の記事でまた取り上げるかもですけどね。&lt;/p&gt;&#10;&lt;p&gt;ただまぁ、結果論ですが、&lt;strong&gt;ユーザは取る必要のないリスクを取っていた、とは言えてしまう&lt;/strong&gt;。でもVPS・クラウドを使いましょう、はこれまでむしろスマートとされたやり方でした。ユーザは勉強熱心な層だったんじゃないでしょうか…それに&lt;strong&gt;自動トレードユーザは基本的に資金管理をしっかりしながら地道に稼くことを目指す堅実な人が多いんじゃないでしょうか&lt;/strong&gt;。多分。自動トレードって基本的には中長期目線になるので。それだけにやるせないんですが…。&lt;/p&gt;&#10;&lt;p&gt;やっぱり、&lt;strong&gt;この10-15年くらいの常識が通用しなくなり始めている、大きな転換点にいる&lt;/strong&gt;のかもしれません。&lt;/p&gt;&#10;&lt;p&gt;&amp;lt;関連記事&amp;gt;&lt;/p&gt;&#10;&lt;div class="blog-card-wrapper"&gt;&#10; &lt;a href="https://hack-le.com/ai-cyber-attack/" 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;AIによるサイバー攻撃時代の個人サイト・個人ブログのセキュリティ&lt;/div&gt;&#10; &lt;div class="blog-card-url"&gt;/ai-cyber-attack/&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_53756_1792651216.webp" alt="AIによるサイバー攻撃時代の個人サイト・個人ブログのセキュリティ" 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/conoha-vps-down/" 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;ConoHa VPS落ちすぎ問題&lt;/div&gt;&#10; &lt;div class="blog-card-url"&gt;/conoha-vps-down/&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/eyecatch_48871_1774613666.webp" alt="ConoHa VPS落ちすぎ問題" 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/" 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;</description></item><item><title>セルフホストしたアプリをマシン移行する汎用的な仕組みについて考える</title><link>https://hack-le.com/selfhost-migration/</link><pubDate>Mon, 31 Aug 2026 00:00:00 +0900</pubDate><guid>https://hack-le.com/selfhost-migration/</guid><description>&lt;p&gt;現在VPS上で、仮想通貨の自作トレードアプリを稼働しています。これは元々自宅サーバでやっていたのですけれど、引越しのときに数日から下手すると10日以上のダウンが見込まれたので、その間に相場の急変があったらたまらないということで、VPSに移行しました。&lt;/p&gt;&#10;&lt;h2 id="アプリケーションを動作させるマシンを移行したい"&gt;アプリケーションを動作させるマシンを移行したい&#10;&lt;/h2&gt;&lt;p&gt;で、ようやく環境も落ち着いてきたので、いつまでもグローバル空間に置く必要はないし、自宅サーバに戻そうと考えています。もちろん手順を踏めばすぐできるんですけれど、ここで、少し汎用的に考えられないか、と思いました。セルフホスト勢にとってマシン移行は常に生じる汎用的な悩みです。&lt;/p&gt;&#10;&lt;p&gt;実際、このサイトはWordPressをセルフホストしているのですが、VPS,ConoHaの大規模障害（永遠にこする）や引越し前後において頻繁に引越しをしています。それはやはり面倒くささがあったわけです。&lt;/p&gt;&#10;&lt;p&gt;個人的には、マシンの移行はもっと気軽にやりたい、という思いがあります。それはもしもの役にも立つでしょう。何をやるべきで、何をやらないのか、自動化できる部分はなにか、自動しない部分はなにか、そういうことを汎用的に考えたい、と思いました。&lt;/p&gt;&#10;&lt;h2 id="中継地点を介した移行"&gt;中継地点を介した移行&#10;&lt;/h2&gt;&lt;p&gt;考えたところ、基本的には以下のような中継地点を挟むものになると思います。&lt;/p&gt;&#10;&lt;pre class="mermaid" style="visibility:hidden"&gt;graph LR&#10;mA(移行元)&#10;mB(移行先)&#10;st(中継地点)&#10;repo(リポジトリ)&#10;mA --&gt;|push| st&#10;st -.-&gt;|pull| mB&#10;repo -.-&gt;|pull| mB&lt;/pre&gt;&lt;p&gt;この絵がすべてです。&lt;/p&gt;&#10;&lt;p&gt;なんでダイレクトに送らないのかと言うと、&lt;strong&gt;移行元から移行先にダイレクトにpushできる権限があるとは限らない&lt;/strong&gt;、からです。これは完全に自宅サーバしか使わない！というならダイレクトでいいかもしれませんが、実際には自宅が使えなくなることはあります（今回の場合）し、アプリケーションによっては自宅サーバはやめたほうがよいものもあります。&lt;/p&gt;&#10;&lt;p&gt;なので、移行元からpushできて、移行先がpullできる、そういう中継地点を用意するのが汎用的です。この&lt;strong&gt;中継地点の役割は、アクセス制御と一時的なストレージ&lt;/strong&gt;、ただそれだけです。グローバルなアクセスが必要ならS3のようなクラウドサービスでもいいですし、VPSでもいいでしょう。移行元も移行先も同一ネットワークなら、わざわざ外に出す必要はなく、両者がSSHで通信できるサーバならなんでもいい。&lt;/p&gt;&#10;&lt;p&gt;具体的な作業自体は、アプリケーションごとに個別で判断します。この切り分けによって、搬出と搬入のタイミングをずらせるとか、データの整理が明確になるといった副次的な効能もあります。&lt;/p&gt;&#10;&lt;p&gt;ここで重要なことは、何を引越して何を引っ越さないのかを明確に切り分けることです。具体的には、以下の3つに分かれると思います。&lt;/p&gt;&#10;&lt;ul&gt;&#10;&lt;li&gt;リポジトリから引き継ぐ&#10;&lt;ul&gt;&#10;&lt;li&gt;ソースコードや設定ファイルのテンプレートなど&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;/li&gt;&#10;&lt;li&gt;ファイルの移行で引き継ぐ&#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;OS/インフラの差分に基づく設定ファイルなど&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;p&gt;それぞれ何が対象となるかはアプリケーションごとに変わるでしょう。すべてのパターンを考えて統一的にやろうとしないことです。また、引き継げない部分がある以上全自動の夢も捨てるのが筋です。変に自動的に翻訳するみたいなことするのはトラブルの元です。セルフホストでそこまでする必要があることは皆無ですし、もしやる場合は差分が出なくなるように環境から選定すべきでしょうね。&lt;/p&gt;&#10;&lt;p&gt;そのうえで手順は以下のように言えるでしょう。&lt;/p&gt;&#10;&lt;ol&gt;&#10;&lt;li&gt;移行元と移行先で、リポジトリから引き継ぐものをアップデート&lt;/li&gt;&#10;&lt;li&gt;移行元をstopして、中継地点に搬出&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;/ol&gt;&#10;&lt;p&gt;自前で開発したものか、あるいは他人が開発したものを使わせてもらっているか、色々あると思いますが、この手順に集約できるかと思われます。&lt;/p&gt;&#10;&lt;p&gt;この方法は基本的にダウンタイムが生じます。工夫次第で発生させないのも可能かと思いますが、セルフホストでそこまで頑張る意味は薄いんじゃないでしょうか。&lt;/p&gt;&#10;&lt;p&gt;とはいえダウンタイムは短いほうがよいので、短くするなら差分の編集は搬出前にやると良いのですけれど、個人的には搬入後に揃ってからのほうがいいかと思います。搬入のどさくさで差分が上書きされるリスクや、また何かしら動かさないと編集できないとかもありえるので…。&lt;/p&gt;&#10;&lt;p&gt;データのインポートはファイルシステムレベルなのか、アプリケーションレベルで実行したほうがいいのか、これもアプリケーションによるでしょうねぇ…。まぁ、都度判断ですね。&lt;/p&gt;&#10;&lt;h2 id="まとめ"&gt;まとめ&#10;&lt;/h2&gt;&lt;p&gt;ここまでの流れをやや詳細に図示すると以下になります。&lt;/p&gt;&#10;&lt;pre class="mermaid" style="visibility:hidden"&gt;flowchart TB&#10;subgraph Repo["コード管理"]&#10;Code["ソースコード / 設定テンプレート"]&#10;end&#10;subgraph Relay["中継地点"]&#10;ExportData["エクスポートデータ / DBダンプ / アプリログ"]&#10;end&#10;subgraph Source["移行元"]&#10;SrcApp["アプリ停止"]&#10;SrcData["データ抽出・ダンプ"]&#10;SrcEnv["【破棄】OS・インフラ固有設定"]&#10;end&#10;subgraph Target["移行先（自宅サーバなど）"]&#10;TgtEnv["【新規作成】OS・インフラ固有設定の編集"]&#10;TgtApp["アプリ起動・動作検証"]&#10;TgtData["データインポート"]&#10;end&#10;%% コードの流れ&#10;Code --&gt;|Pull| Source&#10;Code --&gt;|Pull| Target&#10;%% データと状態の流れ&#10;SrcApp --&gt; SrcData&#10;SrcData --&gt;|Push / アップロード| Relay&#10;Relay --&gt;|Pull / ダウンロード| TgtData&#10;TgtData --&gt; TgtEnv&#10;TgtEnv --&gt; TgtApp&#10;%% スタイル&#10;classDef storage fill:#e1f5fe,stroke:#0288d1,stroke-width:2px;&#10;classDef nodeBox fill:#f5f5f5,stroke:#616161,stroke-width:1px;&#10;class Repo,Relay storage;&#10;class Source,Target nodeBox;&lt;/pre&gt;&lt;p&gt;&lt;strong&gt;やることは、事前準備として「リポジトリからpullするもの、中継地点で飛ばすもの、直接編集するもの」の切り分け。そのうえで5つの手順の具体的な操作の当てはめ&lt;/strong&gt;。&lt;/p&gt;&#10;&lt;p&gt;整理してみると、当たり前といえば当たり前なんですが。あらかじめ分類したものを適合させるだけだと思ったほうが、脳の負荷が多少下がるので…。&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/selfhost-webapps-down/" 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;セルフホストしたWebアプリになぜかうまくアクセスできない時のチェック&lt;/div&gt;&#10; &lt;div class="blog-card-url"&gt;/selfhost-webapps-down/&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_51092_1786019542.webp" alt="セルフホストしたWebアプリになぜかうまくアクセスできない時のチェック" 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/selfhosted-susume/" 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;/selfhosted-susume/&lt;/div&gt;&#10; &lt;/div&gt;&#10; &lt;/a&gt;&#10;&lt;/div&gt;&#10;&#10;</description></item><item><title>ConoHaのVPSまた落ちたか</title><link>https://hack-le.com/conoha-vps-down-2/</link><pubDate>Tue, 30 Jun 2026 01:20:58 +0900</pubDate><guid>https://hack-le.com/conoha-vps-down-2/</guid><description>&lt;p&gt;つい先日の6/26にConoHaから障害メールがきていた。僕は障害を確認していないのだが、どうやら3月の大規模障害でさんざっぱら叩かれたのを反省したらしい。&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/image-7-700x355.png"&gt;&lt;/p&gt;&#10;&lt;p&gt;6/25 23:16に発生とあるにも関わらず、最初の障害報が6/26 3:00であるし、復旧報も自分のサーバが対象かどうかを自分で調べさせるというストロングスタイルではあるものの、メールを送るようになっただけマシになった。&lt;/p&gt;&#10;&lt;p&gt;しかしそうはいっても、障害起きすぎじゃないの、とはやはり思う。今現在、家にネット回線がきていないネット難民化しているため、このブログを含めた常時稼働のアプリケーションをConoHa VPSにうつしているため、不安になる。頼む、僕が使っている間だけは落ちてくれるな…。&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/06/image-6-700x474.png"&gt;&lt;/p&gt;&#10;&lt;p&gt;朝アクセスしようとしたその瞬間にまさに落ちたと思うわ。マジかよと思ったけど、だいたい15分くらいで復旧したかな。復旧したと信じたい。&lt;/p&gt;&#10;&lt;p&gt;朝でかつ比較的短い時間ではあったものの、X見ると僕以外にも何人かまた落ちてる？とツイしていたので、多分障害だったのだろう。というか僕のXアカウント、ConoHa VPSの死活監視botになってるわ。落ちるたびにSNSで騒いでるうえ、スクショあげたり記事にしたりまでしているので、ConoHaの中の人にマークされている気もする。とりあえずその後メールはきてないので、ConoHa的にはこれは障害ではなさそう。&lt;/p&gt;&#10;&lt;p&gt;まぁこういう感じなので、ConoHaはもう全然おすすめできるVPSではなくなってしまったね。昔はこんなに不安定じゃなかったんだけどね。。。&lt;/p&gt;&#10;&lt;div class="blog-card-wrapper"&gt;&#10; &lt;a href="https://hack-le.com/conoha-vps-down/" 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;ConoHa VPS落ちすぎ問題&lt;/div&gt;&#10; &lt;div class="blog-card-url"&gt;/conoha-vps-down/&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/eyecatch_48871_1774613666.webp" alt="ConoHa VPS落ちすぎ問題" loading="lazy" /&gt;&#10; &lt;/div&gt;&#10; &lt;/a&gt;&#10;&lt;/div&gt;&#10;&#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></channel></rss>