<?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%AE%85%E3%82%B5%E3%83%BC%E3%83%90%E3%83%BC/</link><description>Recent content in 自宅サーバー on 或る阿呆の記</description><generator>Hugo -- gohugo.io</generator><language>ja</language><lastBuildDate>Wed, 26 Aug 2026 01:44:57 +0900</lastBuildDate><atom:link href="https://hack-le.com/tags/%E8%87%AA%E5%AE%85%E3%82%B5%E3%83%BC%E3%83%90%E3%83%BC/index.xml" rel="self" type="application/rss+xml"/><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>セルフホストした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>LAN内DNSでIPv6は使わないのでWindowsでIPv6を無効化する</title><link>https://hack-le.com/landnsipv6windowsipv6/</link><pubDate>Thu, 30 Jul 2026 00:00:00 +0900</pubDate><guid>https://hack-le.com/landnsipv6windowsipv6/</guid><description>&lt;p&gt;AdGuard Home + Caddyで、LAN内専用のドメインがある。Windowsクライアントでアクセスしようとするが、IPv6で通信してしまったたどり着かない。プロバイダ（楽天ひかり）の関係でルータ側のIPv6は必須。なので、クライアントマシンのほうでIPv6を切る。切ってもインターネット接続はルータ側でIPv6になるので良い。&lt;/p&gt;&#10;&lt;h2 id="環境"&gt;環境&#10;&lt;/h2&gt;&lt;ul&gt;&#10;&lt;li&gt;楽天ひかり（IPv6必須）&lt;/li&gt;&#10;&lt;li&gt;ルータ: TP-Link AX5400&#10;&lt;ul&gt;&#10;&lt;li&gt;DS-Lite&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;/li&gt;&#10;&lt;li&gt;AGHのあるPC: Linux Mint Xfce 22.3&#10;&lt;ul&gt;&#10;&lt;li&gt;AdGuard Home&lt;/li&gt;&#10;&lt;li&gt;Caddy&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;/li&gt;&#10;&lt;li&gt;クライアント&#10;&lt;ul&gt;&#10;&lt;li&gt;Windows 11 Home&lt;/li&gt;&#10;&lt;li&gt;無線LAN&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;手順 by AI。&lt;/p&gt;&#10;&lt;ol&gt;&#10;&lt;li&gt;&lt;code&gt;Win + R&lt;/code&gt; キーを押し、&lt;code&gt;ncpa.cpl&lt;/code&gt; と入力してEnter（「ネットワーク接続」が開きます）。&lt;/li&gt;&#10;&lt;li&gt;使用しているネットワークアダプター（Wi-Fi または イーサネット）を右クリックして 「&lt;strong&gt;プロパティ&lt;/strong&gt;」 を開きます。&lt;/li&gt;&#10;&lt;li&gt;リストの中にある &lt;strong&gt;「インターネット プロトコル バージョン 6 (TCP/IPv6)」 のチェックを外します。&lt;/strong&gt;&lt;/li&gt;&#10;&lt;li&gt;「&lt;strong&gt;OK&lt;/strong&gt;」 を押して画面を閉じます。&lt;/li&gt;&#10;&lt;/ol&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/07/image-1.jpg"&gt;&lt;/p&gt;&#10;&lt;p&gt;ついでに、ルータのほうでDNSをAGHに向けているはずなのだが、まだ名前解決できず。&lt;/p&gt;&#10;&lt;p&gt;仕方ないのでTCP/IPv4のプロパティもいじって、DNSをAGHのアドレスに固定した。&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/linux-mint-xfce-adguard-home-tailscale/" 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;Linux Mint Xfce &amp;#43; AdGuard Home (&amp;#43;Tailscale) を構成する&lt;/div&gt;&#10; &lt;div class="blog-card-url"&gt;/linux-mint-xfce-adguard-home-tailscale/&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_48768_1776895261.webp" alt="Linux Mint Xfce &amp;#43; AdGuard Home (&amp;#43;Tailscale) を構成する" 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/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;</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>Dell Latitude 5290は中古PCサーバの母艦としていいかもしれないね、一方クライアントなら意外にも…</title><link>https://hack-le.com/dell-latitude-5290-l390-linux/</link><pubDate>Tue, 26 May 2026 00:00:00 +0900</pubDate><guid>https://hack-le.com/dell-latitude-5290-l390-linux/</guid><description>&lt;p&gt;うちには40台くらいジャンクPCがある。特に2018年前後を集めており、定番なのはLenovo ThinkPadとDel Latitudeあたりだ。このへんはまぁ安いといってもジャンクの中では高いのかもしれないのだが、既に送料で底打ちがあるため、バランスを取るならこのへんかなぁ、とは思う。ジャンクでバランスもなにもないが…。&lt;/p&gt;&#10;&lt;h2 id="結局linuxに似合う中古pcはなんなんだい"&gt;結局Linuxに似合う中古PCはなんなんだい&#10;&lt;/h2&gt;&lt;p&gt;個人的には、漁っているとFUJITSUのLIFEBOOKやPANASONICのLet&amp;rsquo;s Noteの古いやつなんかが、むしろ良いのではないか？という気がしている。流通量もそこそこあるし。あのへんはLenovoやDellとは異なる方向にブランドなので、必ずしも安くなっていない…なんなら骨董品レベルのものがやけに高く売られていることもある。あの時代のパーツがほしい人向けなんだろうか…しかしコンシューマのPCでそんなことあるかなぁ。&lt;/p&gt;&#10;&lt;p&gt;まぁなんでもいいのだけれど、無難にいくならThinkPadかLatitude、というのはそれはそう、という感じだ。ただ2018年より、ThinkPadの上位モデルであるX280以降はメモリソルダリングという悪に手を染めてしまっているため、それより一つ落ちるはずのL390のほうが、メモリの拡張性高い分使いやすいという逆転現象が起きている。筐体の無骨さもサーバ用途ならばむしろ悪くない。まぁ問題は、L390はThinkPadシリーズの中だとそんなに量が出回っていないということかな…。あと、LANポートがないのもいたいね。&lt;/p&gt;&#10;&lt;p&gt;そこでいくと、&lt;strong&gt;Dell Latitude 5290は攻守ともに強い感じ&lt;/strong&gt;だ。メモリも換えられるし。ま、ちょっと重いかな。Dellらしい無骨さではある。しかし前述したように&lt;strong&gt;サーバで無骨さは褒め言葉&lt;/strong&gt;よ。ただ同じ型番で2-in-1タイプもあるらしいが、そちらはオンボードという罠仕様になっている。まぁジャンク漁りをする人の中でも2-in-1を狙うのはさらに数寄者だろうから好きでやっているんだろうが…。&lt;/p&gt;&#10;&lt;p&gt;なので、僕はThinkPad L390を母艦にしているけれども、Dell Latitude 5290も実は候補に上がっていた。しかし結局L390になり、Latitude 5290は仕事で使うPCとして供養する流れだ。Core i5-8250Uと8GBという必要十分なスペックに、LANポートがあるのが決めてになったかな。LANポートがあると、それ経由でシングルボードな子機とサクッと接続できるのがよい。SSDは家にあった128GB SATA SSDだがね。m.2 2280フォームファクタのSATAがあるなんて、ジャンク漁るまで知らなかったよ…。&lt;/p&gt;&#10;&lt;p&gt;まぁThinkPadだのDellだのも当然のように裏蓋ネジなかったり画面TNでもやってたしCMOS切れてたり通信たまに切れたりバッテリー死んでたりするという点では変わらない。そこは安くどうにかできるならなんとかするし、できるけど高く付くならそういう使い方は諦めるという割り切りが必要だ。&lt;/p&gt;&#10;&lt;h2 id="クライアントならちょっと冒険してみて"&gt;クライアントならちょっと冒険してみて…&#10;&lt;/h2&gt;&lt;p&gt;さて少し目先を変えて、そんなサーバとかじゃなくて、普通に普段遣いでやりたいんだけど、という向きでは、僕の見た感じだと感触はかなり異なる。&lt;/p&gt;&#10;&lt;p&gt;ここで一番重要なのは液晶で、画面は生きててIPSフルHDとバッテリーとキーボードタッチパッドが生きていること、が条件となる。あとためらわないレベルで外観が保たえれていることとか（時々戦争に持っていったの？みたいな可愛そうな筐体がある…）。ここがクリアしていればあとはまぁなんとか。&lt;/p&gt;&#10;&lt;p&gt;まぁあるにはあるんだけど、普通に1万超えてくるよねこんなの。高いよ。ジャンクでも2万くらいはある。まともな中古店なら2万後半から3万しててもおかしくない。これからもっと高くなるかもな。&lt;/p&gt;&#10;&lt;p&gt;…なんですけど、PANASONICとかLIFEBOOKで捨て値になっているように、バッテリーが死にかけだけどもまだ残っていて、驚くべきことにIPS FHD（ときどきTN FHDがあるので気をつける）、みたいなのが、3000円とか5000円とかで手に入ったりすることもある（送料込み）。もちろんCPUは期待するな。Core i5第4世代でも気にするな。でもバッテリー生きてるならなんでもいいじゃない！たとえ残り39%とかだったとしても！&lt;/p&gt;&#10;&lt;p&gt;このへんのはね、まぁさすがに常用はつらいと思うけど、サーバよりも持ち運びたいタイプの特定用途のクライアントPCとして活躍の場があると思ったな。筐体のめっちゃ軽いからね。当時は最先端だったんだろう。&lt;/p&gt;&#10;&lt;p&gt;PANASONICの昔のやつとかでもボタン一つでWi-fi切り替えギミックとかほしい人はほしそうなやつあるしね。まだそこまでちゃんといじってなけど、僕はけっこういいと思ったな。&lt;/p&gt;&#10;&lt;h2 id="どんどん検証していく"&gt;どんどん検証していく&#10;&lt;/h2&gt;&lt;p&gt;40台くらいジャンク揃えたけど「完璧だ！」みたいなのマジでなくて、「こいつはここがなぁ…」のオンパレードです。今はThinkPad L390を使っていて、これは比較的の文句のないPC…に見せかけて、クリックパッド死んでたりするからねｗあとなんか全体的にもやってる。まぁあんまりメインディスプレイがっつり見ないけどね。&lt;/p&gt;&#10;&lt;p&gt;とりあえず今日現時点においては、このサイトはThinkPad L390 Core i5-8265U, 32GB RAMで動いております。RAMだけすごい。普段は3-6GBの利用料なので完全に無駄。でもこれからメインサーバの機能をうつしていったら重くなるかも。&lt;/p&gt;&#10;&lt;p&gt;最初の間は消費電力も10Wくらいだったけど、メディア系のサーバを入れ始めたから、いまは15Wくらいにあがってそうだなー…。Jellyfinとかは入れる予定ないんだけど。Immichは入れようかなぁ。家族にAppleやGoogleにお布施しているのがいたら救ってもいいんだが…。&lt;/p&gt;&#10;&lt;p&gt;この子がいつでも最後のちからを振り絞れるように、後ろに何台ものジャンクを控えさせておかないとな。そういう態勢を整えて、知見を共有していきたい。&lt;/p&gt;&#10;&lt;p&gt;まぁなんにしても、あんまり失敗したくなくて、でもLinuxほしいなぁって雑に思う人はDell Latitude 5290はいいと思うよ（2-in1は避けつつ）。ジャンクなら別途パーツ含めて1万、保証付きの中古ショップなら…25000くらいかなぁ。ジャンク市場もこれからどうなることやら…&lt;/p&gt;&#10;</description></item><item><title>Linux Mint Xfce 22.3 + LyrionMusicServer + Squeezelite で音楽生活</title><link>https://hack-le.com/linux-mint-xfce-22-3-lyrionmusicserver-squeezelite/</link><pubDate>Mon, 25 May 2026 00:00:00 +0900</pubDate><guid>https://hack-le.com/linux-mint-xfce-22-3-lyrionmusicserver-squeezelite/</guid><description>&lt;p&gt;メインサーバになりつつあるLinuxマシンに、チューナレステレビをHDMIでつなぎ、TVに光オーディオ出力でアンプに繋がっている。たいへんややこしい状況だが、どうせなら音楽はこのアンプでききたいものである。&lt;/p&gt;&#10;&lt;p&gt;ということで、音楽サーバ構築編。&lt;/p&gt;&#10;&lt;h2 id="環境"&gt;環境&#10;&lt;/h2&gt;&lt;p&gt;とてもややこしいけれども以下のような感じだ。&lt;/p&gt;&#10;&lt;pre class="mermaid" style="visibility:hidden"&gt;graph TD&#10;subgraph PCA ["PC A (操作端末 / リモコン)"]&#10;Browser["Webブラウザ / App(Material Skin UI)"]&#10;end&#10;subgraph PCB ["PC B (Linux Mint / サーバー兼再生機)"]&#10;direction TB&#10;LMS["Lyrion Music Server(楽曲管理・配信)"]&#10;subgraph AudioOutput ["音声出力プロセス"]&#10;Squeezelite["Squeezelite(再生用クライアント)"]&#10;PipeWire["PipeWire / ALSA(OS音声制御)"]&#10;end&#10;Storage[("音楽ファイル群(HDD/SSD)")]&#10;end&#10;subgraph AudioPath ["中継・出力"]&#10;TV["Mi TV(音声ハブ)"]&#10;Speaker["外部スピーカー"]&#10;end&#10;%% 接続とデータの流れ&#10;Browser -- "① 選曲・操作命令 (Port 9000)" --&gt; LMS&#10;LMS -- "② 音楽ストリーム送信 (Port 3483 / localhost)" --&gt; Squeezelite&#10;Squeezelite -- "③ 音声データ引き渡し (default出力)" --&gt; PipeWire&#10;Storage -. "スキャン (パーミッション確認済)" .-&gt; LMS&#10;%% 物理接続&#10;PipeWire == "④ HDMI出力 (DEV=3)" ==&gt; TV&#10;TV == "⑤ 光デジタル出力" ==&gt; Speaker&#10;%% スタイル設定&#10;style PCB fill:#f5f6f8,stroke:#4f5b66,stroke-width:2px&#10;style LMS fill:#d1e7dd,stroke:#0f5132&#10;style Squeezelite fill:#fff3cd,stroke:#856404&#10;style Browser fill:#cfe2ff,stroke:#084298&#10;style PipeWire fill:#e2d9f3,stroke:#4b2c7e&#10;style TV fill:#eeeeee,stroke:#666&lt;/pre&gt;&lt;p&gt;HW/SWは以下。&lt;/p&gt;&#10;&lt;ul&gt;&#10;&lt;li&gt;ThinkPad L390&#10;&lt;ul&gt;&#10;&lt;li&gt;32GB RAM&lt;/li&gt;&#10;&lt;li&gt;Linux Mint Xfce 22.3&lt;/li&gt;&#10;&lt;li&gt;squeezelite v1.9.9-1449&lt;/li&gt;&#10;&lt;li&gt;Lyrion Music Player v9.1.0&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;h3 id="lyrion-music-server"&gt;Lyrion Music Server&#10;&lt;/h3&gt;&lt;p&gt;&lt;a class="link" href="https://lyrion.org/getting-started/#configure" target="_blank" rel="noopener"&#10; &gt;Getting Started with LMS - Lyrion Music Server&lt;/a&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;wget &lt;span class="s2"&gt;&amp;#34;https://downloads.lms-community.org/LyrionMusicServer_v9.1.0/lyrionmusicserver_9.1.0_amd64.deb&amp;#34;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;sudo apt install ./lyrionmusicserver_9.1.0_amd64&#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 systemctl status lyrionmusicserver.service&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;enabledでactive(running)になっていることを確認する。&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 ufw allow 9000/tcp&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;そうしたら &lt;code&gt;http://IPアドレス:9000&lt;/code&gt;にGo。右下のNextボタンで、音楽ファイルの場所と、プレイリストを保存する場所を指定することになる。&lt;/p&gt;&#10;&lt;p&gt;ここで、ディレクトリのパーミッションは755でないとLMSが読めない。基本的にホームサーバならディレクトリは755でよいはず。外付けディスクとかでパーミッションまとめて変える必要があるときは&lt;code&gt;find&lt;/code&gt;で一気にやってしまう。たとえば&lt;code&gt;/mnt/hdd&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;find /mnt/hdd -type d -exec chmod &lt;span class="m"&gt;755&lt;/span&gt; &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;ホームディレクトリは&lt;code&gt;~/.ssh&lt;/code&gt;とかあるんでまとめてやるとか雑なことはしない。&lt;/p&gt;&#10;&lt;p&gt;さらに音楽ファイルの権限も600とかだと読めない。音楽ファイルのあるディレクトリに移動して、パーミッションを変更する。&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;find . -type f -exec chmod &lt;span class="m"&gt;644&lt;/span&gt; &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;再スキャンするときは、Web画面で歯車よりServerから再スキャン可能。&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/05/66d639db4f7220ae225dde9a4235401b-700x399.png"&gt;&lt;/p&gt;&#10;&lt;p&gt;とにかく音楽フォルダとプレイリストフォルダのパーミッションは整えてやる必要がある。ちなみにうちの場合は音楽ファイルは外付けのハードディスクドライブで、プレイリストフォルダは内蔵SSDのホームフォルダ内にしている。&lt;/p&gt;&#10;&lt;h3 id="squeezelite"&gt;Squeezelite&#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;sudo ufw allow &lt;span class="m"&gt;3483&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;sudo apt install squeezelite&#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;squeezelite -l&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;なんかいっぱい出てくる。ここでハードウェアを指定して &lt;code&gt;/etc/default/squeezelite&lt;/code&gt;を書き換えていく、ということになっているのだが…。&lt;/p&gt;&#10;&lt;p&gt;ただねぇ…僕はここから相当転がされた結果、一つの結果にたどり着いたが、これは一般的ではない、とあらかじめ申し添えておく。&lt;/p&gt;&#10;&lt;p&gt;まずapt installしたら勝手にsystemctlで動いているsqueezeliteを殺す。&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;sudo systemctl stop squeezelite.service&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;有効化はされてないのでdisableする必要はないが、もしenableしてしまったらdisableもしておく。&lt;/p&gt;&#10;&lt;p&gt;そのうえで、&lt;code&gt;~/.config/autostart&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;mkdir -p ~/.config/autostart&#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;cat &lt;span class="s"&gt;&amp;lt;&amp;lt; &amp;#39;EOF&amp;#39; &amp;gt; ~/.config/autostart/squeezelite-tv.desktop&#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;[Desktop Entry]&#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;Encoding=UTF-8&#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;Version=0.9.4&#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;Type=Application&#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;Name=Squeezelite-TV&#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;Comment=Hand-launched success command with delay&#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;Exec=bash -c &amp;#34;sleep 5 &amp;amp;&amp;amp; squeezelite -o default -n MiTV&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;OnlyShowIn=XFCE;&#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;StartupNotify=false&#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;Terminal=false&#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;Hidden=false&#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;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Execのところは適当に。&lt;code&gt;-n MiTV&lt;/code&gt;は僕がMiTV使ってるからなので。適当にわかりやすい名前にする。&lt;/p&gt;&#10;&lt;p&gt;再起動して、LMSで見つかるかどうか試す。見つかればOK。&lt;/p&gt;&#10;&lt;p&gt;これは明らかに標準の方法ではないが、これが一番安定した。systemdはクソ。昔から思ってたけど、僕の頭が悪いんだと思っていた。今となっては自信を持って言える。僕の頭が悪かろうがなんだろうが関係なくsystemdはクソ。&lt;/p&gt;&#10;&lt;h2 id="systemdはクソ"&gt;systemdはクソ&#10;&lt;/h2&gt;&lt;p&gt;疲れた。なんだかんだで半日消費した。あとは運用していきたい。&lt;/p&gt;&#10;&lt;p&gt;ちなみにフォルダ管理派はフォルダをブラウズするように設定できるが、そのへんの話はMacのときに書いたのでそちらを参照。&lt;/p&gt;&#10;&lt;div class="blog-card-wrapper"&gt;&#10; &lt;a href="https://hack-le.com/mac-mini-2018-lyrion-music-serverlms-logitech-media-server-squeezelite/" class="blog-card"&gt;&#10; &lt;div class="blog-card-content"&gt;&#10; &lt;div class="blog-card-label"&gt;&#10; &lt;svg xmlns="http://www.w3.org/2000/svg" width="13" height="13" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"&gt;&lt;path d="M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.71"&gt;&lt;/path&gt;&lt;path d="M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71"&gt;&lt;/path&gt;&lt;/svg&gt;&#10; &lt;span&gt;あわせて読みたい&lt;/span&gt;&#10; &lt;/div&gt;&#10; &lt;div class="blog-card-title"&gt;Mac mini 2018 &amp;#43; Lyrion Music Server(LMS, Logitech Media Server) &amp;#43; Squeezeliteで音楽ライフ&lt;/div&gt;&#10; &lt;div class="blog-card-url"&gt;/mac-mini-2018-lyrion-music-serverlms-logitech-media-server-squeezelite/&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/02/eyecatch_48160_1771482682.webp" alt="Mac mini 2018 &amp;#43; Lyrion Music Server(LMS, Logitech Media Server) &amp;#43; Squeezeliteで音楽ライフ" loading="lazy" /&gt;&#10; &lt;/div&gt;&#10; &lt;/a&gt;&#10;&lt;/div&gt;&#10;&#10;&lt;p&gt;ってかPipeWireって何？とか、基本的なところ理解できてないなぁと思った。systemdはクソ。&lt;/p&gt;&#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><item><title>Core i5-8xxxUをLinuxサーバにしたらメモリより先にCPUが燃え尽きる</title><link>https://hack-le.com/core-i5-8xxx-linux/</link><pubDate>Mon, 18 May 2026 00:00:00 +0900</pubDate><guid>https://hack-le.com/core-i5-8xxx-linux/</guid><description>&lt;p&gt;だからメモリ8GBでも気にしなくてｲｲﾝﾀﾞﾖ！&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/05/f17fc91e28ad6e52ef744fcab4b9ac6b.png"&gt;&lt;/p&gt;&#10;&lt;p&gt;ざっとこんな感じさ。4コアを使い尽くしているよ。でもメモリは3GBだよ。32GB刺しているのにゴミのようだ。&lt;/p&gt;&#10;&lt;p&gt;まぁこれは動画をエンコードしているのでそれはそう、ではあるのだけれど、基本的に3GBくらいが普通なんだよね。一番多いときでも7GBくらい。まだ多くの機能をIntel Mac mini 2018をやっているから、それらの機能を全部うつしたら…特にImmichなど重量級なのを移したらもっと使うだろうけれど、それにしても多分CPUのほうが先に音を上げるんじゃないかな？かな？&lt;/p&gt;&#10;&lt;p&gt;まぁディストリビューションはLinux Mint Xfceで、最新のUbuntu使ってGNOME使ってとなればこうもいかないと思う。でもそれはOSの本懐じゃないよね。CUIとか言う前にまず軽量GUIを試すべきだ。特にホームサーバにおいて、GUIは非常に有力なのだ。これを利用しないのは非常に勿体ないと思う。&lt;/p&gt;&#10;&lt;p&gt;最先端GUI or CUIってーのは極端だ。リッチなクライアントかもしくはクラウドのサーバかってそういう思考になっちゃってんじゃない。でもPCってそうじゃなかったよね。もっといくらでも良い選択肢があるのだし、それを選び扱えてこそじゃなかろうか。&lt;/p&gt;&#10;&lt;p&gt;そんなわけで、第8世代の値下がりジャンクをLinuxサーバにしてやろうという賢いユーザはメモリについて8GBで実用上十分くらいでいいんじゃないかな。&lt;/p&gt;&#10;&lt;p&gt;ちなみにこんなPCでエンコードしているのは、現在制作中のデジタルコンテンツ管理アプリ、DigitalShelf（仮）の試運転です。試運転といっても自分のデータを扱っているのでゴリゴリ本番なんだけどね。また、これは標準機能ではなくて、&lt;code&gt;ffmpeg&lt;/code&gt;を使った外部プラグインという立ち位置。外部プラグインなのでソースコードは開示しなくていいって寸法よ。別に開示してもよかったんだけど、なんかもうOSSは開示したらAIでアタックされるという酷い時代になったので、もう何もできないよね。&lt;/p&gt;&#10;&lt;p&gt;まぁ僕もAI使ってアプリ作っているわけだが…。激動の時代だけれど、結局shは動いているという事実を大事にして明日を生きよう。&lt;/p&gt;&#10;</description></item></channel></rss>