<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>自動化 on 或る阿呆の記</title><link>https://hack-le.com/tags/%E8%87%AA%E5%8B%95%E5%8C%96/</link><description>Recent content in 自動化 on 或る阿呆の記</description><generator>Hugo -- gohugo.io</generator><language>ja</language><lastBuildDate>Sat, 12 Sep 2026 01:10:13 +0900</lastBuildDate><atom:link href="https://hack-le.com/tags/%E8%87%AA%E5%8B%95%E5%8C%96/index.xml" rel="self" type="application/rss+xml"/><item><title>「誰にでも出来る仕事」は生物の叡智</title><link>https://hack-le.com/darenidemodekirushigoto/</link><pubDate>Sat, 12 Sep 2026 00:20:06 +0900</pubDate><guid>https://hack-le.com/darenidemodekirushigoto/</guid><description>&lt;p&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;/p&gt;&#10;&lt;p&gt;しかし&lt;strong&gt;現実世界に適用されたとき、その当たり前を面白いほど忘れます&lt;/strong&gt;。もしかすると、あなたも。&lt;/p&gt;&#10;&lt;h2 id="人手不足はaiとロボットによる自動化で解決と思ってませんか"&gt;人手不足はAIとロボットによる自動化で解決と思ってませんか&#10;&lt;/h2&gt;&lt;p&gt;たとえば、人手不足が問題だというとき、皆簡単にロボットによる自動化、機械化、AIによる置き換え、といいます。言ってますよね。出来るんですか、機械に。&lt;/p&gt;&#10;&lt;p&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;h2 id="注文の機能はタッチパネルで実現できると思ってませんか"&gt;注文の機能はタッチパネルで実現できると思ってませんか&#10;&lt;/h2&gt;&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;たとえば店の中で注文をしようとする客の、なにかしらの合図を察知し、そこに向かい、注文をきき、厨房に戻る、というのはこれはロボットには難しい&lt;/strong&gt;わけです。&lt;/p&gt;&#10;&lt;p&gt;しかし、ここでエンジニアは考えます。客がテーブルの上にあるタッチパネルを入力すればどうだろうか？それならば完全にシステム化が可能です。間違いは客の責任だし、精算や経理にも直結して効率的。なんなら客が自分のスマホで注文してくれたらタッチパネルもいらない。ええやん。&lt;/p&gt;&#10;&lt;p&gt;ということで、現在に至ります。&lt;/p&gt;&#10;&lt;p&gt;さて、これはどうでしょう、問題がなさそうでしょうか。&lt;strong&gt;もし問題がないと思うならば、誰にでも出来る仕事を簡単だと考えている、少なくともその亜種の考え方をしています&lt;/strong&gt;。どういうことか。&lt;/p&gt;&#10;&lt;p&gt;これの問題は、&lt;strong&gt;注文を受けるという仕事を、単に一つの機能だと解釈している&lt;/strong&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;居酒屋、これはもう全然合わないんじゃないでしょうか&lt;/strong&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;まぁそんなわけで、&lt;strong&gt;恐らくこの適用範囲を間違えたDXは今後も続く&lt;/strong&gt;かと思いますが、結局コストをかけて無駄なことをしているだけなので、そのうちに破綻するでしょう。セルフレジはもう既に揺り戻しが始まっているとも聞きますしね。&lt;/p&gt;&#10;&lt;p&gt;しかし何も破綻するまで待つ必要はないので、我々としては、&lt;strong&gt;誰もが出来る人類が身につけた叡智を、誇りをもってやっていきましょう&lt;/strong&gt;。&lt;/p&gt;&#10;</description></item><item><title>AndroidでLAN内DNS(AdGuard Home)にIPv4アドレスでアクセスする</title><link>https://hack-le.com/android-lan-agh-dns/</link><pubDate>Tue, 11 Aug 2026 00:00:00 +0900</pubDate><guid>https://hack-le.com/android-lan-agh-dns/</guid><description>&lt;p&gt;うちのプロバイダは楽天ひかりなのだが、楽天ひかりはIPv6必須となっている。で、LAN内DNSとしてAGHを利用しているのだが、最近のOSだとIPv6が優先されてLAN内ドメインの名前解決がうまくいかない。多分ルータとAGHでそれぞれIPv6の設定をきちんとやればうまくいくのだろうけれど1ミリもやる気が起きない。&lt;/p&gt;&#10;&lt;p&gt;なのでクライアント側でWi-fiネットワークの設定からIPv6を切っているのだが、PCはそれでよくてもスマホで詰まった。IPv6切れない。どうしてそういうことするの…。&lt;/p&gt;&#10;&lt;h2 id="環境"&gt;環境&#10;&lt;/h2&gt;&lt;ul&gt;&#10;&lt;li&gt;ルータ: TP-Link AX5400&lt;/li&gt;&#10;&lt;li&gt;サーバ: Linux Mint Xfce 22.3&#10;&lt;ul&gt;&#10;&lt;li&gt;DNS: AdGuard Home(AGH)&lt;/li&gt;&#10;&lt;li&gt;リバースプロキシ: Caddy&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;/li&gt;&#10;&lt;li&gt;Android 15 (Pixel 7)&#10;&lt;ul&gt;&#10;&lt;li&gt;RethinkDNS&lt;/li&gt;&#10;&lt;li&gt;MacroDroid&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;p&gt;やりたいことは、Android側でDNSをIPv4でAGH入れたサーバに向ける。&lt;/p&gt;&#10;&lt;h2 id="標準のdnsサーバ指定じゃいかんのか"&gt;標準のDNSサーバ指定じゃいかんのか？&#10;&lt;/h2&gt;&lt;p&gt;Androidには一応静的IPでDNSサーバを指定する機能もある。一見これでおしまいに見えるが、実際には&lt;strong&gt;IPv4のサーバアドレスしか指定できないうえに、IPv6は切れないし、IPv6で名前解決失敗したらIPv4で試すとかするわけでもない、中途半端な無能&lt;/strong&gt;。&lt;/p&gt;&#10;&lt;p&gt;なので標準の機能では無理。&lt;/p&gt;&#10;&lt;h2 id="rethinkdnsで強制する"&gt;RethinkDNSで強制する&#10;&lt;/h2&gt;&lt;p&gt;RethinkDNSをダウンロード＆インストールする。&lt;/p&gt;&#10;&lt;ol&gt;&#10;&lt;li&gt;タブバーから「構成」を選択&lt;/li&gt;&#10;&lt;li&gt;「DNS」を選択&lt;/li&gt;&#10;&lt;li&gt;「その他のDNS」&lt;/li&gt;&#10;&lt;li&gt;「DNS 53」&lt;/li&gt;&#10;&lt;li&gt;＋ボタンで追加してチェックを入れる&lt;/li&gt;&#10;&lt;/ol&gt;&#10;&lt;ul&gt;&#10;&lt;li&gt;IPアドレスとポート番号だけ記述。ポートは普通は53&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;ol start="6"&gt;&#10;&lt;li&gt;最初の画面に戻って「開始」&lt;/li&gt;&#10;&lt;/ol&gt;&#10;&lt;p&gt;これでLAN内ドメインの名前解決できるか試す。いけたらOK。&lt;/p&gt;&#10;&lt;h2 id="macrodroidでネットワークを検知してonoff"&gt;MacroDroidでネットワークを検知してOn/Off&#10;&lt;/h2&gt;&lt;p&gt;これだけだとネットワークから離脱したり入ったりするたびにRethinkDNS起動してOn/Offしないといけないめんどくさい。&lt;/p&gt;&#10;&lt;p&gt;なのでマクロアプリを入れて自動化。ここではMacroDroidをインストール＆ダウンロード&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;トリガー&lt;/li&gt;&#10;&lt;/ol&gt;&#10;&lt;ul&gt;&#10;&lt;li&gt;+を長押し&lt;/li&gt;&#10;&lt;li&gt;「Wi-fi状態の変化」&lt;/li&gt;&#10;&lt;li&gt;「ネットワークに接続時」より指定&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;ol start="3"&gt;&#10;&lt;li&gt;アクション&lt;/li&gt;&#10;&lt;/ol&gt;&#10;&lt;ul&gt;&#10;&lt;li&gt;「アプリ」「アプリを起動」より「RethinkDNS」を選択&lt;/li&gt;&#10;&lt;li&gt;「待機」で検索「1秒」&lt;/li&gt;&#10;&lt;li&gt;「機器の操作や動作」「UI画面操作」より「クリック」で「テキスト」の「開始」&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;p&gt;これでネットワークに参加したとき、自動で開始したらOK。&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;トリガー&lt;/li&gt;&#10;&lt;/ol&gt;&#10;&lt;ul&gt;&#10;&lt;li&gt;+を長押し&lt;/li&gt;&#10;&lt;li&gt;「Wi-fi状態の変化」&lt;/li&gt;&#10;&lt;li&gt;「ネットワークに切断時」より指定&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;ol start="3"&gt;&#10;&lt;li&gt;アクション&lt;/li&gt;&#10;&lt;/ol&gt;&#10;&lt;ul&gt;&#10;&lt;li&gt;「アプリ」「アプリを起動」より「RethinkDNS」を選択&lt;/li&gt;&#10;&lt;li&gt;「待機」で検索「1秒」&lt;/li&gt;&#10;&lt;li&gt;「機器の操作や動作」「UI画面操作」より「クリック」で「テキスト」の「停止」&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;p&gt;ネットワークから離脱したときに自動で停止したらOK。&lt;/p&gt;&#10;&lt;h2 id="なにもかも違ってますか"&gt;なにもかも違ってますか&#10;&lt;/h2&gt;&lt;p&gt;なにか間違っているような気がして仕方ないが、とりあえずこれで運用している。起動しながら移動していれば問題ないのだが、画面OFFにしたまま移動すると動いてない感じ。まぁでも他にやりようもなく。自分は割と外に出るときはスマホいじりながら出るので…。&lt;/p&gt;&#10;&lt;p&gt;以上。&lt;/p&gt;&#10;</description></item><item><title>荷物をバラして積み直す</title><link>https://hack-le.com/nimotsu/</link><pubDate>Fri, 24 Jul 2026 00:00:00 +0900</pubDate><guid>https://hack-le.com/nimotsu/</guid><description>&lt;p&gt;興味を惹かれたツイートがあった。&lt;/p&gt;&#10;&lt;p&gt;&lt;a class="link" href="https://twitter.com/okenokig/status/2078393251539935729?s=20" target="_blank" rel="noopener"&#10; &gt;https://twitter.com/okenokig/status/2078393251539935729?s=20&lt;/a&gt;&lt;/p&gt;&#10;&#10; &lt;blockquote&gt;&#10; &lt;p&gt;高校の時に派遣バイトでこの手の荷卸しやったなぁ。港湾の倉庫で40ftコンテナからパレットへ。&#10;「パレットごと積み込めよ…」と思っていたものの、よくよく考えれば我々の給料(日給6千円)よりもパレットの体積分の荷物の売上利益の方が大きいことに気付いて、世界の不条理さを噛み締めたのでした。&lt;/p&gt;&#10;&#10; &lt;/blockquote&gt;&#10;&lt;p&gt;さすがに人手不足の現在6,000円からは上がっているのではないかと思われるが…どうなんだろう。まぁでも、今でもあまり高くはないのだろうし、同じことをやっているのだろうということは、ツイートのさらに元ツイートまで遡ると示唆される。これは、&lt;strong&gt;労働者が安すぎることによって効率化がすすまない&lt;/strong&gt;、とは言えるだろう。&lt;/p&gt;&#10;&lt;p&gt;昔の自分なら、それを前提に本来のあるべきだった姿みたいなのを考察したような気もするんだが、今は少し思うことが違う。&lt;/p&gt;&#10;&lt;p&gt;たしかに資本効率の観点から言えば、バラして積み直すよりも、容積効率を犠牲にしてでもパレットごと積んだほうが良さそうだし、というかそうあるような仕組みにすべきだ、となる。&lt;/p&gt;&#10;&lt;p&gt;一方で、&lt;strong&gt;資源効率の観点から言えば、より少ないエネルギーで大きな仕事をしていると言えて、これは積み直したほうが正しい&lt;/strong&gt;。決して不条理ではなく、極めて合理的で意義のあることで、本来は誇るべき仕事だと思う。&lt;/p&gt;&#10;&lt;p&gt;まぁ元ツイートの環境は、資源効率を考えているわけではなく、単に資本効率の結果エネルギー資源よりも人的資源のほうが安かった結果と思われる。&lt;strong&gt;扱いが低いと仕事に尊厳も感じられず、単に搾取されているような気分になるであろうし、実態としてそうだったのだろう&lt;/strong&gt;と思う。&lt;/p&gt;&#10;&lt;p&gt;しかしやっていることは、省エネルギーな我々がその筋力と空間能力と器用さによって、限りある化石燃料でより大きな仕事をするお膳立てをしているのであって、&lt;strong&gt;もし世界で本当にSDGsと呼べるものがあるならば、これがそうなのではないか&lt;/strong&gt;。少なくとも、SDGsの講演をするために鉄の塊を飛ばすより明らかに化石燃料を節約しているといえる。チャリで来い。&lt;/p&gt;&#10;&lt;p&gt;&lt;strong&gt;化石燃料には限りがあること自体は、左派の思想信条ではなく物理的な事実でしかない&lt;/strong&gt;のだから、その節約は地球上で我々の文明を延命させるのに必要なことで、意味がある。問題はそのように考えられておらず、単に搾取になってしまっていることだ。&lt;/p&gt;&#10;&lt;p&gt;現実として我々の社会は資源主義ではなく資本主義だし、SDGsは資本主義をさらに蛸壺化させた欺瞞でしかなかった。なので&lt;strong&gt;本当に持続可能に繋がる人のちからは今なお軽んじられたまま&lt;/strong&gt;だ。&lt;/p&gt;&#10;&lt;p&gt;ただ先のとおり資源は有限であるから、&lt;strong&gt;資本主義の理屈においても、いつかはエネルギー資源と人間は資本効率において逆転することにはなる&lt;/strong&gt;だろう。多くの人はロボットやAIによるディストピアを想像するのが好きだが、現実にはロボットもAIも少なくとも省エネルギーの観点で人類にボロ負けしているし、熱力学の法則を捻じ曲げる力は持っていないので、基本的な未来予想図は変わらない。できるできないの前に、機械を動かす燃料が足りない。&lt;/p&gt;&#10;&lt;p&gt;ただそこまで資本主義がわからされるまで待つことになると、相当追い込まれていることが予想される。自動化どころではない。&lt;strong&gt;人間ができることを機械にやらせるのはもったいない&lt;/strong&gt;、となっているだろう。といっても資源主義的にはそのほうが本質ではある。&lt;/p&gt;&#10;&lt;p&gt;できるだけ早い目に考え方を転換すべきだとは思うものの、とはいえ&lt;strong&gt;短期的には資源を持っているならそれを燃やしまくってミサイル撃ちまくって支配者になるほうが、その時点における人々にとっては有利なので、無理なのかなぁ&lt;/strong&gt;。結局人は相対的な生き物で、文明を維持するために生きているわけではないからねぇ。&lt;/p&gt;&#10;&lt;p&gt;現状、僕は社会的にはもはやどうにもならないので、個々人が出来る範囲で対策を打つしかない、となってしまうのだけれど、その対策というのも具体的に考えるとけっこうなことになってしまうのだよね。難しい。&lt;/p&gt;&#10;&lt;p&gt;このままいくと、想定より早く、少なくとも僕が生きている間に目に見えて崩壊が進み、けっこうな人が認めざるを得ないところまでいくだろうと思っている。まぁどうなったとしても、その答え合わせはしたいので、できれば長く生きたいなぁという気持ちだ。その間は、今の文明の中でやりたいことをやるしかない。&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></channel></rss>