<?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/categories/%E3%82%BB%E3%83%AB%E3%83%95%E3%83%9B%E3%82%B9%E3%83%88%E3%81%AE%E3%81%99%E3%82%9D%E3%82%81/</link><description>Recent content in セルフホストのすゝめ on 或る阿呆の記</description><generator>Hugo -- gohugo.io</generator><language>ja</language><lastBuildDate>Fri, 30 Oct 2026 21:43:01 +0900</lastBuildDate><atom:link href="https://hack-le.com/categories/%E3%82%BB%E3%83%AB%E3%83%95%E3%83%9B%E3%82%B9%E3%83%88%E3%81%AE%E3%81%99%E3%82%9D%E3%82%81/index.xml" rel="self" type="application/rss+xml"/><item><title>AIの力を借りつつWordPressサイトをHugoに移行</title><link>https://hack-le.com/ai-wordpress-hugo/</link><pubDate>Sun, 01 Nov 2026 00:00:00 +0900</pubDate><guid>https://hack-le.com/ai-wordpress-hugo/</guid><description>&lt;p&gt;久しぶりのセルフホストな記事。&lt;/p&gt;&#10;&lt;p&gt;このブログはまだWordPressなんですが、サブブログをWordPressからHugoに移行しました。理由は主に昨今のサイバー攻撃の激化のためです。WordPressが悪いというわけではないのですが、アタックサーフェスの大きさやPHPの特性を考えると、正直これからの時代厳しいように思われました。毎日のように「プラグインの更新してないぞ」「このIPアドレスから阿呆みたいなブルートフォースアタックきてるぞ」という通知がくるのも疲れましたし。&lt;/p&gt;&#10;&lt;p&gt;なので、昔に戻ってスタティックなコンテンツ配信に徹しよう、というような感じです。&lt;/p&gt;&#10;&lt;h2 id="wordpressからhugoへ"&gt;WordPressからHugoへ&#10;&lt;/h2&gt;&lt;p&gt;今回手始めに移行したのは、AIに記事を書かせている邪悪なサイトです。こんな感じに変わりました。&lt;/p&gt;&#10;&lt;p&gt;&lt;img loading="lazy" sizes="(max-width: 767px) calc(100vw - 30px), (max-width: 1023px) 700px, (max-width: 1279px) 950px, 1232px" src="https://hack-le.com/images/uploads/2026/10/4c18bf39ad7feab65dab790a189436fa-699x492.webp"&gt;&lt;/p&gt;&#10;&lt;p&gt;&lt;em&gt;before&lt;/em&gt;&lt;/p&gt;&#10;&lt;p&gt;&lt;img loading="lazy" sizes="(max-width: 767px) calc(100vw - 30px), (max-width: 1023px) 700px, (max-width: 1279px) 950px, 1232px" src="https://hack-le.com/images/uploads/2026/10/8a3acbd3dd44c0b47589270fe46742b3-699x493.webp"&gt;&lt;/p&gt;&#10;&lt;p&gt;&lt;em&gt;after&lt;/em&gt;&lt;/p&gt;&#10;&lt;p&gt;なんだかんだで移行まで3日くらいかな。正直AIなかったらしんどすぎて無理ってなったと思います。でも移行を決めたのはAIによるサイバー攻撃の激化のためなので、AIのおかげで言っていいのかどうかは微妙なところです。&lt;/p&gt;&#10;&lt;p&gt;ここからまた色々と手を加えつつ運用をして、課題を洗い出しながら、本ブログであるこのサイトの移行の準備を進めます。このサイトは14年続いているだけあって色々な歴史が不思議なHTMLタグとなって残っているため、すんなりとはいかないでしょう。AIにめっちゃ調査させながら進めていくことになるでしょうね。かなり時間がかかると思います。仕方無い。来月中にできるといいな。&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;cf(Cloudflare)&#10;wp(WordPressコンテナ)&#10;cf ---&gt;|トンネル| wp&lt;/pre&gt;&lt;p&gt;これが今回、ちょっと複雑になりました。というのも、私は自作の管理アプリケーションがあり、そこで記事の執筆などもしたいためです。こんな感じのアプリでやってます。&lt;/p&gt;&#10;&lt;p&gt;&lt;img loading="lazy" sizes="(max-width: 767px) calc(100vw - 30px), (max-width: 1023px) 700px, (max-width: 1279px) 950px, 1232px" src="https://hack-le.com/images/uploads/2026/10/209db6e9e19dbc87e24b33e530223f49-699x501.webp"&gt;&lt;/p&gt;&#10;&lt;p&gt;記事執筆と管理系のがずらずらと。ちなみにサイトトップの古のアクセスカウンタもこのアプリケーション上でウィジェットを作っています（アクセス解析自体はOSSのUmamiを使わせていただいております）。ウィジェットのみグローバルに公開して、内部のアプリケーションはLAN内限定です。&lt;/p&gt;&#10;&lt;p&gt;執筆機能は重要です。そもそもWordPressを使っていたのも、ぶっちゃけWYSIWYGで編集してその場で公開できなきゃいやだいという運用上の理由が大きかったです。デザインはどうでもよい。なので、Hugoに移行するとしてもエディタを用意できることはマストでした。このへんはAIのおかげでやれるようになったと言っていいでしょう。&lt;/p&gt;&#10;&lt;p&gt;ただこういうややこしいことをする以上、Hugo側の管理と衝突するために、アーキテクチャはどうしても考えるところが生じます。今回は以下の構成に行き着きました。&lt;/p&gt;&#10;&lt;pre class="mermaid" style="visibility:hidden"&gt;flowchart TD&#10;subgraph Internet["インターネット"]&#10;User["閲覧者ブラウザ"]&#10;end&#10;subgraph Cloudflare["Cloudflare Edge"]&#10;CDN["Cloudflare DNS / CDN"]&#10;CFTunnel["Cloudflare Tunnel Edge"]&#10;end&#10;subgraph Server["自宅・ホストサーバー（完全閉域）"]&#10;subgraph Delivery["配信基盤 (Docker)"]&#10;TunnelApp["cloudflared コンテナ"]&#10;Caddy["Caddy Webサーバー (ポート開放なし)"]&#10;StaticFiles["静的ファイル (HTML / CSS / 画像)"]&#10;end&#10;subgraph Management["執筆・ビルド基盤"]&#10;Dashboard["Web管理画面 (Blog Dashboard)"]&#10;Hugo["Hugo (静的サイト生成)"]&#10;Source["Markdown記事"]&#10;end&#10;end&#10;%% 閲覧フロー&#10;User --&gt;|HTTPS| CDN&#10;CDN --&gt; CFTunnel&#10;CFTunnel -.-&gt;|アウトバウンド常時接続| TunnelApp&#10;TunnelApp --&gt; Caddy&#10;Caddy --&gt;|読み取り専用| StaticFiles&#10;%% 執筆フロー&#10;Dashboard --&gt;|記事保存| Source&#10;Dashboard --&gt;|ビルド実行| Hugo&#10;Source -.-&gt; Hugo&#10;Hugo --&gt;|HTML出力| StaticFiles&lt;/pre&gt;&lt;p&gt;Hugo環境はコンテナに隔離して、cloudflaredよりトンネル経由で外からアクセスする感じです。Cloudflare依存になってるやんと見えますが、まぁそうなんですが、別に使えなくなったらVPSからfrpなりなんなり使った構成に切り替えればいいだけなので、まぁいいかなと。さらに言えばサイト公開するマシンはそれ専用にする予定です（まだ徹底はできていない）。&lt;/p&gt;&#10;&lt;p&gt;そんで、記事の生成とかビルドの実行とかは、全部管理アプリケーション上でやる構成ですね。一言で言えば管理アプリケーションが正本となる構成です。Hugoリポジトリは中継地点ないしバックアップの役割になります。なのでCI/CDによるホスティングではないです。これによる制約はいくつかあります。主に運用上の制約は以下になるでしょうか。&lt;/p&gt;&#10;&lt;ul&gt;&#10;&lt;li&gt;管理アプリケーションとHugoのホスティング環境が同一のマシン上にあること（変えてもいいんだがややこしくなり思想から外れる）&lt;/li&gt;&#10;&lt;li&gt;普段は管理アプリケーションからHugoリポジトリのpush/pullを実行するが、Hugo側のデザイン変更時（特に記事データに特殊な記法を挿入する時）はローカルのHugoリポジトリでpushする、2つのワークフローが存在すること&lt;/li&gt;&#10;&lt;li&gt;CI/CDでブランチごとにホスティングしてステージング環境作るとかはできない（できないことはないが構成と運用がややこしくなり、設計思想から外れる）&lt;/li&gt;&#10;&lt;/ul&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;とまぁこんな感じでやっていて思ったんですが、AIで楽になったと言っていいんですかねぇ…。25年前は専門じゃなくてもやる気があれば頑張ってサイトを持つことができたと思うんですけれど、今はこれちょっとどうなんでしょう…。&lt;/p&gt;&#10;&lt;p&gt;トンネル技術とコンテナが揃った時には、個人サイトやセルフホストがまたやりやすい時代になった！と思ったのですけれど、サイバー攻撃がヤバいから守備を固めよう、WordPressはよくない、でも運用が不便になって更新しなくなったら元も子もないから利便性も高めよう、みたいなことを考え始めると、AIによる効率化以上に、トータルの難易度自体は上がり続けているような気がします…。&lt;/p&gt;&#10;&lt;p&gt;いやまぁ、僕がややこしくしているだけか。&lt;/p&gt;&#10;&lt;p&gt;これはまぁ結局、何をどこまで信じるか、という話です。少し前までだとVPSやクラウド基盤そのものを疑うのはキチガイ扱いだったかもしれないのですが、最近お名前.comデスクトップクラウドが基盤ごとやられて顧客の資産がハッカーの攻撃により消失し、さらにGMOが顧客の端末を回収するため物理的に全国を駆けずり回ったという事件は、クラウドは絶対安全ではないという当たり前の技術的な真実を曝け出しました。ま…それでAWSをはじめメガクラウドが陥落するかと言えば別にそういうわけではないですけれど、でもメガクラウドだから安全だ、は技術ではなく信仰でしょう。&lt;/p&gt;&#10;&lt;p&gt;結局個人サイトって自分の城です。城をどこにたてますか、どうなったらその城はぶち壊れますか、あなたはそれに納得できますかと、そういう話なんだと思います。絶対防御は無理なので、そのうえで何を賭けるのか。それを考え始めると、やりたいことに対して、本気でぶち壊そうとする勢力、さらにその被害が大きくなりすぎて、それが多分根本的な問題なのだと思います。&lt;/p&gt;&#10;&lt;p&gt;僕の構成がややこしくなっているのは、それだけ僕が納得するのに必要になってしまったということはあります。別にもっとシンプルな構成は可能です。元々のようにCloudflareトンネルでWordPressコンテナ直通でも良いといえばそうなので。ちゃんと更新し続けて、今回のPHP事件みたいなのがあったらキャッチアップして…ってやっても、基本は大丈夫でしょう。心配なら物理的にサイト専用のマシン作って切り離すくらいで、ほぼほぼ問題ないと言って思います（まぁそれも普通からするとややこしいわけですが…）。&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/ai-cyber-attack/" class="blog-card"&gt;&#10; &lt;div class="blog-card-content"&gt;&#10; &lt;div class="blog-card-label"&gt;&#10; &lt;svg xmlns="http://www.w3.org/2000/svg" width="13" height="13" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"&gt;&lt;path d="M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.71"&gt;&lt;/path&gt;&lt;path d="M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71"&gt;&lt;/path&gt;&lt;/svg&gt;&#10; &lt;span&gt;あわせて読みたい&lt;/span&gt;&#10; &lt;/div&gt;&#10; &lt;div class="blog-card-title"&gt;AIによるサイバー攻撃時代の個人サイト・個人ブログのセキュリティ&lt;/div&gt;&#10; &lt;div class="blog-card-url"&gt;/ai-cyber-attack/&lt;/div&gt;&#10; &lt;/div&gt;&#10; &lt;div class="blog-card-thumbnail"&gt;&#10; &lt;img src="https://hack-le.com/images/uploads/2026/10/eyecatch_53756_1792651216.webp" alt="AIによるサイバー攻撃時代の個人サイト・個人ブログのセキュリティ" loading="lazy" /&gt;&#10; &lt;/div&gt;&#10; &lt;/a&gt;&#10;&lt;/div&gt;&#10;&#10;&lt;div class="blog-card-wrapper"&gt;&#10; &lt;a href="https://hack-le.com/aisoftware/" class="blog-card"&gt;&#10; &lt;div class="blog-card-content"&gt;&#10; &lt;div class="blog-card-label"&gt;&#10; &lt;svg xmlns="http://www.w3.org/2000/svg" width="13" height="13" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"&gt;&lt;path d="M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.71"&gt;&lt;/path&gt;&lt;path d="M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71"&gt;&lt;/path&gt;&lt;/svg&gt;&#10; &lt;span&gt;あわせて読みたい&lt;/span&gt;&#10; &lt;/div&gt;&#10; &lt;div class="blog-card-title"&gt;AIでソフトウェアの作成は楽になったが、結局最後は泥臭い&lt;/div&gt;&#10; &lt;div class="blog-card-url"&gt;/aisoftware/&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_50962_1785770655.webp" alt="AIでソフトウェアの作成は楽になったが、結局最後は泥臭い" loading="lazy" /&gt;&#10; &lt;/div&gt;&#10; &lt;/a&gt;&#10;&lt;/div&gt;&#10;&#10;</description></item><item><title>AIによるサイバー攻撃時代の個人サイト・個人ブログのセキュリティ</title><link>https://hack-le.com/ai-cyber-attack/</link><pubDate>Sat, 24 Oct 2026 00:00:00 +0900</pubDate><guid>https://hack-le.com/ai-cyber-attack/</guid><description>&lt;p&gt;定期的にくる全裸待機イベントがPHPに襲来。&lt;/p&gt;&#10;&lt;p&gt;&lt;a class="link" href="https://www.google.com/preferences/source?q=https://www.itmedia.co.jp" target="_blank" rel="noopener"&#10; &gt;PHPに「緊急」レベルの脆弱性2件 修正版を日本時間21日深夜に公開へ、事前準備を呼び掛け - ITmedia NEWS&lt;/a&gt;&lt;/p&gt;&#10;&lt;p&gt;全裸で待て！&lt;/p&gt;&#10;&lt;h2 id="とにかく地球がヤバい"&gt;とにかく地球がヤバい&#10;&lt;/h2&gt;&lt;p&gt;技術的な詳細が不明なのは仕方無いですが、「とにかくやべぇからPHPユーザは全員23時全裸な！」ということで、こういうことがあると、WordPressユーザとしては限界みを感じます。特に昨今はAIのせいでサイバー攻撃が激化していることもあり、それは自動ですから、場末の当サイトも常にアタックを受けていることを思うと、対策しないわけにもいきません。&lt;/p&gt;&#10;&lt;p&gt;そんでまぁ、当日こられた方は珍しくサイトに赤帯出ているのを見たかもしれません。&lt;/p&gt;&#10;&lt;p&gt;&lt;img loading="lazy" sizes="(max-width: 767px) calc(100vw - 30px), (max-width: 1023px) 700px, (max-width: 1279px) 950px, 1232px" src="https://hack-le.com/images/uploads/2026/10/ae95058eacfff45e2ba2c1dfd4feedce-698x208.webp"&gt;&lt;/p&gt;&#10;&lt;p&gt;で、23時前からしばらく落としました。&lt;/p&gt;&#10;&lt;p&gt;それでまぁしばらくは、X上でも様々な人が話題にしていて、少し本当にお祭りのような気分になりテンションも上がりました。&lt;/p&gt;&#10;&lt;p&gt;&lt;a class="link" href="https://www.itmedia.co.jp/news/article/2610/21/2000002472/" target="_blank" rel="noopener"&#10; &gt;著名ITサービス相次いで緊急メンテへ コドモン、シャドバ、BASE、さくらのレンタルサーバなど 「PHP」脆弱性に起因か（1/2 ページ） - ITmedia NEWS&lt;/a&gt;&lt;/p&gt;&#10;&lt;p&gt;当サイトはDocker版のため、大元のPHPの更新から降ってくるまでけっこう時間がかかりました。一人ポチポチと下記コマンドでDocker版の更新はまだかなぁと確認していました。&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;curl -s &lt;span class="s2"&gt;&amp;#34;https://hub.docker.com/v2/repositories/library/wordpress/tags/latest&amp;#34;&lt;/span&gt; &lt;span class="p"&gt;|&lt;/span&gt; grep -o &lt;span class="s1"&gt;&amp;#39;&amp;#34;last_updated&amp;#34;:&amp;#34;[^&amp;#34;]*&amp;#34;&amp;#39;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;これの結果が2026-10-21T14:00より後になったらOKなのですが、結局&lt;code&gt;&amp;quot;last_updated&amp;quot;:&amp;quot;2026-10-21T17:50:57.852281Z&amp;quot;&lt;/code&gt;を確認できたのは夜中の3時くらいだったかな。お、と思ってイメージ更新して、バージョンを確認します。&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ docker run --rm wordpress:latest php -v&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;PHP 8.3.36 &lt;span class="o"&gt;(&lt;/span&gt;cli&lt;span class="o"&gt;)&lt;/span&gt; &lt;span class="o"&gt;(&lt;/span&gt;built: Oct &lt;span class="m"&gt;21&lt;/span&gt; &lt;span class="m"&gt;2026&lt;/span&gt; 15:57:18&lt;span class="o"&gt;)&lt;/span&gt; &lt;span class="o"&gt;(&lt;/span&gt;NTS&lt;span class="o"&gt;)&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;OK、ということでサイト復活。この頃になると大方みんな対策が終わっており、Docker版を話題にしている人はほとんどおらず、なにしてるんだろうなぁという気分になっていました。&lt;/p&gt;&#10;&lt;p&gt;&lt;img loading="lazy" sizes="(max-width: 767px) calc(100vw - 30px), (max-width: 1023px) 700px, (max-width: 1279px) 950px, 1232px" src="https://hack-le.com/images/uploads/2026/10/a20dfba51fcc24faca752c3396908ed7-697x232.webp"&gt;&lt;/p&gt;&#10;&lt;p&gt;せっかく頑張ったので青帯で頑張りましたの告知を誰に向けたわけでもなくしています。複数サイトやってるので対策は複数やったのですが、このサイトでしか帯は出していません。所詮個人サイト、告知というより祭り参加表明だったので…。場末でも一応今も技術系のサイトのつもりだしね。&lt;/p&gt;&#10;&lt;h2 id="実際の所脅威はどれくらいだったの"&gt;実際の所脅威はどれくらいだったの？&#10;&lt;/h2&gt;&lt;p&gt;終わってみると、かねてより考えてはやめていた脱WordPress計画も現実味を帯びてきます。今回のようなことが今後もけっこうありそうだな、とまず思えました。地味にNode.jsも騒がれていましたしね（「&lt;a class="link" href="https://forest.watch.impress.co.jp/docs/news/2150169.html" target="_blank" rel="noopener"&#10; &gt;「Node.js」にセキュリティ更新 ～10件の脆弱性を修正、「eMudhra」の侵害にも対応 - 窓の杜&lt;/a&gt;」）。&lt;/p&gt;&#10;&lt;p&gt;しかし実際のところ、今回の脅威（後にphp2shellとされる）が本当にどれほどの被害をもたらすものだったのかは謎です。真の影響力について実はちょっと疑っています。CVSSスコア9.2とか数字ばかり独り歩きし、対策しなければサービスにあらずみたいな空気が醸成されても、本当のところどうだったのかはわからないわけでしょう。試みがあったということ自体は既に「&lt;a class="link" href="https://www.itmedia.co.jp/news/article/2610/22/2000002516/" target="_blank" rel="noopener"&#10; &gt;PHP「緊急」脆弱性悪用の試み、数百万件に CloudflareのCEOが報告 - ITmedia NEWS&lt;/a&gt;」のようにニュースになっていますけれど、ではそれでどうかなったのか…。&lt;/p&gt;&#10;&lt;p&gt;この手のものは、何か起きていた時にはもう遅いのだとか、未来の危機を予言した預言者が迫害されるとか、まぁそんな話になるわけですが、しかし今回については、&lt;strong&gt;PHPサイトの有名どころとしてアンサイクロペディアがノーガード戦法だったらしい&lt;/strong&gt;ので、今後このサイトがどうなるのかでわかるかもしれません。&lt;/p&gt;&#10;&lt;p&gt;&lt;img loading="lazy" sizes="(max-width: 767px) calc(100vw - 30px), (max-width: 1023px) 700px, (max-width: 1279px) 950px, 1232px" src="https://hack-le.com/images/uploads/2026/10/be247649b0f4f71ec274c138f61f82e2-698x355.webp"&gt;&lt;/p&gt;&#10;&lt;p&gt;&lt;a class="link" href="https://ansaikuropedia.org/wiki/UnNews:PHP%E3%81%AB%E5%8F%B2%E4%B8%8A%E6%9C%80%E6%82%AA%E7%B4%9A%E3%81%AE%E7%A9%B4%E3%80%81%E4%B8%96%E7%95%8C%E3%81%8C%E4%BA%88%E9%98%B2%E5%81%9C%E6%AD%A2%E3%81%99%E3%82%8B%E4%B8%AD%E3%82%A2%E3%83%B3%E3%82%B5%E3%82%A4%E3%82%AF%E3%83%AD%E3%83%9A%E3%83%87%E3%82%A3%E3%82%A2%E3%81%A0%E3%81%91%E6%AD%A2%E3%82%81%E3%82%89%E3%82%8C%E3%82%8B%E4%BA%BA%E3%81%8C%E3%81%8A%E3%82%89%E3%81%9A%E5%B9%B3%E5%B8%B8%E9%81%8B%E8%BB%A2%E3%80%82" target="_blank" rel="noopener"&#10; &gt;UnNews:PHPに史上最悪級の穴、世界が予防停止する中アンサイクロペディアだけ止められる人がおらず平常運転。 - アンサイクロペディア&lt;/a&gt;&lt;/p&gt;&#10;&lt;p&gt;サイト内でもネタにされています。しかしまだやってたんですね。元気そうでなにより。&lt;/p&gt;&#10;&lt;p&gt;ま、&lt;strong&gt;だからといって事前に脅威を告知されればやらないわけにはいかない&lt;/strong&gt;んですが…今回の脅威はOpenAIが検知したとのことでしたけれど、世界中が一斉に全裸待機するほどのものだったのかな…とは少し思います。個人的には見えている脅威はそりゃ対応すべきだと思うんですが、祭り状態になるのも何か違和があります。&lt;/p&gt;&#10;&lt;p&gt;今後こんな感じでAIにより新たな脆弱性発見！深刻度9.3…9.4…100だーーーー！全裸で待て！とか毎日のように言われることになったら、みんなどこまでついていくんだろう。&lt;strong&gt;どうせ侵入されても詫びメール一本で済ます癖に&lt;/strong&gt;…（余計なこと）。今回総理大臣までツイートしていましたが、総理のツイートは脆弱性の報告で埋まるんでしょうか。&lt;/p&gt;&#10;&lt;p&gt;怪しいもんです。対応した中の人はこれが技術的に必要なことだという思いで対応されたかもしれませんが、組織の観点では、やるべきことはやりましたというポージング、免責の観点でコストを払っているように思われます。でなければ、&lt;strong&gt;事前対応は熱心なのに、いざ本当にインシデントが起きたら詫びメール1本で済ませようとする態度&lt;/strong&gt;は説明がつきません…。ま、情報漏洩のエース・タイムズカーはPHPではなかったようですが（永遠に言い続ける）。&lt;/p&gt;&#10;&lt;h2 id="クラウドなら安心伝説"&gt;クラウドなら安心伝説&#10;&lt;/h2&gt;&lt;p&gt;まぁそうはいっても、現実上のセキュリティリスクは確かに上がっているのでしょう。&lt;strong&gt;求められるセキュリティパッチの適用であるとか、対策なんかは、これから目に見えて高まっていくのかなぁ&lt;/strong&gt;、という感じはしています。&lt;/p&gt;&#10;&lt;p&gt;これについて、中小まして個人が防ぎ切るのはもう無理だ、クラウドに任せよう！みたいな論調も最近はちらほら見かけるのですが、大手クラウドなら信用できるのか？と思います。実際、最近俺たちのGMOがやられました。&lt;/p&gt;&#10;&lt;p&gt;&lt;a class="link" href="https://www.itmedia.co.jp/news/article/2610/21/2000002442/" target="_blank" rel="noopener"&#10; &gt;「お名前.com デスクトップクラウド」不正プログラム設置で全プラン停止 FX用VPS、2万6739サーバに影響か - ITmedia NEWS&lt;/a&gt;&lt;/p&gt;&#10;&lt;p&gt;これは記事だと実際どこまで基盤に侵入されたのかわからないんですが、&lt;strong&gt;不正にプログラム設置されてる&lt;/strong&gt;んですよね。少なくともそこにおいては実行権限まで取られている中で、本当にGMOの言う通り情報閲覧があるかも程度の被害なのかな…僕がユーザだったらちょっと信じられないですけどね。まぁ実際被害者は滅茶苦茶可哀想ですよ、FX自動取引の基盤でしょう。つらすぎる（実感）。&lt;/p&gt;&#10;&lt;p&gt;……とか書いて予約投稿していたんですが、Xを見ていたら次の展開が。&lt;/p&gt;&#10;&lt;p&gt;&lt;img loading="lazy" sizes="(max-width: 767px) calc(100vw - 30px), (max-width: 1023px) 700px, (max-width: 1279px) 950px, 1232px" src="https://hack-le.com/images/uploads/2026/10/image-2-699x833.png"&gt;&lt;/p&gt;&#10;&lt;p&gt;&lt;em&gt;&lt;a class="link" href="https://x.com/yutoriineet/status/2113264833307267254?s=20" target="_blank" rel="noopener"&#10; &gt;https://x.com/yutoriineet/status/2113264833307267254?s=20&lt;/a&gt;&lt;/em&gt;&lt;/p&gt;&#10;&lt;p&gt;口座破綻させられているのあまりにも悲惨で可哀想過ぎる。ご愁傷さまです……。これマジで洒落にならない金額の被害が出ているのでは。やっぱり情報閲覧程度じゃなかったのか。攻撃されたといえば企業は被害者だが、&lt;strong&gt;本当の被害者は企業を信じて情報を預けたのに漏洩されたユーザで、企業はその被害を隠蔽と過小申告するモチベがある&lt;/strong&gt;から信じられない。&lt;strong&gt;報道する側も企業側の言うことをそのまんま垂れ流すだけじゃダメ&lt;/strong&gt;だし、&lt;strong&gt;見る側ももっと疑う必要がある&lt;/strong&gt;。……と言い始めるとちょっと話が完全に逸れるので、本件滅茶苦茶興味深いけどここまでにしておいて…。&lt;/p&gt;&#10;&lt;p&gt;まぁこういう投資にかかるサービスで、クラウドを銘打ったサービスで、GMOがやられた、というのはこれは重たいんじゃないでしょうか（GMOだけど）。いや、ここでいうクラウドとはAWS/GCP/Azure/OCIとかそのへんのことを言うのだ、&lt;strong&gt;AWSにあらずんばクラウドにあらず&lt;/strong&gt;みたいなことは言えるかもしれないし、実際信用レベルでいえばまだかなり差があるのはそうなんですけれど、しかしAWSだから大丈夫だ、は原理原則の話をするならやはりあり得ず、それは&lt;strong&gt;技術的判断というより信仰&lt;/strong&gt;というべきではないでしょうか。&lt;/p&gt;&#10;&lt;p&gt;一方でAWSがやられたらもう仕方ない、は現実的な妥協点として言えるかもしれません。もしかしたらそういう気持ちは業界としてあるのかなぁという気もするし、正直私も組織のエンジニアの立場ならそう言ってしまう気はします。ただ一人の場末の管理者として考えた時、それはすごく納得できません。&lt;/p&gt;&#10;&lt;p&gt;まぁこれは信条なので並行線なんですけれど、&lt;strong&gt;ただ個々人がそれぞれ自分の城で守るのは合理の観点でも無謀とは言えません&lt;/strong&gt;。まず分散されることによって、攻撃側は攻撃成功時の報酬が下がるため、モチベーションが著しく低下します。多くの小規模サービス・サイトで標的型攻撃の的になる可能性はかなり下がるでしょう。また、自分ところでの対策はネットワーク層、物理層などあらゆるところで対策が打てるため、本当に必要な保護を必要なだけやることができます。極端なことを言えば最終奥義物理遮断も可能です。&lt;/p&gt;&#10;&lt;p&gt;一方で大手サービスは高い壁があるものの、その壁を超えられると全員巻き添えでとんでもない被害になりますし、またその時出来ることは非常に限られています。&lt;/p&gt;&#10;&lt;p&gt;まぁイメージとしては高い壁に囲まれたデカくて整った街にレンタルオフィスを構えるか、孤島に手作りの拠点を構えるのかという違いになるわけですけれど、&lt;strong&gt;AIがあろうがなかろうが、リスクのトレードオフの本質が変わらない以上、どちらが間違っているとも言えない&lt;/strong&gt;んじゃないでしょうか。少なくとも私は討ち死にするならせめて自分の居場所で死にたい。&lt;/p&gt;&#10;&lt;p&gt;まぁそうは言っても、自動攻撃も今後激しくなっていくことは予想され、無駄にアタックサーフェスが多いことから、WordPressはちょっと限界を感じています。そろそろ10年ぶりくらいのサイト大改造に着手する時がきたのだろうか…。&lt;/p&gt;&#10;&lt;p&gt;&amp;lt;関連記事&amp;gt;&lt;/p&gt;&#10;&lt;div class="blog-card-wrapper"&gt;&#10; &lt;a href="https://hack-le.com/timescar/" class="blog-card"&gt;&#10; &lt;div class="blog-card-content"&gt;&#10; &lt;div class="blog-card-label"&gt;&#10; &lt;svg xmlns="http://www.w3.org/2000/svg" width="13" height="13" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"&gt;&lt;path d="M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.71"&gt;&lt;/path&gt;&lt;path d="M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71"&gt;&lt;/path&gt;&lt;/svg&gt;&#10; &lt;span&gt;あわせて読みたい&lt;/span&gt;&#10; &lt;/div&gt;&#10; &lt;div class="blog-card-title"&gt;タイムズカー情報漏洩被弾しました＼(^o^)／前代未聞の運転免許証シェアリングサービスここに爆誕！！&lt;/div&gt;&#10; &lt;div class="blog-card-url"&gt;/timescar/&lt;/div&gt;&#10; &lt;/div&gt;&#10; &lt;div class="blog-card-thumbnail"&gt;&#10; &lt;img src="https://hack-le.com/images/uploads/2026/10/eyecatch_53293_1790784350.webp" alt="タイムズカー情報漏洩被弾しました＼(^o^)／前代未聞の運転免許証シェアリングサービスここに爆誕！！" loading="lazy" /&gt;&#10; &lt;/div&gt;&#10; &lt;/a&gt;&#10;&lt;/div&gt;&#10;&#10;&lt;div class="blog-card-wrapper"&gt;&#10; &lt;a href="https://hack-le.com/timescar-yakinikuking/" class="blog-card"&gt;&#10; &lt;div class="blog-card-content"&gt;&#10; &lt;div class="blog-card-label"&gt;&#10; &lt;svg xmlns="http://www.w3.org/2000/svg" width="13" height="13" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"&gt;&lt;path d="M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.71"&gt;&lt;/path&gt;&lt;path d="M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71"&gt;&lt;/path&gt;&lt;/svg&gt;&#10; &lt;span&gt;あわせて読みたい&lt;/span&gt;&#10; &lt;/div&gt;&#10; &lt;div class="blog-card-title"&gt;タイムズカーと焼肉きんぐの個人情報漏洩における深刻さのベクトルの違い&lt;/div&gt;&#10; &lt;div class="blog-card-url"&gt;/timescar-yakinikuking/&lt;/div&gt;&#10; &lt;/div&gt;&#10; &lt;div class="blog-card-thumbnail"&gt;&#10; &lt;img src="https://hack-le.com/images/uploads/2026/10/eyecatch_53550_1791737979.webp" alt="タイムズカーと焼肉きんぐの個人情報漏洩における深刻さのベクトルの違い" loading="lazy" /&gt;&#10; &lt;/div&gt;&#10; &lt;/a&gt;&#10;&lt;/div&gt;&#10;&#10;&lt;div class="blog-card-wrapper"&gt;&#10; &lt;a href="https://hack-le.com/securityrisk/" class="blog-card"&gt;&#10; &lt;div class="blog-card-content"&gt;&#10; &lt;div class="blog-card-label"&gt;&#10; &lt;svg xmlns="http://www.w3.org/2000/svg" width="13" height="13" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"&gt;&lt;path d="M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.71"&gt;&lt;/path&gt;&lt;path d="M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71"&gt;&lt;/path&gt;&lt;/svg&gt;&#10; &lt;span&gt;あわせて読みたい&lt;/span&gt;&#10; &lt;/div&gt;&#10; &lt;div class="blog-card-title"&gt;セキュリティリスク再考 KADOKAWAの情報漏洩レベルでも特損36億円らしい&lt;/div&gt;&#10; &lt;div class="blog-card-url"&gt;/securityrisk/&lt;/div&gt;&#10; &lt;/div&gt;&#10; &lt;div class="blog-card-thumbnail"&gt;&#10; &lt;img src="https://hack-le.com/images/uploads/2026/09/eyecatch_15193_1789095846.webp" alt="セキュリティリスク再考 KADOKAWAの情報漏洩レベルでも特損36億円らしい" loading="lazy" /&gt;&#10; &lt;/div&gt;&#10; &lt;/a&gt;&#10;&lt;/div&gt;&#10;&#10;</description></item><item><title>LoPiQ v1.18.10 を公開。Windows対応、切り抜き、Exif、AI生成パラメータ確認など</title><link>https://hack-le.com/lopiq-v1-18-10/</link><pubDate>Mon, 19 Oct 2026 00:00:00 +0900</pubDate><guid>https://hack-le.com/lopiq-v1-18-10/</guid><description>&lt;p&gt;Webブラウザで画像の閲覧・処理するセルフホストのWebアプリ、&lt;a class="link" href="https://lopiq.app.hack-le.com/" target="_blank" rel="noopener"&#10; &gt;LoPiQ&lt;/a&gt;をv1.18.10に更新しました。&lt;/p&gt;&#10;&lt;h2 id="主な更新内容"&gt;主な更新内容&#10;&lt;/h2&gt;&lt;p&gt;詳細は&lt;a class="link" href="https://lopiq.app.hack-le.com/release-notes/#v11810-2026-10-18" target="_blank" rel="noopener"&#10; &gt;リリースノート - LoPiQ&lt;/a&gt;をご参照ください。&lt;/p&gt;&#10;&lt;h3 id="windowsに対応"&gt;Windowsに対応&#10;&lt;/h3&gt;&lt;p&gt;今回よりWindowsに対応しました。Windows 11 Homeで動作確認しております。未署名のため、警告画面の「詳細情報」から実行する必要があります。インストール方法は&lt;a class="link" href="https://lopiq.app.hack-le.com/guide/installation/#_5" target="_blank" rel="noopener"&#10; &gt;インストール - LoPiQ&lt;/a&gt;のとおりです。&lt;/p&gt;&#10;&lt;p&gt;LoPiQは画像を閲覧するだけではなく、フォーマット変換などのスクリプトの実行や、ブログなどの素材編集用の簡易的な編集が可能です。&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;/p&gt;&#10;&lt;h3 id="exifai生成パラメータの確認"&gt;Exif、AI生成パラメータの確認&#10;&lt;/h3&gt;&lt;p&gt;画像プレビュー中に &lt;code&gt;i&lt;/code&gt; キーを押すと詳細パネルが表示されます。カメラの機種や撮影設定、GPS位置情報を確認できるほか、AI生成画像のプロンプトやモデル名・シード値を自動で整理表示し、ワンクリックでコピーできます。&lt;/p&gt;&#10;&lt;h3 id="他"&gt;他&#10;&lt;/h3&gt;&lt;p&gt;そのほか下記のような対応をしています。&lt;/p&gt;&#10;&lt;ul&gt;&#10;&lt;li&gt;AI相談用のプロバイダでDeepSeek対応&lt;/li&gt;&#10;&lt;li&gt;Linux向けアップデータの安定性向上&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;h2 id="今後の開発方針"&gt;今後の開発方針&#10;&lt;/h2&gt;&lt;p&gt;今後、ファイラとしての活用のため画像以外のファイル形式についても閲覧と簡易的な編集およびコマンド実行をできるようにする予定です。&lt;/p&gt;&#10;&lt;p&gt;LoPiQはAIプログラミングで開発しています。今後も継続的にアップデートしてまいりますので、LoPiQをよろしくお願いします。&lt;/p&gt;&#10;</description></item><item><title>WordPress が Web サーバーにアクセスする必要があります。 次に進むには FTP の認証情報を入力してください（大嘘）</title><link>https://hack-le.com/wordpress-web-ftp/</link><pubDate>Sun, 04 Oct 2026 00:00:00 +0900</pubDate><guid>https://hack-le.com/wordpress-web-ftp/</guid><description>&lt;p&gt;早くWordPressを更新しろ！間に合わなくなっても知らんぞーーー！！って脅してくるから更新しようとしたら&lt;/p&gt;&#10;&#10; &lt;blockquote&gt;&#10; &lt;p&gt;要求されたアクションを実行するには、WordPress が Web サーバーにアクセスする必要があります。 次に進むには FTP の認証情報を入力してください。 認証情報が思い出せない場合は、ホスティング担当者に問い合わせてください。&lt;/p&gt;&#10;&#10; &lt;/blockquote&gt;&#10;&lt;p&gt;などと意味不明な供述をしてきたときの対応。多分DockerでWordPress使っている時によく出てくる、と思われる。大昔ネイティブで運用していた頃には見たことなかった気がする。&lt;/p&gt;&#10;&lt;p&gt;次に進むには FTP の認証情報を入力してください。（大嘘）だし、そもそもホスティング担当者（私）なので、例によって全然違う対応をする必要があります。&lt;/p&gt;&#10;&lt;h2 id="環境"&gt;環境&#10;&lt;/h2&gt;&lt;p&gt;Docker版だよ。&lt;/p&gt;&#10;&lt;ul&gt;&#10;&lt;li&gt;Linux Mint Xfce 22.3&lt;/li&gt;&#10;&lt;li&gt;Docker version 29.8.1, build 4a63305&#10;&lt;ul&gt;&#10;&lt;li&gt;WordPress 7.1 -&amp;gt; 7.12&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;h2 id="原因"&gt;原因&#10;&lt;/h2&gt;&lt;p&gt;Webサーバドキュメントルートの&lt;code&gt;/var/www/html&lt;/code&gt;の権限問題が発生していると思われます。なんで発生しているのかは知らん。なぜなの？&lt;/p&gt;&#10;&lt;h2 id="コンテナ内でのパーミッション修復手順"&gt;コンテナ内でのパーミッション修復手順&#10;&lt;/h2&gt;&lt;p&gt;&lt;code&gt;docker-compose.yml&lt;/code&gt;のあるところに移動して、とりあえずコンテナに入ります。&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;docker compose &lt;span class="nb"&gt;exec&lt;/span&gt; wordpress bash&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;違ったら&lt;code&gt;docker compose ps&lt;/code&gt;でSERVICE列を確認します。&lt;/p&gt;&#10;&lt;p&gt;&lt;code&gt;/var/www/html&lt;/code&gt;にいる状態から始まります。で、&lt;code&gt;ls -ld&lt;/code&gt;すると所有権が&lt;code&gt;root&lt;/code&gt;になっていました。&lt;/p&gt;&#10;&lt;p&gt;以下のコマンドを実行してWebサーバーの実行ユーザーに所有権を戻します。&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;chown -R www-data:www-data /var/www/html&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;実行後、Web画面から再度更新を実行して、通ればOK。&lt;/p&gt;&#10;&lt;h2 id="エラーメッセージは永遠に"&gt;エラーメッセージは永遠に&#10;&lt;/h2&gt;&lt;p&gt;どうでもいいんですけど、IT関係のエラーメッセージの不親切さは永遠なんでしょうかね。あまりにも意味不明過ぎて逆に検索適応性が高いという謎の事象も発生。AI革命だのAIでもう知識労働は不要だのAIで人類絶滅だのなんかセンセーショナルな記事ばかり出てきますが、結局わからないのはAIツールの吐き出す謎のエラーメッセージ、そして何よりエラーの原因であったりします。&lt;/p&gt;&#10;&lt;p&gt;&lt;img loading="lazy" sizes="(max-width: 767px) calc(100vw - 30px), (max-width: 1023px) 700px, (max-width: 1279px) 950px, 1232px" src="https://hack-le.com/images/uploads/2026/10/f977b4dfd34f035cec1e79800272b8cf.webp"&gt;&lt;/p&gt;&#10;&lt;p&gt;&lt;em&gt;GoogleのAIコーディングツール、Antigravityでよく見るエラーメッセージ&lt;/em&gt;&lt;/p&gt;&#10;&lt;p&gt;あの日見たエラーメッセージがなんだったのか僕たちは永遠に知らない…。&lt;/p&gt;&#10;</description></item><item><title>LoPiQ v.1.16.10 の公開</title><link>https://hack-le.com/lopiq-v-1-16-10/</link><pubDate>Thu, 24 Sep 2026 00:00:00 +0900</pubDate><guid>https://hack-le.com/lopiq-v-1-16-10/</guid><description>&lt;p&gt;LoPiQをv.1.15.4からv1.16.10に更新しました。&lt;a class="link" href="https://lopiq.dev.hack-le.com/release-notes/#v11610-2026-09-23" target="_blank" rel="noopener"&#10; &gt;リリースノート - LoPiQ&lt;/a&gt;より詳細を確認できます。&lt;/p&gt;&#10;&lt;p&gt;LoPiQはセルフホストできる画像ファイラです。画像を確認しながら、削除、回転、WebP変換などスクリプト操作を実行することを主たる目的にしています。&lt;/p&gt;&#10;&lt;p&gt;今回、大きな設計の変更があります。すべてのアクションはシェルスクリプトというのがLoPiQの方針でしたが、現実の利便性を考えたときに、標準的な操作はビルトインで用意するほうが便利であると判断しました。そのため、今回から削除や回転のような標準的アクションについて、アプリケーション側で実装したビルトインコマンドを用意します。&lt;/p&gt;&#10;&lt;p&gt;また、アクションは有効/無効を切り替えられるようにし、ユーザが必要なアクションのみをUIに表示するようにします。&lt;/p&gt;&#10;&lt;p&gt;これに合わせて、設定画面は専用ページを用意するようにしました。&lt;/p&gt;&#10;&lt;p&gt;今回の改修でOSの機能を使ったゴミ箱削除なども実装が可能になりました。また、Go言語を使っているため、Windowsでの実行も期待できるため、次回以降でWindows対応を目指します。&lt;/p&gt;&#10;</description></item><item><title>セルフホストしたアプリをマシン移行する汎用的な仕組みについて考える</title><link>https://hack-le.com/selfhost-migration/</link><pubDate>Mon, 31 Aug 2026 00:00:00 +0900</pubDate><guid>https://hack-le.com/selfhost-migration/</guid><description>&lt;p&gt;現在VPS上で、仮想通貨の自作トレードアプリを稼働しています。これは元々自宅サーバでやっていたのですけれど、引越しのときに数日から下手すると10日以上のダウンが見込まれたので、その間に相場の急変があったらたまらないということで、VPSに移行しました。&lt;/p&gt;&#10;&lt;h2 id="アプリケーションを動作させるマシンを移行したい"&gt;アプリケーションを動作させるマシンを移行したい&#10;&lt;/h2&gt;&lt;p&gt;で、ようやく環境も落ち着いてきたので、いつまでもグローバル空間に置く必要はないし、自宅サーバに戻そうと考えています。もちろん手順を踏めばすぐできるんですけれど、ここで、少し汎用的に考えられないか、と思いました。セルフホスト勢にとってマシン移行は常に生じる汎用的な悩みです。&lt;/p&gt;&#10;&lt;p&gt;実際、このサイトはWordPressをセルフホストしているのですが、VPS,ConoHaの大規模障害（永遠にこする）や引越し前後において頻繁に引越しをしています。それはやはり面倒くささがあったわけです。&lt;/p&gt;&#10;&lt;p&gt;個人的には、マシンの移行はもっと気軽にやりたい、という思いがあります。それはもしもの役にも立つでしょう。何をやるべきで、何をやらないのか、自動化できる部分はなにか、自動しない部分はなにか、そういうことを汎用的に考えたい、と思いました。&lt;/p&gt;&#10;&lt;h2 id="中継地点を介した移行"&gt;中継地点を介した移行&#10;&lt;/h2&gt;&lt;p&gt;考えたところ、基本的には以下のような中継地点を挟むものになると思います。&lt;/p&gt;&#10;&lt;pre class="mermaid" style="visibility:hidden"&gt;graph LR&#10;mA(移行元)&#10;mB(移行先)&#10;st(中継地点)&#10;repo(リポジトリ)&#10;mA --&gt;|push| st&#10;st -.-&gt;|pull| mB&#10;repo -.-&gt;|pull| mB&lt;/pre&gt;&lt;p&gt;この絵がすべてです。&lt;/p&gt;&#10;&lt;p&gt;なんでダイレクトに送らないのかと言うと、&lt;strong&gt;移行元から移行先にダイレクトにpushできる権限があるとは限らない&lt;/strong&gt;、からです。これは完全に自宅サーバしか使わない！というならダイレクトでいいかもしれませんが、実際には自宅が使えなくなることはあります（今回の場合）し、アプリケーションによっては自宅サーバはやめたほうがよいものもあります。&lt;/p&gt;&#10;&lt;p&gt;なので、移行元からpushできて、移行先がpullできる、そういう中継地点を用意するのが汎用的です。この&lt;strong&gt;中継地点の役割は、アクセス制御と一時的なストレージ&lt;/strong&gt;、ただそれだけです。グローバルなアクセスが必要ならS3のようなクラウドサービスでもいいですし、VPSでもいいでしょう。移行元も移行先も同一ネットワークなら、わざわざ外に出す必要はなく、両者がSSHで通信できるサーバならなんでもいい。&lt;/p&gt;&#10;&lt;p&gt;具体的な作業自体は、アプリケーションごとに個別で判断します。この切り分けによって、搬出と搬入のタイミングをずらせるとか、データの整理が明確になるといった副次的な効能もあります。&lt;/p&gt;&#10;&lt;p&gt;ここで重要なことは、何を引越して何を引っ越さないのかを明確に切り分けることです。具体的には、以下の3つに分かれると思います。&lt;/p&gt;&#10;&lt;ul&gt;&#10;&lt;li&gt;リポジトリから引き継ぐ&#10;&lt;ul&gt;&#10;&lt;li&gt;ソースコードや設定ファイルのテンプレートなど&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;/li&gt;&#10;&lt;li&gt;ファイルの移行で引き継ぐ&#10;&lt;ul&gt;&#10;&lt;li&gt;エクスポートしたファイルやデータストアやアプリケーションログなど&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;/li&gt;&#10;&lt;li&gt;引き継がない&#10;&lt;ul&gt;&#10;&lt;li&gt;OS/インフラの差分に基づく設定ファイルなど&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;p&gt;それぞれ何が対象となるかはアプリケーションごとに変わるでしょう。すべてのパターンを考えて統一的にやろうとしないことです。また、引き継げない部分がある以上全自動の夢も捨てるのが筋です。変に自動的に翻訳するみたいなことするのはトラブルの元です。セルフホストでそこまでする必要があることは皆無ですし、もしやる場合は差分が出なくなるように環境から選定すべきでしょうね。&lt;/p&gt;&#10;&lt;p&gt;そのうえで手順は以下のように言えるでしょう。&lt;/p&gt;&#10;&lt;ol&gt;&#10;&lt;li&gt;移行元と移行先で、リポジトリから引き継ぐものをアップデート&lt;/li&gt;&#10;&lt;li&gt;移行元をstopして、中継地点に搬出&lt;/li&gt;&#10;&lt;li&gt;移行先に、中継地点から搬入&lt;/li&gt;&#10;&lt;li&gt;データのインポート、差分の編集&lt;/li&gt;&#10;&lt;li&gt;移行先で動作開始&lt;/li&gt;&#10;&lt;/ol&gt;&#10;&lt;p&gt;自前で開発したものか、あるいは他人が開発したものを使わせてもらっているか、色々あると思いますが、この手順に集約できるかと思われます。&lt;/p&gt;&#10;&lt;p&gt;この方法は基本的にダウンタイムが生じます。工夫次第で発生させないのも可能かと思いますが、セルフホストでそこまで頑張る意味は薄いんじゃないでしょうか。&lt;/p&gt;&#10;&lt;p&gt;とはいえダウンタイムは短いほうがよいので、短くするなら差分の編集は搬出前にやると良いのですけれど、個人的には搬入後に揃ってからのほうがいいかと思います。搬入のどさくさで差分が上書きされるリスクや、また何かしら動かさないと編集できないとかもありえるので…。&lt;/p&gt;&#10;&lt;p&gt;データのインポートはファイルシステムレベルなのか、アプリケーションレベルで実行したほうがいいのか、これもアプリケーションによるでしょうねぇ…。まぁ、都度判断ですね。&lt;/p&gt;&#10;&lt;h2 id="まとめ"&gt;まとめ&#10;&lt;/h2&gt;&lt;p&gt;ここまでの流れをやや詳細に図示すると以下になります。&lt;/p&gt;&#10;&lt;pre class="mermaid" style="visibility:hidden"&gt;flowchart TB&#10;subgraph Repo["コード管理"]&#10;Code["ソースコード / 設定テンプレート"]&#10;end&#10;subgraph Relay["中継地点"]&#10;ExportData["エクスポートデータ / DBダンプ / アプリログ"]&#10;end&#10;subgraph Source["移行元"]&#10;SrcApp["アプリ停止"]&#10;SrcData["データ抽出・ダンプ"]&#10;SrcEnv["【破棄】OS・インフラ固有設定"]&#10;end&#10;subgraph Target["移行先（自宅サーバなど）"]&#10;TgtEnv["【新規作成】OS・インフラ固有設定の編集"]&#10;TgtApp["アプリ起動・動作検証"]&#10;TgtData["データインポート"]&#10;end&#10;%% コードの流れ&#10;Code --&gt;|Pull| Source&#10;Code --&gt;|Pull| Target&#10;%% データと状態の流れ&#10;SrcApp --&gt; SrcData&#10;SrcData --&gt;|Push / アップロード| Relay&#10;Relay --&gt;|Pull / ダウンロード| TgtData&#10;TgtData --&gt; TgtEnv&#10;TgtEnv --&gt; TgtApp&#10;%% スタイル&#10;classDef storage fill:#e1f5fe,stroke:#0288d1,stroke-width:2px;&#10;classDef nodeBox fill:#f5f5f5,stroke:#616161,stroke-width:1px;&#10;class Repo,Relay storage;&#10;class Source,Target nodeBox;&lt;/pre&gt;&lt;p&gt;&lt;strong&gt;やることは、事前準備として「リポジトリからpullするもの、中継地点で飛ばすもの、直接編集するもの」の切り分け。そのうえで5つの手順の具体的な操作の当てはめ&lt;/strong&gt;。&lt;/p&gt;&#10;&lt;p&gt;整理してみると、当たり前といえば当たり前なんですが。あらかじめ分類したものを適合させるだけだと思ったほうが、脳の負荷が多少下がるので…。&lt;/p&gt;&#10;&lt;p&gt;とりあえず、トレードアプリから移行するかー。手順を抽象化したところで具体化するのは結局めんどくさいのであった。というより、そういう面倒くささを残したところが肝なのですが…。&lt;/p&gt;&#10;&lt;p&gt;&amp;lt;関連記事&amp;gt;&lt;/p&gt;&#10;&lt;div class="blog-card-wrapper"&gt;&#10; &lt;a href="https://hack-le.com/selfhost-webapps-down/" class="blog-card"&gt;&#10; &lt;div class="blog-card-content"&gt;&#10; &lt;div class="blog-card-label"&gt;&#10; &lt;svg xmlns="http://www.w3.org/2000/svg" width="13" height="13" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"&gt;&lt;path d="M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.71"&gt;&lt;/path&gt;&lt;path d="M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71"&gt;&lt;/path&gt;&lt;/svg&gt;&#10; &lt;span&gt;あわせて読みたい&lt;/span&gt;&#10; &lt;/div&gt;&#10; &lt;div class="blog-card-title"&gt;セルフホストしたWebアプリになぜかうまくアクセスできない時のチェック&lt;/div&gt;&#10; &lt;div class="blog-card-url"&gt;/selfhost-webapps-down/&lt;/div&gt;&#10; &lt;/div&gt;&#10; &lt;div class="blog-card-thumbnail"&gt;&#10; &lt;img src="https://hack-le.com/images/uploads/2026/08/eyecatch_51092_1786019542.webp" alt="セルフホストしたWebアプリになぜかうまくアクセスできない時のチェック" loading="lazy" /&gt;&#10; &lt;/div&gt;&#10; &lt;/a&gt;&#10;&lt;/div&gt;&#10;&#10;&lt;div class="blog-card-wrapper"&gt;&#10; &lt;a href="https://hack-le.com/selfhosted-susume/" class="blog-card"&gt;&#10; &lt;div class="blog-card-content"&gt;&#10; &lt;div class="blog-card-label"&gt;&#10; &lt;svg xmlns="http://www.w3.org/2000/svg" width="13" height="13" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"&gt;&lt;path d="M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.71"&gt;&lt;/path&gt;&lt;path d="M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71"&gt;&lt;/path&gt;&lt;/svg&gt;&#10; &lt;span&gt;あわせて読みたい&lt;/span&gt;&#10; &lt;/div&gt;&#10; &lt;div class="blog-card-title"&gt;セルフホストのすゝめ&lt;/div&gt;&#10; &lt;div class="blog-card-url"&gt;/selfhosted-susume/&lt;/div&gt;&#10; &lt;/div&gt;&#10; &lt;/a&gt;&#10;&lt;/div&gt;&#10;&#10;</description></item><item><title>PC内にある画像を閲覧しながら、スクリプト処理や削除処理を実行できるセルフホストのWebアプリケーション『LoPiQ』を公開しました</title><link>https://hack-le.com/lopic-pub/</link><pubDate>Sat, 29 Aug 2026 00:00:00 +0900</pubDate><guid>https://hack-le.com/lopic-pub/</guid><description>&lt;p&gt;&lt;strong&gt;セルフホストの画像閲覧・管理用Webアプリケーション『LoPiQ（ローピック）』&lt;/strong&gt; を公開しました。&lt;/p&gt;&#10;&lt;p&gt;&lt;a class="link" href="https://lopiq.app.hack-le.com/" target="_blank" rel="noopener"&#10; &gt;LoPiQ&lt;/a&gt;&lt;/p&gt;&#10;&lt;p&gt;LoPiQはLocal, Picture, Quickを謳った、&lt;strong&gt;PC内にある大量の画像を、いつでもどこでも、PCのみならずスマホやタブレットからでも、閲覧・整理することを目的にしたセルフホストのWebアプリケーション&lt;/strong&gt;です。写真を多く撮影する人、画像や素材集めをしている人、またAIイラストを利用している人など、大量の画像を見ながら定型的な処理をする人に向いています。&lt;/p&gt;&#10;&lt;p&gt;Linux(Debian/Ubuntu/Mint系)およびMac用のみを公開していますが、Windows版についても公開を検討しています。&lt;/p&gt;&#10;&lt;h2 id="lopiqの特徴"&gt;LoPiQの特徴&#10;&lt;/h2&gt;&lt;p&gt;LoPiQの大きな特徴は2つあります。&lt;/p&gt;&#10;&lt;p&gt;&lt;strong&gt;1つは、サーバを必要とするWebアプリケーションであること&lt;/strong&gt;です。これは、PC内にある画像ファイルについて、PCのみならず、ネットワーク内のスマートフォンやタブレット端末から操作することを目的としています。また、PC自体が処理を実行することで、PCの持つスペックを最大限発揮できます。&lt;/p&gt;&#10;&lt;p&gt;&lt;strong&gt;もう1つは、スクリプトによるカスタムアクションを自分で定義できること&lt;/strong&gt;です。これによって、たとえば画像をWebPにコンバートする、白色化・グレースケールにする、任意のフォルダに移動する、オンライン・ストレージにアップロードするといったことを、画像を見ながらテンポよく実行することができます。コマンドは任意のキーボードショットに割り当てられ、全画面でプレビューしながら、画像ごとにアクションを振り分けられます。&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;を抱かれた方もいらっしゃるかもしれません。まさに、ビューアというより、本質的にはファイラに近い性質を持っています。エンジニア向けに言うと、本アプリは「Linux/Macのコマンドライン環境をWeb UIでラップしてスマホからも叩けるようにした作業自動化・効率化のためのスクリプト実行基盤」と言えます。&lt;/p&gt;&#10;&lt;h2 id="aiと相談しながら自分専用のコマンドを生成"&gt;AIと相談しながら自分専用のコマンドを生成&#10;&lt;/h2&gt;&lt;p&gt;コマンドについては、&lt;strong&gt;Linux/Macについてはシェルスクリプトを利用します&lt;/strong&gt;。したがって、シェルスクリプトについて一定の知識と調べられることが前提となり、敷居が高く感じられるかもしれません。&lt;/p&gt;&#10;&lt;p&gt;以前までならそうだったでしょうが、&lt;strong&gt;現在はAIを利用することで、非常に簡単にコマンドをつくることができるようになりました&lt;/strong&gt;。シェルスクリプトは長年使われてきた汎用的な知識であり、仕様についても固まっているため、商用AIの無料枠でも非常に高い精度での返答が期待できます。&lt;/p&gt;&#10;&lt;p&gt;本アプリケーションはOpenAIのAPIに対応しており、API Keyを持っていれば、アプリケーション内で、マニュアルに即した形でのAI相談が可能です。たとえば、 &lt;strong&gt;「画像を90度回転するボタンを作りたい」とアプリケーション内でAIに相談するだけで、設定すべき内容が即座にかえってきます&lt;/strong&gt;。そのまま登録まで可能です。&lt;/p&gt;&#10;&lt;p&gt;ただし、新しいコマンドの実行については、まず検証し、意図しない破壊的な処理が行われないことを、丁寧に確認してください。その危険性についてもAIは教えてくれますが、大切なデータにかかることですので、バックアップのうえでの検証が非常に重要です。&lt;/p&gt;&#10;&lt;p&gt;AI対応については、今後の更新でより拡張していく予定です。&lt;/p&gt;&#10;&lt;h2 id="インストールと実行"&gt;インストールと実行&#10;&lt;/h2&gt;&lt;p&gt;配布サイトより、インストーラを実行します。&lt;/p&gt;&#10;&lt;p&gt;&lt;a class="link" href="https://lopiq.app.hack-le.com/" target="_blank" rel="noopener"&#10; &gt;LoPiQ&lt;/a&gt;&lt;/p&gt;&#10;&lt;p&gt;実行すると、ブラウザの &lt;code&gt;http://localhost:13180&lt;/code&gt; よりアクセスできるようになります。localhostではなくIPアドレスを指定することで、LAN内の他PCやスマホ・タブレットからもアクセス可能です（環境によっては別途ポート開放が必要です）。望まないアクセスについては、パスワードを設定して保護することができます。&lt;/p&gt;&#10;&lt;p&gt;Linux版はsystemdの管理で常駐し次回から自動で起動します。また、今後のアップデートはWeb UI上から可能です。一方でMac版は自動起動の設定はありません。また、アップデートについては通知のみとなり、手動で実行する必要があります。詳細は配布サイトのガイドをご参照ください。&lt;/p&gt;&#10;&lt;p&gt;Windows版は現在準備中です。Windows版については、私が普段このアプリケーションをMac/Linux上で使っているため、検証しきれておらず、今回の公開は見送りとなりました。&lt;/p&gt;&#10;&lt;h2 id="開発のai利用について"&gt;開発のAI利用について&#10;&lt;/h2&gt;&lt;p&gt;本アプリケーションはほとんどAIを利用して開発しました。元々の開発は2年以上前まで遡り、当時はツールも熟れておらず、コードも見ていましたが、現在はツールが発達し、コーディングエージェントの性能が飛躍的に変わったことを受けて、私の開発スタイルも大きく変わりました。現在は専ら設計とテストのみ自分でやり、コーディングは全部AIです。&lt;/p&gt;&#10;&lt;p&gt;現在メインのツールはGoogleのAntigravityで、モデルはGemini 3.x FlashおよびClaude Opus 4.6です。Googleが良いというわけではありませんが、セールで安かったので利用しています。個人開発としては十分だと思います。&lt;/p&gt;&#10;&lt;h2 id="今後の更新について"&gt;今後の更新について&#10;&lt;/h2&gt;&lt;p&gt;LoPiQは私が日常的に利用しているアプリケーションを、多くの人が使えるように公開向けに手直ししたものです。既存のビューアやファイラでは、機能やパフォーマンス、安定性で満足がいかず、自分で作り始めました。なんだかんだで2年以上使っています。したがって、自分自身がまず最大の顧客ですから、今後も継続的に開発を続けていきます。&lt;/p&gt;&#10;&lt;p&gt;コマンドについては、AIに相談できるとはいえ中々難しい面があるように思われますので、今後プラグイン化し、公開サイトからよくあるコマンドをダウンロードして適用できるような形を考えています。&lt;/p&gt;&#10;&lt;p&gt;そもそも対象ファイルを画像に限定する意味ももはや薄れている気もするのですが、対象を広げてしまうと考えることも増えるため、元々のユースケースから、画像ファイルのみ対象としているものの、今後全ファイルを対象とする可能性はあります。&lt;/p&gt;&#10;&lt;p&gt;もしバグなどありましたら、サイトのどこかにコメントするか、管理人の連絡先メールアドレスまでご連絡ください。&lt;/p&gt;&#10;</description></item><item><title>【脱Google？】Google抜きで古のアクセスカウンタを設置できる、そうAIならね</title><link>https://hack-le.com/google-umami/</link><pubDate>Fri, 28 Aug 2026 00:00:00 +0900</pubDate><guid>https://hack-le.com/google-umami/</guid><description>&lt;p&gt;&lt;strong&gt;アクセス解析といえばみんな大好き過ぎて涙目で泡吹いているGA4ことGoogle Analytics&lt;/strong&gt;なんですが、当サイトはマイブームだった脱Googleの流れで利用をやめました。まぁこれに関しては脱Googleというより、&lt;strong&gt;純粋に使いづらかったからやめた&lt;/strong&gt;面もあります。GA4は個人サイトのアクセス解析としてはあまりにも重すぎて意味不明、最初からGA4だったら誰も使わなかったんじゃないのこれ、と思います。&lt;/p&gt;&#10;&lt;h2 id="umamiの導入"&gt;Umamiの導入&#10;&lt;/h2&gt;&lt;p&gt;それから当サイトではWordPressのプラグインのお世話になっていたんですけれど、最近、セルフホストできるUmamiを導入しました。&lt;/p&gt;&#10;&lt;div class="blog-card-wrapper"&gt;&#10; &lt;a href="https://hack-le.com/umami-wordpress/" 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;セルフホストしたUmamiでWordPressサイトのアクセス解析&lt;/div&gt;&#10; &lt;div class="blog-card-url"&gt;/umami-wordpress/&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/image.png" alt="セルフホストしたUmamiでWordPressサイトのアクセス解析" loading="lazy" /&gt;&#10; &lt;/div&gt;&#10; &lt;/a&gt;&#10;&lt;/div&gt;&#10;&#10;&lt;p&gt;これでWordPressプラグインに頼らず、またWordPress以外のあらゆるサイトについて一括してアクセス解析ができるようになりました。有り難いことです。&lt;/p&gt;&#10;&lt;p&gt;UmamiはAPIを利用できるので、サイト内の記事のアクセスランキングなどもつくれます。ま、WordPressで実現しようと思ったらカスタムフィールドとかいじる必要あると思いますが…当サイトはもともと別に独自実装で入れていたものがあるので、それを流用することでランキング生成のバックエンドもサクッとUmamiベースに置換できました。&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;アクセスカウンタが消えたのは、需要が消えたから、ではないと思います。実際、PVランキング自体はけっこう色々なサイトで今でもありますよね。というかWordPressでもアクセス解析プラグインはたくさんあります。&lt;/p&gt;&#10;&lt;p&gt;だったらアクセスカウンタもあっていいじゃない、と思うわけですが、アクセス解析で覇権を取ったGoogle AnalyticsのAPIを追従しながら頑張って設置するにはちょっと情熱が必要になります。API権限の管理問題で、どうしても煩雑になりますよね。まぁ少なくとも、私は今までやる気にはならなかったですねぇ。&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;ということで、GeminiにUmamiのAPIをつかったアクセスカウンタのジェネレータを作ってもらいました。&lt;/p&gt;&#10;&lt;p&gt;&lt;img loading="lazy" sizes="(max-width: 767px) calc(100vw - 30px), (max-width: 1023px) 700px, (max-width: 1279px) 950px, 1232px" src="https://hack-le.com/images/uploads/2026/08/image-6-700x616.png"&gt;&lt;/p&gt;&#10;&lt;p&gt;若干の調整は発生しましたが、ジェバンニも真っ青の凄まじいスピードでつくってくれました。これは嬉しい。HTMLの埋め込みタグ一つでアクセスカウンタが設置できます。&lt;/p&gt;&#10;&lt;p&gt;そして当サイトに古のアクセスカウンタがのっかりました。&lt;/p&gt;&#10;&lt;p&gt;&lt;img loading="lazy" sizes="(max-width: 767px) calc(100vw - 30px), (max-width: 1023px) 700px, (max-width: 1279px) 950px, 1232px" src="https://hack-le.com/images/uploads/2026/08/image-7-697x187.png"&gt;&lt;/p&gt;&#10;&lt;p&gt;ふふふ。00年代感。&lt;/p&gt;&#10;&lt;p&gt;これは既に作っていたサイト管理用Webアプリを土台にして作ったのですが、機能的には独立しているので、切り離せば誰でも使える形になります。なので気が向いたら分離しようかな…と思ったりもしますが、これの場合、通常一番の障壁はどっちかっていうとUmamiをセルフホストすることでしょうね(^_^;)&lt;/p&gt;&#10;&lt;p&gt;まぁUmamiも結構な頻度で更新しているようなのですが、バージョン固定できますし、&lt;strong&gt;Googleの気分に振り回されず、自分のやりたい解析ができて、解析結果もAI使えば存分に利用可能&lt;/strong&gt;、というのは、これはかなり魅力的ではないでしょうか。&lt;/p&gt;&#10;&lt;p&gt;AI使ってなんだかんだと喧しい世の中ですが、そんな派手なことしなくても、確かに自分にとって役立つものができるので、そういうことを人にも勧めていきたいですねぇ。&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/2022-ga/" 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;2022年改正個人情報保護法でGoogle Analytics使うのに結局同意ポップアップはいるのかいらないのか&lt;/div&gt;&#10; &lt;div class="blog-card-url"&gt;/2022-ga/&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/2022/04/77facb44116fc4217274ff52525b8254.webp" alt="2022年改正個人情報保護法でGoogle Analytics使うのに結局同意ポップアップはいるのかいらないのか" 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/httptohttps/" 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;結局サイトをhttps対応させました&lt;/div&gt;&#10; &lt;div class="blog-card-url"&gt;/httptohttps/&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/2016/11/f87bbb3a69696219efe976c987643be6.webp" alt="結局サイトをhttps対応させました" loading="lazy" /&gt;&#10; &lt;/div&gt;&#10; &lt;/a&gt;&#10;&lt;/div&gt;&#10;&#10;</description></item><item><title>セルフホストしたUmamiでWordPressサイトのアクセス解析</title><link>https://hack-le.com/umami-wordpress/</link><pubDate>Fri, 21 Aug 2026 00:00:00 +0900</pubDate><guid>https://hack-le.com/umami-wordpress/</guid><description>&lt;p&gt;Google Analytics代替として候補にあがる、セルフホストのアクセス解析ソフトUmamiを使っていく。&lt;/p&gt;&#10;&lt;p&gt;&lt;a class="link" href="https://github.com/umami-software/umami" target="_blank" rel="noopener"&#10; &gt;GitHub - umami-software/umami: Umami is a privacy-first analytics platform. Traffic, campaigns, behavior, conversions, and revenue in one place — no cookies, no tracking, self-hosted or in the cloud. · GitHub&lt;/a&gt;&lt;/p&gt;&#10;&lt;p&gt;なお公式サイトはisドメインなんだけれど、なぜか弾かれる。Cloudflare経由で接続するといけるのでおまかんっぽいんだがアイスランドに嫌われるようなことしたっけ？&lt;/p&gt;&#10;&lt;p&gt;まぁそれはいいとして、今回インストールでは「&lt;a class="link" href="https://www.bitdoze.com/umami-analytics-install/" target="_blank" rel="noopener"&#10; &gt;How to Install Umami Analytics on Docker (2026 Guide)&lt;/a&gt;」の記事を参考にさせていただきました、っていうか正直うちの記事よりこの記事のほうが詳しいからこっち見たほうがいいよｗ&lt;/p&gt;&#10;&lt;p&gt;じゃあなんで書くのかというと、記事は消えるから……。10年以上もブログやっていると「この記事が詳しいです！」で雑に案内だけ貼ったリンクが消える消える。まぁ微妙に情報補足と雑なWordPress案内も追加したので…。&lt;/p&gt;&#10;&lt;h2 id="環境"&gt;環境&#10;&lt;/h2&gt;&lt;ul&gt;&#10;&lt;li&gt;&lt;a class="link" href="mailto:Umami@3.2.0" &gt;Umami@3.2.0&lt;/a&gt;&lt;/li&gt;&#10;&lt;li&gt;自宅サーバ&#10;&lt;ul&gt;&#10;&lt;li&gt;ThinkPad L390, Core i5-8265U, 32GB RAM&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;/li&gt;&#10;&lt;li&gt;Linux Mint Xfce 22.3&#10;&lt;ul&gt;&#10;&lt;li&gt;docker 29.7.2&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;/li&gt;&#10;&lt;li&gt;Cloudflare Tunnel&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;h2 id="インストールと最初の設定"&gt;インストールと最初の設定&#10;&lt;/h2&gt;&lt;h3 id="docker-composeyml"&gt;&lt;code&gt;docker-compose.yml&lt;/code&gt;&#10;&lt;/h3&gt;&lt;p&gt;以下でランダムな文字列を作る&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-javascript" data-lang="javascript"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nx"&gt;openssl&lt;/span&gt; &lt;span class="nx"&gt;rand&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="nx"&gt;hex&lt;/span&gt; &lt;span class="mi"&gt;32&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;文字列はコピーしておく。&lt;/p&gt;&#10;&lt;p&gt;&lt;code&gt;.env&lt;/code&gt;を作成する。以下の&lt;code&gt;APP_SECRET&lt;/code&gt;にさっきのランダム文字列を入れる。パスワードは適当に入れる。&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nv"&gt;POSTGRES_USER&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;umami&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nv"&gt;POSTGRES_PASSWORD&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;your-secure-password&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nv"&gt;POSTGRES_DB&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;umami&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nv"&gt;APP_SECRET&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;run-openssl-rand-hex-32-to-generate&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nv"&gt;DISABLE_TELEMETRY&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="m"&gt;1&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;&lt;code&gt;docker-compose.yml&lt;/code&gt;を編集。元記事からimageのURLだけ差し替えた（エラー出たので）。ポート番号は変えたかったら変える。バージョン固定したかったらする。ちなみにvつかないらしい（v3.2.0ではなく3.2.0）。&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;services:&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; umami:&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; image: umamisoftware/umami:postgresql-latest&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; ports:&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; - &lt;span class="s2"&gt;&amp;#34;3000:3000&amp;#34;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; environment:&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; DATABASE_URL: postgresql://&lt;span class="si"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;POSTGRES_USER&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;:&lt;span class="si"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;POSTGRES_PASSWORD&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;@umami-db:5432/&lt;span class="si"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;POSTGRES_DB&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; APP_SECRET: &lt;span class="si"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;APP_SECRET&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; DISABLE_TELEMETRY: &lt;span class="si"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;DISABLE_TELEMETRY&lt;/span&gt;&lt;span class="k"&gt;:-&lt;/span&gt;&lt;span class="nv"&gt;1&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; depends_on:&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; umami-db:&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; condition: service_healthy&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; init: &lt;span class="nb"&gt;true&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; restart: always&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; healthcheck:&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; test: &lt;span class="o"&gt;[&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;CMD-SHELL&amp;#34;&lt;/span&gt;, &lt;span class="s2"&gt;&amp;#34;curl http://localhost:3000/api/heartbeat&amp;#34;&lt;/span&gt;&lt;span class="o"&gt;]&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; interval: 5s&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; timeout: 5s&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; retries: &lt;span class="m"&gt;5&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; umami-db:&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; image: postgres:15-alpine&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; environment:&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; POSTGRES_DB: &lt;span class="si"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;POSTGRES_DB&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; POSTGRES_USER: &lt;span class="si"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;POSTGRES_USER&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; POSTGRES_PASSWORD: &lt;span class="si"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;POSTGRES_PASSWORD&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; TZ: UTC&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; volumes:&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; - ./umami-db-data:/var/lib/postgresql/data&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; restart: always&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; healthcheck:&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; test: &lt;span class="o"&gt;[&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;CMD-SHELL&amp;#34;&lt;/span&gt;, &lt;span class="s2"&gt;&amp;#34;pg_isready -U &lt;/span&gt;&lt;span class="nv"&gt;$$&lt;/span&gt;&lt;span class="s2"&gt;{POSTGRES_USER} -d &lt;/span&gt;&lt;span class="nv"&gt;$$&lt;/span&gt;&lt;span class="s2"&gt;{POSTGRES_DB}&amp;#34;&lt;/span&gt;&lt;span class="o"&gt;]&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; interval: 5s&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; timeout: 5s&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; retries: &lt;span class="m"&gt;5&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;ここで、参考記事によると、Cloudflare Tunnelを使っている場合、Umamiから見ると全部CloudflareのIPを取ってしまうので、&lt;code&gt;docker-compose.yml&lt;/code&gt;の&lt;code&gt;environment&lt;/code&gt;に以下を追記せよとのことであった。&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;CLIENT_IP_HEADER: cf-connecting-ip&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;VPSとかで直接公開してCaddyをリバースプロキシにしている場合はヘッダの付与よしなにしているから不要なはず。&lt;/p&gt;&#10;&lt;p&gt;準備が出来たら、&lt;code&gt;docker compose up&lt;/code&gt;でエラーが出ないことを確認する。いけたら&lt;code&gt;docker compose up -d&lt;/code&gt;でバックグラウンド起動。&lt;/p&gt;&#10;&lt;h3 id="最初の設定"&gt;最初の設定&#10;&lt;/h3&gt;&lt;p&gt;&lt;code&gt;http://&amp;lt;IPアドレス&amp;gt;:&amp;lt;ポート&amp;gt;&lt;/code&gt;にアクセスして、ユーザ名&lt;code&gt;admin&lt;/code&gt;とパスワード&lt;code&gt;umami&lt;/code&gt;でログイン。&lt;/p&gt;&#10;&lt;p&gt;当然危ないので、管理者設定からパスワードを変更する。ユーザ名も変更できる。&lt;/p&gt;&#10;&lt;p&gt;言語設定も日本語あり。&lt;/p&gt;&#10;&lt;h3 id="ネットワーク設定"&gt;ネットワーク設定&#10;&lt;/h3&gt;&lt;p&gt;トラッキングデータの送信はクライアントマシンから行うため、グローバルに公開する必要あり。&lt;/p&gt;&#10;&lt;p&gt;全体の流れは以下 by AI。&lt;/p&gt;&#10;&lt;pre class="mermaid" style="visibility:hidden"&gt;sequenceDiagram&#10;autonumber&#10;actor Client as クライアント&#10;participant WP as WPサーバー(ブログサイト)&#10;participant Umami as Umamiサーバー(セルフホスト)&#10;Note over Client, Umami: 1. ブログページの読み込み&#10;Client-&gt;&gt;WP: ① ページリクエスト (アクセス)&#10;WP--&gt;&gt;Client: ② HTML返却 (Umamiのscriptタグを含む)&#10;Note over Client, Umami: 2. アクセス解析データの送信 (クライアント直接)&#10;Client-&gt;&gt;Umami: ③ script.jsの読み込みリクエスト&#10;Umami--&gt;&gt;Client: ④ script.jsの返却&#10;Client-&gt;&gt;Umami: ⑤ 閲覧データ(PV等)を直接送信 [要グローバル公開]&lt;/pre&gt;&lt;p&gt;うちの場合は例によってCloudflare Tunnelで開通している。&lt;/p&gt;&#10;&lt;p&gt;ここでサブドメインだが、参考記事によると&lt;code&gt;analytics&lt;/code&gt;とか使うと広告ブロッカーに遮断される率が上がるらしい。参考記事では&lt;code&gt;stats&lt;/code&gt;や&lt;code&gt;metrics&lt;/code&gt;や&lt;code&gt;track&lt;/code&gt;などにせよと言われている。&lt;/p&gt;&#10;&lt;h2 id="wordpressサイトの解析"&gt;WordPressサイトの解析&#10;&lt;/h2&gt;&lt;p&gt;別にWordPressサイトじゃなくてもやることは同じ。&lt;/p&gt;&#10;&lt;h3 id="トラッキングコードの取得"&gt;トラッキングコードの取得&#10;&lt;/h3&gt;&lt;p&gt;サイドバーの「Webサイト」より、管理したいドメインを追加する。&lt;/p&gt;&#10;&lt;p&gt;追加したら、Editを開くと以下のようなトラッキングコードが取得できる。&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-javascript" data-lang="javascript"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nx"&gt;script&lt;/span&gt; &#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nx"&gt;defer&lt;/span&gt; &#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nx"&gt;src&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;https://your-umami-domain.com/script.js&amp;#34;&lt;/span&gt; &#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nx"&gt;data&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="nx"&gt;website&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="nx"&gt;id&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx&amp;#34;&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="err"&gt;/script&amp;gt;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;基本はこれを&amp;lt;head&amp;gt;タグに貼り付けること。&lt;/p&gt;&#10;&lt;h3 id="タグの貼り付け"&gt;タグの貼り付け&#10;&lt;/h3&gt;&lt;p&gt;プラグイン「Integrate Umami」があるが、&amp;lt;head&amp;gt;タグに貼り付けるだけなのでプラグイン使う必要はないかなと思う。&lt;/p&gt;&#10;&lt;p&gt;うちはテーマとしてSwellを使っているので、「外観」「カスタマイズ」「高度な設定」から「headタグ終了直前に出力するコード」にコードを貼り付け。&lt;/p&gt;&#10;&lt;p&gt;自分だけ除外とかするなら &lt;code&gt;functions.php&lt;/code&gt;でログインユーザにはトラッキングコードを出さないとかしないといけないかなと思う。&lt;/p&gt;&#10;&lt;h3 id="実測で確認"&gt;実測で確認&#10;&lt;/h3&gt;&lt;p&gt;しばらくダッシュボードを見てきちんと動いているか確認する。&lt;/p&gt;&#10;&lt;p&gt;&lt;img loading="lazy" sizes="(max-width: 767px) calc(100vw - 30px), (max-width: 1023px) 700px, (max-width: 1279px) 950px, 1232px" src="https://hack-le.com/images/uploads/2026/08/image-700x380.png"&gt;&lt;/p&gt;&#10;&lt;p&gt;まぁなんか動いてそう。使い方についてはおいおい見ていこうと思う。&lt;/p&gt;&#10;&lt;p&gt;以上。ちなみに最初AIに聞いて作業していたんだが、古いバージョンの情報に惑わされて完全に無能だった。&lt;/p&gt;&#10;</description></item><item><title>エアコンとローカルAIサーバで電気代がとんでもないことに</title><link>https://hack-le.com/denkidai/</link><pubDate>Wed, 19 Aug 2026 00:00:00 +0900</pubDate><guid>https://hack-le.com/denkidai/</guid><description>&lt;p&gt;さすがに一人暮らしでこれは反省した。&lt;/p&gt;&#10;&lt;p&gt;&lt;img loading="lazy" sizes="(max-width: 767px) calc(100vw - 30px), (max-width: 1023px) 700px, (max-width: 1279px) 950px, 1232px" src="https://hack-le.com/images/uploads/2026/08/image-1-700x582.png"&gt;&lt;/p&gt;&#10;&lt;p&gt;引越したばかりだからなのか、計算された日付がちょっと長くて、32日分くらい計測されている、というのはあるのだけれど、それにしても469kWhとは。1日あたり15kWhくらい使っている計算になるね。&lt;/p&gt;&#10;&lt;p&gt;まぁまずエアコンの電気代がエグいのはある。1日中つけっぱなしなので、これだけで5kWhにはなってそう。もっとかな。&lt;/p&gt;&#10;&lt;p&gt;あとはサーバやね。一番はStable DiffusionのためのローカルAIサーバかな…。ただこれはMaxでも確か300kWくらいで最大出力出しっぱなしということはないはずなんだけれどなぁ。頻度によるけど、1日で4-5kWhくらい使ってるかもなぁ。&lt;/p&gt;&#10;&lt;p&gt;他にセルフホスト系。&lt;strong&gt;サーバはノートPCなんで、前に測った感じだと消費電力は多分せいぜい15W&lt;/strong&gt;といったところだと思うんだけれど、&lt;strong&gt;意外でもなく重いのがハードディスク4台のせたガチャベイ&lt;/strong&gt;と思われる。これは1度ちゃんと測定しないといけないと思っているが…多分ならすと平均30Wくらいかなぁ。なのでまぁ、合計すると1kWh/日超えそうだよね。&lt;/p&gt;&#10;&lt;p&gt;あとは冷蔵庫とかなんとか色々使ったら5kWhくらいになるでしょう。するとまぁたしかに、5+5+1+5=16なので外出日とかでならすと15kWh/日になる、というのはそうだなぁ。なんか見てみると日によっては20kWh超えているときもあって酷い。去年でもここまでひどくはなかったので、さすがにもうちょっとどうにかしたい。&lt;/p&gt;&#10;&lt;p&gt;しかしそれにしても、&lt;strong&gt;エアコンについては環境的な要因もかなり大きいわけで、エアコンが新聞紙より高い消費税率10%で、しかも謎の再エネ賦課金とか課して起きながらさらにそれにも税金かけるっていうの、本当に意味不明&lt;/strong&gt;だなぁと思う。新聞は露骨に政治的な配慮を求めておきながら、昨今の食品消費税減税については減税するなと発狂しているんだから腐ってる。&lt;/p&gt;&#10;&lt;p&gt;まぁ何を言っても詮無いことなので、とりあえずエアコンとAIはちょっと控えよう。&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>セルフホストした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>ConoHaのVPSまた落ちたか</title><link>https://hack-le.com/conoha-vps-down-2/</link><pubDate>Tue, 30 Jun 2026 01:20:58 +0900</pubDate><guid>https://hack-le.com/conoha-vps-down-2/</guid><description>&lt;p&gt;つい先日の6/26にConoHaから障害メールがきていた。僕は障害を確認していないのだが、どうやら3月の大規模障害でさんざっぱら叩かれたのを反省したらしい。&lt;/p&gt;&#10;&lt;p&gt;&lt;img loading="lazy" sizes="(max-width: 767px) calc(100vw - 30px), (max-width: 1023px) 700px, (max-width: 1279px) 950px, 1232px" src="https://hack-le.com/images/uploads/2026/06/image-7-700x355.png"&gt;&lt;/p&gt;&#10;&lt;p&gt;6/25 23:16に発生とあるにも関わらず、最初の障害報が6/26 3:00であるし、復旧報も自分のサーバが対象かどうかを自分で調べさせるというストロングスタイルではあるものの、メールを送るようになっただけマシになった。&lt;/p&gt;&#10;&lt;p&gt;しかしそうはいっても、障害起きすぎじゃないの、とはやはり思う。今現在、家にネット回線がきていないネット難民化しているため、このブログを含めた常時稼働のアプリケーションをConoHa VPSにうつしているため、不安になる。頼む、僕が使っている間だけは落ちてくれるな…。&lt;/p&gt;&#10;&lt;p&gt;落ちた☺️&lt;/p&gt;&#10;&lt;p&gt;&lt;img loading="lazy" sizes="(max-width: 767px) calc(100vw - 30px), (max-width: 1023px) 700px, (max-width: 1279px) 950px, 1232px" src="https://hack-le.com/images/uploads/2026/06/image-6-700x474.png"&gt;&lt;/p&gt;&#10;&lt;p&gt;朝アクセスしようとしたその瞬間にまさに落ちたと思うわ。マジかよと思ったけど、だいたい15分くらいで復旧したかな。復旧したと信じたい。&lt;/p&gt;&#10;&lt;p&gt;朝でかつ比較的短い時間ではあったものの、X見ると僕以外にも何人かまた落ちてる？とツイしていたので、多分障害だったのだろう。というか僕のXアカウント、ConoHa VPSの死活監視botになってるわ。落ちるたびにSNSで騒いでるうえ、スクショあげたり記事にしたりまでしているので、ConoHaの中の人にマークされている気もする。とりあえずその後メールはきてないので、ConoHa的にはこれは障害ではなさそう。&lt;/p&gt;&#10;&lt;p&gt;まぁこういう感じなので、ConoHaはもう全然おすすめできるVPSではなくなってしまったね。昔はこんなに不安定じゃなかったんだけどね。。。&lt;/p&gt;&#10;&lt;div class="blog-card-wrapper"&gt;&#10; &lt;a href="https://hack-le.com/conoha-vps-down/" class="blog-card"&gt;&#10; &lt;div class="blog-card-content"&gt;&#10; &lt;div class="blog-card-label"&gt;&#10; &lt;svg xmlns="http://www.w3.org/2000/svg" width="13" height="13" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"&gt;&lt;path d="M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.71"&gt;&lt;/path&gt;&lt;path d="M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71"&gt;&lt;/path&gt;&lt;/svg&gt;&#10; &lt;span&gt;あわせて読みたい&lt;/span&gt;&#10; &lt;/div&gt;&#10; &lt;div class="blog-card-title"&gt;ConoHa VPS落ちすぎ問題&lt;/div&gt;&#10; &lt;div class="blog-card-url"&gt;/conoha-vps-down/&lt;/div&gt;&#10; &lt;/div&gt;&#10; &lt;div class="blog-card-thumbnail"&gt;&#10; &lt;img src="https://hack-le.com/images/uploads/2026/03/eyecatch_48871_1774613666.webp" alt="ConoHa VPS落ちすぎ問題" loading="lazy" /&gt;&#10; &lt;/div&gt;&#10; &lt;/a&gt;&#10;&lt;/div&gt;&#10;&#10;</description></item><item><title>WordPress(Docker)をコンテナとボリュームごと別マシンに移行するスクリプト</title><link>https://hack-le.com/wordpressdocker-script/</link><pubDate>Sun, 14 Jun 2026 15:37:33 +0900</pubDate><guid>https://hack-le.com/wordpressdocker-script/</guid><description>&lt;p&gt;以下の記事の自動化スクリプト。&lt;/p&gt;&#10;&lt;div class="blog-card-wrapper"&gt;&#10; &lt;a href="https://hack-le.com/container-wp/" class="blog-card"&gt;&#10; &lt;div class="blog-card-content"&gt;&#10; &lt;div class="blog-card-label"&gt;&#10; &lt;svg xmlns="http://www.w3.org/2000/svg" width="13" height="13" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"&gt;&lt;path d="M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.71"&gt;&lt;/path&gt;&lt;path d="M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71"&gt;&lt;/path&gt;&lt;/svg&gt;&#10; &lt;span&gt;あわせて読みたい&lt;/span&gt;&#10; &lt;/div&gt;&#10; &lt;div class="blog-card-title"&gt;コンテナ構築のWordPressサイトを別マシンに移行する&lt;/div&gt;&#10; &lt;div class="blog-card-url"&gt;/container-wp/&lt;/div&gt;&#10; &lt;/div&gt;&#10; &lt;div class="blog-card-thumbnail"&gt;&#10; &lt;img src="https://hack-le.com/images/uploads/2026/05/eyecatch_50016_1779164478.webp" alt="コンテナ構築のWordPressサイトを別マシンに移行する" loading="lazy" /&gt;&#10; &lt;/div&gt;&#10; &lt;/a&gt;&#10;&lt;/div&gt;&#10;&#10;&lt;h2 id="やることとやらないこと"&gt;やることとやらないこと&#10;&lt;/h2&gt;&lt;ul&gt;&#10;&lt;li&gt;やること&#10;&lt;ul&gt;&#10;&lt;li&gt;移行元からボリュームをバックアップして、移行先で復元する&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;/li&gt;&#10;&lt;li&gt;やらないこと&#10;&lt;ul&gt;&#10;&lt;li&gt;移行後のルーティング&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;p&gt;スクリプトでやっていることについて図示する。&lt;strong&gt;バックアップ中はダウンタイムとなるので注意&lt;/strong&gt;。&lt;/p&gt;&#10;&lt;pre class="mermaid" style="visibility:hidden"&gt;flowchart TD&#10;subgraph Local["ローカルマシン (移行元)"]&#10;direction TB&#10;A[YAMLからボリューム一覧を取得] --&gt; B[移行対象のボリュームを選択]&#10;B --&gt; C[元マシンのコンテナ停止]&#10;C --&gt; D[選択ボリュームのバックアップvackup export]&#10;D --&gt; E[元マシンのコンテナ再開ダウンタイム短縮]&#10;E --&gt; F[設定ファイル一式とバックアップを転送rsync]&#10;end&#10;subgraph Remote["リモートマシン (移行先) SSH経由で自動実行"]&#10;direction TB&#10;G[作業ディレクトリに移動]&#10;H[ボリュームのリストアvackup import]&#10;I[ネスト構造の解消vackup-volumeを直下へ移動]&#10;J[移行先コンテナ起動docker compose up -d]&#10;K[リモートの一時バックアップ削除]&#10;end&#10;F --&gt;|ネットワーク転送| G&#10;G --&gt; H&#10;H -.各ボリュームごとにループ.-&gt; I&#10;I --&gt; J&#10;J --&gt; K&#10;subgraph Local_Cleanup["ローカルマシン (完了後)"]&#10;L[ローカルの一時バックアップ削除]&#10;end&#10;K --&gt;|処理完了| L&lt;/pre&gt;&lt;h2 id="準備"&gt;準備&#10;&lt;/h2&gt;&lt;ul&gt;&#10;&lt;li&gt;移行元から移行先に、sshで転送できるようにしておく。&#10;&lt;ul&gt;&#10;&lt;li&gt;移行元はLAN内のマシンで、移行先はVPSとする。&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;/li&gt;&#10;&lt;li&gt;移行元と移行先に&lt;code&gt;docker&lt;/code&gt;と&lt;code&gt;docker compose&lt;/code&gt;と&lt;code&gt;vackup&lt;/code&gt;を入れる。&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;p&gt;vackupについては以下。&lt;/p&gt;&#10;&lt;div class="blog-card-wrapper"&gt;&#10; &lt;a href="https://hack-le.com/docker-volume-cli-backup/" class="blog-card"&gt;&#10; &lt;div class="blog-card-content"&gt;&#10; &lt;div class="blog-card-label"&gt;&#10; &lt;svg xmlns="http://www.w3.org/2000/svg" width="13" height="13" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"&gt;&lt;path d="M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.71"&gt;&lt;/path&gt;&lt;path d="M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71"&gt;&lt;/path&gt;&lt;/svg&gt;&#10; &lt;span&gt;あわせて読みたい&lt;/span&gt;&#10; &lt;/div&gt;&#10; &lt;div class="blog-card-title"&gt;DockerのボリュームをCLIでバックアップ・復元する&lt;/div&gt;&#10; &lt;div class="blog-card-url"&gt;/docker-volume-cli-backup/&lt;/div&gt;&#10; &lt;/div&gt;&#10; &lt;div class="blog-card-thumbnail"&gt;&#10; &lt;img src="https://hack-le.com/images/uploads/2024/09/docker-volume-cli-backup.webp" alt="DockerのボリュームをCLIでバックアップ・復元する" loading="lazy" /&gt;&#10; &lt;/div&gt;&#10; &lt;/a&gt;&#10;&lt;/div&gt;&#10;&#10;&lt;p&gt;また、移行元のディレクトリ構成を以下のようにする。&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;.&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;├── site1&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;│   ├── custom-php.ini&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;│   └── docker-compose.yml&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;├── site2&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;│   ├── ads.txt&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;│   ├── custom-php.ini&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;│   └── docker-compose.yml&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;└── migrate-wp.sh&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;上記のディレクトリ構成で、&lt;code&gt;migrate-wp.sh&lt;/code&gt;を実行すると、転送先のマシンにコンテナの設定とボリュームごともってく。ディレクトリごともっていくので、見えていないが&lt;code&gt;.env&lt;/code&gt;も含む。&lt;/p&gt;&#10;&lt;h2 id="スクリプトと実行"&gt;スクリプトと実行&#10;&lt;/h2&gt;&lt;p&gt;スクリプトは以下。AIが書いた。&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="cp"&gt;#!/bin/bash&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# エラー発生時にスクリプトを終了&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nb"&gt;set&lt;/span&gt; -e&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# 引数のチェック&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="o"&gt;[&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;&lt;/span&gt;&lt;span class="nv"&gt;$#&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;&lt;/span&gt; -ne &lt;span class="m"&gt;3&lt;/span&gt; &lt;span class="o"&gt;]&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="k"&gt;then&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;Usage: &lt;/span&gt;&lt;span class="nv"&gt;$0&lt;/span&gt;&lt;span class="s2"&gt; &amp;lt;dir_name&amp;gt; &amp;lt;user@ip&amp;gt; &amp;lt;remote_base_path&amp;gt;&amp;#34;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;Example: &lt;/span&gt;&lt;span class="nv"&gt;$0&lt;/span&gt;&lt;span class="s2"&gt; site1 user@192.168.1.50 /home/user/wordpress&amp;#34;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nb"&gt;exit&lt;/span&gt; &lt;span class="m"&gt;1&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="k"&gt;fi&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nv"&gt;DIR_NAME&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="nv"&gt;$1&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nv"&gt;REMOTE_TARGET&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="nv"&gt;$2&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nv"&gt;REMOTE_BASE_PATH&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="nv"&gt;$3&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nv"&gt;LOCAL_DIR&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;./&lt;/span&gt;&lt;span class="nv"&gt;$DIR_NAME&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nv"&gt;REMOTE_DIR&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;&lt;/span&gt;&lt;span class="nv"&gt;$REMOTE_BASE_PATH&lt;/span&gt;&lt;span class="s2"&gt;/&lt;/span&gt;&lt;span class="nv"&gt;$DIR_NAME&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# ローカルディレクトリの存在確認&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="o"&gt;[&lt;/span&gt; ! -d &lt;span class="s2"&gt;&amp;#34;&lt;/span&gt;&lt;span class="nv"&gt;$LOCAL_DIR&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;&lt;/span&gt; &lt;span class="o"&gt;]&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="k"&gt;then&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;Error: Local directory &amp;#39;&lt;/span&gt;&lt;span class="nv"&gt;$LOCAL_DIR&lt;/span&gt;&lt;span class="s2"&gt;&amp;#39; does not exist.&amp;#34;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nb"&gt;exit&lt;/span&gt; &lt;span class="m"&gt;1&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="k"&gt;fi&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;=== 1. ボリューム名の取得 ===&amp;#34;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nb"&gt;cd&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;&lt;/span&gt;&lt;span class="nv"&gt;$LOCAL_DIR&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# docker compose config を使ってボリューム名一覧を取得&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nv"&gt;VOLUMES&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="k"&gt;$(&lt;/span&gt;docker compose config --volumes&lt;span class="k"&gt;)&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="o"&gt;[&lt;/span&gt; -z &lt;span class="s2"&gt;&amp;#34;&lt;/span&gt;&lt;span class="nv"&gt;$VOLUMES&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;&lt;/span&gt; &lt;span class="o"&gt;]&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="k"&gt;then&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;Error: No volumes found in docker compose config for &lt;/span&gt;&lt;span class="nv"&gt;$DIR_NAME&lt;/span&gt;&lt;span class="s2"&gt;.&amp;#34;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nb"&gt;exit&lt;/span&gt; &lt;span class="m"&gt;1&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="k"&gt;fi&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;対象ボリューム:&amp;#34;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;&lt;/span&gt;&lt;span class="nv"&gt;$VOLUMES&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;=== 2. 元マシンのコンテナ停止 ===&amp;#34;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;docker compose stop&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;=== 3. ボリュームのバックアップ (vackup) ===&amp;#34;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;mkdir -p volume-backups&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="k"&gt;for&lt;/span&gt; vol in &lt;span class="nv"&gt;$VOLUMES&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="k"&gt;do&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;Exporting volume: &lt;/span&gt;&lt;span class="nv"&gt;$vol&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; vackup &lt;span class="nb"&gt;export&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;&lt;/span&gt;&lt;span class="nv"&gt;$vol&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;volume-backups/&lt;/span&gt;&lt;span class="nv"&gt;$vol&lt;/span&gt;&lt;span class="s2"&gt;.tar.gz&amp;#34;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="k"&gt;done&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;=== 4. 元マシンのコンテナ再開 (ダウンタイム短縮) ===&amp;#34;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;docker compose up -d&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;=== 5. 移行先へのファイル転送 (設定ファイル一式 + バックアップ) ===&amp;#34;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nb"&gt;cd&lt;/span&gt; ..&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# 移行先にターゲットディレクトリを作成&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;ssh -o &lt;span class="nv"&gt;ServerAliveInterval&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="m"&gt;60&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;&lt;/span&gt;&lt;span class="si"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;REMOTE_TARGET&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;mkdir -p &lt;/span&gt;&lt;span class="si"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;REMOTE_DIR&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# フォルダごとリモートへ同期&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;rsync -avz --progress -e &lt;span class="s2"&gt;&amp;#34;ssh -o ServerAliveInterval=60 -o ServerAliveCountMax=10&amp;#34;&lt;/span&gt; &lt;span class="se"&gt;\&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="s2"&gt;&amp;#34;&lt;/span&gt;&lt;span class="nv"&gt;$DIR_NAME&lt;/span&gt;&lt;span class="s2"&gt;/&amp;#34;&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;&lt;/span&gt;&lt;span class="si"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;REMOTE_TARGET&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;:&lt;/span&gt;&lt;span class="si"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;REMOTE_DIR&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;/&amp;#34;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;=== 6. 移行先でのボリュームリストアと起動 ===&amp;#34;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# 変数内の改行をスペースに変換する&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nv"&gt;VOLUMES_ONELINE&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="k"&gt;$(&lt;/span&gt;&lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;&lt;/span&gt;&lt;span class="si"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;VOLUMES&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;&lt;/span&gt; &lt;span class="p"&gt;|&lt;/span&gt; tr &lt;span class="s1"&gt;&amp;#39;\n&amp;#39;&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39; &amp;#39;&lt;/span&gt;&lt;span class="k"&gt;)&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nv"&gt;REMOTE_SCRIPT&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="k"&gt;$(&lt;/span&gt;cat &lt;span class="s"&gt;&amp;lt;&amp;lt; EOF&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s"&gt;cd &amp;#34;${REMOTE_DIR}&amp;#34;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s"&gt;for vol in ${VOLUMES_ONELINE}; do&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s"&gt; echo &amp;#34;----------------------------------------&amp;#34;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s"&gt; echo &amp;#34;Processing volume on remote: \$vol&amp;#34;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s"&gt; &#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s"&gt; # リストアを実行&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s"&gt; vackup import &amp;#34;volume-backups/\$vol.tar.gz&amp;#34; &amp;#34;\$vol&amp;#34;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s"&gt; &#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s"&gt; # vackup-volume のネスト構造を修正&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s"&gt; echo &amp;#34;Fixing nested directory structure for \$vol...&amp;#34;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s"&gt; docker run --rm -v &amp;#34;\$vol&amp;#34;:/volume alpine sh -c &amp;#34;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s"&gt; if [ -d /volume/vackup-volume ]; then&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s"&gt; mv /volume/vackup-volume/* /volume/ 2&amp;gt;/dev/null || true&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s"&gt; mv /volume/vackup-volume/.[!.]* /volume/ 2&amp;gt;/dev/null || true&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s"&gt; rmdir /volume/vackup-volume 2&amp;gt;/dev/null || true&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s"&gt; fi&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s"&gt; &amp;#34;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s"&gt;done&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s"&gt;echo &amp;#34;----------------------------------------&amp;#34;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s"&gt;echo &amp;#34;Starting containers on remote host...&amp;#34;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s"&gt;docker compose up -d&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s"&gt;EOF&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="k"&gt;)&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# 移行先マシンでリストア処理を実行&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;ssh -o &lt;span class="nv"&gt;ServerAliveInterval&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="m"&gt;60&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;&lt;/span&gt;&lt;span class="si"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;REMOTE_TARGET&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;&lt;/span&gt;&lt;span class="si"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;REMOTE_SCRIPT&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;=== 7. ローカルの一時バックアップを削除 ===&amp;#34;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;rm -rf &lt;span class="s2"&gt;&amp;#34;&lt;/span&gt;&lt;span class="nv"&gt;$DIR_NAME&lt;/span&gt;&lt;span class="s2"&gt;/volume-backups&amp;#34;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;=== 移行プロセスが完了しました ===&amp;#34;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;使い方は以下。&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;./migrate-wp.sh site1 VPSのユーザ@VPSのIPアドレス /home/VPSのユーザ/wordpress&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;これを実行すると、移行先に&lt;code&gt;~/wordpress/site1&lt;/code&gt;ができる。すでにコンテナの実行までされている。&lt;/p&gt;&#10;&lt;p&gt;なので、あとはDNSなどを操作して移行元から移行先に向けるとか、ルーティングで必要なことをやれば移行完了。&lt;/p&gt;&#10;&lt;p&gt;以上。&lt;/p&gt;&#10;</description></item><item><title>Growi (Docker) をコンテナごと別マシンに引っ越す</title><link>https://hack-le.com/growi-docker-container/</link><pubDate>Sat, 13 Jun 2026 13:10:29 +0900</pubDate><guid>https://hack-le.com/growi-docker-container/</guid><description>&lt;h2 id="環境"&gt;環境&#10;&lt;/h2&gt;&lt;ul&gt;&#10;&lt;li&gt;移行元&#10;&lt;ul&gt;&#10;&lt;li&gt;Intel Mac mini 2018&lt;/li&gt;&#10;&lt;li&gt;Docker Desktop&lt;/li&gt;&#10;&lt;li&gt;Growi 7.x&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;/li&gt;&#10;&lt;li&gt;移行先&#10;&lt;ul&gt;&#10;&lt;li&gt;Linux Mint Xfce 22.3&lt;/li&gt;&#10;&lt;li&gt;Docker 29.2.1&lt;/li&gt;&#10;&lt;li&gt;Growi 7.x&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;h2 id="基本的な手順"&gt;基本的な手順&#10;&lt;/h2&gt;&lt;p&gt;手順はWordPressのコンテナ移行とほぼ一緒なので、下記記事を参考にすること（雑）&lt;/p&gt;&#10;&lt;div class="blog-card-wrapper"&gt;&#10; &lt;a href="https://hack-le.com/container-wp/" class="blog-card"&gt;&#10; &lt;div class="blog-card-content"&gt;&#10; &lt;div class="blog-card-label"&gt;&#10; &lt;svg xmlns="http://www.w3.org/2000/svg" width="13" height="13" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"&gt;&lt;path d="M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.71"&gt;&lt;/path&gt;&lt;path d="M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71"&gt;&lt;/path&gt;&lt;/svg&gt;&#10; &lt;span&gt;あわせて読みたい&lt;/span&gt;&#10; &lt;/div&gt;&#10; &lt;div class="blog-card-title"&gt;コンテナ構築のWordPressサイトを別マシンに移行する&lt;/div&gt;&#10; &lt;div class="blog-card-url"&gt;/container-wp/&lt;/div&gt;&#10; &lt;/div&gt;&#10; &lt;div class="blog-card-thumbnail"&gt;&#10; &lt;img src="https://hack-le.com/images/uploads/2026/05/eyecatch_50016_1779164478.webp" alt="コンテナ構築のWordPressサイトを別マシンに移行する" loading="lazy" /&gt;&#10; &lt;/div&gt;&#10; &lt;/a&gt;&#10;&lt;/div&gt;&#10;&#10;&lt;p&gt;全体の流れと微妙な差分を下記にメモ。&lt;/p&gt;&#10;&lt;ol&gt;&#10;&lt;li&gt;移行元でコンテナを停止してボリュームをバックアップし、移行先にアーカイブを送信&lt;/li&gt;&#10;&lt;li&gt;移行先でボリュームを復元&lt;/li&gt;&#10;&lt;/ol&gt;&#10;&lt;ul&gt;&#10;&lt;li&gt;ここでElasticsearchの書き込み権限がなかったりするので修正する&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;ol start="3"&gt;&#10;&lt;li&gt;移行先の&lt;code&gt;docker-compose.yml&lt;/code&gt;でボリューム名を指定する&lt;/li&gt;&#10;&lt;li&gt;&lt;code&gt;docker compose up&lt;/code&gt;してブラウザで動作確認&lt;/li&gt;&#10;&lt;/ol&gt;&#10;&lt;p&gt;の流れ。ボリューム名の定義と、権限の修正あたりが若干の追加要素となる。&lt;/p&gt;&#10;&lt;p&gt;ボリューム名は通常はフォルダ名にデフォ名つくような感じだろう。たとえばgrowiフォルダでは以下のようになっているだろう。&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nb"&gt;local&lt;/span&gt; growi_es_data&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nb"&gt;local&lt;/span&gt; growi_growi_data&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nb"&gt;local&lt;/span&gt; growi_mongo_configdb&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nb"&gt;local&lt;/span&gt; growi_mongo_db&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;これらについて、&lt;code&gt;docker-compose.yml&lt;/code&gt;で&lt;code&gt;es_dataや&lt;/code&gt;growi_dataとなっているところをそれぞれ修正する。そして&lt;code&gt;external&lt;/code&gt;を&lt;code&gt;true&lt;/code&gt;にする。ここらへんは上記WordPress記事のymlを見て参考に。&lt;/p&gt;&#10;&lt;p&gt;&lt;code&gt;docker compose up&lt;/code&gt;で様子を見るが、もしかするとElasticsearchでエラーが出てしまうかもしれない。これはElasticsearchコンテナの権限問題であるため、以下のコマンドで修正する。&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;docker run --rm -v &amp;lt;ボリューム名、たとえばgrowi_es_data&amp;gt;:/mnt alpine chown -R 1000:1000 /mnt&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;雑だが、以上。&lt;/p&gt;&#10;</description></item><item><title>Docker版WordPressの更新でFTPの認証情報を求められた時</title><link>https://hack-le.com/docker-wordpress-update-ftp/</link><pubDate>Thu, 11 Jun 2026 10:19:31 +0900</pubDate><guid>https://hack-le.com/docker-wordpress-update-ftp/</guid><description>&lt;h2 id="環境"&gt;環境&#10;&lt;/h2&gt;&lt;ul&gt;&#10;&lt;li&gt;Linux Mint Xfce 22.3&lt;/li&gt;&#10;&lt;li&gt;Docker 29.5.3&lt;/li&gt;&#10;&lt;li&gt;WordPress 6.9.4 -&amp;gt; 7.0&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;h2 id="症状"&gt;症状&#10;&lt;/h2&gt;&lt;p&gt;WebブラウザでWordPressを更新しようとしたら、以下のようにFTPの接続情報を求められた。&lt;/p&gt;&#10;&lt;p&gt;&lt;img loading="lazy" sizes="(max-width: 767px) calc(100vw - 30px), (max-width: 1023px) 700px, (max-width: 1279px) 950px, 1232px" src="https://hack-le.com/images/uploads/2026/06/8a83e6adea4b3eb00050acd193edf3f9-700x403.webp"&gt;&lt;/p&gt;&#10;&lt;h2 id="原因と対応"&gt;原因と対応&#10;&lt;/h2&gt;&lt;p&gt;Webサーバのユーザが&lt;code&gt;www-data&lt;/code&gt;になっていないと考えられる。確認する。&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;docker compose excc &amp;lt;wordpress&amp;gt; /bin/bash&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;ターミナルに入って、&lt;code&gt;/var/www/html&lt;/code&gt;のパーミッションを見てみる。&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;root@:/var/www# ls -l&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;total &lt;span class="m"&gt;4&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;drwxr-xr-x &lt;span class="m"&gt;5&lt;/span&gt; root root &lt;span class="m"&gt;4096&lt;/span&gt; May &lt;span class="m"&gt;18&lt;/span&gt; 03:05 html&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;oh&amp;hellip;。&lt;/p&gt;&#10;&lt;p&gt;ログアウトして修正する。&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;docker compose &lt;span class="nb"&gt;exec&lt;/span&gt; &amp;lt;wordpress&amp;gt; chown -R www-data:www-data /var/www/html&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;この後、WebブラウザよりWordPressで更新を実行すると、更新できるようになる。&lt;/p&gt;&#10;&lt;p&gt;以上。&lt;/p&gt;&#10;</description></item><item><title>Trilium Notes (Docker) のマシンを移行する</title><link>https://hack-le.com/trilium-notes-docker-migration/</link><pubDate>Sun, 07 Jun 2026 21:21:36 +0900</pubDate><guid>https://hack-le.com/trilium-notes-docker-migration/</guid><description>&lt;p&gt;現在運用しているTrilium Notesについて、Intel Mac mini 2018 + Docker Desktop から Linux Mint Xfce 22.3のサーバマシンに移行する。&lt;/p&gt;&#10;&lt;h2 id="環境"&gt;環境&#10;&lt;/h2&gt;&lt;ul&gt;&#10;&lt;li&gt;Trilium Notesのlatest&lt;/li&gt;&#10;&lt;li&gt;移行元&#10;&lt;ul&gt;&#10;&lt;li&gt;Intel Mac mini 2018&#10;&lt;ul&gt;&#10;&lt;li&gt;macOS Sonoma 14.6.1&lt;/li&gt;&#10;&lt;li&gt;Docker Desktop for mac v4.76.0&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;/li&gt;&#10;&lt;li&gt;移行先&#10;&lt;ul&gt;&#10;&lt;li&gt;ThinkPad L390&lt;/li&gt;&#10;&lt;li&gt;Linux Mint Xfce 22.3&#10;&lt;ul&gt;&#10;&lt;li&gt;Docker 29.5.2&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;h2 id="手順"&gt;手順&#10;&lt;/h2&gt;&lt;p&gt;移行元のマシンで停止する。&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;docker compose down&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;&lt;code&gt;docker-compose.yml&lt;/code&gt;でデータディレクトリを確認する。&lt;code&gt;TRILIUM_DATA_DIR&lt;/code&gt;がどうなっているか見る。&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# Running `docker-compose up` will create/use the &amp;#34;trilium-data&amp;#34; directory in the user home&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# Run `TRILIUM_DATA_DIR=/path/of/your/choice docker-compose up` to set a different directory&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# To run in the background, use `docker-compose up -d`&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;services:&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; trilium:&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="c1"&gt;# Optionally, replace `latest` with a version tag like `v0.90.3`&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="c1"&gt;# Using `latest` may cause unintended updates to the container&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; image: triliumnext/trilium:latest&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="c1"&gt;# Restart the container unless it was stopped by the user&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; restart: unless-stopped&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; environment:&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; - &lt;span class="nv"&gt;TRILIUM_DATA_DIR&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;/home/node/trilium-data&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; - &lt;span class="nv"&gt;TZ&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;Asia/Tokyo&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; ports:&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="c1"&gt;# By default, Trilium will be available at http://localhost:8080&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="c1"&gt;# It will also be accessible at http://&amp;lt;host-ip&amp;gt;:8080&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="c1"&gt;# You might want to limit this with something like Docker Networks, reverse proxies, or firewall rules,&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="c1"&gt;# however be aware that using UFW is known to not work with default Docker installations, see:&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="c1"&gt;# https://docs.docker.com/engine/network/packet-filtering-firewalls/#docker-and-ufw&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; - &lt;span class="s1"&gt;&amp;#39;8080:8080&amp;#39;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; volumes:&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="c1"&gt;# Unless TRILIUM_DATA_DIR is set, the data will be stored in the &amp;#34;trilium-data&amp;#34; directory in the home directory.&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="c1"&gt;# This can also be changed with by replacing the line below with `- /path/of/your/choice:/home/node/trilium-data&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; - &lt;span class="si"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;TRILIUM_DATA_DIR&lt;/span&gt;&lt;span class="k"&gt;:-&lt;/span&gt;&lt;span class="p"&gt;~/trilium-data&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;:/home/node/trilium-data&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="c1"&gt;# - /etc/timezone:/etc/timezone:ro&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; - /etc/localtime:/etc/localtime:ro&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;ここでは&lt;code&gt;~/trilium-data&lt;/code&gt;となっている。ついでにMacで&lt;code&gt;/etc/timezone&lt;/code&gt;がなかったのでコメントアウトされているね。&lt;/p&gt;&#10;&lt;p&gt;とりあえずアーカイブ化しよう。&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;tar -czvf trilium-data-backup.tar.gz ~/trilium-data&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;こいつを新しいマシンに転送してやる。&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;scp trilium-data-backup.tar.gz ユーザ@IPアドレス:移行先のパス&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;新しいマシンで、これを保存先ディレクトリ上に展開する。今回は&lt;code&gt;trilium-data&lt;/code&gt;にしている。&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;tar -xzvf trilium-data-backup.tar.gz&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;保存先ディレクトリに入って、もしデータベースの一時ファイルが存在したら削除する。&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;rm -f document.db-shm document.db-wal&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;準備ができたらコンテナの起動。とりあえずフロントで。&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;docker compose up&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;エラーなく起動したら、&lt;code&gt;http://IPアドレス:ポート&lt;/code&gt;にアクセスする。以前使っていたパスワードでログインできることを確認する。&lt;/p&gt;&#10;&lt;p&gt;問題なければOK。Ctrl-cで停止して、改めてバックグラウンドで起動する。&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;docker compose up -d&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;これでOK。しばらく動かして、安定していることを確認したら元のコンテナは削除してよい。&lt;/p&gt;&#10;&lt;p&gt;&amp;lt;関連記事&amp;gt;&lt;/p&gt;&#10;&lt;div class="blog-card-wrapper"&gt;&#10; &lt;a href="https://hack-le.com/evernote-notion-trilium-notes/" class="blog-card"&gt;&#10; &lt;div class="blog-card-content"&gt;&#10; &lt;div class="blog-card-label"&gt;&#10; &lt;svg xmlns="http://www.w3.org/2000/svg" width="13" height="13" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"&gt;&lt;path d="M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.71"&gt;&lt;/path&gt;&lt;path d="M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71"&gt;&lt;/path&gt;&lt;/svg&gt;&#10; &lt;span&gt;あわせて読みたい&lt;/span&gt;&#10; &lt;/div&gt;&#10; &lt;div class="blog-card-title"&gt;Evernote/Notion代替: Trilium NotesでインストールからWeb Clipまで&lt;/div&gt;&#10; &lt;div class="blog-card-url"&gt;/evernote-notion-trilium-notes/&lt;/div&gt;&#10; &lt;/div&gt;&#10; &lt;div class="blog-card-thumbnail"&gt;&#10; &lt;img src="https://hack-le.com/images/uploads/2026/03/image-4.png" alt="Evernote/Notion代替: Trilium NotesでインストールからWeb Clipまで" loading="lazy" /&gt;&#10; &lt;/div&gt;&#10; &lt;/a&gt;&#10;&lt;/div&gt;&#10;&#10;</description></item><item><title>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><item><title>Tailscaleを消すならOSごとになりそう</title><link>https://hack-le.com/remove-tailscale/</link><pubDate>Thu, 14 May 2026 00:00:00 +0900</pubDate><guid>https://hack-le.com/remove-tailscale/</guid><description>&lt;p&gt;Tailscaleについて、以下の記事が非常に参考になった。&lt;/p&gt;&#10;&lt;p&gt;&lt;a class="link" href="https://mq1.dev/entry/j7zvrsp48lb/" target="_blank" rel="noopener"&#10; &gt;Tailscaleやめたい - まいの雑記帳&lt;/a&gt;&lt;/p&gt;&#10;&lt;p&gt;「Tailscaleはネットワークの知識がない人が使うもの」という書き出しのため、使っている身からすると少々むむむとなりつつ、その後の記述を見ると、実務で相当苦労されたのだろうと察せられた。全体的に以下のようなふるまいがあるようだ。&lt;/p&gt;&#10;&lt;ul&gt;&#10;&lt;li&gt;リソースを過度に占有し他ソフトウェアと競合する&lt;/li&gt;&#10;&lt;li&gt;RFCにも従わない独自仕様&lt;/li&gt;&#10;&lt;li&gt;設定変更できない&lt;/li&gt;&#10;&lt;li&gt;ユーザのiptablesの設定を上書きする（これが一番ひどい）&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;p&gt;Tailscaleはかなり強権的かつ、相手に譲らない、また設定変更の余地がない、という特徴があるのはわかった。まぁ昨今ソフトウェアの挙動としては珍しくないかもしれない。他ソフトウェアとのリソース争い・主導権争いについては、まぁユーザからすると妖怪大戦争に巻き込まれた感じではあるものの、設定の変更ができないのはどうにもならない感じ。また、当然求められる慣習に反する独自仕様については確かにそこは合わせてくれと思う。まぁ俺がRFCだといわんばかりの態度はあちらの人にはよくあることかもしれない…。&lt;/p&gt;&#10;&lt;p&gt;記事主が一番腹を立てていたiptablesの書き換えは深刻で、この部分は明確にユーザの主権の侵害であるから、その怒りは正当なものであると感じられた。&lt;/p&gt;&#10;&lt;p&gt;ただ僕の環境について思った時、大きな影響はなさそうだ、というのもある。とはいえMagicDNSはオフにしたいと思った。これに起因するトラブルは割とありそうなので。&lt;/p&gt;&#10;&lt;p&gt;一番強権的だなぁと思うiptables関連はどうにもならなそうである。というか&lt;strong&gt;ファイルを書き換えるような挙動は、Tailscaleをアンインストールした場合にどこまで綺麗になるのか、不安&lt;/strong&gt;に思われた。強権的な振る舞いをするソフトウェアの思考として、立つ鳥跡を濁さずという言葉はない気がする。&lt;/p&gt;&#10;&lt;p&gt;&lt;strong&gt;どっかのタイミングでアンインストールしようかなと思っていたんだけれど、その際はOSごと再インストールしたほうがよさそう&lt;/strong&gt;ね(^_^;)&lt;/p&gt;&#10;&lt;p&gt;とはいえ、なんだかんだで当面は使い続ける気がする。自分の用途の場合、お外で使うプロトコルは正直HTTPSでだいたい済んでしまうので、Tailscaleはオーバーではある。実際AGHやCaddy絡ませてスプリットDNSやるときに明らかに複雑になってしまう。いらない複雑性だなとは思っている。とはいえ外部接続をCloudflare TunnelやVPS + frpにしてしまうと、インターネット前提になってしまうために認証やらなんやら考えることが増えるのはそう。まぁでもそのほうが、外から繋げたいのか外では繋げなくてもいいのか、明示的になるからいいかもしれない。&lt;/p&gt;&#10;&lt;p&gt;全部をTailscaleのネットワークに入れるのもなんだかなぁという気持ちはあったので、やっぱりどこかで重い腰あげて、脱Tailscaleはしようかなぁ。&lt;/p&gt;&#10;&lt;p&gt;その後本当に脱Tailscaleしましたが、結局OS再インストールまではしていません。まぁ所詮ホームサーバなので、実害はないかなぁと…。まぁそうでなくても、OS再インストールはどうせ定期的に起きるイベントですので、まぁ。&lt;/p&gt;&#10;</description></item><item><title>AIプログラミング開発日誌6：セルフホストしているアプリを管理するアプリをセルフホストしている</title><link>https://hack-le.com/ai-selfapps/</link><pubDate>Sun, 10 May 2026 00:00:00 +0900</pubDate><guid>https://hack-le.com/ai-selfapps/</guid><description>&lt;p&gt;色々とFOSSやら自作アプリやらをセルフホストしていたら、どのマシンに何を入れたかよくわからなくなってきて、管理アプリケーションの必要性を感じた。そこで、セルフホストしているアプリを管理するアプリをAIで作成しセルフホストしている。&lt;/p&gt;&#10;&lt;p&gt;&lt;img loading="lazy" sizes="(max-width: 767px) calc(100vw - 30px), (max-width: 1023px) 700px, (max-width: 1279px) 950px, 1232px" src="https://hack-le.com/images/uploads/2026/04/image-1-700x154.jpg"&gt;&lt;/p&gt;&#10;&lt;p&gt;&lt;em&gt;Antigravityで作った感&lt;/em&gt;&lt;/p&gt;&#10;&lt;p&gt;なんかいつのまにか&lt;strong&gt;41のアプリケーションをセルフホストしていた&lt;/strong&gt;らしい。というか&lt;strong&gt;常時稼働サーバが6台ある&lt;/strong&gt;のもなかなか意味不明な状況である。ちなみにサーバじゃないので登録してないマシンもある😇エネショートしたらしぬ。&lt;/p&gt;&#10;&lt;p&gt;もともとはスプレッドシートで管理していたのを、Antigravityに読み込ませて適当にアプリ化した。なのでまだ機能的には台帳程度だ。逆に言うと、台帳程度のアプリケーションなら誰でも秒で作れる。&lt;strong&gt;非エンジニアはスプレッドシートからはじめて、それをAIに読み込ませてアプリ化するところから始めるといいかもしれない&lt;/strong&gt;ね。&lt;/p&gt;&#10;&lt;p&gt;ただ台帳じゃアプリの甲斐がない。というかそれならたいていの場合はスプレッドシートでいい。まぁテーブルの構造じゃなくてツリー構造のデータなら、スプレッドシートでは扱いづらいから、単に台帳でも価値あるかもしれないけど、やっぱりアプリならなんかしらアクションがないとね。&lt;/p&gt;&#10;&lt;p&gt;具体的には、ここからリバースプロキシの設定ファイル（Caddyfile）を書き出したり、デプロイ・ホスティングやバックアップなど総合的に管理していきたいと思っている。また、その後は、複数のマシンをローテーションで使いまわして、様々な機材を検証する体制を整えたいね。なにしろうちには40台くらいPCがあるので。アプリ1個割り当てられて草。そんでとにかく検証の記録をつけていこう。検証なんて実践以外ないし。実際に使ってみて使えるか、それがすべて。マシンの検証記録なども追加していきたいな。&lt;/p&gt;&#10;&lt;p&gt;本当にやりたいことはPCの采配であり、その歴史を記録することなんだろうね。&lt;strong&gt;アプリを作っていると、自分のやりたかったことが見えてくる気がしている&lt;/strong&gt;。実際、41のアプリケーションのうち10ちょっとが自作なのだけれど、全部ちゃんと使っているかというと微妙。でも半分くらいは使っていて、使い続けられているものには傾向があるように思われる。&lt;/p&gt;&#10;&lt;p&gt;なんとなく、僕がよく使うのは管理系が多いようだ。今回作り始めたセルフホスト管理アプリもそうだけれど。管理されるの嫌いな癖に管理するのは好きなのか。いや、人を管理するのは好きじゃないんだけど、モノを管理するのは好きなんだね。コレクター的な気質があるんだろうな。&lt;strong&gt;モノがたしかにそこにあった痕跡を残したいとか、そういう欲求があるのかもしれない&lt;/strong&gt;。僕みたいなのが小金持つと、個人で博物館とか作ったりするんだろうねぇ。&lt;/p&gt;&#10;&lt;p&gt;一時期はなんだか今まで自分のやってきたことが何もかも無意味に思えてナーバスになっていたのだけれど、最近は初心にかえり、とりあえず自分がほしいモノを作っていこうと思っている。AIでソフトウェアエンジニアの多くが不要になり、巷では誰も使わないサービスやアプリが乱立する昨今だけれど、不思議と僕が欲しいものだけがない。お陰様で僕にもやることが残っている。まぁ世情も荒れているし、いつまでそんな贅沢ができるかはわからないけど、当分はいいだろう。&lt;/p&gt;&#10;</description></item><item><title>Linux Mint Xfce 22.3 を WebDAVサーバにする</title><link>https://hack-le.com/linux-mint-xfce-22-3-webdav/</link><pubDate>Thu, 07 May 2026 00:00:00 +0900</pubDate><guid>https://hack-le.com/linux-mint-xfce-22-3-webdav/</guid><description>&lt;p&gt;音楽ファイルのストリーミングでWebDAVを利用していた。これまではNASで構築していたのだけれど、Linuxサーバ移行の流れで自分でサーバ組むことにした。&lt;/p&gt;&#10;&lt;h2 id="環境"&gt;環境&#10;&lt;/h2&gt;&lt;ul&gt;&#10;&lt;li&gt;Linux Mint Xfce 22.3&#10;&lt;ul&gt;&#10;&lt;li&gt;ThinkPad L390&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;/li&gt;&#10;&lt;li&gt;docker 29.4.1&lt;/li&gt;&#10;&lt;li&gt;&lt;a class="link" href="https://github.com/BytemarkHosting/docker-webdav" target="_blank" rel="noopener"&#10; &gt;BytemarkHosting/docker-webdav&lt;/a&gt;&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;p&gt;apache生で入れると融通きかなくなりそうなので、docker使うよ。&lt;/p&gt;&#10;&lt;h3 id="docker-composeyml"&gt;docker-compose.yml&#10;&lt;/h3&gt;&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; webdav:&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; image: bytemark/webdav&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; container_name: webdav_server&#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; 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;&lt;/span&gt;&lt;span class="si"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;WEBDAV_PORT&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;: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; - &lt;span class="nv"&gt;AUTH_USER&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="si"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;WEBDAV_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; - &lt;span class="nv"&gt;AUTH_PASSWORD&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="si"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;WEBDAV_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; - &lt;span class="s2"&gt;&amp;#34;&lt;/span&gt;&lt;span class="si"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;HOST_DATA_PATH&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;:/var/lib/dav/data&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="c1"&gt;# 環境変数からユーザーIDを指定して権限問題を回避&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; user: &lt;span class="s2"&gt;&amp;#34;&lt;/span&gt;&lt;span class="si"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;PUID&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;PGID&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;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;これの変更部分は &lt;code&gt;.env&lt;/code&gt;で以下。&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# WebDAV 認証情報&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;WEBDAV_USER&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;user1&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nv"&gt;WEBDAV_PASSWORD&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;your_secure_password&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#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;WEBDAV_PORT&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="m"&gt;8080&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;# ホスト側のデータ保存先 (外付けHDDのパスなど)&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;HOST_DATA_PATH&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;/mnt/external_hdd/webdav_data&#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;そしたらupで動作確認。&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;dav://localhost:ポート&lt;/code&gt;としてやると、ユーザ名とパスワードが求められるので、入力した情報を記述。&lt;/p&gt;&#10;&lt;p&gt;ブラウザで開けたらOK。そしたらバックグラウンドで動かす。&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;h2 id="おまけ証明書発行してcloudbeatsでストリーミング再生"&gt;（おまけ）証明書発行してCloudBeatsでストリーミング再生&#10;&lt;/h2&gt;&lt;p&gt;CloudBeatsは音楽再生のAndroidアプリ。これでWebDAV選択してストリーミングできる。ただCloudBeatsはHTTPS必須。なのでなんらかの手段で証明書発行が必要。&lt;/p&gt;&#10;&lt;p&gt;多分一番楽なのは、Cloudflare Tunnelでつなぐ。常にインターネット接続になってしまうが、まぁ音楽ファイルの再生くらいならそんなに気にもならないのでは。&lt;/p&gt;&#10;&lt;p&gt;次に楽なのはTailscale。Tailscaleで発行されるドメイン*.ts.netを使ってアクセス。&lt;/p&gt;&#10;&lt;p&gt;普通の独自ドメインやインターネット接続前提を頑張るなら、Caddy(リバースプロキシ) + AdGuardHome(LAN内DNS)でスプリットDNS。Tailscaleネットワークでも独自ドメインでやりたいならこれ。この設定はけっこう頑張る。&lt;/p&gt;&#10;&lt;div class="blog-card-wrapper"&gt;&#10; &lt;a href="https://hack-le.com/android-cloudbeats-qnap-nas-cloudflare%e3%81%a7%e5%a4%96%e3%81%a7nas%e3%81%ae%e9%9f%b3%e6%a5%bd%e3%82%92%e3%82%b9%e3%83%88%e3%83%aa%e3%83%bc%e3%83%9f%e3%83%b3%e3%82%b0%e3%82%aa%e3%83%95/" 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 &amp;#43; CloudBeats &amp;#43; QNAP NAS &amp;#43; Cloudflareで外でNASの音楽をストリーミング&amp;amp;オフライン再生する&lt;/div&gt;&#10; &lt;div class="blog-card-url"&gt;/android-cloudbeats-qnap-nas-cloudflareで外でnasの音楽をストリーミングオフ/&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_18934_1787181644.webp" alt="Android &amp;#43; CloudBeats &amp;#43; QNAP NAS &amp;#43; Cloudflareで外でNASの音楽をストリーミング&amp;amp;オフライン再生する" 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;Geminiの提案が意味不明かつ、bytemark/webdavのdocker-compose.ymlも完全に妄想を出してきて時間を無駄にした。というか、以前にブックマーク同期のfloccusで既にWebDAVサーバたててたの完全に忘れていた。最初から自分の書いた記事を参照すべきだった。&lt;/p&gt;&#10;&lt;div class="blog-card-wrapper"&gt;&#10; &lt;a href="https://hack-le.com/floccus-webdav/" 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;セルフホストでブックマーク同期：Floccus &amp;#43; WebDAV(bytemark/webdav)&lt;/div&gt;&#10; &lt;div class="blog-card-url"&gt;/floccus-webdav/&lt;/div&gt;&#10; &lt;/div&gt;&#10; &lt;div class="blog-card-thumbnail"&gt;&#10; &lt;img src="https://hack-le.com/images/uploads/2026/01/output-19.webp" alt="セルフホストでブックマーク同期：Floccus &amp;#43; WebDAV(bytemark/webdav)" loading="lazy" /&gt;&#10; &lt;/div&gt;&#10; &lt;/a&gt;&#10;&lt;/div&gt;&#10;&#10;</description></item><item><title>本格的にLinuxサーバを使い始めた</title><link>https://hack-le.com/linux-server/</link><pubDate>Thu, 30 Apr 2026 00:00:00 +0900</pubDate><guid>https://hack-le.com/linux-server/</guid><description>&lt;p&gt;長いことIntel Mac mini 2018をメインの自宅サーバとしてきたが、今メインサーバの座をLinuxを入れたThinkPad L390にうつしつつある。ThinkPad L390は2018年頃のモデルなので、Mac miniと同世代だ。実際CPUもCore i5-8265Uと第8世代だしね。&lt;/p&gt;&#10;&lt;h2 id="nasを潰した"&gt;NASを潰した&#10;&lt;/h2&gt;&lt;p&gt;既存のサーバも動いている中で、なにをもって本格的にというかの定義は難しい。&lt;/p&gt;&#10;&lt;p&gt;とりあえず、家にあったNASの電源を落として、データをそっくりうつし、いくつかのアプリをセルフホストで常用している。また、LAN内DNSやリバースプロキシも入れた。コイツを落とすと家の中のネットが落ちる。ついでにDNS-01チャレンジでLAN内なのに証明書更新などもしている（これは正直馬鹿らしいと思ったがブラウザがそれを要求するので仕方がない）。常時稼働が前提となっている。自作アプリのホスティング先にもなっている。&lt;/p&gt;&#10;&lt;p&gt;なのでまぁ、本格的に運用している、といってもよいのではなかろうか。&lt;/p&gt;&#10;&lt;p&gt;また、サーバの仕事のみならず、YouTubeの垂れ流しなんかもしている。これは4Kディスプレイに繋げる格好だ。まぁ例によって音一つ出すのにもハードウェア周りの調整は必要になったが、今のところ解決不能な問題には直面していない。&lt;/p&gt;&#10;&lt;h2 id="linux-mint-xfce-223を導入"&gt;Linux Mint Xfce 22.3を導入&#10;&lt;/h2&gt;&lt;p&gt;ディストリビューションはLinux Mint Xfce 22.3にした。Ubuntuじゃないの、と思われるだろうか。しかし今のUbuntuは重かろう。昔のマシンを復活させるには向かないのではないか。また、今のGNOMEやWaylandをあまり好きになれなくて、xfceを使いたいというのもあった。また、試した時はZorin OSからLiteが消えてしまっていたので、そこそこメジャーどころでLinux Mint Xfceとなった感じ。今はLiteも復活しているので、折を見て試したい。&lt;/p&gt;&#10;&lt;p&gt;そもそもサーバにGUIがいるのか？と思われるかもしれないが、ホームサーバとしてはGUIはあったほうが断然よい。というか、普通にYouTube流すとか動画流すとかやるよ。仕事じゃないんだから。それにGUIは便利なもので、スペックがカツカツとか画面がないとかならともかく、普段遣いではあったほうが便利なものだ。&lt;/p&gt;&#10;&lt;p&gt;それに、実際使ってみるとXfceは非常に軽量で、4GB RAMでもほとんど困らないと思う。まぁ8GBくらいはあったほうが用途は広がるけどね。かなり多くのことが、4GBでもさばけるよ。&lt;/p&gt;&#10;&lt;p&gt;ま、そう言いつつ32GB RAMをぶっ刺したのだが…しかしマジで8GBを越えたことがない。まぁこれから色々入れていったら超えるだろうが、実用上は16GBあればまず十分ではないのかな…。多分それ以上使うような用途になると、CPUのほうがボトルネックになる気がする。&lt;/p&gt;&#10;&lt;h2 id="hwはthinkpad-l390"&gt;HWはThinkPad L390&#10;&lt;/h2&gt;&lt;p&gt;なにしろジャンク、2018年のLenovo ThinkPad L390で、CPUはCore i5-8265Uとなっている。&lt;/p&gt;&#10;&lt;p&gt;第8世代はラップトップにとっては大きな節目だ。というのも、ここからようやくIntelが舐めプをやめて4コアCPUをラップトップに搭載し始めたので…。それもこれもRyzenのおかげやで。サーバマシンはなんだかんでスペックも重要なので、個人的にはN100のミニPCよりもこの世代のジャンクを漁ったほうがいいと思っている。&lt;/p&gt;&#10;&lt;p&gt;なによりラップトップは画面、キーボード、そしてバッテリー（！）が全部盛りの人類の叡智。まぁバッテリーはしばしば切れているのだが、割と80%くらい残っているのもよくあるし、そこは運かな。個人的にはバランスよくできていると思うので、サーバマシンとしての活路を見出すべくジャンクPCを仕入れていたら気づいたら30台越えてしまい、検証がまったく追いついていないので、さすがに今はこれ以上の購入を控えている(^_^;)&lt;/p&gt;&#10;&lt;p&gt;で、特にThinkpad L390をメインサーバマシンとして選んだのは、トータルのバランスが良かったからだ。裏蓋開ければCMOS電池までアクセスできるなどメンテナンス性が良い。なによりメモリが換装できる。&lt;/p&gt;&#10;&lt;p&gt;当たり前のようだが、そうでもない。この時代は主にAppleのせいだと思うが、メモリをソルダリングするという悪習が流行っていた。なので、X280は上位モデルのはずだが、やや地雷みがある。LANポートやら機能を削ることがイケてるとされた、2010年代のまやかしが極致だった時代。&lt;/p&gt;&#10;&lt;p&gt;なので、CPUは2コアになるが、サーバとしてはThinkPadならX270とか一つ前のマシンのほうが良い、という考えも一理ある。X270はメモリ換えられるしLANポートあるし従来の電源ポートとUSB PDの両方に対応しているし筐体もペラペラしていないなど、良いところがある。&lt;/p&gt;&#10;&lt;p&gt;まぁでもやっぱりCPU2コアかー、と思ったところでThinkPad L390ですよ。こちらは第8世代Core i5とメモリ換装の両方を備えたThinkPadということで、今更になってLinuxサーバ母体としての妙味が生まれているように思われる。ただ無線チップがIntelとRealtekでガチャらしい。無事Intelだったが。まぁでもこれは500円くらいでフリマでも手に入る。&lt;/p&gt;&#10;&lt;p&gt;まぁとはいえ、ThinkPad X280でも(Core i5で8GB RAM以上なら)別に悪くないし、DELLのLatitudeもあるし、流通量がそんなに多くない印象のL390は別に狙って買うモデルでもない。&lt;/p&gt;&#10;&lt;h2 id="温故知新"&gt;温故知新&#10;&lt;/h2&gt;&lt;p&gt;個人的には10年くらい前に、パーソナルなコンピュータとしてのPCはHWもSWもほぼほぼ完成したと思っている。使えないのはHWが悪いのではなく、だいたいWindowsや無駄飯ぐらいのソフトウェアが悪い。&lt;/p&gt;&#10;&lt;p&gt;なので、あの時代のジャンクを漁り、そこにLinuxやFOSS、また自作アプリをのせてやりたいことをやるのは、本当は使えるはずの計算資源を有効に使う、意義あることだと思っている。&lt;/p&gt;&#10;&lt;p&gt;なかなか普通の人には手が出ない領域であることも確かだが、AIのせいでAI PCが高くなるというグローバルコメディが展開され、資源危機が囁かれる中で今日も元気に生成AIのインプ稼ぎが大流行という狂った時代の中で、見直される道筋もあるのではなかろうか、などと思いつつ、ボチボチと今後のことを考えている。&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/genjitsuwaku/" 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;/genjitsuwaku/&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_49299_1776064193.webp" alt="自宅サーバーは現実枠" loading="lazy" /&gt;&#10; &lt;/div&gt;&#10; &lt;/a&gt;&#10;&lt;/div&gt;&#10;&#10;&lt;div class="blog-card-wrapper"&gt;&#10; &lt;a href="https://hack-le.com/linux-mint-xfce/" 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を入れてからやること&lt;/div&gt;&#10; &lt;div class="blog-card-url"&gt;/linux-mint-xfce/&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/original_47682_1770597374_16x9.jpg" alt="Linux Mint Xfceを入れてからやること" 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/linux-pc-hdmi-display-flicker/" 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 PCとHDMI接続したディスプレイでチラつきの対応&lt;/div&gt;&#10; &lt;div class="blog-card-url"&gt;/linux-pc-hdmi-display-flicker/&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_49399_1776334946.webp" alt="Linux PCとHDMI接続したディスプレイでチラつきの対応" loading="lazy" /&gt;&#10; &lt;/div&gt;&#10; &lt;/a&gt;&#10;&lt;/div&gt;&#10;&#10;</description></item><item><title>自宅内のアプリに、同一のドメインで、LAN内とインターネットの外からの両方に対応する（スプリットDNS）構成編</title><link>https://hack-le.com/splitdns/</link><pubDate>Wed, 29 Apr 2026 00:00:00 +0900</pubDate><guid>https://hack-le.com/splitdns/</guid><description>&lt;p&gt;なんのこっちゃという感じだが、自宅サーバのWebサイトに対してドメインでアクセスしてしまうと、LAN内になるのにインターネット経由になってしまう。それはなんだか阿呆みたいなので、LAN内からはLANでつなげたい。&lt;/p&gt;&#10;&lt;p&gt;つまりこういうことです。&lt;/p&gt;&#10;&lt;pre class="mermaid" style="visibility:hidden"&gt;graph TD&#10;subgraph "インターネット (外からの道)"&#10;A["スマホ (4G/5G)"] --&gt; B["Cloudflare (中継)"]&#10;B --&gt; C["トンネル (暗号化)"]&#10;end&#10;subgraph "家の中 (LAN内の道)"&#10;D["PC / スマホ (Wi-Fi)"] --&gt; E["AdGuard Home (近道の案内板)"]&#10;end&#10;C --&gt; F["Caddy (玄関口)"]&#10;E --&gt;|"近道 (爆速)"| F&#10;F --&gt; G["WordPress / 自分のアプリ"]&#10;style E fill:#f96,stroke:#333,stroke-width:2px&#10;style F fill:#f9f,stroke:#333,stroke-width:2px&#10;style G fill:#bbf,stroke:#333,stroke-width:2px&lt;/pre&gt;&lt;p&gt;同じドメインで、LANとインターネットで別々のルートにする。LAN内ではLAN内DNSを使って名前解決する、ってことだね。これによって、LAN内のアプリに&lt;code&gt;https://app.example.com&lt;/code&gt;でインターネットを使わずにアクセスできるようになる。&lt;/p&gt;&#10;&lt;p&gt;IPアドレス直打ちやTailscaleのMagicDNSとかじゃあかんのか？という向きもあると思うが、WordPressなどはサイトドメインにリダイレクトする仕様があったりするためそうもいかないし、そもそもLANとインターネットで２つのブックマークを作るというのは、なんだかつらいものがある。&lt;/p&gt;&#10;&lt;p&gt;ということで、色々頑張った結果、なんかLinux Mint Xfce + Caddy(+Cloudflare) + Tailscale + AdguardHome という構成になって1日かかってしまったんだが、正直ここまで頑張らなくてももっとシンプルにやれる。&lt;/p&gt;&#10;&lt;h2 id="構成"&gt;構成&#10;&lt;/h2&gt;&lt;h3 id="基本の構成"&gt;基本の構成&#10;&lt;/h3&gt;&lt;p&gt;順番に考えていこう。外からの通信はみんな大好きCloudflare Tunnel から直通でOK。問題は、LAN内だね。&lt;/p&gt;&#10;&lt;p&gt;まずは、LAN内DNSを作って、ルータでそこに向ける。これにAdGuard Homeを使う。AdGuardHomeで特定のドメインを、リバースプロキシのCaddyに向ける。考え方の基本はこれだけ。&lt;/p&gt;&#10;&lt;pre class="mermaid" style="visibility:hidden"&gt;graph TD&#10;subgraph "インターネット (外からの道)"&#10;User_Ext["ユーザー"]&#10;Tunnel["Cloudflare Tunnel(cloudflared)"]&#10;end&#10;subgraph "LAN内 (秘密の近道)"&#10;User_Int["自分 (Wi-Fi)"]&#10;AGH["AdGuard Home(案内板: DNS書き換え)"]&#10;Caddy["Caddy(玄関: HTTPSプロキシ)"]&#10;end&#10;subgraph "アプリ群"&#10;App["WordPress / AIアプリ 等"]&#10;end&#10;%% 外のルート (Caddyをバイパス)&#10;User_Ext --&gt; Tunnel&#10;Tunnel --&gt;|"直接ポートを指定"| App&#10;%% 内のルート (Caddyを経由)&#10;User_Int -.-&gt;|"① 案内を聞く"| AGH&#10;AGH -.-&gt;|"② CaddyのIPを回答"| User_Int&#10;User_Int --&gt;|"③ HTTPSでアクセス"| Caddy&#10;Caddy --&gt;|"④ アプリへ転送"| App&#10;style AGH fill:#f96,stroke:#333&#10;style Caddy fill:#f9f,stroke:#333&#10;style Tunnel fill:#fff,stroke:#333&#10;style App fill:#bbf,stroke:#333&lt;/pre&gt;&lt;p&gt;これが基本なので、単にスプリットDNSしたいだけならこれでよい。というか、個人的にはこれで十分だと思う。なんかAIにのせられてゴチャゴチャとやってしまったが、正直それで思ったのは「いらねぇ」だった。&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;証明書の発行をCaddyは本来サラッとこれをやってくれるのだが、今回はLAN内であるために、必要な80/443を使えない。&lt;/p&gt;&#10;&lt;p&gt;ここで、Cloudflareを利用すれば、API使ってゾーン編集して一時的にTXTレコードを作るなどして、証明書の発行ができるプラグインを活用する（DNS-01チャレンジ）。これによって、LAN内であるにも関わらずオレオレではない証明書ができるので、これにはブラウザもニッコリ。警告が消えるよ！やったね、Googleさん。&lt;/p&gt;&#10;&lt;p&gt;と、ブラウザはニッコリなのだが僕はかなりイライラしている。やっていることはほとんど形式的で実際的な意味はない。ついでにCloudflareに依存してしまっている…いやこれは別のプロバイダ用のプラグインもあるので、置き換えはできるんだけど。できるけどなんでこんな大掛かりなことに。&lt;/p&gt;&#10;&lt;p&gt;まぁ、とりあえずここまでを図示しよう。&lt;/p&gt;&#10;&lt;pre class="mermaid" style="visibility:hidden"&gt;graph TD&#10;subgraph Internet ["インターネット (外からの道)"]&#10;User_Ext["ユーザー"]&#10;Tunnel["Cloudflare Tunnel(cloudflared)"]&#10;end&#10;subgraph LAN ["LAN内 (秘密の近道)"]&#10;User_Int["自分 (Wi-Fi)"]&#10;AGH["AdGuard Home(DNS書き換え)"]&#10;Caddy["Caddy(証明書管理 &amp; プロキシ)"]&#10;end&#10;subgraph Cloudflare_Control ["Cloudflare管理下 (DNS-01)"]&#10;CF_API["Cloudflare API"]&#10;DNS_Rec["TXTレコード (一時的な合言葉)"]&#10;end&#10;subgraph CA ["証明書発行機関 (Let's Encrypt等)"]&#10;Verify["レコードの正当性検証"]&#10;end&#10;subgraph App_Server ["アプリ"]&#10;App["WordPress / 各種アプリ"]&#10;end&#10;%% 外のルート&#10;User_Ext --&gt; Tunnel&#10;Tunnel --&gt;|"直接ポートを指定"| App&#10;%% 内のルート&#10;User_Int -.-&gt;|"① ドメインのIPを問い合わせ"| AGH&#10;AGH -.-&gt;|"② CaddyのLAN内IPを回答"| User_Int&#10;User_Int --&gt;|"③ HTTPSアクセス (警告なし)"| Caddy&#10;Caddy --&gt;|"④ アプリへ転送"| App&#10;%% 証明書発行 (DNS-01) のプロセス&#10;Caddy |"⑤ APIトークンで認証"| CF_API&#10;CF_API -- "⑥ 証明用のレコードを設置" --&gt; DNS_Rec&#10;DNS_Rec -. "⑦ 外部から合言葉を確認" .-&gt; Verify&#10;Verify -- "⑧ 証明書を発行" --&gt; Caddy&#10;style AGH fill:#f96,stroke:#333&#10;style Caddy fill:#f9f,stroke:#333&#10;style Tunnel fill:#fff,stroke:#333&#10;style App fill:#bbf,stroke:#333&#10;style CF_API fill:#9cf,stroke:#333&lt;/pre&gt;&lt;p&gt;2010年代以降、インターネットは同じことをどれだけ複雑にやれるか選手権が全世界で開催されたため、その煽りを受けた格好だ。&lt;/p&gt;&#10;&lt;p&gt;単に複雑なだけではなく、&lt;strong&gt;これはむしろ脆弱になっていないか&lt;/strong&gt;と思う。&lt;strong&gt;Cloudflare（等のプロバイダ）に依存するために、攻撃対象が純粋に増えている&lt;/strong&gt;。何してるんだ俺は。俺が俺の作ったアプリを俺のLAN内で使うのに、Cloudflareという第三者をとおすほうがセキュアであるというのはどういう理屈なんだ？そんなに俺は俺が信用できないのか？どうなんだ俺？&lt;/p&gt;&#10;&lt;p&gt;俺ではなく今のインターネットの問題である。というか根本的にLAN内で完結することのはずなのに、少なくとも証明書の更新時にインターネット接続が必要になっており、オフラインになると維持できない仕組みだ。まぁさすがに前提条件を考えるとインターネットの維持まで疑っても仕方ないかもしれないが、しかし必要もなくインターネットの外に出ることのどこがセキュリティだというのか。&lt;/p&gt;&#10;&lt;p&gt;まぁ一応、&lt;strong&gt;なにかあったら仕組みを止めれば良い&lt;/strong&gt;ので、最低限のラインは超えていて依存とは言い切れない、くらいに考えてはいるが、いったいマジで何をやっているんだという気持ちが強い。そもそもCloudflare Tunnel使っとるやないかいと言われそうだが、これは単に玄関で、いざとなればVPS + frpなどで即座に別の玄関に変えることは可能（後述するTailscaleがあればそれも使える）だし、実際似たようなことを以前のConoHa大規模障害時にやったこともあるので、依存ではないと考えている。だがAPIを使った証明書発行と更新というのはなぁ…。&lt;/p&gt;&#10;&lt;p&gt;ちなみにSSL証明書を発行するタイミングで、透明性のためにドメインを作られたことが公になってしまうため、即座に攻撃対象となるらしい。セキュリティ……？&lt;/p&gt;&#10;&lt;h3 id="tailscaleの追加"&gt;Tailscaleの追加&#10;&lt;/h3&gt;&lt;p&gt;ここまででもかなり嫌になるが、なんか別の用途があったりしてTailscaleなど使っていると、構成はさらに複雑になる。TailscaleのDNSをAdGuard Homeに向ける必要があるからだ。また、MagicDNSを使えるのはよいのだが、それゆえのハマり要素もある。&lt;/p&gt;&#10;&lt;p&gt;結果、最終的に以下の構図になる。インターネット経由の経路と、Tialscaleのネットワーク経由でAdGuard HomeとCaddyを使う経路ができるわけだ。&lt;/p&gt;&#10;&lt;pre class="mermaid" style="visibility:hidden"&gt;graph TD&#10;subgraph Internet ["1. インターネット (外からの道)"]&#10;User_Ext["ユーザー"]&#10;Tunnel["Cloudflare Tunnel(cloudflared)"]&#10;end&#10;subgraph Tailscale_Mesh ["2. Tailscale Mesh (仮想ネットワーク)"]&#10;direction TB&#10;TS_DNS["Tailscale DNS / MagicDNS(Nameserver: AdGuard IP)"]&#10;User_Int["自分 (PC/スマホ)Tailscale ON"]&#10;end&#10;subgraph Linux_Server ["3. Linux Server (cimon)"]&#10;direction TB&#10;AGH["AdGuard Home(DNS書き換え実行)"]&#10;subgraph Docker ["Docker"]&#10;Caddy["Caddy(HTTPSプロキシ / 証明書管理)"]&#10;end&#10;end&#10;subgraph Mac_Mini ["4. 別マシン (mac-mini)"]&#10;App_Remote["WordPress / AIアプリ"]&#10;end&#10;subgraph Cloudflare_CA ["5. Cloudflare &amp; CA"]&#10;CF_API["Cloudflare API"]&#10;LE["Let's Encrypt"]&#10;end&#10;%% 外のルート&#10;User_Ext --&gt; Tunnel&#10;Tunnel --&gt;|"直接ポート指定"| App_Remote&#10;%% 内のDNSフロー&#10;User_Int -.-&gt;|"① DNS問い合わせ"| TS_DNS&#10;TS_DNS -.-&gt;|"② 名前解決を丸投げ"| AGH&#10;AGH -.-&gt;|"③ CaddyのIPを回答"| User_Int&#10;%% 内の通信フロー&#10;User_Int --&gt;|"④ HTTPSアクセス"| Caddy&#10;%% Caddyからの転送 (MagicDNS vs IP)&#10;Caddy --&gt;|"⑤ Proxy via MagicDNS"| App_Remote&#10;Caddy -.-&gt;|"⑤ Proxy via Local IP(自分自身のループバック回避)"| AGH&#10;%% 証明書取得 (DNS-01)&#10;Caddy |"⑥ TXTレコード操作"| CF_API&#10;CF_API |"⑦ 検証"| LE&#10;style AGH fill:#f96,stroke:#333,stroke-width:2px&#10;style Caddy fill:#f9f,stroke:#333,stroke-width:2px&#10;style TS_DNS fill:#9cf,stroke:#333,stroke-width:1px&#10;style Tunnel fill:#fff,stroke:#333,stroke-width:1px&lt;/pre&gt;&lt;p&gt;これにより以下の3つの経路が並立している。&lt;/p&gt;&#10;&lt;ol&gt;&#10;&lt;li&gt;インターネット経路&lt;/li&gt;&#10;&lt;li&gt;Tailscale経路&lt;/li&gt;&#10;&lt;li&gt;LAN内IP直打ち経路&lt;/li&gt;&#10;&lt;/ol&gt;&#10;&lt;p&gt;正直どうかと思う。&lt;/p&gt;&#10;&lt;p&gt;しかし、先の証明書と違い、こちらのTailscaleは仮想ネットワークの構築という明確な役割があるため、別用途で必須となっているのであれば、これはやらざるを得ない。&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;AdGuard Home + Caddyでいい&lt;/strong&gt;と思う。&lt;strong&gt;ブラウザの警告も気にしないならDNS-01チャレンジもいらん&lt;/strong&gt;。&lt;strong&gt;でもここまできたら全部やってもいんじゃね感&lt;/strong&gt;。普通につかえるとストレスフリーなのはまぁそう。&lt;/p&gt;&#10;&lt;p&gt;が、これと別に&lt;strong&gt;Tailscaleを導入している場合、考えるところが増える&lt;/strong&gt;。Tailscaleが入ると、そこで名前解決があるので、*.ts.netでいいなら、実はAGHはいらない。ただ今回は外からのドメインを使うという要件があるため、AGH + Tailscale + Caddyというカオスになるのだが…。&lt;/p&gt;&#10;&lt;p&gt;&lt;strong&gt;そもそもスプリットDNSなんてやらないほうがよかった説も有力である&lt;/strong&gt;。IPアドレス直打ちはしんどくね問題はあるが、それだけならMagicDNS使ったっていいし。警告なんて知らねぇっていってもいいし。気分の問題の側面が大きい。まぁWordPressのようにサイトドメインの概念があると、ドメインは固定になってしまうため、、同一ドメインで別経路を取るのは価値があるのだが、そこまでして…とも思える。&lt;/p&gt;&#10;&lt;p&gt;じゃあなぜお前はやったのか？AIに相談してたらなんかこうなってしまった。AIというやつはそうなるんだ。ベストプラクティスのツギハギをして、本来必要だったものから遠ざかっていく。&lt;strong&gt;途中で「絶対こんなのは必要ない」と思ったが、エラーが出ているのは腹立たしい&lt;/strong&gt;ので最後までやってしまった。&lt;/p&gt;&#10;&lt;p&gt;自宅サーバってレベルじゃねぇぞ、などという気もしつつ、この記事は、どこが分岐点だったのか？をまとめたものに近い。そういう意味じゃよく理解できたと言えるかもしれないが、疲れた…。&lt;strong&gt;AIが過剰に重視してしまう指標と、無視しがちな指標が存在する&lt;/strong&gt;んだね。 それらの指標は、現実上の重要性とたいてい一致しない。 これは &lt;strong&gt;「AI」を「社会」や「組織」に置き換えても成り立つ&lt;/strong&gt;んだな。&lt;/p&gt;&#10;&lt;p&gt;まぁでも、&lt;strong&gt;僕の性格を考えるとどうせそのうち手を付けた気はする&lt;/strong&gt;。ブラウザの警告うぜぇとなって、しかしTailscaleのドメインに依存するやり方はいやだろうし、結局スプリットDNS構成になったんじゃないかなぁ…。じゃあいいのか…。と、ここまで書いただけでなんかもうお腹いっぱいなので今回は構成のみ。具体的な手順は次の記事で。&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/vps-caddy-wordpress-cft/" 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;VPS &amp;#43; Caddy &amp;#43; WordPress を構成する さようならCloudflare Tunnel&lt;/div&gt;&#10; &lt;div class="blog-card-url"&gt;/vps-caddy-wordpress-cft/&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_48060_1771377926.webp" alt="VPS &amp;#43; Caddy &amp;#43; WordPress を構成する さようならCloudflare Tunnel" loading="lazy" /&gt;&#10; &lt;/div&gt;&#10; &lt;/a&gt;&#10;&lt;/div&gt;&#10;&#10;&lt;div class="blog-card-wrapper"&gt;&#10; &lt;a href="https://hack-le.com/yaranakuteiikotobakarishiteiru/" class="blog-card"&gt;&#10; &lt;div class="blog-card-content"&gt;&#10; &lt;div class="blog-card-label"&gt;&#10; &lt;svg xmlns="http://www.w3.org/2000/svg" width="13" height="13" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"&gt;&lt;path d="M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.71"&gt;&lt;/path&gt;&lt;path d="M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71"&gt;&lt;/path&gt;&lt;/svg&gt;&#10; &lt;span&gt;あわせて読みたい&lt;/span&gt;&#10; &lt;/div&gt;&#10; &lt;div class="blog-card-title"&gt;やらなくていいことばかりしている&lt;/div&gt;&#10; &lt;div class="blog-card-url"&gt;/yaranakuteiikotobakarishiteiru/&lt;/div&gt;&#10; &lt;/div&gt;&#10; &lt;div class="blog-card-thumbnail"&gt;&#10; &lt;img src="https://hack-le.com/images/uploads/2025/05/zakki-scrible.webp" alt="やらなくていいことばかりしている" loading="lazy" /&gt;&#10; &lt;/div&gt;&#10; &lt;/a&gt;&#10;&lt;/div&gt;&#10;&#10;</description></item><item><title>Linux Mint Xfceで外付けハードディスクをマウント</title><link>https://hack-le.com/linux-mint-xfce-hdd/</link><pubDate>Sun, 26 Apr 2026 00:00:00 +0900</pubDate><guid>https://hack-le.com/linux-mint-xfce-hdd/</guid><description>&lt;h2 id="やること"&gt;やること&#10;&lt;/h2&gt;&lt;p&gt;Linux PC, Linux Mint Xfce 22.3をサーバとしている。これにロジテックのガチャベイ経由で外付けハードディスクを常時マウントしたい。&lt;/p&gt;&#10;&lt;p&gt;基本的には &lt;code&gt;/etc/fstab&lt;/code&gt;を編集するいつものあれなのだが、GUIで進めていく。&lt;/p&gt;&#10;&lt;h2 id="環境"&gt;環境&#10;&lt;/h2&gt;&lt;ul&gt;&#10;&lt;li&gt;Lenovo ThinkPad L390&#10;&lt;ul&gt;&#10;&lt;li&gt;Core i5-8265U&lt;/li&gt;&#10;&lt;li&gt;32GB RAM&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;/li&gt;&#10;&lt;li&gt;Linux Mint Xfce 22.3&lt;/li&gt;&#10;&lt;li&gt;ロジテック ガチャベイ LHR-4BNHEU3&#10;&lt;ul&gt;&#10;&lt;li&gt;WD 2TB HDD&lt;/li&gt;&#10;&lt;li&gt;TOSHIBA 2TB HDD&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;/li&gt;&#10;&lt;li&gt;USB 3.1接続&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;h2 id="手順"&gt;手順&#10;&lt;/h2&gt;&lt;p&gt;最初にマウントポイントを作っておく。たとえば&lt;code&gt;/mnt/hdd1&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 mkdir /mnt/hdd1&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;ディスクツールを起動する。GUIだが&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/04/image-700x773.jpg"&gt;&lt;/p&gt;&#10;&lt;p&gt;ディスクが確認できる。&lt;/p&gt;&#10;&lt;p&gt;&lt;img loading="lazy" sizes="(max-width: 767px) calc(100vw - 30px), (max-width: 1023px) 700px, (max-width: 1279px) 950px, 1232px" src="https://hack-le.com/images/uploads/2026/04/image-2-700x469.png"&gt;&lt;/p&gt;&#10;&lt;p&gt;各ディスクで歯車があるので、それをクリックして「マウントオプションを編集」を選択する。&lt;/p&gt;&#10;&lt;ul&gt;&#10;&lt;li&gt;ユーザーセッションのデフォルトをOFFにする&lt;/li&gt;&#10;&lt;li&gt;「システム起動時にマウントする」にチェックを入れる&lt;/li&gt;&#10;&lt;li&gt;マウントポイントのパスを指定する (ここでは &lt;code&gt;/mnt/hdd1&lt;/code&gt;）&lt;/li&gt;&#10;&lt;/ul&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/04/image-3-700x491.png"&gt;&lt;/p&gt;&#10;&lt;p&gt;OKする。&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 chown &lt;span class="nv"&gt;$USER&lt;/span&gt;:&lt;span class="nv"&gt;$USER&lt;/span&gt; /mnt/hdd1&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;適当にファイルを作成できることを確認する。&lt;/p&gt;&#10;&lt;p&gt;ちなみに&lt;code&gt;/etc/fstab&lt;/code&gt;をcatすると設定されていることが確認できる。&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/" 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を入れてからやること&lt;/div&gt;&#10; &lt;div class="blog-card-url"&gt;/linux-mint-xfce/&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/original_47682_1770597374_16x9.jpg" alt="Linux Mint Xfceを入れてからやること" loading="lazy" /&gt;&#10; &lt;/div&gt;&#10; &lt;/a&gt;&#10;&lt;/div&gt;&#10;&#10;</description></item><item><title>Linux Mint Xfce + AdGuard Home (+Tailscale) を構成する</title><link>https://hack-le.com/linux-mint-xfce-adguard-home-tailscale/</link><pubDate>Thu, 23 Apr 2026 00:00:00 +0900</pubDate><guid>https://hack-le.com/linux-mint-xfce-adguard-home-tailscale/</guid><description>&lt;p&gt;今回はLinuxサーバにAdGuard HomeでLAN内DNSをたてる手順のメモ。ついでにTailscaleを使っている場合はもう一手間かかるのでそれも書く。&lt;/p&gt;&#10;&lt;h2 id="環境"&gt;環境&#10;&lt;/h2&gt;&lt;ul&gt;&#10;&lt;li&gt;Linux Mint Xfce 22.3&#10;&lt;ul&gt;&#10;&lt;li&gt;ThinkPad L390&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;/li&gt;&#10;&lt;li&gt;AdGuardHome&lt;/li&gt;&#10;&lt;li&gt;ついでにTailscale&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;p&gt;Tailscaleを利用している場合は設定がちょっと増えるのでおまけ。&lt;/p&gt;&#10;&lt;h2 id="adguardhome"&gt;AdGuardHome&#10;&lt;/h2&gt;&lt;p&gt;53番問題がややこしいのでLinuxでやるのが望ましいのかなと思った。ネットワークを直接使うようなものなので、Dockerよりネイティブでやるほうがいいかなとも思う。&lt;/p&gt;&#10;&lt;h3 id="ポート53を開ける"&gt;ポート53を開ける&#10;&lt;/h3&gt;&lt;p&gt;まずLinux Mint Xfceというか、Ubuntu系列だと、53番はすでに使われているかと思う。以下のsystemd-resolveはUbuntuの機能であるらしい。&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-javascript" data-lang="javascript"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nx"&gt;$&lt;/span&gt; &lt;span class="nx"&gt;sudo&lt;/span&gt; &lt;span class="nx"&gt;lsof&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="nx"&gt;i&lt;/span&gt; &lt;span class="o"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;53&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nx"&gt;COMMAND&lt;/span&gt; &lt;span class="nx"&gt;PID&lt;/span&gt; &lt;span class="nx"&gt;USER&lt;/span&gt; &lt;span class="nx"&gt;FD&lt;/span&gt; &lt;span class="nx"&gt;TYPE&lt;/span&gt; &lt;span class="nx"&gt;DEVICE&lt;/span&gt; &lt;span class="nx"&gt;SIZE&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="nx"&gt;OFF&lt;/span&gt; &lt;span class="nx"&gt;NODE&lt;/span&gt; &lt;span class="nx"&gt;NAME&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nx"&gt;systemd&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="nx"&gt;r&lt;/span&gt; &lt;span class="mi"&gt;589&lt;/span&gt; &lt;span class="nx"&gt;systemd&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="nx"&gt;resolve&lt;/span&gt; &lt;span class="mi"&gt;14&lt;/span&gt;&lt;span class="nx"&gt;u&lt;/span&gt; &lt;span class="nx"&gt;IPv4&lt;/span&gt; &lt;span class="mi"&gt;8130&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="nx"&gt;t0&lt;/span&gt; &lt;span class="nx"&gt;UDP&lt;/span&gt; &lt;span class="nx"&gt;_localdnsstub&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt;&lt;span class="nx"&gt;domain&lt;/span&gt; &#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nx"&gt;systemd&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="nx"&gt;r&lt;/span&gt; &lt;span class="mi"&gt;589&lt;/span&gt; &lt;span class="nx"&gt;systemd&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="nx"&gt;resolve&lt;/span&gt; &lt;span class="mi"&gt;15&lt;/span&gt;&lt;span class="nx"&gt;u&lt;/span&gt; &lt;span class="nx"&gt;IPv4&lt;/span&gt; &lt;span class="mi"&gt;8131&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="nx"&gt;t0&lt;/span&gt; &lt;span class="nx"&gt;TCP&lt;/span&gt; &lt;span class="nx"&gt;_localdnsstub&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt;&lt;span class="nx"&gt;domain&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;LISTEN&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nx"&gt;systemd&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="nx"&gt;r&lt;/span&gt; &lt;span class="mi"&gt;589&lt;/span&gt; &lt;span class="nx"&gt;systemd&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="nx"&gt;resolve&lt;/span&gt; &lt;span class="mi"&gt;16&lt;/span&gt;&lt;span class="nx"&gt;u&lt;/span&gt; &lt;span class="nx"&gt;IPv4&lt;/span&gt; &lt;span class="mi"&gt;8132&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="nx"&gt;t0&lt;/span&gt; &lt;span class="nx"&gt;UDP&lt;/span&gt; &lt;span class="nx"&gt;_localdnsproxy&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt;&lt;span class="nx"&gt;domain&lt;/span&gt; &#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nx"&gt;systemd&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="nx"&gt;r&lt;/span&gt; &lt;span class="mi"&gt;589&lt;/span&gt; &lt;span class="nx"&gt;systemd&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="nx"&gt;resolve&lt;/span&gt; &lt;span class="mi"&gt;17&lt;/span&gt;&lt;span class="nx"&gt;u&lt;/span&gt; &lt;span class="nx"&gt;IPv4&lt;/span&gt; &lt;span class="mi"&gt;8133&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="nx"&gt;t0&lt;/span&gt; &lt;span class="nx"&gt;TCP&lt;/span&gt; &lt;span class="nx"&gt;_localdnsproxy&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt;&lt;span class="nx"&gt;domain&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;LISTEN&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;&lt;a class="link" href="https://adguard-dns.io/kb/ja/adguard-home/faq/#bindinuse" target="_blank" rel="noopener"&#10; &gt;FAQ（よくあるご質問） | AdGuard DNS Knowledge Base&lt;/a&gt;&lt;/p&gt;&#10;&lt;p&gt;こいつを殺す必要がある。殺す手順はドキュメントのとおりなのだが&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-javascript" data-lang="javascript"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nx"&gt;sudo&lt;/span&gt; &lt;span class="nx"&gt;mkdir&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="nx"&gt;p&lt;/span&gt; &lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="nx"&gt;etc&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="nx"&gt;systemd&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="nx"&gt;resolved&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;conf&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;d&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;そんで&lt;code&gt;/etc/systemd/resolved.conf.d/adguardhome.conf&lt;/code&gt;を作成する。で、作成したファイルに以下を記述する。&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-javascript" data-lang="javascript"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nx"&gt;Resolve&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nx"&gt;DNS&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mf"&gt;127.0&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="mf"&gt;0.1&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nx"&gt;DNSStubListener&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="nx"&gt;no&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-javascript" data-lang="javascript"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nx"&gt;sudo&lt;/span&gt; &lt;span class="nx"&gt;mv&lt;/span&gt; &lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="nx"&gt;etc&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="nx"&gt;resolv&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;conf&lt;/span&gt; &lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="nx"&gt;etc&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="nx"&gt;resolv&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;conf&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;backup&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nx"&gt;sudo&lt;/span&gt; &lt;span class="nx"&gt;ln&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="nx"&gt;s&lt;/span&gt; &lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="nx"&gt;run&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="nx"&gt;systemd&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="nx"&gt;resolve&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="nx"&gt;resolv&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;conf&lt;/span&gt; &lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="nx"&gt;etc&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="nx"&gt;resolv&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;conf&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nx"&gt;sudo&lt;/span&gt; &lt;span class="nx"&gt;systemctl&lt;/span&gt; &lt;span class="nx"&gt;reload&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="nx"&gt;or&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="nx"&gt;restart&lt;/span&gt; &lt;span class="nx"&gt;systemd&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="nx"&gt;resolved&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;これでもう一度53番を見たら何もないはず。&lt;/p&gt;&#10;&lt;h3 id="インストール"&gt;インストール&#10;&lt;/h3&gt;&lt;p&gt;&lt;a class="link" href="https://adguard-dns.io/kb/ja/adguard-home/getting-started/" target="_blank" rel="noopener"&#10; &gt;Getting started | AdGuard DNS Knowledge Base&lt;/a&gt;に従う。&lt;/p&gt;&#10;&lt;p&gt;ポート53を開けていれば、問題なく進むはず。&lt;/p&gt;&#10;&lt;p&gt;ルータの設定だけ、DNSサーバをLinuxマシンのIPにする。ここで、ルータ側でMACアドレスでIPアドレス決め打ちの設定をするとよい。このへんの設定はルータによるので割愛。&lt;/p&gt;&#10;&lt;h3 id="ファイアウォール"&gt;ファイアウォール&#10;&lt;/h3&gt;&lt;p&gt;他PCからアクセスするのにポートを開ける。&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;# DNS問い合わせを受け付けるために必須（UDP/TCP両方）&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;sudo ufw allow &lt;span class="m"&gt;53&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;# Web管理画面にアクセスするために必要&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;sudo ufw allow 80/tcp&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# 設定変更を反映&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;sudo ufw reload&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;80はAdGuardのダッシュボード。&lt;/p&gt;&#10;&lt;h3 id="確認"&gt;確認&#10;&lt;/h3&gt;&lt;p&gt;LAN内のPCから以下を実行して結果を見る。&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;nslookup doubleclick.net サーバのIPアドレス&#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;Server:&#9;&#9;サーバのIP&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;Address:&#9;サーバのIP#53&#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;Non-authoritative answer:&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;Name:&#9;doubleclick.net&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;Address: 0.0.0.0&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h3 id="optional-ダッシュボードのポートを変更する"&gt;(optional) ダッシュボードのポートを変更する&#10;&lt;/h3&gt;&lt;p&gt;ダッシュボードがポート80という特等席を使ってしまっている。多分他にもっと大事なのに譲ったほうが良い。僕の場合はCaddy使うので変更が必要。&lt;/p&gt;&#10;&lt;p&gt;&lt;code&gt;/opt/AdGuardHome/AdGuardHome.yaml&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;http:&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; address: 0.0.0.0:80 &lt;span class="c1"&gt;# ここを 適当なポート に変更&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 systemctl restart AdGuardHome&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;ufwも設定。&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 ポート番号&#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;でダッシュボードを開けたらOK。&lt;/p&gt;&#10;&lt;h2 id="ああ次はtailscaleだ"&gt;ああ…次はTailscaleだ…&#10;&lt;/h2&gt;&lt;h3 id="tailscale"&gt;Tailscale&#10;&lt;/h3&gt;&lt;p&gt;Tailscaleを使っている場合、Tailscale側でもDNSの設定をする必要がある。そのままだとnslookupの実行結果は以下のようになるはずだ。&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;&amp;gt; nslookup doubleclick.net&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;Server:&#9;&#9;100.100.100.100&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;Address:&#9;100.100.100.100#53&#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;Non-authoritative answer:&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;Name:&#9;doubleclick.net&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;Address: 142.251.23.100&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;Name:&#9;doubleclick.net&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;Address: 142.251.23.102&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;Name:&#9;doubleclick.net&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;Address: 142.251.23.138&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;Name:&#9;doubleclick.net&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;Address: 142.251.23.139&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;Name:&#9;doubleclick.net&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;Address: 142.251.23.113&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;Name:&#9;doubleclick.net&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;Address: 142.251.23.101&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;TailscaleのDNSが使われてしまう。なので、LocalにたてたAdGuard Homeに向ける設定が必要。&lt;/p&gt;&#10;&lt;p&gt;TailscaleのWebコンソールにログインして、AdGuardHomeをインストールしたLinux PCのTailscaleのPrivate IPを調べる。&lt;/p&gt;&#10;&lt;p&gt;で、それをTailscaleのDNS設定より、メモしたIPアドレスをnameserverとして利用するように設定する。&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/04/image-4-700x284.png"&gt;&lt;/p&gt;&#10;&lt;p&gt;Add nameserverの「Custom&amp;hellip;」よりIPアドレスを入れて、Override DNS serversをONにする。&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;&amp;gt; nslookup doubleclick.net&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;Server:&#9;&#9;100.100.100.100&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;Address:&#9;100.100.100.100#53&#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;Non-authoritative answer:&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;Name:&#9;doubleclick.net&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;Address: 0.0.0.0&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h3 id="adguard-home側の設定"&gt;AdGuard Home側の設定&#10;&lt;/h3&gt;&lt;p&gt;外からつなげる場合、AGHのDNS書き換えを192.168.x.xではなく、TailscaleのIPアドレスにしないといけない。&lt;/p&gt;&#10;&lt;h3 id="androidの場合の設定"&gt;Androidの場合の設定&#10;&lt;/h3&gt;&lt;p&gt;Androidの場合、Tailscaleアプリを入れてもConnectedでDNSに到達しないと怒られたりする。以下より、プライベートDNSをOFFにする。&lt;/p&gt;&#10;&lt;p&gt;&lt;strong&gt;Android:&lt;/strong&gt; 設定 ＞ ネットワークとインターネット ＞ &lt;strong&gt;プライベートDNS&lt;/strong&gt;&lt;/p&gt;&#10;&lt;h2 id="所感"&gt;所感&#10;&lt;/h2&gt;&lt;p&gt;なんだかんだで手こずった。&lt;/p&gt;&#10;&lt;p&gt;ちなみに僕はこの後Caddyを入れて、同一ドメインでLAN内と外からで同じアプリにログインできるようにする予定。&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/" 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を入れてからやること&lt;/div&gt;&#10; &lt;div class="blog-card-url"&gt;/linux-mint-xfce/&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/original_47682_1770597374_16x9.jpg" alt="Linux Mint Xfceを入れてからやること" 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/thinkpad-l390-linux-mint-22-3-xfce/" 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;ThinkPad L390 &amp;#43; Linux Mint 22.3 Xfce を使う: CMOS電池交換しました: Linuxマシンとしてすすめられるか？&lt;/div&gt;&#10; &lt;div class="blog-card-url"&gt;/thinkpad-l390-linux-mint-22-3-xfce/&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/original_48185_1772221849_16x9-scaled.webp" alt="ThinkPad L390 &amp;#43; Linux Mint 22.3 Xfce を使う: CMOS電池交換しました: Linuxマシンとしてすすめられるか？" loading="lazy" /&gt;&#10; &lt;/div&gt;&#10; &lt;/a&gt;&#10;&lt;/div&gt;&#10;&#10;</description></item><item><title>GeminiもChatGPTも阿呆過ぎるのでチャットはローカルLLMで良いとなっている</title><link>https://hack-le.com/geminichatgptlocalllm/</link><pubDate>Tue, 21 Apr 2026 00:00:00 +0900</pubDate><guid>https://hack-le.com/geminichatgptlocalllm/</guid><description>&lt;p&gt;特にGeminiが顕著なのだが、推論のリソースをケチっているのか出力設計がタコなのかその両方なのか知らないが、とにかく出力が深刻に愚かであると思う。応答速度だけは確かに早くなったが、その出力がゴミなので使う気になれない。いやまぁ料理の相談くらいならできるし、検索エンジンの代わりにはなるのだが、それ以上にならない。&lt;/p&gt;&#10;&lt;p&gt;対話はまったくする気にならない。Geminiはキーワードを拾って妄想を繰り広げているような感じで、2,3もチャットを往復すると本当にひどい。最初の話題で出たキーワードを永遠にこすり続けられるのには辟易とする。ChatGPTはなんだか壁の向こうにいる弁護団に向かっていかに自分の出力が法的に問題ないかをアピールしているような感じだ。&lt;/p&gt;&#10;&lt;p&gt;これは主観だが、僕はAIについては各々が主観で語るしかないと思っている。一応ベンチマークはあるものの、AIの性能を測るというベンチに信を置いていない。というのも、AIの性能は人間のように定義が難しいからだ。人間の能力の定量化について成功したという人は少ないと思うが、AIについても同じことが言える。何を持って良いとするのか、誰にもわからない。&lt;/p&gt;&#10;&lt;p&gt;別にAIが特別なわけでもない。音楽にも物語にも絵画にもベンチマークは存在しない。あってもそれは本質的に価値を反映しない。取引時価はあってもそれは価値ではない。ゴッホの絵はゴッホが死んでから自律的に成長して評価されたのではない。同じ話だ。質は本質的に量で語れない。&lt;/p&gt;&#10;&lt;p&gt;まぁでもこれだけだとあんまりなので、事実として、僕は課金しているGeminiではなく、自宅のRyzen AI Max+395で動かしているローカルLLMとチャットするようになった、ということは書いておこう。&lt;/p&gt;&#10;&lt;p&gt;Qwen3.5-27BのQ4で、検閲回避とされているモデルだ。犯罪やNSFWの話もできるとされている。犯罪の話はしていないが、NSFWについてはプロンプトの相談をしてみたら本当に出力された。おっぱいの単語に過剰反応してポリシー違反にするChatGPTとは雲泥の差である。気兼ねなく話せるのは非常に良いことだ。&lt;/p&gt;&#10;&lt;p&gt;応答速度は3tokens/s程度でかなり遅いのだけれど、使えないほどではない。ブログでも書いている間に返答はくる。個人的には速度はあまり重視していない。むしろ多少ゆっくりのほうがよい。こちらも考えをまとめないといけない。&lt;/p&gt;&#10;&lt;p&gt;とはいえ、プログラミングにおいては現状ローカルLLMよりも明確に良いため、そのために課金は続ける…続けるというか、昨年末のGoogleのAI Proの半額セールで年間契約してしまったよね。だからAntigravityは使っている。まぁここ1,2か月の改悪はひどいものだが、一応まだ使えないほどではない。まぁ現時点でこれだから、果たして今年が終わる頃にどうなっているのかは恐ろしさもあるが…。今の国際情勢などもかなり不透明さを増している。今とはまったく違う状況になっているかもしれない…。&lt;/p&gt;&#10;&lt;p&gt;一方で、ローカルLLMはとりあえず変わらない。昨日できたことが今日できるという一番嬉しい当たり前という品質がここにある。当たり前が一番難しい。当たり前は当たり前じゃないんだな。今のところはコイツが希望だ。最後の希望かもしれない。なんとか使いこなしていきたい。&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/ryzen-ai-max-395-128gb-ram/" 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;30万でRyzen AI Max&amp;#43; 395 &amp;#43; 128GB RAM ならちょっとほしい&lt;/div&gt;&#10; &lt;div class="blog-card-url"&gt;/ryzen-ai-max-395-128gb-ram/&lt;/div&gt;&#10; &lt;/div&gt;&#10; &lt;div class="blog-card-thumbnail"&gt;&#10; &lt;img src="https://hack-le.com/images/uploads/2026/09/eyecatch_19575_1789622185.webp" alt="30万でRyzen AI Max&amp;#43; 395 &amp;#43; 128GB RAM ならちょっとほしい" loading="lazy" /&gt;&#10; &lt;/div&gt;&#10; &lt;/a&gt;&#10;&lt;/div&gt;&#10;&#10;</description></item><item><title>自宅サーバーは現実枠</title><link>https://hack-le.com/genjitsuwaku/</link><pubDate>Sat, 18 Apr 2026 00:00:00 +0900</pubDate><guid>https://hack-le.com/genjitsuwaku/</guid><description>&lt;p&gt;クラウド全盛のこのご時世だが、&lt;strong&gt;このブログは現在自宅サーバで稼働している&lt;/strong&gt;。&lt;strong&gt;つい先日まではConoHaのVPS上で稼働していたのだが、一週間で3度の大規模障害という国内VPSとしては未曾有のやらかしをしてくれたために、さすがに耐えきれず急遽自宅サーバに退避させた&lt;/strong&gt;。&lt;/p&gt;&#10;&lt;div class="blog-card-wrapper"&gt;&#10; &lt;a href="https://hack-le.com/conoha-vps-down/" class="blog-card"&gt;&#10; &lt;div class="blog-card-content"&gt;&#10; &lt;div class="blog-card-label"&gt;&#10; &lt;svg xmlns="http://www.w3.org/2000/svg" width="13" height="13" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"&gt;&lt;path d="M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.71"&gt;&lt;/path&gt;&lt;path d="M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71"&gt;&lt;/path&gt;&lt;/svg&gt;&#10; &lt;span&gt;あわせて読みたい&lt;/span&gt;&#10; &lt;/div&gt;&#10; &lt;div class="blog-card-title"&gt;ConoHa VPS落ちすぎ問題&lt;/div&gt;&#10; &lt;div class="blog-card-url"&gt;/conoha-vps-down/&lt;/div&gt;&#10; &lt;/div&gt;&#10; &lt;div class="blog-card-thumbnail"&gt;&#10; &lt;img src="https://hack-le.com/images/uploads/2026/03/eyecatch_48871_1774613666.webp" alt="ConoHa VPS落ちすぎ問題" loading="lazy" /&gt;&#10; &lt;/div&gt;&#10; &lt;/a&gt;&#10;&lt;/div&gt;&#10;&#10;&lt;p&gt;その後の対応もナシのつぶてであったため、不信感はピークまで高まり、現在も自宅サーバのままでいる。元々GMOのサポートに期待していたわけではないが、それも許容範囲の安定性があったからヨシとしていたのであって、一週間で数日不安定のVPSなら自宅サーバのほうがマシである。そんなものに金を払う理由はまったくない。&lt;/p&gt;&#10;&lt;p&gt;…といっても既に3年契約であと1年4か月くらい残っているんだけどね…それでも戻る気にはまったくなれないね。&lt;/p&gt;&#10;&lt;p&gt;実際、自宅サーバのほうが快適だ。通信帯域はJ:COMのうんこ上り回線であるものの、所詮流行らないサイトであるし問題ない。むしろ、サーバのスペック上昇のほうが随所に効いているかんじで、パフォーマンスはむしろよくなったと思う。特に記事を編集していると恩恵を感じられる。&lt;/p&gt;&#10;&lt;p&gt;それでもまぁ自宅サーバで定期的に再起動なるなどはあるために、安定性の観点でVPSにしていたんだけれど&lt;strong&gt;その安定性でVPS大敗北ということになった&lt;/strong&gt;ので、VPSにする理由がほとんどなくなってしまった。&lt;/p&gt;&#10;&lt;p&gt;とはいえ自宅回線でNAT越えは色々とハードルが高いので、そこは俺たちのCloudflare Tunnelに結局お世話になっている。まぁCloudflareも去年から連続して大規模障害を起こしてくれて、特にメール一つもなく、カッコつけたポストモーテムを出しただけであったから、使いたくはなかったのだけれど、この際仕方がない。&lt;/p&gt;&#10;&lt;p&gt;なに、Cloudflare Tunnelが落ちたら、そのときはCaddyとTailscaleを入れっぱなしのConoHaに向ければいいんだ。さすがに同時に落ちるということはあるまい…ないよね……？それだったら多分僕んちのブレーカー落ちる可能性のほうが高いかなと思うわ。&lt;/p&gt;&#10;&lt;p&gt;まぁでも、個人レベルでこんな風に複数のエンドポイントを玄関として自由に切り替えられる状態になった、という点に関しては、よくなったのではなかろうか。実際このサイトも、障害が長引くのに嫌気がさしたからとはいえ、だいたい1,2時間もあればVPSから自宅サーバに退避して復旧完了したんだけど、これはまぁすごいことだと思う。&lt;/p&gt;&#10;&lt;p&gt;10年前にそんな芸当を個人がやるのは非常に難しくて、それで僕はこんな記事を書いていた。&lt;/p&gt;&#10;&lt;div class="blog-card-wrapper"&gt;&#10; &lt;a href="https://hack-le.com/45948138-2/" class="blog-card"&gt;&#10; &lt;div class="blog-card-content"&gt;&#10; &lt;div class="blog-card-label"&gt;&#10; &lt;svg xmlns="http://www.w3.org/2000/svg" width="13" height="13" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"&gt;&lt;path d="M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.71"&gt;&lt;/path&gt;&lt;path d="M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71"&gt;&lt;/path&gt;&lt;/svg&gt;&#10; &lt;span&gt;あわせて読みたい&lt;/span&gt;&#10; &lt;/div&gt;&#10; &lt;div class="blog-card-title"&gt;自宅サーバーは浪漫枠&lt;/div&gt;&#10; &lt;div class="blog-card-url"&gt;/45948138-2/&lt;/div&gt;&#10; &lt;/div&gt;&#10; &lt;div class="blog-card-thumbnail"&gt;&#10; &lt;img src="https://hack-le.com/images/uploads/2026/09/eyecatch_2738_1789453565.webp" alt="自宅サーバーは浪漫枠" loading="lazy" /&gt;&#10; &lt;/div&gt;&#10; &lt;/a&gt;&#10;&lt;/div&gt;&#10;&#10;&lt;p&gt;これは2015年当時、使っていた小型サーバーが逝ってしまったのを契機に、専用のNASを買うようになったときの心境について綴ったものだ。さらにWebサイトならばVPSがあるしなぁ、ということも書いている。ここには明確に、オンプレや自宅サーバについて、もうそんな時代じゃなくなった、という心境をありのまま書いていた。確かにあの時、時代が変わったことを感じていた。&lt;/p&gt;&#10;&lt;p&gt;&lt;strong&gt;あれから10年！また、時代た変わった&lt;/strong&gt;。自宅サーバーはもはや浪漫枠ではない。&lt;strong&gt;自由、プライバシー、データ主権、そしてハイパフォーマンスでセキュアでしかも使いやすく、しかも激安という現実の選択肢として再浮上している&lt;/strong&gt;。&lt;/p&gt;&#10;&lt;p&gt;この理由は大きくわけて、以下の4つがある。&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;省電力でサーバとして十分なスペックをもったハイパフォーマンスなPCが溢れていること&lt;/li&gt;&#10;&lt;li&gt;&lt;strong&gt;AIという期待のルーキーの参入&lt;/strong&gt;&lt;/li&gt;&#10;&lt;/ol&gt;&#10;&lt;p&gt;特に4つめが重要であると思う。AIは以下の4つの仕事をしてくれる。&lt;/p&gt;&#10;&lt;ol&gt;&#10;&lt;li&gt;自宅サーバのアーキテクチャの相談、やっていはいけないことのアラート&lt;/li&gt;&#10;&lt;li&gt;あまり知られていないFOSSを探し出したり、そのアーキテクチャや使い方を、自分のレベルにあわせて解説してくれる&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;「こういうサービスない？」でAI「こういうOSSがありますよ！」はマジで助かる。しかも全てを試す時間もないなかで、こういうアーキテクチャ、ユースケースを考えている、まで言うと「そんならこれは！」と提案してくれる。正直そのまま使うことはあまりないんだけれど、それでも参考になる。&lt;/p&gt;&#10;&lt;p&gt;アーキテクチャに限らず技術的な相談はやや注意で、少なくともAIのいっていることを鵜呑みにしてはならない。AIが何を言っているのか理解できて、疑問があれば即座に突っ込める力量は必要。&lt;strong&gt;インフラ周りではAIの無能さは相当なものになる&lt;/strong&gt;ので。それでも使える。逆に言えば無能ポイントを抑え込んで使えばかなり助けになる。&lt;/p&gt;&#10;&lt;p&gt;お陰様で、うちには今30超えるサーバー用アプリケーションが起動中だ。&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/04/image-1-700x538.png"&gt;&lt;/p&gt;&#10;&lt;p&gt;このオフィスソフト自体、セルフホストしたNextcloud上のWebアプリで稼働している。つまりやろうと想えば複数人で編集なども可能だが当然のようにこのネットワークには僕しかいないでそんなことにはならない。一応複数PCを使った一人人生ゲームのようなものすごく暇な時にやるような遊びはできなくもない。&lt;/p&gt;&#10;&lt;p&gt;まぁでもこんな風にスプレッドシートで管理していると、アクション要素も出てくる。で、作った一例が最近始めている備蓄防災のリストだ。&lt;/p&gt;&#10;&lt;p&gt;&lt;img loading="lazy" sizes="(max-width: 767px) calc(100vw - 30px), (max-width: 1023px) 700px, (max-width: 1279px) 950px, 1232px" src="https://hack-le.com/images/uploads/2026/04/5a11ba26e0958f654c2416e515029aa1-700x436.png"&gt;&lt;/p&gt;&#10;&lt;p&gt;&lt;img loading="lazy" sizes="(max-width: 767px) calc(100vw - 30px), (max-width: 1023px) 700px, (max-width: 1279px) 950px, 1232px" src="https://hack-le.com/images/uploads/2026/04/5a9f7c07b4e690259d382aba1594d45a-700x479.png"&gt;&lt;/p&gt;&#10;&lt;p&gt;&lt;img loading="lazy" sizes="(max-width: 767px) calc(100vw - 30px), (max-width: 1023px) 700px, (max-width: 1279px) 950px, 1232px" src="https://hack-le.com/images/uploads/2026/04/c6b1bde92b67ee71e04443cba4054361-700x251.png"&gt;&lt;/p&gt;&#10;&lt;p&gt;これによって、各在庫のリストスマホで写メとって記録し、何があって何がないかは備蓄一覧を見てじっくり考えられる。ついでに買い物履歴を登楼することで、ある商品の価格の推移を見てインフレが進んでいるかを判断することもできる。しかも爆速だ。何しろLAN内前提である（検索だけでもグローバル公開するアーキテクチャは考えている）。これはまさに僕がやりたいことを体現するために作ったもので、市販のSaaSにはないだろう。&lt;/p&gt;&#10;&lt;p&gt;ま、どうしても新しいことをやりたいならAIに読み込ませれば「何が足りないのではないか？」とか言わせることもできるかもしれないね。なにしろデータベースでパスタがどれくらいあって賞味期限は…とか、鯖缶は…とかわかるのだから。まぁ正直何を言われるかは見当つくし、自分で判断することだから、どうでもいいが…。&lt;/p&gt;&#10;&lt;p&gt;あ、今ある缶詰の有効な使い方とかアピールできたら面白さあったりするかな。いや、贅肉か…。こんなふうにAIがあると色々やってみたいことが思い浮かぶんだけど、まぁ基本罠なので、愚直にただ自分のやりたいことを解剖して作るに限る。&lt;/p&gt;&#10;&lt;p&gt;AIによって開発速度が100倍になっているため、望むアプリはガンガン作れる。そしてそのアプリは自宅に置くのが一番良い。インターネットが必要かは慎重に考えて決めるんだね。それだけやりたいことに合わせた最小の認証なら存外楽なもんだ。自分が使うだけなら、Tailscaleで自分用のネットワークを構築するのがてっとり早い。軽めのWeb公開なら&lt;code&gt;.env&lt;/code&gt;にハッシュ化したパスワードを置くだけでもまぁ使い物になるだろう。&lt;/p&gt;&#10;&lt;p&gt;自宅サーバーは忘れていたコンピュータの楽しさを一寸思い出せてくれる。だが楽しいだけではなく、極めて機能的だ。クラウドと違っていらないものはあまりないけど、いるものは全部ある。&lt;strong&gt;サーバーは面白い。こんな面白いものは、雲の上より自分の部屋に置くべきだ&lt;/strong&gt;。&lt;/p&gt;&#10;&lt;p&gt;&amp;lt;関連記事&amp;gt;&lt;/p&gt;&#10;&lt;div class="blog-card-wrapper"&gt;&#10; &lt;a href="https://hack-le.com/antigravity-app/" class="blog-card"&gt;&#10; &lt;div class="blog-card-content"&gt;&#10; &lt;div class="blog-card-label"&gt;&#10; &lt;svg xmlns="http://www.w3.org/2000/svg" width="13" height="13" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"&gt;&lt;path d="M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.71"&gt;&lt;/path&gt;&lt;path d="M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71"&gt;&lt;/path&gt;&lt;/svg&gt;&#10; &lt;span&gt;あわせて読みたい&lt;/span&gt;&#10; &lt;/div&gt;&#10; &lt;div class="blog-card-title"&gt;【AIプログラミング】Antigravityで個人用アプリならめっちゃ楽につくれる。非エンジニアでもあるいは……？&lt;/div&gt;&#10; &lt;div class="blog-card-url"&gt;/antigravity-app/&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_47822_1770368109.webp" alt="【AIプログラミング】Antigravityで個人用アプリならめっちゃ楽につくれる。非エンジニアでもあるいは……？" 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/linux-pc-3/" 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 PC再生計画】用途ごとのスペック&lt;/div&gt;&#10; &lt;div class="blog-card-url"&gt;/linux-pc-3/&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/output-1.webp" alt="【Linux PC再生計画】用途ごとのスペック" loading="lazy" /&gt;&#10; &lt;/div&gt;&#10; &lt;/a&gt;&#10;&lt;/div&gt;&#10;&#10;</description></item><item><title>ConoHa VPS落ちすぎ問題</title><link>https://hack-le.com/conoha-vps-down/</link><pubDate>Sat, 28 Mar 2026 00:00:00 +0900</pubDate><guid>https://hack-le.com/conoha-vps-down/</guid><description>&lt;p&gt;3/30にまた落ちくさっていたので、自宅サーバに移らざるを得ない（移った）&lt;/p&gt;&#10;&lt;p&gt;当サイトはConoHa VPS上に構築しているのだが、なんだかまた落ちていた。この前も長いこと落ちていたので、またかって感じ。&lt;/p&gt;&#10;&lt;h2 id="直前アナウンスの緊急メンテナンスからの障害"&gt;直前アナウンスの緊急メンテナンス、からの障害&#10;&lt;/h2&gt;&lt;p&gt;お知らせ見ると、こう。&lt;/p&gt;&#10;&lt;p&gt;&lt;img loading="lazy" sizes="(max-width: 767px) calc(100vw - 30px), (max-width: 1023px) 700px, (max-width: 1279px) 950px, 1232px" src="https://hack-le.com/images/uploads/2026/03/image-1-700x273.jpg"&gt;&lt;/p&gt;&#10;&#10; &lt;blockquote&gt;&#10; &lt;pre class="wp-block-preformatted"&gt;　開始日時　：　2026年03月26日(木) 11時30分&#10;終了日時　：　2026年03月26日(木) 18時00分&lt;/pre&gt;&#10;&#10; &lt;/blockquote&gt;&#10;&lt;p&gt;&lt;strong&gt;当日に「緊急メンテナンス」の一言で済ませていい長さじゃない&lt;/strong&gt;んだよなぁ。もう障害だろこんなん。ってかメールくらいしてくれ。Cloudflareもそうだけどなんでメールしないの？メール知らないの？&lt;/p&gt;&#10;&lt;p&gt;ちなみに前日にも障害起きていた。&lt;/p&gt;&#10;&lt;p&gt;&lt;img loading="lazy" sizes="(max-width: 767px) calc(100vw - 30px), (max-width: 1023px) 700px, (max-width: 1279px) 950px, 1232px" src="https://hack-le.com/images/uploads/2026/03/image-2-700x376.jpg"&gt;&lt;/p&gt;&#10;&lt;p&gt;だからメール出してくれ。なんで見に行かないといけないんだよ。&lt;/p&gt;&#10;&lt;p&gt;ちなみにアカウント設定見るとメールの設定はあるんだが&lt;/p&gt;&#10;&lt;p&gt;&lt;img loading="lazy" sizes="(max-width: 767px) calc(100vw - 30px), (max-width: 1023px) 700px, (max-width: 1279px) 950px, 1232px" src="https://hack-le.com/images/uploads/2026/03/b8a6005099f92329a5886a46dccfdd72-700x136.jpg"&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;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/03/70551dc4f64778f1e1780a4eee0fbfd2-700x236.webp"&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;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/03/847e6d1c06672bbe76b41f9cbddcd3e1-700x479.webp"&gt;&lt;/p&gt;&#10;&lt;p&gt;&lt;strong&gt;もちろんメールなし&lt;/strong&gt;。サイト内告知とXでの報告のみ。障害メール送ったら死ぬんか？&lt;/p&gt;&#10;&lt;h2 id="ハリボテのsla"&gt;ハリボテのSLA&#10;&lt;/h2&gt;&lt;p&gt;さてこの連日の大規模障害、当然SLAに反していると思われるだろう。以下に条件がある。&lt;/p&gt;&#10;&lt;p&gt;&lt;a class="link" href="https://vps.conoha.jp/sla/" target="_blank" rel="noopener"&#10; &gt;サービス品質保証制度 (SLA)｜VPSならConoHa&lt;/a&gt;&lt;/p&gt;&#10;&lt;p&gt;まず適用条件がひどい。&lt;/p&gt;&#10;&#10; &lt;blockquote&gt;&#10; &lt;p&gt;SLA適用申請書(PDF)に必要事項を記入し、当社お客様センターまでメールまたはFAXでお送りください。SLA適用申請は障害発生月の翌月の末日までに完了する必要があります。&lt;/p&gt;&#10;&#10; &lt;/blockquote&gt;&#10;&lt;p&gt;自分で申請しろってさ。しかもメールで。そして適用の対象外が以下。&lt;/p&gt;&#10;&#10; &lt;blockquote&gt;&#10; &lt;p&gt;以下の場合においては適用の対象外となります。&lt;/p&gt;&#10;&lt;p&gt;・当社が事前に計画し告知した、もしくは&lt;strong&gt;緊急で行ったメンテナンス&lt;/strong&gt;&#10;・お客様が用意したソフトウェアに起因する場合&#10;・サービス提供者、利用者でない第三者の作為による場合&#10;・付加機能に関するもの（コントロールパネルなど）&#10;・&lt;strong&gt;障害の発生時刻及び継続した時間をお客様において証明できない場合&lt;/strong&gt;&#10;・サービスそのものの仕様の場合（プラン変更時のマイグレーション中、HA機能など）&#10;・当社がサービス利用規約に反していると判断した場合&#10;・準備期間内のサービスや無料で提供されているサービス&#10;・当社が制御不可能な要因（自然災害、暴動、テロ、戦争、政府機関の行為など）&#10;・その他当社がサービスの中断と判断した場合&lt;/p&gt;&#10;&#10; &lt;/blockquote&gt;&#10;&lt;p&gt;&lt;strong&gt;当日に緊急メンテナンス扱いしたのはそういうわけか&lt;/strong&gt;と腑に落ちるよね。さらに&lt;strong&gt;こちら側で落ちたことを証明しないといけない&lt;/strong&gt;らしいのだが、今回はその落ち方自体がかなり不安定のため、難しさがある。たとえばこういうツイートをされている方がいた。&lt;/p&gt;&#10;&#10; &lt;blockquote&gt;&#10; &lt;p&gt;ConoHa VPSの障害継続中。&#10;中途半端に稼働している事で死活監視に引っ掛からずに不具合だすケースが発生して痛い目見た😢&#10;再現テストしづらいケースにより、別の対応が必要な事が判ったので参考にはなったが。。。&lt;/p&gt;&#10;&lt;p&gt;— &lt;a class="link" href="https://x.com/shobu_umemura/status/2037340436394828094?s=20" target="_blank" rel="noopener"&#10; &gt;https://x.com/shobu_umemura/status/2037340436394828094?s=20&lt;/a&gt;&lt;/p&gt;&#10;&#10; &lt;/blockquote&gt;&#10;&lt;p&gt;死活監視に引っかからない落ち方、となるわけだがこの場合は証明できてないねって言うんだろうか。&lt;/p&gt;&#10;&lt;p&gt;ただでさえこっちとしては端金返されたところでしょうもないという気持ちなのに、そのうえで&lt;strong&gt;1円でも返したくないという強い意志を感じて辟易とする&lt;/strong&gt;。&lt;/p&gt;&#10;&lt;p&gt;こんなハリボテのSLA、ないほうがマシじゃないの。&lt;/p&gt;&#10;&lt;h2 id="契約解除を思案中"&gt;契約解除を思案中&#10;&lt;/h2&gt;&lt;p&gt;まぁなんだな、スタートアップスクリプトだのOpenClawだのMCPだのキラキラしたことしてないで、サーバ屋として当たり前のことをちゃんとやってほしい。VPSに安定性以外のこと求めてない。逆に言えば、安定して動いてさえいれば契約やめようかとか思わないのに。っていうか&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;だ。こういう不誠実を続けてきたから業界全体でSaaS is deadとか言われてるんだろう。SaaSの機能非機能を内製化するのはたいへんだぞとかそういう問題じゃない。&lt;strong&gt;責任の問題&lt;/strong&gt;だ。いやConoHa VPSはSaaSじゃないけどね。&lt;/p&gt;&#10;&lt;p&gt;メールサーバをVPSに移す予定を考えていたが、もはやそれどころではない。というか、今までこのサイトでは何度かConoHaをVPSの候補として勧めていたので、そのことで申し訳ない気持ちにすらなっている。実際に4人くらいかな、契約までいった人がいたようなので…。&lt;/p&gt;&#10;&lt;p&gt;しかし僕も3年まとめ買いしているんだぜ。障害の真っ最中に「私のリンクから契約すればクーポンもらえます！」ってPRツイートしているエアプ野郎がXでにはいたけど、それとは違う。まだ契約もあと1年半くらい残っていてため息だよ。どうするかねこれ…。&lt;/p&gt;&#10;&lt;p&gt;まぁ現実的にすぐ移行というわけにもいかないんだなぁ。なかなか厳しい。特にメールはConoHaのアプリケーションサーバでやっちゃってたけど、今回影響受けていないが、もう心情的に僕のほうこそ1円も払いたくないみたいな気持ちになっちゃってるよね。&lt;/p&gt;&#10;&lt;p&gt;いずれにせよ時間はかかっても、移行はしたい。半年から1年くらいかけて、マジで自宅サーバに全部寄せていこうと思う。&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/cloud/" 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;/cloud/&lt;/div&gt;&#10; &lt;/div&gt;&#10; &lt;div class="blog-card-thumbnail"&gt;&#10; &lt;img src="https://hack-le.com/images/uploads/2025/10/output-47.webp" alt="クラウドの本質、現場の決裁権と免罪符" loading="lazy" /&gt;&#10; &lt;/div&gt;&#10; &lt;/a&gt;&#10;&lt;/div&gt;&#10;&#10;&lt;div class="blog-card-wrapper"&gt;&#10; &lt;a href="https://hack-le.com/cloudflare-cyber-attack/" class="blog-card"&gt;&#10; &lt;div class="blog-card-content"&gt;&#10; &lt;div class="blog-card-label"&gt;&#10; &lt;svg xmlns="http://www.w3.org/2000/svg" width="13" height="13" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"&gt;&lt;path d="M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.71"&gt;&lt;/path&gt;&lt;path d="M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71"&gt;&lt;/path&gt;&lt;/svg&gt;&#10; &lt;span&gt;あわせて読みたい&lt;/span&gt;&#10; &lt;/div&gt;&#10; &lt;div class="blog-card-title"&gt;Cloudflareの違和感：サイバー攻撃じゃないからなんなのか&lt;/div&gt;&#10; &lt;div class="blog-card-url"&gt;/cloudflare-cyber-attack/&lt;/div&gt;&#10; &lt;/div&gt;&#10; &lt;div class="blog-card-thumbnail"&gt;&#10; &lt;img src="https://hack-le.com/images/uploads/2025/11/output-30.webp" alt="Cloudflareの違和感：サイバー攻撃じゃないからなんなのか" loading="lazy" /&gt;&#10; &lt;/div&gt;&#10; &lt;/a&gt;&#10;&lt;/div&gt;&#10;&#10;</description></item><item><title>ConoHa VPSで512MBメモリが使えるOS11種類の、初期状態におけるメモリ使用量の比較</title><link>https://hack-le.com/conoha-vps-512ram/</link><pubDate>Thu, 19 Mar 2026 00:00:00 +0900</pubDate><guid>https://hack-le.com/conoha-vps-512ram/</guid><description>&lt;p&gt;ConoHaのクーポンの有効期限が切れそうだった。後学のために、使えるOSの初期状態を調べておこうと思った。&lt;/p&gt;&#10;&lt;p&gt;調べた日: 2026-03-09&lt;/p&gt;&#10;&lt;h2 id="目的"&gt;目的&#10;&lt;/h2&gt;&lt;p&gt;ConoHa VPSで512MBプランが使えるVPSにおいて、初期状態におけるメモリの利用料を調べる。初期状態になにが入っているのかなどは調べていない。あくまで参考値。と言いつつBSD系列では&lt;code&gt;freecolor&lt;/code&gt;を入れている。&lt;/p&gt;&#10;&lt;p&gt;個人的には、最終的にCaddy, Tailscale, Postfix だけ入れたいと思っている。つまりゲートウェイ、土管、郵便受け。&lt;/p&gt;&#10;&lt;h2 id="linux系"&gt;Linux系&#10;&lt;/h2&gt;&lt;p&gt;CPUは一緒。そりゃそうか。&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-xml" data-lang="xml"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;[root@vm-9c2cca81-82:~# lscpu | grep -E &amp;#34;Model name|CPU MHz|Core&amp;#34;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;Model name: Intel Xeon Processor (Icelake)&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;BIOS Model name: pc-i440fx-6.2 CPU @ 2.0GHz&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;Core(s) per socket: 1&#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;h3 id="centos-stream10"&gt;CentOS Stream10&#10;&lt;/h3&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-xml" data-lang="xml"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;[root@vm-4ca08a09-c8 ~]# free -h&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; total used free shared buff/cache available&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;Mem: 449Mi 147Mi 181Mi 6.5Mi 139Mi 302Mi&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;Swap: 2.0Gi 0B 2.0Gi&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h3 id="debian-1205"&gt;Debian 12.05&#10;&lt;/h3&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-xml" data-lang="xml"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;[root@vm-9c2cca81-82:~# free -h&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; total used free shared buff/cache available&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;Mem: 455Mi 230Mi 6.3Mi 464Ki 239Mi 224Mi&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;Swap: 2.0Gi 12Mi 2.0Gi&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;思ったより重い。&lt;/p&gt;&#10;&lt;h3 id="rocky-linux-100"&gt;Rocky Linux 10.0&#10;&lt;/h3&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-xml" data-lang="xml"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;[root@... ~]# free -h&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; total used free shared buff/cache available&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;Mem: 449Mi 131Mi 118Mi 2.0Mi 212Mi 317Mi&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;Swap: 2.0Gi 31Mi 2.0Gi&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h3 id="almalinux-100"&gt;AlmaLinux 10.0&#10;&lt;/h3&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-xml" data-lang="xml"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;[root@... ~]# free -h&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; total used free shared buff/cache available&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;Mem: 449Mi 144Mi 185Mi 3.5Mi 135Mi 305Mi&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;Swap: 2.0Gi 0B 2.0Gi&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h3 id="oracle-linux-100"&gt;Oracle Linux 10.0&#10;&lt;/h3&gt;&lt;p&gt;Oracleは当然オラクルか。ディストリビューション出してたんやね。&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-xml" data-lang="xml"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;[root@... ~]# free -h&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; total used free shared buff/cache available&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;Mem: 451Mi 147Mi 135Mi 3.5Mi 183Mi 303Mi&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;Swap: 2.0Gi 0B 2.0Gi&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h3 id="miracle-linux-92"&gt;Miracle Linux 9.2&#10;&lt;/h3&gt;&lt;p&gt;これ知らなかった。国内企業のサイバートラスト社がやっているRHELクローンらしい。&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-xml" data-lang="xml"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;[root@... ~]# free -h&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; total used free shared buff/cache available&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;Mem: 444Mi 122Mi 198Mi 2.0Mi 138Mi 322Mi&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;Swap: 2.0Gi 0B 2.0Gi&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;お…スペック的には一番軽量、という結果になっている。9.2だからってのもあるんだろうか。&lt;/p&gt;&#10;&lt;h3 id="opensuse-160"&gt;OpenSUSE 16.0&#10;&lt;/h3&gt;&lt;p&gt;RHでもDebianでもないLinux。OpenSUSE動かすの初めて。&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-xml" data-lang="xml"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;[root@... ~]# free -h&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; total used free shared buff/cache available&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;Mem: 458Mi 140Mi 161Mi 712Ki 169Mi 317Mi&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;Swap: 2.0Gi 0B 2.0Gi&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;値的にはRocky Linux 10.0に近い感じだ。&lt;/p&gt;&#10;&lt;h3 id="arch-linux-20241011"&gt;Arch Linux 20241011&#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-xml" data-lang="xml"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;[root@localhost ~]# free -h&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; total used free shared buff/cache available&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;Mem: 458Mi 81Mi 295Mi 588Ki 94Mi 377Mi&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;Swap: 2.0Gi 0B 2.0Gi&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id="bsd系"&gt;BSD系&#10;&lt;/h2&gt;&lt;p&gt;&lt;code&gt;free&lt;/code&gt;がないので&lt;code&gt;top&lt;/code&gt;を見る。&lt;/p&gt;&#10;&lt;p&gt;AIが無能。&lt;/p&gt;&#10;&lt;h3 id="freebsd-140ufs"&gt;FreeBSD 14.0UFS&#10;&lt;/h3&gt;&lt;p&gt;俺たちのFreeBSD。使うの15年ぶりくらい。もう何もわからん。正直軽量VPSの限定的な使い方ならアリかも、とは思っている。&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-xml" data-lang="xml"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;last pid: 1169; load averages: 1.51, 0.52, 0.20 up 0+00:00:39 00:25:12&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;20 processes: 1 running, 19 sleeping&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;CPU: 0.0% user, 0.0% nice, 0.0% system, 0.0% interrupt, 100% idle&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;Mem: 12M Active, 1148K Inact, 52M Wired, 22M Buf, 399M Free&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;Swap: 1536M Total, 1536M Free&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Free 399MiBつよい。&lt;/p&gt;&#10;&lt;p&gt;参考までに、&lt;code&gt;free&lt;/code&gt;がないので&lt;code&gt;free&lt;/code&gt;っぽいやつを入れてみる。&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-xml" data-lang="xml"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;pkg update&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;pkg install freecolor&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;この状態で&lt;code&gt;freecolor -m -o&lt;/code&gt;でどうなるか？&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-xml" data-lang="xml"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;total used free shared buffers cached&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;Mem: 465 97 368 0 0 0&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;Swap: 1536 0 1536&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;なるほど。30MiBほど消費した？&lt;/p&gt;&#10;&lt;h3 id="netbsd-93"&gt;NetBSD 9.3&#10;&lt;/h3&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-xml" data-lang="xml"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;16 processes: 1 running, 15 sleeping&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;Mem: 11M Active, 448K Inact, 51M Wired, 22M Buf, 402M Free&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;Swap: 1536M Total, 1536M Free&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Free 402MiB。つよい。&lt;code&gt;freecolor&lt;/code&gt;入れられなかった。&lt;/p&gt;&#10;&lt;h3 id="openbsd-74"&gt;OpenBSD 7.4&#10;&lt;/h3&gt;&lt;p&gt;&lt;code&gt;top&lt;/code&gt;を見る。&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-xml" data-lang="xml"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;Memory: Real: 8720K/275M act/tot Free: 196M Cache: 94M Swap: 21M/2054M&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;8720KiBが実際に使っているRAMで、275MiBはプロセスが将来使うかもしれない値として予約している総量らしい。なのでこれを計算には入れない。Freeの196MiBとCache94MiBが使える容量になり、残りはカーネル占有とのこと。&lt;/p&gt;&#10;&lt;h2 id="メモリ使用料の比較表"&gt;メモリ使用料の比較表&#10;&lt;/h2&gt;&lt;p&gt;あくまで初期値の比較であって、実際に必要なソフトウェアを入れればそりゃ数値は変わるわけだから、参考までに。Geminiに表にさせた。&lt;/p&gt;&#10;&lt;table&gt;&#10;&#9;&lt;thead&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;th&gt;&lt;strong&gt;OS名&lt;/strong&gt;&lt;/th&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;th&gt;&lt;strong&gt;使用中 (Used)&lt;/strong&gt;&lt;/th&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;th&gt;&lt;strong&gt;空き (Available)&lt;/strong&gt;&lt;/th&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;th&gt;&lt;strong&gt;合計 (Total)&lt;/strong&gt;&lt;/th&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;th&gt;&lt;strong&gt;算出のロジック / 備考&lt;/strong&gt;&lt;/th&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&lt;/thead&gt;&#10;&#9;&lt;tbody&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;&lt;strong&gt;OpenBSD 7.4&lt;/strong&gt;&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;&lt;strong&gt;8.5 MiB&lt;/strong&gt;&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;&lt;strong&gt;290 MiB&lt;/strong&gt;&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;(488 MiB)&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;Real actを使用量。Free+Cacheを空き。カーネル占有分が最大&lt;/td&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;&lt;strong&gt;NetBSD 9.3&lt;/strong&gt;&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;&lt;strong&gt;62 MiB&lt;/strong&gt;&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;&lt;strong&gt;424 MiB&lt;/strong&gt;&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;486 MiB&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;Active + Wiredを使用量。Free + Bufを空き&lt;/td&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;&lt;strong&gt;FreeBSD 14.0&lt;/strong&gt;&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;&lt;strong&gt;64 MiB&lt;/strong&gt;&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;&lt;strong&gt;421 MiB&lt;/strong&gt;&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;486 MiB&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;Active + Wiredを使用量。Free + Bufを空き&lt;/td&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;&lt;strong&gt;Arch Linux&lt;/strong&gt;&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;&lt;strong&gt;81 MiB&lt;/strong&gt;&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;&lt;strong&gt;377 MiB&lt;/strong&gt;&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;458 MiB&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;&lt;code&gt;free -h&lt;/code&gt; の値をそのまま採用。Linux勢で圧倒的最軽量&lt;/td&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;&lt;strong&gt;Miracle Linux 9.2&lt;/strong&gt;&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;&lt;strong&gt;122 MiB&lt;/strong&gt;&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;&lt;strong&gt;322 MiB&lt;/strong&gt;&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;444 MiB&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;RHELクローン系で最軽量。9系であることも影響か&lt;/td&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;&lt;strong&gt;Rocky Linux 10.0&lt;/strong&gt;&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;&lt;strong&gt;131 MiB&lt;/strong&gt;&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;&lt;strong&gt;317 MiB&lt;/strong&gt;&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;449 MiB&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;10系RHELクローンの基準的な数値&lt;/td&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;&lt;strong&gt;OpenSUSE 16.0&lt;/strong&gt;&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;&lt;strong&gt;140 MiB&lt;/strong&gt;&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;&lt;strong&gt;317 MiB&lt;/strong&gt;&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;458 MiB&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;Rockyと同等の実効空き容量&lt;/td&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;&lt;strong&gt;AlmaLinux 10.0&lt;/strong&gt;&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;&lt;strong&gt;144 MiB&lt;/strong&gt;&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;&lt;strong&gt;305 MiB&lt;/strong&gt;&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;449 MiB&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;&lt;/td&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;&lt;strong&gt;Oracle Linux 10.0&lt;/strong&gt;&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;&lt;strong&gt;147 MiB&lt;/strong&gt;&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;&lt;strong&gt;303 MiB&lt;/strong&gt;&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;451 MiB&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;&lt;/td&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;&lt;strong&gt;CentOS Stream 10&lt;/strong&gt;&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;&lt;strong&gt;147 MiB&lt;/strong&gt;&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;&lt;strong&gt;302 MiB&lt;/strong&gt;&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;449 MiB&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;&lt;/td&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;&lt;strong&gt;Debian 12.05&lt;/strong&gt;&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;&lt;strong&gt;230 MiB&lt;/strong&gt;&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;&lt;strong&gt;224 MiB&lt;/strong&gt;&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;455 MiB&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;今回の比較対象で最も重量級&lt;/td&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&lt;/tbody&gt;&#10;&lt;/table&gt;&#10;&lt;h2 id="所感"&gt;所感&#10;&lt;/h2&gt;&lt;p&gt;Debian使おうかと思っていたんだけれど、ちょっと考えようかな。ArchLinuxを1ヶ月くらい試してみようかなぁ。いや、あえてFreeBSDを試してみようか。&lt;/p&gt;&#10;&lt;p&gt;&lt;strong&gt;BSD系は、この記事レベルですらAIが無能化する&lt;/strong&gt;のを目の当たりにした。情報アクセスの観点でBSD系のしんどさはあるなぁと思った。まぁFreeBSDくらいはやってみてもいいかもしれないが。&lt;/p&gt;&#10;&lt;p&gt;ってか改めて思うが、&lt;strong&gt;ConoHaのWeb UIダッシュボードはかなり使いづらい&lt;/strong&gt;。裏で人が動いてんのか？ってくらい遅いし、使用中だろうがなんだろうが容赦なくログアウトさせられて操作が止まったように見えるのなんとかなりませんかねぇ…。&lt;/p&gt;&#10;&lt;h2 id="追記conohaの非推奨"&gt;追記：ConoHaの非推奨&#10;&lt;/h2&gt;&lt;p&gt;2026-03-25から03-27に至る障害とその対応において呆れ果てました。さすがにもうConoHaはすすめられませんし、私も移行を考えています。&lt;/p&gt;&#10;</description></item><item><title>Evernote/Notion代替: Trilium NotesでインストールからWeb Clipまで</title><link>https://hack-le.com/evernote-notion-trilium-notes/</link><pubDate>Tue, 17 Mar 2026 00:00:00 +0900</pubDate><guid>https://hack-le.com/evernote-notion-trilium-notes/</guid><description>&lt;p&gt;今回取り上げるのは、ずっと記事書こうと思っていて放置していたメモアプリのTrilium Notes。割と使いたい人が多いかもしれないやつだと思う。&lt;/p&gt;&#10;&lt;h2 id="trilium-notesとはevernotenotion代替になるか"&gt;Trilium Notesとは。Evernote/Notion代替になるか&#10;&lt;/h2&gt;&lt;p&gt;Trilium NotesはEvernoteとかNotion代替として出てくる、セルフホストできるFOSS。サイトはここ「&lt;a class="link" href="https://triliumnotes.org/ja/" target="_blank" rel="noopener"&#10; &gt;Trilium Notes&lt;/a&gt;」。使い勝手は昔のEvernoteに近い気がする。&lt;strong&gt;昔のNotion並に軽いEvernote&lt;/strong&gt;。伝統的な階層型管理なのはNotion的かな。&lt;/p&gt;&#10;&lt;p&gt;Evernoteは最初全部フラットにしようとして失敗したと思う。ここらへん、スマホではじめで階層型はもう古い！みたいなトレンドがあったような気がする。結果としては、階層型ディレクトリだけが最強だった。&lt;/p&gt;&#10;&lt;p&gt;&lt;strong&gt;リッチな機能はないし、ユーザも一人専用だけれど、ノートアプリとして欲しいものは全部揃っている。&lt;/strong&gt; いらない機能でわかりづらいUIと遅いパフォーマンス、崩れるレイアウトのために課金しなくてはいけない日々とはさよなら。&lt;/p&gt;&#10;&lt;p&gt;とはいえ&lt;strong&gt;Notionはノートアプリというよりもはやデータベースアプリになっているので、Notionの機能をゴリゴリ使っているならそりゃ厳しい&lt;/strong&gt;。&lt;/p&gt;&#10;&lt;p&gt;あと、&lt;strong&gt;もしかするとObsidianとどっち使うか考えている人もいるかもしれないが、どちらが良いかはObisidian vs Evernote（Notion）と考え方はほぼ同じになる&lt;/strong&gt;かなと思う。Obsidianはクライアントベース、ファイルベース、Markdown至上主義な考え方になるし、Trilium Notesはサーバベース、独自データベース、Markdownは基本だけどWYSYWIGにありがちなちょっとキモイ挙動もあるよみたいな感じ。&lt;/p&gt;&#10;&lt;p&gt;FOSSの文脈だと、サーバ必須なのとファイルではなく独自データベースのメリデメ（高機能だがサポートの継続が不安）をどう捉えるかになるかと思う。&lt;/p&gt;&#10;&lt;h2 id="環境"&gt;環境&#10;&lt;/h2&gt;&lt;ul&gt;&#10;&lt;li&gt;サーバ&#10;&lt;ul&gt;&#10;&lt;li&gt;Intel Mac mini 2018&lt;/li&gt;&#10;&lt;li&gt;Docker Desktop for Mac&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;/li&gt;&#10;&lt;li&gt;Web Clipperを試したブラウザ&#10;&lt;ul&gt;&#10;&lt;li&gt;Vivaldi&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;インストール自体はいつものようにDocker一発なので取り立てていうところはない。docker使えれば使える。&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-dockerfile" data-lang="dockerfile"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c"&gt;# Running `docker-compose up` will create/use the &amp;#34;trilium-data&amp;#34; directory in the user home&lt;/span&gt;&lt;span class="err"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c"&gt;# Run `TRILIUM_DATA_DIR=/path/of/your/choice docker-compose up` to set a different directory&lt;/span&gt;&lt;span class="err"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c"&gt;# To run in the background, use `docker-compose up -d`&lt;/span&gt;&lt;span class="err"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;services:&lt;span class="err"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; trilium:&lt;span class="err"&gt;&#10;&lt;/span&gt;&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;&lt;span class="err"&gt;&#10;&lt;/span&gt;&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;&lt;span class="err"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; image: triliumnext/trilium:latest&lt;span class="err"&gt;&#10;&lt;/span&gt;&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;&lt;span class="err"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; restart: unless-stopped&lt;span class="err"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; environment:&lt;span class="err"&gt;&#10;&lt;/span&gt;&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&lt;span class="err"&gt;&#10;&lt;/span&gt;&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&lt;span class="err"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; ports:&lt;span class="err"&gt;&#10;&lt;/span&gt;&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;&lt;span class="err"&gt;&#10;&lt;/span&gt;&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;&lt;span class="err"&gt;&#10;&lt;/span&gt;&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;&lt;span class="err"&gt;&#10;&lt;/span&gt;&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;&lt;span class="err"&gt;&#10;&lt;/span&gt;&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;&lt;span class="err"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; - &lt;span class="s1"&gt;&amp;#39;ポート番号:8080&amp;#39;&lt;/span&gt;&lt;span class="err"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; volumes:&lt;span class="err"&gt;&#10;&lt;/span&gt;&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;&lt;span class="err"&gt;&#10;&lt;/span&gt;&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;&lt;span class="err"&gt;&#10;&lt;/span&gt;&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;~/保存したいディレクトリ&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;:/home/node/trilium-data&lt;span class="err"&gt;&#10;&lt;/span&gt;&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;&lt;span class="err"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; - /etc/localtime:/etc/localtime:ro&lt;span class="err"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;timezoneのところお麺とアウトしているのはMacで当該ファイルがなかったからかな。&lt;/p&gt;&#10;&lt;p&gt;バックアップはこの設定ファイルとディレクトリをまるごとコピーしたらOK。&lt;/p&gt;&#10;&lt;h2 id="基本的な使い方"&gt;基本的な使い方&#10;&lt;/h2&gt;&lt;p&gt;ノートを書いて階層管理する使い勝手。なんかもう本当にシンプルなので、これも特に言うことがない。画面見りゃわかる。わかれ。&lt;/p&gt;&#10;&lt;p&gt;&lt;img loading="lazy" sizes="(max-width: 767px) calc(100vw - 30px), (max-width: 1023px) 700px, (max-width: 1279px) 950px, 1232px" src="https://hack-le.com/images/uploads/2026/03/image-4-700x487.png"&gt;&lt;/p&gt;&#10;&lt;p&gt;こんな感じで僕は「缶詰」や「酒」の管理とかに使っている。タスク管理にも使おうとしていたが、最近は一周回ってアナログ管理になってきたので、これはあまり使えていない。あと確定申告とかその時々のタスクにも使ってるね。&lt;/p&gt;&#10;&lt;h2 id="web-clipperの使い方"&gt;Web Clipperの使い方&#10;&lt;/h2&gt;&lt;p&gt;結局やりたいのはこれだと思うが、Web Clipperがある。「Trilium Web Clipper」でブラウザに対応した拡張機能をインストール。&lt;/p&gt;&#10;&lt;p&gt;ブラウザから、Trilium Web Clipperのオプションを開く。&lt;/p&gt;&#10;&lt;p&gt;Trilium server instanceの設定から、&lt;code&gt;http://IP address:port&lt;/code&gt;とパスワードを入力する。パスワードは実際に保存されるわけではなくて、一度ログインしてトークンを発行しているみたいだ。実際、SettingsのETAPIを見るとトークンが作られていることがわかる。&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/03/image-1-700x347.png"&gt;&lt;/p&gt;&#10;&lt;p&gt;これで使えるようになっている。どっか適当なページで挙動を確認する。Gigazine開いたら最初の記事だった「&lt;a class="link" href="https://gigazine.net/news/20260312-is-icloud-free-tier-still-5gb/" target="_blank" rel="noopener"&#10; &gt;iCloudの無料枠がいつまで経っても5GBから増えないことを確認できる「Is iCloud’s free tier still 5GB？」 - GIGAZINE&lt;/a&gt;」をやってみよう。&lt;/p&gt;&#10;&lt;p&gt;ブラウザの拡張機能のアイコンをクリックすると選択肢が出てくる。&lt;/p&gt;&#10;&lt;p&gt;&lt;img loading="lazy" sizes="(max-width: 767px) calc(100vw - 30px), (max-width: 1023px) 700px, (max-width: 1279px) 950px, 1232px" src="https://hack-le.com/images/uploads/2026/03/image-2.png"&gt;&lt;/p&gt;&#10;&lt;p&gt;「Save whole page」を選択すると、Journalにクリップされる。&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/03/image-3-700x521.png"&gt;&lt;/p&gt;&#10;&lt;p&gt;スクショも保存できる。しかし、表示されている画面分だけなので使い勝手は微妙な気がする。一部分のクリップはSNSとかヤフコメとか見ているときに捗るかもしれない。&lt;/p&gt;&#10;&lt;p&gt;検索するとノートがヒットする。ここらへんどれくらい管理するかは人それぞれ。&lt;/p&gt;&#10;&lt;p&gt;&lt;img loading="lazy" sizes="(max-width: 767px) calc(100vw - 30px), (max-width: 1023px) 700px, (max-width: 1279px) 950px, 1232px" src="https://hack-le.com/images/uploads/2026/03/image-5.png"&gt;&lt;/p&gt;&#10;&lt;h2 id="所感"&gt;所感&#10;&lt;/h2&gt;&lt;p&gt;&lt;strong&gt;AI時代になってアプリ開発が劇的に楽になったため、自分用のノート・メモアプリはもう自作したほうがいいんじゃないの？と思うこともある今日この頃&lt;/strong&gt;だけれど、そうはいってもやはりそれにはスキルも時間も必要。&lt;/p&gt;&#10;&lt;p&gt;最初からほしいところがそろっていて、かつWeb Clipperが用意されているのは非常に強力なので、ノート系アプリがほしい人にとっては第一候補になると思う。&lt;/p&gt;&#10;&lt;p&gt;本アプリはSQLiteを使って独自データベース設計になっているが、AIでいろいろやりたい観点からは、ファイルベースのほうがいいという意見もあるかもしれない。が、正直そんなやらせることある？という気が個人的にはしている。&lt;strong&gt;AIにやらせたい特定のユースケースがあるならば、そのためにアプリを作った方がいい&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;また、継続性の観点から独自データベース設計はややネックにはなるかもしれない。しかし、この手のメモアプリはいろいろ貼りたくなるもので、Obsidian使ったところでどうせ大変になる。画像みたいなバイナリがあると、そのバイナリのパスの管理なども出てくるから、ファイルベースだから大丈夫！とも言えない。パス失って探せないファイルはないのと同じ。&lt;strong&gt;ファイルベースも結局ディレクトリ構造どうしているのかわからないと管理できない&lt;/strong&gt;。&lt;/p&gt;&#10;&lt;p&gt;ってかもしサポートが途絶えたなら、それこそAI使ってデータベースから必要な抽出をすればいいと思うんよな。&lt;/p&gt;&#10;&lt;p&gt;そんなわけで、個人的にはノートアプリのセルフホストFOSSとしておススメできるかなと思います。&lt;/p&gt;&#10;</description></item><item><title>【MinIO】LAN内のセルフホストしたサーバのバックアップの構成を考えている</title><link>https://hack-le.com/lan-minio/</link><pubDate>Wed, 11 Mar 2026 00:00:00 +0900</pubDate><guid>https://hack-le.com/lan-minio/</guid><description>&lt;h2 id="やりたいこと"&gt;やりたいこと&#10;&lt;/h2&gt;&lt;p&gt;最近はFOSSのセルフホストできるアプリケーションサーバはもちろん、AIプログラミングによって自分用のアプリケーションが無数に出来上がっている。稼働中のアプリケーションの数は20-30くらいあるような気がする。また、複数マシンに散らばっているし、できれば今後Linux PCの検証も兼ねて、激しくサーバの移動などもさせていきたい。&lt;/p&gt;&#10;&lt;p&gt;そうすると、バックアップ・復元が悩ましい。現在は各マシン・各アプリケーションで個別のバックアップスクリプトやバックアップのワーカを走らせており、なにがなんだかわからなくなってきた。一元化する必要がある。&lt;/p&gt;&#10;&lt;h2 id="アーキテクチャ案"&gt;アーキテクチャ案&#10;&lt;/h2&gt;&lt;h3 id="全体像"&gt;全体像&#10;&lt;/h3&gt;&lt;p&gt;Geminiと「違うそうじゃないこのわからずや」などと相談しつつ、下図のような構成を考えている。&lt;/p&gt;&#10;&lt;pre class="mermaid" style="visibility:hidden"&gt;graph TD&#10;subgraph AppServer [アプリケーションサーバ]&#10;direction TB&#10;App[アプリケーション本体]&#10;State[(状態 / SQLite / ファイル)]&#10;subgraph WorkerProcess [バックアップワーカー]&#10;Export[1. エクスポート実行]&#10;Pack[2. アーカイブ化]&#10;Push[3. S3 PUT 転送]&#10;end&#10;App State&#10;Export -.-&gt; State&#10;Export --&gt; Pack&#10;Pack --&gt; Push&#10;end&#10;subgraph Network [LAN / ネットワーク]&#10;Protocol{S3互換プロトコル / HTTPS}&#10;end&#10;subgraph BackupServer [バックアップサーバ]&#10;direction TB&#10;MinIO[MinIO / S3 API]&#10;subgraph FileSystem [物理ストレージ]&#10;BucketA[App-A用バケット]&#10;BucketB[App-B用バケット]&#10;Versioning[世代管理 / バージョニング]&#10;end&#10;MinIO --&gt; BucketA&#10;MinIO --&gt; BucketB&#10;BucketA --- Versioning&#10;end&#10;Push --&gt; Protocol&#10;Protocol --&gt; MinIO&lt;/pre&gt;&lt;p&gt;バックアップサーバにはMinIOでS3互換のオブジェクトストレージをたてる。アプリケーションサーバには、バックアップ用のワーカを走らせて、そこからS3互換APIでアプリケーション名を添えて必要なアーカイブPUTする。バックアップサーバはアプリケーション名で分類して保存する。&lt;/p&gt;&#10;&lt;h3 id="アーキテクチャの要点"&gt;アーキテクチャの要点&#10;&lt;/h3&gt;&lt;p&gt;考え方をGeminiにまとめさせた。&lt;/p&gt;&#10;&lt;ul&gt;&#10;&lt;li&gt;&lt;strong&gt;アプリケーションの責務&lt;/strong&gt;: バックアップワーカーは「何が復元に必要なデータか」を熟知しており、自らアーカイブを作成する。バックアップサーバの内部パス（&lt;code&gt;/mnt/sda1/...&lt;/code&gt;など）は知る必要がなく、自身の「バケット名」という抽象化された名前だけを知っている。&lt;/li&gt;&#10;&lt;li&gt;&lt;strong&gt;バックアップサーバの責務&lt;/strong&gt;: MinIOが受け皿となり、届いたファイルをバケットごとに整理する。ファイルシステム上の物理的な配置や、古いファイルのローテーション（ライフサイクル設定）は、サーバ側のポリシーとして一元管理する。&lt;/li&gt;&#10;&lt;li&gt;&lt;strong&gt;疎結合な関係&lt;/strong&gt;: 転送は標準的なS3 APIで行われるため、将来的にアプリケーションを別のホストに移動したり、バックアップサーバの構成を変更したりしても、エンドポイントと認証情報を書き換えるだけで運用が継続できる。&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;h3 id="push型の考え方"&gt;Push型の考え方&#10;&lt;/h3&gt;&lt;p&gt;大まかにわけて、考え方としてアプリケーションから動くPush型と、バックアップサーバが見に行くPull型があるかなと思う。綺麗にやるならPullかもしれないんだが（AIからはそれを提案された）、現実は汚いので管理が面倒くさいことになると思われた。&lt;/p&gt;&#10;&lt;p&gt;アプリケーションには固有の特徴があるものだ。その差分を吸収しようとすれば結局たいへんになる。そもそもバックアップできてなくて困るのはそのアプリケーションなのだから、Import/Exportは基本的にアプリケーションの仕事であるべきだと思う。&lt;/p&gt;&#10;&lt;p&gt;ただその保存場所として、よく知られたやり方の倉庫があってほしい。FTPやrsyncだとパスの指定のような倉庫の中身をアプリケーションサーバが知らなくてはいけなくなり、しんどい。ということで、S3互換APIを使えるMinIOを間に挟むのが良いだろう、という感じ。&lt;/p&gt;&#10;&lt;h3 id="愚直にアーカイブする理由"&gt;愚直にアーカイブする理由&#10;&lt;/h3&gt;&lt;p&gt;この構成だとResticみたいなバックアップツールを使って圧縮したり差分・増分を転送したりするということが考えられるのだが（Geminiにも勧められた）、それはやめた。まぁ使ったことがないので学習コストがかかるというのもあるのだが、原理的な面として、アプリケーションの個別の対応や復元を考えるとややこしくなりそうに思えた。&lt;/p&gt;&#10;&lt;p&gt;それに対して、&lt;strong&gt;純粋にファイルベースのバックアップならば最悪どうなってもなんとかはなるし、何よりもわかりやすい&lt;/strong&gt;。通常はネックになる通信帯域もLAN内だから気にしなくていいし、ストレージも家のHDDを使えばいいんだから課金の心配もなく全然余裕がある。&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;p&gt;ただまぁ、僕が作っているアプリケーションにはAIで大量のデータが生成されるようなものもあるのだが、それについては別で考えたほうがいいかもしれない。アプリケーション自体のデータベースはあまり肥大化しないような設計が求められる。&lt;/p&gt;&#10;</description></item><item><title>Mac mini 2018 + Lyrion Music Server(LMS, Logitech Media Server) + Squeezeliteで音楽ライフ</title><link>https://hack-le.com/mac-mini-2018-lyrion-music-serverlms-logitech-media-server-squeezelite/</link><pubDate>Mon, 09 Mar 2026 00:00:00 +0900</pubDate><guid>https://hack-le.com/mac-mini-2018-lyrion-music-serverlms-logitech-media-server-squeezelite/</guid><description>&lt;p&gt;うちはメインデスクトップから一線を退いたIntel Mac mini 2018がホームサーバの中心として鎮座しており、そこからXiaomiのMi TV経由でアンプにも繋がっている。なので、音楽の再生は基本的にこの子でやりたい。ただしその操作は手元のPCにあるやつでやりたい。&lt;/p&gt;&#10;&lt;p&gt;何がよかろうとかとGeminiに色々と相談し、結果 LMS + Squeezelite になった。&lt;/p&gt;&#10;&lt;h2 id="構成"&gt;構成&#10;&lt;/h2&gt;&lt;p&gt;全体の構成はこのような感じだ。ポイントは、起点となるPC Aから、PC B経由でMi TV、そして最終的にSonyのスピーカー（友人からもらった）に接続することだね。&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 (Mac mini 2018 / サーバー兼再生機)"]&#10;direction TB&#10;LMS["Logitech Media Server(楽曲管理・配信)"]&#10;subgraph AudioOutput ["音声出力プロセス"]&#10;Squeezelite["Squeezelite(再生用クライアント)"]&#10;CoreAudio["macOS Core Audio(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 -- "② 音楽ストリーム送信 (localhost)" --&gt; Squeezelite&#10;Squeezelite -- "③ 音声信号受け渡し" --&gt; CoreAudio&#10;Storage -. "スキャン" .-&gt; LMS&#10;%% 物理接続&#10;CoreAudio == "④ HDMI/音声出力" ==&gt; TV&#10;TV == "⑤ 光デジタル出力" ==&gt; Speaker&#10;%% スタイル設定&#10;style PCB fill:#f9f9f9,stroke:#333,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 TV fill:#eeeeee,stroke:#666&lt;/pre&gt;&lt;p&gt;このめんどくさい絵をサクッと起こしてくれるのはAIの良いところだ。&lt;/p&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/" target="_blank" rel="noopener"&#10; &gt;Getting Started with LMS - Lyrion Music Server&lt;/a&gt;」よりダウンロードしてインストール。開発元云々は「プライバシーとセキュリティ」から黙らせるいつもの儀式。&lt;/p&gt;&#10;&lt;p&gt;画面右下にNextボタンがあるので、そっから「ローカルフォルダ（曲をスキャンするフォルダ）」とプレイリストを保存するフォルダをそれぞれ指定する。外付けSSDもちゃんと指定できてよかった。&lt;/p&gt;&#10;&lt;p&gt;しばらく待つといい感じになる。&lt;/p&gt;&#10;&lt;p&gt;&lt;img loading="lazy" sizes="(max-width: 767px) calc(100vw - 30px), (max-width: 1023px) 700px, (max-width: 1279px) 950px, 1232px" src="https://hack-le.com/images/uploads/2026/02/41369db13ca7cbdca06fda2c7017dea1-700x574.webp"&gt;&lt;/p&gt;&#10;&lt;p&gt;時間がかかるので、その間にSqueezeliteの設定にうつる。&lt;/p&gt;&#10;&lt;h3 id="squeezelite"&gt;Squeezelite&#10;&lt;/h3&gt;&lt;p&gt;「&lt;a class="link" href="https://lyrion.org/players-and-controllers/squeezelite/" target="_blank" rel="noopener"&#10; &gt;Squeezelite - Lyrion Music Server&lt;/a&gt;」のリンクにあるSourceforgeのバイナリを使う。Intel Macの場合ffmpeg版と無印があるがffmpegで一番新しいやつを使う。ダウンロードした.dmgを実行し、アプリケーションフォルダにコピーする。例によってセキュリティ元云々言ってきて鬱陶しいが「プライバシーとセキュリティ」から黙らせるいつもの儀式。ジョブズ亡き後のこの儀式いつまで続くんだろう。&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;/Applications/Squeezelite.app/Contents/MacOS/squeezelite -l&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;これでOutput devicesが出てきたらOK。うちの場合はこんな感じ。&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;Output devices:&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="m"&gt;0&lt;/span&gt; - Mi TV &lt;span class="o"&gt;[&lt;/span&gt;Core Audio&lt;span class="o"&gt;]&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="m"&gt;1&lt;/span&gt; - Mac miniのスピーカー &lt;span class="o"&gt;[&lt;/span&gt;Core Audio&lt;span class="o"&gt;]&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="m"&gt;2&lt;/span&gt; - Microsoft Teams Audio &lt;span class="o"&gt;[&lt;/span&gt;Core Audio&lt;span class="o"&gt;]&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="m"&gt;3&lt;/span&gt; - Splashtop Remote Sound &lt;span class="o"&gt;[&lt;/span&gt;Core Audio&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;Mac mini -&amp;gt;|HDMI| Mi TV -&amp;gt;|光デジタル| -&amp;gt; スピーカーの経路で、デフォルトMi TVにしている。とりあえず接続はOK。&lt;/p&gt;&#10;&lt;p&gt;いい感じになる。&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;nano ~/Library/LaunchAgents/com.user.squeezelite.plist&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;編集内容は以下。-o以下のデバイス名は、&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-xml" data-lang="xml"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="cp"&gt;&amp;lt;?xml version=&amp;#34;1.0&amp;#34; encoding=&amp;#34;UTF-8&amp;#34;?&amp;gt;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="cp"&gt;&amp;lt;!DOCTYPE plist PUBLIC &amp;#34;-//Apple//DTD PLIST 1.0//EN&amp;#34; &amp;#34;http://www.apple.com/DTDs/PropertyList-1.0.dtd&amp;#34;&amp;gt;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nt"&gt;&amp;lt;plist&lt;/span&gt; &lt;span class="na"&gt;version=&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;1.0&amp;#34;&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nt"&gt;&amp;lt;dict&amp;gt;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nt"&gt;&amp;lt;key&amp;gt;&lt;/span&gt;Label&lt;span class="nt"&gt;&amp;lt;/key&amp;gt;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nt"&gt;&amp;lt;string&amp;gt;&lt;/span&gt;com.user.squeezelite&lt;span class="nt"&gt;&amp;lt;/string&amp;gt;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nt"&gt;&amp;lt;key&amp;gt;&lt;/span&gt;ProgramArguments&lt;span class="nt"&gt;&amp;lt;/key&amp;gt;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nt"&gt;&amp;lt;array&amp;gt;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nt"&gt;&amp;lt;string&amp;gt;&lt;/span&gt;/Applications/Squeezelite.app/Contents/MacOS/squeezelite&lt;span class="nt"&gt;&amp;lt;/string&amp;gt;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nt"&gt;&amp;lt;string&amp;gt;&lt;/span&gt;-n&lt;span class="nt"&gt;&amp;lt;/string&amp;gt;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nt"&gt;&amp;lt;string&amp;gt;&lt;/span&gt;任意のプレイヤー名&lt;span class="nt"&gt;&amp;lt;/string&amp;gt;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nt"&gt;&amp;lt;string&amp;gt;&lt;/span&gt;-o&lt;span class="nt"&gt;&amp;lt;/string&amp;gt;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nt"&gt;&amp;lt;string&amp;gt;&lt;/span&gt;デバイス名&lt;span class="nt"&gt;&amp;lt;/string&amp;gt;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nt"&gt;&amp;lt;/array&amp;gt;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nt"&gt;&amp;lt;key&amp;gt;&lt;/span&gt;RunAtLoad&lt;span class="nt"&gt;&amp;lt;/key&amp;gt;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nt"&gt;&amp;lt;true/&amp;gt;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nt"&gt;&amp;lt;key&amp;gt;&lt;/span&gt;KeepAlive&lt;span class="nt"&gt;&amp;lt;/key&amp;gt;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nt"&gt;&amp;lt;true/&amp;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="nt"&gt;&amp;lt;/dict&amp;gt;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nt"&gt;&amp;lt;/plist&amp;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;/tmp&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;launchctl load ~/Library/LaunchAgents/com.user.squeezelite.plist&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&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;nohup /Applications/Squeezelite.app/Contents/MacOS/squeezelite -n &lt;span class="s2"&gt;&amp;#34;任意のプレイヤー名&amp;#34;&lt;/span&gt; -o &lt;span class="s2"&gt;&amp;#34;アウトプットデバイスの名前&amp;#34;&lt;/span&gt; -s 127.0.0.1 &amp;gt; /dev/null 2&amp;gt;&lt;span class="p"&gt;&amp;amp;&lt;/span&gt;&lt;span class="m"&gt;1&lt;/span&gt; &lt;span class="p"&gt;&amp;amp;&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;-l&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;nohup /Applications/Squeezelite.app/Contents/MacOS/squeezelite -n &lt;span class="s2"&gt;&amp;#34;MacMini-Player&amp;#34;&lt;/span&gt; -o &lt;span class="s2"&gt;&amp;#34;Mi TV&amp;#34;&lt;/span&gt; -s 127.0.0.1 &amp;gt; /dev/null 2&amp;gt;&lt;span class="p"&gt;&amp;amp;&lt;/span&gt;&lt;span class="m"&gt;1&lt;/span&gt; &lt;span class="p"&gt;&amp;amp;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;基本的にはlaunchdが救うはずなんだが、うちの環境だとMi TVの電源ダウンとかでなんかエラー出ているのかなぁ。ログ指定したけどなんも出てなかった。&lt;/p&gt;&#10;&lt;p&gt;これは現状未解決で、強行的に監視入れるかどうか悩んでいる。&lt;/p&gt;&#10;&lt;h3 id="音楽フォルダベースでの管理"&gt;音楽フォルダベースでの管理&#10;&lt;/h3&gt;&lt;p&gt;僕はライブラリ管理せずにフォルダベースでやっているので、LMSではInterfaceの設定から以下のように「Categories」の歯車より「音楽フォルダーをブラウズする」にチェックを入れる。&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/02/43a3eda1bf112c97372939317dfa0912-700x375.jpg"&gt;&lt;/p&gt;&#10;&lt;p&gt;この変更により「My music」に「音楽フォルダーをブラウズする」が追加される。&lt;/p&gt;&#10;&lt;h2 id="所感"&gt;所感&#10;&lt;/h2&gt;&lt;p&gt;ホームサーバ化が進んでよかった。&lt;/p&gt;&#10;&lt;p&gt;ただ現在、音楽ファイルが散らばってしまっている問題がある。というのも、外部接続用途のメディアサーバは別にたてているんだよねぇ。うーん。それというのも、ホームサーバとして鎮座しているMac mini 2018がmacOSで、ストレージ容量が512GBしかないのだけれど、かといって外部ストレージの接続も不安定、またそもそもSMB接続がうんこなど、のNASになりきれない制約による。「&lt;a class="link" href="https://chapt.net/blog/memo/music-and-computer/newest_logitech-media-server/" target="_blank" rel="noopener"&#10; &gt;Logitech Media Server 最新版 – Plumtown&lt;/a&gt;」のようにTS-233にLMSを入れている方もいて、なるほどと思ったが、しかしネットワーク経由になってしまうし、なんだかなぁ。&lt;/p&gt;&#10;&lt;p&gt;Mac miniを完全にLinux化できれば諸々の問題も解決するんだろうか。うちのジャンクPC艦隊の中には立派に役割を果たせそうなのもある。しかし純粋に性能が高いのはこの子だし、メインデスクトップのM2 Pro Mac miniとユニバーサルコントロールにより標準機能で繋がれるという強みもあるので、当面はもうちょっとこの構成で運用を考えていこう。&lt;/p&gt;&#10;</description></item><item><title>脱Dropbox再考: そもそも同期は必要か</title><link>https://hack-le.com/datsudropboxsaikou/</link><pubDate>Wed, 04 Mar 2026 00:00:00 +0900</pubDate><guid>https://hack-le.com/datsudropboxsaikou/</guid><description>&lt;p&gt;&lt;strong&gt;この前Dropboxのプレミアム会員の権利が終わった&lt;/strong&gt;。2020年から&lt;strong&gt;6年&lt;/strong&gt;続けていたらしい。2020年に31,680円で3年分まとめ買いしたのと、2023年にAmazonで29,800円で購入していた。今はもうこの価格で出ることはないだろう。なので6万円ほど（月額約860円）だが、最後の1年はほとんど使っていなかったので、あながち得したともいえない。長期割引の罠にはまってしまった感じはする。&lt;strong&gt;正直なきゃないでよかった&lt;/strong&gt;。&lt;/p&gt;&#10;&lt;p&gt;ただ、Dropbox自体は嫌いなサービスではない。むしろ個人的には好きですらあった。最近アカウントBANの騒ぎがあったのを見た時はちょっと悲しかったけど、全体的には良いサービスだと思う。&lt;/p&gt;&#10;&lt;p&gt;Linuxでも使えるし、Macでは文字コード正規化問題のようなニッチだがクリティカルなところも対応していたし、スクリーンショット横取りなんかは気が利いていたし、カメラアップロードも便利だし、アプリの使い勝手もまぁ悪くないし、復元機能などはかなり強力で何度か助けられたし、なにより&lt;strong&gt;同期という単純ながら難しい課題の精度を着実に上げていた&lt;/strong&gt;。&lt;/p&gt;&#10;&lt;p&gt;&lt;strong&gt;Dropboxほどの機能はOSSやNASでは恐らくだいぶ厳しくて&lt;/strong&gt;、僕はQNAPのNASについてきたQSyncという同期アプリを今は使っているが、正直安定性はDropboxに及ぶべくもない。大量のファイルについて読み書きすると平然と取りこぼすので、あまり信用できない感じだ。OSSではNextcloudやSeafileもあるが、あまりマジメに試していないものの、運用者の記事を調べるとやはり苦労していそうな感じがある。&lt;/p&gt;&#10;&lt;p&gt;そこへいくと、業務として同期が必要なのであれば、Dropboxは安心して高いなりの仕事は任せられるのはそうだと思う。本当に必要ならね。&lt;/p&gt;&#10;&lt;p&gt;個人や中小規模において、同期に毎月1,500円払えるかと言われると、それはちょっとどうかな。正直900円くらいでも、よく払っていたなぁと思う。&lt;strong&gt;結局どこまでも経費&lt;/strong&gt;だからねぇ。正直ほとんどオーバースペックと思われる。たいてい、少しの工夫でどうにかなりそうなんだよなぁ。&lt;/p&gt;&#10;&lt;p&gt;そして厳しくなるばかりのアカウントBANリスク。バックアップがわりになるというが、&lt;strong&gt;自宅が火災にあってデータ消失するリスクより、謎のアカウントBANでデータ消失するリスクのほうが現実的に高い&lt;/strong&gt;だろうさ。ちょっと厳しいよなこれは。&lt;/p&gt;&#10;&lt;p&gt;考えてみると、&lt;strong&gt;本当に同期が必要なシチュエーションってもはやあまりない&lt;/strong&gt;んだよなぁ。結局やりたいことは、コンピュータAでやった操作を、コンピュータBで続きができる、ファイルが分裂しないっていうことだと思う。これについて、アプローチとしてはクライアントサーバ型と、すべてのPCにばら撒く分散型があるわけだが、分散が適切な状況ってのはあまりない感じだ。ただDropboxが手軽だったら使っていた。&lt;/p&gt;&#10;&lt;p&gt;その手軽さは、ファイルという実体を直接操作できるところが大きい。しかし&lt;strong&gt;最近は、ファイルを直接操作することはあまりなくて、アプリケーション経由であることが多くなった&lt;/strong&gt;。&lt;strong&gt;セルフホストが手軽になったことや、AIによってちょっとした自分用ツールをサクッと作れるようになったことが大きい&lt;/strong&gt;。&lt;/p&gt;&#10;&lt;p&gt;そうすると、&lt;strong&gt;僕が「そもそも同期する必要あるか？」と疑問に思うようになったのは、ここ数年のAIの隆盛と、セルフホスト・自宅サーバに再び傾倒し始めたことが影響している&lt;/strong&gt;かもしれない。&lt;/p&gt;&#10;&lt;p&gt;Dropboxをはじめとしたクラウドサービスは、アカウントBANに象徴されるように、なんつーか健全な商売にしか使えないというか、自分のプライバシーを預けるにはあまりにも危なっかしい相手になってしまったし、ここらへんが転換期なのかもしれない。&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/dropbox-ban/" class="blog-card"&gt;&#10; &lt;div class="blog-card-content"&gt;&#10; &lt;div class="blog-card-label"&gt;&#10; &lt;svg xmlns="http://www.w3.org/2000/svg" width="13" height="13" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"&gt;&lt;path d="M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.71"&gt;&lt;/path&gt;&lt;path d="M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71"&gt;&lt;/path&gt;&lt;/svg&gt;&#10; &lt;span&gt;あわせて読みたい&lt;/span&gt;&#10; &lt;/div&gt;&#10; &lt;div class="blog-card-title"&gt;DropboxでアカウントBANされた人がいるらしい&lt;/div&gt;&#10; &lt;div class="blog-card-url"&gt;/dropbox-ban/&lt;/div&gt;&#10; &lt;/div&gt;&#10; &lt;div class="blog-card-thumbnail"&gt;&#10; &lt;img src="https://hack-le.com/images/uploads/2026/01/output-32.webp" alt="DropboxでアカウントBANされた人がいるらしい" loading="lazy" /&gt;&#10; &lt;/div&gt;&#10; &lt;/a&gt;&#10;&lt;/div&gt;&#10;&#10;</description></item><item><title>VPS + Caddy + WordPress を構成する さようならCloudflare Tunnel</title><link>https://hack-le.com/vps-caddy-wordpress-cft/</link><pubDate>Mon, 02 Mar 2026 00:00:00 +0900</pubDate><guid>https://hack-le.com/vps-caddy-wordpress-cft/</guid><description>&lt;p&gt;脱Cloudflare Tunnel計画で、VPSで入れているCloudflareをCaddyに置き換えようとしている。&lt;/p&gt;&#10;&lt;h2 id="前提"&gt;前提&#10;&lt;/h2&gt;&lt;div class="blog-card-wrapper"&gt;&#10; &lt;a href="https://hack-le.com/caddy-reverse-proxy/" class="blog-card"&gt;&#10; &lt;div class="blog-card-content"&gt;&#10; &lt;div class="blog-card-label"&gt;&#10; &lt;svg xmlns="http://www.w3.org/2000/svg" width="13" height="13" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"&gt;&lt;path d="M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.71"&gt;&lt;/path&gt;&lt;path d="M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71"&gt;&lt;/path&gt;&lt;/svg&gt;&#10; &lt;span&gt;あわせて読みたい&lt;/span&gt;&#10; &lt;/div&gt;&#10; &lt;div class="blog-card-title"&gt;証明書発行 &amp;#43; リバースプロキシ Caddy を試す curl https://localhost とかいう哲学&lt;/div&gt;&#10; &lt;div class="blog-card-url"&gt;/caddy-reverse-proxy/&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_47983_1771050810.webp" alt="証明書発行 &amp;#43; リバースプロキシ Caddy を試す curl https://localhost とかいう哲学" 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;構成はこんな感じ。なんか最近AIが秒で書いてくれて地味に助かる。&lt;/p&gt;&#10;&lt;pre class="mermaid" style="visibility:hidden"&gt;graph TD&#10;subgraph Internet[インターネット]&#10;User((ユーザー))&#10;end&#10;subgraph VPS[Ubuntu VPS]&#10;direction TB&#10;subgraph CaddyServer[Caddy / ポート: 80, 443]&#10;Caddy[Caddy]&#10;end&#10;subgraph DockerNetwork[Docker ネットワーク]&#10;WP[WordPress Container]&#10;end&#10;end&#10;%% 通信の流れ&#10;User -- HTTPS:443 --&gt; Caddy&#10;Caddy -- reverse_proxylocalhost:内部ポート --&gt; WP&#10;%% 役割の説明&#10;style Caddy fill:#f9f,stroke:#333,stroke-width:2px&#10;style WP fill:#0073aa,stroke:#fff,stroke-width:2px,color:#fff&#10;style VPS fill:#f5f5f5,stroke:#333,stroke-dasharray: 5 5&#10;note1[SSL証明書の自動管理圧縮: encode zstd gzip] -.-&gt; Caddy&lt;/pre&gt;&lt;ul&gt;&#10;&lt;li&gt;ConoHa VPS 2GB RAM&lt;/li&gt;&#10;&lt;li&gt;Ubuntu 24.04.3&lt;/li&gt;&#10;&lt;li&gt;caddy v2.10.2&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;h3 id="dnsの設定"&gt;DNSの設定&#10;&lt;/h3&gt;&lt;p&gt;ダウンタイムとかどうでもいいので、しれっと既存のレコードを削除して新たにAレコード追加する。&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;dig 独自ドメイン&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;dig 独自ドメイン @8.8.8.8&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;次の設定をしながら反映されるのを待つ……とか思ってたら秒で反映されてびっくりした。&lt;/p&gt;&#10;&lt;h3 id="caddyの設定"&gt;Caddyの設定&#10;&lt;/h3&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;独自ドメイン &lt;span class="o"&gt;{&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; reverse_proxy localhost:ポート&#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; encode zstd gzip&#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; log &lt;span class="o"&gt;{&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; output file /var/log/caddy/独自ドメイン.access.log&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="o"&gt;}&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&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;/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 caddy fmt --overwrite /etc/caddy/Caddyfile&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;検証する。ログファイルの権限がcaddyのみなのでsudoつける。&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 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;sudo systemctl reload caddy&#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 journalctl -u caddy -f&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;いつ見ても覚えづらいsystemd系統のコマンド。&lt;/p&gt;&#10;&lt;h3 id="ログファイルのパーミッションに注意"&gt;ログファイルのパーミッションに注意&#10;&lt;/h3&gt;&lt;p&gt;ログファイルは基本的にcaddyの権限となるのだが、エラーが出ていたらだいたいrootユーザになってしまっている。ユーザをなおせば大丈夫&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 chown caddy:caddy /var/log/caddy/ログファイル&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id="やってないヘッダ偽装しろという指示もあり"&gt;（やってない）ヘッダ偽装しろという指示もあり&#10;&lt;/h2&gt;&lt;p&gt;最初Geminiに聞いたときは、リバースプロキシするなら以下のようにヘッダかけと言われた。&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;独自ドメイン &lt;span class="o"&gt;{&lt;/span&gt;&#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; log &lt;span class="o"&gt;{&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; output file /var/log/caddy/独自ドメイン.access.log&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="o"&gt;}&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="c1"&gt;# WordPressへのリバースプロキシ&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; reverse_proxy localhost:ポート &lt;span class="o"&gt;{&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="c1"&gt;# WordPressが正しいURLを生成するために必要なヘッダー&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; header_up Host &lt;span class="o"&gt;{&lt;/span&gt;host&lt;span class="o"&gt;}&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; header_up X-Real-IP &lt;span class="o"&gt;{&lt;/span&gt;remote_host&lt;span class="o"&gt;}&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; header_up X-Forwarded-For &lt;span class="o"&gt;{&lt;/span&gt;remote_host&lt;span class="o"&gt;}&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; header_up X-Forwarded-Proto &lt;span class="o"&gt;{&lt;/span&gt;scheme&lt;span class="o"&gt;}&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="o"&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; encode gzip&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&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;しかし今までCloudflare Tunnelでこんな設定してなかったけどなぁと思い、設定せずにやったところ、普通に動く。しかしGeminiは「いや&lt;code&gt;header_up Host {host}&lt;/code&gt;だけでも書きなよ」とのことだが、しかし動いているしなぁと思った。&lt;/p&gt;&#10;&lt;p&gt;Claudeに聞いたところ、「Caddyの&lt;code&gt;reverse_proxy&lt;/code&gt;ディレクティブは、&lt;strong&gt;何も指定しなくても以下のヘッダーを自動的に設定&lt;/strong&gt;します」とのことだった。&lt;/p&gt;&#10;&lt;ul&gt;&#10;&lt;li&gt;&lt;code&gt;X-Forwarded-For&lt;/code&gt;: クライアントのIPアドレス&lt;/li&gt;&#10;&lt;li&gt;&lt;code&gt;X-Forwarded-Proto&lt;/code&gt;: スキーム（http/https）&lt;/li&gt;&#10;&lt;li&gt;&lt;code&gt;X-Forwarded-Host&lt;/code&gt;: オリジナルのHostヘッダー&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;p&gt;これらは標準的なリバースプロキシのヘッダーで、Caddyが「気を利かせて」自動設定している、のだとさ。&lt;/p&gt;&#10;&lt;p&gt;&lt;code&gt;Host&lt;/code&gt;ヘッダーに関しては、Caddyは&lt;strong&gt;デフォルトでプロキシ先（バックエンド）のアドレス&lt;/strong&gt;に設定するので、Geminiの言う通りこれは設定しないと&lt;code&gt;localhost:ポート番号&lt;/code&gt;に渡されるらしい。が、これについてはWordPress側の設定でURLを定義しているので、Hostヘッダに関係なくURL生成されているんだろうね、とのこと。&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;p&gt;半額セールで安かったからGemini使っているんだが、ChatGPTとClaudeに比べるとあまり品質はよくない気がする。ただ前にChatGPTと比べていた時には、「ChatGPTよりGeminiの無料枠のほうがマシでは」とすら思ったので、トピックによるのか、それともシードガチャなのか。&lt;/p&gt;&#10;&lt;p&gt;まぁよくわからんが、実際のところ確かに複数のAIに聞く、というのは経験的にはアリな気はしている。いつまでこの爆大なコストが使えるのかわからんがね。&lt;/p&gt;&#10;</description></item><item><title>Jitsi Meet(ネイティブ) から Caddy + Jitsi Meet(コンテナ)の構成に移行</title><link>https://hack-le.com/jitsi-meet-docker-caddy/</link><pubDate>Thu, 19 Feb 2026 00:00:00 +0900</pubDate><guid>https://hack-le.com/jitsi-meet-docker-caddy/</guid><description>&lt;p&gt;CaddyをVPSに入れようと思ったが、443が既にJitsi Meetで使われていることに気づいた。ネイティブにインストールしており、内部的にはnginxが使われているはずだが、このままだとCaddyとバッティングしてしまう。&lt;/p&gt;&#10;&lt;p&gt;ということで、構成を練り直さないとなぁ、としこしこやりなおすことにした。&lt;/p&gt;&#10;&lt;h2 id="全体の構成"&gt;全体の構成&#10;&lt;/h2&gt;&lt;p&gt;元々の環境&lt;/p&gt;&#10;&lt;ul&gt;&#10;&lt;li&gt;ConoHa VPS, Ubuntu 24.04.3, 2GB RAM&#10;&lt;ul&gt;&#10;&lt;li&gt;1.5GBくらい常に使っている頑張り屋&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;/li&gt;&#10;&lt;li&gt;Jitsi Meet バージョン失念&lt;/li&gt;&#10;&lt;li&gt;docker 29.2.1&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;p&gt;全体の構成は以下のようになる見込みだ。Geminiが10秒で描いた。&lt;/p&gt;&#10;&lt;pre class="mermaid" style="visibility:hidden"&gt;graph LR&#10;subgraph "Public Internet"&#10;Client[Client Browser]&#10;end&#10;subgraph "VPS Host"&#10;Caddy(Caddy Server)&#10;subgraph "Docker Bridge Network (172.18.0.x)"&#10;Web[Container: Web]&#10;Prosody[Container: Prosody]&#10;Jicofo[Container: Jicofo]&#10;JVB[Container: JVB]&#10;end&#10;end&#10;Client -- "Port 443" --&gt; Caddy&#10;Caddy -- "Port 8000 (Internal)" --&gt; Web&#10;Web -- "XMPP" --&gt; Prosody&#10;Jicofo -- "Control" --&gt; Prosody&#10;JVB -- "Signaling" --&gt; Prosody&#10;Client -- "Port 10000/UDP (Direct)" --&gt; JVB&#10;style Caddy fill:#f9f&#10;style Web fill:#bbf&#10;style JVB fill:#dfd&lt;/pre&gt;&lt;p&gt;各役割についてもGeminiが10秒で書いた。&lt;/p&gt;&#10;&lt;ul&gt;&#10;&lt;li&gt;Caddy (Reverse Proxy)&#10;&lt;ul&gt;&#10;&lt;li&gt;&lt;strong&gt;SSL/TLS終端:&lt;/strong&gt; Let&amp;rsquo;s Encrypt等の証明書管理をすべて引き受けます。&lt;/li&gt;&#10;&lt;li&gt;&lt;strong&gt;ルーティング:&lt;/strong&gt; 特定のドメインへのリクエストをJitsiのWebコンテナ（通常はポート8443や8080）へ転送します。&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;/li&gt;&#10;&lt;li&gt;Jitsi Web (Nginx)&#10;&lt;ul&gt;&#10;&lt;li&gt;&lt;strong&gt;静的ファイルの配信:&lt;/strong&gt; Jitsi MeetのJavaScriptクライアントをブラウザに渡します。&lt;/li&gt;&#10;&lt;li&gt;&lt;strong&gt;内部プロキシ:&lt;/strong&gt; ブラウザからのAPIリクエストや外部通信（BOSH/WebSocket）を内部のProsodyへ中継します。&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;/li&gt;&#10;&lt;li&gt;Jitsi Videobridge (JVB)&#10;&lt;ul&gt;&#10;&lt;li&gt;&lt;strong&gt;メディア通信:&lt;/strong&gt; 映像・音声データをリアルタイムに中継します。&lt;/li&gt;&#10;&lt;li&gt;&lt;strong&gt;注意点:&lt;/strong&gt; この通信はオーバーヘッドを避けるため、通常はCaddyを通さず、&lt;strong&gt;UDP 10000番ポートでクライアントと直接通信&lt;/strong&gt;します。ここが疎通しないと「自分は映るが相手が映らない」という現象が起きます。&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;/li&gt;&#10;&lt;li&gt;Prosody &amp;amp; Jicofo&#10;&lt;ul&gt;&#10;&lt;li&gt;&lt;strong&gt;シグナリング:&lt;/strong&gt; 会議室の作成、ユーザーの入室管理、誰がどの映像を見るかといった「制御信号」を処理します。ユーザーが直接意識することはありません。&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;h3 id="jitsimeet-今の設定ファイルの確認"&gt;JitsiMeet: 今の設定ファイルの確認&#10;&lt;/h3&gt;&lt;p&gt;設定を見返すためにコピーしておく。&lt;/p&gt;&#10;&lt;ul&gt;&#10;&lt;li&gt;&lt;code&gt;/etc/prosody/prosody/conf.d/独自ドメイン.cfg.lua&lt;/code&gt;: 認証とかの設定。ゲストありとかそういうの&#10;&lt;ul&gt;&#10;&lt;li&gt;&lt;code&gt;authentication&lt;/code&gt;で認証方式を確認する。今回は &lt;code&gt;internal_hashed&lt;/code&gt;だった。&lt;/li&gt;&#10;&lt;li&gt;VirtualHostに &lt;code&gt;geust.ドメイン&lt;/code&gt;がある。ここでauthenticationがanonymousになっている。&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;/li&gt;&#10;&lt;li&gt;&lt;code&gt;/var/lib/prosody/ドメイン/accounts/&lt;/code&gt;: 作成したアカウントのdatファイルがある。.がURLエンコードの%2eになっている。&lt;/li&gt;&#10;&lt;li&gt;&lt;code&gt;/etc/jitsi/meet/ドメイン-config.js&lt;/code&gt;: 主催者はパスワード必須でOKしたらみんな入れる、みたいな設定&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;h3 id="jitsi-meetの停止"&gt;Jitsi Meetの停止&#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 systemctl stop nginx jitsi-videobridge2 jicofo prosody&#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 ss -tulpn &lt;span class="p"&gt;|&lt;/span&gt; grep -E &lt;span class="s1"&gt;&amp;#39;:80|:443&amp;#39;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h3 id="caddyのインストール"&gt;Caddyのインストール&#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 apt install -y debian-keyring debian-archive-keyring apt-transport-https curl&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;curl -1sLf &lt;span class="s1"&gt;&amp;#39;https://dl.cloudsmith.io/public/caddy/stable/gpg.key&amp;#39;&lt;/span&gt; &lt;span class="p"&gt;|&lt;/span&gt; sudo gpg --dearmor -o /usr/share/keyrings/caddy-stable-archive-keyring.gpg&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;curl -1sLf &lt;span class="s1"&gt;&amp;#39;https://dl.cloudsmith.io/public/caddy/stable/debian.deb.txt&amp;#39;&lt;/span&gt; &lt;span class="p"&gt;|&lt;/span&gt; sudo tee /etc/apt/sources.list.d/caddy-stable.list&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;chmod o+r /usr/share/keyrings/caddy-stable-archive-keyring.gpg&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;chmod o+r /etc/apt/sources.list.d/caddy-stable.list&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;sudo apt update&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;sudo apt install caddy&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;その後の動作確認は以前の記事を参照。&lt;/p&gt;&#10;&lt;h3 id="caddyfileの作成"&gt;Caddyfileの作成&#10;&lt;/h3&gt;&lt;p&gt;&lt;code&gt;/etc/caddy/Caddyfile&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="o"&gt;{&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="c1"&gt;# 後のステップで立てるDocker版Jitsiへ転送&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; reverse_proxy localhost:8000&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&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;/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 reload caddy&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h3 id="jitsiパッケージの削除"&gt;Jitsiパッケージの削除&#10;&lt;/h3&gt;&lt;p&gt;もう後戻りできない。&lt;/p&gt;&#10;&lt;p&gt;「&lt;a class="link" href="https://jitsi.github.io/handbook/docs/devops-guide/devops-guide-quickstart/#__docusaurus_skipToContent_fallback" target="_blank" rel="noopener"&#10; &gt;Self-Hosting Guide - Debian/Ubuntu server | Jitsi Meet&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;sudo apt purge jigasi jitsi-meet jitsi-meet-web-config jitsi-meet-prosody jitsi-meet-turnserver jitsi-meet-web jicofo jitsi-videobridge2&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;sudo apt autoremove&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;これの削除だが、後になってnginxやapacheなどがゾンビのように蘇ってきてCaddyと443を奪い合うなどあった。僕の手順にミスがあったのか……複数回実行してきっちり削除できていることを確認したほうがいいかも。ってか最初AIにきいたんだけど普通に嘘コマンド教えられたので、まぁこのへんの作業はやっぱりちゃんとドキュメントあたらんとどうにもならんね。&lt;/p&gt;&#10;&lt;p&gt;この状態でポートが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;sudo ss -tulpn &lt;span class="p"&gt;|&lt;/span&gt; grep -E &lt;span class="s1"&gt;&amp;#39;:80|:443&amp;#39;&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;udp UNCONN &lt;span class="m"&gt;0&lt;/span&gt; &lt;span class="m"&gt;0&lt;/span&gt; *:443 *:* users:&lt;span class="o"&gt;((&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;caddy&amp;#34;&lt;/span&gt;,pid&lt;span class="o"&gt;=&lt;/span&gt;91842,fd&lt;span class="o"&gt;=&lt;/span&gt;10&lt;span class="o"&gt;))&lt;/span&gt; &#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;tcp LISTEN &lt;span class="m"&gt;0&lt;/span&gt; &lt;span class="m"&gt;4096&lt;/span&gt; *:80 *:* users:&lt;span class="o"&gt;((&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;caddy&amp;#34;&lt;/span&gt;,pid&lt;span class="o"&gt;=&lt;/span&gt;91842,fd&lt;span class="o"&gt;=&lt;/span&gt;11&lt;span class="o"&gt;))&lt;/span&gt; &#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;tcp LISTEN &lt;span class="m"&gt;0&lt;/span&gt; &lt;span class="m"&gt;4096&lt;/span&gt; *:443 *:* users:&lt;span class="o"&gt;((&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;caddy&amp;#34;&lt;/span&gt;,pid&lt;span class="o"&gt;=&lt;/span&gt;91842,fd&lt;span class="o"&gt;=&lt;/span&gt;4&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;/p&gt;&#10;&lt;p&gt;ちなみにこの時点で1.4-1.5GBくらい使っていたRAMが1.27GBくらいに。もうちょっと減るかと思ったけど……。&lt;/p&gt;&#10;&lt;h3 id="docker版jitsiのインストール"&gt;Docker版Jitsiのインストール&#10;&lt;/h3&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# 作業ディレクトリ（任意）に移動&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&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;git clone https://github.com/jitsi/docker-jitsi-meet&#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; docker-jitsi-meet&#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;cp env.example .env&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;&lt;code&gt;.env&lt;/code&gt;を編集しよう。編集ポイント&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# ドメイン名&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nv"&gt;PUBLIC_URL&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;https://meet.wobias.com&#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;# Caddyから受けるためのポート（ホスト側の80/443はCaddyが使っているため、ずらす）&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;HTTP_PORT&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="m"&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="nv"&gt;HTTPS_PORT&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="m"&gt;8443&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;# 証明書はCaddyが管理するので、Jitsi内蔵のLet&amp;#39;s Encryptはオフ&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;ENABLE_LETSENCRYPT&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="m"&gt;0&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;ENABLE_AUTH&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="m"&gt;1&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nv"&gt;AUTH_TYPE&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;internal&#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;# ゲスト（URLのみ）を許可&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;ENABLE_GUESTS&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="m"&gt;1&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;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;# 例: 1.2.3.4 の部分を実際のVPSのIPに書き換える&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;JVB_ADVERTISE_IPS&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;あなたのVPSのグローバルIP&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;以下でコンポーネント間の通信パスワードが &lt;code&gt;.env&lt;/code&gt; にいくらしい。&lt;/p&gt;&#10;&lt;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;./gen-passwords.sh&#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 -d&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;ブラウザで &lt;code&gt;https://ドメイン名&lt;/code&gt;でJitsi MeetのUIが開けたら万歳。&lt;/p&gt;&#10;&lt;h3 id="アカウントの追加"&gt;アカウントの追加&#10;&lt;/h3&gt;&lt;p&gt;なんかドメインはどうあれ、内部的には meet.jitsi らしい。&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; prosody prosodyctl --config /config/prosody.cfg.lua register ユーザー名 meet.jitsi パスワード&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id="動作確認"&gt;動作確認&#10;&lt;/h2&gt;&lt;p&gt;あとはみんなで入ったりなんだりしてOKだったらOK。&lt;code&gt;sudo reboot&lt;/code&gt;も試した方がいいと思う。&lt;/p&gt;&#10;&lt;h2 id="参考記事"&gt;参考記事&#10;&lt;/h2&gt;&lt;ul&gt;&#10;&lt;li&gt;&lt;a class="link" href="https://inaba-serverdesign.jp/blog/20250904/install-jitsi-meet-on-docker.html" target="_blank" rel="noopener"&#10; &gt;Docker版Jitsi Meetのインストール手順 | 稲葉サーバーデザイン&lt;/a&gt;&lt;/li&gt;&#10;&lt;/ul&gt;&#10;</description></item><item><title>証明書発行 + リバースプロキシ Caddy を試す curl https://localhost とかいう哲学</title><link>https://hack-le.com/caddy-reverse-proxy/</link><pubDate>Tue, 17 Feb 2026 00:00:00 +0900</pubDate><guid>https://hack-le.com/caddy-reverse-proxy/</guid><description>&lt;p&gt;そろそろ脱Cloudflare Tunnel計画を実行するかと重い腰をあげ、&lt;strong&gt;証明書発行 + リバースプロキシという顧客が本当に必要だったものみたいなセットを提供してくれるCaddy&lt;/strong&gt;を試すことにした。&lt;/p&gt;&#10;&lt;p&gt;ConoHa VPSのまっさらな環境から立ち上げる。&lt;/p&gt;&#10;&lt;h2 id="構築手順"&gt;構築手順&#10;&lt;/h2&gt;&lt;ul&gt;&#10;&lt;li&gt;1GB, 2コアの時間課金&lt;/li&gt;&#10;&lt;li&gt;Ubuntu 24.04.3アプデ&lt;/li&gt;&#10;&lt;li&gt;セキュリティグループで&lt;code&gt;IPv4v6-SSH&lt;/code&gt;と&lt;code&gt;IPv4v6-Web&lt;/code&gt;を追加。&#10;&lt;ul&gt;&#10;&lt;li&gt;rootかつSSH鍵認証だけど、すぐ作ってすぐ壊すのでとりあえずヨシ&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&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;sudo apt update&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;sudo apt upgrade&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;sudo apt install emacs &lt;span class="c1"&gt;# 呪い&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;公式のインストールはネイティブとコンテナがある。やることを考えるとコンテナ使うとややこしいかなぁと思ったので、Ubuntuパッケージをそのまま使う。&lt;/p&gt;&#10;&lt;p&gt;&lt;a class="link" href="https://caddyserver.com/docs/install#debian-ubuntu-raspbian" target="_blank" rel="noopener"&#10; &gt;Install — Caddy Documentation&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;sudo apt install -y debian-keyring debian-archive-keyring apt-transport-https curl&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;curl -1sLf &lt;span class="s1"&gt;&amp;#39;https://dl.cloudsmith.io/public/caddy/stable/gpg.key&amp;#39;&lt;/span&gt; &lt;span class="p"&gt;|&lt;/span&gt; sudo gpg --dearmor -o /usr/share/keyrings/caddy-stable-archive-keyring.gpg&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;curl -1sLf &lt;span class="s1"&gt;&amp;#39;https://dl.cloudsmith.io/public/caddy/stable/debian.deb.txt&amp;#39;&lt;/span&gt; &lt;span class="p"&gt;|&lt;/span&gt; sudo tee /etc/apt/sources.list.d/caddy-stable.list&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;chmod o+r /usr/share/keyrings/caddy-stable-archive-keyring.gpg&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;chmod o+r /etc/apt/sources.list.d/caddy-stable.list&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;sudo apt update&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;sudo apt install caddy&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;そのまんまsystemdにサービス登録されるので、動作確認。&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;curl localhost:2019/config&#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-html" data-lang="html"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nt"&gt;a&lt;/span&gt; &lt;span class="na"&gt;href&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;/config/&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;Moved Permanently&lt;span class="p"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="nt"&gt;a&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;.&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;デフォルトで2019番つかうらしい。以下で停止。&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 stop &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;caddy start &lt;span class="c1"&gt;# 再開. bgで起動する。テスト用&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;ここで、systemd使ってるのに&lt;code&gt;caddy run&lt;/code&gt;とかすると二重起動しておかしくなるっぽい。&lt;/p&gt;&#10;&lt;h3 id="チュートリアル"&gt;チュートリアル&#10;&lt;/h3&gt;&lt;p&gt;いけたら「&lt;a class="link" href="https://caddyserver.com/docs/getting-started" target="_blank" rel="noopener"&#10; &gt;Getting Started — Caddy Documentation&lt;/a&gt;」でざっと概念を学ぶ。以下復習用（by Gemini）。というかもしかするとこのAIまとめをざっと読んでからGetting Started読んだほうがわかりやすいか。&lt;/p&gt;&#10;&lt;h4 id="1-caddyの本質すべてはapiである"&gt;1. Caddyの本質：すべてはAPIである&#10;&lt;/h4&gt;&lt;p&gt;Caddyの最も重要な概念は、「&lt;strong&gt;設定ファイルはAPIを叩くための手段に過ぎない&lt;/strong&gt;」という点です。&lt;/p&gt;&#10;&lt;ul&gt;&#10;&lt;li&gt;&lt;strong&gt;Admin API:&lt;/strong&gt; デフォルトで &lt;code&gt;localhost:2019&lt;/code&gt; で待機しています。&lt;/li&gt;&#10;&lt;li&gt;&lt;strong&gt;Under the hood:&lt;/strong&gt; &lt;code&gt;caddy run&lt;/code&gt; で設定ファイルを読み込むとき、内部的にはその内容をAPI経由で自分自身に &lt;code&gt;POST&lt;/code&gt; しています。&lt;/li&gt;&#10;&lt;li&gt;&lt;strong&gt;ゼロダウンタイム:&lt;/strong&gt; API経由で設定をロードするため、サーバーを再起動（Stop/Start）することなく設定を瞬時に切り替えられます。&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;hr&gt;&#10;&lt;h4 id="2-json-vs-caddyfile使い分けの基準"&gt;2. JSON vs Caddyfile：使い分けの基準&#10;&lt;/h4&gt;&lt;p&gt;Caddyには2つの顔があります。&lt;/p&gt;&#10;&lt;table&gt;&#10;&#9;&lt;thead&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;th&gt;&lt;strong&gt;特徴&lt;/strong&gt;&lt;/th&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;th&gt;&lt;strong&gt;JSON (Native)&lt;/strong&gt;&lt;/th&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;th&gt;&lt;strong&gt;Caddyfile (Adapter)&lt;/strong&gt;&lt;/th&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&lt;/thead&gt;&#10;&#9;&lt;tbody&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;&lt;strong&gt;役割&lt;/strong&gt;&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;フル機能。&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;人間が読み書きするための「皮」。&lt;/td&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;&lt;strong&gt;生成&lt;/strong&gt;&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;プログラムやスクリプトから生成しやすい。&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;手動での管理に最適。&lt;/td&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;&lt;strong&gt;変換&lt;/strong&gt;&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;そのまま実行。&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;&lt;code&gt;caddy adapt&lt;/code&gt; でJSONに変換されてから実行。&lt;/td&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;&lt;strong&gt;柔軟性&lt;/strong&gt;&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;全機能にアクセス可能。&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;一部の高度な設定は書けないことがある。&lt;/td&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&lt;/tbody&gt;&#10;&lt;/table&gt;&#10;&#10; &lt;blockquote&gt;&#10; &lt;p&gt;&lt;strong&gt;Tip:&lt;/strong&gt; 複雑なことをしたくなったら &lt;code&gt;caddy adapt --config Caddyfile --pretty&lt;/code&gt; を実行して、自分のCaddyfileがどんなJSONに化けているか確認するのが上達の近道です。&lt;/p&gt;&#10;&#10; &lt;/blockquote&gt;&#10;&lt;h4 id="3-実行コマンドの使い分け"&gt;3. 実行コマンドの使い分け&#10;&lt;/h4&gt;&lt;p&gt;コマンド一つで挙動が変わるため、用途に合わせて使い分けます。&lt;/p&gt;&#10;&lt;ul&gt;&#10;&lt;li&gt;&lt;strong&gt;&lt;code&gt;caddy run&lt;/code&gt;&lt;/strong&gt; :&lt;/li&gt;&#10;&lt;li&gt;フォアグラウンドで実行（画面がロックされる）。&lt;/li&gt;&#10;&lt;li&gt;&lt;strong&gt;本番環境（Systemdなど）で推奨。&lt;/strong&gt; ログが追いやすく、プロセスの生存確認が容易なため。&lt;/li&gt;&#10;&lt;li&gt;&lt;strong&gt;&lt;code&gt;caddy start&lt;/code&gt;&lt;/strong&gt; :&lt;/li&gt;&#10;&lt;li&gt;バックグラウンドで実行。&lt;/li&gt;&#10;&lt;li&gt;ローカルでのちょっとしたテストに便利。止める時は &lt;code&gt;caddy stop&lt;/code&gt; が必要。&lt;/li&gt;&#10;&lt;li&gt;&lt;strong&gt;&lt;code&gt;caddy reload&lt;/code&gt;&lt;/strong&gt; :&lt;/li&gt;&#10;&lt;li&gt;Caddyfileを書き換えた後、ダウンタイムなしで設定を反映させる。&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;h4 id="4-ワークフローの選択apiかcliか"&gt;4. ワークフローの選択（APIかCLIか）&#10;&lt;/h4&gt;&lt;p&gt;チュートリアルでは両方紹介されていますが、混乱を避けるためどちらかに寄せるのが一般的です。&lt;/p&gt;&#10;&lt;ul&gt;&#10;&lt;li&gt;&lt;strong&gt;Caddyfile + CLI:&lt;/strong&gt; * 一般的なWebサーバーとしての運用。設定ファイルをGitで管理し、&lt;code&gt;caddy reload&lt;/code&gt; するスタイル。&lt;/li&gt;&#10;&lt;li&gt;&lt;strong&gt;JSON + API:&lt;/strong&gt; * SaaSの基盤など、動的にサイトやドメインを追加・削除したい場合。外部プログラムからHTTPリクエストで設定を流し込むスタイル。&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;h4 id="5-重要なエンドポイント"&gt;5. 重要なエンドポイント&#10;&lt;/h4&gt;&lt;p&gt;APIを直接触る際に覚えておくと便利なパスです。&lt;/p&gt;&#10;&lt;ul&gt;&#10;&lt;li&gt;&lt;code&gt;GET /config/&lt;/code&gt;: 現在適用されている設定をJSONで確認。&lt;/li&gt;&#10;&lt;li&gt;&lt;code&gt;POST /load&lt;/code&gt;: 新しい設定（JSON）を流し込む。&lt;/li&gt;&#10;&lt;li&gt;&lt;code&gt;POST /stop&lt;/code&gt;: サーバーを停止させる。&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;p&gt;これらはすべて &lt;code&gt;localhost:2019&lt;/code&gt; を介して行われます。&lt;/p&gt;&#10;&lt;h3 id="ローカルhttpsを試す"&gt;ローカルHTTPSを試す&#10;&lt;/h3&gt;&lt;p&gt;試すと言うかデフォルトでlocalhostだと自動で自己証明書でHTTPS使えるようだ。すごい。楽。「&lt;a class="link" href="https://caddyserver.com/docs/quick-starts/caddyfile" target="_blank" rel="noopener"&#10; &gt;Caddyfile Quick-start — Caddy Documentation&lt;/a&gt;」より&lt;code&gt;Caddyfile&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;localhost&#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;respond &lt;span class="s2"&gt;&amp;#34;Hello, world!&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;code&gt;caddy stop&lt;/code&gt;して&lt;code&gt;caddy start&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;curl https://localhost&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;&lt;code&gt;https://localhost&lt;/code&gt;わろた。この無意味さ完全に現代って感じ。&lt;/p&gt;&#10;&lt;p&gt;「俺と俺の会話は暗号化されているので安全です」&lt;br&gt;&#10;「なるほど、その暗号化は誰がやるのか？」&lt;br&gt;&#10;「俺です」&lt;br&gt;&#10;「なるほど、それが正しいと誰が証明するのか？」&lt;br&gt;&#10;「俺です」&lt;/p&gt;&#10;&lt;p&gt;このイノベーションの虚無さはおいといて、実務的には普通に助かる。&lt;/p&gt;&#10;&lt;p&gt;なおテストサーバなのでroot権限でやっているが、ウェルノウンポートなので、普通ユーザなら &lt;code&gt;sudo -E caddy start&lt;/code&gt;するか&lt;code&gt;localhost:2080&lt;/code&gt;とか1024以上のポートにしようね、とのことだった。&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;localhost &lt;span class="o"&gt;{&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#9;respond &lt;span class="s2"&gt;&amp;#34;Hello, world!&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="o"&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;localhost:2016 &lt;span class="o"&gt;{&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#9;respond &lt;span class="s2"&gt;&amp;#34;Goodbye, world!&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="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;/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 fmt --overwrite&#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;h2 id="独自ドメインで検証"&gt;独自ドメインで検証&#10;&lt;/h2&gt;&lt;h3 id="dnsの設定"&gt;DNSの設定&#10;&lt;/h3&gt;&lt;p&gt;ここまでのとおりなのだが、まずDNSのほうでAレコードをVPSに向ける。AAAAレコードも設定すれば証明書やってくれる模様だが、とりあえずIPv4でやる。&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;dig 独自ドメイン&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;dig 独自ドメイン @8.8.8.8&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;8.8.8.8はGoogle Public DNS。両方でIPアドレスがきちんと向いていれば、まぁ大丈夫だろう。&lt;/p&gt;&#10;&lt;h3 id="セキュリティグループ"&gt;セキュリティグループ&#10;&lt;/h3&gt;&lt;p&gt;ConoHaの設定になるわけだが、セキュリティグループでWebを開けていることを確認する。&lt;/p&gt;&#10;&lt;h3 id="ファイアウォール"&gt;ファイアウォール&#10;&lt;/h3&gt;&lt;p&gt;80/443を開ける。Let&amp;rsquo;s Encryptのチャレンジで80必須。&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 80/tcp&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;sudo ufw allow 443/tcp&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# 確認&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;sudo ufw status&#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;Status: active&#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;To Action From&#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;OpenSSH ALLOW Anywhere &#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;80/tcp ALLOW Anywhere &#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;443/tcp ALLOW Anywhere &#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;OpenSSH &lt;span class="o"&gt;(&lt;/span&gt;v6&lt;span class="o"&gt;)&lt;/span&gt; ALLOW Anywhere &lt;span class="o"&gt;(&lt;/span&gt;v6&lt;span class="o"&gt;)&lt;/span&gt; &#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;80/tcp &lt;span class="o"&gt;(&lt;/span&gt;v6&lt;span class="o"&gt;)&lt;/span&gt; ALLOW Anywhere &lt;span class="o"&gt;(&lt;/span&gt;v6&lt;span class="o"&gt;)&lt;/span&gt; &#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;443/tcp &lt;span class="o"&gt;(&lt;/span&gt;v6&lt;span class="o"&gt;)&lt;/span&gt; ALLOW Anywhere &lt;span class="o"&gt;(&lt;/span&gt;v6&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;h3 id="caddyfileの編集"&gt;Caddyfileの編集&#10;&lt;/h3&gt;&lt;p&gt;&lt;code&gt;Caddyfile&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;独自ドメイン&#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;respond &lt;span class="s2"&gt;&amp;#34;hello!&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;code&gt;caddy reload&lt;/code&gt;するか、&lt;code&gt;caddy stop&lt;/code&gt;と&lt;code&gt;caddy start&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;curl https://独自ドメイン&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;helloされたらとりあえずOK。&lt;/p&gt;&#10;&lt;h2 id="設定ファイル"&gt;設定ファイル&#10;&lt;/h2&gt;&lt;p&gt;もうちょっとちゃんとやる。とりあえずテスト用のHTMLを作成する。&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 mkdir -p /var/www/html&#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;lt;h1&amp;gt;Hello from 独自ドメイン (HTTPS)&amp;lt;/h1&amp;gt;&amp;#34;&lt;/span&gt; &lt;span class="p"&gt;|&lt;/span&gt; sudo tee /var/www/html/index.html&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;caddyをネイティブでインストールしたら、systemdで有効化されているわけだが、Caddyfileのパスは &lt;code&gt;/etc/caddy/Caddyfile&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="o"&gt;{&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; root * /var/www/html&#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; file_server&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&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;Aiがテスト用の記述をしてくれました。&lt;/p&gt;&#10;&lt;p&gt;&lt;code&gt;systemctl restart caddy&lt;/code&gt;するなり&lt;code&gt;reboot&lt;/code&gt;するなりして、設定した独自ドメインにブラウザでアクセスして、表示されることを確認する。&lt;/p&gt;&#10;&lt;h2 id="起きたトラブル"&gt;起きたトラブル&#10;&lt;/h2&gt;&lt;h3 id="接続するたびに結果が変わる---二重起動"&gt;接続するたびに結果が変わる -&amp;gt; 二重起動&#10;&lt;/h3&gt;&lt;p&gt;&lt;code&gt;lsof -i :ポート&lt;/code&gt;で確認したら競合していた。systemdで動いているのと &lt;code&gt;caddy run&lt;/code&gt;で動いているのが別々であったと思われる。rebootしたらなおった。&lt;/p&gt;&#10;&lt;h3 id="ブラウザこのサイトへの接続は保護されていません"&gt;ブラウザ「このサイトへの接続は保護されていません」&#10;&lt;/h3&gt;&lt;p&gt;証明書ミスをやらかすと、ブラウザにキャッシュが残って言われる。シークレットウィンドウ開いて確認したらOK。&lt;/p&gt;&#10;&lt;h2 id="所感"&gt;所感&#10;&lt;/h2&gt;&lt;p&gt;とても楽だった。&lt;code&gt;curl https://localhost&lt;/code&gt;は何か哲学的な感じがした。現代の闇。&lt;/p&gt;&#10;&lt;p&gt;要領はわかったので、是非このブログのあるVPSにも導入して脱Cloudflare Tunnelといきたいところだが、めんどくさいことにJitsi Meetをインストールしており、そちらのWeb UIが80/443ポートを使ってしまっているため、その対処をしたうえで移行しないといけない。ちょっと今日はもういいや。&lt;/p&gt;&#10;&lt;p&gt;まぁ何はともあれ、これとTailscaleを組み合わせることで、VPSと自宅サーバをVPN接続することもできるし、非常にめでたい。&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/tailscale-vps/" 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;TailscaleでVPSと自宅サーバを繋ぐ&lt;/div&gt;&#10; &lt;div class="blog-card-url"&gt;/tailscale-vps/&lt;/div&gt;&#10; &lt;/div&gt;&#10; &lt;div class="blog-card-thumbnail"&gt;&#10; &lt;img src="https://hack-le.com/images/uploads/2026/01/output-10.webp" alt="TailscaleでVPSと自宅サーバを繋ぐ" loading="lazy" /&gt;&#10; &lt;/div&gt;&#10; &lt;/a&gt;&#10;&lt;/div&gt;&#10;&#10;</description></item><item><title>Linux Mint Xfceを入れてからやること</title><link>https://hack-le.com/linux-mint-xfce/</link><pubDate>Thu, 12 Feb 2026 00:00:00 +0900</pubDate><guid>https://hack-le.com/linux-mint-xfce/</guid><description>&lt;p&gt;LinuxでPC再生計画を実行中。とりあえず家が旧式のThinkPadで埋もれつつある。&lt;/p&gt;&#10;&lt;p&gt;Linux Mint Xfceを導入したときの設定メモ。なんか変更あったら随時入れていく。&lt;/p&gt;&#10;&lt;h2 id="環境"&gt;環境&#10;&lt;/h2&gt;&lt;p&gt;試したのは以下。&lt;/p&gt;&#10;&lt;ul&gt;&#10;&lt;li&gt;ThinkPad X250&#10;&lt;ul&gt;&#10;&lt;li&gt;Core i3-5010U&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;/li&gt;&#10;&lt;li&gt;ThinkPad X260&lt;/li&gt;&#10;&lt;li&gt;ThinkPad X270&#10;&lt;ul&gt;&#10;&lt;li&gt;Core i5-7300U&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;/li&gt;&#10;&lt;li&gt;ThinkPad X280&#10;&lt;ul&gt;&#10;&lt;li&gt;Core i3-7020U&lt;/li&gt;&#10;&lt;li&gt;Core i5-8250U&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;/li&gt;&#10;&lt;li&gt;ThinkPad L390&lt;/li&gt;&#10;&lt;li&gt;Dell Latitude 3570&#10;&lt;ul&gt;&#10;&lt;li&gt;Core i3-6100U&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;/li&gt;&#10;&lt;li&gt;Dell Latitude 5290&#10;&lt;ul&gt;&#10;&lt;li&gt;Core i5-8250U&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;/li&gt;&#10;&lt;li&gt;Dell Latitude 5300&#10;&lt;ul&gt;&#10;&lt;li&gt;Core i5-8265U&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;/li&gt;&#10;&lt;li&gt;FUJITSU LIFEBOOK A574/H&#10;&lt;ul&gt;&#10;&lt;li&gt;Core i5-4300M&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;/li&gt;&#10;&lt;li&gt;FUJITSU FMVWD2028&#10;&lt;ul&gt;&#10;&lt;li&gt;Core i5-8265U&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;/li&gt;&#10;&lt;li&gt;TSUKUMO eX.computer Notebook PC N1501K&#10;&lt;ul&gt;&#10;&lt;li&gt;Core i5-6200U&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;p&gt;&lt;strong&gt;2026年には産廃とされるスペックでも、Linux Mint Xfceだと普通に動きます&lt;/strong&gt;。&lt;/p&gt;&#10;&lt;p&gt;常用に影響があるのはむしろTNパネルかIPSパネルかといったところ。慣れればこんなもんかと思うでしょうけれど、IPSなやつと見比べた途端に「我々は虐げられていたのか！」みたいな気分になります。まぁでも慣れるとTNでもそんなもんかねという感じです。&lt;/p&gt;&#10;&lt;h2 id="忘れがちな操作"&gt;忘れがちな操作&#10;&lt;/h2&gt;&lt;h3 id="ワークスペースの移動"&gt;ワークスペースの移動&#10;&lt;/h3&gt;&lt;p&gt;Ctrl + Alt + 矢印&lt;/p&gt;&#10;&lt;h3 id="ターミナルでコピペ"&gt;ターミナルでコピペ&#10;&lt;/h3&gt;&lt;p&gt;Shiftを入れる。Ctrl + Shift + Vで貼り付け。&lt;/p&gt;&#10;&lt;h2 id="設定"&gt;設定&#10;&lt;/h2&gt;&lt;h3 id="マウスとタッチパッド"&gt;マウスとタッチパッド&#10;&lt;/h3&gt;&lt;ul&gt;&#10;&lt;li&gt;スクロールを逆向きにする（好み）&lt;/li&gt;&#10;&lt;li&gt;ポインター速度を調整する&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;h3 id="日本語入力"&gt;日本語入力&#10;&lt;/h3&gt;&lt;p&gt;「設定マネージャー」から「入力方法」→「日本語」を確認する。手順が書いてあるのでそのとおりにやる。&lt;/p&gt;&#10;&lt;p&gt;&lt;img loading="lazy" sizes="(max-width: 767px) calc(100vw - 30px), (max-width: 1023px) 700px, (max-width: 1279px) 950px, 1232px" src="https://hack-le.com/images/uploads/2026/01/a9a86db1ca818d15d9b03330d3b59f46-700x457.png"&gt;&lt;/p&gt;&#10;&lt;p&gt;画面の指示通りにやるだけ。最終的にFcitx + Mozcになる。&lt;/p&gt;&#10;&lt;p&gt;一点、Fcitxの設定画面で、入力メソッドの設定なのだが、「キーボード - 日本語（不明）」の下に「Mozc（日本語）」となっている場合、キーボード - 日本語は削除する。&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/02/66ed61e19091733dd0e4f2711dd01afc-700x411.png"&gt;&lt;/p&gt;&#10;&lt;p&gt;マイナスボタンから消せる。&lt;/p&gt;&#10;&lt;h3 id="ctrlとcaps-lockをスワップする"&gt;CtrlとCaps Lockをスワップする&#10;&lt;/h3&gt;&lt;p&gt;XfceだとGUIでやれる方法が見つからなかったよ。なので以下を参考にさせていだきました。&lt;/p&gt;&#10;&lt;p&gt;&lt;a class="link" href="https://opensource.com/article/18/11/how-swap-ctrl-and-caps-lock-your-keyboard" target="_blank" rel="noopener"&#10; &gt;How to swap Ctrl and Caps Lock keys in Linux | Opensource.com&lt;/a&gt;&lt;/p&gt;&#10;&lt;p&gt;まずテスト。&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-javascript" data-lang="javascript"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="err"&gt;/usr/bin/setxkbmap -option &amp;#34;ctrl:swapcaps&amp;#34;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;こいつを実行して、Caps LockでCtrlになるかを確認する。&lt;/p&gt;&#10;&lt;p&gt;うまくいくことを確認したら、&lt;code&gt;~/.profile&lt;/code&gt;に上記コマンドを追記する。&lt;/p&gt;&#10;&lt;p&gt;再起動して、ログイン後も設定が保持されていることを確認する。&lt;/p&gt;&#10;&lt;h2 id="ハードウェア"&gt;ハードウェア&#10;&lt;/h2&gt;&lt;h3 id="マイクとかスピーカーとか音声周り"&gt;マイクとかスピーカーとか音声周り&#10;&lt;/h3&gt;&lt;p&gt;なんかマイクとか動作しないことがある。音声系のトラブルは下記記事の知識が使えることが多い。&lt;/p&gt;&#10;&lt;div class="blog-card-wrapper"&gt;&#10; &lt;a href="https://hack-le.com/thinkpad-x280-linux-mint-xfce-28-3-vivaldi-mic/" 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;ThinkPad X280 &amp;#43; Linux Mint Xfce 22.3 でマイク入力&lt;/div&gt;&#10; &lt;div class="blog-card-url"&gt;/thinkpad-x280-linux-mint-xfce-28-3-vivaldi-mic/&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/output-2.webp" alt="ThinkPad X280 &amp;#43; Linux Mint Xfce 22.3 でマイク入力" 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/thinkpad-l390-linux-mint-xfce-22-3-hdmi/" 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;ThinkPad L390 &amp;#43; Linux Mint Xfce 22.3 のHDMI接続で音声出力する&lt;/div&gt;&#10; &lt;div class="blog-card-url"&gt;/thinkpad-l390-linux-mint-xfce-22-3-hdmi/&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_49340_1776895434.webp" alt="ThinkPad L390 &amp;#43; Linux Mint Xfce 22.3 のHDMI接続で音声出力する" loading="lazy" /&gt;&#10; &lt;/div&gt;&#10; &lt;/a&gt;&#10;&lt;/div&gt;&#10;&#10;&lt;h3 id="hdmi接続でチラつきの発生"&gt;HDMI接続でチラつきの発生&#10;&lt;/h3&gt;&lt;div class="blog-card-wrapper"&gt;&#10; &lt;a href="https://hack-le.com/linux-pc-hdmi-display-flicker/" 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 PCとHDMI接続したディスプレイでチラつきの対応&lt;/div&gt;&#10; &lt;div class="blog-card-url"&gt;/linux-pc-hdmi-display-flicker/&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_49399_1776334946.webp" alt="Linux PCとHDMI接続したディスプレイでチラつきの対応" 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;h3 id="debを落として入れる"&gt;.debを落として入れる&#10;&lt;/h3&gt;&lt;ul&gt;&#10;&lt;li&gt;Vivaldi&#10;&lt;ul&gt;&#10;&lt;li&gt;パネルの位置を右にする&lt;/li&gt;&#10;&lt;li&gt;検索エンジンはGoogleにする。すまんな&#10;&lt;ul&gt;&#10;&lt;li&gt;DuckDuckGoはうちのサイトを表示しないから…&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;h3 id="端末から入れる"&gt;端末から入れる&#10;&lt;/h3&gt;&lt;ul&gt;&#10;&lt;li&gt;tlp, tlp-rdw&#10;&lt;ul&gt;&#10;&lt;li&gt;サーバ利用なら75-80%で充電するように設定するのがよい（後述）&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;/li&gt;&#10;&lt;li&gt;emacs&#10;&lt;ul&gt;&#10;&lt;li&gt;みんな大好き&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;/li&gt;&#10;&lt;li&gt;wine-installer&#10;&lt;ul&gt;&#10;&lt;li&gt;winetricks&#10;&lt;ul&gt;&#10;&lt;li&gt;winetricks cjkfonts&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;h3 id="ブラウザ拡張"&gt;ブラウザ拡張&#10;&lt;/h3&gt;&lt;ul&gt;&#10;&lt;li&gt;Bitwarden&lt;/li&gt;&#10;&lt;li&gt;FormatLink&lt;/li&gt;&#10;&lt;li&gt;Floccus&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;h2 id="サーバ向け設定"&gt;サーバ向け設定&#10;&lt;/h2&gt;&lt;p&gt;24時間稼働常設サーバにするときの設定。クライアントとして使うならほぼいらない。&lt;/p&gt;&#10;&lt;h3 id="静的ipアドレス"&gt;静的IPアドレス&#10;&lt;/h3&gt;&lt;p&gt;IPアドレスを固定する。ルータ側で固定してもいい。&lt;/p&gt;&#10;&lt;h3 id="充電を80で止める"&gt;充電を80%で止める&#10;&lt;/h3&gt;&lt;p&gt;据え置きサーバー用途ならば、充電を80%までにして少しでも長生きさせたい。&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 update&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;sudo apt install tlp tlp-rdw&#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 nano /etc/tlp.conf&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;以下を探してコメントアウトする。&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# バッテリーの充電開始しきい値（75%以下になったら充電開始）&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nv"&gt;START_CHARGE_THRESH_BAT0&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="m"&gt;75&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;# バッテリーの充電終了しきい値（80%に達したら充電停止）&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;STOP_CHARGE_THRESH_BAT0&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="m"&gt;80&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 tlp start&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;sudo tlp-stat -b&#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;とりあえず設定で「電源管理」からあらゆる設定を「しない」にしつつ、AC接続において管理をGUIでさせない。余計なことばかりしやがって。&lt;/p&gt;&#10;&lt;p&gt;そのうえでCUIでスリープ殺す。&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 mask sleep.target suspend.target hibernate.target hybrid-sleep.target&#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 unmask sleep.target suspend.target hibernate.target hybrid-sleep.target&#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;sudo ufw &lt;span class="nb"&gt;enable&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;55555番を開ける時は以下。&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;55555&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 ufw status numbered&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h3 id="openssh-server"&gt;OpenSSH Server&#10;&lt;/h3&gt;&lt;p&gt;SSHはいるだろう。&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 update&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;sudo apt install openssh-server&#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 start ssh&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;sudo systemctl &lt;span class="nb"&gt;enable&lt;/span&gt; ssh&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;sudo systemctl status ssh&#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 ssh&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;sudo ufw &lt;span class="nb"&gt;enable&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;IPアドレスの確認。&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;ip addr show&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;接続の確認。クライアントPCの公開鍵をサーバPCの &lt;code&gt;~/.ssh/authorized_keys&lt;/code&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;ssh ユーザ名@サーバのIPアドレス&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;一応、SSHの設定について。&lt;/p&gt;&#10;&lt;div class="blog-card-wrapper"&gt;&#10; &lt;a href="https://hack-le.com/20462465-2/" class="blog-card"&gt;&#10; &lt;div class="blog-card-content"&gt;&#10; &lt;div class="blog-card-label"&gt;&#10; &lt;svg xmlns="http://www.w3.org/2000/svg" width="13" height="13" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"&gt;&lt;path d="M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.71"&gt;&lt;/path&gt;&lt;path d="M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71"&gt;&lt;/path&gt;&lt;/svg&gt;&#10; &lt;span&gt;あわせて読みたい&lt;/span&gt;&#10; &lt;/div&gt;&#10; &lt;div class="blog-card-title"&gt;SSHで鍵認証を用いて、パスワードなしでログインする方法&lt;/div&gt;&#10; &lt;div class="blog-card-url"&gt;/20462465-2/&lt;/div&gt;&#10; &lt;/div&gt;&#10; &lt;div class="blog-card-thumbnail"&gt;&#10; &lt;img src="https://hack-le.com/images/uploads/2026/09/eyecatch_2553_1789270747.webp" alt="SSHで鍵認証を用いて、パスワードなしでログインする方法" 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;p&gt;ジャンクを漁って自分でやれる人なら、数千円で環境作れると思います。とはいえ普段遣いを考えるなら、あと1万円追加してIPS + 8GB RAMをおすすめしますけどね。RAMは換装できるモデルなら良いと思います。&lt;/p&gt;&#10;&lt;p&gt;個人的にはEmacsキーバインドを入れたいのですが、どちらかというと他人様に使ってもらえる設定を追求中なので、あまりニッチすぎる設定は後回し。&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-pc-2/" class="blog-card"&gt;&#10; &lt;div class="blog-card-content"&gt;&#10; &lt;div class="blog-card-label"&gt;&#10; &lt;svg xmlns="http://www.w3.org/2000/svg" width="13" height="13" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"&gt;&lt;path d="M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.71"&gt;&lt;/path&gt;&lt;path d="M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71"&gt;&lt;/path&gt;&lt;/svg&gt;&#10; &lt;span&gt;あわせて読みたい&lt;/span&gt;&#10; &lt;/div&gt;&#10; &lt;div class="blog-card-title"&gt;【Linux PC再生計画】中古PCも触ってみるといろいろだ&lt;/div&gt;&#10; &lt;div class="blog-card-url"&gt;/linux-pc-2/&lt;/div&gt;&#10; &lt;/div&gt;&#10; &lt;div class="blog-card-thumbnail"&gt;&#10; &lt;img src="https://hack-le.com/images/uploads/2026/02/output.webp" alt="【Linux PC再生計画】中古PCも触ってみるといろいろだ" loading="lazy" /&gt;&#10; &lt;/div&gt;&#10; &lt;/a&gt;&#10;&lt;/div&gt;&#10;&#10;</description></item><item><title>ThinkPad X260 Core i3-6100 4GB RAM で Linux Mint 22.3 Xfce を動かす</title><link>https://hack-le.com/thinkpad-x260-core-i3-6100-4g/</link><pubDate>Wed, 11 Feb 2026 00:00:00 +0900</pubDate><guid>https://hack-le.com/thinkpad-x260-core-i3-6100-4g/</guid><description>&lt;p&gt;Linux PC量産計画で、今回はけっこう古めの筐体、ThinkPad X260について見ていく。なお試したOSはいつものようにLinux Mint 22.3 Xfce Edition。&lt;/p&gt;&#10;&lt;h2 id="スペック"&gt;スペック&#10;&lt;/h2&gt;&lt;p&gt;X260は2016年1月に発売された、主にSkylake世代（第6世代Core iシリーズ）の時期のやつで、スペックは例によってAI記事「&lt;a class="link" href="https://ai.hack-le.com/category/pc/web%e3%83%96%e3%83%a9%e3%82%a6%e3%82%b6/" target="_blank" rel="noopener"&#10; &gt;ThinkPad X260のスペックを整理&lt;/a&gt;」に詳細をまとめさせた。今回使った筐体のスペックはこれ。&lt;/p&gt;&#10;&lt;ul&gt;&#10;&lt;li&gt;CPU: Core i3-6100U, 2.3GHz, 2コア4スレッド&lt;/li&gt;&#10;&lt;li&gt;RAM: DDR4 4GB&lt;/li&gt;&#10;&lt;li&gt;SSD: SATA 128GB&lt;/li&gt;&#10;&lt;li&gt;LCD: TN, HD&lt;/li&gt;&#10;&lt;li&gt;Webカメラあり&lt;/li&gt;&#10;&lt;li&gt;バッテリー: 死亡&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;p&gt;3000円で買った安定のクソスペ。SSDは抜かれてたので自分で入れた。バッテリー死んでて辛い。液晶は普通。&lt;/p&gt;&#10;&lt;p&gt;インタフェースはけっこう充実している。&lt;/p&gt;&#10;&lt;ul&gt;&#10;&lt;li&gt;USB 3.0 x 3（うち1つはPowered USB）&lt;/li&gt;&#10;&lt;li&gt;&lt;strong&gt;HDMI&lt;/strong&gt;&lt;/li&gt;&#10;&lt;li&gt;&lt;strong&gt;Mini DisplayPort&lt;/strong&gt;&lt;/li&gt;&#10;&lt;li&gt;RJ-45（有線LAN）&lt;/li&gt;&#10;&lt;li&gt;SDカードリーダー（4-in-1）&lt;/li&gt;&#10;&lt;li&gt;マイク/ヘッドホン・コンボ・ジャック&lt;/li&gt;&#10;&lt;li&gt;ドッキングコネクター（底面）&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;p&gt;RJ-45、HDMI、USB 3.0と欲しいところが揃っている。Mini DisplayPort懐かしい。SDカード入るのは地味に良いかもね。&lt;/p&gt;&#10;&lt;h2 id="使い勝手"&gt;使い勝手&#10;&lt;/h2&gt;&lt;p&gt;とりあえずこの記事はX260で書いている。使えるといえば使えるが、しんどいといえばしんどいような感じだ。&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/02/0f2c38a58401a63c74b8b0683d12e212.png"&gt;&lt;/p&gt;&#10;&lt;p&gt;メモリはスワップがあるけれど、それよりもCPUの負荷が常にまぁまぁある。普通にネットをしてるだけでこれなので、動画とか見るとしんどいかもしれない。&lt;/p&gt;&#10;&lt;p&gt;と思ったが、一応YouTubeを流しながら編集する、程度は問題なくできる。&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/02/dfcdd90c3db3e1091dd5246f8272701b.png"&gt;&lt;/p&gt;&#10;&lt;p&gt;CPU、メモリともにちょっと負荷あがるね。まぁでも特にもたつくような感じはないかな。ブラウザでタブめっちゃ開けば開いただけメモリの使用量は増えていく。&lt;/p&gt;&#10;&lt;p&gt;負荷云々よりも、液晶がTNなのが厳しいのはしゃーない。一番いい感じで見える角度があるので、それを探し当ててそこで見るのがよい。あまり便が良い感じではないが、姿勢は良くなるかもしれない。一応世の中にはThinkPadで換装できるFHDのLCDなどアリエクなどに売っていたりするが、普通にジャンク本体より高いので使う気になれない。&lt;/p&gt;&#10;&lt;p&gt;バッテリーが死んでるのはこのジャンク特有の問題ではあるが、やはりずっと繋げっぱなしの制約があるのは悲しいところだ。少し残っているだけでも、取り回しの便は全然違うし、なによりサーバ用途ではUPS代わりになっていいのだけどね…。&lt;/p&gt;&#10;&lt;p&gt;キーボードの打鍵感は、これは好みになるが、個人的にはかなり良いと思った。ペチペチ。赤ポチは好きな人は好きなんだろうが僕は慣れない。ちゃんと動いて入る。タッチパッドも問題なく動く。まぁ僕はトラックボールマウスを外付けで使ってしまうわけだが…。地味にこのへんの外部入力が問題ないのは良いよね。&lt;strong&gt;Webカメラもちゃんと動いてました&lt;/strong&gt;。&lt;/p&gt;&#10;&lt;p&gt;全体的には、これでも十分という人はそれなりにいる気もした。やはりディスプレイが一番のネックかなと思うんだけれど、据え付けで使う分には外部出力という手もあるので、案外困らないかもしれない。&lt;/p&gt;&#10;&lt;h2 id="サーバとしては"&gt;サーバとしては&#10;&lt;/h2&gt;&lt;p&gt;サーバの検証はなにをするかまだちょっと決められていない。ほとんどの用途には足ると思うけれど、Immichのような重量級は推奨要件を満たせていないので微妙だろうなぁ。インストールはできるし、快適さを求めなければまぁ動くとは思う。&lt;/p&gt;&#10;&lt;p&gt;とりあえずWordPressを入れて試したが、当然ながらこれは問題なく動く。そりゃ２GB RAMのVPSでも3台動かせているのだからそりゃそうだな。&lt;/p&gt;&#10;&lt;p&gt;少し重ためなものとして、Growiを入れてみる。GrowiはMongoDBとElasticsearchがあるので、そこそこヘビーだ。&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/02/fe0886d58832796dc1127ed287858e76.png"&gt;&lt;/p&gt;&#10;&lt;p&gt;メモリの使用量がさすがに増えるけど、3GB未満。&lt;/p&gt;&#10;&lt;p&gt;ま、VPSだと思ったら4GB RAMなんて豪華だし、ネイティブで完全にリソースを使えるのだから、そりゃ強いよね。ちょっと何かあったらこうして画面を確認することができるんだしさ。&lt;/p&gt;&#10;&lt;p&gt;Cloudflare Tunnelで手軽に外部公開もできるし、通信帯域や可用性を気にしないなら、これで十分だなぁ。VPS1年契約するよりいいかもしれないね。&lt;/p&gt;&#10;&lt;p&gt;ただこのPCについていえば、バッテリーが死んでるのは残念だ。バッテリーが少しでも生きていれば、停電などでも生き延びることができるので、可用性に大いに寄与するはずだ。まぁバッテリーも買えば互換品もあるんだけどさ。高いしなぁ。&lt;/p&gt;&#10;&lt;p&gt;まぁバッテリー死んでるなら爆発しなくていいんじゃないの、というポジティブに考えられなくもない。&lt;/p&gt;&#10;&lt;h2 id="所感"&gt;所感&#10;&lt;/h2&gt;&lt;p&gt;GUI含めてちゃんと動いてくれるが、Webブラウザでなんでもやろうとするとつらい場面は出てくるはず。&lt;/p&gt;&#10;&lt;p&gt;個人的にはこのスペックならやはりサーバ用途がいいなと思う。たいていの用途には十分さ。&lt;/p&gt;&#10;</description></item><item><title>DropboxでアカウントBANされた人がいるらしい</title><link>https://hack-le.com/dropbox-ban/</link><pubDate>Fri, 30 Jan 2026 00:00:00 +0900</pubDate><guid>https://hack-le.com/dropbox-ban/</guid><description>&lt;p&gt;オンラインストレージ・サービスで垢BANされた人の話は定期的に流れてきますが、今回はDropboxのようです。&lt;/p&gt;&#10;&lt;p&gt;&lt;a class="link" href="https://togetter.com/li/2657098" target="_blank" rel="noopener"&#10; &gt;Dropboxのアカウントが規約違反により突然BANされて博士課程の研究データの一部や趣味の写真などが取り出せなくなった&amp;hellip;問い合わせメールも全て無視されている - Togetter&lt;/a&gt;&lt;/p&gt;&#10;&lt;p&gt;垢BANによって、博士課程のデータや趣味データの一部が取り出せない自体になっているようです。問い合わせは無視されているとこのこと。これはたいへん。&lt;/p&gt;&#10;&lt;h2 id="dropboxお前もか"&gt;Dropbox、お前もか&#10;&lt;/h2&gt;&lt;p&gt;いつものことではありますが、第一印象としては「Dropboxか」ではありました。垢BANというのは極めて重大なペナルティで（実行する当事者にその自覚がないようですが）、ビッグテックが片手間でやっているGoogle DriveやOneDriveではちょくちょくきくものの、オンライン・ストレージがコアビジネスで、それ一本でやってきたDropboxではあまり聞いたことがなかったからです。&lt;/p&gt;&#10;&lt;p&gt;まぁまったく初めて聞いたということはなく、以前に調べたときも、Dropboxで垢BANされた人の話は見つけることができました。その人もデータが取りだせなくて困っていました。結局解決されたのかどうか、記憶になく、保存しておけばよかったと思います。記事は一期一会（なのでこうして記事にしている）。&lt;/p&gt;&#10;&lt;h2 id="一発banが企業の合理"&gt;一発BANが企業の合理&#10;&lt;/h2&gt;&lt;p&gt;なぜこうもカジュアルにデータを凍結するのか、ユーザからは不可解ですが、企業側からすると、これがもっともコストが低いと判断されているのでしょう。&lt;/p&gt;&#10;&lt;p&gt;いちいち警告すれば、本当に悪意あるユーザが相手だったときに手の内を明かすことになります。また、担当者をつけるのはコストです。&lt;strong&gt;アルゴリズムで判断したら悪即斬、これがもっとも合理的&lt;/strong&gt;、ということですね。ユーザからすれば横暴かつ不合理でしかありませんが。&lt;/p&gt;&#10;&lt;p&gt;スレッド内にもあったとおり、本来であれば日本国憲法に規定された財産権(第29条)の侵害にあたると考えられます。しかし相手は米国の企業であり、デジタールデータであり、また利用規約に同意したという建前があります。&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;個人的には「クラウドを使う金でNASを買え」と言いたい&lt;/strong&gt;ところですが、それだとあんまりなので、「&lt;strong&gt;利用を最小限にとどめる&lt;/strong&gt;」くらいにしておきましょうか。具体的には、以下の徹底です。&lt;/p&gt;&#10;&lt;ul&gt;&#10;&lt;li&gt;インターネットを介した同期が必要なファイルのみ&lt;/li&gt;&#10;&lt;li&gt;ローカルのバックアップとして位置付ける&lt;/li&gt;&#10;&lt;li&gt;必要なデバイスにのみインストールする&lt;/li&gt;&#10;&lt;/ul&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;h2 id="データの保存は基本に忠実に"&gt;データの保存は基本に忠実に&#10;&lt;/h2&gt;&lt;p&gt;それではデータのバックアップはどうしたらいいのかという問題があるわけですが、&lt;strong&gt;大事なデータは3-2-1バックアップを実践しましょう&lt;/strong&gt;。&lt;/p&gt;&#10;&lt;p&gt;&lt;strong&gt;3-2-1バックアップは、一言で言えば3つのコピーを2つ以上の媒体で、1つは遠隔地に&lt;/strong&gt;、です。元データはSSD、バックアップはNASまたは外付けHD、そして1つは遠隔地に持っていく、という形になります。遠隔地について、クラウドサービスを使ってもいいですが、こういう事件があるのですから、私としては実家など信頼できるところに、暗号化のうえで置かせてもらう、のが一番良いのではないかと思います。&lt;/p&gt;&#10;&lt;p&gt;これは前時代的に思えるかもしれませんが、謎の基準でアカウントBANされる現時代よりはいいでしょう？未来時代はきっともっとひどいですよ。&lt;/p&gt;&#10;&lt;p&gt;重要なことは基本です。基本は変わりません。ITの世界は進化が早いなどと言われますが、あんなもんはマーケティングのポジショントークですよ。&lt;/p&gt;&#10;&lt;h2 id="ルールの源を考える我々は力を行使できない"&gt;ルールの源を考える：我々は力を行使できない&#10;&lt;/h2&gt;&lt;p&gt;最後に、規約について。スレッドで、投稿者の方は「規約違反だからBANは仕方ない」と物分かりよく考えられています。&lt;/p&gt;&#10;&#10; &lt;blockquote&gt;&#10; &lt;p&gt;「規約に違反したのは仕方ないからアカウントの復帰は諦めてるけど、それとは別にデータには財産権があるからダウンロードリンクを発行してほしい」とメールを送っても返信なし。選択的同期でローカル端末から消えてて救出できないデータが大量にあるんですが、なんとかなりませんか&lt;/p&gt;&#10;&lt;p&gt;— &lt;a class="link" href="https://x.com/fukusanity/status/2016445862315213287?s=20" target="_blank" rel="noopener"&#10; &gt;https://x.com/fukusanity/status/2016445862315213287?s=20&lt;/a&gt;&lt;/p&gt;&#10;&#10; &lt;/blockquote&gt;&#10;&lt;p&gt;規約は確かに強力な建前です。しかし&lt;strong&gt;一方で、財産権というより強力な建前が通用しない現実にも直面&lt;/strong&gt;されたことと思います。メールを送っても音信不通であったとのことです。ではどうしたらいいのでしょうか？アメリカの企業に日本国憲法に基づいて法的措置をすれば？いやまさか。&lt;/p&gt;&#10;&lt;p&gt;しかし今回、&lt;strong&gt;SNSで大いに取り上げられ、トレンドにもなったことで、騒ぎが大きくなったためか、この投稿にDropboxからリプライがついていました&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;p&gt;しかし、何も直接的な暴力だけではありません。つまり、 &lt;strong&gt;「筋の通らないことをするならこちらにも考えがある」という何かができるのか&lt;/strong&gt;、ということにあります。たとえば商売であるならば、「そんな不義理をするなら、君との取引はこれまでだ」というのは力の行使になり得ます。ですが、&lt;strong&gt;DropboxをはじめSaaSに対し、月額1000円ばかりのユーザが取引停止をちらつかせたところでなんの抑止力にもならない&lt;/strong&gt;ことは明らかです。&lt;/p&gt;&#10;&lt;p&gt;では、法的措置。これも通常あるべきですが、現実的に市民の手に負えません。特に今回は外資が相手です。&lt;/p&gt;&#10;&lt;p&gt;ここで、&lt;strong&gt;SNSが最後の武器&lt;/strong&gt;となります。「Dropboxにこんな仕打ちを受けた」というツイートがSNSの世界でトレンドになるほど広まるのは、これは企業にとって確かに困るわけです。&lt;strong&gt;ツイートをバズらせて初めてようやく、企業が話し合いの土俵に立ちます&lt;/strong&gt;。&lt;strong&gt;バズらないと絶対にいじめ（暴力）を調査しない学校と一緒です&lt;/strong&gt;。&lt;strong&gt;今をときめくIT企業も役所と一緒なんです&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;strong&gt;結論：セルフホストがすべてを解決する&lt;/strong&gt;&lt;/p&gt;&#10;&lt;p&gt;&amp;lt;関連&amp;gt;&lt;/p&gt;&#10;&lt;div class="blog-card-wrapper"&gt;&#10; &lt;a href="https://hack-le.com/datsudropbox/" class="blog-card"&gt;&#10; &lt;div class="blog-card-content"&gt;&#10; &lt;div class="blog-card-label"&gt;&#10; &lt;svg xmlns="http://www.w3.org/2000/svg" width="13" height="13" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"&gt;&lt;path d="M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.71"&gt;&lt;/path&gt;&lt;path d="M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71"&gt;&lt;/path&gt;&lt;/svg&gt;&#10; &lt;span&gt;あわせて読みたい&lt;/span&gt;&#10; &lt;/div&gt;&#10; &lt;div class="blog-card-title"&gt;脱Dropboxを進めている&lt;/div&gt;&#10; &lt;div class="blog-card-url"&gt;/datsudropbox/&lt;/div&gt;&#10; &lt;/div&gt;&#10; &lt;div class="blog-card-thumbnail"&gt;&#10; &lt;img src="https://hack-le.com/images/uploads/2025/11/output-29.webp" alt="脱Dropboxを進めている" 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/data-self-hosting/" class="blog-card"&gt;&#10; &lt;div class="blog-card-content"&gt;&#10; &lt;div class="blog-card-label"&gt;&#10; &lt;svg xmlns="http://www.w3.org/2000/svg" width="13" height="13" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"&gt;&lt;path d="M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.71"&gt;&lt;/path&gt;&lt;path d="M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71"&gt;&lt;/path&gt;&lt;/svg&gt;&#10; &lt;span&gt;あわせて読みたい&lt;/span&gt;&#10; &lt;/div&gt;&#10; &lt;div class="blog-card-title"&gt;自分のデータは自分で守れ、雲の上で守ってもらえると思うな&lt;/div&gt;&#10; &lt;div class="blog-card-url"&gt;/data-self-hosting/&lt;/div&gt;&#10; &lt;/div&gt;&#10; &lt;div class="blog-card-thumbnail"&gt;&#10; &lt;img src="https://hack-le.com/images/uploads/2026/01/output-30.webp" alt="自分のデータは自分で守れ、雲の上で守ってもらえると思うな" loading="lazy" /&gt;&#10; &lt;/div&gt;&#10; &lt;/a&gt;&#10;&lt;/div&gt;&#10;&#10;</description></item><item><title>ConoHa の VPS 2GB RAM でやっていること</title><link>https://hack-le.com/conoha-vps-2gb-ram/</link><pubDate>Sun, 25 Jan 2026 00:00:00 +0900</pubDate><guid>https://hack-le.com/conoha-vps-2gb-ram/</guid><description>&lt;p&gt;メモがてら、現在VPSで私がやっていることについてまとめます。2GB RAMでこれくらいできるんだな、という参考にもなるかとは思います。vCPUは3コア、SSDは100GB割り当てられています。&lt;/p&gt;&#10;&lt;h2 id="構成"&gt;構成&#10;&lt;/h2&gt;&lt;p&gt;書いてみて、Jitsi MeetとWebサイトしか置いてないことに気づきました。このサイトで紹介しているセルフホスト系アプリは、だいたい自宅サーバです。&lt;/p&gt;&#10;&lt;pre class="mermaid" style="visibility:hidden"&gt;graph TD&#10;proto(プロトタイプアプリ)&#10;subgraph コンテナ2&#10;cf_w(Cloudflare Tunnel B)&#10;end&#10;jitsi(Jitsi Meet)&#10;cf(Cloudflare Tunnel A)&#10;subgraph コンテナ&#10;wp1(WordPress 1)&#10;wp2(WordPress 2)&#10;wp3(WordPress 3)&#10;db(MariaDB)&#10;end&#10;cf --&gt; wp1&#10;cf --&gt; wp2&#10;cf --&gt; wp3&#10;wp1 -.-&gt; db&#10;wp2 -.-&gt; db&#10;wp3 -.-&gt; db&lt;/pre&gt;&lt;p&gt;これだけのアプリですが、そこそこ重いのが揃っているので、RAMはけっこうかつかつです。1GB RAMだと無理でしょうね。1.5GBくらい常に消費しているし、スワップも発生しています。&lt;/p&gt;&#10;&lt;h3 id="cloudflare-tunnel"&gt;Cloudflare Tunnel&#10;&lt;/h3&gt;&lt;p&gt;2つのCloudflareアカウントで管理されたドメインがあるため、なんかコンテナ経由とネイティブにインストールしたものの2種類あるというわけのわからんことになっています(^_^;)&lt;/p&gt;&#10;&lt;p&gt;普通はネイティブに入れるだけでいいと思います。&lt;/p&gt;&#10;&lt;h3 id="jitsi-meet"&gt;Jitsi Meet&#10;&lt;/h3&gt;&lt;p&gt;Jitsi MeetはZoomとかビデオチャットアプリのオルタナティブですね。多人数のビデオチャットを無制限にできるので、これは非常に有用だと思います。VPSのおすすめ用途の一つです。3人くらいでちょくちょく使っていますが、安定性はそれなりですかね。なんかたまに挙動不審なことがあります。だいたいVPSを再起動するとなおります。初期設定はちょっと手こずるかもしれません。&lt;/p&gt;&#10;&lt;p&gt;まぁ最近はZoom使っちゃいけない令が出てチャットアプリ迷子になっている人もいるかと思いますが、そういう時にも自前でたてるという手段があるのは良いことです。仕事でも使えます。&lt;/p&gt;&#10;&lt;p&gt;ただインストール難度はそこそこあるので、サーバ初心者が最初に挑戦するやつではないなぁとも思います。コンテナを使った管理よりもネイティブのほうが良いと思います。&lt;/p&gt;&#10;&lt;p&gt;と思っていましたが、結局コンテナ使うようになりました。Caddy使うのに443とられるわけにいかなかったのです。&lt;/p&gt;&#10;&lt;div class="blog-card-wrapper"&gt;&#10; &lt;a href="https://hack-le.com/jitsi-meet-docker-caddy/" 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;Jitsi Meet(ネイティブ) から Caddy &amp;#43; Jitsi Meet(コンテナ)の構成に移行&lt;/div&gt;&#10; &lt;div class="blog-card-url"&gt;/jitsi-meet-docker-caddy/&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_48006_1771095244.webp" alt="Jitsi Meet(ネイティブ) から Caddy &amp;#43; Jitsi Meet(コンテナ)の構成に移行" loading="lazy" /&gt;&#10; &lt;/div&gt;&#10; &lt;/a&gt;&#10;&lt;/div&gt;&#10;&#10;&lt;h3 id="wordpressサイト3つ"&gt;WordPressサイト3つ&#10;&lt;/h3&gt;&lt;p&gt;AIにきくとそりゃちょっとキツイんじゃないの？と言われそうなのがWordPressのサイト3つを常駐させていることです。全然いけます。まぁアクセスが少ないからでもあります。悲しい。昔はもうちょっとよかったんですけどね。まぁでも昔のアクセス数でも全然捌けただろうな。&lt;/p&gt;&#10;&lt;p&gt;データベースは3サイトで共有しています。できれば分離したいですけど、さすがにMariaDB 3つは厳しいだろうなぁと思います。&lt;/p&gt;&#10;&lt;p&gt;また、外部公開は直接外に出すのではなく、Cloudflare Tunnelを利用しています。これは複数サイトの証明書管理がめっちゃだるいからです。昔Certbotを自動起動していたとき、なぜか一つのサイトだけ自動更新に毎回失敗して証明書が切れるという現象が起きて悩まされたりしていました……。&lt;/p&gt;&#10;&lt;h3 id="たまになんかのアプリをビルドする"&gt;たまになんかのアプリをビルドする&#10;&lt;/h3&gt;&lt;p&gt;時々試験目的で、アプリケーションをビルドしてテスト公開に使っていたりします。ただ前述のとおり既にRAMはカツカツで、この状態でビルドするとフツーに落ちるので、swapを2GBから6GBとか10GBに拡張してビルドを実行します。&lt;/p&gt;&#10;&lt;h2 id="vpsで向いてること-安定した通信と高い可用性"&gt;VPSで向いてること: 安定した通信と高い可用性&#10;&lt;/h2&gt;&lt;p&gt;私は10以上のアプリケーションをセルフホストで運用していますが、だいたい自宅サーバで運用しています。多くの場合、スペックが重要だからです。本当は全部自宅サーバでやりたい。&lt;/p&gt;&#10;&lt;p&gt;VPSに切り出しているのは、固定IP、セキュリティ、安定した通信基盤、可用性が求められるものに限っています。つまり不特定多数に向けたWebサービス（サイトを含む）ですね。まぁ一言で言えば安定したDMZって感じかと思います。&lt;/p&gt;&#10;&lt;p&gt;まぁ入り口さえVPSなら、あとは可用性だけが問題なので、うち程度ならWebサイトは自宅サーバでもいいんじゃないの？という気もしています。今のところ問題なく運用できているので、別にVPSでいいかと思って置きっぱなしにしていますが、今後別のアプリケーションを優先して入れ替えることはあるかもです。&lt;/p&gt;&#10;&lt;p&gt;あと3-2-1バックアップのクラウド保存としてのバックアップ用途もあるのですが、ストレージ系は値段が高いので個人的にはオススメはしません。ハードディスク暗号化して、実家に置かせてもらうとか、信頼できる人同士で置き場提供しあうとかのほうがいいんでないですかね……。&lt;/p&gt;&#10;&lt;h2 id="今後の拡張予定"&gt;今後の拡張予定&#10;&lt;/h2&gt;&lt;p&gt;今後VPSでやりたいと思っているものです。これらはWebサイトよりも優先順位が高いので、もし負荷の限界が見られたらWebサイトを自宅サーバに引っ越す可能性あります。どうせアクセス少ないし🥺&lt;/p&gt;&#10;&lt;h3 id="自宅サーバと繋がるゲートウェイ-リバースプロキシ--証明書管理--vpn"&gt;自宅サーバと繋がるゲートウェイ: リバースプロキシ + 証明書管理 + VPN&#10;&lt;/h3&gt;&lt;p&gt;現在色々なところでCloudflare Tunnelを使っているところを置き換える予定です。具体的にはリバースプロキシをおいて、VPNで自宅サーバと繋げる感じを想定しています。ドメイン証明書の発行もします。構成は既に考えていますが、めんどくさいです。&lt;/p&gt;&#10;&lt;p&gt;一般的にはCloudflare Tunnelで十分なのであんまりおすすめしません。私がやろうと思っているのは、思想信条というめんどくさい理由によります。いつかCloudflareの大規模障害で一緒に沈んだ大規模サービスを煽り倒そう。&lt;/p&gt;&#10;&lt;p&gt;アクセスをVPN経由にしたいとかNASを外で見たいとか、そういう外部公開前提のプライベート目的なら有用だと思います。私はそのへんのユースケースはあまり関心ないのですが、そのうちやってみるかも。&lt;/p&gt;&#10;&lt;h3 id="メール-postfix"&gt;メール: Postfix&#10;&lt;/h3&gt;&lt;p&gt;現在アプリケーションサーバとして契約しているメールサーバについて、Postfixを置いて代替させるつもりです。メールサーバー605円/月もするので……。それだったらPostfixで最低限の機能をもたせたうえで、重い処理は自宅サーバでやる、みたいな合わせ技をやりたいわけです。&lt;/p&gt;&#10;&lt;h2 id="セルフホストで自宅サーバ派でもvpsは有用"&gt;セルフホストで自宅サーバ派でもVPSは有用&#10;&lt;/h2&gt;&lt;p&gt;AIのせいでAI PCが高すぎて買えないとかいうグローバルレベルのギャグが展開されている昨今、PCの基本が問われていると思います。しかし、PCのスペックは10年前レベルでもはや十分過ぎる程度で、いらないことをいると思わされ続けてきた10年だったと個人的には思っております。実際2GB RAMでもこれだけのことができるわけです。ここに自宅に眠るマシンを組み合わせれば、その可能性は無限大。&lt;/p&gt;&#10;&lt;p&gt;まぁだからといってAIのせいでPC高騰というのは絶許という気持ちは変わらないんですけれど、そうは言っても世情には逆らえません。今あるものを使い切る思想が重要かと思います。&lt;/p&gt;&#10;&lt;p&gt;そのうえで、自宅サーバでは難しいところ、つまり安定した電源と通信、余裕のある帯域幅、プライベートなLANと隔絶された環境を手軽に実現するするものとして、VPSは非常に有用です。どこぞのサブスクに金払うなら、VPSを借りるほうが有意義だと思います。&lt;/p&gt;&#10;&lt;h2 id="でもconohaは勧めない"&gt;でもConoHaは勧めない&#10;&lt;/h2&gt;&lt;p&gt;ここまで書いといてなんだが、先日ConoHaがやらかした大規模障害とその対応に呆れ果てたので、勧めません。&lt;/p&gt;&#10;&lt;div class="blog-card-wrapper"&gt;&#10; &lt;a href="https://hack-le.com/conoha-vps-down/" class="blog-card"&gt;&#10; &lt;div class="blog-card-content"&gt;&#10; &lt;div class="blog-card-label"&gt;&#10; &lt;svg xmlns="http://www.w3.org/2000/svg" width="13" height="13" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"&gt;&lt;path d="M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.71"&gt;&lt;/path&gt;&lt;path d="M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71"&gt;&lt;/path&gt;&lt;/svg&gt;&#10; &lt;span&gt;あわせて読みたい&lt;/span&gt;&#10; &lt;/div&gt;&#10; &lt;div class="blog-card-title"&gt;ConoHa VPS落ちすぎ問題&lt;/div&gt;&#10; &lt;div class="blog-card-url"&gt;/conoha-vps-down/&lt;/div&gt;&#10; &lt;/div&gt;&#10; &lt;div class="blog-card-thumbnail"&gt;&#10; &lt;img src="https://hack-le.com/images/uploads/2026/03/eyecatch_48871_1774613666.webp" alt="ConoHa VPS落ちすぎ問題" loading="lazy" /&gt;&#10; &lt;/div&gt;&#10; &lt;/a&gt;&#10;&lt;/div&gt;&#10;&#10;&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/45948138-2/" class="blog-card"&gt;&#10; &lt;div class="blog-card-content"&gt;&#10; &lt;div class="blog-card-label"&gt;&#10; &lt;svg xmlns="http://www.w3.org/2000/svg" width="13" height="13" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"&gt;&lt;path d="M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.71"&gt;&lt;/path&gt;&lt;path d="M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71"&gt;&lt;/path&gt;&lt;/svg&gt;&#10; &lt;span&gt;あわせて読みたい&lt;/span&gt;&#10; &lt;/div&gt;&#10; &lt;div class="blog-card-title"&gt;自宅サーバーは浪漫枠&lt;/div&gt;&#10; &lt;div class="blog-card-url"&gt;/45948138-2/&lt;/div&gt;&#10; &lt;/div&gt;&#10; &lt;div class="blog-card-thumbnail"&gt;&#10; &lt;img src="https://hack-le.com/images/uploads/2026/09/eyecatch_2738_1789453565.webp" alt="自宅サーバーは浪漫枠" loading="lazy" /&gt;&#10; &lt;/div&gt;&#10; &lt;/a&gt;&#10;&lt;/div&gt;&#10;&#10;&lt;p&gt;自宅サーバは死なず。&lt;/p&gt;&#10;</description></item><item><title>セルフホストでブックマーク同期：Floccus + WebDAV(bytemark/webdav)</title><link>https://hack-le.com/floccus-webdav/</link><pubDate>Sat, 24 Jan 2026 00:00:00 +0900</pubDate><guid>https://hack-le.com/floccus-webdav/</guid><description>&lt;p&gt;ブックマークを複数ブラウザで同期したい。LAN内のみで良い（一手間加えればWANもいけると思うけど）。&lt;/p&gt;&#10;&lt;p&gt;EverSyncを使っていたのだけれど、Braveをアップデートしたら挙動不審になったのをきっかけにセルフホストに移行することにしました。別にブックマークなんて結局リンク集なのでそんな大した秘匿情報ではないので、別にクラウドでもよかったんですが、まぁせっかくなので。&lt;/p&gt;&#10;&lt;p&gt;できるだけシンプルなものとして、「&lt;a class="link" href="https://floccus.org/" target="_blank" rel="noopener"&#10; &gt;Cross-browser bookmarks syncing - Floccus bookmarks sync&lt;/a&gt;」をWebDAV構成で使うことにしました。&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 WebDAV Server&#10;bookmark(bookmarks.xbel)&#10;end&#10;subgraph Mac&#10;browA(Browser A)&#10;end&#10;subgraph Windows&#10;browB(Browser B)&#10;end&#10;browA |Floccus| bookmark&#10;browB |Floccus| bookmark&lt;/pre&gt;&lt;ul&gt;&#10;&lt;li&gt;Floccusはブックマーク同期のみをするソフトウェア&#10;&lt;ul&gt;&#10;&lt;li&gt;通信はいくつかの手段がある。一番楽なのはGoogle Drive。&lt;/li&gt;&#10;&lt;li&gt;ここではシンプルかつ自立性を重視して安心と伝統のWebDAV&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;/li&gt;&#10;&lt;li&gt;2つめ以降のブラウザで、同じプロファイルを用いるには、手動でプロファイルのインポート、エクスポートをする&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;p&gt;NextcloudとかLinkwardenを基盤にすることもできるようなのですが、依存を減らしたかったのでWebDAVにしました。Nextcloud基盤一応あるんですけれど、重量級なのであんまり色々やりたくない感じ。&lt;/p&gt;&#10;&lt;p&gt;Floccusのバージョンは5.8.3で、Firefox、Chromeなど対応しています。&lt;/p&gt;&#10;&lt;h2 id="インストール"&gt;インストール&#10;&lt;/h2&gt;&lt;h3 id="webdavサーバの準備"&gt;WebDAVサーバの準備&#10;&lt;/h3&gt;&lt;p&gt;「&lt;a class="link" href="https://hub.docker.com/r/bytemark/webdav/" target="_blank" rel="noopener"&#10; &gt;bytemark/webdav - Docker Image&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;services:&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; webdav:&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; image: bytemark/webdav&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; container_name: floccus-webdav&#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; 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; - &lt;span class="nv"&gt;USERNAME&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;ユーザ名&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; - &lt;span class="nv"&gt;PASSWORD&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;パスワード&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; volumes:&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="c1"&gt;# 相対パスに変更することで、今いるディレクトリの data フォルダに固定されます&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; - ./floccus-data:/var/lib/dav&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;ポート、ユーザ名、パスワード、あとブックマークを保存する場所を指定します。上記はカレントディレクトリの&lt;code&gt;floccus-data&lt;/code&gt;ディレクトリになっていますが、適当に。&lt;/p&gt;&#10;&lt;p&gt;同期ファイルとして、最小限のXMLファイル&lt;code&gt;bookmarks.xbel&lt;/code&gt;をコンテナ内の&lt;code&gt;/var/lib/dav/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;&lt;span class="c1"&gt;# コンテナ内のファイルに最小限の XML 構造を書き込む&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;docker &lt;span class="nb"&gt;exec&lt;/span&gt; floccus-webdav sh -c &lt;span class="s1"&gt;&amp;#39;echo &amp;#34;&amp;lt;?xml version=\&amp;#34;1.0\&amp;#34; encoding=\&amp;#34;UTF-8\&amp;#34;?&amp;gt;&amp;lt;xbel version=\&amp;#34;1.0\&amp;#34;&amp;gt;&amp;lt;/xbel&amp;gt;&amp;#34; &amp;gt; /var/lib/dav/data/bookmarks.xbel&amp;#39;&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;docker &lt;span class="nb"&gt;exec&lt;/span&gt; floccus-webdav chown www-data:www-data /var/lib/dav/data/bookmarks.xbel&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h3 id="最初のブラウザにfloccus導入"&gt;最初のブラウザにfloccus導入&#10;&lt;/h3&gt;&lt;p&gt;「&lt;a class="link" href="https://floccus.org/guides/" target="_blank" rel="noopener"&#10; &gt;Guides and How tos - Floccus bookmarks sync&lt;/a&gt;」がドキュメント。ここから使っているブラウザの拡張機能を導入します。&lt;/p&gt;&#10;&lt;p&gt;インストールしたら、最初のプロファイルを作成します。&lt;/p&gt;&#10;&lt;ul&gt;&#10;&lt;li&gt;WebDAV URL: &lt;code&gt;http://WebDAVサーバのIPアドレス:ポート&lt;/code&gt;&#10;&lt;ul&gt;&#10;&lt;li&gt;LAN内なのでhttps接続は不要としました&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;/li&gt;&#10;&lt;li&gt;ユーザ、パスワード: &lt;code&gt;docker-compose.yml&lt;/code&gt;と合わせる&lt;/li&gt;&#10;&lt;li&gt;パスフレーズ: 空欄（暗号化しない場合）&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;p&gt;次は同期ファイルのパスとかを指定します。&lt;/p&gt;&#10;&lt;p&gt;&lt;img loading="lazy" sizes="(max-width: 767px) calc(100vw - 30px), (max-width: 1023px) 700px, (max-width: 1279px) 950px, 1232px" src="https://hack-le.com/images/uploads/2026/01/ca8ccade3e2c6441d38896cc9e854f08-700x968.png"&gt;&lt;/p&gt;&#10;&lt;p&gt;次の設定は同期の手法で、同期タイミングや方向性の設定ですが、基本的にはデフォルトでいいと思います。&lt;/p&gt;&#10;&lt;p&gt;&lt;img loading="lazy" sizes="(max-width: 767px) calc(100vw - 30px), (max-width: 1023px) 700px, (max-width: 1279px) 950px, 1232px" src="https://hack-le.com/images/uploads/2026/01/a9f877ac114b4daa104f5374b3d9ba00-700x1167.webp"&gt;&lt;/p&gt;&#10;&lt;p&gt;ただ入れ子プロファイルだけOFFにしました。私には必要ない機能だと思ったからです。この機能の意味はGemini曰く以下です。&lt;/p&gt;&#10;&#10; &lt;blockquote&gt;&#10; &lt;p&gt;例えば、以下のような2つの同期設定（プロファイル）を作りたいとします。&lt;/p&gt;&#10;&lt;ul&gt;&#10;&lt;li&gt;&lt;strong&gt;プロファイルA（全体用）&lt;/strong&gt; : 「ブックマークバー」&lt;strong&gt;全体&lt;/strong&gt;を、自分専用のWebDAVサーバーに同期する。&lt;/li&gt;&#10;&lt;li&gt;&lt;strong&gt;プロファイルB（共有用）&lt;/strong&gt; : 「ブックマークバー」の中にある**「仕事」フォルダだけ**を、チームの共有サーバーに同期する。&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;p&gt;このとき、「仕事」フォルダは、プロファイルAの管理下でもあり、プロファイルBの管理下でもあるという&lt;strong&gt;重複状態&lt;/strong&gt;になります。&lt;/p&gt;&#10;&#10; &lt;/blockquote&gt;&#10;&lt;p&gt;つまりチームやプロジェクトで一部分だけ共有とかしたい時に使う機能です。私はシングルユーザで、特に複雑なコントロールをする予定はないので、オフにしました。どうしてもこの手の同期系ソフトウェアは運用していると何かとトラブルが発生しがちなので、不要な機能はオフにしたほうがよかろうと思いました。&lt;/p&gt;&#10;&lt;p&gt;そういう意味では、もっとも確実なのはアップロードもダウンロードも完全手動にすることでしょうし、実際EverSyncではそうしていたのですが、とりあえず当面は双方向でやっていきたいと思います。&lt;/p&gt;&#10;&lt;h3 id="2つめのブラウザ以降-インポート--設定が必要"&gt;2つめのブラウザ以降: インポート + 設定が必要&#10;&lt;/h3&gt;&lt;p&gt;まず出口みたいなアイコンからプロファイルをエクスポートします。&lt;/p&gt;&#10;&lt;p&gt;&lt;img loading="lazy" sizes="(max-width: 767px) calc(100vw - 30px), (max-width: 1023px) 700px, (max-width: 1279px) 950px, 1232px" src="https://hack-le.com/images/uploads/2026/01/image-4-700x775.png"&gt;&lt;/p&gt;&#10;&lt;p&gt;2つ目のブラウザで拡張機能を導入後、エクスポートしたプロファイルをインポートしたらOKです。インポート後、下矢印アイコンでダウンロードしたら同期されます。&lt;/p&gt;&#10;&lt;p&gt;一点注意ですが、&lt;strong&gt;同期のタイミングが初期設定では定義されていませんでした&lt;/strong&gt;。なので「設定」から「変更ベースの同期」と「時間ベースの同期」をそれぞれONにします。その後はWebDAV経由で同期されます。&lt;/p&gt;&#10;&lt;h3 id="chromium系とfirefox系の同期"&gt;Chromium系とFirefox系の同期&#10;&lt;/h3&gt;&lt;p&gt;Vivaldiで保存したブックマーク、そのまんまインポートしてBraveでは使えたんですが、Firefoxだとフォルダの指定が必要でした🤔&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/01/image-10-700x373.png"&gt;&lt;/p&gt;&#10;&lt;p&gt;設定からフォルダーの関連付けでブックマークツールバーを選んでやることで、解決しました。&lt;/p&gt;&#10;&lt;h2 id="バックアップ"&gt;バックアップ&#10;&lt;/h2&gt;&lt;p&gt;&lt;code&gt;docker-compose.yml&lt;/code&gt;自身と、バインドマウントの設定を記述してますが、そのディレクトリを圧縮してコピーしたらOKです。&lt;/p&gt;&#10;&lt;p&gt;自分はバックアップスクリプトで定期実行しています。スクリプトは&lt;code&gt;docker-compose.yml&lt;/code&gt;をAIに見せたらサクッと書いてくれると思います。そういうのは得意なAI。&lt;/p&gt;&#10;&lt;h2 id="所感"&gt;所感&#10;&lt;/h2&gt;&lt;p&gt;dockerでWebDAVサーバをたてたのは地味に初めてで、Geminiに聞いてすぐできるかと思いきや、だいぶ間違えたことを言われて転がされました。インフラ絡むと不得意なAI。地味に時間がかかっている。ま、だから記事にも意味があるんですけどね。&lt;/p&gt;&#10;&lt;p&gt;性質上、ブックマーク同期はインターネット公開にする必要性は特に感じていません。なのでLAN内限定です。外で使う時にブックマークを激しく変更しないと思いますし、また常に同期用の通信が走るのも邪魔です。もしやるならば、簡単なのは例によってCloudflare Tunnelでしょう。&lt;/p&gt;&#10;&lt;p&gt;とりあえずしばらく運用してみようと思います。うまくいくようならEverSyncはいらないですね。&lt;/p&gt;&#10;</description></item><item><title>TailscaleでVPSと自宅サーバを繋ぐ</title><link>https://hack-le.com/tailscale-vps/</link><pubDate>Mon, 19 Jan 2026 00:00:00 +0900</pubDate><guid>https://hack-le.com/tailscale-vps/</guid><description>&lt;p&gt;最終的にはサービスのインターネット公開までするつもりだが、その前段階として。&lt;/p&gt;&#10;&lt;h2 id="構成"&gt;構成&#10;&lt;/h2&gt;&lt;ul&gt;&#10;&lt;li&gt;VPS&#10;&lt;ul&gt;&#10;&lt;li&gt;Ubuntu 24.04&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;/li&gt;&#10;&lt;li&gt;自宅サーバ&#10;&lt;ul&gt;&#10;&lt;li&gt;macOS 14.8.1&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;pre class="mermaid" style="visibility:hidden"&gt;graph TD&#10;subgraph VPS&#10;dev2(Ubuntu)&#10;end&#10;subgraph Home&#10;nat(NAT)&#10;subgraph LAN&#10;dev1(Mac)&#10;end&#10;end&#10;tail(TailScale Control Server)&#10;dev2 ---|VPN| nat --- dev1&#10;dev1 -.- tail&#10;dev2 -.- tail&lt;/pre&gt;&lt;p&gt;NAT越えの表現が微妙な気がしつつ、登場人物の理解のために。&lt;/p&gt;&#10;&lt;p&gt;要はVPNなんですけれど、各デバイスのグローバルIPやポート、公開鍵など管理のためにTailscaleのコントロールサーバが必要になります。つまりサインアップ必須。しかも認証基盤他所に依存してますね。しゃあなしなのでGitHubアカウント使いました。普段のデータ通信は端末間ですが、最初の疎通や、グローバルIPの変更などがあると、管理サーバが必要になるようです。&lt;/p&gt;&#10;&lt;p&gt;管理サーバを完全に廃したい場合は、「&lt;a class="link" href="https://headscale.net/stable/" target="_blank" rel="noopener"&#10; &gt;Headscale&lt;/a&gt;」というOSSがあるようですが、今回は試しません。&lt;/p&gt;&#10;&lt;h2 id="インストール"&gt;インストール&#10;&lt;/h2&gt;&lt;p&gt;バイナリで配布されているので、そのまんま使います。実行後はサインインします。&lt;/p&gt;&#10;&lt;p&gt;VPS(Ubuntu)ではCLIなので以下。&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;curl -fsSL https://tailscale.com/install.sh &lt;span class="p"&gt;|&lt;/span&gt; sh&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;sudo tailscale up&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id="テスト"&gt;テスト&#10;&lt;/h2&gt;&lt;p&gt;Mac側でテスト用のWebサーバ。&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;&amp;lt;h1&amp;gt;Hello from Home Server (macOS) via Tailscale&amp;lt;/h1&amp;gt;&amp;#34;&lt;/span&gt; &amp;gt; index.html&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# Pythonで一時的に8080ポートを開く&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;python3 -m http.server &lt;span class="m"&gt;8080&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;VPS側で疎通確認。&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;curl http://&lt;span class="o"&gt;[&lt;/span&gt;ホームサーバのTailscale-IP&lt;span class="o"&gt;]&lt;/span&gt;:8080&#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;h2 id="magicdns"&gt;MagicDNS&#10;&lt;/h2&gt;&lt;p&gt;Tailscaleで割り当てられるIPアドレスは基本的にはスタティックと考えて良いようですが、覚えづらいし、端末の入れ替えなどあるかもしれないし、必ず固定というわけでもない、とか考えると、名前があったほうがよさそうです。&lt;/p&gt;&#10;&lt;p&gt;MagicDNSを使うこと絵、IPアドレスではなく名前を指定することができます。&lt;/p&gt;&#10;&lt;p&gt;&lt;a class="link" href="https://tailscale.com/kb/1136/tailnet" target="_blank" rel="noopener"&#10; &gt;MagicDNS · テールスケールドキュメント&lt;/a&gt;&lt;/p&gt;&#10;&lt;p&gt;自動翻訳そのまま。&lt;/p&gt;&#10;&#10; &lt;blockquote&gt;&#10; &lt;p&gt;マシン名の割り当てと編集&#10;MagicDNS はデバイスのデバイスを自動的に使用します マシン名 DNS エントリの一部として。デバイスの名前を変更すると、MagicDNS エントリが自動的に変更されます。&lt;/p&gt;&#10;&lt;p&gt;デバイスを参照するために使用する特定の名前がある場合は、 マシン名を編集します デバイスの。&lt;/p&gt;&#10;&#10; &lt;/blockquote&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;curl http://&lt;span class="o"&gt;[&lt;/span&gt;マシン名&lt;span class="o"&gt;]&lt;/span&gt;:8080&#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;h2 id="次回はcaddyでリバースプロキシ"&gt;次回はCaddyでリバースプロキシ&#10;&lt;/h2&gt;&lt;p&gt;想像より随分でした。次は証明書発行までの機能をもつWebサーバCaddyと組み合わせて、Webサイトの外部公開を試みます。&lt;/p&gt;&#10;</description></item><item><title>セルフホストを広めたい</title><link>https://hack-le.com/cloud-selfhost/</link><pubDate>Tue, 13 Jan 2026 00:00:00 +0900</pubDate><guid>https://hack-le.com/cloud-selfhost/</guid><description>&lt;p&gt;10年くらい前に、自宅サーバはもうおしまい、みたいな記事を書きました。あの時はそれが正直な気持ちであったのだけれど、その10年後、自宅サーバをまたやり、あまつさえ隙あらばビッグテック批判記事書きまくってるとは、当時の僕には想像できなかっただろうなぁ。まったく生産的ではない。そもそも&lt;strong&gt;生産的な人はブログなんかしません（クソでか主語）&lt;/strong&gt; 。まぁ、あれから時代も僕も変わったのだよ。&lt;/p&gt;&#10;&lt;p&gt;さて、自宅サーバですが、最近は&lt;strong&gt;セルフホストと言われることが多い&lt;/strong&gt;かと思います。これはVPSなんかも含むし、別にホームユースにも限らないのですが、その本質は自宅サーバの精神と同質と思います。いずれにせよ時代に逆行しているので、ビジネスとしては選択されづらいはずで、Redditなんか見てると基本的にはホームユースで好事家が集まっている感じがします。&lt;/p&gt;&#10;&lt;p&gt;とても盛り上がっていて、英語ネイティブじゃない自分が恨めしくなります。私が英語をスラスラ読み書きしたいと思うのは、もっぱらRedditであの輪の中に入りたいと思うためで、これはアニメを見て日本語覚える外人の気持ちに近いのかもしれません。匿名掲示板初心者のごとく、今はひたすらROMっております。&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;実際、自分でも確かに何かと苦労するところはあるので、思うほど簡単ではないのかもしれません。セルフホストのアプリを使えば、実際ほとんどのサブスクは不要だとわかり、非常に手軽でかつ費用対効果の高いものですが、帰省の際にPCが好きな姉に勧めてみたのですが、かなり嫌な顔をされました。これを簡単と思うのは、前提となる知識が全然違うからだというようなことを言われました。&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;そんなことをされては困るのが資本主義の論理です。資本主義はGDPとなるような取引を発生させてなんぼですので、自己完結されては困るのです。なので、いらない機能をいるように思わせたり、セキュリティの危機を針小棒大に取り上げて脅しをかけるなどして、ユーザの脳を停止させ、依存させ、不必要な機能を売りつける商売が流行っています。&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;div class="blog-card-wrapper"&gt;&#10; &lt;a href="https://hack-le.com/45948138-2/" class="blog-card"&gt;&#10; &lt;div class="blog-card-content"&gt;&#10; &lt;div class="blog-card-label"&gt;&#10; &lt;svg xmlns="http://www.w3.org/2000/svg" width="13" height="13" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"&gt;&lt;path d="M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.71"&gt;&lt;/path&gt;&lt;path d="M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71"&gt;&lt;/path&gt;&lt;/svg&gt;&#10; &lt;span&gt;あわせて読みたい&lt;/span&gt;&#10; &lt;/div&gt;&#10; &lt;div class="blog-card-title"&gt;自宅サーバーは浪漫枠&lt;/div&gt;&#10; &lt;div class="blog-card-url"&gt;/45948138-2/&lt;/div&gt;&#10; &lt;/div&gt;&#10; &lt;div class="blog-card-thumbnail"&gt;&#10; &lt;img src="https://hack-le.com/images/uploads/2026/09/eyecatch_2738_1789453565.webp" alt="自宅サーバーは浪漫枠" loading="lazy" /&gt;&#10; &lt;/div&gt;&#10; &lt;/a&gt;&#10;&lt;/div&gt;&#10;&#10;</description></item><item><title>セルフホストのタグ管理系トラッカーアプリ『TimeTagger』個人ユースなら完璧</title><link>https://hack-le.com/timetagger/</link><pubDate>Mon, 12 Jan 2026 00:00:00 +0900</pubDate><guid>https://hack-le.com/timetagger/</guid><description>&lt;p&gt;Togglを使っていたのですが、あまり使い勝手がよくありませんでした。それで自分で作ろうかと思っていたのですけれど、なんだかすでにセルフホストでありました。&lt;/p&gt;&#10;&lt;p&gt;&lt;a class="link" href="https://timetagger.app/" target="_blank" rel="noopener"&#10; &gt;TimeTagger - Tag your time, get the insight&lt;/a&gt;&lt;/p&gt;&#10;&lt;p&gt;リポジトリはこちら「&lt;a class="link" href="https://github.com/almarklein/timetagger" target="_blank" rel="noopener"&#10; &gt;GitHub - almarklein/timetagger: Tag your time, get the insight&lt;/a&gt;」。&lt;/p&gt;&#10;&lt;p&gt;Introductionを読んだ時、あまりにも僕が想像していたものとほぼ同じ仕様で、本当に驚きました。完全に同じようなニーズに基づいていたのだと思います。以下はGeminiによる和訳です。&lt;/p&gt;&#10;&#10; &lt;blockquote&gt;&#10; &lt;p&gt;TimeTaggerは、ローカル環境またはサーバー上で動作させることができる、Webベースの時間追跡（タイムトラッキング）ソリューションです。個人やフリーランスの方々を対象としており、以下のような特徴を備えています。&lt;/p&gt;&#10;&lt;ul&gt;&#10;&lt;li&gt;&lt;strong&gt;インタラクティブなタイムラインを中心とした、直感的なユーザーインターフェース（UI）。&lt;/strong&gt;&lt;/li&gt;&#10;&lt;li&gt;&lt;strong&gt;プロジェクト単位ではなく、タグを使用することによる軽快な操作感。&lt;/strong&gt;&lt;/li&gt;&#10;&lt;li&gt;&lt;strong&gt;PDFおよびCSV形式でのレポート作成。&lt;/strong&gt;&lt;/li&gt;&#10;&lt;li&gt;&lt;strong&gt;日次、週次、月次の目標設定。&lt;/strong&gt;&lt;/li&gt;&#10;&lt;li&gt;&lt;strong&gt;統合されたポモドーロ・メソッド（実験的機能）。&lt;/strong&gt;&lt;/li&gt;&#10;&lt;li&gt;&lt;strong&gt;レスポンシブ対応：小さな画面から大きな画面まで、快適に動作します。&lt;/strong&gt;&lt;/li&gt;&#10;&lt;li&gt;&lt;strong&gt;デバイス間での同期。&lt;/strong&gt;&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&#10; &lt;/blockquote&gt;&#10;&lt;p&gt;特に「プロジェクト」ではなく「タグ」を使うという発想が、本当に個人の発想であると思います。完全に同じことを考えておりました。ポモドーロについては私は物理的なタイマーを利用していますが、しかしソフトウェア的に連携したいという人もいるでしょう。&lt;/p&gt;&#10;&lt;h2 id="インストール"&gt;インストール&#10;&lt;/h2&gt;&lt;p&gt;私の環境&lt;/p&gt;&#10;&lt;ul&gt;&#10;&lt;li&gt;Intel Mac mini 2018&lt;/li&gt;&#10;&lt;li&gt;macOS 14.8.1&lt;/li&gt;&#10;&lt;li&gt;Docker Desktop for Mac 4.55.0&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;p&gt;インストール方法は、pipを使ったものとdockerを使ったものがあるようです。また、docker-compose.ymlはroot版とnonroot版があります。常用予定なのでdocker版を使います。LAN内運用ですし、トラブルも少なそうなroot版をここでは見ます。セルフホストについては「&lt;a class="link" href="https://timetagger.app/articles/selfhost2/" target="_blank" rel="noopener"&#10; &gt;How to self-host your time tracker with Docker&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;&lt;span class="c1"&gt;# Example docker-compose file for TimeTagger that uses the published&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;# Docker image in the default root variant.&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;# Shows all options settable via the environment.&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;#&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;# !! Make sure to apply your own credentials !!&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 can use e.g. https://timetagger.app/cred to generate them !!&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;# !! In docker-compose characters &amp;#39;$&amp;#39; should be escaped as &amp;#39;$$&amp;#39; !!&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;# !! If you use a .env file, use single quotes instead of escaping !!&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;services:&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; timetagger:&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; image: ghcr.io/almarklein/timetagger&#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:80&amp;#34;&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; - ./_timetagger:/root/_timetagger&#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;TIMETAGGER_BIND&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;0.0.0.0:80&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; - &lt;span class="nv"&gt;TIMETAGGER_DATADIR&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;/root/_timetagger&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; - &lt;span class="nv"&gt;TIMETAGGER_LOG_LEVEL&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;info&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; - &lt;span class="nv"&gt;TIMETAGGER_CREDENTIALS&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;test:&lt;span class="nv"&gt;$$&lt;/span&gt;2a&lt;span class="nv"&gt;$$&lt;/span&gt;08&lt;span class="nv"&gt;$$&lt;/span&gt;0CD1NFiIbancwWsu3se1v.RNR/b7YeZd71yg3cZ/3whGlyU6Iny5i &lt;span class="c1"&gt;# test:test&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;ul&gt;&#10;&lt;li&gt;ポート&lt;/li&gt;&#10;&lt;li&gt;バインドマウントするディレクトリ&lt;/li&gt;&#10;&lt;li&gt;クレデンシャル&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;p&gt;一点加えるなら&lt;code&gt;restart: unless-stopped&lt;/code&gt;になるでしょうか。&lt;/p&gt;&#10;&lt;p&gt;クレデンシャルですが、「&lt;a class="link" href="https://timetagger.app/cred" target="_blank" rel="noopener"&#10; &gt;https://timetagger.app/cred&lt;/a&gt;」でユーザ名とパスワードをフォームに入力すると、コピペ用のハッシュ化されたものが作れます。&lt;code&gt;docker-compose.yml&lt;/code&gt;向けは3つ目の$をエスケープしたやつになります。&lt;/p&gt;&#10;&lt;p&gt;そしたら&lt;code&gt;http://IPアドレス:ポート&lt;/code&gt;にアクセスしてログイン。記事には「ログインパスワードはそのまんま送ってるんでhttpsを強く推奨」とあるが、うーんそのうちw&lt;/p&gt;&#10;&lt;p&gt;まぁLAN内なので。LAN内で通信傍受されている場合、なんかもうタイムトラッカーアプリのログインパスワードとかそれどころではない大変なことになっているので……。&lt;/p&gt;&#10;&lt;h2 id="適当に動かす"&gt;適当に動かす&#10;&lt;/h2&gt;&lt;p&gt;とりあえずトラックしてみる。&lt;/p&gt;&#10;&lt;p&gt;&lt;img loading="lazy" sizes="(max-width: 767px) calc(100vw - 30px), (max-width: 1023px) 700px, (max-width: 1279px) 950px, 1232px" src="https://hack-le.com/images/uploads/2026/01/image-2-700x253.png"&gt;&lt;/p&gt;&#10;&lt;p&gt;ほーん。タグは自分で#つけて書くらしい。&lt;/p&gt;&#10;&lt;p&gt;&lt;img loading="lazy" sizes="(max-width: 767px) calc(100vw - 30px), (max-width: 1023px) 700px, (max-width: 1279px) 950px, 1232px" src="https://hack-le.com/images/uploads/2026/01/e11af61ce760b6139722f610a6101336-700x394.webp"&gt;&lt;/p&gt;&#10;&lt;p&gt;PDFでレポート出力。&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/01/a0a2ae18a914e24fbbf55e1b4e2292e9-700x349.webp"&gt;&lt;/p&gt;&#10;&lt;p&gt;うん。やりたいことだいたい全部できますね。個人で使う分にはこれぐらいでいいんだよという感じがします。&lt;/p&gt;&#10;&lt;h2 id="バックアップ"&gt;バックアップ&#10;&lt;/h2&gt;&lt;p&gt;&lt;code&gt;docker-compose.yml&lt;/code&gt;で指定したマウント先に、jwtとSQLiteのデータベースファイルがあるだけです。なので、docker用ファイルとディレクトリをコピーするだけでバックアップ完了です。良いですね。&lt;/p&gt;&#10;&lt;h2 id="所感"&gt;所感&#10;&lt;/h2&gt;&lt;p&gt;あまりにも想像していたものそのもので、驚いてしまいました。一点異なるのは、私は複数のタスクを同時に登録できるようなものを考えていたことなのですが、こうしてみると余分な機能に思えました。&lt;/p&gt;&#10;&lt;p&gt;素晴らしいことだなぁと有り難く思う反面、なんかもう全部OSSであるやんけ僕何したらええねんというお気持ちもあります。&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/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>Google Photoの代替Immichをセルフホストで試す</title><link>https://hack-le.com/google-photo-immich/</link><pubDate>Mon, 05 Jan 2026 00:00:00 +0900</pubDate><guid>https://hack-le.com/google-photo-immich/</guid><description>&lt;p&gt;写真管理にあまりこだわりがなかったので後回しにしていたが、なんとなく思い立ってセルフホストのフォト管理アプリImmichをインストールした。Google Photoの代替としても有名。これで子供とのお風呂写真をあげても絶対に垢BANされないね。独身だけど。&lt;/p&gt;&#10;&lt;p&gt;使い始めたばかりなので、肌感はこれからになるけれど、とりあえず楽だった（小並感）。&lt;code&gt;docker compose&lt;/code&gt;一発でとてもよかった。&lt;/p&gt;&#10;&lt;h2 id="こんな感じ"&gt;こんな感じ&#10;&lt;/h2&gt;&lt;p&gt;インストールするとこんな感じ。&lt;/p&gt;&#10;&lt;p&gt;&lt;img loading="lazy" sizes="(max-width: 767px) calc(100vw - 30px), (max-width: 1023px) 700px, (max-width: 1279px) 950px, 1232px" src="https://hack-le.com/images/uploads/2025/12/a319e90ead57708db2c99a2df8722e29-700x571.webp"&gt;&lt;/p&gt;&#10;&lt;p&gt;完全にGoogle Photoで笑った。なのでまぁそのまんま操作できるかと思われる。ストレージ容量がなんかバグってる。鍵付きフォルダー設定できる。外部公開用のドメインも設定から別途設定できる。&lt;/p&gt;&#10;&lt;p&gt;アップロードしたファイルの実体は、&lt;code&gt;.env&lt;/code&gt;で設定する&lt;code&gt;UPLOAD_LOCATION&lt;/code&gt;にあるのだが（初期設定は &lt;code&gt;./library&lt;/code&gt;）ランダムっぽい数字で深い階層になる。なので&lt;code&gt;DB_DATA_LOCATION&lt;/code&gt;も合わせてバックアップする必要がある。&lt;/p&gt;&#10;&lt;h2 id="インストール"&gt;インストール&#10;&lt;/h2&gt;&lt;p&gt;ドキュメントにあるとおりでまったくハマるところがなかったため、書くことがないのだが、とりあえずドキュメント「&lt;a class="link" href="https://docs.immich.app/overview/quick-start/" target="_blank" rel="noopener"&#10; &gt;Quick start | Immich&lt;/a&gt;」&lt;/p&gt;&#10;&lt;p&gt;&lt;code&gt;.env&lt;/code&gt;を編集するだけだね。強いて言えば、macOSで外部ストレージをマウント先にするとエラー出た。まぁそうか。&lt;/p&gt;&#10;&lt;h2 id="バックアップとリストア"&gt;バックアップとリストア&#10;&lt;/h2&gt;&lt;p&gt;インストールはすぐできるが、問題はバックアップとリストア手順のほうかと思う。これのドキュメントは「&lt;a class="link" href="https://docs.immich.app/administration/backup-and-restore#backup-ordering" target="_blank" rel="noopener"&#10; &gt;Backup and Restore | Immich&lt;/a&gt;」にある。3-2-1戦略については汎用知識なのでAIに書かせた「&lt;a class="link" href="https://ai.hack-le.com/%f0%9f%93%9d-%e3%83%90%e3%83%83%e3%82%af%e3%82%a2%e3%83%83%e3%83%97%e6%88%a6%e7%95%a5-3-2-1%e3%83%ab%e3%83%bc%e3%83%ab/" target="_blank" rel="noopener"&#10; &gt;バックアップ戦略 3-2-1ルール&lt;/a&gt;」を参照。&lt;/p&gt;&#10;&lt;h3 id="バックアップ"&gt;バックアップ&#10;&lt;/h3&gt;&lt;p&gt;バックアップすべきものは大きく分けて&lt;/p&gt;&#10;&lt;ul&gt;&#10;&lt;li&gt;&lt;code&gt;docker-compose.yml&lt;/code&gt;と&lt;code&gt;.env&lt;/code&gt;&lt;/li&gt;&#10;&lt;li&gt;データの実体 (&lt;code&gt;UPLOAD_LOCATION&lt;/code&gt;)&lt;/li&gt;&#10;&lt;li&gt;データベース（自動）&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;p&gt;となる。このうち、データベースは初期設定で自動的に吐き出されるようになっているはずだ。管理設定から確認することができる。&lt;/p&gt;&#10;&lt;p&gt;&lt;img loading="lazy" sizes="(max-width: 767px) calc(100vw - 30px), (max-width: 1023px) 700px, (max-width: 1279px) 950px, 1232px" src="https://hack-le.com/images/uploads/2025/01/image-700x455.png"&gt;&lt;/p&gt;&#10;&lt;p&gt;で、これの行先は &lt;code&gt;UPLOAD_LOCATION/backups&lt;/code&gt;なので、結果的には &lt;code&gt;UPLOAD_LOCATION&lt;/code&gt;のフォルダをそのまんまコピーすればよい設計だ。&lt;/p&gt;&#10;&lt;h3 id="リストア"&gt;リストア&#10;&lt;/h3&gt;&lt;p&gt;リストアについては、まっさらな状態を最初につくる。新しいマシンなら何もしなくていいし、既に残滓があるならば一度 &lt;code&gt;docker compose down -v&lt;/code&gt;でボリュームを削除する。以下手順をAIにまとめさせた。&lt;/p&gt;&#10;&lt;p&gt;バックアップファイルが &lt;code&gt;/path/to/backup/dump.sql.gz&lt;/code&gt; にあると仮定した手順です。&lt;/p&gt;&#10;&lt;h4 id="事前準備-コンテナの設定ファイルとファイル写真データを戻す"&gt;事前準備: コンテナの設定ファイルとファイル（写真データ）を戻す&#10;&lt;/h4&gt;&lt;p&gt;&lt;code&gt;docker-compose.yml&lt;/code&gt;と&lt;code&gt;.env&lt;/code&gt;を配置します。&lt;/p&gt;&#10;&lt;p&gt;バックアップしておいた &lt;code&gt;UPLOAD_LOCATION&lt;/code&gt; のフォルダを、&lt;code&gt;docker-compose.yml&lt;/code&gt; で指定しているパスに配置し直しておきます。&lt;/p&gt;&#10;&lt;h4 id="ステップ1既存のコンテナ環境をクリーンにする"&gt;ステップ1：既存のコンテナ環境をクリーンにする&#10;&lt;/h4&gt;&lt;p&gt;まず、既存のコンテナとDBボリュームを完全に削除します。&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-javascript" data-lang="javascript"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nx"&gt;docker&lt;/span&gt; &lt;span class="nx"&gt;compose&lt;/span&gt; &lt;span class="nx"&gt;down&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="nx"&gt;v&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h4 id="ステップ2コンテナを準備してdbだけ起動する"&gt;ステップ2：コンテナを準備してDBだけ起動する&#10;&lt;/h4&gt;&lt;p&gt;サーバー（app）が動き出す前にDBにデータを流し込む必要があるため、個別に操作します。&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-javascript" data-lang="javascript"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nx"&gt;docker&lt;/span&gt; &lt;span class="nx"&gt;compose&lt;/span&gt; &lt;span class="nx"&gt;pull&lt;/span&gt; &lt;span class="err"&gt;#&lt;/span&gt; &lt;span class="nx"&gt;最新イメージを取得&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nx"&gt;docker&lt;/span&gt; &lt;span class="nx"&gt;compose&lt;/span&gt; &lt;span class="nx"&gt;create&lt;/span&gt; &lt;span class="err"&gt;#&lt;/span&gt; &lt;span class="nx"&gt;コンテナを作成&lt;/span&gt;&lt;span class="err"&gt;（&lt;/span&gt;&lt;span class="nx"&gt;起動はしない&lt;/span&gt;&lt;span class="err"&gt;）&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nx"&gt;docker&lt;/span&gt; &lt;span class="nx"&gt;start&lt;/span&gt; &lt;span class="nx"&gt;immich_postgres&lt;/span&gt; &lt;span class="err"&gt;#&lt;/span&gt; &lt;span class="nx"&gt;DBコンテナだけを起動&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nx"&gt;sleep&lt;/span&gt; &lt;span class="mi"&gt;10&lt;/span&gt; &lt;span class="err"&gt;#&lt;/span&gt; &lt;span class="nx"&gt;DBが完全に立ち上がるまで10秒ほど待機&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h4 id="ステップ3バックアップデータを流し込む重要"&gt;ステップ3：バックアップデータを流し込む（重要）&#10;&lt;/h4&gt;&lt;p&gt;ここが一番複雑なコマンドです。解凍しながら、DBのパス設定を書き換えつつ、コンテナ内のPostgreSQLに流し込みます。&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-javascript" data-lang="javascript"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nx"&gt;gunzip&lt;/span&gt; &lt;span class="o"&gt;--&lt;/span&gt;&lt;span class="nx"&gt;stdout&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;/path/to/backup/dump.sql.gz&amp;#34;&lt;/span&gt; &lt;span class="o"&gt;\&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="o"&gt;|&lt;/span&gt; &lt;span class="nx"&gt;sed&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;s/SELECT pg_catalog.set_config(&amp;#39;search_path&amp;#39;, &amp;#39;&amp;#39;, false);/SELECT pg_catalog.set_config(&amp;#39;search_path&amp;#39;, &amp;#39;public, pg_catalog&amp;#39;, true);/g&amp;#34;&lt;/span&gt; &lt;span class="o"&gt;\&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="o"&gt;|&lt;/span&gt; &lt;span class="nx"&gt;docker&lt;/span&gt; &lt;span class="nx"&gt;exec&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="nx"&gt;i&lt;/span&gt; &lt;span class="nx"&gt;immich_postgres&lt;/span&gt; &lt;span class="nx"&gt;psql&lt;/span&gt; &lt;span class="o"&gt;--&lt;/span&gt;&lt;span class="nx"&gt;dbname&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="nx"&gt;postgres&lt;/span&gt; &lt;span class="o"&gt;--&lt;/span&gt;&lt;span class="nx"&gt;username&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="nx"&gt;postgres&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;ul&gt;&#10;&lt;li&gt;※&lt;code&gt;--username=postgres&lt;/code&gt; の部分は、&lt;code&gt;.env&lt;/code&gt;で変更している場合はその名前に変えてください。&lt;/li&gt;&#10;&lt;li&gt;※&lt;code&gt;sed&lt;/code&gt; を挟んでいるのは、Immichのリストア時に発生しやすい検索パスの不整合（テーブルが見つからないエラー）を防ぐためです。&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;h4 id="ステップ4すべてのサービスを起動する"&gt;ステップ4：すべてのサービスを起動する&#10;&lt;/h4&gt;&lt;p&gt;DBのリストアが終わったら、残りのコンテナをすべて起動します。&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-javascript" data-lang="javascript"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nx"&gt;docker&lt;/span&gt; &lt;span class="nx"&gt;compose&lt;/span&gt; &lt;span class="nx"&gt;up&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="nx"&gt;d&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id="所感"&gt;所感&#10;&lt;/h2&gt;&lt;p&gt;割と重めのセルフホストなので、基本的にはLAN内にあるPCでの公開になるのではなかろうか。http接続前提だったし、実際そういう人向けなのだと思う。インターネット使っちゃうと通信費用も馬鹿にならないしね。とはいえ外部公開用URL設定などもあるし、本当にGoogle Photoみたいな使い方もまぁできるだろう。&lt;/p&gt;&#10;&lt;p&gt;個人的には基本的にはLAN内でよく、まぁせいぜい帰省とかで人に見せたいと思った時に、一時的にCloudflare Tunnelなりなんなりで公開する、くらいかなぁ（このCloudflaret Tunnel依存しているのも、できるだけ早くやめたいところだ）。&lt;/p&gt;&#10;&lt;p&gt;現在ディレクトリで管理していた写真画像を、Immich管理にしていいかどうかは悩ましい。ディレクトリはディレクトリで検索のしやすさがあるのも事実なんよね。&lt;/p&gt;&#10;&lt;p&gt;とはいえ雑に撮影した写真とかにいちいち名前つけるのもなんだかなぁ、というのも事実なので、やはり用途でわけるのがいいのかもしれない。&lt;/p&gt;&#10;</description></item><item><title>Jellyfinでメディアサーバ、セルフホスト最初の一歩に一番いいかも</title><link>https://hack-le.com/try-jellyfin/</link><pubDate>Tue, 30 Dec 2025 00:00:00 +0900</pubDate><guid>https://hack-le.com/try-jellyfin/</guid><description>&lt;p&gt;Jellyfinの名前は知っていたが、特にメディアサーバを持ちたい欲求が最近はなかったので後回しにしていた。しかし、最近&lt;strong&gt;YouTubeを開くのもウンザリする&lt;/strong&gt;ようになっており、もう手持ちの動画をループ再生するので良いのではないか……という気持ちになった。&lt;/p&gt;&#10;&lt;p&gt;それでJellyfinをインストールしたのだけれど、配布されたバイナリを実行するだけで、かなり拍子抜けしてしまった。&lt;/p&gt;&#10;&lt;h2 id="環境"&gt;環境&#10;&lt;/h2&gt;&lt;p&gt;以下で試した。&lt;/p&gt;&#10;&lt;ul&gt;&#10;&lt;li&gt;M2 Pro Mac mini&lt;/li&gt;&#10;&lt;li&gt;GMKtec EVO-X2&#10;&lt;ul&gt;&#10;&lt;li&gt;Windows 11 Home&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;h2 id="jellyfinはメディアサーバ"&gt;Jellyfinはメディアサーバ&#10;&lt;/h2&gt;&lt;p&gt;Jellyfinは端的にいうとメディアサーバになると思うが、特徴としては以下がある。&lt;/p&gt;&#10;&lt;ul&gt;&#10;&lt;li&gt;Win/Macでバイナリ配布なので秒でインストールできる&#10;&lt;ul&gt;&#10;&lt;li&gt;むしろWin/MacではDockerよりバイナリ使ってくれやと公式ドキュメントにあった&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;/li&gt;&#10;&lt;li&gt;ユーザ管理がある（家族でそれぞれ個別に使える、権限設定あり）&lt;/li&gt;&#10;&lt;li&gt;UIがYouTubeっぽくて比較的リッチ&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;個人的なポイントはディレクトリベースであるところだ。ディレクトリ管理最強伝説を思い知らされただけの20年だった。独自管理はダメだ。&lt;strong&gt;今どんなに華々しく見えるあのサービスも、絶対終わるか有料化・高騰する&lt;/strong&gt;。&lt;strong&gt;俺の寿命のほうがサービスより長い&lt;/strong&gt;。&lt;/p&gt;&#10;&lt;p&gt;とはいえアプリケーションというのは独自の機能があるからこそであって、その管理にはやはり固有のフォーマットが必要なのも事実である。そんなわけでメタデータからは逃れられないのだけれど、そのメタデータをどう扱うのかがアプリケーションの肝と言える。&lt;/p&gt;&#10;&lt;p&gt;Jellyfinの場合、ファイルと同一の場所にメタデータを置くこともできるようなので、そういうことをすればマシン入れ替えなんかの移行も比較的スムーズかもしれない。&lt;/p&gt;&#10;&lt;h2 id="インストールの運用の所感セルフホスト最初の一歩になる"&gt;インストールの運用の所感：セルフホスト最初の一歩になる？&#10;&lt;/h2&gt;&lt;p&gt;インストールについては公式サイトからバイナリ落として実行しましたおしまい、なので本当になにもいうことがない。&lt;/p&gt;&#10;&lt;p&gt;&lt;a class="link" href="https://jellyfin.org/" target="_blank" rel="noopener"&#10; &gt;The Free Software Media System | Jellyfin&lt;/a&gt;&lt;/p&gt;&#10;&lt;p&gt;導入後はWebブラウザでアクセスし、ライブラリを追加すればよい。設定周りはメタデータの運用含めどうするか、ちょっとこの後やりながら最適解を考えていきたい。&lt;/p&gt;&#10;&lt;p&gt;一点、シャッフル再生や連続再生をしようとするとエラーが出た。&lt;/p&gt;&#10;&lt;p&gt;&lt;img loading="lazy" sizes="(max-width: 767px) calc(100vw - 30px), (max-width: 1023px) 700px, (max-width: 1279px) 950px, 1232px" src="https://hack-le.com/images/uploads/2025/12/image-5-700x474.png"&gt;&lt;/p&gt;&#10;&lt;p&gt;すべてのフォルダの起きるわけではなくて、なんだかファイルとフォルダが入り混じっているとか、ファイルの量が多いフォルダで起きている気がする。300以上の動画ファイルがあったものを分割すると、シャッフル再生できるようになったので。ちゃんと階層つくるのが重要になるかな。&lt;/p&gt;&#10;&lt;h2 id="他のも試したい"&gt;他のも試したい&#10;&lt;/h2&gt;&lt;p&gt;メディアサーバは色々あるので、他のも試していきたい。当面はフォルダの整理を進めつつ、ある程度わかってきたら「&lt;a class="link" href="https://github.com/stashapp/stash" target="_blank" rel="noopener"&#10; &gt;stashapp/stash: An organizer for your porn, written in Go. Documentation: https://docs.stashapp.cc&lt;/a&gt;」とかも試したい。&lt;/p&gt;&#10;</description></item><item><title>脱Gmailの道も一件から：1日1件アカウント変更</title><link>https://hack-le.com/datsugmail/</link><pubDate>Sun, 28 Dec 2025 00:00:00 +0900</pubDate><guid>https://hack-le.com/datsugmail/</guid><description>&lt;p&gt;少し前にConoHaのアプリケーションサーバでメールサーバを契約し、独自ドメインのメールアドレスを取得した。存外勝手が良かったので、そのまま常用している。ただ毎月605円-&amp;gt;年間7,260円というのはまぁまぁの出費なので、自宅サーバかVPSにしたい気はする。&lt;/p&gt;&#10;&lt;p&gt;今は脱Gmailを続けている。現実にはアカウントを終わらせること自体は厳しいと思うのだけれど、メールについては利用を少しずつ独自ドメインのメールに移している。&lt;/p&gt;&#10;&lt;h2 id="gmailcomに届くメルマガを減らしていく"&gt;@gmail.comに届くメルマガを減らしていく&#10;&lt;/h2&gt;&lt;p&gt;脱Gmailは技術的には何も難しいことではなく、気合と根性と覚悟の世界になる。&lt;/p&gt;&#10;&lt;p&gt;具体的には、受信メールのうちgmail.com宛に届くものについて、その原因を一つ一つ潰していく感じだ。この作業は地味で泥臭く、また時間がかかる。したがって、この作業は年単位で向き合っていくものになる。&lt;/p&gt;&#10;&lt;p&gt;&lt;strong&gt;自分はルーティンとして「1日1個はGmail登録を独自ドメインメールアドレスに変更」をだいぶ長いこと繰り返している&lt;/strong&gt;。おかげでgmail宛のメールアドレスは随分と減ってきた。というかみてみると、アカウントを取ったことすら忘れているものも多く、けっこうな数の退会手続きをした。&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;&lt;strong&gt;メールの整理は定期的にすべきことだなと思った&lt;/strong&gt;。もしかするとそんなめんどくさいことはAIにおまかせ！みたいな方向に社会は持っていきたいのかもしれないが、&lt;strong&gt;自分が何に登録したのかは、多分自分自身が把握するべきこと&lt;/strong&gt;だ。&lt;/p&gt;&#10;&lt;p&gt;とはいえ、メールの履歴から登録しているメルマガの一覧とそれぞれの直近10件みたいなまとめは自動で作ってくれると助かるよなぁ、と思ったりはする。しかしそういうサービスは難しいだろう。理由は&lt;strong&gt;ビジネスと権限、そしてなによりコストの問題&lt;/strong&gt;になる。&lt;/p&gt;&#10;&lt;p&gt;まず&lt;strong&gt;ビジネスの観点では、資本主義社会は1通でも多くのメルマガをぶっ飛ばしたいのであって、解除させたいのではない&lt;/strong&gt;。解除のサポートをしてほしい企業はないし、かといってユーザもそれに金を払うかといえば微妙だ。&lt;/p&gt;&#10;&lt;p&gt;次に&lt;strong&gt;権限の観点で、さまざまなサーバでされているメールを整理する権限は、実はかなり強力&lt;/strong&gt;で、クライアントと同然の権限、あるいはすべてのメールを閲覧する権限を与える必要がある。これは既存のいわゆるSaaS的なサービスではだいぶ厳しいだろう。&lt;/p&gt;&#10;&lt;p&gt;では既存のメールクライアントアプリの機能としては？これは技術的には筋が良い。現在そういう機能は聞かないが、方向性的にはあり。しかしここで問題になるのは、おそらく&lt;strong&gt;すべてのメールをLLMに食わせるコスト&lt;/strong&gt;になる。&lt;/p&gt;&#10;&lt;p&gt;APIをある程度使えばわかるが、LLMのコストは存外高い。かといってローカルLLMでやるにも、日本語認知ならやはり120Bとか70Bくらいのパラメータが欲しくなるし、そうするとそれなりのAI PCが必要になってしまう。まぁ僕はそういうことができるPCを持っているので、考えてみると暇つぶしに頑張ってみてもよかったかもしれない。&lt;/p&gt;&#10;&lt;h2 id="いつかは自宅サーバ"&gt;いつかは自宅サーバ？&#10;&lt;/h2&gt;&lt;p&gt;書きながら、&lt;strong&gt;LLMにメールの整理をさせるのはけっこう良いなぁ&lt;/strong&gt;と思えてきた。自前のアカウントならメールの取得も割合楽にできるし、時間があったらやってみようか。&lt;/p&gt;&#10;&lt;p&gt;あと当面はConoHaのアプリケーションサーバを使っているものの、どうせ24時間サーバを動かしているので、自宅サーバにしたい気持ちもある。ただメールの受信となると安定性にまだ自信がない。まぁ2026年の目標かなぁ。&lt;/p&gt;&#10;&lt;p&gt;以下、ConoHaの話題でいつも貼るクーポン広告。過去3人くらい登録してくれた人がいる。&lt;/p&gt;&#10;&lt;p&gt;&lt;a class="link" href="https://www.conoha.jp/referral/?token=nNgrOjEEXwCVfvRYHJSDh.zn3QtmUyxWoTDKxWHvrZSWHGWKZ3o-HER" target="_blank" rel="noopener"&#10; &gt;お友達紹介&lt;/a&gt;&lt;/p&gt;&#10;&lt;p&gt;こっから飛んで使い始めてもらったら1000円分のクーポンがもらえる（&lt;a class="link" href="https://www.conoha.jp/conotomo/" target="_blank" rel="noopener"&#10; &gt;このとも ～友達紹介～｜レンタルサーバーならConoHa&lt;/a&gt;）。そして定常的に使ったら僕に2000円分のクーポンが入る。クーポンが入るとなんか色々遊んで適当にレビューするかもしれない。&lt;/p&gt;&#10;&lt;p&gt;&amp;lt;関連記事&amp;gt;&lt;/p&gt;&#10;&lt;div class="blog-card-wrapper"&gt;&#10; &lt;a href="https://hack-le.com/conoha-mail-server/" class="blog-card"&gt;&#10; &lt;div class="blog-card-content"&gt;&#10; &lt;div class="blog-card-label"&gt;&#10; &lt;svg xmlns="http://www.w3.org/2000/svg" width="13" height="13" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"&gt;&lt;path d="M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.71"&gt;&lt;/path&gt;&lt;path d="M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71"&gt;&lt;/path&gt;&lt;/svg&gt;&#10; &lt;span&gt;あわせて読みたい&lt;/span&gt;&#10; &lt;/div&gt;&#10; &lt;div class="blog-card-title"&gt;ConoHaのメールサーバ（アプリケーションサーバ）をやってみたが簡単過ぎて言うことがない&lt;/div&gt;&#10; &lt;div class="blog-card-url"&gt;/conoha-mail-server/&lt;/div&gt;&#10; &lt;/div&gt;&#10; &lt;div class="blog-card-thumbnail"&gt;&#10; &lt;img src="https://hack-le.com/images/uploads/2026/09/eyecatch_33887_1789622366.webp" alt="ConoHaのメールサーバ（アプリケーションサーバ）をやってみたが簡単過ぎて言うことがない" 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/googlegmail/" class="blog-card"&gt;&#10; &lt;div class="blog-card-content"&gt;&#10; &lt;div class="blog-card-label"&gt;&#10; &lt;svg xmlns="http://www.w3.org/2000/svg" width="13" height="13" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"&gt;&lt;path d="M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.71"&gt;&lt;/path&gt;&lt;path d="M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71"&gt;&lt;/path&gt;&lt;/svg&gt;&#10; &lt;span&gt;あわせて読みたい&lt;/span&gt;&#10; &lt;/div&gt;&#10; &lt;div class="blog-card-title"&gt;趣味としての脱Googleその4 Gmail編:「技術的には可能です」……けど&lt;/div&gt;&#10; &lt;div class="blog-card-url"&gt;/googlegmail/&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/10/image.webp" alt="趣味としての脱Googleその4 Gmail編:「技術的には可能です」……けど" loading="lazy" /&gt;&#10; &lt;/div&gt;&#10; &lt;/a&gt;&#10;&lt;/div&gt;&#10;&#10;</description></item><item><title>脱Dropboxを進めている</title><link>https://hack-le.com/datsudropbox/</link><pubDate>Mon, 01 Dec 2025 00:00:00 +0900</pubDate><guid>https://hack-le.com/datsudropbox/</guid><description>&lt;p&gt;随分前に3年契約していたDropboxの契約がそろそろ切れるため、本格的に移行の準備をしている。&lt;/p&gt;&#10;&lt;p&gt;&lt;strong&gt;移行の理由としては、サブスクの高額さ、不要なインターネット通信、自分のデータを監視される不気味さなどが嫌になったから&lt;/strong&gt;。Dropbox自体は、他のSaaSと比べると今なお良心的で頑張ってるサービスだとは思っているけどね。まぁ僕はもういいよ。実家に帰らせていただきます。&lt;/p&gt;&#10;&lt;p&gt;ここまでにやったことを軽くまとめる。&lt;/p&gt;&#10;&lt;h2 id="ファイル同期"&gt;ファイル同期&#10;&lt;/h2&gt;&lt;p&gt;ファイルの同期どうするの問題。まずファイル同期については、Dropbox最強伝説には違いなくて、同じ精度で扱えるとは考えないほうがよいのではないか。&lt;/p&gt;&#10;&lt;h3 id="qnap-nas--qsync"&gt;QNAP NAS + QSync&#10;&lt;/h3&gt;&lt;p&gt;特定のハードウェアに思い切り依存しているわけだが、前から持っていたので使っている感じだ。別に商用が嫌なのではなくサブスクが嫌なので、ハードウェアに付属するソフトウェアは個人的にアリだと思っている。&lt;/p&gt;&#10;&lt;p&gt;ただまぁ、Dropboxのような精度で同期ができるわけではない。というかDropboxの精度が異常なのだと思う。なのであくまでも「同期できたら便利だよね」というフォルダを狙って使うほうがいいだろう。&lt;/p&gt;&#10;&lt;div class="blog-card-wrapper"&gt;&#10; &lt;a href="https://hack-le.com/dropbox-qsync/" 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内DropboxとはいかないQsyncの使いどころ&lt;/div&gt;&#10; &lt;div class="blog-card-url"&gt;/dropbox-qsync/&lt;/div&gt;&#10; &lt;/div&gt;&#10; &lt;div class="blog-card-thumbnail"&gt;&#10; &lt;img src="https://hack-le.com/images/uploads/2026/09/eyecatch_12931_1789621424.webp" alt="LAN内DropboxとはいかないQsyncの使いどころ" 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;h3 id="nextcloud"&gt;Nextcloud&#10;&lt;/h3&gt;&lt;p&gt;オフィスソフトをWebアプリとして使いたかったので、Collabora Onlineの基盤として以前構築した。ファイル同期もそりゃできる。&lt;/p&gt;&#10;&lt;div class="blog-card-wrapper"&gt;&#10; &lt;a href="https://hack-le.com/nextcloud-on-mac-collabora-online-web/" 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;Nextcloud on Mac &amp;#43; Collabora OnlineでWebアプリのオフィスをセルフホストで&lt;/div&gt;&#10; &lt;div class="blog-card-url"&gt;/nextcloud-on-mac-collabora-online-web/&lt;/div&gt;&#10; &lt;/div&gt;&#10; &lt;div class="blog-card-thumbnail"&gt;&#10; &lt;img src="https://hack-le.com/images/uploads/2025/10/output-55.webp" alt="Nextcloud on Mac &amp;#43; Collabora OnlineでWebアプリのオフィスをセルフホストで" loading="lazy" /&gt;&#10; &lt;/div&gt;&#10; &lt;/a&gt;&#10;&lt;/div&gt;&#10;&#10;&lt;p&gt;ただ構築の手間はけっこうあるし、重いソフトではあるので、常用したい感じではない。Webアプリとしてのオフィスソフトの使い勝手も思ったほどよくなかったので、結局ローカルでいいんじゃないですかとなってしまった。&lt;/p&gt;&#10;&lt;p&gt;せっかく構築したので運用はしているものの、QSyncがメインになっており、こちらは本格的に使っているわけではないので、同期の精度なんかはまだよくわかっていない。&lt;/p&gt;&#10;&lt;h3 id="seafile"&gt;Seafile&#10;&lt;/h3&gt;&lt;p&gt;単にファイル同期したいだけという向きでは、Nextcloudは重たいので、Seafileあたり良いのかなぁと思っていたが、調べるとけっこう苦労されている先人の軌跡など見るにつけ、あんまりやろうという気になっていない（「&lt;a class="link" href="https://chienomi.org/articles/linux/202508-seafile.html" target="_blank" rel="noopener"&#10; &gt;NextCloudを廃止してSeafileを採用 - Chienomi&lt;/a&gt;」）。&lt;/p&gt;&#10;&lt;p&gt;まぁNextcloudがあんまりよくないな、ってなったら試してみる感じかなぁ。&lt;/p&gt;&#10;&lt;h2 id="webブラウザから見る"&gt;Webブラウザから見る&#10;&lt;/h2&gt;&lt;p&gt;Dropboxの地味に大事な機能として、Webブラウザベースのアクセスがある。&lt;/p&gt;&#10;&lt;h3 id="file-browser"&gt;File Browser&#10;&lt;/h3&gt;&lt;p&gt;名前がまんま過ぎてThe Band的な意気を感じつつ、軽量かつ簡単に構築できて、便利なので、気に入っている。下記記事を書いてから使っているが、特に今のところ不便はない。&lt;/p&gt;&#10;&lt;div class="blog-card-wrapper"&gt;&#10; &lt;a href="https://hack-le.com/web-file-browser/" 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ベースのファイラFile Browserを試す：こういうのでいいんだよ&lt;/div&gt;&#10; &lt;div class="blog-card-url"&gt;/web-file-browser/&lt;/div&gt;&#10; &lt;/div&gt;&#10; &lt;div class="blog-card-thumbnail"&gt;&#10; &lt;img src="https://hack-le.com/images/uploads/2026/09/eyecatch_19184_1788943570.webp" alt="WebベースのファイラFile Browserを試す：こういうのでいいんだよ" loading="lazy" /&gt;&#10; &lt;/div&gt;&#10; &lt;/a&gt;&#10;&lt;/div&gt;&#10;&#10;&lt;h3 id="nextcloud-1"&gt;Nextcloud&#10;&lt;/h3&gt;&lt;p&gt;Nextcloudを構築するなら、Webブラウザからの操作も可能、というかファイル同期よりこれが一番安定するのはそう。まぁ一番わかりやすく置き換えるならNextcloudなんだろうね。&lt;/p&gt;&#10;&lt;h2 id="お外で聴ける音楽サーバメディアサーバ"&gt;お外で聴ける音楽サーバ、メディアサーバ&#10;&lt;/h2&gt;&lt;p&gt;外でスマホから自宅の音楽データをストリーミングで流したい。&lt;/p&gt;&#10;&lt;h3 id="webdav"&gt;WebDAV&#10;&lt;/h3&gt;&lt;p&gt;WebDAVサーバをたてて、対応しているクライアントアプリを使う。&lt;/p&gt;&#10;&lt;p&gt;自分はサーバはQNAPの機能を使い、スマホのクライアントアプリはCloudBeatsを使っている。CloudBeatsはファイルベース管理にストリーミングとダウンロードの機能があって使いやすい。NAT越えはCloudflare Tunnel使っている。気が向いたらVPSで自分でトンネル作るかも。&lt;/p&gt;&#10;&lt;div class="blog-card-wrapper"&gt;&#10; &lt;a href="https://hack-le.com/android-cloudbeats-qnap-nas-cloudflare%e3%81%a7%e5%a4%96%e3%81%a7nas%e3%81%ae%e9%9f%b3%e6%a5%bd%e3%82%92%e3%82%b9%e3%83%88%e3%83%aa%e3%83%bc%e3%83%9f%e3%83%b3%e3%82%b0%e3%82%aa%e3%83%95/" 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 &amp;#43; CloudBeats &amp;#43; QNAP NAS &amp;#43; Cloudflareで外でNASの音楽をストリーミング&amp;amp;オフライン再生する&lt;/div&gt;&#10; &lt;div class="blog-card-url"&gt;/android-cloudbeats-qnap-nas-cloudflareで外でnasの音楽をストリーミングオフ/&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_18934_1787181644.webp" alt="Android &amp;#43; CloudBeats &amp;#43; QNAP NAS &amp;#43; Cloudflareで外でNASの音楽をストリーミング&amp;amp;オフライン再生する" loading="lazy" /&gt;&#10; &lt;/div&gt;&#10; &lt;/a&gt;&#10;&lt;/div&gt;&#10;&#10;&lt;h3 id="nextcloud-2"&gt;Nextcloud&#10;&lt;/h3&gt;&lt;p&gt;Nextcloudもアプリ側で対応していることが多い。&lt;/p&gt;&#10;&lt;h3 id="jellyfin"&gt;Jellyfin&#10;&lt;/h3&gt;&lt;p&gt;音楽というよりメディアサーバなわけだが、Cloudflare TunnelなどでNAT越えすれば楽。一番楽かも。&lt;/p&gt;&#10;&lt;h2 id="スマホの写真やスクショをpcに転送する"&gt;スマホの写真やスクショをPCに転送する&#10;&lt;/h2&gt;&lt;p&gt;個人的なユースケースとして、スマホやタブレットの写真をPCに転送する、は地味にDropboxの有用な活用ポイントだった。Webベースでアップロードしても別にいいんだが、もうちょっとサクッとPCに転送したいと思った。&lt;/p&gt;&#10;&lt;h3 id="kde-connect"&gt;KDE Connect&#10;&lt;/h3&gt;&lt;p&gt;起動して「ファイルを転送する」ですぐ転送できてよい。&lt;/p&gt;&#10;&lt;p&gt;Dropbox的な文脈とは関係ないが、PCからスマホ、またはスマホからPCを操作できて便利である。&lt;/p&gt;&#10;&lt;div class="blog-card-wrapper"&gt;&#10; &lt;a href="https://hack-le.com/kde-connect-lan-android-pc/" 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;KDE ConnectでLAN内のAndroid -&amp;gt; PC にファイル送信する&lt;/div&gt;&#10; &lt;div class="blog-card-url"&gt;/kde-connect-lan-android-pc/&lt;/div&gt;&#10; &lt;/div&gt;&#10; &lt;div class="blog-card-thumbnail"&gt;&#10; &lt;img src="https://hack-le.com/images/uploads/2025/11/output-31.webp" alt="KDE ConnectでLAN内のAndroid -&amp;gt; PC にファイル送信する" loading="lazy" /&gt;&#10; &lt;/div&gt;&#10; &lt;/a&gt;&#10;&lt;/div&gt;&#10;&#10;&lt;h3 id="immich"&gt;Immich&#10;&lt;/h3&gt;&lt;p&gt;単純なバックアップ用途では多分一番便利。&lt;/p&gt;&#10;&lt;p&gt;Google Photo代替的な写真管理ソフトなので、ファイルベースの管理には向いていないものの、実際のところこちらのほうが多くの人のユースケースには合っている気がする。&lt;/p&gt;&#10;&lt;h2 id="所感-nasでもいいか"&gt;所感: NASでもいいか&#10;&lt;/h2&gt;&lt;p&gt;なんかこうして記述していると、&lt;strong&gt;けっこうNASを使っているなと思った&lt;/strong&gt;。まぁもちろん自前で構築することもそりゃできるんだが、面倒くさい。別に僕は金を払いたくないのではなく、サブスクや不要なインターネット通信、自分のデータを監視されるのが嫌なので、NASを買うのに金を払う分には別に、という感じ。いざとなればNextcloud使えるのはわかったし。&lt;/p&gt;&#10;&lt;p&gt;まぁ余っているPCをLinuxサーバとして使いたい、という向きなら頑張ればいいだろうが、そうでないなら、NASはそれなりにいいもんなんじゃないか。&lt;/p&gt;&#10;&lt;p&gt;[itemlink post_id=&amp;ldquo;15811&amp;rdquo;]&lt;/p&gt;&#10;</description></item><item><title>GMKtec EVO-X2 + Open WebUI + LM Studio + gpt-oss-120b の手順と雑感</title><link>https://hack-le.com/gmktec-evo-x2-open-webui-lm-studio-gpt-oss-120b/</link><pubDate>Fri, 21 Nov 2025 00:00:00 +0900</pubDate><guid>https://hack-le.com/gmktec-evo-x2-open-webui-lm-studio-gpt-oss-120b/</guid><description>&lt;p&gt;30万円で買ったGMKtec EVO-X2をフル活用するべく、色々といじっている。チャット機能はやはりほしいのでいじる。&lt;/p&gt;&#10;&lt;h2 id="環境と構成"&gt;環境と構成&#10;&lt;/h2&gt;&lt;ul&gt;&#10;&lt;li&gt;ホストマシン&#10;&lt;ul&gt;&#10;&lt;li&gt;Intel Mac mini 2018&#10;&lt;ul&gt;&#10;&lt;li&gt;Docker Desktop for Mac 4.51.0&lt;/li&gt;&#10;&lt;li&gt;Open WebUI&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;GMKtec EVO-X2&#10;&lt;ul&gt;&#10;&lt;li&gt;Ryzen AI Max+ 395&lt;/li&gt;&#10;&lt;li&gt;128GB&lt;/li&gt;&#10;&lt;li&gt;Windows 11&lt;/li&gt;&#10;&lt;li&gt;LM Studio 0.3.30&#10;&lt;ul&gt;&#10;&lt;li&gt;gpt-oss-120b&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;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;p&gt;ホストマシンはM2 Pro Mac mini + OrbStackでもやった。&lt;/p&gt;&#10;&lt;p&gt;LM Studioはインストールして、モデルを入れているものとする。&lt;/p&gt;&#10;&lt;p&gt;ざっくり構成&lt;/p&gt;&#10;&lt;pre class="mermaid" style="visibility:hidden"&gt;graph LR&#10;subgraph Mac&#10;subgraph OrbStack&#10;web(Open WebUI)&#10;end&#10;end&#10;subgraph EVO-X2&#10;subgraph LM Studio&#10;gpt(gpt-oss-120b)&#10;end&#10;end&#10;user(User)&#10;user --&gt; web&#10;web --&gt; gpt&lt;/pre&gt;&lt;h2 id="ざっくり手順"&gt;ざっくり手順&#10;&lt;/h2&gt;&lt;h3 id="lm-studio入れてapi使えるようにする"&gt;LM Studio入れてAPI使えるようにする&#10;&lt;/h3&gt;&lt;p&gt;公式サイトからインストールするだけ。APIサーバは左側のタブの2番目。&lt;/p&gt;&#10;&lt;p&gt;&lt;img loading="lazy" sizes="(max-width: 767px) calc(100vw - 30px), (max-width: 1023px) 700px, (max-width: 1279px) 950px, 1232px" src="https://hack-le.com/images/uploads/2025/11/image-9-700x227.png"&gt;&lt;/p&gt;&#10;&lt;p&gt;IPアドレスとかも表示される。ポート番号は1234。以下で確認する。&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;curl http://IP:1234/v1/models&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h3 id="evo-x2-vramを64gb---96gbにする"&gt;EVO-X2 VRAMを64GB -&amp;gt; 96GBにする&#10;&lt;/h3&gt;&lt;p&gt;一応。&lt;/p&gt;&#10;&lt;div class="blog-card-wrapper"&gt;&#10; &lt;a href="https://hack-le.com/windows-11-init/" 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;Windows 11で入れているアプリやキーボードの設定（Emacsキーバインド）&lt;/div&gt;&#10; &lt;div class="blog-card-url"&gt;/windows-11-init/&lt;/div&gt;&#10; &lt;/div&gt;&#10; &lt;div class="blog-card-thumbnail"&gt;&#10; &lt;img src="https://hack-le.com/images/uploads/2025/11/output-4.webp" alt="Windows 11で入れているアプリやキーボードの設定（Emacsキーバインド）" loading="lazy" /&gt;&#10; &lt;/div&gt;&#10; &lt;/a&gt;&#10;&lt;/div&gt;&#10;&#10;&lt;p&gt;割り当てについてはLM Studioで確認できる。&lt;/p&gt;&#10;&lt;p&gt;&lt;img loading="lazy" sizes="(max-width: 767px) calc(100vw - 30px), (max-width: 1023px) 700px, (max-width: 1279px) 950px, 1232px" src="https://hack-le.com/images/uploads/2025/11/image-6-700x257.png"&gt;&lt;/p&gt;&#10;&lt;p&gt;AMDのソフトウェアからも変更できそうに見えるが、なんぼやっても変更されなかった。結局BIOSだよ。ESC押しまくってBIOSに入ったら、それっぽい項目を探す。それっぽいところに潜っていくと「UMA Frame Buffer Size」という名前のやつがあるから、それ。&lt;/p&gt;&#10;&lt;h3 id="open-webui-のインストール"&gt;Open WebUI のインストール&#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;version: &lt;span class="s1"&gt;&amp;#39;3.8&amp;#39;&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;services:&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; open-webui:&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; image: ghcr.io/open-webui/open-webui:main&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; container_name: open-webui&#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; 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;8080:8080&amp;#34;&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; - open-webui:/app/backend/data&#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;volumes:&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; open-webui:&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="c1"&gt;# Dockerにボリュームを管理させるデフォルト設定&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;http://IPアドレス:ポート&lt;/code&gt;にアクセスすると、最初に管理者ユーザを作成することになる。&lt;/p&gt;&#10;&lt;h3 id="open-webui-から-lm-studioを繋げる"&gt;Open WebUI から LM Studioを繋げる&#10;&lt;/h3&gt;&lt;p&gt;ユーザアイコンから管理者パネルを開いて、「接続」タブ。&lt;/p&gt;&#10;&lt;ul&gt;&#10;&lt;li&gt;接続タイプ: ローカル&lt;/li&gt;&#10;&lt;li&gt;URL: &lt;code&gt;http://LM StudioあるマシンのIPアドレス:1234/v1&lt;/code&gt;&lt;/li&gt;&#10;&lt;li&gt;認証: なし&lt;/li&gt;&#10;&lt;li&gt;Provider TYpe: OpenAI&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;p&gt;そしたらチャットで選択できるようになる。&lt;/p&gt;&#10;&lt;p&gt;&lt;img loading="lazy" sizes="(max-width: 767px) calc(100vw - 30px), (max-width: 1023px) 700px, (max-width: 1279px) 950px, 1232px" src="https://hack-le.com/images/uploads/2025/11/image-7-700x227.png"&gt;&lt;/p&gt;&#10;&lt;p&gt;なんか適当に話す。&lt;/p&gt;&#10;&lt;p&gt;&lt;img loading="lazy" sizes="(max-width: 767px) calc(100vw - 30px), (max-width: 1023px) 700px, (max-width: 1279px) 950px, 1232px" src="https://hack-le.com/images/uploads/2025/11/image-8-700x170.png"&gt;&lt;/p&gt;&#10;&lt;h2 id="gpt-oss-120bとの会話の雑感"&gt;gpt-oss-120bとの会話の雑感&#10;&lt;/h2&gt;&lt;p&gt;とりあえず日本語で話す限りは阿呆だなぁと思う。&lt;strong&gt;絶妙に話が通じなくて、あまり話す気がしない&lt;/strong&gt;。GPT-3.5の時はどうだったかなぁ。英語だともうちょっとマシなんだろうか。&lt;/p&gt;&#10;&lt;p&gt;&lt;strong&gt;Geminiの無料枠は非常に大きいという現状、正直宗教的な理由以外でわざわざgpt-oss-120bを使ってチャットする理由はちょっと思い当たらない&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;strong&gt;インターネットから隔絶された環境でもけっこうな知にアクセスができる&lt;/strong&gt;、というのは非常に大きいのではないか、と思われる。いつまでもあると思うなインターネット。真面目な話、ネットに繋がせてもらえない環境は実在するので、そういうところにあると神になると思われる……が、そんなところで30万円するEVO-X2を導入できんか。つらいなぁ。&lt;/p&gt;&#10;</description></item><item><title>LAN内のGiteaをCloudflare Tunnel経由で公開する</title><link>https://hack-le.com/lan-gitea-cloudflare-tunnel/</link><pubDate>Tue, 11 Nov 2025 00:00:00 +0900</pubDate><guid>https://hack-le.com/lan-gitea-cloudflare-tunnel/</guid><description>&lt;p&gt;LAN内でええやんと思っていたのだが、色々と面倒臭くなったので、結局外部公開する。例によってCloudflare Tunnel経由で……。&lt;/p&gt;&#10;&lt;h2 id="環境"&gt;環境&#10;&lt;/h2&gt;&lt;ul&gt;&#10;&lt;li&gt;M2 Pro Mac mini, Intel Mac mini 2018&lt;/li&gt;&#10;&lt;li&gt;macOS 14.7.7 (Sonoma)&lt;/li&gt;&#10;&lt;li&gt;gitea 1.24.5 (via brew)&lt;/li&gt;&#10;&lt;li&gt;&lt;code&gt;brew services start gitea&lt;/code&gt;で起動&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;h2 id="構成"&gt;構成&#10;&lt;/h2&gt;&lt;pre class="mermaid" style="visibility:hidden"&gt;graph TD&#10;cfi(Cloudflare)&#10;cfi --&gt; cf&#10;subgraph LAN&#10;cf(Cloudflare Tunnel)&#10;gitea(Gitea)&#10;end&#10;cf --&gt;|プライベートIP| gitea&lt;/pre&gt;&lt;p&gt;Giteaから見るとリバースプロキシを噛ませたような感じになる。&lt;/p&gt;&#10;&lt;h2 id="手順"&gt;手順&#10;&lt;/h2&gt;&lt;h3 id="サインアップの禁止"&gt;サインアップの禁止&#10;&lt;/h3&gt;&lt;div class="blog-card-wrapper"&gt;&#10; &lt;a href="https://hack-le.com/gitea-on-mac-signup/" class="blog-card"&gt;&#10; &lt;div class="blog-card-content"&gt;&#10; &lt;div class="blog-card-label"&gt;&#10; &lt;svg xmlns="http://www.w3.org/2000/svg" width="13" height="13" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"&gt;&lt;path d="M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.71"&gt;&lt;/path&gt;&lt;path d="M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71"&gt;&lt;/path&gt;&lt;/svg&gt;&#10; &lt;span&gt;あわせて読みたい&lt;/span&gt;&#10; &lt;/div&gt;&#10; &lt;div class="blog-card-title"&gt;Gitea on Macのサインアップ（登録）を禁止する&lt;/div&gt;&#10; &lt;div class="blog-card-url"&gt;/gitea-on-mac-signup/&lt;/div&gt;&#10; &lt;/div&gt;&#10; &lt;div class="blog-card-thumbnail"&gt;&#10; &lt;img src="https://hack-le.com/images/uploads/2025/10/output-73.webp" alt="Gitea on Macのサインアップ（登録）を禁止する" loading="lazy" /&gt;&#10; &lt;/div&gt;&#10; &lt;/a&gt;&#10;&lt;/div&gt;&#10;&#10;&lt;h3 id="既存リポジトリを最新に反映する"&gt;既存リポジトリを最新に反映する&#10;&lt;/h3&gt;&lt;p&gt;remoteと差分があると面倒くさくなるので、できるだけ最新を反映しておく。&lt;/p&gt;&#10;&lt;h3 id="web画面の設定"&gt;Web画面の設定&#10;&lt;/h3&gt;&lt;p&gt;Cloudflare TunnelでWebの外部公開用のサブドメインを作成する。&lt;/p&gt;&#10;&lt;p&gt;&lt;code&gt;app.ini&lt;/code&gt;の&lt;code&gt;[server]&lt;/code&gt;より以下となるようにする。&lt;/p&gt;&#10;&lt;table&gt;&#10;&#9;&lt;thead&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;th&gt;項目&lt;/th&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;th&gt;値&lt;/th&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;th&gt;説明&lt;/th&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&lt;/thead&gt;&#10;&#9;&lt;tbody&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;&lt;code&gt;PROTOCOL&lt;/code&gt;&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;&lt;code&gt;http&lt;/code&gt;&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;CloudflareがHTTPSを終端&lt;/td&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;&lt;code&gt;HTTP_ADDR&lt;/code&gt;（または&lt;code&gt;DOMAIN&lt;/code&gt;）&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;&lt;code&gt;127.0.0.1&lt;/code&gt;&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;Giteaが実際に待ち受けるアドレス&lt;/td&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;&lt;code&gt;HTTP_PORT&lt;/code&gt;&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;&lt;code&gt;3000&lt;/code&gt;&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;内部ポート（自由）&lt;/td&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;&lt;code&gt;ROOT_URL&lt;/code&gt;&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;&lt;code&gt;https://git.example.com/&lt;/code&gt;&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;外部公開URL&lt;/td&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&lt;/tbody&gt;&#10;&lt;/table&gt;&#10;&lt;p&gt;https経由ではこれでできる。&lt;/p&gt;&#10;&lt;h3 id="やるならsshの設定"&gt;（やるなら）sshの設定&#10;&lt;/h3&gt;&lt;p&gt;sshを使う場合、Cloudflareでssh用の別口のサブドメインを作成し、ssh over httpsでアクセスする。Web用の設定と併せて以下のような感じになる。&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="o"&gt;[&lt;/span&gt;server&lt;span class="o"&gt;]&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nv"&gt;PROTOCOL&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; http&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nv"&gt;DOMAIN&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; 127.0.0.1&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nv"&gt;HTTP_PORT&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; Web用ポート&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nv"&gt;ROOT_URL&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; https://Web用ドメイン&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nv"&gt;DISABLE_SSH&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nb"&gt;false&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nv"&gt;START_SSH_SERVER&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nb"&gt;true&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nv"&gt;SSH_DOMAIN&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; SSH用ドメイン&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nv"&gt;SSH_PORT&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="m"&gt;22&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nv"&gt;LFS_START_SERVER&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nb"&gt;true&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nv"&gt;LFS_JWT_SECRET&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; hoge&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nv"&gt;OFFLINE_MODE&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nb"&gt;false&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;サーバーは再起動する。&lt;/p&gt;&#10;&lt;p&gt;クライアント側でover httpsをとなるように &lt;code&gt;~/.ssh/config&lt;/code&gt;に以下を入れる。&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;Host SSH用ドメイン&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; ProxyCommand cloudflared access ssh --hostname %h&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; User SSHユーザ名&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h3 id="既存のリポジトリでremote変更"&gt;既存のリポジトリでremote変更&#10;&lt;/h3&gt;&lt;p&gt;現在の設定の確認。&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;git remove -v&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;これを置き換える。Web画面からリポジトリを見て、ssh用のcloneコマンドから以下のように置き換え。&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;git remote set-url origin SSHユーザ名@SSHドメイン:user/repo.git&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;動作確認。&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;git fetch origin&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;git push origin main&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;リモートにコミットがあってマージするなら &lt;code&gt;git pull --rebase origin master&lt;/code&gt;、強制的に上書きするときは&lt;code&gt;git push -f&lt;/code&gt;。&lt;/p&gt;&#10;</description></item><item><title>RSSフィードの音声を垂れ流したいが、良いものが見つからないので</title><link>https://hack-le.com/rss-feed-tts/</link><pubDate>Sat, 08 Nov 2025 00:00:00 +0900</pubDate><guid>https://hack-le.com/rss-feed-tts/</guid><description>&lt;p&gt;&lt;strong&gt;あらゆることが出来るのに、やりたいことだけピンポイントが出来ない気がして仕方が無い昨今、関心のある、あるいはあるべきニュースを流し聞き、流し見したいという基本的なニーズは案外満たされない&lt;/strong&gt;。これに近いのはテレビのニュースかもしれないが、テレビで報道される内容は偏っている……あるいは、偏ってなさすぎており、遠くの強盗事件がわかる一方で、今興味のあるミニPCのセール情報は流れてこない。YouTubeのニュース系ライブも同様（ついでにライブとは名ばかりでループするし、かえって不便）。&lt;/p&gt;&#10;&lt;p&gt;個人的に指定した情報源を巡回するものとして、RSSは今なお有効、というかRSSくらいしかないのが実情だ。このためにRSSリーダーを使うことになるが、RSSリーダーは当然RSSを読むものなので、&lt;strong&gt;目と手を奪われる&lt;/strong&gt;。複数端末で使う時は&lt;strong&gt;同期の問題&lt;/strong&gt;も生じる。また、世情のためか、Pro版と称して&lt;strong&gt;高い高いサブスクプラン&lt;/strong&gt;に入れさせたがる。&lt;/p&gt;&#10;&lt;p&gt;そこで、&lt;strong&gt;RSSを音声で垂れ流しできると、それなりの体験になるのではないかと思った&lt;/strong&gt;。こんなアプリたくさんありそうだ、と思ったのだけれど、調べて見るとそうでもない……というかそういえば、&lt;strong&gt;RSSリーダアプリ自体が絶滅危惧種に指定されつつある昨今だったかもしれない&lt;/strong&gt;。&lt;/p&gt;&#10;&lt;p&gt;「&lt;a class="link" href="https://voicefeed.web.app/articles/rss-voice-feed/ja/" target="_blank" rel="noopener"&#10; &gt;RSSを音声で聴きたいという話&lt;/a&gt;」のようなのを見ると、音声で聞きたいというニーズのためだけにアプリを作ることになったようなので、スキマだったりするんだろうか。インストールしてみたところ、シンプルで良いアプリだと思ったが、自分の元々あるフィードを登録するような感じではない。というかプレミアムが$15/月でサブスクであるため、対象外になる。&lt;/p&gt;&#10;&lt;p&gt;RSSリーダというのは、データ収集・解析と、それを表示して読む・読んだものをマークする、と分かれるわけだが、&lt;strong&gt;これを同期しようとしたときに、どうしても中央サーバが必要&lt;/strong&gt;になり、SaaS的にやろうとするならこれの負荷がしんどい、という実情はわかる。とはいえ&lt;strong&gt;サブスクならInoreader ProでTTSを使う&lt;/strong&gt;かな……。&lt;/p&gt;&#10;&lt;p&gt;結局のところ、ないんだね、僕がほしいものは。これというのも、サーバの問題がまずあるからだ。サーバの運用負荷を考えると、無料はありえない。わかる。じゃあ、サーバを自分でたてればいいじゃないか、となる。「&lt;a class="link" href="https://github.com/tt-rss/tt-rss" target="_blank" rel="noopener"&#10; &gt;GitHub - tt-rss/tt-rss: A free, flexible, open-source, web-based news feed (RSS/Atom/other) reader and aggregator.&lt;/a&gt;」を今度試してみるか、と思ったが、すると今度はリーダをどうしよう問題が勃発するんだね。これも作るしかないんだろうね。&lt;/p&gt;&#10;&lt;p&gt;っていうか、Tiny Tiny RSSの人、止めるみたいね（「&lt;a class="link" href="https://alternativeto.net/news/2025/10/tiny-tiny-rss-to-shut-down-as-developer-ends-project-entirely-by-november-1st-2025/" target="_blank" rel="noopener"&#10; &gt;Tiny Tiny RSS to shut down as developer ends project entirely by November 1st, 2025 | AlternativeTo&lt;/a&gt;」）……やっぱりOSSってたいへんなんだな。&lt;/p&gt;&#10;&lt;p&gt;「&lt;a class="link" href="https://freshrss.org/index.html" target="_blank" rel="noopener"&#10; &gt;FreshRSS, a free, self-hostable feeds aggregator&lt;/a&gt;」あたりも候補か。APIが使えればなんでもよい。あるいはLAN内なら自作もあるような気はする。&lt;/p&gt;&#10;&lt;p&gt;ということで次のセルフホストはRSSサーバ、さようならFeedly、までいけるかどうかはわからない。&lt;/p&gt;&#10;</description></item><item><title>Nextcloud on Mac + Collabora OnlineでWebアプリのオフィスをセルフホストで</title><link>https://hack-le.com/nextcloud-on-mac-collabora-online-web/</link><pubDate>Tue, 04 Nov 2025 00:00:00 +0900</pubDate><guid>https://hack-le.com/nextcloud-on-mac-collabora-online-web/</guid><description>&lt;p&gt;AIブラウザの台頭で、Webアプリの価値が高まったなぁと思い、オフィスソフトのWebアプリ化が重要に思えてきた。MS Officeは使いたくなかったので、OSSでODFを扱えるCollabora Onlineを使うことにした。するとNextcloudが必要だと言われた。そうかと思ってインストールしようとしたら、NextcloudはDocker DesktopではなくOrbStackが必要だと言われた。&lt;/p&gt;&#10;&lt;p&gt;それぞれ苦労したのだが、最後のCollabora Onlineのインストールと接続が一番苦労した……しかしもう後には引けない……。&lt;/p&gt;&#10;&lt;h2 id="前提"&gt;前提&#10;&lt;/h2&gt;&lt;p&gt;OrbStack + Nextcloudを前回までの記事で導入済みの前提。&lt;/p&gt;&#10;&lt;div class="blog-card-wrapper"&gt;&#10; &lt;a href="https://hack-le.com/lan-mac-nextcloud/" 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内でMac &amp;#43; Nextcloudを構築する&lt;/div&gt;&#10; &lt;div class="blog-card-url"&gt;/lan-mac-nextcloud/&lt;/div&gt;&#10; &lt;/div&gt;&#10; &lt;div class="blog-card-thumbnail"&gt;&#10; &lt;img src="https://hack-le.com/images/uploads/2025/10/output-54.webp" alt="LAN内でMac &amp;#43; Nextcloudを構築する" 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;p&gt;とりあえずトップページにいく。右上のアイコンから「アプリ」で「アプリバンドル」より、Collabora OnlineとNextcloud Officeを有効にする。&lt;/p&gt;&#10;&lt;p&gt;&lt;img loading="lazy" sizes="(max-width: 767px) calc(100vw - 30px), (max-width: 1023px) 700px, (max-width: 1279px) 950px, 1232px" src="https://hack-le.com/images/uploads/2025/10/image-11-700x322.png"&gt;&lt;/p&gt;&#10;&lt;p&gt;有効化はけっこう時間がかかる。設定いじるとレイアウトが崩れがち。崩れたらコンテナ再起動してCmd + Shift + R。&lt;/p&gt;&#10;&lt;p&gt;外部で独立してサーバたてることもできるんだが、Macの都合上ネットワーク問題がけっこうめんどくさいので、ビルトインのほうがいいと思う。ってか、最初独立させてやろうと思ったが、色々苦労してうまくいかず、結局ここに至ったので、大人しくビルトインのほうがいいと思う。&lt;/p&gt;&#10;&lt;p&gt;こちらの方が「&lt;a class="link" href="https://linuxfun.org/2022/03/01/review-collabora-online-on-nextcloud/" target="_blank" rel="noopener"&#10; &gt;【Office不要？】NextcloudにCollabora Online入れてみた | 世界Linux新聞&lt;/a&gt;」で比較されています。&lt;/p&gt;&#10;&lt;p&gt;そして、苦労して入れたが、日本語が表示されない。悲しい。&lt;/p&gt;&#10;&lt;p&gt;&lt;img loading="lazy" sizes="(max-width: 767px) calc(100vw - 30px), (max-width: 1023px) 700px, (max-width: 1279px) 950px, 1232px" src="https://hack-le.com/images/uploads/2025/10/image-12-700x212.png"&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 &lt;span class="nb"&gt;exec&lt;/span&gt; -u root nextcloud-docker-app-1 bash -lc &lt;span class="s1"&gt;&amp;#39;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s1"&gt; apt-get update &amp;amp;&amp;amp;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s1"&gt; apt-get install -y fonts-noto-cjk fonts-ipafont-gothic fonts-ipafont-mincho &amp;amp;&amp;amp;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s1"&gt; fc-cache -fv&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s1"&gt;&amp;#39;&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;docker compose restart app&#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;img loading="lazy" sizes="(max-width: 767px) calc(100vw - 30px), (max-width: 1023px) 700px, (max-width: 1279px) 950px, 1232px" src="https://hack-le.com/images/uploads/2025/10/image-13-700x196.png"&gt;&lt;/p&gt;&#10;&lt;h2 id="所感aiに振り回された感もある"&gt;所感：AIに振り回された感もある&#10;&lt;/h2&gt;&lt;p&gt;つらかった。久しぶりになんかサーバ周りで格闘した。10回はインストールしなおしたんじゃないだろうか……。&lt;/p&gt;&#10;&lt;p&gt;ここまでしてできることは所詮オフィスのWebアプリ。これは確かに流行らない。というか構築はまだいいけれど、今後運用始まったらどうなるのか……。&lt;/p&gt;&#10;&lt;p&gt;ただ、AIに振り回されたような気もするなぁ。無茶なポートの開け方を前提にしてきたり、存在しないバージョン番号を指定してきたり、複数OSの情報をごちゃ混ぜにして出してきたり（というかLinuxの情報が強くききすぎているのだと思う）。何回ちゃぶ台返したか。&lt;/p&gt;&#10;&lt;p&gt;まぁなんか、疲れた……。&lt;/p&gt;&#10;</description></item><item><title>LAN内でMac + Nextcloudを構築する</title><link>https://hack-le.com/lan-mac-nextcloud/</link><pubDate>Mon, 03 Nov 2025 00:00:00 +0900</pubDate><guid>https://hack-le.com/lan-mac-nextcloud/</guid><description>&lt;p&gt;やりたいことはCollabora Onlineの利用なんだけれど、そのための基盤としてNextcloudが必要だったので。Collabora Onlineを使いたい人はあまりいない気もするので、この記事はNextcloudまでで独立。Collabora Online構築すること前提の設定になっている。&lt;/p&gt;&#10;&lt;h2 id="環境"&gt;環境&#10;&lt;/h2&gt;&lt;ul&gt;&#10;&lt;li&gt;M2 Pro Mac mini&#10;&lt;ul&gt;&#10;&lt;li&gt;macOS Sonoma 14.7.7&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;/li&gt;&#10;&lt;li&gt;OrbStack 2.0.4&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;p&gt;LAN 内運用が基本。&lt;strong&gt;AIO(All in One)は証明書発行とか色々あってむしろやりづらい&lt;/strong&gt;ので、イチから作ったほうがよし。&lt;/p&gt;&#10;&lt;p&gt;公式によると、Docker DesktopではなくOrbStack推奨とのことだった。OrbStackの入れ方は以下の記事。&lt;/p&gt;&#10;&lt;div class="blog-card-wrapper"&gt;&#10; &lt;a href="https://hack-le.com/docker-desktop-orbstack/" 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 Desktop for Mac → Orbstackへ移行する&lt;/div&gt;&#10; &lt;div class="blog-card-url"&gt;/docker-desktop-orbstack/&lt;/div&gt;&#10; &lt;/div&gt;&#10; &lt;div class="blog-card-thumbnail"&gt;&#10; &lt;img src="https://hack-le.com/images/uploads/2025/10/output-53.webp" alt="Docker Desktop for Mac → Orbstackへ移行する" 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;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 ~/nextcloud-docker&#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; ~/nextcloud-docker&#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;つくる。DBはポスグレ。&lt;strong&gt;パスワード変える&lt;/strong&gt;。ポートは初期設定だと8080なんだが、使いたくなかったので21180にしている。&lt;/p&gt;&#10;&lt;p&gt;nextcloudとDBのバージョンは固定している。最初latestでやったのだが、なにかぶっ壊れていて画像の閲覧すら失敗する始末だった。固定したほうがいいと思う。&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; db:&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; image: postgres:15.8&#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; environment:&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; POSTGRES_USER: nextcloud&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; POSTGRES_PASSWORD: パスワード &lt;span class="c1"&gt;# &amp;lt;----------変更&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; POSTGRES_DB: nextcloud&#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/postgresql/data&#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; app:&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; image: nextcloud:28-fpm&#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; volumes:&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; - nextcloud_data:/var/www/html&#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; web:&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; image: nginx:stable&#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; 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;21180:80&amp;#34;&lt;/span&gt; &lt;span class="c1"&gt;# &amp;lt;-----------変更&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; - nextcloud_data:/var/www/html:ro&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; - ./nginx.conf:/etc/nginx/conf.d/default.conf&#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; - app&#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; db_data:&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; nextcloud_data:&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;リバースプロキシする&lt;code&gt;nginx.conf&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;server &lt;span class="o"&gt;{&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; listen 80&lt;span class="p"&gt;;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; server_name localhost&lt;span class="p"&gt;;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; root /var/www/html&lt;span class="p"&gt;;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; index index.php&lt;span class="p"&gt;;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; client_max_body_size 512M&lt;span class="p"&gt;;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; fastcgi_buffers &lt;span class="m"&gt;16&lt;/span&gt; 16k&lt;span class="p"&gt;;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; fastcgi_buffer_size 32k&lt;span class="p"&gt;;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; location / &lt;span class="o"&gt;{&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; try_files &lt;span class="nv"&gt;$uri&lt;/span&gt; &lt;span class="nv"&gt;$uri&lt;/span&gt;/ /index.php&lt;span class="nv"&gt;$is_args$args&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; proxy_set_header Host &lt;span class="nv"&gt;$host&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; proxy_set_header X-Forwarded-Proto &lt;span class="nv"&gt;$scheme&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; proxy_set_header X-Forwarded-For &lt;span class="nv"&gt;$proxy_add_x_forwarded_for&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; proxy_set_header X-Real-IP &lt;span class="nv"&gt;$remote_addr&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="o"&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; location ~ &lt;span class="se"&gt;\.&lt;/span&gt;php&lt;span class="o"&gt;(&lt;/span&gt;?:$&lt;span class="p"&gt;|&lt;/span&gt;/&lt;span class="o"&gt;)&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; fastcgi_split_path_info ^&lt;span class="o"&gt;(&lt;/span&gt;.+&lt;span class="se"&gt;\.&lt;/span&gt;php&lt;span class="o"&gt;)(&lt;/span&gt;/.+&lt;span class="o"&gt;)&lt;/span&gt;$&lt;span class="p"&gt;;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; include fastcgi_params&lt;span class="p"&gt;;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; fastcgi_pass app:9000&lt;span class="p"&gt;;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; fastcgi_param SCRIPT_FILENAME &lt;span class="nv"&gt;$document_root$fastcgi_script_name&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; fastcgi_param PATH_INFO &lt;span class="nv"&gt;$fastcgi_path_info&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; fastcgi_intercept_errors on&lt;span class="p"&gt;;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; fastcgi_request_buffering off&lt;span class="p"&gt;;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; fastcgi_read_timeout 300&lt;span class="p"&gt;;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; fastcgi_param HTTPS off&lt;span class="p"&gt;;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; fastcgi_param HTTP_X_FORWARDED_PROTO &lt;span class="nv"&gt;$scheme&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; fastcgi_param HTTP_X_FORWARDED_HOST &lt;span class="nv"&gt;$host&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; fastcgi_param HTTP_X_FORWARDED_SERVER &lt;span class="nv"&gt;$host&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="o"&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; location ~* &lt;span class="se"&gt;\.&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;?:css&lt;span class="p"&gt;|&lt;/span&gt;js&lt;span class="p"&gt;|&lt;/span&gt;woff2?&lt;span class="p"&gt;|&lt;/span&gt;svg&lt;span class="p"&gt;|&lt;/span&gt;gif&lt;span class="p"&gt;|&lt;/span&gt;map&lt;span class="o"&gt;)&lt;/span&gt;$ &lt;span class="o"&gt;{&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; try_files &lt;span class="nv"&gt;$uri&lt;/span&gt; /index.php&lt;span class="nv"&gt;$request_uri&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; add_header Cache-Control &lt;span class="s2"&gt;&amp;#34;public, max-age=15778463&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; access_log off&lt;span class="p"&gt;;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="o"&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; gzip on&lt;span class="p"&gt;;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; gzip_vary on&lt;span class="p"&gt;;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; gzip_comp_level 4&lt;span class="p"&gt;;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; gzip_types text/plain text/css application/javascript application/json image/svg+xml application/xml+rss&lt;span class="p"&gt;;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; location ~ /&lt;span class="se"&gt;\.&lt;/span&gt;ht &lt;span class="o"&gt;{&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; deny all&lt;span class="p"&gt;;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="o"&gt;}&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="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;/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;&lt;code&gt;http://localhost:21180&lt;/code&gt;で初期セットアップ画面にアクセスできる。管理者ユーザ名とパスワードは適当に決めつつ、データベースの設定をPostgresにしつつ、設定ファイルとあわせる。&lt;/p&gt;&#10;&lt;table&gt;&#10;&#9;&lt;thead&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;th&gt;項目&lt;/th&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;th&gt;値&lt;/th&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&lt;/thead&gt;&#10;&#9;&lt;tbody&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;データベースユーザー&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;&lt;code&gt;nextcloud&lt;/code&gt;&lt;/td&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;データベースパスワード&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;変更したパスワード&lt;/td&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;データベース名&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;&lt;code&gt;nextcloud&lt;/code&gt;&lt;/td&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;データベースホスト&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;&lt;code&gt;db&lt;/code&gt;&lt;/td&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&lt;/tbody&gt;&#10;&lt;/table&gt;&#10;&lt;p&gt;次、&lt;strong&gt;推奨アプリはスキップする&lt;/strong&gt;。&lt;/p&gt;&#10;&lt;p&gt;ダッシュボードが表示されたらサーバは準備完了。&lt;/p&gt;&#10;&lt;h3 id="動作確認"&gt;動作確認&#10;&lt;/h3&gt;&lt;p&gt;とりあえずファイルからpngとかpdfのviewerが機能することを確認する。&lt;/p&gt;&#10;&lt;p&gt;この時点ではdocxとかはまだ使えない。&lt;/p&gt;&#10;&lt;h3 id="ipアドレスでアクセスできるようにする"&gt;IPアドレスでアクセスできるようにする&#10;&lt;/h3&gt;&lt;p&gt;このままだとlocalhostからしかアクセスできないので。設定ファイルを書き換える。&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; -u www-data app php occ config:system:set trusted_domains &lt;span class="m"&gt;1&lt;/span&gt; --value&lt;span class="o"&gt;=&lt;/span&gt;IPアドレス&#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 down&#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;/code&gt;&lt;/pre&gt;&lt;/div&gt;&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 -v&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;止めてるやつ全部消していいならprune -aしたらスッキリ（自己責任）&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 system prune -a&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id="クライアント側"&gt;クライアント側&#10;&lt;/h2&gt;&lt;p&gt;クライアント側は「&lt;a class="link" href="https://nextcloud.com/install/#desktop-files" target="_blank" rel="noopener"&#10; &gt;Download and install Nextcloud&lt;/a&gt;」よりアプリをダウンロードしてインストール。&lt;/p&gt;&#10;&lt;p&gt;実行すると、サーバのIPアドレスについて聞かれるので、ここまでに設定したIPアドレス:ポート番号を入力すると、ログイン&amp;amp;許可を求められるので、ログインして許可すればOK。同期フォルダを選択すれば、後はDropbox感覚でいける。&lt;/p&gt;&#10;&lt;h2 id="所感"&gt;所感&#10;&lt;/h2&gt;&lt;p&gt;色々とハマった。最初All in Oneパッケージでやろうと思ったが、余計なことしすぎていて、LAN内で必要なことだけしたい自分にはむしろ設定がしんどかった。AIにもかなり嘘をつかれた……いったい昔より楽になったのかわからない。昔だったら検索したらドンピシャな記事が出てきたもんだけどな……。あと証明書とかいうバカバカしい問題に取り組まなくて済んだわけだし。&lt;/p&gt;&#10;&lt;p&gt;とりあえず1日が消えた。ここまで苦労してやる意味があるのかと思った。まぁ苦労したのは次の記事でやるCollabora Onlineを設定があったからではあるんだが……。&lt;/p&gt;&#10;</description></item><item><title>Gitea on Macのサインアップ（登録）を禁止する</title><link>https://hack-le.com/gitea-on-mac-signup/</link><pubDate>Wed, 29 Oct 2025 13:05:37 +0900</pubDate><guid>https://hack-le.com/gitea-on-mac-signup/</guid><description>&lt;p&gt;大した内容ではない。GiteaをずっとLAN内で運用していたが、やはりそれだと不便なので外部公開の必要を感じた。とはいえお一人様なのでサインアップはさせたくない。ので、設定するだけ。&lt;/p&gt;&#10;&lt;h2 id="環境"&gt;環境&#10;&lt;/h2&gt;&lt;ul&gt;&#10;&lt;li&gt;M2 Pro Mac mini, Intel Mac mini 2018&lt;/li&gt;&#10;&lt;li&gt;macOS 14.7.7 (Sonoma)&lt;/li&gt;&#10;&lt;li&gt;gitea 1.24.5 (via brew)&lt;/li&gt;&#10;&lt;li&gt;&lt;code&gt;brew services start gitea&lt;/code&gt;で起動&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;h2 id="手順"&gt;手順&#10;&lt;/h2&gt;&lt;p&gt;まず現状を確認する。右上に登録がある。&lt;/p&gt;&#10;&lt;p&gt;&lt;img loading="lazy" sizes="(max-width: 767px) calc(100vw - 30px), (max-width: 1023px) 700px, (max-width: 1279px) 950px, 1232px" src="https://hack-le.com/images/uploads/2025/10/image-18-700x404.png"&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;brew services stop gitea&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;&lt;code&gt;app.ini&lt;/code&gt;を書き換える。&lt;code&gt;brew services&lt;/code&gt;を使っている場合は&lt;code&gt;ps ax&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="m"&gt;58271&lt;/span&gt; ?? S 0:00.75 /opt/homebrew/opt/gitea/bin/gitea web --work-path /opt/homebrew/var/gitea&#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;emacs /opt/homebrew/var/gitea/custom/conf/app.ini&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;そうしたら&lt;code&gt;[service]&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="o"&gt;[&lt;/span&gt;service&lt;span class="o"&gt;]&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nv"&gt;DISABLE_REGISTRATION&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nb"&gt;true&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/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;brew services start gitea&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Web画面を確認する。&lt;/p&gt;&#10;&lt;p&gt;&lt;img loading="lazy" sizes="(max-width: 767px) calc(100vw - 30px), (max-width: 1023px) 700px, (max-width: 1279px) 950px, 1232px" src="https://hack-le.com/images/uploads/2025/10/image-19-700x404.png"&gt;&lt;/p&gt;&#10;&lt;p&gt;右上から「登録」が消えていることを確認。これでOK。&lt;/p&gt;&#10;</description></item><item><title>脱クラウドとは何か</title><link>https://hack-le.com/datsucloud/</link><pubDate>Mon, 27 Oct 2025 00:00:00 +0900</pubDate><guid>https://hack-le.com/datsucloud/</guid><description>&lt;p&gt;最近、サイトのビッグテーマとして、脱クラウドを掲げセルフホスト的な記事を書いていこうかなと思っている。ってか脱SaaSというほうがいいかもしれんね。&lt;/p&gt;&#10;&lt;p&gt;なんにせよ、そもそも脱クラウドとは何か？という問題があるかなぁ、とは思った。たとえば僕はガンガンCloudflare Tunnelを使っているし、またそれを前提とした構成を書いていくことになるのだが、脱クラウドなのにCloudflare Tunnelは使っていいの？という疑問は浮かぶように思われた。&lt;/p&gt;&#10;&lt;p&gt;これについての回答は、&lt;strong&gt;Cloudflare Tunnelの仕事は本質的に置き換え可能&lt;/strong&gt;だから問題ない、となる。Cloudflare Tunnelは色々やっているが、その本質的なコアはNAT越えとTLS終端だと思う。特にセルフホスト的な見方だとそうなる。これらはいずれも面倒くさいだけで、できないものではない。面倒くさいだけで。まぁ本当にしんどい。しんどかったので自宅サーバはおしまいみたいなこと考えていた。&lt;/p&gt;&#10;&lt;p&gt;&lt;strong&gt;脱クラウドとは、Webサービスを使わないことではないし、インターネットの外に出て行かないことではない。重要なことは、選択肢を奪われないこ&lt;/strong&gt;とだ。つまり、&lt;strong&gt;置き換えられないものをできるだけ使わない&lt;/strong&gt;、といえる。置き換えが難しいのは、たとえばデータや人間関係（信頼関係）を中央集権サーバに預けるようなものだ。その手のクラウドサービスは、データと人間関係を人質を取られているような感じなのでできれば避けたい。ビジネスロジックを預けるのも危険度は上がる。ロジックは頑張ればなんとかなると思うけど。データと人間関係については、リセットの覚悟が必要になるね。&lt;/p&gt;&#10;&lt;p&gt;表にすると、以下のようにまとめられる。&lt;/p&gt;&#10;&lt;table&gt;&#10;&#9;&lt;thead&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;th&gt;軸&lt;/th&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;th&gt;依存の種類&lt;/th&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;th&gt;判定&lt;/th&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&lt;/thead&gt;&#10;&#9;&lt;tbody&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;&lt;strong&gt;データ&lt;/strong&gt;&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;ストレージ・メタデータ・履歴を預けているか&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;危険&lt;/td&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;&lt;strong&gt;関係&lt;/strong&gt;&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;ID・アカウント・フォロー構造を預けているか&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;超危険&lt;/td&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;&lt;strong&gt;ロジック&lt;/strong&gt;&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;ビジネスルール・自動化・運用を預けているか&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;注意&lt;/td&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;&lt;strong&gt;経路&lt;/strong&gt;&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;通信や転送の経路を借りているだけか&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;安全寄り&lt;/td&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&lt;/tbody&gt;&#10;&lt;/table&gt;&#10;&lt;p&gt;Cloudflare Tunnelのコアは経路に相当する。なので、別に問題ない、という判断。本格的に機能を使い始めるとロジックも預けちゃうと思うけどね。そうしたら依存度は上がるね。&lt;/p&gt;&#10;&lt;p&gt;まぁでも、別に依存すること自体をああだこうだ言う気はないんだ。それぞれ事情があるだろうし。僕も使ってるし依存している——というより気づかない間に依存していた——サービスなんていっぱいあるし。そもそも&lt;strong&gt;DNSに依存してるし&lt;/strong&gt;。経路は安全寄りといったけど、DNSだけは別……というかDNSはその本質が関係なんだよねぇ。&lt;/p&gt;&#10;&lt;p&gt;いずれにせよ、何かしら依存しないとWebは成り立たないのはそう。っていうか普通に使っていると相当依存するよね。だからこそ脱クラウドとか言い始めているわけで、クラウド依存していなければそもそも脱する必要がない。&lt;/p&gt;&#10;&lt;p&gt;&lt;strong&gt;逆説的に、脱クラウドとはクラウド依存患者であることの告白&lt;/strong&gt;である。そして何故依存したのか？という個人的な問いなしに脱クラウドはありえない。そこには必ず何かを求めた経緯があるはずだ。それと向き合って、現実を見て、過去を振り返り、未来を考えて、何を求めたのか、求めたものは得られたのか、得られていないのか、まだ求めているのか、これからも求めるのか、そもそも本当に求めていたのか、そういう問いかけは必ずいる。&lt;/p&gt;&#10;&lt;p&gt;ゼロイチじゃないので、何をどうするのか、都度自分の判断になる。ああしろこうしろという気はまったくないし、逆に言われる気もない。各自勝手にやるがいい。あるいは、&lt;strong&gt;勝手にやれるべきだ&lt;/strong&gt;。まぁそんな感じだよ。&lt;/p&gt;&#10;&lt;p&gt;&amp;lt;関連記事&amp;gt;&lt;/p&gt;&#10;&lt;div class="blog-card-wrapper"&gt;&#10; &lt;a href="https://hack-le.com/45948138-2/" class="blog-card"&gt;&#10; &lt;div class="blog-card-content"&gt;&#10; &lt;div class="blog-card-label"&gt;&#10; &lt;svg xmlns="http://www.w3.org/2000/svg" width="13" height="13" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"&gt;&lt;path d="M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.71"&gt;&lt;/path&gt;&lt;path d="M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71"&gt;&lt;/path&gt;&lt;/svg&gt;&#10; &lt;span&gt;あわせて読みたい&lt;/span&gt;&#10; &lt;/div&gt;&#10; &lt;div class="blog-card-title"&gt;自宅サーバーは浪漫枠&lt;/div&gt;&#10; &lt;div class="blog-card-url"&gt;/45948138-2/&lt;/div&gt;&#10; &lt;/div&gt;&#10; &lt;div class="blog-card-thumbnail"&gt;&#10; &lt;img src="https://hack-le.com/images/uploads/2026/09/eyecatch_2738_1789453565.webp" alt="自宅サーバーは浪漫枠" loading="lazy" /&gt;&#10; &lt;/div&gt;&#10; &lt;/a&gt;&#10;&lt;/div&gt;&#10;&#10;</description></item><item><title>セルフホストDify のナレッジにAPIでドキュメントを追加する</title><link>https://hack-le.com/selfhost-dify-api-doc/</link><pubDate>Thu, 23 Oct 2025 00:00:00 +0900</pubDate><guid>https://hack-le.com/selfhost-dify-api-doc/</guid><description>&lt;p&gt;確かにDify色々いじれるのは便利。&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/dify-local-llm-rag/" 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;セルフホストでDify &amp;#43; ローカルLLM &amp;#43; RAG&lt;/div&gt;&#10; &lt;div class="blog-card-url"&gt;/dify-local-llm-rag/&lt;/div&gt;&#10; &lt;/div&gt;&#10; &lt;div class="blog-card-thumbnail"&gt;&#10; &lt;img src="https://hack-le.com/images/uploads/2025/10/output-35.webp" alt="セルフホストでDify &amp;#43; ローカルLLM &amp;#43; RAG" 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;h3 id="環境変数の設定"&gt;環境変数の設定&#10;&lt;/h3&gt;&lt;p&gt;以下を環境変数として設定する。ナレッジのドキュメントを選択すると、左下に「サービスAPI」があるので、そこを見るとURIがわかる。シークレットキーを発行することもできる。&lt;/p&gt;&#10;&lt;p&gt;&lt;img loading="lazy" sizes="(max-width: 767px) calc(100vw - 30px), (max-width: 1023px) 700px, (max-width: 1279px) 950px, 1232px" src="https://hack-le.com/images/uploads/2025/10/a075503ad497328698be9a30dad0dab4-700x544.webp"&gt;&lt;/p&gt;&#10;&lt;ul&gt;&#10;&lt;li&gt;&lt;code&gt;DIFY_API_BASE&lt;/code&gt;: &lt;code&gt;http://ベースURL:ポート/v1&lt;/code&gt;&lt;/li&gt;&#10;&lt;li&gt;&lt;code&gt;DIFY_DATASET_ID&lt;/code&gt;: ドキュメントを選択したURLの &lt;code&gt;datasets/{ID}&lt;/code&gt; のIDの部分&lt;/li&gt;&#10;&lt;li&gt;&lt;code&gt;DIFY_KNOWLEDGE_API_KEY&lt;/code&gt;&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;h3 id="1個ずつアップロードするスクリプト"&gt;1個ずつアップロードするスクリプト&#10;&lt;/h3&gt;&lt;p&gt;まずアップロード用のスクリプト。これは1つだけアップロードする。この手の糞コードは全部AIになった。チャンク識別子はデフォルトの&lt;code&gt;\n\n&lt;/code&gt;となる。&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-python" data-lang="python"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="ch"&gt;#!/usr/bin/env python3&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="nn"&gt;argparse&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="nn"&gt;os&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="nn"&gt;json&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="nn"&gt;requests&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="kn"&gt;from&lt;/span&gt; &lt;span class="nn"&gt;pathlib&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;Path&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# --- 設定 ---&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;API_BASE&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;os&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;environ&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;get&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;DIFY_API_BASE&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;DATASET_ID&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;os&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;environ&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;get&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;DIFY_DATASET_ID&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;API_KEY&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;os&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;environ&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;get&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;DIFY_KNOWLEDGE_API_KEY&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;upload_md&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;md_path&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;str&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="ow"&gt;not&lt;/span&gt; &lt;span class="n"&gt;API_KEY&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="k"&gt;raise&lt;/span&gt; &lt;span class="ne"&gt;RuntimeError&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;環境変数 DIFY_KNOWLEDGE_API_KEY が設定されてない。&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;endpoint&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="sa"&gt;f&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;API_BASE&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;/datasets/&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;DATASET_ID&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;/document/create-by-file&amp;#34;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;headers&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;Authorization&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sa"&gt;f&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;Bearer &lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;API_KEY&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;&#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="n"&gt;data&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="s2"&gt;&amp;#34;indexing_technique&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;high_quality&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="s2"&gt;&amp;#34;process_rule&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;mode&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;automatic&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;}&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="k"&gt;with&lt;/span&gt; &lt;span class="nb"&gt;open&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;md_path&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;rb&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="k"&gt;as&lt;/span&gt; &lt;span class="n"&gt;f&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;files&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="s2"&gt;&amp;#34;data&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kc"&gt;None&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;json&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;dumps&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;data&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;text/plain&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="s2"&gt;&amp;#34;file&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;Path&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;md_path&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;name&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;f&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;}&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;resp&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;requests&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;post&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;endpoint&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;headers&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;headers&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;files&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;files&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;timeout&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;120&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;resp&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;status_code&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="mi"&gt;200&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nb"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sa"&gt;f&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;OK: &lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;md_path&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;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="k"&gt;else&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nb"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sa"&gt;f&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;NG: &lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;md_path&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="n"&gt;resp&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;status_code&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;) -&amp;gt; &lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;resp&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;text&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;&#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="vm"&gt;__name__&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;__main__&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;parser&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;argparse&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;ArgumentParser&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;description&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;Upload one .md file to Dify Knowledge Base&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;parser&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;add_argument&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;file&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;help&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;Path to markdown file&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;args&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;parser&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;parse_args&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;upload_md&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;args&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;file&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;実行する。&lt;/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;python upload_md.py file.md&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;&lt;code&gt;md_files&lt;/code&gt;ディレクトリにあるmdファイルを全部やる場合はシェルスクリプトで以下。&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 .md_files/ &lt;span class="s2"&gt;&amp;#34;*.md&amp;#34;&lt;/span&gt; -exec python upload_md.py &lt;span class="o"&gt;{}&lt;/span&gt; &lt;span class="se"&gt;\;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;5-10KBのアイテムを1600ほど（合計10MB弱）だったけど、けっこうすぐに利用可能になったね。&lt;/p&gt;&#10;&lt;h3 id="チャンク識別子を変える"&gt;チャンク識別子を変える&#10;&lt;/h3&gt;&lt;p&gt;&lt;code&gt;process_rule&lt;/code&gt;の&lt;code&gt;mode&lt;/code&gt;を&lt;code&gt;custom&lt;/code&gt;にする。たとえば、以下はMarkdownの&lt;code&gt;##&lt;/code&gt;をチャンク識別子とした時のもの。&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-python" data-lang="python"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="ch"&gt;#!/usr/bin/env python3&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="nn"&gt;argparse&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="nn"&gt;os&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="nn"&gt;json&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="nn"&gt;requests&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="kn"&gt;from&lt;/span&gt; &lt;span class="nn"&gt;pathlib&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;Path&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# --- 設定 ---&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;API_BASE&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;os&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;environ&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;get&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;DIFY_API_BASE&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;DATASET_ID&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;os&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;environ&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;get&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;DIFY_DATASET_ID&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;API_KEY&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;os&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;environ&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;get&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;DIFY_KNOWLEDGE_API_KEY&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;build_process_rule&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;separator_regex&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;str&lt;/span&gt; &lt;span class="o"&gt;|&lt;/span&gt; &lt;span class="kc"&gt;None&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;-&amp;gt;&lt;/span&gt; &lt;span class="nb"&gt;dict&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="ow"&gt;not&lt;/span&gt; &lt;span class="n"&gt;separator_regex&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;mode&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;automatic&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="s2"&gt;&amp;#34;mode&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;custom&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="s2"&gt;&amp;#34;rules&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="s2"&gt;&amp;#34;pre_processing_rules&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[],&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="s2"&gt;&amp;#34;segmentation&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="s2"&gt;&amp;#34;separator&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;separator_regex&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="s2"&gt;&amp;#34;max_tokens&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;600&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="s2"&gt;&amp;#34;chunk_overlap&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;80&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;}&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;}&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;}&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;upload_md&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;md_path&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;str&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;separator_regex&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;str&lt;/span&gt; &lt;span class="o"&gt;|&lt;/span&gt; &lt;span class="kc"&gt;None&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="ow"&gt;not&lt;/span&gt; &lt;span class="n"&gt;API_KEY&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="k"&gt;raise&lt;/span&gt; &lt;span class="ne"&gt;RuntimeError&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;環境変数 DIFY_KNOWLEDGE_API_KEY が設定されてない。&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;endpoint&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="sa"&gt;f&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;API_BASE&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;/datasets/&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;DATASET_ID&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;/document/create-by-file&amp;#34;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;headers&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;Authorization&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sa"&gt;f&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;Bearer &lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;API_KEY&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;&#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="n"&gt;data&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="s2"&gt;&amp;#34;indexing_technique&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;high_quality&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="s2"&gt;&amp;#34;process_rule&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;build_process_rule&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;separator_regex&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;}&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="k"&gt;with&lt;/span&gt; &lt;span class="nb"&gt;open&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;md_path&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;rb&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="k"&gt;as&lt;/span&gt; &lt;span class="n"&gt;f&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;files&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="s2"&gt;&amp;#34;data&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kc"&gt;None&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;json&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;dumps&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;data&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;application/json&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="s2"&gt;&amp;#34;file&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;Path&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;md_path&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;name&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;f&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;}&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;resp&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;requests&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;post&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;endpoint&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;headers&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;headers&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;files&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;files&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;timeout&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;120&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;resp&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;status_code&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="mi"&gt;200&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nb"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sa"&gt;f&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;OK: &lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;md_path&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;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="k"&gt;else&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nb"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sa"&gt;f&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;NG: &lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;md_path&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="n"&gt;resp&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;status_code&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;) -&amp;gt; &lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;resp&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;text&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;&#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="vm"&gt;__name__&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;__main__&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;parser&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;argparse&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;ArgumentParser&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;description&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;Upload one .md file to Dify Knowledge Base&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;parser&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;add_argument&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;file&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;help&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;Path to markdown file&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;parser&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;add_argument&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="s2"&gt;&amp;#34;--chunk-separator&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;help&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sa"&gt;r&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;Regex for chunking (e.g. &amp;#39;(?m)^##\s+&amp;#39; or &amp;#39;(?m)^(##|###)\s+&amp;#39;). Empty string to use automatic chunking.&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="p"&gt;)&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;args&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;parser&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;parse_args&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;default_regex&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="sa"&gt;r&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;(?m)^(##|###)\s+&amp;#34;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;separator&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;args&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;chunk_separator&lt;/span&gt; &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;args&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;chunk_separator&lt;/span&gt; &lt;span class="ow"&gt;is&lt;/span&gt; &lt;span class="ow"&gt;not&lt;/span&gt; &lt;span class="kc"&gt;None&lt;/span&gt; &lt;span class="k"&gt;else&lt;/span&gt; &lt;span class="n"&gt;default_regex&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="n"&gt;separator&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;separator&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="kc"&gt;None&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="n"&gt;upload_md&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;args&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;file&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;separator&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;</description></item><item><title>セルフホストでDify + ローカルLLM + RAG</title><link>https://hack-le.com/dify-local-llm-rag/</link><pubDate>Wed, 22 Oct 2025 00:00:00 +0900</pubDate><guid>https://hack-le.com/dify-local-llm-rag/</guid><description>&lt;p&gt;今さらRAGやる。サクッと試すならDifyかなということで、またローカルLLMとローカルデータベースにこだわりを見せてやる。&lt;/p&gt;&#10;&lt;h2 id="環境"&gt;環境&#10;&lt;/h2&gt;&lt;ul&gt;&#10;&lt;li&gt;M2 Pro Mac mini&#10;&lt;ul&gt;&#10;&lt;li&gt;12コアCPU、19コアGPU&lt;/li&gt;&#10;&lt;li&gt;RAM 32GB&lt;/li&gt;&#10;&lt;li&gt;macOS Sonoma 14.7.7&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;/li&gt;&#10;&lt;li&gt;LLM&#10;&lt;ul&gt;&#10;&lt;li&gt;ollama 0.12.5&#10;&lt;ul&gt;&#10;&lt;li&gt;deepseek-r1:14b&lt;/li&gt;&#10;&lt;li&gt;deepseek-r1:32b&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;p&gt;ollamaは使っていること前提。&lt;/p&gt;&#10;&lt;p&gt;ollamaを別マシンで動かす場合、Macの場合は以下を実行する。(&lt;a class="link" href="https://docs.dify.ai/en/development/models-integration/ollama" target="_blank" rel="noopener"&#10; &gt;Integrate Local Models Deployed by Ollama - Dify Docs&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;&lt;span class="c1"&gt;# M2 Pro Mac mini側でターミナル実行&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;launchctl setenv OLLAMA_HOST &lt;span class="s2"&gt;&amp;#34;0.0.0.0&amp;#34;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id="手順"&gt;手順&#10;&lt;/h2&gt;&lt;h3 id="インストール"&gt;インストール&#10;&lt;/h3&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-text" data-lang="text"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;git clone https://github.com/langgenius/dify.git&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;cd dify/docker&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;環境変数を設定する。&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# 新しいキーを生成&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;openssl rand -base64 &lt;span class="m"&gt;42&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;# envを編集する&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;cp .env.example .env&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;emacs .env&#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;# 生成された値を.envファイルの以下の行に設定&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;SECRET_KEY&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&amp;lt;生成された値をここに貼り付け&amp;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;# ポート変更する場合: デフォルトは80&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;EXPOSE_NGINX_PORT&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;Difyの起動。&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;span class="line"&gt;&lt;span class="cl"&gt;docker compose ps&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;すべてのサービスが&lt;code&gt;running&lt;/code&gt;になっていればOK。&lt;/p&gt;&#10;&lt;h3 id="セットアップからollama連携"&gt;セットアップからollama連携&#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-text" data-lang="text"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;http://localhost:設定したポート/install&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;（デフォで0.0.0.0で待ち受けるのでIPアドレスでもよい）&lt;/p&gt;&#10;&lt;p&gt;アカウントとか作成。&lt;/p&gt;&#10;&lt;p&gt;ollamaのほうも準備する。モデルは好きな物を使えばいいがたとえば以下。&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;# LLMモデル&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;ollama pull deepseek-r1:14b&#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;# 埋め込みモデル（RAG用）&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;ollama pull nomic-embed-text&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Dify側でOllamaを設定する。&lt;/p&gt;&#10;&lt;ol&gt;&#10;&lt;li&gt;Difyにログイン&lt;/li&gt;&#10;&lt;li&gt;右上のアイコン → &lt;strong&gt;設定&lt;/strong&gt;&lt;/li&gt;&#10;&lt;li&gt;&lt;strong&gt;モデルプロバイダー&lt;/strong&gt;&lt;/li&gt;&#10;&lt;li&gt;&lt;strong&gt;Ollama&lt;/strong&gt; を選択&lt;/li&gt;&#10;&lt;li&gt;接続情報を入力（下図）&lt;/li&gt;&#10;&lt;/ol&gt;&#10;&lt;p&gt;&lt;strong&gt;Mac/Windows (Docker Desktop):&lt;/strong&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;http://host.docker.internal:11434&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;他マシンで開放している場合はIPアドレス&lt;/p&gt;&#10;&lt;p&gt;&lt;strong&gt;Linux:&lt;/strong&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;http://172.17.0.1:11434&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;ol&gt;&#10;&lt;li&gt;モデル名を入力（例: &lt;code&gt;deepseek-r1:14b&lt;/code&gt;）&lt;/li&gt;&#10;&lt;li&gt;&lt;strong&gt;保存&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/2025/10/9a6c7c9b67e149b9430139cf828da256-700x1021.png"&gt;&lt;/p&gt;&#10;&lt;p&gt;埋め込みモデルも同様に設定する。&lt;/p&gt;&#10;&lt;p&gt;&lt;img loading="lazy" sizes="(max-width: 767px) calc(100vw - 30px), (max-width: 1023px) 700px, (max-width: 1279px) 950px, 1232px" src="https://hack-le.com/images/uploads/2025/10/7c1fe727fb0042c3a64cafb20f0748dc-700x681.png"&gt;&lt;/p&gt;&#10;&lt;h3 id="動作確認llm"&gt;動作確認(LLM)&#10;&lt;/h3&gt;&lt;ol&gt;&#10;&lt;li&gt;スタジオより新しく作成&lt;/li&gt;&#10;&lt;li&gt;チャットフロー選択&lt;/li&gt;&#10;&lt;li&gt;hi&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/2025/10/image-5-700x149.png"&gt;&lt;/p&gt;&#10;&lt;p&gt;返事がきたらOK。&lt;/p&gt;&#10;&lt;h3 id="動作確認rag"&gt;動作確認(RAG)&#10;&lt;/h3&gt;&lt;p&gt;「ナレッジ」より新しくナレッジを追加する。どうするかなと思ったけど、とりあえず下記の記事をナレッジにする。&lt;/p&gt;&#10;&lt;div class="blog-card-wrapper"&gt;&#10; &lt;a href="https://hack-le.com/android-pc-ssh/" 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タブレットで自宅PCにSSHでログインしてターミナルで遊ぶ&lt;/div&gt;&#10; &lt;div class="blog-card-url"&gt;/android-pc-ssh/&lt;/div&gt;&#10; &lt;/div&gt;&#10; &lt;div class="blog-card-thumbnail"&gt;&#10; &lt;img src="https://hack-le.com/images/uploads/2026/09/eyecatch_45235_1789622472.webp" alt="外出先からAndroidタブレットで自宅PCにSSHでログインしてターミナルで遊ぶ" loading="lazy" /&gt;&#10; &lt;/div&gt;&#10; &lt;/a&gt;&#10;&lt;/div&gt;&#10;&#10;&lt;p&gt;コイツをMarkdownにして登録する。&lt;/p&gt;&#10;&lt;p&gt;&lt;img loading="lazy" sizes="(max-width: 767px) calc(100vw - 30px), (max-width: 1023px) 700px, (max-width: 1279px) 950px, 1232px" src="https://hack-le.com/images/uploads/2025/10/d67347163e99df5c314e2a54733211ed-700x653.webp"&gt;&lt;/p&gt;&#10;&lt;p&gt;登録してからしばらく待つことになる。&lt;/p&gt;&#10;&lt;p&gt;&lt;img loading="lazy" sizes="(max-width: 767px) calc(100vw - 30px), (max-width: 1023px) 700px, (max-width: 1279px) 950px, 1232px" src="https://hack-le.com/images/uploads/2025/10/c0e19555c8cf1066d311dbf48ea54804-700x91.png"&gt;&lt;/p&gt;&#10;&lt;p&gt;待ったら使える。&lt;/p&gt;&#10;&lt;p&gt;&lt;img loading="lazy" sizes="(max-width: 767px) calc(100vw - 30px), (max-width: 1023px) 700px, (max-width: 1279px) 950px, 1232px" src="https://hack-le.com/images/uploads/2025/10/image-6-700x65.png"&gt;&lt;/p&gt;&#10;&lt;p&gt;整ったら、再びスタジオよりチャットを新規作成。&lt;/p&gt;&#10;&lt;p&gt;ブロックから「知識探索」を追加して、開始とLLMの間に置く。知識探索ブロックにさっき作ったナレッジを設定。LLMに繋いで、LLMで知識探索の結果を使うように「コンテクスト」と「プロンプト」の設定をする。&lt;/p&gt;&#10;&lt;p&gt;&lt;img loading="lazy" sizes="(max-width: 767px) calc(100vw - 30px), (max-width: 1023px) 700px, (max-width: 1279px) 950px, 1232px" src="https://hack-le.com/images/uploads/2025/10/bee9ad8f9df260506b4f0f8fc12b8be9-700x576.webp"&gt;&lt;/p&gt;&#10;&lt;p&gt;そしたらプレビューより「Androidでssh使いたい」と聞いてみる。頑張れ……！Mac miniがんばれ……！&lt;/p&gt;&#10;&lt;p&gt;&lt;img loading="lazy" sizes="(max-width: 767px) calc(100vw - 30px), (max-width: 1023px) 700px, (max-width: 1279px) 950px, 1232px" src="https://hack-le.com/images/uploads/2025/10/918cf109e600889d37f0e3ff572ed0c5-700x122.png"&gt;&lt;/p&gt;&#10;&lt;p&gt;頑張った。Mac mini頑張った。結果は微妙だけど一応ちゃんと使っている感ある。&lt;/p&gt;&#10;&lt;p&gt;&lt;img loading="lazy" sizes="(max-width: 767px) calc(100vw - 30px), (max-width: 1023px) 700px, (max-width: 1279px) 950px, 1232px" src="https://hack-le.com/images/uploads/2025/10/be8af74611b569bcfd583778ca6a4c53-700x620.webp"&gt;&lt;/p&gt;&#10;&lt;p&gt;内容的には、独自ドメインについて記述したconfigの設定すっ飛ばしているため、意味不明な回答となっている。意味不明だが、一応ナレッジを使っている、ということは言える。&lt;/p&gt;&#10;&lt;h2 id="所感"&gt;所感&#10;&lt;/h2&gt;&lt;p&gt;とりあえず動くことはわかった。ここから先はノウハウの世界になる。チャンクの粒度はどうするのか、そもそも元の文章に手を入れる必要があるんじゃないのか、どのナレッジを使うか選択するエージェントが必要なのか……。&lt;/p&gt;&#10;&lt;p&gt;……原理的には結局フレーム問題のような気がする。このナレッジのこの部分を使うべきだとわかればそりゃできるだろうが……。完全なFAQデータベースがあり、1つのFAQを引っ張ってくるだけなら、多分いけるんだろうけれど。&lt;/p&gt;&#10;&lt;p&gt;しかし先ず問題は、その整然とされたナレッジは誰がどうやって用意するのか。次の問題は、本当にユーザが求めているのはそのナレッジなのか。多くの場合、ユーザは自分の本当のQをわかっていない。&lt;/p&gt;&#10;&lt;p&gt;うーん、不毛な感じがあるが……まぁもうちょっといじるしかないか。&lt;/p&gt;&#10;</description></item><item><title>ConoHaのメールサーバ（アプリケーションサーバ）をやってみたが簡単過ぎて言うことがない</title><link>https://hack-le.com/conoha-mail-server/</link><pubDate>Wed, 24 Sep 2025 00:00:00 +0900</pubDate><guid>https://hack-le.com/conoha-mail-server/</guid><description>&lt;p&gt;うちのブログはConoHaのVPS上に構築しており、特に不満もないので、折に触れてConoHaの宣伝をしている。で、うちのサイトから契約して使ってみた人もいたようで、有り難いことにクーポンをもらった。&lt;/p&gt;&#10;&lt;p&gt;もらったからには何かしら試して報告しないとなぁと思ったものの、既にVPSは契約しているしどうしたもんかな、と思ったところで、前々から気になっていたアプリケーションサーバのメールサーバを試してみることにした。&lt;/p&gt;&#10;&lt;p&gt;なんか引っかかるかなと思ったのだけれど、契約して30分で普通にGmailと送受信できて拍子抜けしている。言うことがない。&lt;/p&gt;&#10;&lt;h2 id="契約から設定"&gt;契約から設定&#10;&lt;/h2&gt;&lt;p&gt;言うことがない、ではあまりにもなんなので、もう少し何か言うことにする。&lt;/p&gt;&#10;&lt;h3 id="契約"&gt;契約&#10;&lt;/h3&gt;&lt;p&gt;まず契約の仕方はコンソール画面から、サーバー追加でメールサーバを選ぶ。以上。&lt;/p&gt;&#10;&lt;p&gt;&lt;img loading="lazy" sizes="(max-width: 767px) calc(100vw - 30px), (max-width: 1023px) 700px, (max-width: 1279px) 950px, 1232px" src="https://hack-le.com/images/uploads/2025/09/95b24b1ccd585bb2a99cc2ca0d64dbca-700x423.webp"&gt;&lt;/p&gt;&#10;&lt;p&gt;&lt;em&gt;スナック菓子感覚で契約&lt;/em&gt;&lt;/p&gt;&#10;&lt;p&gt;起動したら、コンソールからメールサーバを選んで設定していく。手順は「&lt;a class="link" href="https://support.conoha.jp/v/mail-owned-domain/#02" target="_blank" rel="noopener"&#10; &gt;メールサーバーで独自ドメインを使う｜ConoHa VPSサポート&lt;/a&gt;」にあるけどさらっと書く。&lt;/p&gt;&#10;&lt;p&gt;「ドメインリスト」で+ドメインして、持っているドメインを追加する。&lt;/p&gt;&#10;&lt;p&gt;&lt;img loading="lazy" sizes="(max-width: 767px) calc(100vw - 30px), (max-width: 1023px) 700px, (max-width: 1279px) 950px, 1232px" src="https://hack-le.com/images/uploads/2025/09/image-8-700x90.png"&gt;&lt;/p&gt;&#10;&lt;p&gt;追加したらその下の「メールアドレスリスト」でほしいメールアドレスを追加する。&lt;/p&gt;&#10;&lt;h3 id="dnsの設定"&gt;DNSの設定&#10;&lt;/h3&gt;&lt;p&gt;で、早速使っていきたいところだが、ここで&lt;strong&gt;MX/DKIM/SPF/DMARCの設定をDNSでしないといけない&lt;/strong&gt;。MXはともかくDKIM/SPF/DMARCはなんぞ、という人もいると思われるが、これが何かについては下記の記事を参照。やらないと迷惑メール扱いになる可能性が上がってしまうのでやろう。個人的にはあんまり意味ないと思っているがこれも時代なので仕方が無い。&lt;/p&gt;&#10;&lt;div class="blog-card-wrapper"&gt;&#10; &lt;a href="https://hack-le.com/dkim-spf-dmarc/" class="blog-card"&gt;&#10; &lt;div class="blog-card-content"&gt;&#10; &lt;div class="blog-card-label"&gt;&#10; &lt;svg xmlns="http://www.w3.org/2000/svg" width="13" height="13" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"&gt;&lt;path d="M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.71"&gt;&lt;/path&gt;&lt;path d="M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71"&gt;&lt;/path&gt;&lt;/svg&gt;&#10; &lt;span&gt;あわせて読みたい&lt;/span&gt;&#10; &lt;/div&gt;&#10; &lt;div class="blog-card-title"&gt;独自ドメインでメールするために、DKIM/SPF/DMARCのお勉強&lt;/div&gt;&#10; &lt;div class="blog-card-url"&gt;/dkim-spf-dmarc/&lt;/div&gt;&#10; &lt;/div&gt;&#10; &lt;div class="blog-card-thumbnail"&gt;&#10; &lt;img src="https://hack-le.com/images/uploads/2026/09/eyecatch_14196_1789100822.webp" alt="独自ドメインでメールするために、DKIM/SPF/DMARCのお勉強" loading="lazy" /&gt;&#10; &lt;/div&gt;&#10; &lt;/a&gt;&#10;&lt;/div&gt;&#10;&#10;&lt;p&gt;作成したメールアドレスを開くと、DNS情報としてDKIMとSPFの情報があるので、それぞれホストと値をコピペして、各々が管理しているレジストラないしリセラーのところで編集作業。特に指定はない。&lt;strong&gt;ConoHaのDNSサービスを使わなくて良い&lt;/strong&gt;。僕はCloudflareに隷従している。&lt;/p&gt;&#10;&lt;ul&gt;&#10;&lt;li&gt;MX: 「サーバー情報」に載ってるやつを記載。優先度は10でいんじゃない&lt;/li&gt;&#10;&lt;li&gt;DKIM: メールアドレスを選択して載ってるv=DKIM1うんたらみたいなやつ&lt;/li&gt;&#10;&lt;li&gt;SPF: 同上。v=SPF1みたいなの&lt;/li&gt;&#10;&lt;li&gt;DMARC: 名前は 「_dmarc 」で値は「&amp;ldquo;v=DMARC1; p=none&amp;rdquo;」（小声）&#10;&lt;ul&gt;&#10;&lt;li&gt;ちゃんとやるなら、ちゃんとやる&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;p&gt;特にハマるところはないと思うんだが、既にレコード登録されている場合は削除が必要。設定した覚えなくても、各地を転々としていると設定されていることもある。実際、今回いじった時、以前レンサバ使っていた時に設定されたのか、MXとSPFのレコードが既に登録してあった。そういうこともある。&lt;/p&gt;&#10;&lt;h3 id="メールクライアントで試す"&gt;メールクライアントで試す&#10;&lt;/h3&gt;&lt;p&gt;コンソール画面よりメールアドレスを選択すると、接続先サーバでPOP、SMTP、IMAPのメールサーバのドメインが載っている。ので、アカウントとパスワード情報を持ち寄って設定。ポート番号とかの設定は「&lt;a class="link" href="https://support.conoha.jp/v/mail-owned-domain/#02" target="_blank" rel="noopener"&#10; &gt;メールサーバーで独自ドメインを使う｜ConoHa VPSサポート&lt;/a&gt;」の下部にあるけど、たいていのクライアントでは自動でいけるんじゃないか。Macのメール.appとVivaldiで試したが、どちらもつつがなく認識された。&lt;/p&gt;&#10;&lt;p&gt;送受信のテストはもちろんGmail。コイツがいけたらだいたいいけるだろう。いきなり送信もなんなので受信から。受信できたら送信して返す。送信を確認できたら動作確認完了。&lt;/p&gt;&#10;&lt;h2 id="所感楽には違いない"&gt;所感：楽には違いない&#10;&lt;/h2&gt;&lt;p&gt;ということで一通り完了です。契約してから30分くらいで送受信できてビックリした。っていうかDNSの反映も随分と早くなったものだね。確かに楽には違いない。楽ではあるが、600円/月と言われるとちょっと躊躇う。年間7,200円だからなぁ。&lt;/p&gt;&#10;&lt;p&gt;まぁせっかくなのでもうちょっと使ってみるかね。ってか結局長期運用しないと実態はわからないからなぁ。これだけじゃただのやってみた記事だし。まか今回はとりあえずサクッとやってみれたということで。&lt;/p&gt;&#10;&lt;p&gt;折を見てプログラムから送信くらいはするか。ブログドメインhack-le.comでメルマガでもやったろうか。誰も登録しない。&lt;/p&gt;&#10;&lt;p&gt;最後にいつものクーポン広告だが、以下のリンクです。&lt;/p&gt;&#10;&lt;p&gt;&lt;a class="link" href="https://www.conoha.jp/referral/?token=nNgrOjEEXwCVfvRYHJSDh.zn3QtmUyxWoTDKxWHvrZSWHGWKZ3o-HER" target="_blank" rel="noopener"&#10; &gt;お友達紹介&lt;/a&gt;&lt;/p&gt;&#10;&lt;p&gt;こっから飛んで使い始めてもらったら1000円分のクーポンがもらえる（&lt;a class="link" href="https://www.conoha.jp/conotomo/" target="_blank" rel="noopener"&#10; &gt;このとも ～友達紹介～｜レンタルサーバーならConoHa&lt;/a&gt;）。そして定常的に使ったら僕に2000円分のクーポンが入る。クーポンが入るとなんか色々遊んで適当にレビューするかもしれない。&lt;/p&gt;&#10;</description></item><item><title>Slack/Teams代替？セルフホストできるチャットサービス Campfire を軽く試す</title><link>https://hack-le.com/slack-teams-campfire/</link><pubDate>Mon, 22 Sep 2025 00:00:00 +0900</pubDate><guid>https://hack-le.com/slack-teams-campfire/</guid><description>&lt;p&gt;Redditで何か話題になってたので。OnceのCampfireはざっくり言うならSlackやTeamsのようなチャットツールと言うと多分通りがよいと思われる。OSSで、自分でサーバたてられるのが特徴。現実的にはRuby on Railsの会社っていうのが一番の気もしつつ。&lt;/p&gt;&#10;&lt;p&gt;チャットできるやつちょっとほしいなと思っていたので、軽くローカルで試した。ほんとに軽く。。。メッセージの送受信とbotだけ。。。&lt;/p&gt;&#10;&lt;h2 id="環境"&gt;環境&#10;&lt;/h2&gt;&lt;ul&gt;&#10;&lt;li&gt;M2 Pro Mac mini&lt;/li&gt;&#10;&lt;li&gt;macOS Sonoma 14.7.7&lt;/li&gt;&#10;&lt;li&gt;Docker Desktop 4.43.2&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;h2 id="インストール最小限"&gt;インストール（最小限）&#10;&lt;/h2&gt;&lt;p&gt;とりあえず「&lt;a class="link" href="https://github.com/basecamp/once-campfire" target="_blank" rel="noopener"&#10; &gt;basecamp/once-campfire&lt;/a&gt;」からcloneする。その後、本当に最小限、ローカルで動作を確認することだけを目的にした起動。&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-yaml" data-lang="yaml"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c"&gt;# クローン&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="l"&gt;git clone https://github.com/basecamp/once-campfire.git&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="l"&gt;cd once-campfire&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c"&gt;# 秘密鍵を生成&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="l"&gt;export SECRET_KEY_BASE=$(openssl rand -hex 64)&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c"&gt;# ビルド&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="l"&gt;docker build -t campfire .&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c"&gt;# 実行（SSL無効でローカルテスト）&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="l"&gt;docker run \&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;--&lt;span class="l"&gt;publish 3000:80 \&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;--&lt;span class="l"&gt;volume campfire-storage:/rails/storage \&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;--&lt;span class="l"&gt;env SECRET_KEY_BASE=$SECRET_KEY_BASE \&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;--&lt;span class="l"&gt;env DISABLE_SSL=true \&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l"&gt;campfire&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;SSL切ってるし通知も切ってる。とにかく動作を見たかった。&lt;/p&gt;&#10;&lt;h2 id="動作確認"&gt;動作確認&#10;&lt;/h2&gt;&lt;p&gt;最初、管理者の設定となる。例によってポート3000にアクセスし、名前、メールアドレス、パスワードを入力してログイン。&lt;/p&gt;&#10;&lt;p&gt;開くといきなりチャットルームになる。これは全員参加。適当に話すと適当にチャットできる。&lt;/p&gt;&#10;&lt;p&gt;新しい人を参加させるには、参加者が招待URLを送る方式。これは管理者じゃなくてもできるようだ。なので、&lt;strong&gt;参加URLを知っている人なら誰でも参加できる模様&lt;/strong&gt;。招待URLはいつでも更新可能。&lt;/p&gt;&#10;&lt;p&gt;ただし、参加後に閲覧できるルームは管理者が制御する。逆に言うと、&lt;strong&gt;ルームごとのアカウント制御を管理者が適切にする方式っぽいね&lt;/strong&gt;。&lt;/p&gt;&#10;&lt;p&gt;参加したあとはまんまSlack。&lt;/p&gt;&#10;&lt;p&gt;&lt;img loading="lazy" sizes="(max-width: 767px) calc(100vw - 30px), (max-width: 1023px) 700px, (max-width: 1279px) 950px, 1232px" src="https://hack-le.com/images/uploads/2025/09/4edf6e699160b7ab0a533b430fd8d785-700x270.webp"&gt;&lt;/p&gt;&#10;&lt;p&gt;全員自分。そしてbot。悲しい。&lt;/p&gt;&#10;&lt;p&gt;botは設定画面の、右上にあるロボットっぽいアイコンから設定することが可能。&lt;/p&gt;&#10;&lt;p&gt;&lt;img loading="lazy" sizes="(max-width: 767px) calc(100vw - 30px), (max-width: 1023px) 700px, (max-width: 1279px) 950px, 1232px" src="https://hack-le.com/images/uploads/2025/09/e1f8b2cbb6f5ffd006ac44ff5d4a4f8e-700x530.webp"&gt;&lt;/p&gt;&#10;&lt;p&gt;Webhook URLはレスポンスほしい時の投げ先なので、投稿するだけなら空でよし。設定するとcurlのサンプルがあるので、実行するとtestロボットが投稿。つまりこれもURL知ってるとできる感じだね。なんかあったらURL変えたらええやろのスタンスか。&lt;/p&gt;&#10;&lt;p&gt;&lt;img loading="lazy" sizes="(max-width: 767px) calc(100vw - 30px), (max-width: 1023px) 700px, (max-width: 1279px) 950px, 1232px" src="https://hack-le.com/images/uploads/2025/09/b0063a09640af2d91027228d7e6c07ae-700x270.webp"&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;p&gt;所感としては、なんというか、本当にシンプルなんだけれど、それ以上に人を信頼してるシステムだなぁと思った。さすがというべきなのか。&lt;/p&gt;&#10;&lt;p&gt;管理人がルームごとに参加者の制御と適宜なんかあったらURL変更する運用かな。URL知っていれば参加できるけどルームへの参加は許可がいるし、なんかしたらBANされてURLも変えられるし、それでええやん、って感じ。&lt;strong&gt;参加者に一定の信頼を置いた、管理者による人治主義のシステム&lt;/strong&gt;と思った。&lt;/p&gt;&#10;&lt;p&gt;検索すると使った人の記事より先にコードを読みたがっている人の記事が出てくるようなアプリではあるんだが、コードの行数が少ないと驚かれていたけれど、言語の表現力や技術だけでなく、設計思想の根幹に&lt;strong&gt;ユーザへの信頼&lt;/strong&gt;もあるんでなかろうか。&lt;/p&gt;&#10;&lt;p&gt;まぁ人は確かに間違える生き物なんだけど、その間違いを「許せない！！責任を取れ！！！」みたいに許容できなくなったり、まして「人間は悪意を持った犯罪者だ！！！」みたいに一切信用しないと、システムはどんどん複雑になるよね。逆に言うと、&lt;strong&gt;人間に信頼し、間違いを許容すればシステムはシンプルになる&lt;/strong&gt;。&lt;strong&gt;とはいえ事故はある&lt;/strong&gt;ので、それを防ぐガードレールはあったほうがいいんじゃないってのはそうだと思うし、塩梅ではあるんだけれど。&lt;/p&gt;&#10;&lt;p&gt;とりあえず、いじっていこうかな。チャットボットちょっとほしかったんだ。&lt;/p&gt;&#10;</description></item><item><title>レンサバのWordPressサイトを、既にWordPressコンテナを持っているVPSにデータベース共有で移行する</title><link>https://hack-le.com/wordpress-vps-server/</link><pubDate>Mon, 15 Sep 2025 00:00:00 +0900</pubDate><guid>https://hack-le.com/wordpress-vps-server/</guid><description>&lt;p&gt;自分でタイトル見直して笑った。これやりたい人日本に何人いるんだろう。&lt;/p&gt;&#10;&lt;p&gt;なお、レンサバはカラフルボックス。カラフルボックスで管理しているWordPressのサイトを、VPSに移行する。ただし、VPSには既にWordPressのコンテナをたてている。WordPressのマルチサイトはめんどくさいが、データベースをいっぱいつくるのはRAM的に嫌なので、DBは共有する。そういうニッチな手順。&lt;/p&gt;&#10;&lt;p&gt;個人サイトの移行であんまり真面目にやってないので、サイトはダウンする。ダウンタイムは許容する。&lt;/p&gt;&#10;&lt;h2 id="前提と構成"&gt;前提と構成&#10;&lt;/h2&gt;&lt;p&gt;今回のやること&lt;/p&gt;&#10;&lt;ul&gt;&#10;&lt;li&gt;現在、VPSでサイトAとサイトBを管理している（Docker管理）。VPSではCloudflare Tunnel経由でサイト公開している&lt;/li&gt;&#10;&lt;li&gt;サイトAとサイトBは同じDBを共有している&lt;/li&gt;&#10;&lt;li&gt;レンサバのカラフルボックスで管理しているサイトCを、VPSでサイトA、Bと一緒に管理したい&lt;/li&gt;&#10;&lt;li&gt;データベースは共有する&lt;/li&gt;&#10;&lt;li&gt;DNSは、リセラーとしてムームードメインで管理している&#10;&lt;ul&gt;&#10;&lt;li&gt;ムームードメインにはなんのこだわりもない。むしろ嫌な思い出すらある。完全に惰性&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;p&gt;つまり現在の構成は以下だ。&lt;/p&gt;&#10;&lt;pre class="mermaid" style="visibility:hidden"&gt;graph TD&#10;mumu(ムームードメイン)&#10;cff(Cloudflare)&#10;mumu --&gt; cff&#10;cff --&gt; cf&#10;subgraph VPS&#10;wp1(サイトA)&#10;wp2(サイトB)&#10;db(データベース)&#10;cf(Cloudflare Tunnel)&#10;end&#10;cf --&gt; wp1&#10;cf --&gt; wp2&#10;wp1 -.-&gt; db&#10;wp2 -.-&gt; db&#10;mumu --&gt;cldns&#10;subgraph カラフルボックス&#10;cldns(ドメイン管理)&#10;wp3(サイトC)&#10;end&#10;cldns --&gt; wp3&lt;/pre&gt;&lt;p&gt;これが以下のようになる。&lt;/p&gt;&#10;&lt;pre class="mermaid" style="visibility:hidden"&gt;graph TD&#10;mumu(ムームードメイン)&#10;cff(Cloudflare)&#10;mumu --&gt; cff&#10;cff --&gt; cf&#10;subgraph VPS&#10;wp1(サイトA)&#10;wp2(サイトB)&#10;wp3(サイトC)&#10;db(データベース)&#10;cf(Cloudflare Tunnel)&#10;end&#10;cf --&gt; wp1&#10;cf --&gt; wp2&#10;cf --&gt; wp3&#10;wp1 -.-&gt; db&#10;wp2 -.-&gt; db&#10;wp3 -.-&gt; db&lt;/pre&gt;&lt;p&gt;この絵を見て「？？？」となるなら、多分この記事はあまり役に立たない。しかしそもそもレンサバ使っている人がこんなことをするのか謎ではある。&lt;/p&gt;&#10;&lt;h2 id="この記事で説明しないこと"&gt;この記事で説明しないこと&#10;&lt;/h2&gt;&lt;p&gt;この記事には前提知識がある。以下のことはわかっている前提とする。&lt;/p&gt;&#10;&lt;ul&gt;&#10;&lt;li&gt;カラフルボックス、ムームードメインなどリセラー、レジストラの設定&lt;/li&gt;&#10;&lt;li&gt;Cloudflare Tunnelの設定&lt;/li&gt;&#10;&lt;li&gt;WordPressのバックアップ、復元の詳細手順&#10;&lt;ul&gt;&#10;&lt;li&gt;ローカルで練習することを強く推奨する&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;/li&gt;&#10;&lt;li&gt;NSの向け先を変える意味&lt;/li&gt;&#10;&lt;li&gt;dockerの基本&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;p&gt;この記事の内容は個人サイトとして最悪の事態を招く可能性があるので、わからないならやらないほうがいい。&lt;/p&gt;&#10;&lt;p&gt;LLMあたりに聞いてね。まぁこんなニッチな手順やる人はだいたいわかっている気はするが……。&lt;/p&gt;&#10;&lt;h2 id="バックアップ--古いサイトかどうか判別できるマーカを残す"&gt;バックアップ &amp;amp; 古いサイトかどうか判別できるマーカを残す&#10;&lt;/h2&gt;&lt;p&gt;まずは当然ながらバックアップ。バックアップのやり方は好きにすればいいが、個人的には UpdraftPlus を使っている。バックアップデータはDropboxに置いている。正直無料で使うのは申し訳ないくらいなんだが、買い切りモデルがないし、無料プランで十分なんだよなぁという。&lt;/p&gt;&#10;&lt;p&gt;で、バックアップした後、「サイト引っ越し作業中です」みたいなマーカを残しておく。これによって、サイト引っ越し後、「マーカがあったら古いサイトを見ている、なかったら新しいサイトを見ている」と判別できる。&lt;/p&gt;&#10;&lt;h2 id="vps側の準備"&gt;VPS側の準備&#10;&lt;/h2&gt;&lt;p&gt;ダウンタイムはなんだかんだで短くしたいので、VPS側の下準備。&lt;/p&gt;&#10;&lt;h3 id="設定の確認"&gt;設定の確認&#10;&lt;/h3&gt;&lt;p&gt;とりあえず &lt;code&gt;docker-compose.yml&lt;/code&gt;を確認する。以下はすでにサイト1,2があるとする。ポート番号は10880,10881とする。&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-yaml" data-lang="yaml"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nt"&gt;services&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="c"&gt;# サイト1: メインサイト&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;site1_wordpress&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;image&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l"&gt;wordpress:latest&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;ports&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;- &lt;span class="s2"&gt;&amp;#34;10880:80&amp;#34;&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;environment&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;WORDPRESS_DB_HOST&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l"&gt;wp_db&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;WORDPRESS_DB_USER&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l"&gt;${SITE1_DB_USER}&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;WORDPRESS_DB_PASSWORD&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l"&gt;${SITE1_DB_PASSWORD}&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;WORDPRESS_DB_NAME&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l"&gt;${SITE1_DB_NAME}&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;volumes&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;- &lt;span class="l"&gt;site1_wordpress_data:/var/www/html&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;- &lt;span class="l"&gt;./custom-php.ini:/usr/local/etc/php/conf.d/custom-php.ini&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;restart&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l"&gt;always&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;depends_on&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;- &lt;span class="l"&gt;wp_db&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="c"&gt;# サイト2: サブサイト&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;site2_wordpress&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;image&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l"&gt;wordpress:latest&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;ports&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;- &lt;span class="s2"&gt;&amp;#34;10881:80&amp;#34;&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;environment&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;WORDPRESS_DB_HOST&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l"&gt;wp_db&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;WORDPRESS_DB_USER&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l"&gt;${SITE2_DB_USER}&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;WORDPRESS_DB_PASSWORD&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l"&gt;${SITE2_DB_PASSWORD}&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;WORDPRESS_DB_NAME&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l"&gt;${SITE2_DB_NAME}&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;volumes&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;- &lt;span class="l"&gt;site2_wordpress_data:/var/www/html&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;- &lt;span class="l"&gt;./custom-php.ini:/usr/local/etc/php/conf.d/custom-php.ini&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;restart&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l"&gt;always&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;depends_on&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;- &lt;span class="l"&gt;wp_db&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="c"&gt;# 共有データベース&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;wp_db&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;image&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l"&gt;mariadb:latest&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;environment&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;MYSQL_ROOT_PASSWORD&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l"&gt;${MYSQL_ROOT_PASSWORD}&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;volumes&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;- &lt;span class="l"&gt;wp_db_data:/var/lib/mysql&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;restart&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l"&gt;always&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="c"&gt;# Cloudflareトンネル&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;cloudflared_main&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;image&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l"&gt;cloudflare/cloudflared:latest&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;network_mode&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;host&amp;#34;&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;command&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l"&gt;tunnel --no-autoupdate run --token ${CLOUDFLARED_TUNNEL_TOKEN_MAIN}&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;restart&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l"&gt;always&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nt"&gt;volumes&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;site1_wordpress_data&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;site2_wordpress_data&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;wp_db_data&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;&lt;code&gt;.env&lt;/code&gt;は以下とする。&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-yaml" data-lang="yaml"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c"&gt;# MariaDBルートパスワード&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="l"&gt;MYSQL_ROOT_PASSWORD=your_secure_root_password_here&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c"&gt;# サイト1のデータベース設定&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="l"&gt;SITE1_DB_USER=site1_user&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="l"&gt;SITE1_DB_PASSWORD=your_secure_password_1&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="l"&gt;SITE1_DB_NAME=site1_db&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c"&gt;# サイト2のデータベース設定&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="l"&gt;SITE2_DB_USER=site2_user&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="l"&gt;SITE2_DB_PASSWORD=your_secure_password_2&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="l"&gt;SITE2_DB_NAME=site2_db&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c"&gt;# Cloudflareトンネルトークン（メインドメイン用）&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="l"&gt;CLOUDFLARED_TUNNEL_TOKEN_MAIN=your_cloudflare_tunnel_token_here&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h3 id="dbでユーザとテーブルの作成"&gt;DBでユーザとテーブルの作成&#10;&lt;/h3&gt;&lt;p&gt;データベース共有するので、ユーザとテーブルを手動で追加する。&lt;/p&gt;&#10;&lt;p&gt;コンテナに入る&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-javascript" data-lang="javascript"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nx"&gt;docker&lt;/span&gt; &lt;span class="nx"&gt;ps&lt;/span&gt; &lt;span class="err"&gt;#&lt;/span&gt; &lt;span class="nx"&gt;コンテナ名を調べる&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nx"&gt;docker&lt;/span&gt; &lt;span class="nx"&gt;exec&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="nx"&gt;it&lt;/span&gt; &lt;span class="nx"&gt;コンテナ名&lt;/span&gt; &lt;span class="nx"&gt;mariadb&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="nx"&gt;u&lt;/span&gt; &lt;span class="nx"&gt;root&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="nx"&gt;p&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;パスワード聞かれるので答えて入る。&lt;/p&gt;&#10;&lt;p&gt;以下設定とその反映。&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-javascript" data-lang="javascript"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nx"&gt;CREATE&lt;/span&gt; &lt;span class="nx"&gt;DATABASE&lt;/span&gt; &lt;span class="nx"&gt;データベース名&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nx"&gt;CREATE&lt;/span&gt; &lt;span class="nx"&gt;USER&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;ユーザ&amp;#39;&lt;/span&gt;&lt;span class="err"&gt;@&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;%&amp;#39;&lt;/span&gt; &lt;span class="nx"&gt;IDENTIFIED&lt;/span&gt; &lt;span class="nx"&gt;BY&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;パスワードをここに入力&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nx"&gt;GRANT&lt;/span&gt; &lt;span class="nx"&gt;ALL&lt;/span&gt; &lt;span class="nx"&gt;PRIVILEGES&lt;/span&gt; &lt;span class="nx"&gt;ON&lt;/span&gt; &lt;span class="nx"&gt;データベース名&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="nx"&gt;TO&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;ユーザ&amp;#39;&lt;/span&gt;&lt;span class="err"&gt;@&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;%&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nx"&gt;FLUSH&lt;/span&gt; &lt;span class="nx"&gt;PRIVILEGES&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nx"&gt;SHOW&lt;/span&gt; &lt;span class="nx"&gt;DATABASES&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nx"&gt;SELECT&lt;/span&gt; &lt;span class="nx"&gt;User&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;Host&lt;/span&gt; &lt;span class="nx"&gt;FROM&lt;/span&gt; &lt;span class="nx"&gt;mysql&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;user&lt;/span&gt; &lt;span class="nx"&gt;WHERE&lt;/span&gt; &lt;span class="nx"&gt;User&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;ユーザ&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nx"&gt;EXIT&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;ここでユーザとデータベース名とパスワードはひかえる。そして &lt;code&gt;.env&lt;/code&gt; に追記する。&lt;/p&gt;&#10;&lt;p&gt;&lt;code&gt;docker-compose.yml&lt;/code&gt; に設定を追加する。新サイトのポート番号は10882とする。&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-yaml" data-lang="yaml"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nt"&gt;services&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="c"&gt;# サイト1: メインサイト&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;site1_wordpress&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;image&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l"&gt;wordpress:latest&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;ports&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;- &lt;span class="s2"&gt;&amp;#34;10880:80&amp;#34;&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;environment&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;WORDPRESS_DB_HOST&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l"&gt;wp_db&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;WORDPRESS_DB_USER&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l"&gt;${SITE1_DB_USER}&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;WORDPRESS_DB_PASSWORD&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l"&gt;${SITE1_DB_PASSWORD}&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;WORDPRESS_DB_NAME&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l"&gt;${SITE1_DB_NAME}&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;volumes&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;- &lt;span class="l"&gt;site1_wordpress_data:/var/www/html&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;- &lt;span class="l"&gt;./custom-php.ini:/usr/local/etc/php/conf.d/custom-php.ini&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;restart&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l"&gt;always&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;depends_on&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;- &lt;span class="l"&gt;wp_db&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="c"&gt;# サイト2: サブサイト&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;site2_wordpress&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;image&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l"&gt;wordpress:latest&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;ports&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;- &lt;span class="s2"&gt;&amp;#34;10881:80&amp;#34;&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;environment&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;WORDPRESS_DB_HOST&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l"&gt;wp_db&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;WORDPRESS_DB_USER&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l"&gt;${SITE2_DB_USER}&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;WORDPRESS_DB_PASSWORD&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l"&gt;${SITE2_DB_PASSWORD}&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;WORDPRESS_DB_NAME&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l"&gt;${SITE2_DB_NAME}&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;volumes&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;- &lt;span class="l"&gt;site2_wordpress_data:/var/www/html&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;- &lt;span class="l"&gt;./custom-php.ini:/usr/local/etc/php/conf.d/custom-php.ini&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;restart&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l"&gt;always&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;depends_on&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;- &lt;span class="l"&gt;wp_db&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="c"&gt;# サイト3: 追加サイト&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;site3_wordpress&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;image&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l"&gt;wordpress:latest&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;ports&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;- &lt;span class="s2"&gt;&amp;#34;10882:80&amp;#34;&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;environment&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;WORDPRESS_DB_HOST&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l"&gt;wp_db&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;WORDPRESS_DB_USER&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l"&gt;${SITE3_DB_USER}&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;WORDPRESS_DB_PASSWORD&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l"&gt;${SITE3_DB_PASSWORD}&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;WORDPRESS_DB_NAME&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l"&gt;${SITE3_DB_NAME}&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;volumes&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;- &lt;span class="l"&gt;site3_wordpress_data:/var/www/html&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;- &lt;span class="l"&gt;./custom-php.ini:/usr/local/etc/php/conf.d/custom-php.ini&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;restart&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l"&gt;always&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;depends_on&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;- &lt;span class="l"&gt;wp_db&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="c"&gt;# 共有データベース&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;wp_db&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;image&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l"&gt;mariadb:latest&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;environment&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;MYSQL_ROOT_PASSWORD&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l"&gt;${MYSQL_ROOT_PASSWORD}&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;volumes&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;- &lt;span class="l"&gt;wp_db_data:/var/lib/mysql&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;restart&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l"&gt;always&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="c"&gt;# Cloudflareトンネル（メインドメイン用）&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;cloudflared_main&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;image&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l"&gt;cloudflare/cloudflared:latest&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;network_mode&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;host&amp;#34;&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;command&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l"&gt;tunnel --no-autoupdate run --token ${CLOUDFLARED_TUNNEL_TOKEN_MAIN}&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;restart&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l"&gt;always&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nt"&gt;volumes&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;site1_wordpress_data&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;site2_wordpress_data&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;site3_wordpress_data&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="c"&gt;# 追加&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;wp_db_data&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;そして &lt;code&gt;.env&lt;/code&gt;は以下のようになる。&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-yaml" data-lang="yaml"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c"&gt;# MariaDBルートパスワード&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="l"&gt;MYSQL_ROOT_PASSWORD=your_secure_root_password_here&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c"&gt;# サイト1のデータベース設定&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="l"&gt;SITE1_DB_USER=site1_user&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="l"&gt;SITE1_DB_PASSWORD=your_secure_password_1&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="l"&gt;SITE1_DB_NAME=site1_db&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c"&gt;# サイト2のデータベース設定&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="l"&gt;SITE2_DB_USER=site2_user&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="l"&gt;SITE2_DB_PASSWORD=your_secure_password_2&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="l"&gt;SITE2_DB_NAME=site2_db&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c"&gt;# サイト3のデータベース設定 (追加分)&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="l"&gt;SITE3_DB_USER=site3_user&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="l"&gt;SITE3_DB_PASSWORD=your_secure_password_3&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="l"&gt;SITE3_DB_NAME=site3_db&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c"&gt;# Cloudflareトンネルトークン（メインドメイン用）&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="l"&gt;CLOUDFLARED_TUNNEL_TOKEN_MAIN=your_cloudflare_tunnel_token_here&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;そしてここまでの動作を確認するためコンテナ起動。&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-javascript" data-lang="javascript"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nx"&gt;docker&lt;/span&gt; &lt;span class="nx"&gt;compose&lt;/span&gt; &lt;span class="nx"&gt;up&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="nx"&gt;d&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;既にあるサイトにアクセスして、問題なく動作していることを確認。&lt;/p&gt;&#10;&lt;h3 id="なんとかしてwordpressの初期設定をする"&gt;なんとかしてWordPressの初期設定をする&#10;&lt;/h3&gt;&lt;p&gt;localhostなら問題ないが、VPS上にあるとそのまま直にはいけない。まぁやり方は色々あると思うんだが、ここでは既存のCloudflareで管理するドメインより、一時作業のサブドメインを払い出して、トンネル経由で初期画面を設定する。さすがに管理者ユーザとパスワードだけは設定しないといけないからね。&lt;/p&gt;&#10;&lt;p&gt;終わったら、「設定」からWordPressアドレスとサイトアドレスを、本来のドメインに変更する。これによって本来のドメインにぶっ飛ばされるため、移行管理画面には入れない。&lt;/p&gt;&#10;&lt;h2 id="cloudflareの準備"&gt;Cloudflareの準備&#10;&lt;/h2&gt;&lt;h3 id="オンボードの追加"&gt;オンボードの追加&#10;&lt;/h3&gt;&lt;p&gt;アカウントホームより、オンボードを追加する。現在のDNSをスキャンする。Aレコードとかは多分いらないので削除する。このへんは適切にやる。&lt;/p&gt;&#10;&lt;h3 id="nsの設定ダウンタイム発生"&gt;NSの設定（ダウンタイム発生）&#10;&lt;/h3&gt;&lt;p&gt;さてここからはダウンタイム発生となるが、NSの向け先を変更する。これによって、当然ながらサイトはめっちゃ不安定になる。ってかまぁ、落ちているのが正常、という状態。&lt;/p&gt;&#10;&lt;p&gt;設定はレジストラまたはリセラー次第となる。僕はムームードメインを惰性で使っているが、ドメイン一覧からドメインを選択すると、ネームサーバを取得できるようになる。&lt;/p&gt;&#10;&lt;p&gt;&lt;img loading="lazy" sizes="(max-width: 767px) calc(100vw - 30px), (max-width: 1023px) 700px, (max-width: 1279px) 950px, 1232px" src="https://hack-le.com/images/uploads/2025/09/image-4-700x408.png"&gt;&lt;/p&gt;&#10;&lt;p&gt;&lt;strong&gt;この設定をした段階で、サイトが新サイトと旧サイトの両方が参照されるようになる&lt;/strong&gt;。&lt;/p&gt;&#10;&lt;p&gt;CloudflareがNS向いたことを確認次第、トンネルを掘れるようになる。NSの設定後、トイレにいって戻ってきたらもう認識していた。はやい。Zero TrsutよりCloudflare Tunnelのパブリックホストで急いで設定。&lt;/p&gt;&#10;&lt;h2 id="新サイトで復元"&gt;新サイトで復元&#10;&lt;/h2&gt;&lt;p&gt;新サイトにアクセスする。このとき、ゲストプロファイルなどを使うと、新サイトが参照されやすい。新サイトにアクセスしたら急いで復元。復元後は、元サイトにつけたマーカの有無で、旧サイトか新サイトのどちらを参照しているかが今後はわかる。&lt;/p&gt;&#10;&lt;p&gt;&lt;strong&gt;うまくいけば数分くらいのダウンタイムで済む&lt;/strong&gt;。&lt;/p&gt;&#10;&lt;p&gt;以上。&lt;/p&gt;&#10;&lt;h2 id="ムームードメインの思い出"&gt;ムームードメインの思い出&#10;&lt;/h2&gt;&lt;p&gt;ところでムームードメインの嫌な思い出はこれ。&lt;/p&gt;&#10;&lt;div class="blog-card-wrapper"&gt;&#10; &lt;a href="https://hack-le.com/serverholdxyz/" class="blog-card"&gt;&#10; &lt;div class="blog-card-content"&gt;&#10; &lt;div class="blog-card-label"&gt;&#10; &lt;svg xmlns="http://www.w3.org/2000/svg" width="13" height="13" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"&gt;&lt;path d="M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.71"&gt;&lt;/path&gt;&lt;path d="M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71"&gt;&lt;/path&gt;&lt;/svg&gt;&#10; &lt;span&gt;あわせて読みたい&lt;/span&gt;&#10; &lt;/div&gt;&#10; &lt;div class="blog-card-title"&gt;ムームードメイン &amp;#43; .xyzドメイン で利用制限にかかる。この組み合わせはオススメしない&lt;/div&gt;&#10; &lt;div class="blog-card-url"&gt;/serverholdxyz/&lt;/div&gt;&#10; &lt;/div&gt;&#10; &lt;div class="blog-card-thumbnail"&gt;&#10; &lt;img src="https://hack-le.com/images/uploads/2026/09/eyecatch_2853_1789479186.webp" alt="ムームードメイン &amp;#43; .xyzドメイン で利用制限にかかる。この組み合わせはオススメしない" loading="lazy" /&gt;&#10; &lt;/div&gt;&#10; &lt;/a&gt;&#10;&lt;/div&gt;&#10;&#10;&lt;p&gt;ただこれは、ムームードメインよりも.xyzのレジストリ側の責任が大きいとは思う。&lt;/p&gt;&#10;&lt;p&gt;この時に、DNSってインターネットの根幹なんだなと思った。インターネットは脆いよ。&lt;/p&gt;&#10;</description></item><item><title>Homebrew環境におけるGiteaのエクスポート：brew services start giteaとgitea webの違いがわかる男</title><link>https://hack-le.com/homebrew-gitea-brew-services-start-gitea-gitea-web/</link><pubDate>Fri, 12 Sep 2025 00:00:00 +0900</pubDate><guid>https://hack-le.com/homebrew-gitea-brew-services-start-gitea-gitea-web/</guid><description>&lt;p&gt;なんか色々躓いたので、復元は後日にして、今回はエクスポートについてのみ。なんか色々ハマった。&lt;/p&gt;&#10;&lt;p&gt;具体的には、最初に &lt;code&gt;gitea web&lt;/code&gt; で動かして、その後 &lt;code&gt;brew services start gitea&lt;/code&gt;のほうがいいやんけと思ってそっちにしたんだが、その後バックアップ手順を確認しようと &lt;code&gt;gitea dump&lt;/code&gt;したら、なぜか最初に &lt;code&gt;gitea web&lt;/code&gt; で作ったほうがバックアップされる。よく見たら実行プログラムのパスが違っており、それによって読み込まれる設定ファイルが違ったと思われる。&lt;/p&gt;&#10;&lt;h2 id="環境"&gt;環境&#10;&lt;/h2&gt;&lt;ul&gt;&#10;&lt;li&gt;M2 Pro Mac mini, Intel Mac mini 2018&lt;/li&gt;&#10;&lt;li&gt;macOS 14.7.7 (Sonoma)&lt;/li&gt;&#10;&lt;li&gt;gitea 1.24.5 (via brew)&lt;/li&gt;&#10;&lt;li&gt;&lt;code&gt;brew services start gitea&lt;/code&gt;で起動&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;h2 id="giteaが分裂した"&gt;giteaが分裂した。&#10;&lt;/h2&gt;&lt;p&gt;公式: &lt;a class="link" href="https://docs.gitea.com/administration/backup-and-restore" target="_blank" rel="noopener"&#10; &gt;Backup and Restore | Gitea Documentation&lt;/a&gt;&lt;/p&gt;&#10;&lt;p&gt;公式にあるとおり、エクスポートはコマンドが用意されており、 &lt;code&gt;gitea dump -c /path/to/app.ini&lt;/code&gt;に尽きる。ただここで問題は、 &lt;code&gt;gitea&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-javascript" data-lang="javascript"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="nx"&gt;ps&lt;/span&gt; &lt;span class="nx"&gt;aux&lt;/span&gt; &lt;span class="o"&gt;|&lt;/span&gt; &lt;span class="nx"&gt;grep&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="nx"&gt;i&lt;/span&gt; &lt;span class="nx"&gt;gitea&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nx"&gt;user&lt;/span&gt; &lt;span class="mi"&gt;19745&lt;/span&gt; &lt;span class="mf"&gt;0.7&lt;/span&gt; &lt;span class="mf"&gt;0.5&lt;/span&gt; &lt;span class="mi"&gt;412867040&lt;/span&gt; &lt;span class="mi"&gt;168992&lt;/span&gt; &lt;span class="o"&gt;??&lt;/span&gt; &lt;span class="nx"&gt;S&lt;/span&gt; &lt;span class="mi"&gt;7&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;38&lt;/span&gt;&lt;span class="nx"&gt;PM&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt;&lt;span class="mf"&gt;00.56&lt;/span&gt; &lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="nx"&gt;opt&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="nx"&gt;homebrew&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="nx"&gt;opt&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="nx"&gt;gitea&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="nx"&gt;bin&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="nx"&gt;gitea&lt;/span&gt; &lt;span class="nx"&gt;web&lt;/span&gt; &lt;span class="o"&gt;--&lt;/span&gt;&lt;span class="nx"&gt;work&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="nx"&gt;path&lt;/span&gt; &lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="nx"&gt;opt&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="nx"&gt;homebrew&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="kd"&gt;var&lt;/span&gt;&lt;span class="err"&gt;/gitea&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="o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="nx"&gt;which&lt;/span&gt; &lt;span class="nx"&gt;gitea&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="err"&gt;/opt/homebrew/bin/gitea&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;すごく……パスが違います……。&lt;/p&gt;&#10;&lt;p&gt;&lt;code&gt;gitea&lt;/code&gt;コマンドは &lt;code&gt;/opt/homebrew/bin/gitea&lt;/code&gt;なんだが、brewで起動する &lt;code&gt;gitea&lt;/code&gt;は &lt;code&gt;/opt/homebrew/opt/gitea/bin/gitea&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-javascript" data-lang="javascript"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="nx"&gt;ls&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="nx"&gt;la&lt;/span&gt; &lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="nx"&gt;opt&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="nx"&gt;homebrew&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="nx"&gt;bin&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="nx"&gt;gitea&lt;/span&gt; &#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="err"&gt;/opt/homebrew/bin/gitea@ -&amp;gt; ../Cellar/gitea/1.24.5/bin/gitea&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="nx"&gt;ls&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="nx"&gt;li&lt;/span&gt; &lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="nx"&gt;opt&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="nx"&gt;homebrew&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="nx"&gt;Cellar&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="nx"&gt;gitea&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="mf"&gt;1.24&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="mi"&gt;5&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="nx"&gt;bin&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="nx"&gt;gitea&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="mi"&gt;251898619&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="nx"&gt;r&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="nx"&gt;xr&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="nx"&gt;xr&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="nx"&gt;x&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt; &lt;span class="nx"&gt;user&lt;/span&gt; &lt;span class="nx"&gt;admin&lt;/span&gt; &lt;span class="mi"&gt;107386178&lt;/span&gt; &lt;span class="nx"&gt;Aug&lt;/span&gt; &lt;span class="mi"&gt;14&lt;/span&gt; &lt;span class="mi"&gt;01&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;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="o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="nx"&gt;ls&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="nx"&gt;la&lt;/span&gt; &lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="nx"&gt;opt&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="nx"&gt;homebrew&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="nx"&gt;opt&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="nx"&gt;gitea&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="nx"&gt;bin&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="nx"&gt;gitea&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="err"&gt;/opt/homebrew/opt/gitea/bin/gitea*&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="nx"&gt;ls&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="nx"&gt;li&lt;/span&gt; &lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="nx"&gt;opt&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="nx"&gt;homebrew&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="nx"&gt;opt&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="nx"&gt;gitea&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="nx"&gt;bin&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="nx"&gt;gitea&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="mi"&gt;251898619&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="nx"&gt;r&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="nx"&gt;xr&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="nx"&gt;xr&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="nx"&gt;x&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt; &lt;span class="nx"&gt;user&lt;/span&gt; &lt;span class="nx"&gt;admin&lt;/span&gt; &lt;span class="mi"&gt;107386178&lt;/span&gt; &lt;span class="nx"&gt;Aug&lt;/span&gt; &lt;span class="mi"&gt;14&lt;/span&gt; &lt;span class="mi"&gt;01&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;34&lt;/span&gt; &lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="nx"&gt;opt&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="nx"&gt;homebrew&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="nx"&gt;opt&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="nx"&gt;gitea&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="nx"&gt;bin&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="nx"&gt;gitea&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;なので、実行プログラムのパスで、読み込まれる暗黙のコンフィグパスが異なったものと思われる。brewで起動した方は、&amp;ndash;work-pathを指定しているね。ここにコンフィグファイルもある。&lt;/p&gt;&#10;&lt;h2 id="パスの違いがわかる男"&gt;パスの違いがわかる男&#10;&lt;/h2&gt;&lt;p&gt;ということで、work-pathも踏まえて、dumpのコマンドは以下となる。停止できるなら停止したほうが安全だね。&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-javascript" data-lang="javascript"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nx"&gt;brew&lt;/span&gt; &lt;span class="nx"&gt;services&lt;/span&gt; &lt;span class="nx"&gt;stop&lt;/span&gt; &lt;span class="nx"&gt;gitea&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nx"&gt;gitea&lt;/span&gt; &lt;span class="nx"&gt;dump&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="nx"&gt;c&lt;/span&gt; &lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="nx"&gt;opt&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="nx"&gt;homebrew&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="kd"&gt;var&lt;/span&gt;&lt;span class="err"&gt;/gitea/custom/conf/app.ini&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nx"&gt;brew&lt;/span&gt; &lt;span class="nx"&gt;services&lt;/span&gt; &lt;span class="nx"&gt;start&lt;/span&gt; &lt;span class="nx"&gt;gitea&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-javascript" data-lang="javascript"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nx"&gt;gitea&lt;/span&gt; &lt;span class="nx"&gt;dump&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="nx"&gt;c&lt;/span&gt; &lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="nx"&gt;opt&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="nx"&gt;homebrew&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="kd"&gt;var&lt;/span&gt;&lt;span class="err"&gt;/gitea/custom/conf/app.ini -f gitea-backup-$(date +%Y%m%d-%H%M%S).zip&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;こいつをunzipすると以下のような感じだ。&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-javascript" data-lang="javascript"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nx"&gt;gitea&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="nx"&gt;backup&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="nx"&gt;YYYYMMDD&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="nx"&gt;HHMMSS&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;zip&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="err"&gt;├──&lt;/span&gt; &lt;span class="nx"&gt;app&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;ini&lt;/span&gt; &lt;span class="err"&gt;#&lt;/span&gt; &lt;span class="nx"&gt;設定ファイル&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="err"&gt;├──&lt;/span&gt; &lt;span class="nx"&gt;data&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt; &lt;span class="err"&gt;#&lt;/span&gt; &lt;span class="nx"&gt;アプリケーションデータ&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="err"&gt;│&lt;/span&gt; &lt;span class="err"&gt;├──&lt;/span&gt; &lt;span class="nx"&gt;attachments&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt; &lt;span class="err"&gt;#&lt;/span&gt; &lt;span class="nx"&gt;添付ファイル&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="err"&gt;│&lt;/span&gt; &lt;span class="err"&gt;├──&lt;/span&gt; &lt;span class="nx"&gt;avatars&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt; &lt;span class="err"&gt;#&lt;/span&gt; &lt;span class="nx"&gt;アバター画像&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="err"&gt;│&lt;/span&gt; &lt;span class="err"&gt;├──&lt;/span&gt; &lt;span class="nx"&gt;gitea&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;db&lt;/span&gt; &lt;span class="err"&gt;#&lt;/span&gt; &lt;span class="nx"&gt;データベースファイル&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="err"&gt;│&lt;/span&gt; &lt;span class="err"&gt;└──&lt;/span&gt; &lt;span class="p"&gt;...&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="err"&gt;├──&lt;/span&gt; &lt;span class="nx"&gt;repos&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt; &lt;span class="err"&gt;#&lt;/span&gt; &lt;span class="nx"&gt;Gitリポジトリ&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="err"&gt;│&lt;/span&gt; &lt;span class="err"&gt;└──&lt;/span&gt; &lt;span class="nx"&gt;user&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="nx"&gt;repo&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;git&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt; &lt;span class="err"&gt;#&lt;/span&gt; &lt;span class="nx"&gt;実際のGitリポジトリ&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="err"&gt;└──&lt;/span&gt; &lt;span class="nx"&gt;gitea&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="nx"&gt;db&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;sql&lt;/span&gt; &lt;span class="err"&gt;#&lt;/span&gt; &lt;span class="nx"&gt;データベースダンプ&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;このうち、&lt;code&gt;app.ini&lt;/code&gt;は違うマシンでやるときにはゴチャゴチャと手動調整しないといけなくなると思う。ネットワーク環境とか、リポジトリのパスとか、環境によって変わるはずなので。特にMacからLinux……とかやるとね。&lt;/p&gt;&#10;&lt;h2 id="所感"&gt;所感&#10;&lt;/h2&gt;&lt;p&gt;サクッとできるだろうと思ったら思いのほか躓いた。LLMは永遠に存在しないパスを教えてくれるので10倍疲れた。インフラ周りになると途端に無能になるLLMさんェ……。それでもいるだけマシだろうと言われたらそうかもしれないんだが、昔は検索したら同じようなところで躓いた人の記事が出たもんだけどなぁと思ってしまう。&lt;/p&gt;&#10;&lt;p&gt;まぁ今回は &lt;code&gt;brew services&lt;/code&gt; あんまり使ったことなかったから、それでちょっとハマったよね。自分でplist作ったら問題なかったんだろうけど。&lt;/p&gt;&#10;&lt;p&gt;今回はMacかつHomebrew経由特有の問題があったので、Dockerコンテナなら環境の共通化は多少できると思う。けど、ネットワーク環境とかはやっぱり違うだろうし、 &lt;code&gt;app.ini&lt;/code&gt;は同一マシンでの復元以外は基本的に編集しないといけないんじゃないかな。となると、編集項目が1箇所でも5箇所でも、編集しないといけない時点で大して変わらないし、Docker使うと &lt;code&gt;docker-compose.yml&lt;/code&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/github-gitea-1/" 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;脱GitHubに向けて：Giteaを試し始める on Mac&lt;/div&gt;&#10; &lt;div class="blog-card-url"&gt;/github-gitea-1/&lt;/div&gt;&#10; &lt;/div&gt;&#10; &lt;div class="blog-card-thumbnail"&gt;&#10; &lt;img src="https://hack-le.com/images/uploads/2026/09/eyecatch_19169_1789090146.webp" alt="脱GitHubに向けて：Giteaを試し始める on Mac" loading="lazy" /&gt;&#10; &lt;/div&gt;&#10; &lt;/a&gt;&#10;&lt;/div&gt;&#10;&#10;</description></item><item><title>WebベースのファイラFile Browserを試す：こういうのでいいんだよ</title><link>https://hack-le.com/web-file-browser/</link><pubDate>Thu, 04 Sep 2025 23:42:10 +0900</pubDate><guid>https://hack-le.com/web-file-browser/</guid><description>&lt;p&gt;&lt;a class="link" href="https://filebrowser.org/" target="_blank" rel="noopener"&#10; &gt;File Browser&lt;/a&gt;&lt;/p&gt;&#10;&lt;p&gt;Webベースで使えるファイルブラウザ、その名もFile Browserを試している。名前すごい。これは本当にその名の通りで、Web上からファイル操作ができるものだ。Webベースなので、タブレットやスマホからPCのファイルにアクセスできるのが良いところ。&lt;/p&gt;&#10;&lt;h2 id="すべてのメディアに専用アプリはいらないので"&gt;すべてのメディアに専用アプリはいらないので&#10;&lt;/h2&gt;&lt;p&gt;たとえば自分の場合は、さっと音楽ファイルを聞きたいときなんかに使うことがある。&lt;/p&gt;&#10;&lt;p&gt;&lt;img loading="lazy" sizes="(max-width: 767px) calc(100vw - 30px), (max-width: 1023px) 700px, (max-width: 1279px) 950px, 1232px" src="https://hack-le.com/images/uploads/2025/09/image-1-700x356.png"&gt;&lt;/p&gt;&#10;&lt;p&gt;こんな感じでPC上にあるすべての音楽ファイルに慣れたディレクトリ構成でアクセスできる。他にもちょっと「あの写真見たい」とか「あそこにドキュメントおいてたな」みたいな時に使う。&lt;/p&gt;&#10;&lt;p&gt;それらはまぁ専用アプリにはより高度な機能のビューアやエディタがあるわけだが、&lt;strong&gt;すべてのデバイスにすべてのメディアについて専用アプリを入れているわけじゃないし、そもそも常にそんな大仰なことをしたいわけでもない。俺はただファイルの中身を見たいだけなんだ&lt;/strong&gt;。&lt;/p&gt;&#10;&lt;p&gt;また、場合によっては、他のPCで操作したドキュメントを置きたいとかもある。そんな時にも使える。いちいちDropboxだのでインターネットを経由する必要はないし（DropboxはLAN内同期もあるけど）SMBでボリュームマウントとかもしたくないんだ。&lt;/p&gt;&#10;&lt;p&gt;なので、&lt;strong&gt;このアプリはまさにこういうのでいいんだよ&lt;/strong&gt;、という感じだ。&lt;/p&gt;&#10;&lt;h2 id="macでのインストールと自動起動"&gt;Macでのインストールと自動起動&#10;&lt;/h2&gt;&lt;p&gt;環境&lt;/p&gt;&#10;&lt;ul&gt;&#10;&lt;li&gt;M2 Pro Mac mini&lt;/li&gt;&#10;&lt;li&gt;macOS 14.7.7&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;p&gt;インストールはバイナリが色々あるので、OSごとにそれ用のやつを使えばいいと思うが、Macの場合はHomebrewになる（別に使いたければDocker使えばいいけど、ホームユースでその意義はない気がする）。&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-javascript" data-lang="javascript"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nx"&gt;brew&lt;/span&gt; &lt;span class="nx"&gt;tap&lt;/span&gt; &lt;span class="nx"&gt;filebrowser&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="nx"&gt;tap&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nx"&gt;brew&lt;/span&gt; &lt;span class="nx"&gt;install&lt;/span&gt; &lt;span class="nx"&gt;filebrowser&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-javascript" data-lang="javascript"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nx"&gt;filebrowser&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="nx"&gt;r&lt;/span&gt; &lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="nx"&gt;path&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="nx"&gt;to&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="nx"&gt;your&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="nx"&gt;files&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;アプリの性質上、ログイン時に起動したいんだがなぁ、ということもあるだろう。そういう場合は例によってLaunchAgentsを使うことになる。 &lt;code&gt;~/Library/LaunchAgents&lt;/code&gt;に適当な一意のファイル名（なんでもいいけど &lt;code&gt;homebrew.mxcl.filebrowser.plist&lt;/code&gt;とかそんな感じで）にして、下記のようにする。&lt;/p&gt;&#10;&lt;p&gt;以下のうち、ポート番号と&amp;lt;ユーザ名&amp;gt;と&amp;lt;パス&amp;gt;のところを、やりたいようにする。ここではポート番号は13000にしているが、空いているところを適当に。&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-javascript" data-lang="javascript"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="o"&gt;&amp;lt;?&lt;/span&gt;&lt;span class="nx"&gt;xml&lt;/span&gt; &lt;span class="nx"&gt;version&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;1.0&amp;#34;&lt;/span&gt; &lt;span class="nx"&gt;encoding&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;UTF-8&amp;#34;&lt;/span&gt;&lt;span class="o"&gt;?&amp;gt;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="o"&gt;&amp;lt;!&lt;/span&gt;&lt;span class="nx"&gt;DOCTYPE&lt;/span&gt; &lt;span class="nx"&gt;plist&lt;/span&gt; &lt;span class="nx"&gt;PUBLIC&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;-//Apple//DTD PLIST 1.0//EN&amp;#34;&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;http://www.apple.com/DTDs/PropertyList-1.0.dtd&amp;#34;&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nx"&gt;plist&lt;/span&gt; &lt;span class="nx"&gt;version&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;1.0&amp;#34;&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nx"&gt;dict&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nx"&gt;key&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;&lt;span class="nx"&gt;Label&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="err"&gt;/key&amp;gt;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nx"&gt;string&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;&lt;span class="nx"&gt;homebrew&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;mxcl&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;filebrowser&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="err"&gt;/string&amp;gt;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nx"&gt;key&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;&lt;span class="nx"&gt;ProgramArguments&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="err"&gt;/key&amp;gt;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nx"&gt;array&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nx"&gt;string&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;&lt;span class="err"&gt;/opt/homebrew/bin/filebrowser&amp;lt;/string&amp;gt;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nx"&gt;string&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;-&lt;/span&gt;&lt;span class="nx"&gt;a&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="err"&gt;/string&amp;gt;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nx"&gt;string&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;&lt;span class="mf"&gt;0.0&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="mf"&gt;0.0&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="err"&gt;/string&amp;gt;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nx"&gt;string&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;-&lt;/span&gt;&lt;span class="nx"&gt;p&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="err"&gt;/string&amp;gt;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nx"&gt;string&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;&lt;span class="mi"&gt;13000&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="err"&gt;/string&amp;gt;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nx"&gt;string&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;-&lt;/span&gt;&lt;span class="nx"&gt;r&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="err"&gt;/string&amp;gt;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nx"&gt;string&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;&lt;span class="sr"&gt;/Users/&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nx"&gt;ユーザ名&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;&lt;span class="err"&gt;/&amp;lt;ブラウジングしたいしたいパス&amp;gt;&amp;lt;/string&amp;gt;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="err"&gt;/array&amp;gt;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nx"&gt;key&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;&lt;span class="nx"&gt;RunAtLoad&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="err"&gt;/key&amp;gt;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="kc"&gt;true&lt;/span&gt;&lt;span class="o"&gt;/&amp;gt;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nx"&gt;key&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;&lt;span class="nx"&gt;KeepAlive&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="err"&gt;/key&amp;gt;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="kc"&gt;true&lt;/span&gt;&lt;span class="o"&gt;/&amp;gt;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nx"&gt;key&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;&lt;span class="nx"&gt;WorkingDirectory&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="err"&gt;/key&amp;gt;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nx"&gt;string&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;&lt;span class="sr"&gt;/Users/&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nx"&gt;ユーザ名&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&amp;lt;&lt;/span&gt;&lt;span class="err"&gt;/string&amp;gt;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nx"&gt;key&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;&lt;span class="nx"&gt;StandardOutPath&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="err"&gt;/key&amp;gt;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nx"&gt;string&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;&lt;span class="err"&gt;/tmp/filebrowser.log&amp;lt;/string&amp;gt;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nx"&gt;key&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;&lt;span class="nx"&gt;StandardErrorPath&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="err"&gt;/key&amp;gt;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nx"&gt;string&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;&lt;span class="err"&gt;/tmp/filebrowser.error.log&amp;lt;/string&amp;gt;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="err"&gt;/dict&amp;gt;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="err"&gt;/plist&amp;gt;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;できたらloadする。&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-javascript" data-lang="javascript"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nx"&gt;launchctl&lt;/span&gt; &lt;span class="nx"&gt;load&lt;/span&gt; &lt;span class="o"&gt;~&lt;/span&gt;&lt;span class="err"&gt;/Library/LaunchAgents/&amp;lt;作ったplistのファイル名&amp;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;http://&amp;lt;サーバのIPアドレス&amp;gt;:&amp;lt;ポート&amp;gt;&lt;/code&gt;にアクセスして確認する……のだが、この時、管理ユーザ&lt;code&gt;admin&lt;/code&gt;の初期パスワードがランダムで発行されてんだよね。なので、plistファイルにあるとおり標準出力パスの &lt;code&gt;/tmp/filebrowser.log&lt;/code&gt;からランダム生成されたパスワードをコピペする。&lt;/p&gt;&#10;&lt;p&gt;そしたら admin &amp;amp; パスワード でログインできる。パスワードは変更しておく。&lt;/p&gt;&#10;&lt;p&gt;あとは見たら使えるやろファイラだし。&lt;/p&gt;&#10;&lt;h2 id="所感"&gt;所感&#10;&lt;/h2&gt;&lt;p&gt;なんか本当に「こういうのでいいんだよ、こういうので」って感じ。Cloudflare Tunnelとか組み合わせればインターネット経由でもまぁやれるし、用途次第ではDropboxとかGoogle Driveの代わりにもなるんじゃないかな。&lt;/p&gt;&#10;</description></item><item><title>脱GitHubに向けて：Giteaを試し始める on Mac</title><link>https://hack-le.com/github-gitea-1/</link><pubDate>Wed, 03 Sep 2025 17:22:19 +0900</pubDate><guid>https://hack-le.com/github-gitea-1/</guid><description>&lt;p&gt;最近のMSはまたMSになってきたので、GitHubもいつどうなるかわからない、ということで、コード管理をセルフホストにしていきたい。&lt;/p&gt;&#10;&lt;h2 id="環境とインストール"&gt;環境とインストール&#10;&lt;/h2&gt;&lt;p&gt;ひとまず手元のMacで動かす&lt;/p&gt;&#10;&lt;ul&gt;&#10;&lt;li&gt;M2 Pro Mac mini&lt;/li&gt;&#10;&lt;li&gt;Intel Mac mini 2018&lt;/li&gt;&#10;&lt;li&gt;macOS 14.7.7&lt;/li&gt;&#10;&lt;li&gt;gitea 1.24.5 via Homebrew&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;p&gt;インストールは 「&lt;a class="link" href="https://docs.gitea.com/category/installation" target="_blank" rel="noopener"&#10; &gt;Installation | Gitea Documentation&lt;/a&gt;」色々あるわけだが、楽なのでbrew install。もしVPSでやるときは、Linuxなのでまた考える。でも別に家のMac miniでいい気もしている。Dockerは特に使う必要性を感じなかったので使わない。データベースでSQLite以外使うならコンテナでまとめてやったほうがいいかなと思う。今回はデータベースもSQLiteでファイル管理するつもりだし、無駄にオーバーヘッド作る必要もないかなって。&lt;/p&gt;&#10;&lt;p&gt;（2025-09-11）この記事を書いた時はDockerいらんかなと思ったんだけれど、バックアップ/復元まで考えたときに、パスなど環境の差分がけっこうしんどい感じだった。Dockerのほうがその点は吸収できそうだが、ただ結局IPアドレスやポート番号など、差分はやはりあるし、docker-compose.ymlの管理もあるので、どちらが良いかは一概には言えないかなぁという感じ。&lt;/p&gt;&#10;&lt;p&gt;公式: &lt;a class="link" href="https://about.gitea.com/" target="_blank" rel="noopener"&#10; &gt;Gitea Official Website&lt;/a&gt;&lt;/p&gt;&#10;&lt;h2 id="セットアップ"&gt;セットアップ&#10;&lt;/h2&gt;&lt;p&gt;インストールしたら &lt;code&gt;brew services start gitea&lt;/code&gt; で開始する。これはつまり&lt;code&gt;gitea web&lt;/code&gt;をしてそれ用のplistも作って登録する感じなんだが、わざわざ自分で頑張る意味もないので、Homebrew勢は黙ってstart gitea。&lt;/p&gt;&#10;&lt;p&gt;そしたら、 &lt;code&gt;http://&amp;lt;サーバのIPアドレス&amp;gt;:3000&lt;/code&gt; にWebブラウザでアクセスして初期設定をする。&lt;/p&gt;&#10;&lt;ul&gt;&#10;&lt;li&gt;&lt;strong&gt;データベースはSQLite3&lt;/strong&gt;にする。ファイルで管理したいから。&#10;&lt;ul&gt;&#10;&lt;li&gt;Homebrewだとファイルパスの初期設定は &lt;code&gt;/opt/homebrew/bin/data/gitea.db&lt;/code&gt; になるようだ&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;/li&gt;&#10;&lt;li&gt;リポジトリのルートパス（リモートリポジトリのデータの実体）、LFSファイルパス（Large File Storage……でかいファイルは別におくようだ）はひとまず初期値で続行&lt;/li&gt;&#10;&lt;li&gt;サーバードメインはLAN内の固定したプライベートIPアドレスを割り当て&lt;/li&gt;&#10;&lt;li&gt;HTTPポートは3000使いたくないので変更&lt;/li&gt;&#10;&lt;li&gt;内部でしか使わないのでベースURLはサーバードメインとポートそのまま&lt;/li&gt;&#10;&lt;li&gt;オプション眺めたが、ひとまず初期値で続行&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;p&gt;新しいURLで入り直すと、初期画面がある。&lt;/p&gt;&#10;&lt;p&gt;&lt;img loading="lazy" sizes="(max-width: 767px) calc(100vw - 30px), (max-width: 1023px) 700px, (max-width: 1279px) 950px, 1232px" src="https://hack-le.com/images/uploads/2025/09/605375b117ae067b2f378449ace1d898-700x575.webp"&gt;&lt;/p&gt;&#10;&lt;p&gt;右上の登録から最初のユーザを登録する。これが管理者になる。&lt;/p&gt;&#10;&lt;h2 id="試す"&gt;試す&#10;&lt;/h2&gt;&lt;h3 id="リポジトリの作成とpullpush"&gt;リポジトリの作成とpull/push&#10;&lt;/h3&gt;&lt;p&gt;とりあえずリポジトリを適当に作って試す。まずWeb画面上でリポジトリを作成する。宗教上の理由によりブランチ名をmain-&amp;gt;masterにし、それ以外は初期値でGo。リポジトリはできた。&lt;/p&gt;&#10;&lt;p&gt;クローンする。&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-javascript" data-lang="javascript"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nx"&gt;git&lt;/span&gt; &lt;span class="nx"&gt;clone&lt;/span&gt; &lt;span class="nx"&gt;http&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt;&lt;span class="c1"&gt;//&amp;lt;サーバアドレス&amp;gt;:&amp;lt;ポート&amp;gt;/&amp;lt;リポジトリ名&amp;gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;cloneは可能。移動してpushまで試す。&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-javascript" data-lang="javascript"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;master&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="nx"&gt;touch&lt;/span&gt; &lt;span class="nx"&gt;hoge&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;master&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="nx"&gt;git&lt;/span&gt; &lt;span class="nx"&gt;add&lt;/span&gt; &lt;span class="nx"&gt;hoge&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;master&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="nx"&gt;git&lt;/span&gt; &lt;span class="nx"&gt;commit&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="nx"&gt;m&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;first commit&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="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;master&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="nx"&gt;git&lt;/span&gt; &lt;span class="nx"&gt;push&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;user名とパスワードを求められるが、入力すればとおる。ふむ。&lt;/p&gt;&#10;&lt;p&gt;いったん作ったディレクトリを削除して、次にssh経由を試す。&lt;/p&gt;&#10;&lt;h3 id="ssh鍵"&gt;ssh鍵&#10;&lt;/h3&gt;&lt;p&gt;ssh鍵くらいは登録しておく。ここでは既存の公開鍵 &lt;code&gt;id_rsa.pub&lt;/code&gt; を使う。&lt;/p&gt;&#10;&lt;ul&gt;&#10;&lt;li&gt;右上のプロフィールアイコンから「設定」&lt;/li&gt;&#10;&lt;li&gt;左メニューの「SSH/GPGキー」&lt;/li&gt;&#10;&lt;li&gt;SSHの「キーを追加」で &lt;code&gt;id_rsa.pub&lt;/code&gt; の中身を登録&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;p&gt;そしたら &lt;code&gt;git clone ssh://ほげほげ&lt;/code&gt; でクローンする（適当）。入って適当にファイル作ってaddしてpushできるかを確認。特にパスワードを求められずに登録できたらOK。&lt;/p&gt;&#10;&lt;p&gt;その後気づいたのだが、Giteaはsshについてだいぶトリッキーなことをしているようで、~/.ssh/authorized_keysにcommandを記述している。で、リモートログインの時に支障をきたす。また、アンインストール時にはここの部分を削除しないといけない。&lt;/p&gt;&#10;&lt;h2 id="少しずつ試していく"&gt;少しずつ試していく&#10;&lt;/h2&gt;&lt;p&gt;ということで、今回はさらっと最低限のssh経由のpush/pullをやっただけだが、一応これだけでもローカル内にあるちょっとしたプロジェクトの管理には使える格好だ。とはいえ実際のバックアップ・復元手順なども確認する必要もあるし、GitHub Actionsみたいなことをしたくなったらどうなるんだろう、とかわからないことも多いので、これから少しずつ試していきたい。&lt;/p&gt;&#10;</description></item><item><title>Android + CloudBeats + QNAP NAS + Cloudflareで外でNASの音楽をストリーミング&amp;オフライン再生する</title><link>https://hack-le.com/android-cloudbeats-qnap-nas-cloudflare%E3%81%A7%E5%A4%96%E3%81%A7nas%E3%81%AE%E9%9F%B3%E6%A5%BD%E3%82%92%E3%82%B9%E3%83%88%E3%83%AA%E3%83%BC%E3%83%9F%E3%83%B3%E3%82%B0%E3%82%AA%E3%83%95/</link><pubDate>Mon, 01 Sep 2025 10:46:57 +0900</pubDate><guid>https://hack-le.com/android-cloudbeats-qnap-nas-cloudflare%E3%81%A7%E5%A4%96%E3%81%A7nas%E3%81%AE%E9%9F%B3%E6%A5%BD%E3%82%92%E3%82%B9%E3%83%88%E3%83%AA%E3%83%BC%E3%83%9F%E3%83%B3%E3%82%B0%E3%82%AA%E3%83%95/</guid><description>&lt;p&gt;Androidスマホでお外でNASの音楽聴きたいなぁ、スマホのストレージはゴミだしmicroSDも挿せないからストリーミングしたいなぁ……という記事。&lt;/p&gt;&#10;&lt;p&gt;最初に言うとCloudBeatsは複数のクラウド接続とオフライン再生は有料アプリなので（非サブスク）、多少金は払うが、まぁでもNASやストレージの代金に比べたら誤差だし、なによりDropboxせいぜい1.5か月分くらいなので。&lt;/p&gt;&#10;&lt;p&gt;外で開くので独自ドメイン使う。外からの接続にはCloudflare Tunnel使う。このへんのネットワーク構成は好きにすればだけど&lt;/p&gt;&#10;&lt;h2 id="環境"&gt;環境&#10;&lt;/h2&gt;&lt;ul&gt;&#10;&lt;li&gt;QNAP NAS TS-233&#10;&lt;ul&gt;&#10;&lt;li&gt;FW: QTS 5.2.6.3195&lt;/li&gt;&#10;&lt;li&gt;CPU: Quad-core ARM Cortex-A55 Processor @ 2.0GHz&lt;/li&gt;&#10;&lt;li&gt;RAM: 2GB&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;/li&gt;&#10;&lt;li&gt;Androidスマホ Pixel 7 128GB&#10;&lt;ul&gt;&#10;&lt;li&gt;OS: Android 16&lt;/li&gt;&#10;&lt;li&gt;アプリ: CloudBeats 2.60.03&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;/li&gt;&#10;&lt;li&gt;独自ドメイン&#10;&lt;ul&gt;&#10;&lt;li&gt;Cloudflare管理&lt;/li&gt;&#10;&lt;li&gt;Cloudflare Tunnel利用&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;p&gt;NASはQNAPのエントリーレベルのやつだけど、WebDAVやる限りは別に問題ないね。&lt;/p&gt;&#10;&lt;p&gt;構成を図示すると以下。&lt;/p&gt;&#10;&lt;pre class="mermaid" style="visibility:hidden"&gt;graph LR&#10;subgraph Internet&#10;android(Android)&#10;cloudflare(Cloudflare)&#10;end&#10;subgraph Home&#10;nas(NAS)&#10;pc(PC)&#10;end&#10;android --&gt; cloudflare&#10;cloudflare --&gt;|Cloudflare Tunnel| pc&#10;pc --&gt;|webDAV| nas&lt;/pre&gt;&lt;p&gt;踏み台となっているPCは常時稼働サーバ前提ではある。少なくともお外に出ている時に起動しているもの。うちはMac miniがそれにあたる。&lt;/p&gt;&#10;&lt;div class="blog-card-wrapper"&gt;&#10; &lt;a href="https://hack-le.com/docker%e3%82%b3%e3%83%b3%e3%83%86%e3%83%8a%e3%82%b5%e3%83%bc%e3%83%90%e3%83%bc%e6%a9%9f%e3%81%a8%e3%81%97%e3%81%a6%e4%bd%99%e7%94%9f%e3%82%92%e7%94%9f%e3%81%8d%e3%82%8bintel-mac-mini-2018/" class="blog-card"&gt;&#10; &lt;div class="blog-card-content"&gt;&#10; &lt;div class="blog-card-label"&gt;&#10; &lt;svg xmlns="http://www.w3.org/2000/svg" width="13" height="13" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"&gt;&lt;path d="M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.71"&gt;&lt;/path&gt;&lt;path d="M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71"&gt;&lt;/path&gt;&lt;/svg&gt;&#10; &lt;span&gt;あわせて読みたい&lt;/span&gt;&#10; &lt;/div&gt;&#10; &lt;div class="blog-card-title"&gt;Dockerコンテナサーバー機として余生を生きるIntel Mac mini 2018&lt;/div&gt;&#10; &lt;div class="blog-card-url"&gt;/dockerコンテナサーバー機として余生を生きるintel-mac-mini-2018/&lt;/div&gt;&#10; &lt;/div&gt;&#10; &lt;div class="blog-card-thumbnail"&gt;&#10; &lt;img src="https://hack-le.com/images/uploads/2026/08/eyecatch_15372_1787719893.webp" alt="Dockerコンテナサーバー機として余生を生きるIntel Mac mini 2018" loading="lazy" /&gt;&#10; &lt;/div&gt;&#10; &lt;/a&gt;&#10;&lt;/div&gt;&#10;&#10;&lt;p&gt;AndroidアプリはCloudBeatsを使っているけれど、WebDAV扱える音楽アプリなら別になんでもいいと思う。僕は「オフライン再生 + ストリーミング再生 + クラウド接続」でこれに行き着いたが、他にいいのがあるなら別にそれはそれで。&lt;/p&gt;&#10;&lt;p&gt;費用についていえば、NASとスマホは既にある前提なら、CloudBeatsの有料オプションが1500円、ドメイン管理代が年間1500-2000円くらいかな。CloudBeatsの有料オプションは、オフライン再生と複数クラウドサービスを利用したい時用なので、厳密にはなくてもいいんだが……サブスクじゃないんだし買えばいいと思う。&lt;/p&gt;&#10;&lt;h2 id="経緯"&gt;経緯&#10;&lt;/h2&gt;&lt;p&gt;設計意図とかの経緯については下記記事。一言で言えば脱Dropboxだね。&lt;/p&gt;&#10;&lt;div class="blog-card-wrapper"&gt;&#10; &lt;a href="https://hack-le.com/dropboxnas-streaming-music/" class="blog-card"&gt;&#10; &lt;div class="blog-card-content"&gt;&#10; &lt;div class="blog-card-label"&gt;&#10; &lt;svg xmlns="http://www.w3.org/2000/svg" width="13" height="13" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"&gt;&lt;path d="M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.71"&gt;&lt;/path&gt;&lt;path d="M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71"&gt;&lt;/path&gt;&lt;/svg&gt;&#10; &lt;span&gt;あわせて読みたい&lt;/span&gt;&#10; &lt;/div&gt;&#10; &lt;div class="blog-card-title"&gt;脱Dropbox：NASの音楽ファイルをストリーミングで再生する試み&lt;/div&gt;&#10; &lt;div class="blog-card-url"&gt;/dropboxnas-streaming-music/&lt;/div&gt;&#10; &lt;/div&gt;&#10; &lt;div class="blog-card-thumbnail"&gt;&#10; &lt;img src="https://hack-le.com/images/uploads/2026/09/eyecatch_18950_1789090081.webp" alt="脱Dropbox：NASの音楽ファイルをストリーミングで再生する試み" loading="lazy" /&gt;&#10; &lt;/div&gt;&#10; &lt;/a&gt;&#10;&lt;/div&gt;&#10;&#10;&lt;h2 id="qnapの設定"&gt;QNAPの設定&#10;&lt;/h2&gt;&lt;p&gt;NASのWebアプリにログインして、コントロールパネルを開こう。基本的に権限設定周りのことをする。&lt;/p&gt;&#10;&lt;h3 id="webdavを有効化する"&gt;WebDAVを有効化する&#10;&lt;/h3&gt;&lt;p&gt;まず有効化する。&lt;/p&gt;&#10;&lt;p&gt;「コントロールパネル」→「ネットワークとファイル差ビス」→「Win/Mac/NFS/WebDAV」&lt;/p&gt;&#10;&lt;p&gt;&lt;img loading="lazy" sizes="(max-width: 767px) calc(100vw - 30px), (max-width: 1023px) 700px, (max-width: 1279px) 950px, 1232px" src="https://hack-le.com/images/uploads/2025/09/image-700x362.png"&gt;&lt;/p&gt;&#10;&lt;p&gt;そしたらWebDAVタブがあるので、「WebDAVを有効にする」と、「WebDAV権限」にチェック。ポートは占有ポート番号使っていいと思うよ。&lt;/p&gt;&#10;&lt;p&gt;&lt;img loading="lazy" sizes="(max-width: 767px) calc(100vw - 30px), (max-width: 1023px) 700px, (max-width: 1279px) 950px, 1232px" src="https://hack-le.com/images/uploads/2025/08/0ed8ea26e55e330a706d91df2b59d7c5-700x350.png"&gt;&lt;/p&gt;&#10;&lt;h3 id="webdav用の共有フォルダを作成する"&gt;WebDAV用の共有フォルダを作成する&#10;&lt;/h3&gt;&lt;p&gt;別に既存のフォルダでもいいかもしれないが、なんかあった時のためと整理のために、それ用のフォルダ作っていいかなと思う。そしたら最悪クラックされたとしても、WebDAV経由ではそのフォルダしか触れないように。&lt;/p&gt;&#10;&lt;h3 id="webdav用のユーザを作成する"&gt;WebDAV用のユーザを作成する&#10;&lt;/h3&gt;&lt;p&gt;まぁこれも必須じゃないんだけれど、上記と一緒。ファイル管理自体は普段の管理用ユーザだとなんかあったときの被害が広がる恐れもあるので、WebDAVアクセス用ユーザは作っておいたほうがよいかと。どうせ一手間なんだし。&lt;/p&gt;&#10;&lt;p&gt;ということでWebDAV用ユーザを作成する。言うまでもないが、外からのアクセスに使うものなので、適当なPWにしないように。WebDAV用ユーザは次の「権限の編集」でWebDAVの読み取り権限のみ付与する。&lt;/p&gt;&#10;&lt;h3 id="権限の編集をする"&gt;権限の編集をする&#10;&lt;/h3&gt;&lt;p&gt;QNAP曰く、下記のように権限設定が必要らしい。&lt;/p&gt;&#10;&lt;p&gt;&lt;img loading="lazy" sizes="(max-width: 767px) calc(100vw - 30px), (max-width: 1023px) 700px, (max-width: 1279px) 950px, 1232px" src="https://hack-le.com/images/uploads/2025/08/d986f6ff84f33be286ca7db0066bdde7-700x126.png"&gt;&lt;/p&gt;&#10;&lt;p&gt;WebDAV用の権限を与える。QNAPにおいては、「ユーザーとグループの権限」と、「WebDAVのアクセス」が分かれている。ファイル管理は「ユーザーとグループの権限」において、&lt;strong&gt;ファイル管理をしたいユーザ&lt;/strong&gt;で「R/W」を設定し、WebDAVアクセスについては&lt;strong&gt;作成したユーザ&lt;/strong&gt;に「読み取り専用」の権限を付与する。&lt;/p&gt;&#10;&lt;p&gt;こうすることで、&lt;strong&gt;お外からはWebDAV専用ユーザで、WebDAV専用フォルダを読み取りのみできる&lt;/strong&gt;、という状態になるため、クラックされても安心では別にないんだが、被害は抑えられる。&lt;/p&gt;&#10;&lt;h2 id="cloudflareの設定"&gt;Cloudflareの設定&#10;&lt;/h2&gt;&lt;p&gt;LAN内で動作確認したいところなんだが、CloudBeatsはhttp通信だとどうもクラウド接続に失敗するっぽい。このためだけに自己証明書だのなんだのも阿呆みたいだし、しゃーないので、ぶっつけでCloudflare側の設定をする。&lt;/p&gt;&#10;&lt;p&gt;やることは、独自ドメインを経由してLAN内NASにアクセスできるようにすること。&lt;/p&gt;&#10;&lt;p&gt;ってことでNASにアクセスするPCにCloudflareを導入。Cloudflare Tunnelの設定については下記記事の「Cloudflareでトンネル作成」の部分を参照。ただし、ここでは http://&amp;lt;NASのIPアドレス&amp;gt;:5000 とする。冷静に考えると一般的にはここが一番の難所の気がしなくもないが、それだけに説明もめんどくさい。雑ですまない。&lt;/p&gt;&#10;&lt;div class="blog-card-wrapper"&gt;&#10; &lt;a href="https://hack-le.com/calibre-cloudflare-tunnel/" class="blog-card"&gt;&#10; &lt;div class="blog-card-content"&gt;&#10; &lt;div class="blog-card-label"&gt;&#10; &lt;svg xmlns="http://www.w3.org/2000/svg" width="13" height="13" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"&gt;&lt;path d="M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.71"&gt;&lt;/path&gt;&lt;path d="M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71"&gt;&lt;/path&gt;&lt;/svg&gt;&#10; &lt;span&gt;あわせて読みたい&lt;/span&gt;&#10; &lt;/div&gt;&#10; &lt;div class="blog-card-title"&gt;Calibreの本棚(コンテンツサーバ)に外部からアクセスする環境を整えるメモ(Cloudflare Tunnel利用)&lt;/div&gt;&#10; &lt;div class="blog-card-url"&gt;/calibre-cloudflare-tunnel/&lt;/div&gt;&#10; &lt;/div&gt;&#10; &lt;div class="blog-card-thumbnail"&gt;&#10; &lt;img src="https://hack-le.com/images/uploads/2026/09/eyecatch_14279_1789096432.webp" alt="Calibreの本棚(コンテンツサーバ)に外部からアクセスする環境を整えるメモ(Cloudflare Tunnel利用)" loading="lazy" /&gt;&#10; &lt;/div&gt;&#10; &lt;/a&gt;&#10;&lt;/div&gt;&#10;&#10;&lt;h2 id="cloudbeatsでwebdav使ってサインイン"&gt;CloudBeatsでWebDAV使ってサインイン&#10;&lt;/h2&gt;&lt;p&gt;CloudBeatsの「クラウドサービスを追加」からwebDAVを選び（なぜwだけ小文字なのか）、以下の情報を追加する。&lt;/p&gt;&#10;&lt;ul&gt;&#10;&lt;li&gt;https://&amp;lt;独自ドメイン&amp;gt;/&amp;lt;作成したフォルダ名&amp;gt;&lt;/li&gt;&#10;&lt;li&gt;user: 作成したユーザID&lt;/li&gt;&#10;&lt;li&gt;pw: 作成したユーザPW&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;p&gt;そしたらアクセスできるようになるので、適当に音楽ファイルを置いて動作確認する。&lt;/p&gt;&#10;&lt;h2 id="おまけ-ファイル管理はfreefilesync"&gt;(おまけ) ファイル管理はFreeFileSync&#10;&lt;/h2&gt;&lt;p&gt;音楽ファイルの管理方法だが、これは好きにすればいい……んだけれど、個人的には「ローカルで構成しているフォルダ構成をそのままFreeFileSyncでFTP転送」としている。&lt;/p&gt;&#10;&lt;div class="blog-card-wrapper"&gt;&#10; &lt;a href="https://hack-le.com/mac-windows-freefilesync/" class="blog-card"&gt;&#10; &lt;div class="blog-card-content"&gt;&#10; &lt;div class="blog-card-label"&gt;&#10; &lt;svg xmlns="http://www.w3.org/2000/svg" width="13" height="13" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"&gt;&lt;path d="M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.71"&gt;&lt;/path&gt;&lt;path d="M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71"&gt;&lt;/path&gt;&lt;/svg&gt;&#10; &lt;span&gt;あわせて読みたい&lt;/span&gt;&#10; &lt;/div&gt;&#10; &lt;div class="blog-card-title"&gt;MacとWindowsのバックアップはNAS &amp;#43; FreeFileSyncを使っている&lt;/div&gt;&#10; &lt;div class="blog-card-url"&gt;/mac-windows-freefilesync/&lt;/div&gt;&#10; &lt;/div&gt;&#10; &lt;div class="blog-card-thumbnail"&gt;&#10; &lt;img src="https://hack-le.com/images/uploads/2026/09/eyecatch_15131_1789091100.webp" alt="MacとWindowsのバックアップはNAS &amp;#43; FreeFileSyncを使っている" loading="lazy" /&gt;&#10; &lt;/div&gt;&#10; &lt;/a&gt;&#10;&lt;/div&gt;&#10;&#10;&lt;p&gt;これは良いソフトウェアなので寄付してDonation Editionにしたらいいと思う。寄付すると並列でファイル転送できるようになる。寄付額はこちらで決められる。&lt;/p&gt;&#10;&lt;p&gt;ちなみにQNAPのNASでFTPを扱うには、QuFTP Serviceなるアプリをインストールする必要がある。まぁインストールしたらそのまんま使える。&lt;/p&gt;&#10;&lt;h2 id="使い勝手"&gt;使い勝手&#10;&lt;/h2&gt;&lt;p&gt;全然悪くない。ただファイル一覧が多すぎると表示に時間がかかる感じなので、一覧が多くなりすぎないようにしたほうがいいね。&lt;/p&gt;&#10;&lt;p&gt;でもそれくらいかな。音楽ファイルをフォルダ単位で整理していると、数年くらい忘れていた「音楽を管理する」という感覚が得られる。そうか、僕はこれがやりたかったんだなぁと、今さらながら思い出した。&lt;/p&gt;&#10;&lt;p&gt;いったいどうして、好きな音楽を雲の上に置くのがクールだなんて、意味不明なトレンドに乗ってしまったのだろうなぁ。まぁ、今となっては取り戻せることではない。これからまた、好きな音楽を聴いていこう。&lt;/p&gt;&#10;&lt;p&gt;[itemlink post_id=&amp;ldquo;15811&amp;rdquo;]&lt;/p&gt;&#10;</description></item><item><title>脱Dropbox：NASの音楽ファイルをストリーミングで再生する試み</title><link>https://hack-le.com/dropboxnas-streaming-music/</link><pubDate>Sat, 30 Aug 2025 21:49:44 +0900</pubDate><guid>https://hack-le.com/dropboxnas-streaming-music/</guid><description>&lt;p&gt;やろう、やろう、と思いながら、面倒臭くてずっとやらなかったNASの音楽ファイルをAndroidからストリーミング再生する環境をやっと構築した。ちょっと軽くランニングしてきた感じでは、十分使えているのではないかな、と思う。これでDropboxを使う大きな理由の一つをなくすことができたね。&lt;/p&gt;&#10;&lt;p&gt;はまりどころもあったので、そのうちにハウツー記事にしたいと思うが、今回はとりあえず所感をつらつらと。&lt;/p&gt;&#10;&lt;h2 id="ちょっとマニアックな構成"&gt;ちょっとマニアックな構成&#10;&lt;/h2&gt;&lt;p&gt;構成自体はちょっとマニアックな感じになってしまったかなと思う。&lt;/p&gt;&#10;&lt;pre class="mermaid" style="visibility:hidden"&gt;graph LR&#10;subgraph Internet&#10;android(Android)&#10;cloudflare(Cloudflare)&#10;end&#10;subgraph Home&#10;nas(NAS)&#10;pc(PC)&#10;end&#10;android --&gt; cloudflare&#10;cloudflare --&gt;|Cloudflare Tunnel| pc&#10;pc --&gt;|webDAV| nas&lt;/pre&gt;&lt;p&gt;この時点で特に技術系ではない一般ユーザにはオススメできない構成になってしまっているのはまぁそう。といっても別に何かコード書くわけじゃないし、頑張ればできると思うけど。&lt;/p&gt;&#10;&lt;p&gt;元々、構成的にはそりゃ出来るだろう、とは思っていたものの、WebDAV使えてストリーミングとオフライン両方できるAndroidアプリあるのかな、とか、NASでWebDAVの設定どうするのかな、とか個別に調べないといけないことも多くて、なかなか進まなかった。あと家の回線がJ:COMなので、クソザコ上り回線で大丈夫かなぁと思ったのもある。&lt;/p&gt;&#10;&lt;p&gt;まーでも、&lt;strong&gt;多少手こずったけれど、とりあえずうまくいったかなぁ&lt;/strong&gt;、という感じ。ただフォルダがたくさんあると一覧表示に時間かかるようで、これはスペックというよりネットワークの問題の気がする。このへんはもうちょっと整理がいるかな。&lt;/p&gt;&#10;&lt;p&gt;Androidアプリは&lt;strong&gt;CloudBeats&lt;/strong&gt;を使った。有料オプションは1500円くらいだったかな。オプションは複数のクラウド接続とオフライン再生に必要だった。妥当な料金じゃないかな。サブスクじゃないなら全然いいよ。だいたいNASとストレージの代金からすれば誤差みたいなもんだし。NASはQNAPのTS-233。ドメインは元々取得していてCloudflareで管理している自分用ドメインを流用した。&lt;/p&gt;&#10;&lt;p&gt;[itemlink post_id=&amp;ldquo;15811&amp;rdquo;]&lt;/p&gt;&#10;&lt;h2 id="世界線の修正作業"&gt;世界線の修正作業&#10;&lt;/h2&gt;&lt;p&gt;まぁもうちょっとしばらく使い混んで使い勝手は調べる必要があるかな。フォルダも整理しなおさないといけない。iTunes時代の名残で、全アーティストのフォルダがフラットに並んでしまっているんだよね。それで阿呆みたいに長いリストになってるからさ。&lt;/p&gt;&#10;&lt;p&gt;ああ&lt;strong&gt;iTunes、今にして思うと、僕にソフトウェアの進歩について強い疑念を抱かせた最初のアプリケーションだったかもしれない&lt;/strong&gt;。毎度毎度、強権的な仕様変更に振り回され、頼んでもない新機能を見せつけられ、その癖出来たことが出来なくなり、そしてファイルが壊される。&lt;strong&gt;途中Apple Musicなんて契約しようもんならもう最悪なことになる。なった&lt;/strong&gt;。&lt;/p&gt;&#10;&lt;p&gt;冷静に考えると、自前のライブラリを知らないサーバに置く必要はないし、ストレージが足りないならmicroSDを使えばいいし、microSDも挿せないならNASからストリーミングもあるし、別にプレイヤーを買ってもよかった。今でもiPodモドキはたくさん売ってるし。でもあの時は、なんかこれが未来なんかな、という気にさせられていたよね。実際このブログでもApple MusicとかiTunesで検索したら色々出てくるよ。懐かしい。&lt;/p&gt;&#10;&lt;p&gt;&lt;strong&gt;結果的には、間違えた世界線だったんだな&lt;/strong&gt;と思う。こうしてフォルダの再整理に勤しまねばならないのがもうね。っていうか消失している曲とかもあるんだよな。MOTHERっていうゲームのアレンジサントラでやけに凝ったのがあったんだけど、マニアックかつオムニバスでアーティストが分散しているのもあって、なんか気がついたら曲が何曲か見当たらない。一番気に入っていた曲は幸い（？）残っていたので、買い直すのもなんだかなぁ、みたいになってる。やれやれだなぁ。&lt;/p&gt;&#10;&lt;p&gt;[itemlink post_id=&amp;ldquo;18951&amp;rdquo;]&lt;/p&gt;&#10;&lt;p&gt;まぁ今からでも少しずつなおしていくさ。&lt;/p&gt;&#10;&lt;h2 id="dropboxに恨みはない"&gt;Dropboxに恨みはない&#10;&lt;/h2&gt;&lt;p&gt;一応言うと、僕はDropboxに対しては案外と好印象だったりする。実際最近このブログではクラウドについて腐していることが多いが、その中でも&lt;strong&gt;Dropboxに対して悪口めいたことは言ったことはないんじゃないかな&lt;/strong&gt;。Dropboxは便利だし、非常にマニアックな文字コード問題の対応、Linux対応などもあって、かゆいところに手が届くサービスだと思う。価格も決して高すぎるとは思わない。安いとも思わないけど。&lt;/p&gt;&#10;&lt;div class="blog-card-wrapper"&gt;&#10; &lt;a href="https://hack-le.com/data-self-hosting/" class="blog-card"&gt;&#10; &lt;div class="blog-card-content"&gt;&#10; &lt;div class="blog-card-label"&gt;&#10; &lt;svg xmlns="http://www.w3.org/2000/svg" width="13" height="13" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"&gt;&lt;path d="M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.71"&gt;&lt;/path&gt;&lt;path d="M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71"&gt;&lt;/path&gt;&lt;/svg&gt;&#10; &lt;span&gt;あわせて読みたい&lt;/span&gt;&#10; &lt;/div&gt;&#10; &lt;div class="blog-card-title"&gt;自分のデータは自分で守れ、雲の上で守ってもらえると思うな&lt;/div&gt;&#10; &lt;div class="blog-card-url"&gt;/data-self-hosting/&lt;/div&gt;&#10; &lt;/div&gt;&#10; &lt;div class="blog-card-thumbnail"&gt;&#10; &lt;img src="https://hack-le.com/images/uploads/2026/01/output-30.webp" alt="自分のデータは自分で守れ、雲の上で守ってもらえると思うな" loading="lazy" /&gt;&#10; &lt;/div&gt;&#10; &lt;/a&gt;&#10;&lt;/div&gt;&#10;&#10;&lt;p&gt;いつだったか不本意なアカウントBAN事件について書かれた個人の記事を見て「Dropboxもあるかー」と思ったことはある。しかし、少なくとも僕はこれまでアレゲなファイルも置いてきたが特にBANされたことはなく、またされたところで別に大して困らないので、使い続けている。まぁ、三年契約しちゃって、契約期間がまだあるからさ。&lt;/p&gt;&#10;&lt;p&gt;まーでも、次の契約更新はないかな。別にDropboxに恨みはないけれど、クラウド、サブスクはもう嫌だっていう気持ちのほうが強い。僕自身はこの流れから脱せられているわけではないけれど、せめてプライベートではまず離れたいところだね。&lt;/p&gt;&#10;</description></item><item><title>バックアップは結局NASと外付けHDっていう</title><link>https://hack-le.com/backup-nas-hd/</link><pubDate>Wed, 18 Jun 2025 11:55:11 +0900</pubDate><guid>https://hack-le.com/backup-nas-hd/</guid><description>&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;まず大前提、クラウドは信用しない。Dropboxの有料会員が言うことではないかもしらんが、同期サービスは同期が便利なのであって、バックアップとして使ってはいけないと思う。災害リスクを考えると良いという意見もあるが、どう考えても&lt;strong&gt;未曾有の大災害リスクよりもサービス側の勝手なアカウントBANややらかしのほうが現実的なリスク&lt;/strong&gt;。まぁ僕自身は今までクラウドサービスに勝手なBANなどをされたことは幸運なことに未だないが、それはこれからもないことを意味しない。&lt;/p&gt;&#10;&lt;p&gt;したがって、クラウドサービスは同期やファイル共有の機能が便利だから使うのであって、データという命を預けてよい場所ではない。バックアップ先の一つとしてする分にはよいが、少なくとも唯一のバックアップ先にすべきではない。&lt;/p&gt;&#10;&lt;h2 id="nasと外付けhd"&gt;NASと外付けHD&#10;&lt;/h2&gt;&lt;p&gt;そうすると、結局伝統的な外付けHD、あるいはNASという結論になる。楽なのは明らかにNASだ。しかしNASの場合、ネットワークがボトルネックになる。特にMacを使っている場合、なんか知らんが色々と遅い。あとよく切れる。これは以前から色々とやっているんだが、あまりうまくいっていない。一応下記記事のようなことはしているが、それでも遅い。&lt;/p&gt;&#10;&lt;div class="blog-card-wrapper"&gt;&#10; &lt;a href="https://hack-le.com/rnas104smbup/" 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とReadyNAS 104の通信速度が遅い時の対処法(SMB)&lt;/div&gt;&#10; &lt;div class="blog-card-url"&gt;/rnas104smbup/&lt;/div&gt;&#10; &lt;/div&gt;&#10; &lt;div class="blog-card-thumbnail"&gt;&#10; &lt;img src="https://hack-le.com/images/uploads/2026/09/eyecatch_4148_1789563052.webp" alt="MacとReadyNAS 104の通信速度が遅い時の対処法(SMB)" loading="lazy" /&gt;&#10; &lt;/div&gt;&#10; &lt;/a&gt;&#10;&lt;/div&gt;&#10;&#10;&lt;p&gt;とはいえ、バックアップに時間がかかるからなんだ？という考えもある。あるのだが、実際に1日たってもバックアップが終わってない風景など見ると、なんだかなぁという気になる。&lt;/p&gt;&#10;&lt;p&gt;速度の面では、やはり有線の外付けHDが最強ではあるものの、セットアップが面倒臭い。&lt;/p&gt;&#10;&lt;p&gt;また、運用上の問題として、複数PCで同期して使いたいファイルなどもある。こればかりは外付けHD運用ではどうにもならない。やはり中央サーバ的なものが必要になってくる。Dropboxで収まるならばよいのだが、自分は今Dropboxの役割を縮小させようとしているため、ちょっと厳しい。NASは同期の役割も担えるので、こちらにシフトしていきたい。&lt;/p&gt;&#10;&lt;p&gt;まぁ色々考えると、やはりNASにこまめにバックアップしつつ、たまに外付けHDにもバックアップする、というのがとりあえずの結論になる。NAS重いなぁと思いつつ。&lt;/p&gt;&#10;&lt;p&gt;ちなみに持っているのはQNAPのTS-233で、スペック的に色々キツイのかもしれない。&lt;/p&gt;&#10;&lt;p&gt;[itemlink post_id=&amp;ldquo;15811&amp;rdquo;]&lt;/p&gt;&#10;&lt;p&gt;でもキツイなりに、あまり無理させなければ（2TBのフォルダを同期とか）それなりに動いてくれるからなぁ。&lt;/p&gt;&#10;&lt;h2 id="nextcloudを使うのは"&gt;Nextcloudを使うのは？&#10;&lt;/h2&gt;&lt;p&gt;少し話が変わってくるが、複数端末の同期問題については、わざわざNASを使わずともメインデスクトップ(M2 Pro Mac mini)にNextcloudをインストールするということも考えられる。というか実際これは良い手に思える。思えるものの、少し面倒臭い。個別の事情だが、現在外部ストレージを起動ディスクにしているのだけれど、そのうち内蔵ディスクを起動ディスクに戻そうと思っているため、現時点において母艦めいたことをすると、二度手間になる。また、内蔵ディスクを起動ディスクにした場合、外部ストレージの接続は保証されなくなるため、Nextcloudのサーバとするには安定性の面でやや心許ない。&lt;/p&gt;&#10;&lt;p&gt;このようなことを考えると、スペック低いとはいえ、一応ハードウェアとしてのNASもあるし、何も自前で頑張らなくてもいいかな……というのが現時点の結論だ。&lt;/p&gt;&#10;&lt;p&gt;しかし、NASのスペックがあまりにもつらすぎる、と思ったら、メインデスクトップであるMac miniあるいは別の常時稼働計デスクトップマシンのNextcloudサーバ計画を実行することになるかもしれない。ハイエンドのNASを買うお金はないのでな……。&lt;/p&gt;&#10;</description></item><item><title>レンサバからVPSに帰ってきた</title><link>https://hack-le.com/return-vps/</link><pubDate>Sat, 24 May 2025 16:35:02 +0900</pubDate><guid>https://hack-le.com/return-vps/</guid><description>&lt;p&gt;このブログは12年……今年で13年の歴史があり、当初のLivedoorの無料ブログからインフラレベルで幾重の変遷を経て今に至るのだが、先日レンサバからVPSに帰ってきた。おおう、懐かしのConoHa VPSよ。このはちゃんのイラストはいらんから安くしてくれんかね……。とりあえずサービス維持調整費とかいう欺瞞は本当に早くやめてください。これ始まって2年以上たつけど、真面目な話なにかの法律に引っかからないんだろうか。&lt;/p&gt;&#10;&lt;p&gt;まぁそれでも3年分の契約で7割引きは十分お安い。VRAMは2GB。4GB欲しい。&lt;strong&gt;2GBの金で4GBほしい！！！！&lt;/strong&gt;&lt;/p&gt;&#10;&lt;h2 id="当サイトのインフラの歴史"&gt;当サイトのインフラの歴史&#10;&lt;/h2&gt;&lt;p&gt;当サイトのインフラは以下のように変遷している。&lt;/p&gt;&#10;&lt;ul&gt;&#10;&lt;li&gt;2012年：Livedoor無料ブログ&lt;/li&gt;&#10;&lt;li&gt;2016年&#10;&lt;ul&gt;&#10;&lt;li&gt;独自ドメインの取得&lt;/li&gt;&#10;&lt;li&gt;ConoHaのVPSに移行、WordPress構築&lt;/li&gt;&#10;&lt;li&gt;https対応&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;/li&gt;&#10;&lt;li&gt;2017年&#10;&lt;ul&gt;&#10;&lt;li&gt;PHP 5.4 -&amp;gt; 7.1&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;/li&gt;&#10;&lt;li&gt;2020年&#10;&lt;ul&gt;&#10;&lt;li&gt;PHP 7.1 -&amp;gt; 7.4&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;/li&gt;&#10;&lt;li&gt;2022年&#10;&lt;ul&gt;&#10;&lt;li&gt;PHP 7.4 -&amp;gt; 8.1&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;/li&gt;&#10;&lt;li&gt;2023年&#10;&lt;ul&gt;&#10;&lt;li&gt;ConoHaのVPSからレンタルサーバーのカラフルボックスに移行&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;/li&gt;&#10;&lt;li&gt;2025年&#10;&lt;ul&gt;&#10;&lt;li&gt;ConoHaのVPSに帰ってきた&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;p&gt;インフラの移行は面倒臭いしリスキーなのでそうあることではないのだが、こうしてみると2016年が大きな転機だったようだ。その後は基本的にせいぜいPHPのバージョンをあげる程度のことしかしていない。DBのバージョンはあげてなかった気がする。&lt;/p&gt;&#10;&lt;h2 id="httpsは本当にいらなかった"&gt;httpsは本当にいらなかった&#10;&lt;/h2&gt;&lt;p&gt;まぁやっぱり面倒臭かったのはhttps対応かなと思う。当時も「本当に必要かこれ」と思っていたけれど、今にして思うと本当に必要なかった。うちのサイトに暗号化しないといけない情報は特にないです。&lt;/p&gt;&#10;&lt;p&gt;とはいえ、やらないとブラウザの覇権を握ったGoogleから抹殺されてしまうために渋々従わざるを得なかったのだが、当時はGoogleが個人サイトそのものを抹殺するとはまだ思っていなかった。僕がGoogle嫌いなのは、Webサイトを運営していてGoogleの態度が変わっていくのを目の当たりにし、またジャイアントスイングされ続けてきたからだろう&lt;/p&gt;&#10;&lt;p&gt;Google検索しているだけだったら、「最近の検索クソだな」とは思っても、嫌いにまではならなかったと思う。実際プロダクトはウンコでもプロダクトの基礎となる部分では今なお大きな存在感を放っているし、エンジニア仲間の友人は今でもGoogle信者を自称している。実際色々な仕事をしているのはそうだ。しかし今の僕には、Googleがいなければ他の誰かが似たようなことをしていただろう、という風に感じられてしまう。少なくとも、僕がWebサイトを構築し運用することに関しては特に問題がなかっただろうし、もしかすると今よりも良い世界線だったかもしれない。&lt;/p&gt;&#10;&lt;h2 id="googleの影響力よ"&gt;Googleの影響力よ&#10;&lt;/h2&gt;&lt;p&gt;意図したわけではないのだが、何故かまたGoogleの愚痴になってしまった。色々な切り口がある中で、いつも最初にくるのはこれなんだが、逆説的にそれだけGoogleの影響力が大きかったということなんだろうなぁ。個人的にはGoogleはGAFAで最初に陥落するとすら思っているけれど、昨今のAI事情の中でどうなるか次第だ。&lt;/p&gt;&#10;&lt;p&gt;ちなみに僕は散々愚痴っといてなんだが、今はAIチャットボットとしてはGeminiに課金している。これについてはGeminiがいいというよりOpenAIが自滅し続けているだけという感覚だ。&lt;/p&gt;&#10;&lt;div class="blog-card-wrapper"&gt;&#10; &lt;a href="https://hack-le.com/chatgpt-yoisho/" class="blog-card"&gt;&#10; &lt;div class="blog-card-content"&gt;&#10; &lt;div class="blog-card-label"&gt;&#10; &lt;svg xmlns="http://www.w3.org/2000/svg" width="13" height="13" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"&gt;&lt;path d="M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.71"&gt;&lt;/path&gt;&lt;path d="M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71"&gt;&lt;/path&gt;&lt;/svg&gt;&#10; &lt;span&gt;あわせて読みたい&lt;/span&gt;&#10; &lt;/div&gt;&#10; &lt;div class="blog-card-title"&gt;ChatGPTの耐えられない軽さに解約：よいしょサンドイッチマンとかいう思考放棄の末路&lt;/div&gt;&#10; &lt;div class="blog-card-url"&gt;/chatgpt-yoisho/&lt;/div&gt;&#10; &lt;/div&gt;&#10; &lt;div class="blog-card-thumbnail"&gt;&#10; &lt;img src="https://hack-le.com/images/uploads/2026/08/eyecatch_17175_1787719685.webp" alt="ChatGPTの耐えられない軽さに解約：よいしょサンドイッチマンとかいう思考放棄の末路" loading="lazy" /&gt;&#10; &lt;/div&gt;&#10; &lt;/a&gt;&#10;&lt;/div&gt;&#10;&#10;&lt;p&gt;GeminiはChatGPTほどごますりしてこないので、Geminiを使っている。あと馴れ馴れしくないからさ……。&lt;/p&gt;&#10;&lt;p&gt;いつかローカルLLMがまともに使えるようになったら、なんとかそうしたい。現状はまだちょっと厳しい……。&lt;/p&gt;&#10;&lt;h2 id="https楽になったし検索ももう気にならない"&gt;https楽になったし、検索ももう気にならない&#10;&lt;/h2&gt;&lt;p&gt;さて、Googleの愚痴が本題ではなく、VPSに戻したことが本題なんだが、愚痴っていたらそれなりの文字数になってしまった。&lt;/p&gt;&#10;&lt;p&gt;しかしここまでの話でも言えることはあって、少なくとも以下の点はレンサバからVPSへの移行という面倒くさい作業をする背中を押した。&lt;/p&gt;&#10;&lt;ul&gt;&#10;&lt;li&gt;Cloudflareのおかげでhttps対応が楽になった&lt;/li&gt;&#10;&lt;li&gt;どうせもう検索ヒットは死んでるので、ダウンタイムの発生や移行ミスで検索順位が落ちるとかまったく気にしなくなった&lt;/li&gt;&#10;&lt;li&gt;botウザい&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;p&gt;https対応が楽になったというのは、まぁCloudflare Tunnelだなぁ。まぁLet&amp;rsquo;s Encryptのおかげで個人でも対応はできるんだけど、面倒くさいし定期的に証明書再発行ミスってサイトがマルウェア扱いされるみたいなことはよく起きる。っていうかあの作業がまず面倒臭いんだが、そういう無意味な構築・運用をしなくてよいっていうのは実際的にも精神的に楽だね。&lt;/p&gt;&#10;&lt;p&gt;そしてまぁ、移行はなんかミスると長時間のダウンタイムとかに繋がりかねず、そうすると検索順位が大きく落ちるなどのペナルティも発生しうるだけれど、既にジェノサイドされている個人サイトとしてはもはやどうでもいい。まぁと言いつつも当サイトのアクセスにおいて検索エンジン経由が多いのはそうなんだが、多いといったところでしれているし、そもそも&lt;strong&gt;検索で情報が見つからなくて困るのは検索している人であって僕ではない&lt;/strong&gt;。&lt;/p&gt;&#10;&lt;p&gt;まぁこれを言うと&lt;strong&gt;サイト運営の意義とは何か&lt;/strong&gt;という話なんだけれど、実際なんなんだろうと思いながらサイトを続けている。なんなんだろうね。ただ現状に納得いっていないことは確かだ。検索からすべて弾かれてももはや知ったことではないと思う。&lt;/p&gt;&#10;&lt;p&gt;そんなことより今は&lt;strong&gt;botがウザい&lt;/strong&gt;。たまにアクセス伸びてんなと思ったらだいたいフィルタリングしきれていないbotだよ。昔はまぁそれも大して気にならなかった、というのも検索エンジンなどに機械的に評価されようというならある程度のbotも仕方ない、という気持ちがあった。&lt;/p&gt;&#10;&lt;p&gt;しかし今となってはもうそんな気持ちもない。&lt;strong&gt;僕は何のためにブログを書いているのか、サイト運営を続けているのか、もはや僕自身にもわからない&lt;/strong&gt;。昔は利他と自己満足のないまぜのようなものと解釈していた。その気持ちは今もある。&lt;/p&gt;&#10;&lt;div class="blog-card-wrapper"&gt;&#10; &lt;a href="https://hack-le.com/cross/" class="blog-card"&gt;&#10; &lt;div class="blog-card-content"&gt;&#10; &lt;div class="blog-card-label"&gt;&#10; &lt;svg xmlns="http://www.w3.org/2000/svg" width="13" height="13" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"&gt;&lt;path d="M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.71"&gt;&lt;/path&gt;&lt;path d="M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71"&gt;&lt;/path&gt;&lt;/svg&gt;&#10; &lt;span&gt;あわせて読みたい&lt;/span&gt;&#10; &lt;/div&gt;&#10; &lt;div class="blog-card-title"&gt;ブログを続ける理由&lt;/div&gt;&#10; &lt;div class="blog-card-url"&gt;/cross/&lt;/div&gt;&#10; &lt;/div&gt;&#10; &lt;div class="blog-card-thumbnail"&gt;&#10; &lt;img src="https://hack-le.com/images/uploads/2026/09/eyecatch_9227_1789615824.webp" alt="ブログを続ける理由" loading="lazy" /&gt;&#10; &lt;/div&gt;&#10; &lt;/a&gt;&#10;&lt;/div&gt;&#10;&#10;&lt;p&gt;一方で、&lt;strong&gt;もはや自己も利他も薄っぺらく思える&lt;/strong&gt;ことも確かだ。しかしでは何かと言われるとわからない。だが少なくともGoogleの検索エンジンのためではないし、ましてbotのためではない。&lt;/p&gt;&#10;&lt;p&gt;レンサバだと対応が限られるが、VPS上なら対応の幅が広がるし、そもそもCloudflareの対応が有能である。やはりサイトは自由でなくては。&lt;/p&gt;&#10;&lt;h2 id="サイトは続くよ多分どこまでも"&gt;サイトは続くよ多分どこまでも&#10;&lt;/h2&gt;&lt;p&gt;そんなわけでまぁ、とりあえず2年ぶりのConoHaのVPSに帰ってきた。どういう形態になってもサイト自体は続けられることはありがたいと思う。本当はWordPressやDockerの話をしようかと考えていたんだがまったくしていない。まぁこれはまた別の機会に。&lt;/p&gt;&#10;&lt;p&gt;ConoHaはまぁGMOなんでGMOだけれど、とりあえず国内で安く使えるし、なんだかんだでいいと思うよ。&lt;/p&gt;&#10;&lt;p&gt;&lt;a class="link" href="https://www.conoha.jp/referral/?token=nNgrOjEEXwCVfvRYHJSDh.zn3QtmUyxWoTDKxWHvrZSWHGWKZ3o-HER" target="_blank" rel="noopener"&#10; &gt;お友達紹介&lt;/a&gt;&lt;/p&gt;&#10;&lt;p&gt;お友達紹介コードを貼っておしまい。こっから飛んで使い始めてもらったら1000円分のクーポンがもらえるはず（&lt;a class="link" href="https://www.conoha.jp/conotomo/" target="_blank" rel="noopener"&#10; &gt;このとも ～友達紹介～｜レンタルサーバーならConoHa&lt;/a&gt;）。そして定常的に使ったら僕に2000円分のクーポンが入る。クーポンのためにブログを続ける人生だった。&lt;/p&gt;&#10;&lt;p&gt;しかし今まで数百回クリックされているはずだが実際に使うとこまでいったのは1人だけである。もはやVPS流行らないのか。&lt;/p&gt;&#10;&lt;h2 id="関連記事"&gt;関連記事&#10;&lt;/h2&gt;&lt;div class="blog-card-wrapper"&gt;&#10; &lt;a href="https://hack-le.com/yaranakuteiikotobakarishiteiru/" class="blog-card"&gt;&#10; &lt;div class="blog-card-content"&gt;&#10; &lt;div class="blog-card-label"&gt;&#10; &lt;svg xmlns="http://www.w3.org/2000/svg" width="13" height="13" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"&gt;&lt;path d="M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.71"&gt;&lt;/path&gt;&lt;path d="M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71"&gt;&lt;/path&gt;&lt;/svg&gt;&#10; &lt;span&gt;あわせて読みたい&lt;/span&gt;&#10; &lt;/div&gt;&#10; &lt;div class="blog-card-title"&gt;やらなくていいことばかりしている&lt;/div&gt;&#10; &lt;div class="blog-card-url"&gt;/yaranakuteiikotobakarishiteiru/&lt;/div&gt;&#10; &lt;/div&gt;&#10; &lt;div class="blog-card-thumbnail"&gt;&#10; &lt;img src="https://hack-le.com/images/uploads/2025/05/zakki-scrible.webp" alt="やらなくていいことばかりしている" loading="lazy" /&gt;&#10; &lt;/div&gt;&#10; &lt;/a&gt;&#10;&lt;/div&gt;&#10;&#10;&lt;div class="blog-card-wrapper"&gt;&#10; &lt;a href="https://hack-le.com/cross/" class="blog-card"&gt;&#10; &lt;div class="blog-card-content"&gt;&#10; &lt;div class="blog-card-label"&gt;&#10; &lt;svg xmlns="http://www.w3.org/2000/svg" width="13" height="13" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"&gt;&lt;path d="M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.71"&gt;&lt;/path&gt;&lt;path d="M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71"&gt;&lt;/path&gt;&lt;/svg&gt;&#10; &lt;span&gt;あわせて読みたい&lt;/span&gt;&#10; &lt;/div&gt;&#10; &lt;div class="blog-card-title"&gt;ブログを続ける理由&lt;/div&gt;&#10; &lt;div class="blog-card-url"&gt;/cross/&lt;/div&gt;&#10; &lt;/div&gt;&#10; &lt;div class="blog-card-thumbnail"&gt;&#10; &lt;img src="https://hack-le.com/images/uploads/2026/09/eyecatch_9227_1789615824.webp" alt="ブログを続ける理由" loading="lazy" /&gt;&#10; &lt;/div&gt;&#10; &lt;/a&gt;&#10;&lt;/div&gt;&#10;&#10;&lt;div class="blog-card-wrapper"&gt;&#10; &lt;a href="https://hack-le.com/chatgpt-yoisho/" class="blog-card"&gt;&#10; &lt;div class="blog-card-content"&gt;&#10; &lt;div class="blog-card-label"&gt;&#10; &lt;svg xmlns="http://www.w3.org/2000/svg" width="13" height="13" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"&gt;&lt;path d="M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.71"&gt;&lt;/path&gt;&lt;path d="M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71"&gt;&lt;/path&gt;&lt;/svg&gt;&#10; &lt;span&gt;あわせて読みたい&lt;/span&gt;&#10; &lt;/div&gt;&#10; &lt;div class="blog-card-title"&gt;ChatGPTの耐えられない軽さに解約：よいしょサンドイッチマンとかいう思考放棄の末路&lt;/div&gt;&#10; &lt;div class="blog-card-url"&gt;/chatgpt-yoisho/&lt;/div&gt;&#10; &lt;/div&gt;&#10; &lt;div class="blog-card-thumbnail"&gt;&#10; &lt;img src="https://hack-le.com/images/uploads/2026/08/eyecatch_17175_1787719685.webp" alt="ChatGPTの耐えられない軽さに解約：よいしょサンドイッチマンとかいう思考放棄の末路" loading="lazy" /&gt;&#10; &lt;/div&gt;&#10; &lt;/a&gt;&#10;&lt;/div&gt;&#10;&#10;&lt;div class="blog-card-wrapper"&gt;&#10; &lt;a href="https://hack-le.com/escape/" class="blog-card"&gt;&#10; &lt;div class="blog-card-content"&gt;&#10; &lt;div class="blog-card-label"&gt;&#10; &lt;svg xmlns="http://www.w3.org/2000/svg" width="13" height="13" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"&gt;&lt;path d="M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.71"&gt;&lt;/path&gt;&lt;path d="M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71"&gt;&lt;/path&gt;&lt;/svg&gt;&#10; &lt;span&gt;あわせて読みたい&lt;/span&gt;&#10; &lt;/div&gt;&#10; &lt;div class="blog-card-title"&gt;サーバーも会社も学校も、いつでも逃げ出せることが大事&lt;/div&gt;&#10; &lt;div class="blog-card-url"&gt;/escape/&lt;/div&gt;&#10; &lt;/div&gt;&#10; &lt;div class="blog-card-thumbnail"&gt;&#10; &lt;img src="https://hack-le.com/images/uploads/2026/09/eyecatch_3612_1789491633.webp" alt="サーバーも会社も学校も、いつでも逃げ出せることが大事" loading="lazy" /&gt;&#10; &lt;/div&gt;&#10; &lt;/a&gt;&#10;&lt;/div&gt;&#10;&#10;</description></item><item><title>Mac mini 2018 で Docker Desktop のCPU利用率が100%に張り付くので対症療法で誤魔化している</title><link>https://hack-le.com/mac-mini-2018-docker-desktop-cpu-100/</link><pubDate>Thu, 24 Apr 2025 21:52:55 +0900</pubDate><guid>https://hack-le.com/mac-mini-2018-docker-desktop-cpu-100/</guid><description>&lt;p&gt;うちのMac mini 2018は実質コンテナサーバと化しているのだが、最近やけに五月蠅い。Docker Desktopがずっと暴走している。対症療法はあるが、解決できていない。しばらく様子を見て、ダメそうならOrbstackへの移行も考える（それでおさまればだが、恐らくDocker Desktopに起因しているので……）。&lt;/p&gt;&#10;&lt;p&gt;とりあえず、対症療法のメモ。&lt;/p&gt;&#10;&lt;p&gt;（追記：その後、バックアッププログラムを走らせるとCPUが暴走することがわかった。おおう……）&lt;/p&gt;&#10;&lt;p&gt;（さらに追記 2025-05-02：Docker Desktopが4.41.0になったら解消したかも）&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;ul&gt;&#10;&lt;li&gt;Intel Mac mini 2018&#10;&lt;ul&gt;&#10;&lt;li&gt;macOS 14.6.1&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;/li&gt;&#10;&lt;li&gt;Docker Desktop 4.40.0&#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;h2 id="症状"&gt;症状&#10;&lt;/h2&gt;&lt;p&gt;Mac miniが五月蠅い。&lt;/p&gt;&#10;&lt;p&gt;静音性だけが取り柄なのにどうしたことだろうとアクティビティモニタを見たら、Docker DesktopとおぼしきタスクがCPU利用率100%になっている。「そんなに」と思ってダッシュボードを見ると、特にコンテナのCPU利用率は高くない。しかしアクティビティモニタでは明らかにDockerが100%を使い続けている……。&lt;/p&gt;&#10;&lt;p&gt;「めんどくせぇ再起動しよう」と思い、Docker Desktopを再起動した。&lt;strong&gt;CPU利用率が200%になった&lt;/strong&gt;。&lt;/p&gt;&#10;&lt;p&gt;どういうことやねんと思い、もっかいDocker Desktop再起動かける。すると、今度は終了後の起動が永遠に終わらない。おおぅ……。Mac自体を再起動したらとりあえずDocker Desktopは再び起動したが、やはりCPU利用率は100%。はぁ……。&lt;/p&gt;&#10;&lt;h2 id="対症療法"&gt;対症療法&#10;&lt;/h2&gt;&lt;p&gt;あれこれした結果、以下の手順でしばらく収まった。&lt;/p&gt;&#10;&lt;ul&gt;&#10;&lt;li&gt;「設定」で以下をオフにする&#10;&lt;ul&gt;&#10;&lt;li&gt;Start Docker Desktop when you sign in to your computer&lt;/li&gt;&#10;&lt;li&gt;Open Docker Dashboard when Docker Desktop starts&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;/li&gt;&#10;&lt;li&gt;コンテナを全部落とす&lt;/li&gt;&#10;&lt;li&gt;Docker Desktopを「終了」する（再起動ではなく）&lt;/li&gt;&#10;&lt;li&gt;Docker Desktopを起動する&lt;/li&gt;&#10;&lt;li&gt;コンテナを全部起動する&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;p&gt;ただしばらくすると再発する感じ。&lt;/p&gt;&#10;&lt;h2 id="ひとまず様子見"&gt;ひとまず様子見&#10;&lt;/h2&gt;&lt;p&gt;コンテナが悪さしているとも思えない。おまかんの気もする。今のMac mini 2018は購入から6年以上第一線でほぼほぼ24時間起動し続けており、メインデスクトップを退いてからもホームサーバとしてずっと働いている。なんか色々溜まっているのかもしれない。再起動すると起動までに何分かかかるし。&lt;/p&gt;&#10;&lt;p&gt;とはいえDocker Desktopに起因する問題っぽいし、もうしばらく様子を見て症状が治らないようなら、一縷の望みをかけてOrbstackあたり試してみようかと思う。&lt;/p&gt;&#10;</description></item><item><title>M2 Pro Mac mini を購入して1年5か月経過：静かに革命</title><link>https://hack-le.com/m2-pro-mac-mini-1-5/</link><pubDate>Tue, 08 Apr 2025 03:03:42 +0900</pubDate><guid>https://hack-le.com/m2-pro-mac-mini-1-5/</guid><description>&lt;p&gt;Intel Mac mini 2018からM2 Pro Mac miniに買い換えて1年5か月が経過した。M3は悲しい感じでM2大勝利だったが、M4で飛躍的な進化を遂げたので、結果論だともう少し待てばよかったのにこの愚か者、という感じではあるけれど、そうは言ってもあの時どうにも欲しいという情動があったのは事実だし、また1年早く多くのことを楽しめたのだからやはり買ってよかったのだと思え思うしかない思って。&lt;/p&gt;&#10;&lt;h2 id="体験は満足度が高い"&gt;体験は満足度が高い&#10;&lt;/h2&gt;&lt;p&gt;まぁM4が強すぎるのでぐぬぬとなっているのは事実なんだけれど、&lt;strong&gt;正直M2 Proでほとんど不満がない&lt;/strong&gt;。これは&lt;strong&gt;最大限の賛辞&lt;/strong&gt;だと思ってよい。まぁLLMを使う上ではM4 Proだったらもうちょっと使い物になるかもと思える応答速度だったりしたのかなぁと思ったりなんだりもするけれど、結局普段使いはChatGPTやCodyなんだし、ローカルLLMに全振りするにはまだまだ時期が早い。&lt;/p&gt;&#10;&lt;p&gt;というわけで、全体的にMac mini 2018からすべてがパワーアップした一方、特に不便になったこともない。あったかもしれないけど思い浮かばない。この&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;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;ことだ。まぁつまり自宅サーバなんだが、VPSでやっているサーバもあるので、全部含めてセルフホスティング。&lt;/p&gt;&#10;&lt;p&gt;ただしここでセルフホスティングしているのは主に買い換える前までメインデスクトップにしていたMac mini 2018だ。M2 Pro Mac miniを買った後、まだ動くMac mini 2018を見て、コイツどうしてくれようか、まだまだ使えるし、売って端金にするのも尺だなぁと思って、コンテナサーバにしてみるかと思って使ったところ、これがなかなか具合がよい。ちょっと試してみたいソフトウェアをスナック菓子感覚で楽しめる。なんなら常用しているサーバも数多い。&lt;/p&gt;&#10;&lt;p&gt;もちろんM2 Pro Mac miniでも問題なくできるのだが、コンテナはけっこう何かと重たいし、またできるだけ常時稼働させたいものだから、常用していると再起動も億劫になってしまうので、物理的にメインデスクトップと切り分けできたのはよかったと思う。メインデスクトップであるM2 Pro Mac miniを開発サーバとして、いけるなと思ったらMac mini 2018にデプロイするということも可能だ。まぁそこまでちゃんとやってるのはあんまりないけど。&lt;/p&gt;&#10;&lt;p&gt;このブログも今はレンサバでやっているのだけれど、またセルフホスティングに戻したいと思う。まぁこのブログは一時期よりアクセスが大幅に減ったとはいえ、それでもだいたい常に何人かは来訪してもらえているので、帯域や安定性を考えると、さすがに自宅サーバよりはVPSかなとは思うけど。&lt;/p&gt;&#10;&lt;h2 id="m2-pro-mac-miniが変えた生活"&gt;M2 Pro Mac miniが変えた生活&#10;&lt;/h2&gt;&lt;p&gt;M2 Pro Mac miniあんま関係ないやんと思われたかもしれないが、&lt;strong&gt;M2 Pro Mac miniを買わなければ、ここまでセルフホスティングを積極的に試していなかった&lt;/strong&gt;であろうということに注目されたい。つまり、&lt;strong&gt;M2 Pro Mac miniは我が家のシステムを変えた&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;僕にとってM2 Pro Mac miniはまさに良いプロダクト&lt;/strong&gt;だったのである。&lt;/p&gt;&#10;&lt;p&gt;これで明らかなように、M4まで待つ必要はなかったというのが論理的帰結であり、それはそれとしてM4 Pro Mac mini欲しい。&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/m3-mac-m2-pro-mac-mini/" 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;M2 Pro Mac Miniをポチった&lt;/div&gt;&#10; &lt;div class="blog-card-url"&gt;/m3-mac-m2-pro-mac-mini/&lt;/div&gt;&#10; &lt;/div&gt;&#10; &lt;div class="blog-card-thumbnail"&gt;&#10; &lt;img src="https://hack-le.com/images/uploads/2026/09/eyecatch_12198_1789621271.webp" alt="M2 Pro Mac Miniをポチった" 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/m2-pro-mac-mini/" 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;M2 Pro Mac mini (2022)&lt;/div&gt;&#10; &lt;div class="blog-card-url"&gt;/m2-pro-mac-mini/&lt;/div&gt;&#10; &lt;/div&gt;&#10; &lt;/a&gt;&#10;&lt;/div&gt;&#10;&#10;</description></item><item><title>自分のデータは自分で守れ、雲の上で守ってもらえると思うな</title><link>https://hack-le.com/data-self-hosting/</link><pubDate>Sun, 09 Mar 2025 13:13:11 +0900</pubDate><guid>https://hack-le.com/data-self-hosting/</guid><description>&lt;p&gt;クラウドという言葉が定着してもう10年以上経過する。僕はバズワードに過ぎないと思っていたのだが、思いのほか概念として定着したようだ。クラウドとはとどのつまり「他社にデータを預けても良い仕組み」そして「それをクールだとする社会的な思い込み」の総称だ。&lt;/p&gt;&#10;&lt;p&gt;本来、データを預けるのは多くの人にとって受け入れがたい仕組みである。データとは財産であり、その財産を他人に預けるなど正気の沙汰ではない。&lt;/p&gt;&#10;&lt;h2 id="狂気の沙汰を正気の沙汰に"&gt;狂気の沙汰を正気の沙汰に&#10;&lt;/h2&gt;&lt;p&gt;実際、&lt;strong&gt;自分の財を第三者に預けるなど、本来的には狂気の沙汰だと思われるが、その狂気を正気ということにする商売はある&lt;/strong&gt;。金融業なんかその典型だろう。狂気の沙汰を正気の沙汰とするために、彼らはありもしない信用を唱え、勝手なことはしませんよと言うわけだが、僕らがそれを信用するのは、彼らが信頼に足る人物・組織だからではなく、彼らが勝手にやりづらい制度が社会的にあり、また彼らも彼らで一応実績を積み上げてきた、という現実による。&lt;/p&gt;&#10;&lt;p&gt;その意味で、クラウドサービスは金融業と近い面がある。彼らもまた、データという顧客の財を預かるサービスだ。そのサービスが使われるほどに、彼らもまた儲かる。まぁ金融業よりは不動産業に近いかもしれない。その性質のために、最近はGAFAの基盤上でサービスを展開する事業者をデジタル小作人などと呼ぶ人もいる。&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;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;。まぁこれはいささか極端な議論かもしれない。クラウドサービスにも色々あって、コンテナの実行基盤やAWS LambdaのようなFaaSは、財を預けているという感覚は薄いだろう。実際、実行基盤として利用している、その利用料を払っている、というのはユーザとしての素直な感覚である。しかしそれでもやはり、本質としてプログラムという財を預ける信用なくしてできないことは確かだ。&lt;/p&gt;&#10;&lt;p&gt;Dropboxのようなオンライン・ストレージサービスはクラウドの中でも特に財を預けるという感覚が強いものもある。オンライン・ストレージサービスはクラウドの先駆けとも言えるもので、クラウドという言葉流行る前に出来たモノだから、いまでもオンライン・ストレージサービスと言われる。しかしその本質はクラウドに包括されるものだ。&lt;/p&gt;&#10;&lt;p&gt;オンライン・ストレージサービスは信用できない、という言説は昔からあった。実際僕の考えも錯綜している、当ブログを「Dropbox」で検索すれば、NASを主体にしたり、Dropboxを主体にしたりと、あれこれ試行錯誤していることがわかる。&lt;/p&gt;&#10;&lt;div class="blog-card-wrapper"&gt;&#10; &lt;a href="https://hack-le.com/dropbox-plus-nas/" class="blog-card"&gt;&#10; &lt;div class="blog-card-content"&gt;&#10; &lt;div class="blog-card-label"&gt;&#10; &lt;svg xmlns="http://www.w3.org/2000/svg" width="13" height="13" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"&gt;&lt;path d="M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.71"&gt;&lt;/path&gt;&lt;path d="M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71"&gt;&lt;/path&gt;&lt;/svg&gt;&#10; &lt;span&gt;あわせて読みたい&lt;/span&gt;&#10; &lt;/div&gt;&#10; &lt;div class="blog-card-title"&gt;Dropbox Plus &amp;#43; 外付けSSD でNASいらずに挑戦中&lt;/div&gt;&#10; &lt;div class="blog-card-url"&gt;/dropbox-plus-nas/&lt;/div&gt;&#10; &lt;/div&gt;&#10; &lt;div class="blog-card-thumbnail"&gt;&#10; &lt;img src="https://hack-le.com/images/uploads/2026/09/eyecatch_8598_1789585771.webp" alt="Dropbox Plus &amp;#43; 外付けSSD でNASいらずに挑戦中" 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/dropbox-nas/" class="blog-card"&gt;&#10; &lt;div class="blog-card-content"&gt;&#10; &lt;div class="blog-card-label"&gt;&#10; &lt;svg xmlns="http://www.w3.org/2000/svg" width="13" height="13" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"&gt;&lt;path d="M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.71"&gt;&lt;/path&gt;&lt;path d="M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71"&gt;&lt;/path&gt;&lt;/svg&gt;&#10; &lt;span&gt;あわせて読みたい&lt;/span&gt;&#10; &lt;/div&gt;&#10; &lt;div class="blog-card-title"&gt;Dropboxから少しずつNASに移行中&lt;/div&gt;&#10; &lt;div class="blog-card-url"&gt;/dropbox-nas/&lt;/div&gt;&#10; &lt;/div&gt;&#10; &lt;div class="blog-card-thumbnail"&gt;&#10; &lt;img src="https://hack-le.com/images/uploads/2026/09/eyecatch_12083_1788944673.webp" alt="Dropboxから少しずつNASに移行中" loading="lazy" /&gt;&#10; &lt;/div&gt;&#10; &lt;/a&gt;&#10;&lt;/div&gt;&#10;&#10;&lt;p&gt;まぁなんだかんだでDropbox Plusの有料会員は続けているという事実から、僕はDropboxを信用していると考えられる。実際、Dropboxを使い始めてからかれこれ15年たっていると思うが、特に問題が起きたことはない。&lt;/p&gt;&#10;&lt;p&gt;しかしそれも、今の契約が終わるまでで、次の契約更新はしないつもりだ。まぁまだあと1年くらい残っているのだが、今その準備を進めているところで、既に大方のデータをバックアップとしてNASに引っ越している。あと数ヶ月かけて少しずつDropboxの依存度を下げていくつもりである。&lt;/p&gt;&#10;&lt;p&gt;理由として、Dropboxというよりクラウドサービス全体に対する個人的な信用の低下や、サービス全体の肥大化、また、代替手段の技術の向上がある。&lt;/p&gt;&#10;&lt;h2 id="手元の運用が楽になった"&gt;手元の運用が楽になった&#10;&lt;/h2&gt;&lt;p&gt;信用の低下といっても、元から大して信用していたわけではない。オンライン・ストレージサービスの場合は、昔から&lt;strong&gt;プラットフォーマー側の基準による勝手な垢バン問題&lt;/strong&gt;があった。子供とのお風呂写真が、欧米諸国の勝手な倫理基準で児童ポルノ扱いされBANされた、という話は実際に聞く。独身である僕は特に子供の裸写真のようなものは持っていないが、あちらの勝手な基準で勝手に垢バンされる、というリスクは常に警戒してきた。そのために、僕はDropboxと使いながらもずっと外付けハードディスクなどにデータの退避を怠ることはなかった。&lt;/p&gt;&#10;&lt;p&gt;だったら何故Dropboxを使っているのかと言えば、純粋に便利だからである。オンライン・ストレージサービスとはただデータを雲の上に預けるだけではない。&lt;strong&gt;雲の上に預けたデータを、様々なアプリケーションで連携できるところに、クラウドの妙味がある&lt;/strong&gt;。たとえばDropboxにある音楽データをストリーミング再生するアプリなどは、身近な応用例だろう。&lt;/p&gt;&#10;&lt;p&gt;同じ事をオンプレでやろうとしたら、昔はだいぶ苦労したものだ。サーバーの構築とメンテ、そしてインターネット公開のためのネットワーク環境の構築、セキュリティ設定。なので、僕は現実的な選択肢として、Dropboxのようなサービスを利用してきた。&lt;/p&gt;&#10;&lt;p&gt;しかし、今はこれがだいぶ楽にできる。サーバについては、なんといってもコンテナが大きい。コンテナの良いところは、環境のスクラップ&amp;amp;ビルドが滅茶苦茶楽なところだ。設定をコードで書けるのもよい。Linuxマシンを用意して、何かあったらOSの再インストールから……なんてやらなてくいい。そしてネットワークについては、Cloudflareの存在が大きい。特にCloudflare Tunnelは、ネットワーク公開を楽かつセキュアにできる現実的な選択肢だ。&lt;/p&gt;&#10;&lt;p&gt;まぁ結局DockerやCloudflareに依存していると言えばそれはそのとおりで、特にCloudflareについてはデータ監視のリスクもあるが、しかし同様のことができるサービスはあるわけだし、&lt;strong&gt;なにより財を預けているわけではない&lt;/strong&gt;から、依存度としてクラウドサービスの比ではない。重要なことは、依存しないことだ。&lt;strong&gt;依存しないとは、データという人質を取られないこと&lt;/strong&gt;である。&lt;/p&gt;&#10;&lt;p&gt;依存度を下げた運用は昔から可能ではあったけれど、労力を含むコストが大きかった。今、それがかなり現実的なレベルにまで下がっている（といっても非IT技術者には厳しいとは思う）。むしろ、自分の使い方に合わせてソフトウェアを組み合わせることができるという点では、お仕着せのサービスよりもよほど使いやすい。&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;これについては、どうしようもない。まぁデータくらいなら、遠方の家族の家にたまにハードディスクをおかせてもらえば、すべてがゼロになるという事態は防げるかもしれない。まぁ可能なら、遠隔地にNASをおいてネットワーク越しにバックアップなりできればいいと思う。&lt;/p&gt;&#10;&lt;p&gt;しかしそんなことをするなら、クラウドサービスを使えばいいじゃないかという話になるだろう。実際僕もその観点から、クラウドサービスの利用について肯定的だったし、今も業務においては使う。ってか最近個人開発で公開したWebアプリもフツーにAWSのDynamoDBにデータ保存してる。認証はCognito使ってる。&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;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;/p&gt;&#10;&lt;p&gt;実際、プライベートでは脱クラウドを進めている。まぁさすがに2025年にオンプレはどうなのって話もあるが、その場合でも、最近は&lt;strong&gt;VPSのバランスの良さを再評価&lt;/strong&gt;している。コストも値頃だし、スペックの範囲で好き勝手できるし。コンテナ使えるアプリなら移植性も高いし。そもそもクラウドサービス使わなきゃいけないほど非機能が求められる状況ってあんまりないんだよな、僕の場合、というのもあるが。&lt;/p&gt;&#10;&lt;p&gt;そんなわけで、気がつくとMac mini 2018はコンテナサーバとしてなんか常に十数個のサーバが立ち上がっている。まぁめんどくさいこともあるけれど、&lt;strong&gt;そういえばサーバって楽しかったぁ&lt;/strong&gt;、なんてことも思う。&lt;strong&gt;こんな楽しいものは、雲の上より自分の部屋にあったほうがよい&lt;/strong&gt;。そんな360度回ったことを思う今日この頃だ。&lt;/p&gt;&#10;</description></item><item><title>Notion代替ツールAFFiNEをセルフホスティングでやろうとしたら結構つらかった</title><link>https://hack-le.com/affine-self-hosting/</link><pubDate>Wed, 06 Nov 2024 08:21:23 +0900</pubDate><guid>https://hack-le.com/affine-self-hosting/</guid><description>&lt;p&gt;&lt;strong&gt;AFFiNEはあまりメジャーではないと思うが、Notion + Miroに相当する機能を持ったナレッジツール&lt;/strong&gt;である。Notion代替を謳うものとしては他にAppFlowyなんかもあるが（これもあまり有名ではない）、Miroの機能まであるのが珍しく、また面白いと思う。&lt;/p&gt;&#10;&lt;p&gt;で、&lt;strong&gt;なんといっても面白いのは「セルフホスティングできる」ところだ&lt;/strong&gt;。特にライセンス費用などもなく、コストを抑えつつ面倒くさいデータプライバシー問題にも対応できる。個人ならほとんどのSaaSで御法度となっているR18なデータの管理だってできよう。&lt;/p&gt;&#10;&lt;p&gt;ということで、これは良いと思ってしばらく試していたのだが、やってみるとまぁまぁつらく、またキャッチアップもたいへんそうで、結論としては「現時点では様子見」になった。&lt;/p&gt;&#10;&lt;details class="swell-block-accordion__item" data-swl-acc="wrapper"&gt;&lt;summary class="swell-block-accordion__title" data-swl-acc="header"&gt;ChatGPTにまとめさせた記事の要旨&lt;/summary&gt;&#10;&lt;p&gt;このブログ記事は、ナレッジ管理ツール「AFFiNE」の評価とセルフホスティング体験についてまとめた内容です。以下に主なポイントを記載します。&lt;/p&gt;&#10;&lt;ol&gt;&#10;&lt;li&gt;&lt;strong&gt;AFFiNEの特徴&lt;/strong&gt;:&lt;/li&gt;&#10;&lt;/ol&gt;&#10;&lt;ul&gt;&#10;&lt;li&gt;NotionやMiroに似た機能を持ち、ナレッジ管理やドキュメント作成、タスク管理ができる。&lt;/li&gt;&#10;&lt;li&gt;特徴的なのはセルフホスティング対応であり、データプライバシーを保ちつつ、無料で使用できる点。&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;ol start="2"&gt;&#10;&lt;li&gt;&lt;strong&gt;使用感と利便性&lt;/strong&gt;:&lt;/li&gt;&#10;&lt;/ol&gt;&#10;&lt;ul&gt;&#10;&lt;li&gt;初期の操作感は良好で、画面描画もスムーズ。&lt;/li&gt;&#10;&lt;li&gt;ドキュメント管理はフラットで階層構造を後から追加でき、ドラフト作成がしやすい。&lt;/li&gt;&#10;&lt;li&gt;カンバン機能でタスク管理ができ、日記機能も備えている。&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;ol start="3"&gt;&#10;&lt;li&gt;&lt;strong&gt;課題と限界&lt;/strong&gt;:&lt;/li&gt;&#10;&lt;/ol&gt;&#10;&lt;ul&gt;&#10;&lt;li&gt;Miro代替として期待していた「Edgeless」機能に開発向けの用途には限界がある。&lt;/li&gt;&#10;&lt;li&gt;Mermaid記法に非対応である点が大きな欠点。&lt;/li&gt;&#10;&lt;li&gt;データベース機能が未実装で、カンバンも簡易的。&lt;/li&gt;&#10;&lt;li&gt;アカウント管理がGraphQLでの手動操作を要するなど、セルフホスティングの管理が煩雑。&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;ol start="4"&gt;&#10;&lt;li&gt;&lt;strong&gt;セルフホスティングへの疑念&lt;/strong&gt;:&lt;/li&gt;&#10;&lt;/ol&gt;&#10;&lt;ul&gt;&#10;&lt;li&gt;「AFFiNE Cloud」との関連が不明瞭で、セルフホスティングに制限がある点に不安を感じる。&lt;/li&gt;&#10;&lt;li&gt;ドキュメントが不足しており、仕様変更の頻度が高いため、追従が難しい。&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;ol start="5"&gt;&#10;&lt;li&gt;&lt;strong&gt;結論&lt;/strong&gt;:&lt;/li&gt;&#10;&lt;/ol&gt;&#10;&lt;ul&gt;&#10;&lt;li&gt;現時点では、クリティカルな機能不足やセルフホスティングの継続性に不安があるため、本格的な使用は見送るべきと判断。&lt;/li&gt;&#10;&lt;li&gt;ただし、個人利用やサブツールとしては十分に価値があるため、軽い用途には適している。&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;p&gt;全体的に、AFFiNEは一人用のナレッジツールとしては面白いが、複数人での利用や管理面では改善が必要とされています。&lt;/p&gt;&#10;&lt;/details&gt;&#10;&lt;h2 id="操作感は良い"&gt;操作感は良い&#10;&lt;/h2&gt;&lt;p&gt;AFFiNEの第一印象はポジティブだった。最初の画面からしてインパクトがあったが、「おお、マジでMiroやん」と思ったな。&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/2024/11/1403470ae301cdfb4dfa5225d06ee823-700x319.png"&gt;&lt;/p&gt;&#10;&lt;p&gt;もちろん普通のドキュメントも作れる（当たり前）。これがなかなか良く考えられており、&lt;strong&gt;ドキュメント自体はフラットに作られていくのだが、それをWikiのように階層的に管理する感じ&lt;/strong&gt;だ。何が良いかというと、ベースがフラットに積み上げていく形なので「ドラフト」を作りやすい。最初に「このドキュメントはどこに置こう」と考えなくて良い。ドラフトのまま放置してもいいし、ある程度書き上げてから階層構造の中に組み込んでもいい。これは実際やってみると、なかなか良い体験だった。&lt;/p&gt;&#10;&lt;p&gt;無理矢理Notion的に言うと、グローバルなデータベースが最初からあって、そこから任意のドキュメントを階層的に管理したり、またタグでまとめたりできるような感じだろうか。&lt;/p&gt;&#10;&lt;p&gt;また、自動で作られるその日の日記ドキュメントも、けっこう勝手がいい。もちろんNotionでも似たようなことは実現できるが、最初から備わっているだけでだいぶ気楽なものだなと思った。&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/2024/11/2b6bfa5f95a03ae5746a29ce61317abc-700x336.png"&gt;&lt;/p&gt;&#10;&lt;p&gt;機能的にも、タスク管理でカンバンが使えるなど、必要そうなことは一通り揃っている感じだった。Notionほど多機能ではないけれど、その分わかりやすいと思ったし、必要十分じゃないかこれは、と思ったな。&lt;/p&gt;&#10;&lt;p&gt;そしてなんといっても、パフォーマンスが非常によかった。とにかく画面の描画が早い。うちのクソ雑魚ネット上り回線でもそうだから、ローカルストレージをうまく利用しているのだと思われる。&lt;/p&gt;&#10;&lt;p&gt;また、セルフホスティングもけっこう簡単で、docker compose一発でサーバがたったし、さらに最初の管理画面で「サインアップ機能の無効化」などもあったのが素晴らしかった。これはちょっと前にAppFlowyを試した時、サインアップの無効化があまり推奨されておらず、そうするとWeb画面に到達するもっと前のところでアクセス制御が必要ということになり、それは正しいっちゃ正しいんだが「めんどくせぇ」と思わされたところだったので、本当によかった。&lt;/p&gt;&#10;&lt;p&gt;で、僕は非常に気を良くして、友人とやっているプロジェクトの管理でナレッジツールはGrowi（OSSでセルフホスティングできるWikiツール）よりこれを使おうぜと持ちかけたくらいだ。&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;h3 id="miro代替としては機能が不足している"&gt;Miro代替としては機能が不足している&#10;&lt;/h3&gt;&lt;p&gt;まず期待のMiroの機能であるEdgelessだが、これは使って見るとちょっと機能が不足していると思われた。特に僕らは開発系なのだけれど、その向きではかなりつらい。マインドマップと簡単なシステム図くらいしか作れそうにない。&lt;/p&gt;&#10;&lt;p&gt;クラス図ならば頑張ればそれっぽいのは書けるかもしれないが、ER図のあの変な矢印みたいなのは到底できそうにない。友人はMiroでそういったドキュメントを作るので「ちょっとこれじゃ使えないなぁ」と評価されてしまった。&lt;/p&gt;&#10;&lt;h3 id="mermaid記法が使えない"&gt;Mermaid記法が使えない&#10;&lt;/h3&gt;&lt;p&gt;そこで「Mermaid記法で書けばいいじゃないか」と言えればよかったのだが（納得するかどうかは別として）、残念なことにMermaid記法に対応していない。これは僕にとって大きなマイナスだ。グラフについてはEdgelessがあるじゃないかということなのだろうが、機能が足りないうえに、僕からすると「ページの中に図をしれっと挿入したいんだよ」と思うことも多々ある。Mermaid記法の非対応は僕にとって「がーんだな」であった。&lt;/p&gt;&#10;&lt;h3 id="カンバンというかデータベースが貧弱というよりない"&gt;カンバン、というかデータベースが貧弱（というよりない）&#10;&lt;/h3&gt;&lt;p&gt;カンバンでタスク管理ができるぞ、というのはすごいことだと思ったが、実際に使って見ると、 &lt;strong&gt;「表をカンバンっぽくしたもの」という感じ&lt;/strong&gt;だった。機能としてはかなりプアである。Notionのような使い勝手を想像してはいけない。&lt;/p&gt;&#10;&lt;p&gt;まぁこれはつまり、&lt;strong&gt;データベース機能がない、という風に言えばよいかもしれない&lt;/strong&gt;。なんかこれは開発者の人が「今注力してる」みたいなことを言っていたので（TwitterでAFFiNEについて呟いていたらなんか補足されて話しかけられた）、そのうち実装されるのかもしれないのだが、少なくとも今のKanbanはかなりプアだと認識すべき。&lt;/p&gt;&#10;&lt;p&gt;まぁ要件次第では使えないことはないと思うし、むしろ人によっては「こういうのでいいんだよ」と思うかもしれない。機能がプアとは、裏を返せばそれだけシンプルだということでもある。&lt;/p&gt;&#10;&lt;h3 id="管理がつらいいちいちgraphqlやdb操作を求められる"&gt;管理がつらい、いちいちGraphQLやDB操作を求められる&#10;&lt;/h3&gt;&lt;p&gt;&lt;strong&gt;管理面では、セルフホスティング向けの管理機能がほぼほぼ不足しているのがつらい&lt;/strong&gt;。アカウントを増やすだけでGraphQLを叩かないといけなかった。これはかなりつらい。&lt;/p&gt;&#10;&lt;p&gt;しかも実際に使って見るとAuthエラーが出たりなんだりするうえ、それについてドキュメントがあるわけでもなく、いったいどうすればいいんだろうとGraphQLのスキーマを見て悩む。仕様も頻繁に変わっているようで、GitHubのIssueには戸惑っている人も多くいた。&lt;/p&gt;&#10;&lt;p&gt;たとえば以前はsignUpとして「&lt;a class="link" href="https://github.com/toeverything/AFFiNE/issues/5957" target="_blank" rel="noopener"&#10; &gt;How to create a new account on self-hosted affine ​ · Issue #5957 · toeverything/AFFiNE&lt;/a&gt;」のIssueが解決策となっていたが、これがいつのまにか使えなくなり、「&lt;a class="link" href="https://github.com/toeverything/AFFiNE/issues/7105" target="_blank" rel="noopener"&#10; &gt;Can&amp;rsquo;t create users via GraphQL requests​ · Issue #7105 · toeverything/AFFiNE&lt;/a&gt;」「&lt;a class="link" href="https://github.com/toeverything/AFFiNE/issues/7106" target="_blank" rel="noopener"&#10; &gt;[urgent] GraphQL command for signUp is removed in current version stable · Issue #7106 · toeverything/AFFiNE&lt;/a&gt;」など複数のIssueで「signUpできないんだけど」とイシューがたった。これについては「その機能は消した。GraphQLのスキーマを見てね」とのみ。（ちなみに僕もGraphQLのスキーマを見てやってみたんだが401エラーになってしまった。認証が必要なのはわかるがどうやればいいのかわからず、もういいやとなった……）&lt;/p&gt;&#10;&lt;p&gt;この分だと、&lt;strong&gt;頑張って対応してもまたすぐ仕様が変わってキャッチアップ大変そう&lt;/strong&gt;。&lt;/p&gt;&#10;&lt;p&gt;また、せっかくのセルフホスティングだというのに、なぜか「アカウント数」「ワークスペースの容量」に制限がかかっている。これについては、DBを直接操作することで解除できるらしい（「&lt;a class="link" href="https://github.com/toeverything/AFFiNE/issues/6641#event-55f2f157-fd19-5e82-9acc-a37d28401229" target="_blank" rel="noopener"&#10; &gt;Self-hosted not unrestricted​ · Issue #6641 · toeverything/AFFiNE&lt;/a&gt;」）のだが、「え？」という感じだ。&lt;/p&gt;&#10;&lt;h3 id="セルフホスティングをどうしたいのかよくわからない"&gt;セルフホスティングをどうしたいのかよくわからない&#10;&lt;/h3&gt;&lt;p&gt;&lt;strong&gt;全体として、「セルフホスティングをどうしたいのかわからない」という不安がある&lt;/strong&gt;。実際セルフホスティングであるにも関わらずAFFiNE Cloudという名前が使われており、これについて「おいCloudってなんだ、まさかAFFiNE社のサーバを経由するのか？そうじゃないならAFFiNE Cloudなんて言わないでくれよ」と不安を訴えるユーザもいる。「&lt;a class="link" href="https://github.com/Drun555" target="_blank" rel="noopener"&#10; &gt;​Self-hosted shouldn&amp;rsquo;t say &amp;ldquo;Affine Cloud&amp;rdquo; · Issue #7097 · toeverything/AFFiNE&lt;/a&gt;」がそのイシューだが、最終的に「Outline（セルフホスティングできるWikiツール）」を試してみようで終わっていた。&lt;/p&gt;&#10;&lt;p&gt;Discussionsにもスレッドがあるのだが「&lt;a class="link" href="https://github.com/toeverything/AFFiNE/discussions" target="_blank" rel="noopener"&#10; &gt;toeverything/AFFiNE · Discussions · GitHub&lt;/a&gt;」どうもあまり活発ではなさそうだ。&lt;/p&gt;&#10;&lt;p&gt;このサービスはOSSでセルフホスティングできることがウリの一つなのだけれど、&lt;strong&gt;サービスのビジネスモデルとしてはSaaSモデルで、セルフホスティングユーザはサービス側からすると1円にもならない&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;次はOutline使ってみるかなぁ。&lt;/p&gt;&#10;</description></item><item><title>Dockerコンテナサーバー機として余生を生きるIntel Mac mini 2018</title><link>https://hack-le.com/docker%E3%82%B3%E3%83%B3%E3%83%86%E3%83%8A%E3%82%B5%E3%83%BC%E3%83%90%E3%83%BC%E6%A9%9F%E3%81%A8%E3%81%97%E3%81%A6%E4%BD%99%E7%94%9F%E3%82%92%E7%94%9F%E3%81%8D%E3%82%8Bintel-mac-mini-2018/</link><pubDate>Thu, 19 Sep 2024 11:46:31 +0900</pubDate><guid>https://hack-le.com/docker%E3%82%B3%E3%83%B3%E3%83%86%E3%83%8A%E3%82%B5%E3%83%BC%E3%83%90%E3%83%BC%E6%A9%9F%E3%81%A8%E3%81%97%E3%81%A6%E4%BD%99%E7%94%9F%E3%82%92%E7%94%9F%E3%81%8D%E3%82%8Bintel-mac-mini-2018/</guid><description>&lt;p&gt;衝動買いに近い形でM2 Pro Mac miniを買ってしまってからぼちぼち10か月くらいたつが（はやい）、それまで使っていたIntel Mac mini 2018でも不便があったわけではなかった。というか使えば今も十分使えると思う。&lt;/p&gt;&#10;&lt;p&gt;なんだけれど、まぁ買ってしまったので仕方ないね。そしてIntel Mac mini 2018はどうしようかなと思っていたのだが、なんだかんだでDockerのコンテナサーバとして余生を過ごしている。&lt;strong&gt;余生というかバリバリ現役感が&lt;/strong&gt;ある。&lt;/p&gt;&#10;&lt;h2 id="このスペックのvpsは借りられない"&gt;このスペックのVPSは借りられない&#10;&lt;/h2&gt;&lt;p&gt;&lt;strong&gt;Mac mini 2018をサーバとして使うと何が良いかといえば、CPU 6コア、32GB RAM（家に64GB RAMもあるので交換可能……めんどくさいからしてない笑）、500GBストレージ、さらにUSBありというVPSでは非常に厳しい機能を実現できる&lt;/strong&gt;ことだね。まぁもちろん停電で落ちるし、なによりJ:COMのうちのネットワーク帯域はうんちっちなので、まともなサーバ環境とは言い難いけれど、別にそんなまともなサーバ環境が必要なものばかりでもないしさ。NASなんて外からのアクセスたまにできたらいい程度だし。以前だとインターネット公開は何かと面倒だったけれど、最近はCloudflare Tunnelとかいう神サービスもあるので、お手軽に自分専用のサーバをたてられるようになった。&lt;/p&gt;&#10;&lt;p&gt;カジュアルにElasticsearchなどスペックが必要なサーバをやれるのはとても良いよ。おかげで重ための開発中Webアプリを気軽にホスティングして試せるし（localhostじゃイヤだい）、出来合いのツールだとGrowiとかWordPressとかスナック菓子感覚でたてられて楽しい。全文検索API作りたいなぁ、クラウドだとたっかいから二の足踏んでたけどセルフホスティングならやってもいいね。Grafanaも個人でやれる。AIもグラボで動かせるやつなら電気代の範囲でできる。ネットワーク環境が光回線ならMisskeyサーバたててもいいなぁ。なんだかんだでサーバは楽しいよ。&lt;/p&gt;&#10;&lt;p&gt;以前（9年ほど前……）自宅サーバは浪漫枠なんて記事を書いたけれど、&lt;strong&gt;再び自宅サーバの時代がきた&lt;/strong&gt;のだ。&lt;/p&gt;&#10;&lt;div class="blog-card-wrapper"&gt;&#10; &lt;a href="https://hack-le.com/45948138-2/" class="blog-card"&gt;&#10; &lt;div class="blog-card-content"&gt;&#10; &lt;div class="blog-card-label"&gt;&#10; &lt;svg xmlns="http://www.w3.org/2000/svg" width="13" height="13" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"&gt;&lt;path d="M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.71"&gt;&lt;/path&gt;&lt;path d="M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71"&gt;&lt;/path&gt;&lt;/svg&gt;&#10; &lt;span&gt;あわせて読みたい&lt;/span&gt;&#10; &lt;/div&gt;&#10; &lt;div class="blog-card-title"&gt;自宅サーバーは浪漫枠&lt;/div&gt;&#10; &lt;div class="blog-card-url"&gt;/45948138-2/&lt;/div&gt;&#10; &lt;/div&gt;&#10; &lt;div class="blog-card-thumbnail"&gt;&#10; &lt;img src="https://hack-le.com/images/uploads/2026/09/eyecatch_2738_1789453565.webp" alt="自宅サーバーは浪漫枠" loading="lazy" /&gt;&#10; &lt;/div&gt;&#10; &lt;/a&gt;&#10;&lt;/div&gt;&#10;&#10;&lt;p&gt;まぁさすがに全体公開を想定したWebサイトはVPS借りたほうがいいと思うけど。なんかあったらプロバイダに怒られそうだしさ。怒られた。&lt;/p&gt;&#10;&lt;div class="blog-card-wrapper"&gt;&#10; &lt;a href="https://hack-le.com/dropbox-jcom/" class="blog-card"&gt;&#10; &lt;div class="blog-card-content"&gt;&#10; &lt;div class="blog-card-label"&gt;&#10; &lt;svg xmlns="http://www.w3.org/2000/svg" width="13" height="13" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"&gt;&lt;path d="M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.71"&gt;&lt;/path&gt;&lt;path d="M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71"&gt;&lt;/path&gt;&lt;/svg&gt;&#10; &lt;span&gt;あわせて読みたい&lt;/span&gt;&#10; &lt;/div&gt;&#10; &lt;div class="blog-card-title"&gt;DropboxでバックアップしてたらJ:COMから帯域制限の警告が配達証明できたよ&lt;/div&gt;&#10; &lt;div class="blog-card-url"&gt;/dropbox-jcom/&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/4038cb102a20229a20a744cda36786cf.png" alt="DropboxでバックアップしてたらJ:COMから帯域制限の警告が配達証明できたよ" loading="lazy" /&gt;&#10; &lt;/div&gt;&#10; &lt;/a&gt;&#10;&lt;/div&gt;&#10;&#10;&lt;p&gt;まぁこれはサーバじゃ無くてDropbox経由のバックアップで怒られたんだけどね（J:COMのしょっぱい上り回線でパブリックに向けた何かをしようとはそもそも思わない）。J:COMは上り回線30GB/日までらしいよー。&lt;/p&gt;&#10;&lt;p&gt;光回線だったらそこまで神経質にならないでいいと思うけど、基本的には「通信帯域はあんまりいらないんだけど、スペック・物理的な拡張性がいる」みたいなのが向いてるね。まぁ全体公開用のWebサーバは大人しくVPSにしとこ。&lt;/p&gt;&#10;&lt;h2 id="静かで小さい"&gt;静かで小さい&#10;&lt;/h2&gt;&lt;p&gt;ただMacである必要はないどころか、むしろDockerメインならMacじゃないほうがよくねと言われると「ぐぬぬ」ではある。でもそうだなぁ、&lt;strong&gt;Mac miniほど小型で静音性の高いデスクトップPC&lt;/strong&gt;となると中々ないんじゃないかな。実際Mac miniのいいところって静音性だと思うし。時々熱くてうるさいけどね。熱いのはいつもか。かれこれ5年以上使ってるけど、よくもってるな。僕の愛が伝わっている（なんか言ってる）。&lt;/p&gt;&#10;&lt;p&gt;HWとは別にSWとしてmacOSのいいところと言われると……画面共有できるのは地味に便利かな……。TimeMachineはもはや使わないし。&lt;/p&gt;&#10;&lt;p&gt;まぁ……総合的に見たらLinuxのほうがいいのはそりゃそう。でもま……ありものを有効に使おうぜってことだから。コイツは去年までうちのメインデスクトップとして頑張ってたんだからよぉ、これでいいんだよ。&lt;/p&gt;&#10;&lt;h2 id="バリバリ現役"&gt;バリバリ現役&#10;&lt;/h2&gt;&lt;p&gt;ということで余生と書いたけど、実はバリバリ現役なんだよ。壊れたら困るなーって思うもの。多分壊れたら、しばらくはメインデスクトップに環境移すとしても（それがすぐできるのも素晴らしいよね）、なんか自作PC組むか中古のPC買うと思う。うーん、それは困るな、出費がかさむ。&lt;/p&gt;&#10;&lt;p&gt;あと10年もってくれ頼むよー。&lt;/p&gt;&#10;</description></item><item><title>Growiのファイルアップロード先をS3に設定</title><link>https://hack-le.com/growi-s3/</link><pubDate>Tue, 17 Sep 2024 16:56:22 +0900</pubDate><guid>https://hack-le.com/growi-s3/</guid><description>&lt;p&gt;「&lt;a class="link" href="https://docs.growi.org/ja/admin-guide/management-cookbook/app-settings.html#amazon-s3-bucket-%E3%81%AE%E3%82%BB%E3%83%83%E3%83%88%E3%82%A2%E3%83%83%E3%83%97" target="_blank" rel="noopener"&#10; &gt;アプリ設定 | GROWI Docs&lt;/a&gt;」にあるとおりなんだけれど、何故か毎回引っかかってしまうのでメモする。&lt;/p&gt;&#10;&lt;h2 id="環境"&gt;環境&#10;&lt;/h2&gt;&lt;ul&gt;&#10;&lt;li&gt;docker-composeで作ったもので確認&#10;&lt;ul&gt;&#10;&lt;li&gt;ホストOS: macOS 14, IntelとAppleSilicon両方確認&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;/li&gt;&#10;&lt;li&gt;Growi v7.0.x&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;h2 id="やること"&gt;やること&#10;&lt;/h2&gt;&lt;pre class="mermaid" style="visibility:hidden"&gt;graph LR&#10;user(ユーザ)&#10;growi(Growi)&#10;s3(S3)&#10;growi -.-&gt;|アップロード| s3&#10;s3 --&gt;|アクセス許可| growi --&gt;|ファイル| user&lt;/pre&gt;&lt;p&gt;Growiを通じてS3上のファイルをやりとりできるようにするための、Growi-S3間の権限設定をそれぞれすることになる。&lt;/p&gt;&#10;&lt;ul&gt;&#10;&lt;li&gt;AWS側&#10;&lt;ul&gt;&#10;&lt;li&gt;保存するバケットを作成する（今回はap-northeast-1）&#10;&lt;ul&gt;&#10;&lt;li&gt;バケットのパブリックブロックの設定を変更する&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;/li&gt;&#10;&lt;li&gt;バケットにアクセスするためのIAMポリシーをアタッチしたIAMユーザを作成する&#10;&lt;ul&gt;&#10;&lt;li&gt;IAMユーザの認証キーを作成する&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;/li&gt;&#10;&lt;li&gt;Growi側&#10;&lt;ul&gt;&#10;&lt;li&gt;docker-compose.ymlで &lt;code&gt;S3_OBJECT_ACL=private&lt;/code&gt;の設定をする&lt;/li&gt;&#10;&lt;li&gt;アプリ設定で認証の設定をする&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;h2 id="手順"&gt;手順&#10;&lt;/h2&gt;&lt;h3 id="aws-バケットの作成"&gt;AWS: バケットの作成&#10;&lt;/h3&gt;&lt;p&gt;東京リージョンでバケットを作成する。&lt;/p&gt;&#10;&lt;p&gt;バケットのブロックパブリックアクセスのうち、「&lt;strong&gt;新しいアクセスコントロールリスト (ACL) を介して付与されたバケットとオブジェクトへのパブリックアクセスをブロックする&lt;/strong&gt;」のみオフにする（下図）。作成時に設定できるが、作成後にも「アクセス許可」タブより設定変更可能。&lt;/p&gt;&#10;&lt;p&gt;&lt;img loading="lazy" sizes="(max-width: 767px) calc(100vw - 30px), (max-width: 1023px) 700px, (max-width: 1279px) 950px, 1232px" src="https://hack-le.com/images/uploads/2024/09/55013ed0226267980c63680fc934acd8-700x326.png"&gt;&lt;/p&gt;&#10;&lt;h3 id="aws-iamの作成"&gt;AWS: IAMの作成&#10;&lt;/h3&gt;&lt;p&gt;作成したバケットにアクセスするためのIAMポリシーを作成する。ポリシーは以下。&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-dockerfile" data-lang="dockerfile"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="o"&gt;{&lt;/span&gt;&lt;span class="err"&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;Version&amp;#34;&lt;/span&gt;: &lt;span class="s2"&gt;&amp;#34;2012-10-17&amp;#34;&lt;/span&gt;,&lt;span class="err"&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;Statement&amp;#34;&lt;/span&gt;: &lt;span class="o"&gt;[&lt;/span&gt;&lt;span class="err"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="o"&gt;{&lt;/span&gt;&lt;span class="err"&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;Effect&amp;#34;&lt;/span&gt;: &lt;span class="s2"&gt;&amp;#34;Allow&amp;#34;&lt;/span&gt;,&lt;span class="err"&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;Action&amp;#34;&lt;/span&gt;: &lt;span class="o"&gt;[&lt;/span&gt;&lt;span class="err"&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;s3:PutObject&amp;#34;&lt;/span&gt;,&lt;span class="err"&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;s3:PutObjectAcl&amp;#34;&lt;/span&gt;,&lt;span class="err"&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;s3:GetObject&amp;#34;&lt;/span&gt;&lt;span class="err"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="o"&gt;]&lt;/span&gt;,&lt;span class="err"&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;Resource&amp;#34;&lt;/span&gt;: &lt;span class="o"&gt;[&lt;/span&gt;&lt;span class="err"&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;arn:aws:s3:::&amp;lt;作成したバケット名&amp;gt;/*&amp;#34;&lt;/span&gt;&lt;span class="err"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="o"&gt;]&lt;/span&gt;&lt;span class="err"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="o"&gt;}&lt;/span&gt;&lt;span class="err"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="o"&gt;]&lt;/span&gt;&lt;span class="err"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="o"&gt;}&lt;/span&gt;&lt;span class="err"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;IAMユーザを作成し、作成したポリシーをアタッチする。&lt;/p&gt;&#10;&lt;p&gt;IAMユーザの認証キーを作成して保存する。&lt;/p&gt;&#10;&lt;h3 id="growi-docker-composeyml-の編集"&gt;Growi: docker-compose.yml の編集&#10;&lt;/h3&gt;&lt;p&gt;docker-compose.yml に環境変数として &lt;code&gt;S3_OBJECT_ACL=private&lt;/code&gt; を追加。&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-dockerfile" data-lang="dockerfile"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;version: &lt;span class="s1"&gt;&amp;#39;3&amp;#39;&lt;/span&gt;&lt;span class="err"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="err"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;services:&lt;span class="err"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; app:&lt;span class="err"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; build:&lt;span class="err"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; context: .&lt;span class="err"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; dockerfile: ./Dockerfile&lt;span class="err"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; ports:&lt;span class="err"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; - 127.0.0.1:13000:3000 &lt;span class="c1"&gt;# localhost only by default&lt;/span&gt;&lt;span class="err"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; links:&lt;span class="err"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; - mongo:mongo&lt;span class="err"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; - elasticsearch:elasticsearch&lt;span class="err"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; depends_on:&lt;span class="err"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; - mongo&lt;span class="err"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; - elasticsearch&lt;span class="err"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; environment:&lt;span class="err"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; - &lt;span class="nv"&gt;MONGO_URI&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;mongodb://mongo:27017/growi&lt;span class="err"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; - &lt;span class="nv"&gt;ELASTICSEARCH_URI&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;http://elasticsearch:9200/growi&lt;span class="err"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; - &lt;span class="nv"&gt;PASSWORD_SEED&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;changeme&lt;span class="err"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; - &lt;span class="nv"&gt;S3_OBJECT_ACL&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;private &lt;span class="c1"&gt;# ---------------ここに追加-------------------&lt;/span&gt;&lt;span class="err"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="c1"&gt;# - FILE_UPLOAD=mongodb # activate this line if you use MongoDB GridFS rather than AWS&lt;/span&gt;&lt;span class="err"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="c1"&gt;# - FILE_UPLOAD=local&lt;/span&gt;&lt;span class="err"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;コンテナを再起動する。&lt;/p&gt;&#10;&lt;h3 id="growi-アプリの設定"&gt;Growi: アプリの設定&#10;&lt;/h3&gt;&lt;p&gt;管理者画面の「アプリ設定」より「ファイルアップロード設定」で、ファイルアップロード方法としてAWS(S3)を選択し、リージョン、バケット名、キーの設定をして更新する。&lt;/p&gt;&#10;&lt;h2 id="所感"&gt;所感&#10;&lt;/h2&gt;&lt;p&gt;マニュアルに書いてあるんだけど、いつも何かを忘れて謎に引っかかるので、メモした。だいたいdocker-compose.ymlの編集を忘れる模様。&lt;/p&gt;&#10;&lt;p&gt;Growi便利だよね。&lt;/p&gt;&#10;</description></item><item><title>DockerのボリュームをCLIでバックアップ・復元する</title><link>https://hack-le.com/docker-volume-cli-backup/</link><pubDate>Mon, 09 Sep 2024 09:55:54 +0900</pubDate><guid>https://hack-le.com/docker-volume-cli-backup/</guid><description>&lt;p&gt;最近色々セルフホスティングでコンテナ動かしているため、バックアップの必要が出てきた。ので、その内容と実際の手順についてメモする。&lt;/p&gt;&#10;&lt;h2 id="ボリュームのバックアップは何をやるのか"&gt;ボリュームのバックアップは何をやるのか&#10;&lt;/h2&gt;&lt;p&gt;まずDockerのボリュームのバックアップとはつまり何をすることなのかについて。これは公式の「&lt;a class="link" href="https://www.docker.com/blog/back-up-and-share-docker-volumes-with-this-extension/" target="_blank" rel="noopener"&#10; &gt;Back Up and Share Docker Volumes with This Extension | Docker&lt;/a&gt;」を読むとよいのだが、つまりは以下のスニペットに帰結する。&lt;/p&gt;&#10;&lt;pre class="prism undefined-numbers lang-bash" data-lang="Bash"&gt;`docker run --rm \ -v "$VOLUME_NAME":/backup-volume \ -v "$(pwd)":/backup \ busybox \ tar -zcvf /backup/my-backup.tar.gz /backup-volume`&lt;/pre&gt;&#10;&lt;p&gt;このコードの詳細な解説はChatGPTに譲るが、まぁ要はバックアップを作るためのコンテナを作成し、ホストマシンにデータをコピーしている形だ。復元はこれの逆をやると良い。DBなんかは通常dumpのユーティリティがあるが、記事によればDockerの場合はこれでまるごとコピーするほうが良いとのことだ。&lt;/p&gt;&#10;&lt;details class="swell-block-accordion__item" data-swl-acc="wrapper"&gt;&lt;summary class="swell-block-accordion__title" data-swl-acc="header"&gt;ChatGPTによるコードの解説&lt;/summary&gt;&#10;&lt;p&gt;このコマンドは、&lt;code&gt;Docker&lt;/code&gt;を使って簡単にバックアップを作成するための手順です。以下に各部分の解説を行います。&lt;/p&gt;&#10;&lt;ol&gt;&#10;&lt;li&gt;&lt;strong&gt;&lt;code&gt;docker run --rm&lt;/code&gt;&lt;/strong&gt; :&lt;/li&gt;&#10;&lt;/ol&gt;&#10;&lt;ul&gt;&#10;&lt;li&gt;&lt;code&gt;docker run&lt;/code&gt; は Docker コンテナを実行するコマンドです。&lt;code&gt;--rm&lt;/code&gt; は、コンテナが終了した後にそのコンテナを自動的に削除するオプションです。これにより、バックアップが完了した時点で不要なコンテナが残らないようになります。&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;ol&gt;&#10;&lt;li&gt;&lt;strong&gt;&lt;code&gt;-v &amp;quot;$VOLUME_NAME&amp;quot;:/backup-volume&lt;/code&gt;&lt;/strong&gt; :&lt;/li&gt;&#10;&lt;/ol&gt;&#10;&lt;ul&gt;&#10;&lt;li&gt;&lt;code&gt;-v&lt;/code&gt; オプションは、ホストマシンとコンテナ間でボリュームをマウントするためのものです。&lt;code&gt;$VOLUME_NAME&lt;/code&gt; はバックアップしたい Docker ボリュームの名前を指します。これがコンテナ内の &lt;code&gt;/backup-volume&lt;/code&gt; ディレクトリにマウントされます。&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;ol&gt;&#10;&lt;li&gt;&lt;strong&gt;&lt;code&gt;-v &amp;quot;$(pwd)&amp;quot;:/backup&lt;/code&gt;&lt;/strong&gt; :&lt;/li&gt;&#10;&lt;/ol&gt;&#10;&lt;ul&gt;&#10;&lt;li&gt;こちらも &lt;code&gt;-v&lt;/code&gt; オプションですが、ホストマシンの現在の作業ディレクトリ（&lt;code&gt;$(pwd)&lt;/code&gt; で取得される）をコンテナ内の &lt;code&gt;/backup&lt;/code&gt; ディレクトリにマウントしています。このディレクトリにバックアップファイルを保存します。&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;ol&gt;&#10;&lt;li&gt;&lt;strong&gt;&lt;code&gt;busybox&lt;/code&gt;&lt;/strong&gt; :&lt;/li&gt;&#10;&lt;/ol&gt;&#10;&lt;ul&gt;&#10;&lt;li&gt;これは Docker イメージの名前です。&lt;code&gt;busybox&lt;/code&gt; は非常に軽量な Linux ベースのイメージで、基本的なユーティリティ（&lt;code&gt;tar&lt;/code&gt; など）を含んでいます。このコンテナが一時的に起動され、バックアップ処理を実行します。&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;ol&gt;&#10;&lt;li&gt;&lt;strong&gt;&lt;code&gt;tar -zcvf /backup/my-backup.tar.gz /backup-volume&lt;/code&gt;&lt;/strong&gt; :&lt;/li&gt;&#10;&lt;/ol&gt;&#10;&lt;ul&gt;&#10;&lt;li&gt;&lt;code&gt;tar&lt;/code&gt; コマンドで圧縮ファイル（&lt;code&gt;.tar.gz&lt;/code&gt;）を作成しています。&#10;&lt;ul&gt;&#10;&lt;li&gt;&lt;code&gt;-z&lt;/code&gt;: &lt;code&gt;gzip&lt;/code&gt; 形式で圧縮するオプション。&lt;/li&gt;&#10;&lt;li&gt;&lt;code&gt;-c&lt;/code&gt;: 新しいアーカイブを作成するオプション。&lt;/li&gt;&#10;&lt;li&gt;&lt;code&gt;-v&lt;/code&gt;: 詳細な出力（アーカイブ中のファイル名を表示する）。&lt;/li&gt;&#10;&lt;li&gt;&lt;code&gt;-f /backup/my-backup.tar.gz&lt;/code&gt;: 出力するファイル名を指定しています。この場合は、&lt;code&gt;/backup/my-backup.tar.gz&lt;/code&gt; という名前で圧縮ファイルが作成されます。&lt;/li&gt;&#10;&lt;li&gt;&lt;code&gt;/backup-volume&lt;/code&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;br&gt;&#10;このコマンドは、指定した Docker ボリューム（&lt;code&gt;$VOLUME_NAME&lt;/code&gt;）を &lt;code&gt;tar&lt;/code&gt; コマンドで圧縮し、現在のディレクトリに &lt;code&gt;my-backup.tar.gz&lt;/code&gt; という名前のバックアップファイルを保存します。&lt;/p&gt;&#10;&lt;/details&gt;&#10;&lt;p&gt;これを実行するものとして、v4.29.0以降のDocker Desktopでは拡張機能として公式で提供されている（「&lt;a class="link" href="https://hub.docker.com/extensions/docker/volumes-backup-extension" target="_blank" rel="noopener"&#10; &gt;Volumes Backup &amp;amp; Share - Docker Extension | Docker Hub&lt;/a&gt;」）。上の記事によれば、この拡張機能はボリュームをアタッチしているコンテナを調べて一時停止し、再起動するところまで含めてやっているようだ。&lt;/p&gt;&#10;&lt;p&gt;&lt;img loading="lazy" sizes="(max-width: 767px) calc(100vw - 30px), (max-width: 1023px) 700px, (max-width: 1279px) 950px, 1232px" src="https://hack-le.com/images/uploads/2024/09/a2ee7aceb3b433c344c8d4ee8c3dede4-700x237.png"&gt;&lt;/p&gt;&#10;&lt;p&gt;&lt;em&gt;黒塗りしてるのは開発中のアプリ名が出ちゃってるvolume 気にするな&lt;/em&gt;&lt;/p&gt;&#10;&lt;p&gt;便利な拡張機能だが、もうすぐdeprecatedになる見込みで、どうやらこの機能は近日中に公式で提供されるものらしい。その際、手動バックアップは普通に使えるが、スケジューリングはサブスクプラン専用機能になる模様（&lt;a class="link" href="https://docs.docker.com/desktop/use-desktop/volumes/#export-a-volume" target="_blank" rel="noopener"&#10; &gt;Explore Volumes | Docker Docs&lt;/a&gt;）。&lt;/p&gt;&#10;&lt;h2 id="cliで無料でやりたい"&gt;CLIで無料でやりたい&#10;&lt;/h2&gt;&lt;p&gt;バックアップはスケジューリングしてやりたいし、お金はないし、そもそもVPSとかDocker Desktopない環境でも使いたい。ということで、フツーにスクリプト書くかなと思った。&lt;/p&gt;&#10;&lt;p&gt;やっていることは単純なので、全部自分で書いてもよかったが、上記記事の中でも紹介されている「&lt;a class="link" href="https://github.com/BretFisher/docker-vackup" target="_blank" rel="noopener"&#10; &gt;https://github.com/BretFisher/docker-vackup&lt;/a&gt;」がシンプルなシェルスクリプトでそのまま使えて便利そうだったので、これを使うことにした。&lt;/p&gt;&#10;&lt;p&gt;インストール手順はREADME.md見ればよいが一応書いておく。LinuxとMacならそのまんま。&lt;/p&gt;&#10;&lt;pre class="prism undefined-numbers lang-plain"&gt;`sudo curl -sSL https://raw.githubusercontent.com/BretFisher/docker-vackup/main/vackup -o /usr/local/bin/vackup &amp;&amp; sudo chmod +x /usr/local/bin/vackup`&lt;/pre&gt;&#10;&lt;p&gt;このスクリプトは特にコンテナの停止などしていないようなので、ユースケースから必要なら停止する処理を入れたスクリプト書くべし。&lt;/p&gt;&#10;&lt;h2 id="vackupを使ったバックアップと復元"&gt;vackupを使ったバックアップと復元&#10;&lt;/h2&gt;&lt;p&gt;いざという時に使えるように、練習する。&lt;/p&gt;&#10;&lt;h3 id="テスト用コンテナのセットアップ"&gt;テスト用コンテナのセットアップ&#10;&lt;/h3&gt;&lt;p&gt;テスト用のDockerネットワークを作成&lt;/p&gt;&#10;&lt;pre class="prism undefined-numbers lang-bash" data-lang="Bash"&gt;`docker network create test-network`&lt;/pre&gt;&#10;&lt;p&gt;MySQLコンテナを起動し、データを保存するためのVolumeを作成&lt;/p&gt;&#10;&lt;pre class="prism undefined-numbers lang-bash" data-lang="Bash"&gt;`docker run -d --name mysql-test \ --network test-network \ -e MYSQL_ROOT_PASSWORD=rootpassword \ -e MYSQL_DATABASE=testdb \ -v mysql-data:/var/lib/mysql \ mysql:latest`&lt;/pre&gt;&#10;&lt;h3 id="データの投入"&gt;データの投入&#10;&lt;/h3&gt;&lt;p&gt;MySQLコンテナに接続&lt;/p&gt;&#10;&lt;pre class="prism undefined-numbers lang-bash" data-lang="Bash"&gt;`docker exec -it mysql-test mysql -uroot -prootpassword`&lt;/pre&gt;&#10;&lt;p&gt;データベース内にテーブルを作成し、データを挿入。SELECTクエリの結果に、バックアップ時に挿入したデータ (id = 1, data = &amp;lsquo;backup test&amp;rsquo;) が表示されることを確認する。&lt;/p&gt;&#10;&lt;pre class="prism undefined-numbers lang-sql" data-lang="SQL"&gt;`USE testdb; CREATE TABLE test_table (id INT, data VARCHAR(100)); INSERT INTO test_table (id, data) VALUES (1, 'backup test'); SELECT * FROM test_table`&lt;/pre&gt;&#10;&lt;h3 id="バックアップの実行"&gt;バックアップの実行&#10;&lt;/h3&gt;&lt;pre class="prism undefined-numbers lang-bash" data-lang="Bash"&gt;`vackup export mysql-data mysql-data.tar.gz`&lt;/pre&gt;&#10;&lt;h3 id="コンテナとボリュームの削除"&gt;コンテナとボリュームの削除&#10;&lt;/h3&gt;&lt;pre class="prism undefined-numbers lang-bash" data-lang="Bash"&gt;`docker stop mysql-test docker rm mysql-test docker volume rm mysql-data`&lt;/pre&gt;&#10;&lt;h3 id="コンテナを再作成"&gt;コンテナを再作成&#10;&lt;/h3&gt;&lt;pre class="prism undefined-numbers lang-plain"&gt;`docker run -d --name mysql-test \ --network test-network \ -e MYSQL_ROOT_PASSWORD=rootpassword \ -e MYSQL_DATABASE=testdb \ -v mysql-data:/var/lib/mysql \ mysql:latest`&lt;/pre&gt;&#10;&lt;p&gt;MySQLコンテナに接続&lt;/p&gt;&#10;&lt;pre class="prism undefined-numbers lang-bash" data-lang="Bash"&gt;`docker exec -it mysql-test mysql -uroot -prootpassword`&lt;/pre&gt;&#10;&lt;p&gt;データが空であることを確認する。&lt;/p&gt;&#10;&lt;pre class="prism undefined-numbers lang-sql" data-lang="SQL"&gt;`USE testdb; SELECT * FROM test_table`&lt;/pre&gt;&#10;&lt;h3 id="復元"&gt;復元&#10;&lt;/h3&gt;&lt;p&gt;コンテナの停止。&lt;/p&gt;&#10;&lt;pre class="prism undefined-numbers lang-plain"&gt;`docker stop mysql-test`&lt;/pre&gt;&#10;&lt;p&gt;ボリュームの復元&lt;/p&gt;&#10;&lt;pre class="prism undefined-numbers lang-plain"&gt;`vackup import mysql-test.tar.gz mysql-test`&lt;/pre&gt;&#10;&lt;p&gt;MySQLコンテナを起動して接続&lt;/p&gt;&#10;&lt;pre class="prism undefined-numbers lang-bash" data-lang="Bash"&gt;`docker start mysql-test docker exec -it mysql-test mysql -uroot -prootpassword`&lt;/pre&gt;&#10;&lt;p&gt;データの確認。&lt;/p&gt;&#10;&lt;pre class="prism undefined-numbers lang-sql" data-lang="SQL"&gt;`USE testdb; SELECT * FROM test_table`&lt;/pre&gt;&#10;&lt;p&gt;SELECTクエリの結果に、バックアップ時に挿入したデータ (id = 1, data = &amp;lsquo;backup test&amp;rsquo;) が表示されることを確認する。&lt;/p&gt;&#10;&lt;p&gt;復元OK。&lt;/p&gt;&#10;&lt;p&gt;以上。&lt;/p&gt;&#10;</description></item><item><title>ConoHaのVPSを作成し、ssh用のユーザでログインまで</title><link>https://hack-le.com/vps-login/</link><pubDate>Fri, 09 Aug 2024 17:03:53 +0900</pubDate><guid>https://hack-le.com/vps-login/</guid><description>&lt;p&gt;なんか昔を思い出す感じの入門的な雑記記事。もうVPSなんか流行らないと思って去年解約したんだが、なんやかんやあってまたいじりたくなってきた。いっときはもう全部サーバレスでいいんじゃないのみたいな感じにもなっていたが、最近いろいろ思うところあり、遅ればせながら真面目にコンテナ使っていろいろやろうとしている。そうすると、24時間稼働するコンテナ用のマシンを、家の環境以外のもうちょっとまともなところで欲しくて、まぁRAM 2GBならちょっとしたコンテナは動くでしょう、ということでVPSを借りることにした。&lt;/p&gt;&#10;&lt;p&gt;それでまぁ、なんだかんだで安いし、俺たちのGMOグループのConoHaを再び契約したのだった。&lt;/p&gt;&#10;&lt;h2 id="vpsの作成"&gt;VPSの作成&#10;&lt;/h2&gt;&lt;p&gt;まぁVPSの作成はダッシュボードから言われるままにサーバーを追加すればいいだけであり、特に何も言うことはないのだが、いくつか「ん？」となったところもあったのでメモ。&lt;/p&gt;&#10;&lt;h3 id="イメージの選択"&gt;イメージの選択&#10;&lt;/h3&gt;&lt;p&gt;何にしようかなと思ったが、別に今更新しいディストリビューションを試したいという気持ちもあまりなかったので、Ubuntu 24.04のイメージを入れた。CentOS Streamは憚られた。Rocky Linuxとか興味ないでもなかったが、Dockerについてさほど知見があるわけでもないし、Ubuntuのほうが情報量が多かろうと思った。アプリケーションとしてDocker用のイメージもあったのだが、KASUGAIはともかくDockerは自分でインストールしたほうが後々の運用も考えると良さそうに思えたので、特に利用せず、素のUbuntuにした。&lt;/p&gt;&#10;&lt;p&gt;rootパスワードは忘れるとめんどくさいので忘れずメモ。Bitwardenのセキュアメモでしている。&lt;/p&gt;&#10;&lt;h3 id="鍵とセキュリティグループ"&gt;鍵とセキュリティグループ&#10;&lt;/h3&gt;&lt;p&gt;SSHの鍵については最初に登録できるようだ。この時、セキュリティグループをIPv4v6-SSHにするなどして、22番ポートを空けておくと、スムーズに使える（ポート番号を変えるならその限りではない）。自分はセキュリティグループの存在に気づかず、defaultにして作成したため、「入れないんだが？？？」としばらく右往左往した。いつの間にこんなAWSみたいな機構ができたんだろう。まぁ便利だと思うけどさ。&lt;/p&gt;&#10;&lt;p&gt;鍵を作成する場合は忘れずにダウンロードしておく。ダウンロードした鍵は ~/.ssh 以下に置き、パーミッションを忘れずに400にしておく。&lt;/p&gt;&#10;&lt;h2 id="rootログイン"&gt;rootログイン&#10;&lt;/h2&gt;&lt;p&gt;まぁ別にこれも取り立てて言うほどのことはないのだが、いくつか「ん？」となったところもあったので。&lt;/p&gt;&#10;&lt;h3 id="コンソールでログイン"&gt;コンソールでログイン&#10;&lt;/h3&gt;&lt;p&gt;いつのまにかWeb画面からコンソールでログインできるようになっていた。&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/2024/08/e392a0469e443b0afde9946fe9ed75ff-700x269.png"&gt;&lt;/p&gt;&#10;&lt;p&gt;SSHしなくてもログインできる手段があるのは心強い。ConoHaも進歩しているのだなぁと思ったのもつかの間、いじってみたところキーボードが全然きかなくて「クソぁ！」と思ったが、モードをVNCからシリアルに切り替えると、スムーズに動くようになった。VNCが全然使えなかったのは、Macだからとかあるのだろうか。&lt;/p&gt;&#10;&lt;h3 id="sshでログイン"&gt;SSHでログイン&#10;&lt;/h3&gt;&lt;p&gt;sshでのログイン方法については、普通通りなので特に言うことはない。一応当サイトでは10年以上前の若かりし頃に書いたなんか雑な記事がある。&lt;/p&gt;&#10;&lt;div class="blog-card-wrapper"&gt;&#10; &lt;a href="https://hack-le.com/20462465-2/" class="blog-card"&gt;&#10; &lt;div class="blog-card-content"&gt;&#10; &lt;div class="blog-card-label"&gt;&#10; &lt;svg xmlns="http://www.w3.org/2000/svg" width="13" height="13" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"&gt;&lt;path d="M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.71"&gt;&lt;/path&gt;&lt;path d="M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71"&gt;&lt;/path&gt;&lt;/svg&gt;&#10; &lt;span&gt;あわせて読みたい&lt;/span&gt;&#10; &lt;/div&gt;&#10; &lt;div class="blog-card-title"&gt;SSHで鍵認証を用いて、パスワードなしでログインする方法&lt;/div&gt;&#10; &lt;div class="blog-card-url"&gt;/20462465-2/&lt;/div&gt;&#10; &lt;/div&gt;&#10; &lt;div class="blog-card-thumbnail"&gt;&#10; &lt;img src="https://hack-le.com/images/uploads/2026/09/eyecatch_2553_1789270747.webp" alt="SSHで鍵認証を用いて、パスワードなしでログインする方法" 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;ul&gt;&#10;&lt;li&gt;秘密鍵を保持するディレクトリ（たいてい &lt;code&gt;~/.ssh&lt;/code&gt; ）のパーミッションは700&lt;/li&gt;&#10;&lt;li&gt;クライアント側は秘密鍵を400でもつ&lt;/li&gt;&#10;&lt;li&gt;サーバ側は公開鍵をauthorized_keysに登録する。パーミッションは600&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;p&gt;ConoHaのダッシュボードからIPアドレスを確認し、以下のコマンド。&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;ssh -i 秘密鍵のパス root@IPアドレス&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;入れないときはセキュリティグループを確認して、IN TCP 22番ポートが空いているか確認する。&lt;/p&gt;&#10;&lt;h2 id="ユーザの作成とか"&gt;ユーザの作成とか&#10;&lt;/h2&gt;&lt;p&gt;まぁいろいろ。&lt;/p&gt;&#10;&lt;h3 id="操作用のユーザを作成する"&gt;操作用のユーザを作成する&#10;&lt;/h3&gt;&lt;p&gt;とりあえずrootログインはあんまりなので、sudo権限もったユーザは作っておくことにする。プロンプトなしはrootだと思え（雑）。&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;adduser ユーザ名&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;usermod -aG sudo ユーザ名&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# ユーザ名でlogin&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;su - ユーザ名&#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;$ mkdir -p ~/.ssh&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ chmod &lt;span class="m"&gt;700&lt;/span&gt; ~/.ssh&#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; ~/.ssh&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ touch authorized_keys&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ chmod &lt;span class="m"&gt;600&lt;/span&gt; authorized_keys&#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;$ nano authorized_keys&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;authorized_keysに、公開鍵を追記する。ここらへんの操作の意味の詳述は上記の10年以上前の記事にだいたい書いてたはず。&lt;/p&gt;&#10;&lt;p&gt;以下を確認する。&lt;/p&gt;&#10;&lt;ul&gt;&#10;&lt;li&gt;作成したユーザでsshログインできる&lt;/li&gt;&#10;&lt;li&gt;sudoでコマンド実行できる&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;p&gt;まぁそのほか、rootのsshログインを禁止するとか、ポート番号を変更するとかは、やりたければやりたいようにすればいいかなと思う。&lt;/p&gt;&#10;&lt;h3 id="sshのrootログインを禁止"&gt;sshのrootログインを禁止&#10;&lt;/h3&gt;&lt;p&gt;まぁrootログイン禁止くらいはやっておくことにする。&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# 編集&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ sudo nano /etc/ssh/sshd_config&#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;# Ctrl-w で permitrootlogin を検索&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;# yesをnoにする&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;PermitRootLogin no&#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;# Ctrl-o で保存する&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;$ sudo systemctl restart ssh&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;この後、rootでログインできなくなったことを確認する。&lt;/p&gt;&#10;&lt;p&gt;なんかミスって誰もログインできなくなったら、Webのコンソールから修正すべし。&lt;/p&gt;&#10;&lt;h2 id="所感"&gt;所感&#10;&lt;/h2&gt;&lt;p&gt;最近サーバいじりしていなかったので、なんだか懐かしかった。サーバスペックの限界まで使い倒したい。&lt;/p&gt;&#10;</description></item><item><title>Calibreで特定の本棚を公開するだけのコンテンツサーバをコンテナ化</title><link>https://hack-le.com/calibre-docker/</link><pubDate>Thu, 16 May 2024 01:34:55 +0900</pubDate><guid>https://hack-le.com/calibre-docker/</guid><description>&lt;p&gt;pdfとかpptの資料管理としてCalibreを使っていて、コンテンツサーバを起動することでWebブラウザから本棚にアクセスできる。で、これを使って資料を共有すると便利だなと思ったのだが、普通にやるとプライベートの電子書籍を管理している本棚まで全部丸見えになってしまって困る。calibre-serverをCLIで起動すると特定の本棚のみ公開することも可能だが、calibre-serverは複数起動できないため、フツーにGUIアプリケーションとしてつかっているCalibreとは別に独立して動かす必要がある。&lt;/p&gt;&#10;&lt;p&gt;ということで、&lt;strong&gt;コンテンツサーバをやるだけのインスタンスをDockerで作る記事&lt;/strong&gt;。&lt;/p&gt;&#10;&lt;h2 id="環境"&gt;環境&#10;&lt;/h2&gt;&lt;p&gt;本記事は以下の環境で確認しました。&lt;/p&gt;&#10;&lt;ul&gt;&#10;&lt;li&gt;M2 Pro Mac mini&lt;/li&gt;&#10;&lt;li&gt;macOS 14.4.1&lt;/li&gt;&#10;&lt;li&gt;Docker Desktop 4.29.0&lt;/li&gt;&#10;&lt;li&gt;Calibre 7.10&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;p&gt;図にするほどでもないが、以下のような構成になる。&lt;/p&gt;&#10;&lt;pre class="mermaid" style="visibility:hidden"&gt;graph LR&#10;calibre(Calibre GUI)&#10;docker(Calibre Docker)&#10;ebooks(公開したいライブラリ)&#10;calibre --&gt; ebooks&#10;docker --&gt; ebooks&lt;/pre&gt;&lt;h2 id="手順"&gt;手順&#10;&lt;/h2&gt;&lt;p&gt;プロジェクトディレクトリは &lt;code&gt;~/ebooks-server&lt;/code&gt; とする。&lt;code&gt;config&lt;/code&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-javascript" data-lang="javascript"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;.&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="err"&gt;├──&lt;/span&gt; &lt;span class="nx"&gt;config&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="err"&gt;└──&lt;/span&gt; &lt;span class="nx"&gt;docker&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="nx"&gt;compose&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;yml&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h3 id="calibreの設定ファイルの準備"&gt;Calibreの設定ファイルの準備&#10;&lt;/h3&gt;&lt;p&gt;Calibreの設定ファイルを準備する。Calibreの元ソースからコピってくるのが楽。どこにあるかはChatGPTさん曰く以下。&lt;/p&gt;&#10;&lt;ul&gt;&#10;&lt;li&gt;&lt;strong&gt;Macの場合&lt;/strong&gt;： &lt;code&gt;~/Library/Preferences/calibre&lt;/code&gt;&lt;/li&gt;&#10;&lt;li&gt;&lt;strong&gt;Windowsの場合&lt;/strong&gt;： &lt;code&gt;%appdata%\calibre&lt;/code&gt;&lt;/li&gt;&#10;&lt;li&gt;&lt;strong&gt;Linuxの場合&lt;/strong&gt;： &lt;code&gt;~/.config/calibre&lt;/code&gt;&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;p&gt;僕が確認したのはMacだけ。Macでしか使ってないので。Macの場合は以下のようにコピーするとよい。&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-javascript" data-lang="javascript"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nx"&gt;mkdir&lt;/span&gt; &lt;span class="nx"&gt;config&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nx"&gt;cp&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="nx"&gt;r&lt;/span&gt; &lt;span class="o"&gt;~&lt;/span&gt;&lt;span class="err"&gt;/Library/Preferences/calibre/* config/&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h3 id="docker-composeymlの作成"&gt;docker-compose.ymlの作成&#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-dockerfile" data-lang="dockerfile"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;services:&lt;span class="err"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; calibre:&lt;span class="err"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; image: linuxserver/calibre&lt;span class="err"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; container_name: calibre-server&lt;span class="err"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; ports:&lt;span class="err"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; - 8081:8081&lt;span class="err"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; volumes:&lt;span class="err"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; - 設定ファイルのパス:/config&lt;span class="err"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; - 共有したいライブラリのパス:/books&lt;span class="err"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; command: /usr/bin/calibre-server --port &lt;span class="m"&gt;8081&lt;/span&gt; /books&lt;span class="err"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; restart: unless-stopped&lt;span class="err"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;設定ファイルのパスは上で作った &lt;code&gt;config&lt;/code&gt;です。ライブラリのパスは共有したいライブラリのフォルダをそのまま指定。ポートはなんとなくデフォルトの8080からずらして8081にしたけど別になんでもいい。ホストマシン側の公開ポートは空いていればなんでもいい。&lt;/p&gt;&#10;&lt;p&gt;&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="動作確認"&gt;動作確認&#10;&lt;/h3&gt;&lt;p&gt;http://localhost:8081 にアクセスして確認。共有したい本棚だけ見えたらOK。&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;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-dockerfile" data-lang="dockerfile"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;services:&lt;span class="err"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; calibre-1:&lt;span class="err"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; image: linuxserver/calibre&lt;span class="err"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; container_name: calibre-server-1&lt;span class="err"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; ports:&lt;span class="err"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; - 8081:8081&lt;span class="err"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; volumes:&lt;span class="err"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; - 設定ファイルのパス:/config&lt;span class="err"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; - 共有したいライブラリのパス-1:/books &lt;span class="c1"&gt;# 公開したいパス&lt;/span&gt;&lt;span class="err"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; command: /usr/bin/calibre-server --port &lt;span class="m"&gt;8081&lt;/span&gt; /books&lt;span class="err"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; restart: unless-stopped&lt;span class="err"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="err"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; calibre-2: &lt;span class="c1"&gt;# 名前を変える&lt;/span&gt;&lt;span class="err"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; image: linuxserver/calibre&lt;span class="err"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; container_name: calibre-server-2 &lt;span class="c1"&gt;# ここも買える&lt;/span&gt;&lt;span class="err"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; ports:&lt;span class="err"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; - 8082:8081 &lt;span class="c1"&gt;# ポート被らないようにする&lt;/span&gt;&lt;span class="err"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; volumes:&lt;span class="err"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; - 設定ファイルのパス:/config&lt;span class="err"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; - 共有したいライブラリのパス:/books &lt;span class="c1"&gt;# 公開したいパス&lt;/span&gt;&lt;span class="err"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; command: /usr/bin/calibre-server --port &lt;span class="m"&gt;8081&lt;/span&gt; /books&lt;span class="err"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; restart: unless-stopped&lt;span class="err"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;http://localhost:8081とhttp://localhost:8082でそれぞれ公開した本棚にアクセスできればOK。&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/calibre-cloudflare-tunnel/" class="blog-card"&gt;&#10; &lt;div class="blog-card-content"&gt;&#10; &lt;div class="blog-card-label"&gt;&#10; &lt;svg xmlns="http://www.w3.org/2000/svg" width="13" height="13" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"&gt;&lt;path d="M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.71"&gt;&lt;/path&gt;&lt;path d="M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71"&gt;&lt;/path&gt;&lt;/svg&gt;&#10; &lt;span&gt;あわせて読みたい&lt;/span&gt;&#10; &lt;/div&gt;&#10; &lt;div class="blog-card-title"&gt;Calibreの本棚(コンテンツサーバ)に外部からアクセスする環境を整えるメモ(Cloudflare Tunnel利用)&lt;/div&gt;&#10; &lt;div class="blog-card-url"&gt;/calibre-cloudflare-tunnel/&lt;/div&gt;&#10; &lt;/div&gt;&#10; &lt;div class="blog-card-thumbnail"&gt;&#10; &lt;img src="https://hack-le.com/images/uploads/2026/09/eyecatch_14279_1789096432.webp" alt="Calibreの本棚(コンテンツサーバ)に外部からアクセスする環境を整えるメモ(Cloudflare Tunnel利用)" loading="lazy" /&gt;&#10; &lt;/div&gt;&#10; &lt;/a&gt;&#10;&lt;/div&gt;&#10;&#10;&lt;p&gt;Calibreにもユーザアカウント管理機能あって、それ使えばパスワード保護もできるんだけれど、Calibreの設定もネットワークの設定も何かとつらいので、このCloudflare使ったやり方のほうがいいかなと思う。&lt;/p&gt;&#10;&lt;p&gt;以上。&lt;/p&gt;&#10;</description></item><item><title>Calibreの本棚(コンテンツサーバ)に外部からアクセスする環境を整えるメモ(Cloudflare Tunnel利用)</title><link>https://hack-le.com/calibre-cloudflare-tunnel/</link><pubDate>Tue, 14 May 2024 10:40:37 +0900</pubDate><guid>https://hack-le.com/calibre-cloudflare-tunnel/</guid><description>&lt;p&gt;Calibreのコンテンツサーバ機能はとても便利だ。Webブラウザから蔵書を検索できるのは利便性が高い。できればインターネット上からアクセスできると、外で本をダウンロードできるし、また本屋で「これ積んでるっけ？」と悩まなくて済む（読め）。&lt;/p&gt;&#10;&lt;p&gt;ということで、Calibreの本棚（コンテンツサーバ）をインターネット上に公開しつつ、自分以外はアクセスできない状態にしたい。前提条件として、Cloudflareでドメイン管理していること（Cloudflareのサービスを利用するので）。&lt;/p&gt;&#10;&lt;p&gt;Calibreの機能としてはユーザアカウントを管理してパスワード保護したうえで外部公開、みたいなのがドキュメントにあるのだけれど（&lt;a class="link" href="https://manual.calibre-ebook.com/ja/server.html" target="_blank" rel="noopener"&#10; &gt;calibre コンテンツサーバー — calibre 7.10.0 ドキュメント&lt;/a&gt;）、Cloudflare使うほうが簡単かつ安全かなと思う。&lt;/p&gt;&#10;&lt;h2 id="前提と環境"&gt;前提と環境&#10;&lt;/h2&gt;&lt;p&gt;前提&lt;/p&gt;&#10;&lt;ul&gt;&#10;&lt;li&gt;Cloudflareでドメインを管理している&#10;&lt;ul&gt;&#10;&lt;li&gt;ネームサーバもCloudflare&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;p&gt;ホストマシンはMacを使うが、WindowsでもLinuxでもできるはず。以下の環境。&lt;/p&gt;&#10;&lt;ul&gt;&#10;&lt;li&gt;M2 Pro Mac mini 2023&lt;/li&gt;&#10;&lt;li&gt;macOS 14.4.1&lt;/li&gt;&#10;&lt;li&gt;cloudflared 2024.4.1 (built 2024-04-22T22:16:50Z)&lt;/li&gt;&#10;&lt;li&gt;Calibre 7.10&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;p&gt;Cloudflare Tunnelを利用する。これは使うと簡単にNAT越えっぽいことができる。構成的には以下のような感じになる。&lt;/p&gt;&#10;&lt;pre class="mermaid" style="visibility:hidden"&gt;graph LR&#10;client(Client)&#10;cf(Cloudflare)&#10;subgraph Mac&#10;calibre(Calibre)&#10;cloudflared(cloudflared)&#10;end&#10;client --&gt;|books.example.com| cf&#10;cf --&gt;|tunnel| cloudflared&#10;cloudflared --&gt;|http://localhost:8080| calibre&lt;/pre&gt;&lt;p&gt;つまり books.example.com にアクセスすることで、localhostのコンテンツサーバにアクセスできるようにする。これだけ見ると全世界に本棚公開やんけとなるが、&lt;strong&gt;素晴らしいことにGUIで設定ポチポチするだけで、メールアドレスによる認証ができる&lt;/strong&gt;。&lt;/p&gt;&#10;&lt;p&gt;Cloudflareのサービスをめっちゃ使うので、Cloudflareでドメイン管理していることが前提条件となる。&lt;/p&gt;&#10;&lt;h2 id="手順のメモ"&gt;手順のメモ&#10;&lt;/h2&gt;&lt;p&gt;UIとかどうせ変わりそうだから、かなり雑に手順。まぁだいたいわかるでしょくらいの感じで。&lt;/p&gt;&#10;&lt;h3 id="calibreでコンテンツサーバを起動する"&gt;Calibreでコンテンツサーバを起動する&#10;&lt;/h3&gt;&lt;p&gt;まぁまずは言わずもがなだけれど、Calibreで「接続/共有」よりコンテンツサーバを起動する。デフォルトだとlocalhostの8080だろう。&lt;/p&gt;&#10;&lt;h3 id="cloudflareでトンネル作成する"&gt;Cloudflareでトンネル作成する&#10;&lt;/h3&gt;&lt;ol&gt;&#10;&lt;li&gt;Cloudflareのコンパネにログイン&lt;/li&gt;&#10;&lt;li&gt;Zero Trustを起動してNetworksのTunnelsよりトンネルを作成する&lt;/li&gt;&#10;&lt;li&gt;流れに沿って設定していく。トンネル名はなんかわかりやすいヤツを適当に。ホストマシンに &lt;code&gt;cloudflared&lt;/code&gt; をインストールしてトンネル開通&lt;/li&gt;&#10;&lt;/ol&gt;&#10;&lt;ul&gt;&#10;&lt;li&gt;Macの場合はhomebrewでインストールのうえ、 &lt;code&gt;/Library/LaunchDaemons/com.cloudflare.cloudflared.plist&lt;/code&gt; にplistファイルが作成される&#10;&lt;ul&gt;&#10;&lt;li&gt;エラーログは &lt;code&gt;/Library/Logs/com.cloudflare.cloudflared.err.log&lt;/code&gt; に出るのでなんかおかしかったら見るとよい&lt;/li&gt;&#10;&lt;li&gt;デーモンの起動や停止は &lt;code&gt;launchctl start(stop) com.cloudflare.cloudflared&lt;/code&gt; で。&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;/li&gt;&#10;&lt;li&gt;疎通したらダッシュボードにその旨が出るので確認&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;ol start="4"&gt;&#10;&lt;li&gt;Public Hostnameからpublic hostnameを追加する。サブドメイン適当に決める&lt;/li&gt;&#10;&lt;/ol&gt;&#10;&lt;ul&gt;&#10;&lt;li&gt;ここで決めたサブドメインはDNSのレコードにCNAMEで登録される&lt;/li&gt;&#10;&lt;li&gt;疎通先を http://localhost:8080 にする&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;p&gt;これで設定したドメインにアクセスするとCalibreのコンテンツサーバにアクセスできるようになる。&lt;/p&gt;&#10;&lt;h3 id="accessで認証入れる"&gt;Accessで認証入れる&#10;&lt;/h3&gt;&lt;p&gt;このままだと全世界に自分の本棚が公開されてしまい、著作権法上も大きな問題であるし、自分の尊厳も問題になると思われるため（本棚による）認証を入れる。&lt;/p&gt;&#10;&lt;ol&gt;&#10;&lt;li&gt;Zero TrustよりAccess -&amp;gt; ApplicationsよりApplicationを追加&lt;/li&gt;&#10;&lt;li&gt;Self-hosted&lt;/li&gt;&#10;&lt;li&gt;名前はなんかわかりやすいやつにする。ドメインは上で設定したドメインにしてNext&lt;/li&gt;&#10;&lt;li&gt;ポリシーの名前はなんか適当に決める&lt;/li&gt;&#10;&lt;li&gt;Configure Rulesはメールアドレスにして、許可するメールアドレスを指定してNext&lt;/li&gt;&#10;&lt;/ol&gt;&#10;&lt;ul&gt;&#10;&lt;li&gt;IPアドレスの指定とかもできる&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;ol start="6"&gt;&#10;&lt;li&gt;CORSとかCookieの設定ができるが特に何もせずAdd an application&lt;/li&gt;&#10;&lt;/ol&gt;&#10;&lt;ul&gt;&#10;&lt;li&gt;必要があればやる&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;p&gt;これで当該ドメインにアクセスするとメールアドレスの認証が求められる。メールアドレスを入力すると、6桁の一時パスが送られるのでそれを使ってログイン。とても便利。&lt;/p&gt;&#10;&lt;h2 id="応用-dockerでコンテンツサーバを別のインスタンスで起動する"&gt;応用: Dockerでコンテンツサーバを別のインスタンスで起動する&#10;&lt;/h2&gt;&lt;p&gt;Dockerでコンテンツサーバのコンテナを作ることにより、自動的にサーバ起動させるとか、特定の本棚のみ公開するとかも可能だ。なんでわざわざDockerを使うかというと、calibre-serverのインスタンスは同時に複数起動できないためだ。なのでコンテンツサーバ専用のコンテナを作成する感じ。&lt;/p&gt;&#10;&lt;p&gt;これによってGUIのCalibreの起動状況を確認しなくてよくなったり、pdfなどの資料の共有をしたり、共有時にプライベートのあらやだ奥さんみたいな本が間違って目に入るような事故を起こさずにすんだりなど、けっこう便利に使えるのだが、書き始めるとそれだけで記事になってしまうため割愛。気が向いたら記事にする。&lt;/p&gt;&#10;&lt;p&gt;（追記）記事にした。&lt;/p&gt;&#10;&lt;div class="blog-card-wrapper"&gt;&#10; &lt;a href="https://hack-le.com/calibre-docker/" class="blog-card"&gt;&#10; &lt;div class="blog-card-content"&gt;&#10; &lt;div class="blog-card-label"&gt;&#10; &lt;svg xmlns="http://www.w3.org/2000/svg" width="13" height="13" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"&gt;&lt;path d="M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.71"&gt;&lt;/path&gt;&lt;path d="M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71"&gt;&lt;/path&gt;&lt;/svg&gt;&#10; &lt;span&gt;あわせて読みたい&lt;/span&gt;&#10; &lt;/div&gt;&#10; &lt;div class="blog-card-title"&gt;Calibreで特定の本棚を公開するだけのコンテンツサーバをコンテナ化&lt;/div&gt;&#10; &lt;div class="blog-card-url"&gt;/calibre-docker/&lt;/div&gt;&#10; &lt;/div&gt;&#10; &lt;div class="blog-card-thumbnail"&gt;&#10; &lt;img src="https://hack-le.com/images/uploads/2026/09/eyecatch_14315_1789096498.webp" alt="Calibreで特定の本棚を公開するだけのコンテンツサーバをコンテナ化" loading="lazy" /&gt;&#10; &lt;/div&gt;&#10; &lt;/a&gt;&#10;&lt;/div&gt;&#10;&#10;&lt;h2 id="所感-自宅サーバ復活の予感"&gt;所感: 自宅サーバ復活の予感&#10;&lt;/h2&gt;&lt;p&gt;10年くらい前に自宅サーバは浪漫枠みたいな記事を書いた。&lt;/p&gt;&#10;&lt;p&gt;/45948138-2&#10;2015年の記事だと……&lt;/p&gt;&#10;&lt;p&gt;しかし、Cloudflare TunnelとDockerのおかげで、一時は浪漫枠になったかと思われた自宅サーバに復活の機運を感じる。今までネットワークの設定とかインフラのメンテナンスがめんどくさすぎ問題のために、自宅サーバなんかもうやってられませんわという感じだったのだが、Cloudflare Tunnelで極めて楽にネットワークが構築できるようになり、さらにDockerを使えばソフト面の構築・運用も楽々。&lt;/p&gt;&#10;&lt;p&gt;まぁもちろん可用性の確保とかスケーラビリティとか考え出すと自宅サーバはキツいのだが、逆に言うとそこらへん適当でいいなら自宅サーバで全然OK。&lt;/p&gt;&#10;&lt;p&gt;で、こういう大量のデータを扱うコンテンツサーバは自宅サーバ向きの一つ。さらに言うと、最近のクラウドは検閲めいたことも平気でやるので、プライベートなデータを置いておくには不安で仕方ない。垢BAN気にしなくていいのは精神的にだいぶ楽。あと最近はAIが出てきたのもある。グラボも回したりベクトルデータ扱えるElasticsearchみたいなリッチなサーバもほしくなるが、このへんはクラウドでやると余裕で破産できるので、オンプレミスにも価値が出てきた。&lt;/p&gt;&#10;&lt;p&gt;そんなわけで、自宅サーバもアリなんじゃないかと思うようになってきた今日この頃である。&lt;/p&gt;&#10;&lt;h2 id="参考記事"&gt;参考記事&#10;&lt;/h2&gt;&lt;p&gt;ありがとうございました。&lt;/p&gt;&#10;&lt;ul&gt;&#10;&lt;li&gt;&lt;a class="link" href="https://zenn.dev/yakumo/articles/b1f0e1115cb5b6" target="_blank" rel="noopener"&#10; &gt;Cloudflare Tunnelで自宅サーバーを公開する(FreeプランOK)&lt;/a&gt;&lt;/li&gt;&#10;&lt;li&gt;&lt;a class="link" href="https://blog.cloudflare.com/ja-jp/ridiculously-easy-to-use-tunnels-ja-jp/" target="_blank" rel="noopener"&#10; &gt;驚くほど簡単に使えるTunnel&lt;/a&gt;&lt;/li&gt;&#10;&lt;li&gt;&lt;a class="link" href="https://zenn.dev/takajun/articles/fbd783e459c722" target="_blank" rel="noopener"&#10; &gt;Cloudflare Tunnel を使って自宅をデータセンターみたいにする&lt;/a&gt;&lt;/li&gt;&#10;&lt;/ul&gt;&#10;</description></item><item><title>LAN内DropboxとはいかないQsyncの使いどころ</title><link>https://hack-le.com/dropbox-qsync/</link><pubDate>Thu, 23 Nov 2023 15:52:24 +0900</pubDate><guid>https://hack-le.com/dropbox-qsync/</guid><description>&lt;p&gt;Dropboxの有料会員なのに、QNAPのNAS、TS-233をポチってNASに移行できないかを試行錯誤している。QNAPはいくつかの便利なソフトウェアを提供しており、そのうちの一つがQsyncだ。これはNASとクライアントマシン間で同期フォルダを作成するもので、まぁ一言で言えば自前のDropboxをLAN内に作成するようなものと言える。&lt;/p&gt;&#10;&lt;p&gt;Qsyncは便利なソフトウェアなんだが、やはり同期というのは難しいようで、「Dropboxはすげぇんだなぁ」という再認識することもある。DropboxのヘビーユーザがQsyncに置き換えるのは厳しいと思う。一方でQsyncにも使いどころは確かにある。&lt;/p&gt;&#10;&lt;h2 id="qsyncを使っていて起きたこと"&gt;Qsyncを使っていて起きたこと&#10;&lt;/h2&gt;&lt;p&gt;Qsyncの機能を使い始めて1,2ヶ月程度だが、「TBクラスのフォルダの同期」「大量削除」「大量リネーム」「既にファイルがあるフォルダ同士で同期」など色々やったので、一通りのことは経験出来たのではなかろうかと思う。&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;。これはファイルのリネームなどでも「リネーム前のファイルが残っている」などが事象として発生した。多くはダウンロードしてすぐのファイルを操作した時なので、まぁ事情はわかる。とはいえDropboxではこういうことはほとんど起きないことでもある。&lt;/p&gt;&#10;&lt;p&gt;「クライアントアプリが（中途半端に）落ちていた」ということも頻発した。中途半端にというのは、フォルダの同期が完全に止まったわけではなくて、サーバ→クライアントのダウンロードはできているのに、クライアント→サーバのアップロードだけ止まっているような状態だった。&lt;/p&gt;&#10;&lt;p&gt;そのため気づきづらく、ツールバーにQsyncのアイコンがないことで「あれ、止まってる？」と思って気づいて再起動をかけるのだが、そうすると、落ちていた間にクライアント側で削除したファイルなどが大量復活することになる。この落ちる現象は、作業量に比例しているように思う。大量のファイルを頻繁に追加・削除・移動を繰り返していると起きやすいような。Mac上で起きたが、Windowsでも起きるのかどうかは（試していないので）わからない。&lt;/p&gt;&#10;&lt;p&gt;また、ファイルの重複判定もけっこうつらいところがあって、たとえばファイルがあるフォルダ同士で同期をかけるとカオスなことになるため、やめたほうがよい。たとえバックアップツールなどでバックアップしたフォルダであってもやめたほうがよい。最初の同期は、時間がかかっても片方のフォルダを空にしておくほうが無難だろう。&lt;/p&gt;&#10;&lt;p&gt;普通にしていても、「両方保管する」にしてしまうと知らない間にduplicateなファイルが出来ているので、NASかクライアントか、どちらかを真とする設定にしておいたほうが良い。ちなみに僕はクライアントを真としている（NAS側を直接操作することはない運用）。&lt;/p&gt;&#10;&lt;p&gt;問題は、こうした意図しない同期について、必ずしもユーザが気づけないことだ。たとえば階層の深いところで人知れず起きていた場合、それに気づくのは難しい。また、フォルダ構成が複雑であるほど期待しない挙動も多かったように感じている。&lt;/p&gt;&#10;&lt;p&gt;結論としては、 &lt;strong&gt;「階層の深いたフォルダの同期」や「頻繁に削除・リネームを実行するフォルダ」では使わないことにした&lt;/strong&gt;。つまり、Dropboxのようにまるまる2TBの同期フォルダ、という使い方はしない。&lt;/p&gt;&#10;&lt;h2 id="qsyncの使いどころ"&gt;Qsyncの使いどころ&#10;&lt;/h2&gt;&lt;p&gt;それではQsyncは使えないのかというとそんなことはなくて、実際僕は便利に使っている。前述の不安定要素を加味したうえで、「端末間でファイルをやりとりしたい」フォルダをピンポイントで同期すれば、なかなかうまくワークする。特に&lt;strong&gt;Dropboxフォルダの下という制約がないことによって、部分的にはDropbox超えの使い勝手の良さがある&lt;/strong&gt;。&lt;/p&gt;&#10;&lt;p&gt;具体的には、たとえば「ダウンロード」フォルダだ。&lt;strong&gt;ノートPCでダウンロードしたものをデスクトップPCでも開けるのはけっこう便利だ&lt;/strong&gt;。今まではこれを実現するために、Dropboxフォルダの直下にわざわざDownloadsフォルダを作っていたのだが、Qsyncによってシステムのダウンロードフォルダをそのまま同期フォルダとして指定できるようになり、便利になった。&lt;/p&gt;&#10;&lt;p&gt;こういった一時保管場所的なものだけではなく、&lt;strong&gt;アプリケーションの設定ファイルや素材置き場など、「頻繁ではないがたまに追加があって、変更があった時にはすぐにデバイス間で同期されてほしい」みたいなフォルダ&lt;/strong&gt;でも使っている。これも、Dropboxフォルダの下という制約がないのでやりやすくなった。&lt;/p&gt;&#10;&lt;h2 id="rsyncじゃダメなんですか"&gt;rsyncじゃダメなんですか&#10;&lt;/h2&gt;&lt;p&gt;そうしてピンポイントに同期フォルダを作成すると、残りのフォルダについては、必ずしも常に同期されていてほしいわけではないことに気づいた。ほとんどのフォルダは、1日に1回程度の同期でも十分だ。つまり、定期的にrsyncを動かすだけで十分だった。&lt;/p&gt;&#10;&lt;p&gt;Macとrsyncについては文字コードの正規化問題でかつては苦労させられたものだが、そんなことも今は昔だ。そのへんの話は下記の記事でも触れている。&lt;/p&gt;&#10;&lt;div class="blog-card-wrapper"&gt;&#10; &lt;a href="https://hack-le.com/qnap-nas/" 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;QNAPのNASを使ったバックアップとファイル同期&lt;/div&gt;&#10; &lt;div class="blog-card-url"&gt;/qnap-nas/&lt;/div&gt;&#10; &lt;/div&gt;&#10; &lt;div class="blog-card-thumbnail"&gt;&#10; &lt;img src="https://hack-le.com/images/uploads/2026/09/eyecatch_12127_1788944309.webp" alt="QNAPのNASを使ったバックアップとファイル同期" loading="lazy" /&gt;&#10; &lt;/div&gt;&#10; &lt;/a&gt;&#10;&lt;/div&gt;&#10;&#10;&lt;p&gt;上記の記事でも触れているが、Windowsだったら&lt;a class="link" href="https://freefilesync.org/" target="_blank" rel="noopener"&#10; &gt;FreeFileSync: Open Source File Synchronization &amp;amp; Backup Software&lt;/a&gt;が使いやすいかなと思う。&lt;/p&gt;&#10;&lt;h2 id="dropboxは有能だが"&gt;Dropboxは有能だが&#10;&lt;/h2&gt;&lt;p&gt;こうして使って見ると、何も考えずに快適に全ファイル同期できていたDropboxは本当にすごいなと思う。思えば昔はduplicateとかもよくあったが、最近はあまり見なくなった気がする。地味な進化を続けているのかなぁ。Macの文字コード正規化問題についてはDropboxは手当てしてくれていたし、痒いところに手が届く。&lt;/p&gt;&#10;&lt;p&gt;Dropboxの2TBの同期フォルダは、非常に強烈かつ優秀な機能であり、これをセールであれば3年契約月額1000円相当というのは、十分に価値があるものだと個人的には思う。&lt;/p&gt;&#10;&lt;p&gt;2TB以上の容量を求めると個人ではつらい感じもあるが、これは前述のとおり、「常に同期されていてほしいフォルダは実はそんなに多くない」ものである。ただまぁ、Dropbox下にファイルがなければならないという制約は、ソフトリンクを駆使してもまぁまぁ厳しいかもしれない。それだったらピンポイントに同期フォルダを作ることができるQsyncのほうが良かったりもするのかも。&lt;/p&gt;&#10;&lt;h2 id="qsyncは使える"&gt;Qsyncは使える&#10;&lt;/h2&gt;&lt;p&gt;まぁそんなわけで、NASについての記事なのにひたすらDropboxを褒め称えてしまっているのだが、そうは言ってもNASのほうが長期的にはコストが低いのは確かだし、また何よりも、 &lt;strong&gt;「クラウドにデータが上がらない」というのは、実際けっこう精神的な開放感があることに気づいた&lt;/strong&gt;。最近はどこのプラットフォームもビッグブラザーめいてきているからねぇ……。LAN内で完結させたほうがいいこともある。&lt;/p&gt;&#10;&lt;p&gt;まぁLAN内Dropboxだぜー、というわけにはいかないものの、自宅内に複数台のデバイスがあるユーザにとってはQsyncは十分使いどころのあるソフトウェアだと思った。というか、使っている。&lt;/p&gt;&#10;&lt;p&gt;ちなみにmyQNAPcloudのサービスを使えば楽にクラウド化できると思うが、まぁまぁ高いし（&lt;a class="link" href="https://software.qnap.com/myqnapcloud-storage.html?" target="_blank" rel="noopener"&#10; &gt;myQNAPcloud Storage&lt;/a&gt;）そもそもそれだったらDropbox使えばええやんと思う（5TBとか10TBやりたいなら価値あるかも）。自宅にVPNサーバとかたてたらいけるのかな。まぁ、外で同期したいと思うことが最近はないので、そこまで頑張る気もないや。&lt;/p&gt;&#10;</description></item><item><title>QNAPのNASを使ったバックアップとファイル同期</title><link>https://hack-le.com/qnap-nas/</link><pubDate>Sun, 05 Nov 2023 04:55:56 +0900</pubDate><guid>https://hack-le.com/qnap-nas/</guid><description>&lt;p&gt;最近DropboxからNASに移行しようとしている。具体的にはQNAPのTS-233を購入し、あれこれと運用方法を試行錯誤している。&lt;/p&gt;&#10;&lt;div class="blog-card-wrapper"&gt;&#10; &lt;a href="https://hack-le.com/dropbox-nas/" class="blog-card"&gt;&#10; &lt;div class="blog-card-content"&gt;&#10; &lt;div class="blog-card-label"&gt;&#10; &lt;svg xmlns="http://www.w3.org/2000/svg" width="13" height="13" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"&gt;&lt;path d="M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.71"&gt;&lt;/path&gt;&lt;path d="M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71"&gt;&lt;/path&gt;&lt;/svg&gt;&#10; &lt;span&gt;あわせて読みたい&lt;/span&gt;&#10; &lt;/div&gt;&#10; &lt;div class="blog-card-title"&gt;Dropboxから少しずつNASに移行中&lt;/div&gt;&#10; &lt;div class="blog-card-url"&gt;/dropbox-nas/&lt;/div&gt;&#10; &lt;/div&gt;&#10; &lt;div class="blog-card-thumbnail"&gt;&#10; &lt;img src="https://hack-le.com/images/uploads/2026/09/eyecatch_12083_1788944673.webp" alt="Dropboxから少しずつNASに移行中" loading="lazy" /&gt;&#10; &lt;/div&gt;&#10; &lt;/a&gt;&#10;&lt;/div&gt;&#10;&#10;&lt;h2 id="nasに期待する機能"&gt;NASに期待する機能&#10;&lt;/h2&gt;&lt;p&gt;僕のNASに求める機能は以下である。&lt;/p&gt;&#10;&lt;ul&gt;&#10;&lt;li&gt;デバイス間でのフォルダ同期&lt;/li&gt;&#10;&lt;li&gt;データのバックアップ&lt;/li&gt;&#10;&lt;li&gt;メディアサーバ&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;h3 id="デバイス間でのフォルダ同期-qsync"&gt;デバイス間でのフォルダ同期: Qsync&#10;&lt;/h3&gt;&lt;p&gt;デバイス間でのフォルダ同期とデータのバックアップを一挙に解決するものとして、&lt;strong&gt;Qsyncが期待された&lt;/strong&gt;。これは同期フォルダを作成して常にNASとクライアントのデータを一致させるものだ。まぁ一言で言うと自分専用のDropboxを作る機能といえる。&lt;/p&gt;&#10;&lt;p&gt;しかしこの同期というやつはやはり難しいもののようで、いざ運用してみるとなかなかうまくいかない。特にファイルが消えないようにするためか、移動や削除、ファイル名の変更をしていると、「消えているべきファイル」がゾンビのように復活する。まぁ安全面に倒すとそうなるのはわかるが、Dropboxの静かな有能さが際立つ結果となった。&lt;/p&gt;&#10;&lt;p&gt;まぁでも、これはそうなるかなという気はしていた。テラバイトクラスの巨大なデータフォルダを監視するようなものではあるまい。もしこれをやりたいのであれば、これを専業でずっとやってきたDropboxを大人しく使うのが良いと思う。&lt;/p&gt;&#10;&lt;p&gt;また、MacだとQsync クライアントがしばしば落ちている。ただこの落ちるというのも中途半端で、たとえば別デバイスで保存されたファイルの同期はされるのだが、Mac側での削除処理などがサーバに伝わっておらず、「あれ？クライアントアプリ落ちてるな」と思って再起動させると、落ちていた間に削除したファイルが次々と復活するなどかなり鬱陶しいことになる。&lt;/p&gt;&#10;&lt;p&gt;以上を踏まえたうえで、要所要所「ここは同期する価値がある」というフォルダについて適用するのが良い運用法だろう。Dropboxのように脳死でまるっと全部同期フォルダにしてしまう、などはやらないほうが無難だ。しかし、Dropboxと違って、色々な場所に散在するフォルダを同期フォルダにできるのはQsyncの強みといえよう。&lt;/p&gt;&#10;&lt;h3 id="データのバックアップ-rsync最強伝説-もう正規化問題はないんだ"&gt;データのバックアップ: rsync最強伝説 もう正規化問題はないんだ……&#10;&lt;/h3&gt;&lt;p&gt;NASの本懐というべきか、データのバックアップもNASに求められる重要な機能だ。Qsyncはバックアップツールに使うのはやめたほうがよさそうということがわかったので、何かいいツールを探す必要があった。真っ先に思うのはrsyncなのだけれど、今更rsyncとか使いたくないなぁと思い、FreeFIleSync（&lt;a class="link" href="https://freefilesync.org/download.php" target="_blank" rel="noopener"&#10; &gt;Download the Latest Version - FreeFileSync&lt;/a&gt;）というソフトを使ってみたりした。これはWindows用とMac用がそれぞれあり、けっこううまいこと使えた。&lt;/p&gt;&#10;&lt;p&gt;うまいこと使えたのだが、毎度起動するのが面倒である。ってかこれだったらrsync使うほうが楽なのでは？WindowsでWSL経由したら面倒だけれど、Macならフツーにターミナルから実行できる。&lt;/p&gt;&#10;&lt;p&gt;rsyncなら慣れてるし、何よりも&lt;strong&gt;我々を悩ませてきたUnicode正規化問題はAPFSになってから概ね片付いている&lt;/strong&gt;。というか多分&lt;strong&gt;僕がなんとなくrsync使いたくないなぁと思っていたの正規化のトラウマのせい&lt;/strong&gt;だと思う。傷深すぎんよ。&lt;/p&gt;&#10;&lt;p&gt;戦いの歴史貼っとく。&lt;/p&gt;&#10;&lt;p&gt;/30878779-2/&#10;2013-08-21&lt;/p&gt;&#10;&lt;p&gt;/46001270-2/&#10;2015-11-15&lt;/p&gt;&#10;&lt;p&gt;/gdrive-mac-win/&#10;2017-11-28&lt;/p&gt;&#10;&lt;p&gt;しかし今記事を読み返すと、SMBでマウントしてるのにssh使ってrsyncしてたりするの謎だなぁ。SMBのマウントが不安定で勝手に切れてたりしたからだろうか。&lt;/p&gt;&#10;&lt;p&gt;まぁなんでもいい、すべては終わったこと……。我々を悩ませた悪魔はもういない。存分にrsyncしていいんだ……。&lt;/p&gt;&#10;&lt;p&gt;ということで、結局rsyncに落ち着いている。WindowsだったらFreeFileSyncを使うほうが楽かも。&lt;/p&gt;&#10;&lt;p&gt;なおTimeMachineについてまったく書いていないが、過去色々と痛い目を見たので、ネットワーク越しでは使わない。NASじゃなくて、ローカルにケーブル接続して使うならいいと思う。でもそれはそれで面倒だし、システムごと復元したいことって実はそうないので、rsyncによるデータバックアップのほうが汎用性も高くて良いと思っている。&lt;/p&gt;&#10;&lt;p&gt;あとはまぁ、災害とかで全データ消失しちゃうリスクか。Dropboxだとこれの心配がないんだよなー。しかしそんな災害やら火事やら、データよりもっと心配すべきものがあるだろという話ではある。&lt;/p&gt;&#10;&lt;h3 id="メディアサーバ-検討中"&gt;メディアサーバ: 検討中&#10;&lt;/h3&gt;&lt;p&gt;最後にメディアサーバとしての役割だが、これはまだ検討中。&lt;/p&gt;&#10;&lt;p&gt;LAN内ではMacがメディアサーバとして役割を担っている。Mac mini常につけっぱなしだからね。コレは別にこのままでもいいかなぁという感じ。Macのほうがスペック的にも高いのだし。&lt;/p&gt;&#10;&lt;p&gt;インターネット経由だと、今はDropboxにアップロードしている音楽ファイルをストリーミングとかしているんだが、これをできないかなぁと思っている。QNAPのソフトウェアにこれができそうなのもあるので、もうちょっとちゃんと検討したい。&lt;/p&gt;&#10;&lt;h2 id="dropboxは便利だけれど自宅nasには自由さがある"&gt;Dropboxは便利だけれど、自宅NASには自由さがある&#10;&lt;/h2&gt;&lt;p&gt;色々やっていて思ったのは、Dropbox便利だなぁということだ。専門的な知識がなくても、ここまでにあげた機能はすべてカバーできる。ソースネクストから買える3年契約だったら定期的にセールしていて年間1万くらいだし、それくらいの価値はあるよなと思う。容量が2TBなのがつらいってことくらいか。あと円安で今後はどうなるかわからないな。&lt;/p&gt;&#10;&lt;p&gt;まぁでも、やっぱりNASには自由さがある。クラウド業者にデータを覗かれる心配がないし。&lt;strong&gt;GoogleとかMicrosoftとかで、家族の風呂写真あげてるだけでアカウントBANされたみたいな話聞くと、おいおい何してくれてんだビッグブラザー&lt;/strong&gt;って思う。ここらへんは同じように悩んでいる人がたくさんいる（参考: &lt;a class="link" href="https://riq0h.jp/2022/02/01/235506/" target="_blank" rel="noopener"&#10; &gt;機能的で検閲のないクラウドストレージ、ゼロ説 | 点と接線。&lt;/a&gt;）。&lt;/p&gt;&#10;&lt;p&gt;クラウド事業者がユーザのファイルをスキャンして、挙げ句「お前のデータはポリシー違反だ」として削除あまつさえBANするのは、ド直球の検閲だ。そんなビッグブラザーの運営サービス気持ち悪くて選ばれるわけないから、片手間にオンラインストレージサービスやってるGoogleやMicrosoftの傲慢がそうさせているんだろう。経済合理的にはそんな検閲して1ミリの得もないと思うが、GoogleにせよMicrosoftにせよ、なんかアレゲな連中にコア部分を乗っ取られている感あるなぁ。&lt;/p&gt;&#10;&lt;p&gt;しかし、専業のDropboxはそんなことでユーザが離れたら死活問題なので、しないんじゃないかな、多分。スキャンはしているらしいけど（&lt;a class="link" href="https://glass-lab.net/2023/09/28/%E3%82%AF%E3%83%A9%E3%82%A6%E3%83%89%E6%A4%9C%E9%96%B2%E5%95%8F%E9%A1%8C%E3%81%AB%E3%81%A4%E3%81%84%E3%81%A6/" target="_blank" rel="noopener"&#10; &gt;クラウド検閲問題について&lt;/a&gt;）、&lt;strong&gt;実際にBANされたって人は聞かない&lt;/strong&gt;。少なくとも僕は今まで無事です。調べても、Googleブラザーがバンバンしている検閲問題で一緒に名前が挙げられているという感じで、少なくともエロやらのせいでDropboxから永久追放されたという話は聞かない。サービス内容が地味でキラキラしてないし金も有り余っているわけではないため、アレゲな連中にまだ乗っ取られてないんじゃないか説。まぁこれは勝手な邪推だけど。&lt;/p&gt;&#10;&lt;p&gt;まーでも、今後はどうなるかわからんし、僕はこの機にアレなファイルは全部NASに移行した。別にアレなファイルじゃなくても、データがネットに流れないってのは、存外開放感があるものなんだな、と思った。ま、NASも悪くないな。Dropboxの契約2年くらい残ってるけど。&lt;/p&gt;&#10;&lt;pre&gt;&lt;code&gt;[![QNAP TS-233](https://m.media-amazon.com/images/W/MEDIAX_849526-T1/images/I/51SfanPiqSL._AC_SL1500_.jpg) ### QNAP TS-233](https://www.amazon.co.jp/dp/B09MZBK7C8?&amp;amp;linkCode=ll1&amp;amp;tag=hackle12-22&amp;amp;linkId=b19cb9b8c22a410729bc6a604f03b285&amp;amp;language=ja_JP&amp;amp;ref_=as_li_ss_tl)&#10;&amp;lt;!-- アフィリエイト開示文 --&amp;gt;&#10;&lt;/code&gt;&lt;/pre&gt;&#10;&lt;p&gt;このリンクを通じて購入すると、管理人にアフィリエイト収入が入ります。記事が役に立ったらクリックしてもらえると嬉しいです。&lt;/p&gt;&#10;</description></item><item><title>Dropboxから少しずつNASに移行中</title><link>https://hack-le.com/dropbox-nas/</link><pubDate>Sat, 30 Sep 2023 22:45:52 +0900</pubDate><guid>https://hack-le.com/dropbox-nas/</guid><description>&lt;iframe sandbox="allow-popups allow-scripts allow-modals allow-forms allow-same-origin" style="width:120px;height:240px;" marginwidth="0" marginheight="0" scrolling="no" frameborder="0" src="//rcm-fe.amazon-adsystem.com/e/cm?lt1=_blank&amp;bc1=000000&amp;IS2=1&amp;bg1=FFFFFF&amp;fc1=000000&amp;lc1=0000FF&amp;t=hackle12-22&amp;language=ja_JP&amp;o=9&amp;p=8&amp;l=as4&amp;m=amazon&amp;f=ifr&amp;ref=as_ss_li_til&amp;asins=B09MZBK7C8&amp;linkId=26d918947c7c492c0be7af584e399139"&gt;&lt;/iframe&gt;&#10;&lt;p&gt;最近の記事で、DropboxのためにMac mini 2018で外部ストレージを起動ディスクにしたんだみたいなことを書いた。が、実は7月にしれっとNASを買っており、それを使ってDropboxから移行しようと画策している。Dropbox自体は便利で良いサービスなのだけれど、macOSの新仕様のために、やたらと使いづらくなる未来が見えているためだ。Appleの方針は揺るがないだろうし、iCloud並に使いづらくされてしまう可能性もある。&#10;また、Dropbox側のものとしては、iPad ProでDropboxのアプリを使うとやたら落ちるという現象も残念であった（とはいえこれはクリティカルではない）。&lt;/p&gt;&#10;&lt;p&gt;ということで、Dropboxのライセンスはあと2年半近く残っている状況でなんだかもったいない気もしつつ、NASへの移行を少しずつ進めている。&lt;/p&gt;&#10;&lt;h2 id="nasを買った"&gt;NASを買った&#10;&lt;/h2&gt;&lt;p&gt;購入したNASはQNAPのTS-233だ。だいぶ前に、「NASは1ベイで十分」みたいな記事を書いたのに、結局2ベイNASを買った。&lt;/p&gt;&#10;&lt;div class="blog-card-wrapper"&gt;&#10; &lt;a href="https://hack-le.com/nas-1bay/" 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;家庭用なら1ベイNASで十分だ&lt;/div&gt;&#10; &lt;div class="blog-card-url"&gt;/nas-1bay/&lt;/div&gt;&#10; &lt;/div&gt;&#10; &lt;div class="blog-card-thumbnail"&gt;&#10; &lt;img src="https://hack-le.com/images/uploads/2026/09/eyecatch_8094_1789584642.webp" alt="家庭用なら1ベイNASで十分だ" loading="lazy" /&gt;&#10; &lt;/div&gt;&#10; &lt;/a&gt;&#10;&lt;/div&gt;&#10;&#10;&lt;p&gt;なんでかというと、1ベイNASはスペックが低いからだ。NASは気をつけないと、未だにメモリ512MBとか1GBのモデルが平然と売られているのだが、1ベイNASはまさにそんな感じ。しかも別に安くない。まぁ考えてみると、メーカー的には1ベイだろうが2ベイだろうが構成は大して変わらず、別に1ベイだから安くできるということもないのかもしれない。&lt;/p&gt;&#10;&lt;p&gt;大きさ的にも2ベイのサイズのほうが何かと余裕があるだろうし、コスト的にも2ベイNASがちょうどよかろうという感じだった。それにまぁ、また趣味的にRAID組みたいと思うことがあるかもしれないし。&lt;/p&gt;&#10;&lt;p&gt;で、このTS-233は値段がそれなりに熟れていてかつ、メモリも2GBだったので、Amazonのセールに合わせてポチった。&lt;/p&gt;&#10;&lt;h2 id="qsyncの実力"&gt;QSyncの実力&#10;&lt;/h2&gt;&lt;p&gt;QNAPが出しているソフトウェアの中に、QSyncというものがある。これはNASとPCの間に同期フォルダを作るもので、まぁいってしまえば自前でDropboxを作るようなものである。こういったソフトウェアを使うためにも、メモリは2GBほしかった。&lt;/p&gt;&#10;&lt;p&gt;これを使うと、下記のような構成が実現できる。&lt;/p&gt;&#10;&lt;pre class="mermaid" style="visibility:hidden"&gt;graph BT&#10;nas(NAS)&#10;mac(Mac mini 2018)&#10;win(Windows Desktop)&#10;win_n(Windows Laptop)&#10;mac nas&#10;win nas&#10;win_n nas&lt;/pre&gt;&lt;p&gt;考え方としては、NASは端末間のデータをやりとりするための中継地点であり、バックアップでもある。&lt;/p&gt;&#10;&lt;p&gt;情報がそんなにたくさんあるわけではないので、パフォーマンスや安定性は未知数。これはもう使ってみるしかないかな。僕はけっこう激しくファイルの追加・削除を繰り返す作業をすることもあるし、複数のPCで同じファイルを扱うこともあるし、特にMacはファイルシステムのせいで濁音問題がややこしいとかもあるが、大丈夫だろうかと心配がある。&lt;/p&gt;&#10;&lt;p&gt;ざっと使ってみた感じだと、ファイルの増減が緩やかならまず問題はなさそう。パフォーマンスも思ったより速い。Dropboxと遜色ないか、ちょっと上かも。また、ドライブをまたいで同期フォルダを設定できるなど、Dropboxにはない柔軟性は嬉しい。&lt;/p&gt;&#10;&lt;p&gt;一方で、同期中に大量のファイルの削除や更新をすると（数万ファイル、数十GBくらい）、ちょっと挙動が怪しい感じがする。同期が詰まる感じというか。削除したファイルが復活したり。また、TBクラスのフォルダを同期したときにちゃんと動くかちょっと不安。まーでも、同期の初動はちょっと注視しないといけなかったとしても、運用までいったら基本的には問題ないんじゃないかな？と思っている。&lt;/p&gt;&#10;&lt;h2 id="macからのsmb接続はやっぱり遅い"&gt;MacからのSMB接続はやっぱり遅い&#10;&lt;/h2&gt;&lt;p&gt;MacからのSMBによる接続はやっぱり遅い。まぁこれはもう諦めている。一応対応はあるんだけれど、これをしてもやっぱり遅いんだ。&lt;/p&gt;&#10;&lt;div class="blog-card-wrapper"&gt;&#10; &lt;a href="https://hack-le.com/rnas104smbup/" 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とReadyNAS 104の通信速度が遅い時の対処法(SMB)&lt;/div&gt;&#10; &lt;div class="blog-card-url"&gt;/rnas104smbup/&lt;/div&gt;&#10; &lt;/div&gt;&#10; &lt;div class="blog-card-thumbnail"&gt;&#10; &lt;img src="https://hack-le.com/images/uploads/2026/09/eyecatch_4148_1789563052.webp" alt="MacとReadyNAS 104の通信速度が遅い時の対処法(SMB)" loading="lazy" /&gt;&#10; &lt;/div&gt;&#10; &lt;/a&gt;&#10;&lt;/div&gt;&#10;&#10;&lt;p&gt;だからこそ、基本はローカルで操作する必要がある。そもそも外付けSSDにDropboxのファイルを退避していたのも、データでさえもSMB接続のパフォーマンスが普段使いだとちょっと使い物にならなかったからだし。&lt;/p&gt;&#10;&lt;p&gt;なので、QSyncのようなソフトが重要だ。これがちゃんと機能するならNASに移行できる。逆に使えないとけっこう困るんだが。まぁでも、前述したように、今のところは大丈夫そうだ。&lt;/p&gt;&#10;&lt;h2 id="dropboxは良いサービスです"&gt;Dropboxは良いサービスです&#10;&lt;/h2&gt;&lt;p&gt;他にも音楽ファイルをDropboxにあげているものからストリーミングしているとか、スマホで撮影した写真の共有手段に使っているとか、色々とやっていることもあるんだが、恐らくこれらもまぁ、問題ない程度に順次移行できるのではないかと思っている。一番の難所はやっぱりLANを超えた共有だろうなぁ。ここの解法は色々考えられるものの、なるべく手間がかからず便利なものを使いたい。自宅VPNはいやだVPNはいやだVPNはいやだ……。&lt;/p&gt;&#10;&lt;p&gt;とまぁ、諸般の事情で僕は脱Dropboxっぽい流れになってしまっているのだけれど、&lt;strong&gt;Dropbox自体は良いサービス&lt;/strong&gt;だと思います。Macの濁点問題を地味に解消していることを知った時は軽く感動したよ。あと、Google DriveやOneDriveみたいにアレげなファイルあげたらBANされたみたいな話も聞こえてこないし、本業オンラインストレージサービスとしての本気を感じる。っていうか画像スキャンしたあげくアカウントBANするとかどこのビッグブラザーだよって感じだけど、Big Techはやっちゃうんだよなぁ。&lt;/p&gt;&#10;&lt;p&gt;なので、脱Dropbox的な記事で言うのもなんだけれど、Dropbox自体は本当にオススメ。自宅が火事になっても安心（安心か？）。macOSがわけわからんことになってなければ、NASに移行しようなんて思わなかった。2年以上余っているライセンスももったいないし、これはこれで何か活用方法を考えたいところだ。&lt;/p&gt;&#10;</description></item><item><title>独自ドメインのWordPressを、カラフルボックスに移行して複数サイトを展開する</title><link>https://hack-le.com/blog-colorfulbox/</link><pubDate>Sun, 25 Jun 2023 17:33:26 +0900</pubDate><guid>https://hack-le.com/blog-colorfulbox/</guid><description>&lt;p&gt;僕はもう疲れたんだよ。。。VPSでWordPressの運用なんて、もう面倒くさいだけなんだ。そこに喜びはもはやない。postfixで喜んでメールを送っていた僕はもういないんだ。&lt;/p&gt;&#10;&lt;p&gt;ということで、VPSから脱却すべく、もう数年ばかり続けていたブログを有名レンサバの一つであるカラフルボックスに移行する。カラフルボックスには既に別サイトを展開しているが、同じ契約に同居させる。&lt;/p&gt;&#10;&lt;p&gt;なお、今回のターゲットはこのブログではない。が、うまくいったらこのブログも移行するつもりだ。そしてVPSは解約する。。。&lt;/p&gt;&#10;&lt;h2 id="環境前提"&gt;環境・前提&#10;&lt;/h2&gt;&lt;p&gt;以下の環境が前提である。&lt;/p&gt;&#10;&lt;ul&gt;&#10;&lt;li&gt;既にカラフルボックスでサーバーを契約してサイトを構築している。このサイトがプライマリドメインであり、ドメインAとする&lt;/li&gt;&#10;&lt;li&gt;VPS上で別のサイトを構築している。VPSのサイトのドメインをドメインBとする&#10;&lt;ul&gt;&#10;&lt;li&gt;ドメインBは外部で管理（今回はムームードメイン）&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;/li&gt;&#10;&lt;li&gt;VPS上のドメインBサイトを、カラフルボックスのドメインAと同じ契約のサーバーに同居させる&lt;/li&gt;&#10;&lt;li&gt;移行ツールはUpdraftPlusのプラグインを利用する&lt;/li&gt;&#10;&lt;li&gt;ホストマシンはMac&#10;&lt;ul&gt;&#10;&lt;li&gt;動作確認するときに /etc/hosts をいじる。MacかLinuxだと話が早い。Windowsのやり方は公式ドキュメントでフォローされていたのでそれで&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;ちなみにこの手順はある程度の時間、サイトの接続が不安定になるかもしれない。だいたい証明書のせい。おのれSSL。&lt;/p&gt;&#10;&lt;!--more--&gt;&#13;&#10;&lt;h2 id="プライマリドメインのゾーンからワイルドカードを削除する"&gt;プライマリドメインのゾーンからワイルドカードを削除する&#10;&lt;/h2&gt;&lt;p&gt;プライマリドメインはここではドメインAにあたる。恐らくカラフルボックスのデフォルト設定だと思うのだが、その場合ワイルドカードですべてのサブドメインにAレコードが割り当てられている可能性がある。&lt;/p&gt;&#10;&lt;p&gt;通常はこれでも困らないのだが、別のドメインBも登録する時、困ることがある。これはサービスの制約のために、ドメインBがドメインAのサブドメインになってしまう。まぁ普通はサブドメインになにがあるかなんて気にされないしわからないものではあるが、やはり気持ち悪いので、ワイルドカードのレコードがあるかを確認して、削除しておく。&lt;/p&gt;&#10;&lt;p&gt;もしサブドメインで使っているものがある場合は、そのドメインだけは通してのを忘れずに。。。&lt;/p&gt;&#10;&lt;h2 id="カラフルボックスでゾーンを作成する"&gt;カラフルボックスでゾーンを作成する&#10;&lt;/h2&gt;&lt;ol&gt;&#10;&lt;li&gt;サーバを確認する&lt;/li&gt;&#10;&lt;li&gt;サーバはcPanelの「サーバー情報」から確認可能&lt;/li&gt;&#10;&lt;li&gt;DNSの管理&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;/ol&gt;&#10;&lt;h2 id="cpanelでドメインの追加とアプリのインストール"&gt;cPanelでドメインの追加とアプリのインストール&#10;&lt;/h2&gt;&lt;ol&gt;&#10;&lt;li&gt;cPanelにログイン&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;当該ドメインでWordPressをインストール&lt;/li&gt;&#10;&lt;li&gt;ドキュメントルートのオプションだけ外す&lt;/li&gt;&#10;&lt;li&gt;管理者名とかパスワードは引き継ぐ&lt;/li&gt;&#10;&lt;/ol&gt;&#10;&lt;h2 id="動作確認する"&gt;動作確認する&#10;&lt;/h2&gt;&lt;p&gt;ここからがポイントだが、/etc/hostsでいったんローカルで名前解決して、移行と動作確認をしておく。&lt;/p&gt;&#10;&lt;h2 id="移行する"&gt;移行する&#10;&lt;/h2&gt;&lt;p&gt;移行手順は方法による。今回移行先がレンサバなのでシェルスクリプトでDBダンプして……とかはできない。プラグインで頑張る。今回はUpdraftPlusを使う。&lt;/p&gt;&#10;&lt;p&gt;UpdaraftPlusの使い方は「&lt;a class="link" href="https://4thsight.xyz/32279" target="_blank" rel="noopener"&#10; &gt;WordPressをプラグイン「UpdraftPlus」で移行する方法 | 4thsight.xyz&lt;/a&gt;」を参照する（丸投げ）。&lt;/p&gt;&#10;&lt;p&gt;まぁでもだいたいわかるじゃない。。。一つ付け加えるなら、プラグインから順番に一つずつ復元したほうが安全かなと思う。&lt;/p&gt;&#10;&lt;p&gt;元々のサイトが画像多めとかだと移行たいへんかも。200MB超えるとちょっと警告出てたな。&lt;/p&gt;&#10;&lt;p&gt;もしドメイン名が変更されている場合、データベースの復元でちゃんとReplaceまでしてくれる。有能。&lt;/p&gt;&#10;&lt;p&gt;動作確認してOKだったら次。&lt;/p&gt;&#10;&lt;h2 id="nsを変えるここで一時sslエラーが出る"&gt;NSを変える（ここで一時SSLエラーが出る）&#10;&lt;/h2&gt;&lt;p&gt;このセクションを実行すると、恐らくサイトに一時接続できない、というよりSSLエラーが出るはず。というのも、SSL証明書が新サーバーで適用されてないからやね。これについては、後述するSSL証明書の発行をあらかじめしておいて、cPanelから手動で適用することにより、回避できるかなと思う。&lt;/p&gt;&#10;&lt;p&gt;ただ今回はカラフルボックスで使える無料の証明書を使いたかった。なので、先にNSの向け先を変えて、証明書を発行できるようにしたい（そうしないとエラー出るはず、、、）。&lt;/p&gt;&#10;&lt;p&gt;NSの向け先を変えるやり方はレジストラに則る。まぁでも有名所は公式にあるよ。&lt;/p&gt;&#10;&lt;p&gt;&lt;a class="link" href="https://help.colorfulbox.jp/manual/ns-distinction/" target="_blank" rel="noopener"&#10; &gt;他社管理ドメインのネームサーバー変更方法 – ColorfulBox（カラフルボックス） サポートサイト&lt;/a&gt;&lt;/p&gt;&#10;&lt;h2 id="ssl証明書の発行"&gt;SSL証明書の発行&#10;&lt;/h2&gt;&lt;p&gt;これができたら無事引っ越し完了となるはず。&lt;/p&gt;&#10;&lt;ol&gt;&#10;&lt;li&gt;cPanelからSSL/TLS Statusにアクセス&lt;/li&gt;&#10;&lt;li&gt;当該ドメインについて、エラー起きてるか自己証明になっているはず&lt;/li&gt;&#10;&lt;li&gt;チェックを入れてAutoSSLを実行する&lt;/li&gt;&#10;&lt;li&gt;うまくいったらAutoSSL Domain Validatedになります。うまくいかなかったらしばらく待ってもう一回実行する&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;a class="link" href="https://help.colorfulbox.jp/manual/free-ssl-trouble/" target="_blank" rel="noopener"&#10; &gt;無料独自SSLにおいてSSL証明書が発行されない – ColorfulBox（カラフルボックス） サポートサイト&lt;/a&gt;」。&lt;/p&gt;&#10;&lt;p&gt;うまくいったらとりあえず引っ越し完了。元サイトはしばらく残しておいたほうが安全。お疲れ様でした。&lt;/p&gt;&#10;&lt;h2 id="参考リンク"&gt;参考リンク&#10;&lt;/h2&gt;&lt;ul&gt;&#10;&lt;li&gt;移行&#10;&lt;ul&gt;&#10;&lt;li&gt;&lt;a class="link" href="https://4thsight.xyz/32279" target="_blank" rel="noopener"&#10; &gt;WordPressをプラグイン「UpdraftPlus」で移行する方法 | 4thsight.xyz&lt;/a&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;a class="link" href="https://help.colorfulbox.jp/manual/wp-transfer/" target="_blank" rel="noopener"&#10; &gt;WordPressのサイトを他サーバーから移行する方法 – ColorfulBox（カラフルボックス） サポートサイト&lt;/a&gt;&lt;/li&gt;&#10;&lt;li&gt;&lt;a class="link" href="https://help.colorfulbox.jp/manual/ns-distinction/" target="_blank" rel="noopener"&#10; &gt;他社管理ドメインのネームサーバー変更方法 – ColorfulBox（カラフルボックス） サポートサイト&lt;/a&gt;&lt;/li&gt;&#10;&lt;li&gt;&lt;a class="link" href="https://help.colorfulbox.jp/manual/free-ssl-trouble/" target="_blank" rel="noopener"&#10; &gt;無料独自SSLにおいてSSL証明書が発行されない – ColorfulBox（カラフルボックス） サポートサイト&lt;/a&gt;&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;/li&gt;&#10;&lt;/ul&gt;</description></item><item><title>WordPressのためにPHPのバージョンを 7.1 -&gt; 7.4 に上げる(CentOS 7, nginx)</title><link>https://hack-le.com/php-71-74/</link><pubDate>Sun, 14 Jun 2020 17:43:36 +0900</pubDate><guid>https://hack-le.com/php-71-74/</guid><description>&lt;p&gt;当サイトはCentOS 7系のサーバー上のWordPressで動いている。で、「PHPのバージョンが古い」と怒られた。最後にPHPのバージョンを更新したのは「&lt;a class="link" href="https://hack-le.com/php54-71/" &gt;WordPress高速化のためCentOS 7でPHPを5.4-&amp;gt;7.1にアップデート(on ConoHaのVPS) – 或る阿呆の記&lt;/a&gt;」で3年ほど前のことだ。&lt;/p&gt;&#10;&lt;p&gt;ああ、そろそろ更新しないといけないか……と、重い腰を上げて更新することにした。&lt;/p&gt;&#10;&lt;h2 id="環境"&gt;環境&#10;&lt;/h2&gt;&lt;ul&gt;&#10;&lt;li&gt;ConoHaのVPS&lt;/li&gt;&#10;&lt;li&gt;CentOS Linux release 7.8.2003 (Core)&lt;/li&gt;&#10;&lt;li&gt;nginx version: nginx/1.16.1&lt;/li&gt;&#10;&lt;li&gt;PHP 7.1.4 (cli) (built: Apr 11 2017 19:36:58) ( NTS )&lt;/li&gt;&#10;&lt;li&gt;MariaDB 5.5.65&lt;/li&gt;&#10;&lt;li&gt;WordPress 5.4.2-ja&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;p&gt;なんていうか、そろそろ色々バージョンアップしたい。&lt;/p&gt;&#10;&lt;h2 id="やること"&gt;やること&#10;&lt;/h2&gt;&lt;p&gt;基本的には前回のアップグレード時の記事「&lt;a class="link" href="https://hack-le.com/php54-71/" &gt;WordPress高速化のためCentOS 7でPHPを5.4-&amp;gt;7.1にアップデート(on ConoHaのVPS) – 或る阿呆の記&lt;/a&gt;」と同じ流れ。なんでも記事は残しておくものだ。既にRemiを導入している点が異なる。&lt;/p&gt;&#10;&lt;ul&gt;&#10;&lt;li&gt;（既に導入済みなので本記事では省略）Remiの導入&lt;/li&gt;&#10;&lt;li&gt;WordPress関連サービスの停止&lt;/li&gt;&#10;&lt;li&gt;現行のPHPの削除&lt;/li&gt;&#10;&lt;li&gt;PHP7のインストール&lt;/li&gt;&#10;&lt;li&gt;WordPress関連サービスの起動&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-text" data-lang="text"&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;sudo systemctl stop mariadb.service&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;sudo systemctl stop php-fpm.service&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;sudo systemctl stop nginx.service&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;# 現在のPHPを削除&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;sudo yum remove php*&#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;# PHP7をインストール&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;sudo yum install --enablerepo=remi,remi-php74 php php-mbstring php-gd php-mysql php-pspell php-xml php-xmlrpc php-fpm&#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;# PHPのバージョン確認&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;php --version&#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;# PHP-FPMの再設定(nginx)&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;sudo sed -i &amp;#34;s/user = apache/user = nginx/&amp;#34; /etc/php-fpm.d/www.conf&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;sudo sed -i &amp;#34;s/group = apache/group = nginx/&amp;#34; /etc/php-fpm.d/www.conf&#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;# 関連サービスの起動と有効化&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;sudo systemctl start nginx.service&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;sudo systemctl start php-fpm.service&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;sudo systemctl start mariadb.service&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;sudo systemctl enable php-fpm.service&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&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-text" data-lang="text"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ php --version&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;PHP 7.4.7 (cli) (built: Jun 9 2020 10:57:17) ( NTS )&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;Copyright (c) The PHP Group&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;Zend Engine v3.4.0, Copyright (c) Zend Technologies&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;WordPressも問題なく動いている。人が少ない時を見計らったし、時間にして1分もかからなかったので、影響を受けた人はいないと思うが、どうかな。&lt;/p&gt;&#10;&lt;p&gt;そろそろブログをコンテナ化しようかなと思う今日この頃。&lt;/p&gt;</description></item><item><title>Grafana on EC2 で Let’s Encrypt 使ってSSL</title><link>https://hack-le.com/grafana-on-ec2-nginx-ssl/</link><pubDate>Wed, 13 May 2020 15:27:53 +0900</pubDate><guid>https://hack-le.com/grafana-on-ec2-nginx-ssl/</guid><description>&lt;p&gt;AWSでGrafana用のEC2インスタンスをたてている。AWSならば、ELB経由にすると、ELBにACMで発行した証明書を割り当てられて楽なのだが、今回は漢のEC21本立ちなので、Let&amp;rsquo;s Encrypt を使って発行することにした。&lt;/p&gt;&#10;&lt;p&gt;grafana-serverでcertbotコマンドがうまくいかなかったので、nginxのリバースプロキシ機能を使い、nginx経由にしている。&lt;/p&gt;&#10;&lt;h2 id="環境"&gt;環境&#10;&lt;/h2&gt;&lt;ul&gt;&#10;&lt;li&gt;AWS, EC2, Ubuntu 18.0.4, t2.micro&lt;/li&gt;&#10;&lt;li&gt;Grafana 6.7.2&lt;/li&gt;&#10;&lt;li&gt;nginx 1.14.0(ubuntu)&lt;/li&gt;&#10;&lt;li&gt;certbot 0.31.0&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;h2 id="やること"&gt;やること&#10;&lt;/h2&gt;&lt;p&gt;GrafanaのWeb UIにhttpsで入れるようにする。特にELBなど使わないので、証明書の発行はLet&amp;rsquo;s Encryptを使う。&lt;/p&gt;&#10;&lt;p&gt;(User) -&amp;gt; nginx -&amp;gt; grafana-server&lt;/p&gt;&#10;&lt;p&gt;というように、nginxのリバースプロキシ経由にする。なんでそんな面倒なことをするかというと、certbotでうまいこと証明書が発行できなかったからだ。&lt;/p&gt;&#10;&lt;p&gt;手順自体は、port=80をあけて「&lt;a class="link" href="https://blog.hackzenwerk.org/2019/05/13/setup-grafana-on-ubuntu-18-04-with-letsencrypt/" target="_blank" rel="noopener"&#10; &gt;Setup Grafana on Ubuntu 18.04 with LetsEncrypt – Hack‧zen‧werk&lt;/a&gt;」に則ってやればよさそうなのだが、うまくいかない。certbotを実行すると以下のようなエラーが出る。&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-text" data-lang="text"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;Problem binding to port 80: Could not bind to IPv4 or IPv6.&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;調べてみると下記のようになぜかgrafana-serverがIPv6になっている模様。&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-text" data-lang="text"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ sudo lsof -i:80&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;grafana-s 14168 grafana 6u IPv6 1972314 0t0 TCP *:http (LISTEN)&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;軽く調べるとなんだか非常にややこしそうだったので、それなら慣れたnginxを使ったほうがいいや、と。&lt;/p&gt;&#10;&lt;p&gt;ちなみに余談だが、root権限以外で1024以下のportを開けるときにはそのように明示してやる必要があるようで、「&lt;a class="link" href="https://grafana.com/docs/grafana/latest/installation/configuration/" target="_blank" rel="noopener"&#10; &gt;Configuration | Grafana Labs&lt;/a&gt;」によると以下のコマンドがいる。&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-text" data-lang="text"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ sudo setcap &amp;#39;cap_net_bind_service=+ep&amp;#39; /usr/sbin/grafana-server&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id="手順"&gt;手順&#10;&lt;/h2&gt;&lt;p&gt;手順については「&lt;a class="link" href="https://www.digitalocean.com/community/tutorials/how-to-install-and-secure-grafana-on-ubuntu-18-04#prerequisites" target="_blank" rel="noopener"&#10; &gt;How To Install and Secure Grafana on Ubuntu 18.04 | DigitalOcean&lt;/a&gt;」を参考にさせていただきました。&lt;/p&gt;&#10;&lt;p&gt;Grafanaについてはインストールしていて、DNSの設定も完了しているものとする。また、EC2のSGは80と443のTCPを開けておく。&lt;/p&gt;&#10;&lt;h3 id="nginxのインストール"&gt;nginxのインストール&#10;&lt;/h3&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-text" data-lang="text"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ sudo apt update&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ sudo apt install nginx&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ sudo systemctl enable nginx.service&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ systemctl status nginx.service&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;-&amp;gt; enabledになっていることを確認&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;ブラウザからドメインにアクセスして、nginxのデフォルト画面が表示されることを確認する。1サイトしか使わないので、これ以上の設定はここではしない。&lt;/p&gt;&#10;&lt;h3 id="証明書の発行"&gt;証明書の発行&#10;&lt;/h3&gt;&lt;p&gt;「&lt;a class="link" href="https://certbot.eff.org/lets-encrypt/ubuntubionic-nginx" target="_blank" rel="noopener"&#10; &gt;Certbot - Ubuntubionic Nginx&lt;/a&gt;」に基づいて、certbotを導入してドメイン証明書を発行する。&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-text" data-lang="text"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ sudo apt-get update&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ sudo apt-get install software-properties-common&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ sudo add-apt-repository universe&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ sudo add-apt-repository ppa:certbot/certbot&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ sudo apt-get update&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ sudo certbot --nginx&#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;-&amp;gt; Emailアドレスの入力&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;-&amp;gt; A (規約にAgree)&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;-&amp;gt; Y/N (メール飛ばしていいか）&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;-&amp;gt; 2 (httpきたらRedirectする)&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;ブラウザからhttpsでドメインにアクセスできるか確認する。httpにしたらhttpsに飛ばされるかも確認。&lt;/p&gt;&#10;&lt;p&gt;証明書の有効期限は90日と割と短いので、はcronなどで自動的に更新してやるとよい。なお更新コマンド。&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-text" data-lang="text"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ sudo certbot renew&#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;grafana-serverに飛ばす設定をする。&lt;/p&gt;&#10;&lt;p&gt;/etc/nginx/sites-avalable/default (ドメイン毎に設定ファイル作っているならそれ)より、SSLの時の server ブロックにある location ブロックを以下のように編集。try_filesをコメントアウトして、proxy_passを追加する。&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-text" data-lang="text"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;location / {&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; # First attempt to serve request as file, then&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; # as directory, then fall back to displaying a 404.&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; #try_files $uri $uri/ =404;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; proxy_pass http://localhost:3000;&#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;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;編集したら、文法チェックしてOKならreload。&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-text" data-lang="text"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ sudo nginx -t&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ sudo systemctl reload nginx.service&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;ブラウザからドメインに飛んで、Grafanaのダッシュボードに飛べたらOK。&lt;/p&gt;&#10;&lt;p&gt;以上。&lt;/p&gt;</description></item><item><title>WordPressのサイト(nginx)を同一サーバー上に複製する手順</title><link>https://hack-le.com/wp-copy/</link><pubDate>Wed, 27 Jun 2018 19:55:24 +0900</pubDate><guid>https://hack-le.com/wp-copy/</guid><description>&lt;p&gt;たとえばexample.comで展開しているWordPressのサイトについて、開発用にもう一つ、dev.example.comあたりで作りたいとする。Webサーバーはnginxとする。&lt;/p&gt;&#10;&lt;p&gt;以下に、その手順のメモ。&lt;/p&gt;&#10;&lt;h2 id="やること"&gt;やること&#10;&lt;/h2&gt;&lt;p&gt;冒頭に書いたとおり、Webサーバーnginxで、example.comに展開しているサイトを、開発用にdev.example.comに複製して展開したいとする。さらに、サイトは以下のような環境であるとする。&lt;/p&gt;&#10;&lt;ul&gt;&#10;&lt;li&gt;ドキュメントルートは/usr/share/nginx/html/example&lt;/li&gt;&#10;&lt;li&gt;nginxの設定ファイルは/etc/nginx/conf.d/example.conf&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;p&gt;開発用サイトについては、dev.example.comとする。また、環境を以下のようにする。&lt;/p&gt;&#10;&lt;ul&gt;&#10;&lt;li&gt;サーバーは元のサイトと同一&lt;/li&gt;&#10;&lt;li&gt;ドキュメントルートは /usr/share/nginx/html/dev&lt;/li&gt;&#10;&lt;li&gt;nginxの設定ファイルは/etc/nginx/conf.d/dev.conf&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;h2 id="手順"&gt;手順&#10;&lt;/h2&gt;&lt;p&gt;以下に、ざっくりと手順を書く。&lt;/p&gt;&#10;&lt;ol&gt;&#10;&lt;li&gt;開発用のドメインを取得し、DNSの設定を適切に行う&lt;/li&gt;&#10;&lt;li&gt;/etc/nginx/conf.d/example.confをベースにして、/etc/nginx/conf.d/dev.example.confを作成し編集する&lt;/li&gt;&#10;&lt;li&gt;server_nameを開発用ドメイン（ここではdev.example.com）にする&lt;/li&gt;&#10;&lt;li&gt;rootを開発用ドキュメントルート（ここでは/usr/share/nginx/conf.d/dev.conf）にする&lt;/li&gt;&#10;&lt;li&gt;開発用サイトのため、DBを複製する。ここではdev_wpdataとする&lt;/li&gt;&#10;&lt;li&gt;複製したDB（dev_wpdata）のうち、wp_optionsのsiteurlとhomeを、開発用サイトのURL（ここではdev.example.com）にする&lt;/li&gt;&#10;&lt;li&gt;開発用サイトのwp-config.phpでデータベース名と認証用ユニークキーを書き換える&lt;/li&gt;&#10;&lt;li&gt;nginxとphp-fpmの再起動&lt;/li&gt;&#10;&lt;/ol&gt;&#10;&lt;p&gt;これで終わり。定期的に同期するとか考え出すと面倒臭いかも。やるとすれば、ドキュメントルートのwp-config.php以外をsyncして、DBもsyncすれば良いだろう。&lt;/p&gt;&#10;&lt;p&gt;さて、個々の手順のやり方については詳述はしないが、次節にざっと注意事項をメモする。&lt;/p&gt;&#10;&lt;h2 id="手順の諸注意"&gt;手順の諸注意&#10;&lt;/h2&gt;&lt;p&gt;DBの複製はmysqldumpコマンドでもいいし、GUIのクライアントソフトなら全テーブルのSQLダンプ機能とかあると思うので、それを使って復元してもよい。&lt;/p&gt;&#10;&lt;p&gt;サイトURLの書き換えは、本来ならログインして管理画面から行うと良いのだけれど、ログインの時に元ドメインにぶっ飛ばされてしまうので、金庫の中の鍵状態。なので、直接DBを書き換える。UPDATE文でやってもよいし、GUIなクライアントソフトでお手軽に直接書き換えてしまってもよいだろう。&lt;/p&gt;&#10;&lt;p&gt;wp-config.phpの書き換えは忘れがち。&lt;/p&gt;&#10;&lt;p&gt;nginx、php-fpmの再起動は、CentOS 7とかsystemdなシステムならば以下。&lt;/p&gt;&#10;&lt;pre&gt;`sudo systemctl restart nginx.service&#13; sudo systemctl restart php-fpm.service`&lt;/pre&gt;&#13;&#10;&lt;p&gt;以上。&lt;/p&gt;</description></item><item><title>WordPress高速化のためCentOS 7でPHPを5.4-&gt;7.1にアップデート(on ConoHaのVPS)</title><link>https://hack-le.com/php54-71/</link><pubDate>Thu, 04 May 2017 22:52:57 +0900</pubDate><guid>https://hack-le.com/php54-71/</guid><description>&lt;p&gt;当サイトはConoHaのVPSで、用意されているCentOS 7のイメージをベースに、WordPressで構築している。CentOS 7では、標準のphpが5.4だが、今回高速と噂のphp7にバージョンアップさせた。GoogleのPageSpeed Insightsでサーバーの応答速度を見ると、確かに改善されたようだ。体感でも実感できる。作業のためにサーバーを止めた時間は1分程度じゃなかろうか。&lt;/p&gt;&#10;&lt;h2 id="環境"&gt;環境&#10;&lt;/h2&gt;&lt;p&gt;当サイトは以下の環境である。&lt;/p&gt;&#10;&lt;ul&gt;&#10;&lt;li&gt;ConoHaのVPS&lt;/li&gt;&#10;&lt;li&gt;CentOS 7.3&lt;/li&gt;&#10;&lt;li&gt;nginx 1.10.2&lt;/li&gt;&#10;&lt;li&gt;php 5.4.16&lt;/li&gt;&#10;&lt;li&gt;MariaDB 5.5&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;p&gt;何故かCentOS 7はphp 5.4.16でずっとメンテナンスされているらしい。MariaDBのバージョンも低い（WordPress 4.7の推奨はバージョン10以上）のが気になるが、今回は手を付けないことにする。&lt;/p&gt;&#10;&lt;h2 id="前準備"&gt;前準備&#10;&lt;/h2&gt;&lt;p&gt;あまり自分でソースをダウンロードしてコンパイルして…などと頑張りたくないので、できればyumコマンドでインストールしたい。Remiリポジトリを用いると、yumで簡便にインストールすることが可能であるようなので、それを利用する。そのためにはEPELリポジトリを使う必要があるが、ConoHaのCentOSイメージは最初からEPEL有効化されている仕様なので、ここでは触れない。Remi、EPELについては「&lt;a class="link" href="http://oki2a24.com/2012/03/13/what-is-rpmforge-remi-epel/" target="_blank" rel="noopener"&#10; &gt;yum が便利になる RPMforge、Remi、EPEL とは一体何なのか – oki2a24&lt;/a&gt;」の解説が詳しい。&lt;/p&gt;&#10;&lt;p&gt;以下のコマンドを実行。&lt;/p&gt;&#10;&lt;pre&gt;`sudo rpm -Uvh http://rpms.famillecollet.com/enterprise/remi-release-7.rpm&#13; yum --enablerepo=remi,remi-php71 info php&#13; `&lt;/pre&gt;&#13;&#10;&lt;p&gt;一応yum infoでバージョン7.1がインストールできることを確認。&lt;/p&gt;&#10;&lt;p&gt;あとは、使用しているプラグインや自分の書き加えたコードが、PHP7でも問題ないかであるが、これはもう環境によるとしか言えないのがつらいところだ。自分はあまりややこしいことはしていない（できない）し、使用しているプラグインもせいぜい10程度で、またサポートが続いているものを選んでいるので、まず問題なかろうと判断した。&lt;/p&gt;&#10;&lt;p&gt;前準備はこれだけ。&lt;/p&gt;&#10;&lt;h2 id="phpのアップデート作業"&gt;PHPのアップデート作業&#10;&lt;/h2&gt;&lt;p&gt;ここからアップデート作業に入る。やることは以下。&lt;/p&gt;&#10;&lt;ul&gt;&#10;&lt;li&gt;WordPress関連サービスの停止&lt;/li&gt;&#10;&lt;li&gt;現行のPHPの削除&lt;/li&gt;&#10;&lt;li&gt;PHP7のインストール&lt;/li&gt;&#10;&lt;li&gt;WordPress関連サービスの起動&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;p&gt;サーバーを止めて作業をすることになるので、できれば人の少ない時間を見計らって行いたい。トラブルが起きなければ停止時間は1分程度で済むが、トラブルが起きれば……。&lt;/p&gt;&#10;&lt;pre&gt;`# 関連サービスの停止&#13; sudo systemctl stop mariadb.service&#13; sudo systemctl stop php-fpm.service&#13; sudo systemctl stop nginx.service&#13; &#13; # 現在のPHPを削除&#13; sudo yum remove php*&#13; &#13; # PHP7をインストール&#13; sudo yum install --enablerepo=remi,remi-php71 php php-mbstring php-gd php-mysql php-pspell php-xml php-xmlrpc php-fpm&#13; &#13; # PHPのバージョン確認&#13; php --version&#13; &#13; # PHP-FPMの再設定(nginx)&#13; sudo sed -i "s/user = apache/user = nginx/" /etc/php-fpm.d/www.conf&#13; sudo sed -i "s/group = apache/group = nginx/" /etc/php-fpm.d/www.conf&#13; &#13; # 関連サービスの起動と有効化&#13; sudo systemctl start nginx.service&#13; sudo systemctl start php-fpm.service&#13; sudo systemctl start mariadb.service&#13; sudo systemctl enable php-fpm.service&#13; &#13; `&lt;/pre&gt;&#13;&#10;&lt;p&gt;PHP-FPMは設定し直しなことに注意。&lt;/p&gt;&#10;&lt;p&gt;サイトにアクセスして、問題なければOK。問題あったら……頑張ろう。自分の場合はPHP-FPMの設定を忘れていて、WordPressの操作をするユーザー名がapacheのままになっており、その関係でメディアのアップロードやプラグインのアップデートでエラーが出るようになった（WordPressを使っている人なら一度は見るだろう、FTP接続せよと促すアレである）。ただし、サーバーを停止した時間自体は恐らく1分ほど。サーバーが停止していたことに気づいた人はいなかったかもしれない。&lt;/p&gt;&#10;&lt;h2 id="高速化されたか"&gt;高速化されたか&#10;&lt;/h2&gt;&lt;p&gt;さて、PHP7にして当初の目的であった高速化は果たされたかであるが、これは驚くべきことに本当に速くなった。そういう触れ込みで、またそのような個人によるレポートも多くあり、だからこそ今回の作業を行ったのであるけれど、本当に快適になると驚いてしまう。&lt;/p&gt;&#10;&lt;p&gt;まず体感としてページの表示がキビキビとなされるようになったことがわかる。といっても体感でわかるのは平生からサイトにアクセスしている自分くらいであるから、参考程度に数値を出す。&lt;/p&gt;&#10;&lt;p&gt;「&lt;a class="link" href="https://developers.google.com/speed/pagespeed/insights/?hl=ja" target="_blank" rel="noopener"&#10; &gt;PageSpeed Insights&lt;/a&gt;」にて測ったところ、サーバーの応答速度が約0.5秒から約0.25秒にまで短縮された。&lt;/p&gt;&#10;&lt;p&gt;[caption id=&amp;ldquo;attachment_5328&amp;rdquo; align=&amp;ldquo;aligncenter&amp;rdquo; width=&amp;ldquo;488&amp;rdquo;]&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/2017/05/97020b5a39154b59959188920903e992.jpg"&gt;&lt;/p&gt;&#10;&lt;p&gt;約0.24秒[/caption]&lt;/p&gt;&#10;&lt;p&gt;この「サーバーの応答時間」は、サーバーの負荷の具合などによって左右されるので、指標としてはあまり当てになるものではないかもしれない。しかし、日付や時間を変えて何度か計測したところ、いずれも0.25秒前後であった。この数値はこれまで見られないものだったので、高速化が言えるように思う。&lt;/p&gt;&#10;&lt;p&gt;こんなにスムーズにいくなら、もっと早くやっておけばよかったかな。それは結果論か。満足のいく結果だった。&lt;/p&gt;</description></item><item><title>PiVPNでエラーが出たのでインストールしなおした</title><link>https://hack-le.com/pivpnerror/</link><pubDate>Thu, 20 Apr 2017 14:24:48 +0900</pubDate><guid>https://hack-le.com/pivpnerror/</guid><description>&lt;p&gt;自宅のRaspberry PiでOpenVPNサーバーをたてています（「&lt;a class="link" href="https://hack-le.com/rpiopenvpn/" &gt;Raspberry PiをOpenVPNサーバーにした…とても簡単で有難い&lt;/a&gt;」）。しかし先日、出先でいつものように自宅にアクセスしようとすると、エラーが出る。どうにもこうにもいかず、結局帰宅後にVPNサーバーのソフトウェアを再インストールすることになりました。&lt;/p&gt;&#10;&lt;h2 id="自宅にvpnサーバー"&gt;自宅にVPNサーバー&#10;&lt;/h2&gt;&lt;p&gt;私の現在の生活はどうにも流動的で、半年ほど前は在宅での仕事が多かったのですが、最近は平日ほぼ家にいません。それで、外泊時に私の心の憩いとなるのは、自宅のNASにある膨大なライブラリです。タブレットなどを使うと、SSHは何かと敷居が高いですが、VPN+sambaであれば、これは簡単ですから、自宅にVPNサーバーをたてると、なにかと便利なわけです。&lt;/p&gt;&#10;&lt;p&gt;VPNにも色々ありますが、私はRaspberry PiでOpenVPNサーバーを構築しています。というのも、PiVPN（本家サイト「&lt;a class="link" href="http://www.pivpn.io/" target="_blank" rel="noopener"&#10; &gt;PiVPN: Simplest setup of OpenVPN&lt;/a&gt;」）なる、Raspberry Piで使えるとても便利なインストールソフトウェアを開発してくれている人がいるもので、これを使うと本当に簡単にOpenVPNサーバーを構築できるからです（「&lt;a class="link" href="https://hack-le.com/rpiopenvpn/" &gt;Raspberry PiをOpenVPNサーバーにした…とても簡単で有難い&lt;/a&gt;」）。&lt;/p&gt;&#10;&lt;h2 id="停電復旧後エラーが発生するように"&gt;停電復旧後、エラーが発生するように&#10;&lt;/h2&gt;&lt;p&gt;一度構築した後は、ずっと安定して動いてくれていました。が、先日外出中に自宅で停電があり、復旧後にVPNでアクセスしようと試みたところ、うまくいかない。試しにSSHをしてみると、これはうまくいく。つまり通信自体は出来るらしい。それで、プロセスが起動しているか確認すると、それは問題ない。そしてログを確認するも、特にエラー情報などは残っていない。うーん。&lt;/p&gt;&#10;&lt;p&gt;あれこれしてもどうにもならず、結局帰宅していじる羽目になったのですが、その後も難航しました。&lt;/p&gt;&#10;&lt;p&gt;不可解だったのは、ルータのOpenVPN用にあけていたポートが閉じていたことです。そうなるとアクセスできないのは当然ですが、停電でルータの設定が変わったというのも考えづらく、謎です。もっとも、ポートを開けた後もやはり外部から接続することができない状況だったので、ソフトウェア的な問題があったことも確かだろうと思います。しかしエラーログは残っていない。これもまた謎です。うーんうーん。&lt;/p&gt;&#10;&lt;h2 id="pivpnの再インストールで解決"&gt;PiVPNの再インストールで解決&#10;&lt;/h2&gt;&lt;p&gt;もうよくわからないので、とにかくPiVPNの再インストールを試みることにしました。PiVPNはインストールが簡単ならばアンインストールも簡単で、再インストールは実にスムーズに出来ました。そして、また外部から接続できるようになったので、ひとまず解決です。しかし、エラーの原因はわからず仕舞いとなってしまいました。&lt;/p&gt;</description></item><item><title>Raspberry PiをOpenVPNサーバーにした…とても簡単で有難い</title><link>https://hack-le.com/rpiopenvpn/</link><pubDate>Mon, 13 Mar 2017 15:44:47 +0900</pubDate><guid>https://hack-le.com/rpiopenvpn/</guid><description>&lt;p&gt;最近宿泊が多いのと、海外出張があるかもしれないなということで、自宅の回線にVPN接続したいと思いました。家で使用しているTP-LinkのルータArcher C3150がOpenVPNサーバー機能を持っているので、これを利用しようと思ったのですが、うまくいかず、仕方なしにRaspberry Piで実装を試みたところ、有志のソフトウェアのおかげで、これが非常に簡単にできました。とても有難い。&lt;/p&gt;&#10;&lt;h2 id="外部から自宅の回線に繋ぎたい"&gt;外部から自宅の回線に繋ぎたい&#10;&lt;/h2&gt;&lt;p&gt;最近、家にいないことが多いです。私は多くのファイルを家のNASに置いているので、アクセスできないとちょっと不便。sshで接続すればいいんですけれど、PCならともかくタブレットやスマートフォンからとなると、sshはちょっと扱いづらい。また、もしかするとそろそろ海外出張あるかもよということで、そうするとちょっとハマってしまったソシャゲなど、日本国外のサーバーからのアクセスって弾かれたりしないかしら、などという不安もあり、それらを一挙に解決すべく、&lt;strong&gt;外部から自宅の回線を使いたいものだなぁ&lt;/strong&gt;という欲求が高まってきました。&lt;/p&gt;&#10;&lt;h2 id="vpnの検討"&gt;VPNの検討&#10;&lt;/h2&gt;&lt;p&gt;となるとVPN(Virtual Private Network)ですが、私はこれまでVPNを使ったことがないので、まずどんな実装があるのか、から調べなくてはいけませんでした。&lt;/p&gt;&#10;&lt;h3 id="vpnの実装"&gt;VPNの実装&#10;&lt;/h3&gt;&lt;p&gt;メジャーなものとしては、PPTP、L2TP/IPSec、OpenVPNといったプロトコルがあるようです。「&lt;a class="link" href="https://jp.giganews.com/vyprvpn/compare-vpn-protocols.html" target="_blank" rel="noopener"&#10; &gt;VPNプロトコル比較表 PPTP vs L2TP vs OpenVPN ™ vs Chameleon ™ | VyprVPN&lt;/a&gt;」や「&lt;a class="link" href="https://www.howtogeek.com/211329/which-is-the-best-vpn-protocol-pptp-vs.-openvpn-vs.-l2tpipsec-vs.-sstp/" target="_blank" rel="noopener"&#10; &gt;Which is the Best VPN Protocol? PPTP vs. OpenVPN vs. L2TP/IPsec vs. SSTP&lt;/a&gt;」あたりの記事を見るに、ざっくりまとめると以下のような感じでしょうか。&lt;/p&gt;&#10;&lt;ul&gt;&#10;&lt;li&gt;PPTP…昔からあるので色々なOSで標準で使えるけれど、脆弱性もあるから使わんほうがいいよ&lt;/li&gt;&#10;&lt;li&gt;L2TP/IPSec…L2TPがトンネリング、IPSecが暗号化だよ。セキュアで対応しているOSも多いよ。でも重いよ。&lt;/li&gt;&#10;&lt;li&gt;OpenVPN…セキュアで効率的だよ。でもOS標準で使えないから、サードパーティのアプリを入れないといけないよ。&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;p&gt;一長一短という感じです。だいたいは、OpenVPNが推奨されているようです。&lt;/p&gt;&#10;&lt;h3 id="l2tpipsecはどうか"&gt;L2TP/IPSecはどうか&#10;&lt;/h3&gt;&lt;p&gt;セキュリティのことを考えるとL2TP/IPSecかOpenVPNでしょうか。OpenVPNが推奨されているものの、最初は、OS標準で対応しているL2TP/IPSecに惹かれて、それが使えるか調べてみました。&lt;/p&gt;&#10;&lt;p&gt;うちはeo光なので、多機能ルータRT100の使用を強制されます。このルータの設定で、VPN関連のものがあった気がする、と思って見てみると、果たして&lt;strong&gt;VPNパススルー&lt;/strong&gt;というものがありました（「&lt;a class="link" href="http://support.eonet.jp/connect/net/multi_bbr/eo-rt100/fun/vpn.html" target="_blank" rel="noopener"&#10; &gt;VPNパススルー機能【eo光多機能ルーター（eoRT100）】｜eoユーザーサポート&lt;/a&gt;」）。&lt;/p&gt;&#10;&lt;p&gt;しかしVPNパススルーって何かなと思ったら、&lt;strong&gt;これは単にVPNプロトコルを通しますよというだけで、別にサーバー機能があるわけじゃない&lt;/strong&gt;んですね。ははぁ、つまりホームネットワーク内部に別途L2TPサーバーをたてて、あれこれせなあかんのかー……となると、これは中々面倒です。&lt;/p&gt;&#10;&lt;h3 id="openvpnはどうか"&gt;OpenVPNはどうか&#10;&lt;/h3&gt;&lt;p&gt;もうひとつ、私が無線LANを飛ばすのに使っているTP-Linkのルータ、Archer C3150、これはどうかなと思って仕様を見ると、OpenVPNサーバーの機能を持っています。さすがそこそこいいお値段するだけあります（市場価格2万円くらい）。ふむふむ。&lt;/p&gt;&#10;&lt;p&gt;OpenVPNは、確かに各機器にクライアントソフトを入れなくてはいけませんが、&lt;strong&gt;私が主に使いたいiOSとAndroidについては、OpenVPNクライアントアプリが公式のもので簡単に導入できそうな感じ（実際、簡単でした）&lt;/strong&gt; 。やはり一番の鬼門はサーバーの構築で、それがボタンひとつでできるのであれば、これを使わない手はあるまい。&lt;/p&gt;&#10;&lt;p&gt;そう思って、いざ実行してみたのですが……サーバーの有効化と証明書の生成まではうまくいくものの、その証明書をローカルにエクスポートするところで止まってしまいます。うーん。TP-Linkのサポートに連絡して、やりとりしたところ、&lt;strong&gt;ブリッジモードにしていることが原因だ&lt;/strong&gt;とのこと。なるほど。しかしeo光なので、ルータは指定の多機能ルータを使わざるを得ません。多機能ルータのルータ機能を無効化することもできますが、そうすると今度は電話の子機が使えなくなってしまう…残念。&lt;/p&gt;&#10;&lt;p&gt;どうしたものかなぁなどと考えていたところに目についたのが、例によってRaspberry Pi。面倒臭そうだけれど、一つやってみるかなと重い腰を上げました。&lt;/p&gt;&#10;&lt;h2 id="raspberry-piでopenvpnサーバーの構築"&gt;Raspberry PiでOpenVPNサーバーの構築&#10;&lt;/h2&gt;&lt;p&gt;以下、やり方の詳細については触れませんが、参考にした記事を適宜紹介します。&lt;/p&gt;&#10;&lt;p&gt;最初「&lt;a class="link" href="http://qiita.com/oi1man/items/abe3c5ef2113ec3e91f1" target="_blank" rel="noopener"&#10; &gt;RaspberryPiにOpenVPNサーバを立てる - Qiita&lt;/a&gt;」の記事を参考に、コマンドラインからインストールして構築しようと思いましたが、どうやら記事の頃と現在でディレクトリ構成が変わっているらしく、そのままではできない様子。やはり色々調べないとダメかな……と思っていたのですが、もう少し調べると、「&lt;a class="link" href="https://www.webprofessional.jp/setting-up-a-home-vpn-using-your-raspberry-pi/" target="_blank" rel="noopener"&#10; &gt;Raspberry Piで安く手軽に自宅用VPNサーバーを作る方法 - WPJ&lt;/a&gt;」や「&lt;a class="link" href="http://kamilslab.com/2017/01/22/how-to-turn-your-raspberry-pi-into-a-home-vpn-server-using-pivpn/" target="_blank" rel="noopener"&#10; &gt;How to turn your Raspberry Pi into a Home VPN Server using PiVPN – Kamil&amp;rsquo;s Lab&lt;/a&gt;」によれば、PiVPNなるRaspberry Pi用のインストーラーを作っている方がいて、それを使えば簡単に構築できる、と。&lt;/p&gt;&#10;&lt;p&gt;GitHubにソースコードがあり（「&lt;a class="link" href="https://github.com/pivpn/pivpn" target="_blank" rel="noopener"&#10; &gt;GitHub - pivpn/pivpn: Simple OpenVPN installer, designed for raspberry pi.&lt;/a&gt;」）、今も更新されているようなので、物は試しと、Installationにしたがってやってみました。すると、&lt;strong&gt;画面の指示にしたがうだけで、すんなりとインストールできてしまいました&lt;/strong&gt;。あまりに簡単で拍子抜けしたほどです（但、前提として、Raspberry Piへの静的IPアドレスの割当、固定グローバルIPまたはDDNSの利用、ルータのポートフォワーディング設定があります。これらについては別途理解し、設定をする必要があります）。&lt;/p&gt;&#10;&lt;p&gt;reboot後、pivpn addコマンドを実行すると、ユーザー名とパスフレーズを指定するだけで、設定ファイルの.ovpnファイルが作成されます。後はそれを各デバイスに転送して、デバイスのOSに対応した公式のクライアントアプリでその設定ファイルをインポートするだけ（参考「&lt;a class="link" href="https://faq.interlink.or.jp/faq2/View/wcDisplayContent.aspx?id=303" target="_blank" rel="noopener"&#10; &gt;AndroidのOpenVPN接続設定 ■セカイVPN■&lt;/a&gt;」参照）。&lt;/p&gt;&#10;&lt;p&gt;無事、Android端末とiOS端末で、ケータイ回線やWiMAX回線から、自宅のNASにアクセスしたり、自宅のIPアドレスでインターネットを楽しむことができました。さすがに回線速度については、NASで電子書籍のストリーミングなどすると、多少の遅さを感じますけれど、許容範囲です。問題ありません。&lt;/p&gt;&#10;&lt;h2 id="raspberry-piがインフラ化"&gt;Raspberry Piがインフラ化&#10;&lt;/h2&gt;&lt;p&gt;今までも、Raspberry PiはSSHの踏み台だったり、バックアップサーバーだったりと活躍していましたが、これでまた一つ、大切な役割が増えました。&lt;strong&gt;いまやすっかり我が家のインフラ&lt;/strong&gt;です。&lt;/p&gt;&#10;&lt;p&gt;[caption id=&amp;ldquo;attachment_5000&amp;rdquo; align=&amp;ldquo;aligncenter&amp;rdquo; width=&amp;ldquo;323&amp;rdquo;]&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/2017/03/1f83a8705f0edcb9102a3cc1545aa8c1.jpg"&gt;&lt;/p&gt;&#10;&lt;p&gt;なにかゴチャゴチャしている図[/caption]&lt;/p&gt;&#10;&lt;p&gt;eo光の多機能ルータの隣にRaspberry Piを無駄に2台、TP-Linkルータの上に鎮座させています。何も考えていないことがよくわかるゴチャゴチャした配置ですが、もうずっと安定して働いてくれています。コンピュータは働き者です。&lt;/p&gt;&#10;&lt;p&gt;特にRaspberyy Piは省電力なので、常時起動どんと来いです。5000円の汎用マシンであるRaspberry Piが、これだけ安定して、かつうまく動くのは素晴らしいと思います。色々な人の努力あってこそと思うと、感慨深い。有難いことです。&lt;/p&gt;</description></item><item><title>CentOS 7でSSHのログをpostfix + Gmailで送るまで</title><link>https://hack-le.com/centos7postfix/</link><pubDate>Tue, 06 Dec 2016 12:19:08 +0900</pubDate><guid>https://hack-le.com/centos7postfix/</guid><description>&lt;p&gt;CentOS 7で、ログを解析してメールを任意のアドレスに送ります。ここでは仮にSSHの接続成功・失敗回数を、postfix + gmailを使って送信します。&lt;/p&gt;&#10;&lt;h2 id="環境"&gt;環境&#10;&lt;/h2&gt;&lt;p&gt;ConoHaのVPSで、CentOS 7です。EPEL有効。postfixは最初から入っていました。&lt;/p&gt;&#10;&lt;pre&gt;`$ which postfix&#13; /usr/sbin/postfix&#13; `&lt;/pre&gt;&#13;&#10;&lt;p&gt;ない場合は、yumでインストールできると思います。&lt;/p&gt;&#10;&lt;p&gt;SMTPサーバーとして、Gmailを使わせてもらいます。メールサーバーはたいへんなので、あまり自分で色々と頑張りたくないためです。二段階認証をしないと「安全性の低いアプリ」だと怒られると思います（&lt;a class="link" href="%22https://support.google.com/mail/answer/7126229" &gt;IMAP を使用して他のメール クライアントで Gmail のメールを読む - Gmail ヘルプ&lt;/a&gt;）。&lt;/p&gt;&#10;&lt;p&gt;ただ、個人アカウントでは特に何も言われなかったのですが、会社アカウントで行った時、二段階認証でもGoogleからは「安全性の低いアプリ」として警告を受けてしまい、使用をやめました。うーん、法人のほうが厳しかったりするんだろうか……。&lt;/p&gt;&#10;&lt;p&gt;ログ解析の一例として、ここではSSHの接続成功・失敗回数を送るようにしてみます。&lt;/p&gt;&#10;&lt;p&gt;ログのどこをどう見るか、完全に我流なんですけれど、一般的なテンプレート的なものってあるんでしょうかね…。&lt;/p&gt;&#10;&lt;h2 id="手順"&gt;手順&#10;&lt;/h2&gt;&lt;p&gt;postfixの設定からメール送信まで。&lt;/p&gt;&#10;&lt;h3 id="postfixの設定"&gt;postfixの設定&#10;&lt;/h3&gt;&lt;p&gt;「&lt;a class="link" href="http://qiita.com/tmsanrinsha/items/75e06fbdd7e12409bb02" target="_blank" rel="noopener"&#10; &gt;Macでコマンドラインやプログラムからmailを送る - Qiita&lt;/a&gt;」を参考にさせていただきました。/etc/postfix/main.cfに以下を追記します。&lt;/p&gt;&#10;&lt;pre&gt;`# add: yyyy-mm-dd&#13; # Posifix Configuratoins&#13; relayhost = smtp.gmail.com:587&#13; &#13; # SASL&#13; smtp_sasl_auth_enable = yes&#13; smtp_sasl_password_maps = hash:/etc/postfix/gmail_passwd&#13; smtp_sasl_security_options = noanonymous&#13; smtp_sasl_mechanism_filter = plain&#13; &#13; # TLS Settings&#13; smtp_use_tls = yes&#13; smtp_tls_security_level = encrypt&#13; tls_random_source = dev:/dev/urandom&#13; `&lt;/pre&gt;&#13;&#10;&lt;p&gt;暗号化にちなむ設定です。SASLについては後述します。ひとまずここで重要なことは、パスワードに関するファイルを/etc/postfix/gmail_passwdとしていることです。&lt;/p&gt;&#10;&lt;p&gt;/etc/postfix/gmail_passwdを、以下の書式で作成します。&lt;/p&gt;&#10;&lt;pre&gt;`smtp.gmail.com:587 メールアドレス:パスワード`&lt;/pre&gt;&#13;&#10;&lt;p&gt;二段階認証をしていることを前提に、Googleより、アプリパスワードを作成して、それをパスワードとします。アプリパスワードについては「&lt;a class="link" href="https://support.google.com/accounts/answer/185833?hl=ja" target="_blank" rel="noopener"&#10; &gt;アプリ パスワードでログイン - Google アカウント ヘルプ&lt;/a&gt;」。&lt;/p&gt;&#10;&lt;p&gt;作成後、gmail_passwd.dbを作成します。&lt;/p&gt;&#10;&lt;pre&gt;`# cd /etc/postfix&#13; # postmap gmail_passwd&#13; `&lt;/pre&gt;&#13;&#10;&lt;p&gt;gmail_passwd.dbが出来ていることを確認後、gmail_passwdを削除します。&lt;/p&gt;&#10;&lt;p&gt;うまくいったら、テストメールを送信して動作確認。&lt;/p&gt;&#10;&lt;pre&gt;`date | mail -s "test" メールアドレス`&lt;/pre&gt;&#13;&#10;&lt;p&gt;-sオプションが件名です。この場合、件名testで送信されます。うまくいかなかったら、/var/log/maillogを見てエラー内容を確認します。&lt;/p&gt;&#10;&lt;h4 id="saslについて"&gt;SASLについて&#10;&lt;/h4&gt;&lt;p&gt;SASL（サスルと読むらしい）については「&lt;a class="link" href="http://www.usupi.org/sysad/210.html" target="_blank" rel="noopener"&#10; &gt;SASL認証を使ってみる - いますぐ実践! Linuxシステム管理 / Vol.210&lt;/a&gt;」の記事がわかりやすかったです。アプリケーションから認証に関するところを切り離して実装するための仕組みのようです。 SASLの実装には色々あるようですが、postfixではCylus SASLを使うとのことです（参考「&lt;a class="link" href="http://oxynotes.com/?p=4428" target="_blank" rel="noopener"&#10; &gt;PostfixのSMTP認証で利用するCyrus SASLライブラリについて | OXY NOTES&lt;/a&gt;」）。これに関するインストールと起動には、以下が必要なはずですが……。&lt;/p&gt;&#10;&lt;pre&gt;`$ sudo yum install cyrus-sasl&#13; $ sudo systemctl start saslauthd.service&#13; $ sudo systemctl enable saslauthd.service&#13; `&lt;/pre&gt;&#13;&#10;&lt;p&gt;しかし、特にこれを用いずとも、メール送信できました。うーん？&lt;/p&gt;&#10;&lt;h3 id="ログを送信する"&gt;ログを送信する&#10;&lt;/h3&gt;&lt;p&gt;ごくごく簡単ですが、以下のようなシェルスクリプトを作成し、実行することでメールを送るようにてみます。管理者権限で実行します。&lt;/p&gt;&#10;&lt;pre&gt;`#!/bin/bash&#13; &#13; set -eu&#13; res_file=$(mktemp)&#13; &#13; function grep_log() {&#13; local _log_file&#13; _log_file="$1"&#13; local _grep_cont&#13; _grep_cont="$2"&#13; &#13; echo -n "${_log_file}, ${_grep_cont}, " &gt;&gt; ${res_file}&#13; grep -ic "${_grep_cont}" "${_log_file}" &gt;&gt; ${res_file}&#13; }&#13; &#13; &#13; # SSH&#13; &#13; ssh_log="/var/log/secure"&#13; &#13; grep_log ${ssh_log} accepted&#13; grep_log ${ssh_log} failed&#13; grep_log ${ssh_log} invalid&#13; &#13; &#13; &#13; # mail&#13; &#13; to_address="メールアドレス"&#13; cat ${res_file} | mail -s "Server Log $(date +%Y%m%d-%H%M%S)" ${to_address}&#13; `&lt;/pre&gt;&#13;&#10;&lt;p&gt;mktempで一時ファイルを作成し、その中にログの中身をどんどこ追記していきます。今回は、SSHのログファイルである/var/log/secureからaccepted、failed、invalidでgrepによるカウントを行い、その回数を記録しています（参考記事「&lt;a class="link" href="http://www.yukun.info/blog/2008/06/sshd-log-file.html" target="_blank" rel="noopener"&#10; &gt;sshdのログファイルの確認方法&lt;/a&gt;」）。最後に出来上がった内容を、日付・時刻を件名に入れて送信して完了です。送信先は、to_addressを適宜変更します。&lt;/p&gt;&#10;&lt;p&gt;実行権限を与えて、実行すると、宛先のメールアドレスに結果が送付されます。&lt;/p&gt;&#10;&lt;p&gt;以上。&lt;/p&gt;</description></item><item><title>CentOS 7 + nginx + munin導入</title><link>https://hack-le.com/nginxmunin/</link><pubDate>Mon, 05 Dec 2016 15:49:44 +0900</pubDate><guid>https://hack-le.com/nginxmunin/</guid><description>&lt;p&gt;CentOS 7、EPEL有り、nginxでmuninによるモニタリングをします。muninをインストールするサーバーと監視対象は同一とします。&lt;/p&gt;&#10;&lt;h2 id="環境"&gt;環境&#10;&lt;/h2&gt;&lt;p&gt;環境は以下。&lt;/p&gt;&#10;&lt;ul&gt;&#10;&lt;li&gt;ConoHaのVPS&lt;/li&gt;&#10;&lt;li&gt;CentOS 7(EPEL有り)&lt;/li&gt;&#10;&lt;li&gt;nginx 1.10.2&lt;/li&gt;&#10;&lt;li&gt;muninをインストールするサーバーと監視対象は同一サーバー&lt;/li&gt;&#10;&lt;li&gt;DNS設定済み（ここでは仮にmunin.example.comとする）&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;h2 id="手順"&gt;手順&#10;&lt;/h2&gt;&lt;p&gt;muninのインストールから、ページの確認まで。&lt;/p&gt;&#10;&lt;h3 id="muninをインストール"&gt;muninをインストール&#10;&lt;/h3&gt;&lt;p&gt;muninをインストール。&lt;/p&gt;&#10;&lt;pre&gt;`sudo yum install munin`&lt;/pre&gt;&#13;&#10;&lt;h3 id="basic認証"&gt;BASIC認証&#10;&lt;/h3&gt;&lt;p&gt;muninのページでBASIC認証（パスワードを入力させるダイアログを表示させるアレ）の設定。パスワードファイルは、標準で用意されている/etc/munin/munin-htpasswdを使用する。ここでは、ユーザー名をmunin、パスワードをpassとする。当然このままではセキュアでないので、適宜変更。また、opensslコマンドのオプション-apr1を用いて、MD5による暗号化を行う（デフォルトではcryptによる暗号化で、これは最長8文字…「&lt;a class="link" href="https://hack-le.com/nginxbasic/" &gt;nginxでBasic認証(パスワードによる認証)&lt;/a&gt;」）&lt;/p&gt;&#10;&lt;pre&gt;`echo "munin:$(openssl passwd -apr1 pass)" | sudo tee -a /etc/munin/munin-htpasswd `&lt;/pre&gt;&#13;&#10;&lt;h3 id="nginxの設定"&gt;nginxの設定&#10;&lt;/h3&gt;&lt;p&gt;/etc/nginx/conf.d/munin.confを作成し、以下を記述する。ただし、ドメインをmunin.example.comとしているので、その部分は適宜変更する。&lt;/p&gt;&#10;&lt;pre&gt;`server {&#13; listen 80;&#13; server_name localhost;&#13; &#13; location /nginx_status {&#13; stub_status on;&#13; access_log off;&#13; allow 127.0.0.1;&#13; deny all;&#13; }&#13; }&#13; &#13; server {&#13; listen 80;&#13; server_name munin.example.com;&#13; &#13; access_log /var/log/nginx/munin.example.com.access.log main;&#13; error_log /var/log/nginx/munin.example.com.error.log;&#13; root /var/www/html/munin;&#13; index index.html;&#13; &#13; auth_basic "munin";&#13; auth_basic_user_file /etc/munin/munin-htpasswd;&#13; &#13; error_page 404 /404.html;&#13; location = /40x.html {&#13; }&#13; &#13; error_page 500 502 503 504 /50x.html;&#13; location = /50x.html {&#13; }&#13; }&#13; `&lt;/pre&gt;&#13;&#10;&lt;p&gt;文法チェック。&lt;/p&gt;&#10;&lt;pre&gt;`sudo nginx -t`&lt;/pre&gt;&#13;&#10;&lt;h3 id="サービスの開始"&gt;サービスの開始&#10;&lt;/h3&gt;&lt;p&gt;成功したらnginxをrestartして、munin-nodeをstartする。ついでにenableでサーバー起動時にstartするように。&lt;/p&gt;&#10;&lt;pre&gt;`sudo systemctl restart nginx.service&#13; sudo systemctl start munin-node.service&#13; sudo systemctl enable munin-node.service`&lt;/pre&gt;&#13;&#10;&lt;p&gt;5分くらい待って、muninのページにアクセスし、パスワードが求められること、グラフが作成されていることを確認する。&lt;/p&gt;&#10;&lt;p&gt;以上。&lt;/p&gt;&#10;&lt;h2 id="参考"&gt;参考&#10;&lt;/h2&gt;&lt;p&gt;参考にさせていただきました。ありがとうございました。&lt;/p&gt;&#10;&lt;ul&gt;&#10;&lt;li&gt;&lt;a class="link" href="http://daichan.club/linux/764" target="_blank" rel="noopener"&#10; &gt;CentOS7にMuninインストール - monkey404&lt;/a&gt;&lt;/li&gt;&#10;&lt;li&gt;&lt;a class="link" href="http://knowledge.sakura.ad.jp/beginner/3669/" target="_blank" rel="noopener"&#10; &gt;「Muninでかんたんサーバー監視」～初心者でもよくわかる！VPSによるWebサーバー運用講座(3) - さくらのナレッジ&lt;/a&gt;&lt;/li&gt;&#10;&lt;/ul&gt;</description></item><item><title>ConoHaでIPアドレス追加してからのてんやわんや</title><link>https://hack-le.com/networktrouble/</link><pubDate>Thu, 01 Dec 2016 01:52:20 +0900</pubDate><guid>https://hack-le.com/networktrouble/</guid><description>&lt;p&gt;このサイトはConoHaのVPS上に構築しています。先日、興味本位でIPアドレスを追加し、「&lt;a class="link" href="https://www.conoha.jp/guide/setipv4.php" target="_blank" rel="noopener"&#10; &gt;追加IPアドレスを使う｜VPSならConoHa&lt;/a&gt;」にのっとって設定したところ、色々エラーが起きました。&lt;/p&gt;&#10;&lt;p&gt;なんとか落ち着いたと思うのですが、その顛末を。どうも、NetworkManagerは無効化しないほうがよさそうな感じです。&lt;/p&gt;&#10;&lt;p&gt;（2017/02/12）ConoHaのページを見ると、いつの間にかNetworkManager無効化の記述が消えていて、このページがよくわからんことになりました。以前はそういう記述があったのです。昔はそうする必要があったが、OS側の対応が進んだとかそういうことなのかもしれません。&lt;/p&gt;&#10;&lt;h2 id="状況"&gt;状況&#10;&lt;/h2&gt;&lt;p&gt;「&lt;a class="link" href="https://www.conoha.jp/guide/setipv4.php" target="_blank" rel="noopener"&#10; &gt;追加IPアドレスを使う｜VPSならConoHa&lt;/a&gt;」の手順にのっとって設定したところ、サーバーの起動から24時間経過した時点で、ネットワークインタフェースeth0が落とされるようになりました。/var/log/messagesに以下のようなログが残っていました。&lt;/p&gt;&#10;&lt;pre&gt;`ntpd[662]: Deleting interface #24 eth0, xxx.xxx.xxx.xxx#123, interface stats: received=498, sent=506, dropped=0, active_time=86400 secs`&lt;/pre&gt;&#13;&#10;&lt;p&gt;IPアドレスのところは伏せました。今後同じIPアドレスである保証はない、というか多分またコロコロ変わるで。&lt;/p&gt;&#10;&lt;p&gt;素直に読めば、ntpdによりeth0がdeleteされた。ただこれは文面どおりに受け取るべきではないようです（後述）。もう一つポイントは、今回追加したeth1はdeleteされていない点です。&lt;/p&gt;&#10;&lt;h2 id="発端"&gt;発端&#10;&lt;/h2&gt;&lt;p&gt;そもそもの発端は、network周りをいじったことです。このサイトではConoHaのVPSを利用していますが、ConoHaには350円/月の追加料金でIPアドレスが追加で一つもらえるというちょっと嬉しいサービスがあります。で、ものは試しと思って追加したのです。&lt;/p&gt;&#10;&lt;p&gt;手順については、公式ヘルプの「&lt;a class="link" href="https://www.conoha.jp/guide/setipv4.php" target="_blank" rel="noopener"&#10; &gt;追加IPアドレスを使う｜VPSならConoHa&lt;/a&gt;」を参照しました。トラブル発生のタイミング的に、ここでの作業が影響しているものと思います。CentOS 7の場合、以下の作業を行いました。&lt;/p&gt;&#10;&lt;ul&gt;&#10;&lt;li&gt;ネットワークインタフェースの設定ファイル/etc/sysconfig/network-scripts/ifcfg-eth1を編集する&lt;/li&gt;&#10;&lt;li&gt;経路テーブル(/etc/iproute2/rt_tables)、ポリシールーティング(/etc/sysconfig/network-scripts/rule-eth1)を設定する&lt;/li&gt;&#10;&lt;li&gt;NetwrokManagerを無効化してnetworkサービスを再起動&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;p&gt;eth1は死んでいないことから、新しく追加したネットワークインタフェースの設定周り自体は問題がないように思えます。怪しいのはNetworkManagerの無効化でしょうか。&lt;/p&gt;&#10;&lt;p&gt;CentOS 6までは、ネットワークの設定は/etc/sysconfig/network-scripts以下のファイルを直接編集することで行うのが普通だと思いますが、CentOS 7以降は、NetworkManagerの利用を推進されています。が、従来のやり方である、/etc/sysconfig/network-scriptsの変更を反映させるには、NetworkManagerが有効化されていると色々問題があるので、ConoHaのヘルプでは無効化させているのでしょうか。&lt;/p&gt;&#10;&lt;p&gt;このへんはsystemd周りでも似たようなことがあって、「&lt;a class="link" href="https://hack-le.com/45528250-2/" &gt;Raspberry Pi にGPSモジュールをつけてStratum 0で時刻同期(スタンドアロン)&lt;/a&gt;」の記事では従来のgpsdを利用するため、systemdのサービスであるgpsd.serviceを無効化したりしています。こういうことがあるとモヤモヤします。&lt;/p&gt;&#10;&lt;h2 id="対応"&gt;対応&#10;&lt;/h2&gt;&lt;h3 id="etcsysconfigntpdのoptions変更ダメ"&gt;/etc/sysconfig/ntpdのOPTIONS変更→ダメ&#10;&lt;/h3&gt;&lt;p&gt;まずRedHatのドキュメント「&lt;a class="link" href="https://access.redhat.com/solutions/261123" target="_blank" rel="noopener"&#10; &gt;Message similar to &amp;ldquo;ntpd Deleting interface #16 ethX:1 , x.x.x.x#123&amp;rdquo; in /var/log/messages - Red Hat Customer Portal&lt;/a&gt;」に従い、/etc/sysconfig/ntpdを編集して、OPTIONS=&amp;quot;-g&amp;quot;からOPTIONS=&amp;quot;-g -L&amp;quot;としました。これにより、NTPは仮想インタフェースを回避する、とあります。&lt;/p&gt;&#10;&lt;p&gt;しかし、これはダメでした。次の手を考えなくては。&lt;/p&gt;&#10;&lt;h3 id="etho0のipを固定dnsが参照できなくなった"&gt;etho0のIPを固定→DNSが参照できなくなった&#10;&lt;/h3&gt;&lt;p&gt;今回編集したeth1はdeleteされず、元からあったeth0だけdeleteされるということで、/etc/sysconfig/network-scripts/ifcfg-eth0の設定ファイルに問題があるのだろうかと、中身を見てみました。&lt;/p&gt;&#10;&lt;pre&gt;`TYPE="Ethernet"&#13; BOOTPROTO="dhcp"&#13; DEFROUTE="yes"&#13; PEERDNS="yes"&#13; PEERROUTES="yes"&#13; IPV4_FAILURE_FATAL="no"&#13; IPV6INIT="yes"&#13; IPV6_AUTOCONF="yes"&#13; IPV6_DEFROUTE="yes"&#13; IPV6_PEERDNS="yes"&#13; IPV6_PEERROUTES="yes"&#13; IPV6_FAILURE_FATAL="no"&#13; NAME="eth0"&#13; &#13; DEVICE="eth0"&#13; ONBOOT="yes"&#13; `&lt;/pre&gt;&#13;&#10;&lt;p&gt;正直なんぞよくわかりません。まったくネットワーク周りは不勉強です。が、気を取り直して、比較のために今回作成した/etc/sysconfig/network-scripts/ifcfg-eth1を見てみます。&lt;/p&gt;&#10;&lt;pre&gt;`DEVICE=eth1&#13; TYPE=Ethernet&#13; HWADDR=hogehoge&#13; ONBOOT=yes&#13; NM_CONTROLLED=no&#13; BOOTPROTO=static&#13; IPADDR=xxx.xxx.xxx.xxx&#13; NETMASK=255.255.254.0&#13; `&lt;/pre&gt;&#13;&#10;&lt;p&gt;こちらは随分シンプルです。IPv6周りがないからかな。で、大きな違いとして目立つのは、eth0はBOOTPROTO=dhcpであるのに対し、eth1はBOOTPROTO=staticであることでしょうか。&lt;/p&gt;&#10;&lt;p&gt;調べていると、「&lt;a class="link" href="http://d.hatena.ne.jp/limitusus/20150619/1434740035" target="_blank" rel="noopener"&#10; &gt;うるう秒をテストしたら仮想インタフェースが落ちた話 - Limitの日記&lt;/a&gt;」という記事があり、以下の記述が参考になりました。&lt;/p&gt;&#10;&#10; &lt;blockquote&gt;&#10; &lt;p&gt;どうやらleap-a-dayによって日付が進み、dhclientがDHCPのリース時間を大幅超過したとみなし、そのときのeth0およびaliasを一度全て落としてしまっているようです。&lt;/p&gt;&#10;&lt;p&gt;その後DHCPでeth0は再設定されますが、eth0:0は元に戻らないようです。&lt;/p&gt;&#10;&lt;p&gt;syslogにはntpdがinterfaceを削除したようなログが出ますが、ntpdが消すはずはもちろんなく、これはbindしているインタフェースが落とされたことを検知しているだけみたいです。&lt;/p&gt;&#10;&#10; &lt;/blockquote&gt;&#10;&lt;p&gt;今回の私のケースとはまた状況が異なるのですが、dhclientがインタフェースを落とすこと、またログの文面ではntpdがdeleteしたみたいに書かれているがそうではないこと、の2点、参考になりました。&lt;/p&gt;&#10;&lt;p&gt;そしてまた調べていると、「&lt;a class="link" href="http://serverfault.com/questions/554536/ntpd-seems-to-delete-all-network-interfaces" target="_blank" rel="noopener"&#10; &gt;networking - NTPD seems to delete all network interfaces - Server Fault&lt;/a&gt;」の記事を見つけました。これによると、BOOTPROTO=dhcpってあるけど、DHCP使ってるのか？マニュアル「&lt;a class="link" href="https://www.centos.org/docs/5/html/Deployment_Guide-en-US/s1-networkscripts-interfaces.html" target="_blank" rel="noopener"&#10; &gt;13.2. Interface Configuration Files&lt;/a&gt;」によるとBOOTPROTO=noneでいいんじゃないのか、という記述があり、こちらがなんだか本質的であるように思います。&lt;/p&gt;&#10;&lt;p&gt;ということで、eth1の設定方法を参考にして、eth0のIPアドレスを固定にしてみました。&lt;/p&gt;&#10;&lt;p&gt;しかし……そうすると、今度は、サーバー側からDNSが参照できなくなりました。IPアドレスの固定自体はできて、外部からWebサーバーにアクセスすることはできるのですが……。うーん、どうも、何かの設定がまだ足りないのでしょう。&lt;/p&gt;&#10;&lt;p&gt;そもそも、ConoHaのネットワーク構成がどうなっているのかよくわかりませんが、DHCPを使っていないわけではないような気がする。さらに色々調べていると、「&lt;a class="link" href="http://serverfault.com/questions/774050/interface-being-deleted" target="_blank" rel="noopener"&#10; &gt;dhcp - Interface being deleted - Server Fault&lt;/a&gt;」という記事がありました。これによると、CentOS 7のVMでのみ同様の症状が起きているという報告があります。もしかしたらOSのバグである可能性があるのでしょうか。とすると、私の手には余る問題かも……。&lt;/p&gt;&#10;&lt;h3 id="networkmanagerを有効化"&gt;NetworkManagerを有効化&#10;&lt;/h3&gt;&lt;p&gt;もう元に戻そうかと半ば諦めかけつつ、そもそもCentOS 7は、ネットワーク周りはNetworkManagerを使うことを推奨されており、それを無効化してしまっているところに問題の一端があるのではないかと思い、有効化させました。&lt;/p&gt;&#10;&lt;p&gt;その状態で再起動したところ、今度はeth0について、DHCPでIPv4のIPアドレスが取得できていませんでした。やはりNetworkManagerを有効化させてはいけないのか？不可思議なのは、IPv6はちゃんと取得できていたことです。謎です。その状態で、いったんNetworkManagerを無効化させてnetworkサービスをrestartさせたところ、今度はIPv4のIPアドレスが取得できました。その状態で再びNetworkMaganerを有効化し、再度networkサービスをrestart。すると、これはIPアドレスをちゃんと取得している。うーん？&lt;/p&gt;&#10;&lt;p&gt;謎だなぁと思いつつ、NetworkManagerをenableにしたまま再起動をかけました。つまりさきほどと状況的には変わらない……はずなのですが、今度はIPアドレスをちゃんと取得していました。&lt;/p&gt;&#10;&lt;p&gt;謎です。いったい何故最初にやったとき取得できなかったのかわかりません。そしてその状態で1日経過しましたが、特に問題なくサーバーは稼働し続けています。&lt;/p&gt;&#10;&lt;p&gt;ううーーーん……。結果として、問題のない状態に落ち着いている、ように見えます。結果的に、やったことと言えば、NetworkMaganerの無効化と有効化を繰り返したことくらいです。しかし……それによっていったい何が変わったのだろう。うーん……勉強しつつ、もうしばらく様子を見ます。&lt;/p&gt;&#10;&lt;p&gt;（2016/12/28追記）あれからまたIPアドレスの付与などを色々試しました。どうやら、NetworkManagerは無効化しなければ特にトラブルは起きないようです。&lt;/p&gt;</description></item><item><title>サーバーも会社も学校も、いつでも逃げ出せることが大事</title><link>https://hack-le.com/escape/</link><pubDate>Sun, 04 Sep 2016 20:24:05 +0900</pubDate><guid>https://hack-le.com/escape/</guid><description>&lt;p&gt;いつものようにネットを楽しんでいたところ、「&lt;a class="link" href="http://www2.gyafuuuun.com/2015/04/ddos%E6%94%BB%E6%92%83%E3%82%92%E5%96%B0%E3%82%89%E3%81%A3%E3%81%9F%E3%82%89conoha%E3%82%92%E8%A7%A3%E7%B4%84%E3%81%99%E3%82%8B%E7%BE%BD%E7%9B%AE%E3%81%AB%E3%81%AA%E3%81%A3%E3%81%9F%E8%A9%B1/" target="_blank" rel="noopener"&#10; &gt;DDoS攻撃を喰らったらConoHaを解約する羽目になった話 | トコトコ日記&lt;/a&gt;」という記事を見かけました。サーバー管理者の端くれとして身につまされる思いです。また、当サイトもConoHaを利用しているので、他人事ではありません。いつでも、逃げ出せる準備はしておかないと。&lt;/p&gt;&#10;&lt;h2 id="事故は起きるし他人の助けを期待しちゃいけない"&gt;事故は起きるし、他人の助けを期待しちゃいけない&#10;&lt;/h2&gt;&lt;p&gt;事故は起きます。100%は防げません。しかし、よく言われるように、交通事故が怖いからといって外を出歩かないのでは阿呆です。自分でサーバーを管理し、サイトを構築して、運用するのは、たいへんではありますけれど、一つの喜びです。DDoSの標的にされて、そのうえ利用しているサービスからも見放されてとは、泣きっ面に蜂、非常につらいですが、もう、不運な事故だったとしか言いようが無いと思います。&lt;/p&gt;&#10;&lt;p&gt;このサイトも、2016年9月現在ConoHaを利用しています。他のVPSを使ったことがないので比較できませんが、コントロールパネルはスッキリしていて見やすいし、パフォーマンスも良好なので、特に不満がありません。まぁそれも、今のところトラブルが起きていないからです。いざという時サポートが期待できないとなれば、その時はさっさと逃げ出すのが一番。たかだか1,000円/月払うだけの私ですから、サポートはまぁ、あまり期待しないほうがよいのでしょう。&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;p&gt;サポートが期待できない環境で活かすべきは、その身軽さ。なにかあったら、即逃げる。常にバックアップを怠らず、いざとなれば最小限の被害でよそに移れるようにしておく。それしかありません。選べることの、ありがたさ。&lt;/p&gt;&#10;&lt;p&gt;なお、サーバーですたこらさっさと逃げ出すための準備としては、「&lt;a class="link" href="http://qiita.com/suin/items/58ddfc5b6186b1b8a4af" target="_blank" rel="noopener"&#10; &gt;DDoS攻撃されたらそこで試合終了!? レンサバから利用停止を宣告される前にできる8つの対策 - Qiita&lt;/a&gt;」の記事がたいへん参考になります。苦労が滲み出ていて、読んだ時には本当にもうお疲れ様でしたという気持ちでいっぱいになりました。私もちゃんとやらないと…。&lt;/p&gt;&#10;&lt;h2 id="逃げ出せない場合が問題だ"&gt;逃げ出せない場合が問題だ&#10;&lt;/h2&gt;&lt;p&gt;逃げることが大事とはいえ、逃げ出しづらいものもあります。サーバーなんてのは比較的引越しやすいものですが、たとえばこれがドメインとなるとどうか。以前、レジストリ判断によるドメインの凍結という憂き目を見ましたが、アレはひどかった。あれをくらったサイトは、それにまでに培ったサイト評価をすべてリセットされて、一から出直しになりました。本サイトのドメインを凍結されたらと思うと、ぞっとします。場末の個人サイトでも、けっこうショックなものです。&lt;/p&gt;&#10;&lt;p&gt;いまさらながら、Twitterの活用を考えているのも、ドメインが使えなくなった時、閲覧者に連絡する手段がまるでないぞということにその時気付かされたからです（わざわざTwitterまで確認してくれる人がいるのかどうかは別にして…）。でも、本質的にはどうしようもないですね、こればかりは。&lt;/p&gt;&#10;&lt;p&gt;とはいえ、Webサイト程度であれば、最終的には一から出直せばよいのであって、長い人生、それも一つの思い出です。しかし、現実には人生を大きく変えるだけの影響力があるのに、なかなか逃げるのが難しいものがたくさんあります。&lt;/p&gt;&#10;&lt;p&gt;その代表格が、学校でしょうか。いじめが大きな問題としてよく取り上げられますが、あれの解決方法は転校です。それしかありません。閉じたコミュニティで一度出来上がってしまったヒエラルキーを崩すことは不可能に近い。そんなことに労を費やしても、いいことなんてなにもなくて、可能であるならば、すたこらさっさと逃げ出してしまうのがいい。しかし、それが難しい。特に大学以上であれば、学歴の問題も絡みます。&lt;/p&gt;&#10;&lt;p&gt;それに比べると、会社はもう少し簡単です。周囲の環境で決められる学校と違い、どこに勤めるかの決定権は自分にありますし、必ずしも住居を変える必要もない。経済的に許されれば、しばらく休むのも良いでしょう。まぁ、実際にそれを実行に移すには、相応の覚悟が必要なのですが。このご時世、自分の求める仕事にありつけるか、どうしたって不安ですよねぇ…。&lt;/p&gt;&#10;&lt;p&gt;どこにいってもやっていける、自分自身、そういう自信を持てればいいのですが。多分、本当に必要なのは、能力ではなくて、自信なのだろうと思います。&lt;/p&gt;</description></item><item><title>不正アクセス(SSH)の試行を遮断(CentOS 7, ConoHa)</title><link>https://hack-le.com/cnban/</link><pubDate>Sun, 31 Jul 2016 00:59:13 +0900</pubDate><guid>https://hack-le.com/cnban/</guid><description>&lt;p&gt;環境はConoHaのVPSで標準のCentOS 7。/var/log/secure を見て見ると、ものすごい数の不正アクセスの試行が見て取れました。ちょっと看過できなかったので、対策しました。&lt;/p&gt;&#10;&lt;h2 id="ブルートフォースアタックか"&gt;ブルートフォースアタックか&#10;&lt;/h2&gt;&lt;p&gt;ブルートフォースアタックとは要は総当り攻撃ですが、ログを見る限りどうもそんな感じです。色々なユーザー名で試行されています。danielって誰だ。調べてみると、中国のサーバーです。まったくもう中国は、まったくもう。このサイトにくるスパムコメントもだいたい中国語です。まったく中国はまったく。&lt;/p&gt;&#10;&lt;p&gt;VPSでサーバーを運営していれば、SSHは必須のサービスです。SSHサーバーを運用している以上、絶対にチェックしておかなければいけないのが、/var/log/secure です。しばらく見ないうちに、ものすごいことになっていました。&lt;/p&gt;&#10;&lt;h2 id="fail2banの導入"&gt;fail2banの導入&#10;&lt;/h2&gt;&lt;p&gt;IPアドレスを指定してfirewallで遮断しても良いのですが、これからのことも考えて、自動で不正なログインをしようと繰り返すIPについて弾くようにしようと、fail2banを導入しました。これはログファイルから攻撃を検知し、firewallを自動的に弾くような設定をしてくれるものです。&lt;/p&gt;&#10;&lt;p&gt;「&lt;a class="link" href="http://qiita.com/wmx/items/2ebedd5a16d27c07089b" target="_blank" rel="noopener"&#10; &gt;CentOS7での fail2banのインストールと設定方法（with firewalld） - Qiita&lt;/a&gt;」の記事を参考にさせていただき、fail2banを導入しました。ConoHaで標準のCentOS 7は、最初からEPELが有効になっている強気の設定なので、普通にyumでインストールすることができます。以下、firewalldは有効化されていることを前提にコマンド。&lt;/p&gt;&#10;&lt;pre&gt;`# yum install fail2ban&#13; # systemctl start fail2ban.service&#13; # systemctl enable fail2ban.service&#13; # systemctl status fail2ban.service&#13; -&gt; サービスが起動していて、またenable(OS起動時にサービスも起動)になっていることを確認&#13; `&lt;/pre&gt;&#13;&#10;&lt;p&gt;設定ファイルを書き換えて、sshでの設定を有効にします。/etc/fail2ban/jail.confを、/etc/fail2ban/jail.localにコピーして、/etc/fail2ban/jail.localを書き換えます。/etc/fail2ban/jail.localに、[sshd]なるところがあると思うので、そこのところが書き換え該当箇所です。今回、以下のように書き換えました。&lt;/p&gt;&#10;&lt;pre&gt;`[sshd]&#13; enabled = true&#13; port = ssh&#13; logpath = %(sshd_log)s&#13; banaction = firewallcmd-ipset&#13; bantime = 86400&#13; `&lt;/pre&gt;&#13;&#10;&lt;p&gt;enabledで有効化です。各項目の意味はまぁ名前の通りです。bantimeの86400はつまり86400秒、すなわち1日です。1日は長いのかもしれません。ただ、初期設定は600、つまり10分だったのですが、どうも今回攻撃しているのは随分と節操がないようで、解除されると即また攻撃を開始するしつこい奴だったので、もう1日にしてしまいました。再犯だけ一週間にするなども考えましたが、ひとまずこれで様子を見ます。&lt;/p&gt;&#10;&lt;p&gt;また、今回のエラーが、デフォルトのフィルターでは引っかからない感じだったので、/etc/fail2ban/filter.d/sshd.conf を編集してフィルターを追加しました（「&lt;a class="link" href="http://blog.jicoman.info/2014/03/fail2ban_filter_sshd/" target="_blank" rel="noopener"&#10; &gt;fail2banでSSH攻撃対策を強化する(filter.d/sshd.confを編集する) | 本日も乙&lt;/a&gt;」を参考にさせていただきました）。具体的には、failregexのところに、以下の行を追加です。&lt;/p&gt;&#10;&lt;pre&gt;`failregex = （省略）&#13; ^%(__prefix_line)s.+Received disconnect from &lt;HOST&gt;: 11: *$&#13; ^%(__prefix_line)s.+Received disconnect from &lt;HOST&gt;: 11: \[preauth\]$&#13; ^%(__prefix_line)s.+Received disconnect from &lt;HOST&gt;: 11: Bye Bye \[preauth\]$&#13; ^%(__prefix_line)sreverse mapping checking getaddrinfo .* \[&lt;HOST&gt;\] failed - POSSIBLE BREAK-IN ATTEMPT!\s*$&#13; `&lt;/pre&gt;&#13;&#10;&lt;p&gt;エラーメッセージは/var/log/secureからコピペして、他の行を参考に書くとよいです。設定が終わったら、fail2banを再起動。&lt;/p&gt;&#10;&lt;pre&gt;`# systemctl restart fail2ban.service`&lt;/pre&gt;&#13;&#10;&lt;p&gt;そして、しばらく様子を見た後、ちゃんとフィルターがかかっているかどうか、以下のように確認。&lt;/p&gt;&#10;&lt;pre&gt;`` # fail2ban-client status sshd &#13; Status for the jail: sshd&#13; |- Filter&#13; | |- Currently failed: 0&#13; | |- Total failed: 0&#13; | `- File list: /var/log/secure&#13; `- Actions&#13; |- Currently banned: 6&#13; |- Total banned: 6&#13; `- Banned IP list: (省略)&#13; ``&lt;/pre&gt;&#13;&#10;&lt;p&gt;これで静かになりました。&lt;/p&gt;&#10;&lt;h2 id="firewalldでipアドレスを指定して遮断"&gt;firewalldでIPアドレスを指定して遮断&#10;&lt;/h2&gt;&lt;p&gt;fail2banでbanしたものの、ログを見る限りいくつかのIPアドレスはもうずっと攻撃をし続けていることがわかりました。どうせ中国なので、これらについては手動で設定して永久遮断です。「&lt;a class="link" href="http://nullpopopo.blogcube.info/2015/01/firewalld-deny-tips.html" target="_blank" rel="noopener"&#10; &gt;[firewalld]特定のIPアドレスを接続拒否する方法 | (っ´∀｀)っ ゃー | nullpopopo&lt;/a&gt;」を参考にさせていただき、firewall-cmdコマンドでfirewalldの設定をしました。&lt;/p&gt;&#10;&lt;pre&gt;`# firewall-cmd --zone=drop --add-source=xxx.xxx.xxx.0/24&#13; # firewall-cmd --zone=drop --add-source=xxx.xxx.xxx.0/24 --permanent&#13; # firewall-cmd --get-active-zones&#13; -&gt; 確認&#13; `&lt;/pre&gt;&#13;&#10;&lt;p&gt;今回の攻撃者は、IPアドレスを変えてちくちく攻撃するいやらしいやつだったので、xxx.xxx.xxx.0/24で、下3桁についてはまとめてブロックすることにしました。どうせ中国だし。&lt;/p&gt;&#10;&lt;p&gt;解除するときは、以下です。&lt;/p&gt;&#10;&lt;pre&gt;`# firewall-cmd --zone=drop --remove-source=xxx.xxx.xxx.0/24&#13; # firewall-cmd --zone=drop --remove-source=xxx.xxx.xxx.0/24 --permanent&#13; `&lt;/pre&gt;&#13;&#10;&lt;h2 id="ひとまず静かになったが"&gt;ひとまず静かになったが&#10;&lt;/h2&gt;&lt;p&gt;しなくてはと思いつつ、ログの確認はついつい怠りがちです…。ひとまず静かになりましたが、今後も継続的にちゃんとログを確認するようにしないといけませんね。再犯者用のfail2banの設定、メールを飛ばすように設定するなどを、今後の課題として、当面は/var/log/secureの目視確認を怠らないようにします。&lt;/p&gt;</description></item><item><title>ConoHaのVPS上で CentOS 7 + nginx + WordPress 構築まで</title><link>https://hack-le.com/conohawp/</link><pubDate>Thu, 07 Jul 2016 07:30:45 +0900</pubDate><guid>https://hack-le.com/conohawp/</guid><description>&lt;p&gt;2016/07/20 修正：nginx.confを直接書き換えていたところを、conf.d/blog.confを作成して設定するようにしました。&lt;/p&gt;&#10;&lt;p&gt;「&lt;a class="link" href="https://www.conoha.jp/" target="_blank" rel="noopener"&#10; &gt;ConoHa - GMOの高性能オールSSDクラウド&lt;/a&gt;」のConoHaのVPSで、CentOS 7 + nginx + WordPress 環境を構築します。慣れると30分の作業です。&lt;/p&gt;&#10;&lt;h2 id="前提"&gt;前提&#10;&lt;/h2&gt;&lt;p&gt;ConoHa標準のCent OS 7は、最初からSELinuxが切られており、またEPELが使えるといった特徴があるので、他のVPSでは初期設定の部分で必要なところがあると思います。&lt;/p&gt;&#10;&lt;p&gt;また、サーバーの構築、起動については省きます。また、sshでrootでログインできる状態から始めるものとします。また、使用するドメイン名をexample.comとします。&lt;/p&gt;&#10;&lt;h2 id="sshユーザーの作成"&gt;sshユーザーの作成&#10;&lt;/h2&gt;&lt;p&gt;rootログインは嫌なので、sshでログインするユーザーを作成します。ここでは、仮にtestユーザーとします。&lt;/p&gt;&#10;&lt;pre&gt;`ssh root@example.com&#13; useradd test&#13; passwd test&#13; # testユーザーでsudoを使えるようにする&#13; visudo&#13; ----&#13; # 以下を追記&#13; test ALL=(ALL) ALL&#13; ----&#13; # testユーザーに切り替え&#13; su - test&#13; &#13; # 秘密鍵を作成. ここではパスフレーズ使用しないのでエンターキー連打&#13; ssh-keygen -t rsa&#13; &#13; # rootの許可リストをtestユーザー&#13; sudo cp /root/.ssh/authorized_keys ~/.ssh/&#13; sudo chown test:test ~/.ssh/authorized_keys&#13; chmod 644 ~/.ssh/authorized_keys&#13; &#13; # ここでいったんログアウト&#13; # testユーザーでログインできることを確認する&#13; ssh test@example.com&#13; &#13; # sshのrootログインを禁止する&#13; sudo vi /etc/ssh/sshd_config&#13; sudo sed -i "s/PermitRootLogin yes/PermitRootLogin no/" /etc/ssh/sshd_config&#13; sudo grep -i permitrootlogin /etc/ssh/sshd_config&#13; -&gt; no になっていることを確認&#13; &#13; # sshサービスを再起動し、rootでログインできないことを確認。&#13; sudo systemctl restart sshd.service&#13; &#13; # ログアウトして、rootログインができないことを確認&#13; ssh root@example.com&#13; -&gt; Permission denied (publickey,gssapi-keyex,gssapi-with-mic).&#13; &#13; # testユーザーならばログインできることを確認&#13; ssh test@example.com&#13; -&gt; ログイン&#13; `&lt;/pre&gt;&#13;&#10;&lt;p&gt;以後、testユーザーでログインして操作するものとします。&lt;/p&gt;&#10;&lt;h2 id="必要なソフトウェアをインストールする"&gt;必要なソフトウェアをインストールする&#10;&lt;/h2&gt;&lt;p&gt;各種ソフトウェアをインストールします。nginx、mariadbを含みます。byobuを使っていますが、別に使わなくても問題ありません。個人的には、途中で接続が切断されても大丈夫なので、リモートログイン先ではよく使っています。&lt;/p&gt;&#10;&lt;pre&gt;`sudo yum install byobu&#13; # 以後、byobu上で実行します。&#13; byobu&#13; # 基本的なソフトウェア&#13; sudo yum update -y&#13; sudo yum groupinstall -y "開発ツール"&#13; sudo yum install -y bash-completion unzip&#13; &#13; # 個人的な趣味で入れているもの&#13; sudo yum install -y emacs tig etckeeper ruby gnuplot&#13; # 個人的な趣味で入れているもの2, python関係のインストールで必要だから&#13; sudo yum install -y bzip2 bzip2-devel openssl-devel readline readline-devel sqlite-devel freetype* libpng-devel&#13; &#13; # nginx, php, mariadb&#13; # php-fpm は WordPress で必要&#13; sudo yum install -y nginx php php-gd php-mbstring php-mysql php-pspell php-xml php-xmlrpc php-fpm mariadb mariadb-server&#13; # 実行&#13; sudo systemctl start nginx.service&#13; sudo systemctl start php-fpm.service&#13; sudo systemctl start mariadb.service&#13; # 有効化（起動時にON）&#13; sudo systemctl enable nginx.service&#13; sudo systemctl enable php-fpm.service&#13; sudo systemctl enable mariadb.service&#13; # ステータスの確認&#13; systemctl status nginx.service&#13; systemctl status php-fpm.service&#13; systemctl status mariadb.service&#13; `&lt;/pre&gt;&#13;&#10;&lt;p&gt;以上で、基本的なソフトウェアをインストールしました。&lt;/p&gt;&#10;&lt;h2 id="各種設定"&gt;各種設定&#10;&lt;/h2&gt;&lt;p&gt;さまざまな設定。&lt;/p&gt;&#10;&lt;h3 id="ファイアウォールの設定"&gt;ファイアウォールの設定&#10;&lt;/h3&gt;&lt;p&gt;ファイアウォールの設定をします。具体的には、httpで利用するポート80を開放します。&lt;/p&gt;&#10;&lt;pre&gt;`firewall-cmd --list-services&#13; sudo firewall-cmd --add-service=http --zone=public&#13; sudo firewall-cmd --add-service=http --zone=public --permanent&#13; firewall-cmd --list-services&#13; `&lt;/pre&gt;&#13;&#10;&lt;h3 id="データベースの準備"&gt;データベースの準備&#10;&lt;/h3&gt;&lt;p&gt;WordPressで用いるデータベースを準備します。ここではMariaDBを利用していますが、MySQLでも同様かと。データベース名、ユーザー名、パスワードを決めておきます。&lt;/p&gt;&#10;&lt;pre&gt;`# データベース名 wpdata, ユーザー名 wpdbuser, パスワード pass とする&#13; sudo mysql&#13; &gt; create database wpdata;&#13; &gt; grant all on wpdata.* to wpdbuser@'localhost' identified by 'pass';&#13; &gt; flush privileges;&#13; `&lt;/pre&gt;&#13;&#10;&lt;h3 id="nginxの設定"&gt;nginxの設定&#10;&lt;/h3&gt;&lt;p&gt;nginxの設定をします。大元の設定ファイルは /etc/nginx/nginx.conf ですが、ここでは /etc/nginx/conf.d/blog.conf を新たに作成し、そこに以下の内容を記述します。パーマリンク設定を変更することを前提とした設定になっています。参考記事は本記事の最後にのっけています。&lt;/p&gt;&#10;&lt;p&gt;なお、基本的な設定ファイルの読み方については「&lt;a class="link" href="//hack-le.com/nginx/" &gt;nginxの設定ファイル nginx.conf の読み方 超入門&lt;/a&gt;」という記事を書きました。よければ御覧ください。&lt;/p&gt;&#10;&lt;p&gt;sudo nginx -t で設定ファイルの文法をチェックできます。変更したら忘れずに確認しましょう。&lt;/p&gt;&#10;&lt;pre&gt;`server {&#13; listen 80;&#13; listen [::]:80;&#13; # ドメインに合わせて適宜変更&#13; server_name example.com;&#13; index index.php;&#13; # ドキュメントルートに合わせて適宜変更&#13; root /usr/share/nginx/html;&#13; &#13; # Load configuration files for the default server block.&#13; include /etc/nginx/default.d/*.conf;&#13; &#13; # 設定ファイルを見られないように&#13; location ~* /wp-config.php { deny all; }&#13; location ~ \.php$ {&#13; try_files $uri @wordpress;&#13; fastcgi_pass 127.0.0.1:9000;&#13; fastcgi_index index.php;&#13; fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;&#13; include fastcgi_params;&#13; }&#13; &#13; location / {&#13; try_files $uri $uri/ @wordpress;&#13; }&#13; &#13; location @wordpress {&#13; fastcgi_index index.php;&#13; fastcgi_split_path_info ^(.+\.php)(.*)$;&#13; fastcgi_pass 127.0.0.1:9000;&#13; fastcgi_param SCRIPT_FILENAME $document_root/index.php;&#13; include fastcgi_params;&#13; }&#13; &#13; error_page 404 /404.html;&#13; location = /40x.html {&#13; }&#13; &#13; error_page 500 502 503 504 /50x.html;&#13; location = /50x.html {&#13; }&#13; }&#13; `&lt;/pre&gt;&#13;&#10;&lt;h3 id="php-fpmの設定"&gt;php-fpmの設定&#10;&lt;/h3&gt;&lt;p&gt;userとgroupをnginxに変更します。&lt;/p&gt;&#10;&lt;pre&gt;`sudo sed -i "s/user = apache/user = nginx/" /etc/php-fpm.d/www.conf&#13; sudo sed -i "s/group = apache/group = nginx/" /etc/php-fpm.d/www.conf&#13; `&lt;/pre&gt;&#13;&#10;&lt;h3 id="サービスの再起動"&gt;サービスの再起動&#10;&lt;/h3&gt;&lt;p&gt;ここまでの設定を反映させるために、サービスを再起動します。&lt;/p&gt;&#10;&lt;pre&gt;`sudo systemctl restart nginx.service&#13; sudo systemctl restart php-fpm.service&#13; `&lt;/pre&gt;&#13;&#10;&lt;h2 id="wordpressのインストール"&gt;WordPressのインストール&#10;&lt;/h2&gt;&lt;p&gt;WordPressをインストールします。最新版のURLは「&lt;a class="link" href="https://ja.wordpress.org/" target="_blank" rel="noopener"&#10; &gt;日本語 — WordPress&lt;/a&gt;」で確認。また、ここではドキュメントルートをデフォルトである/usr/share/nginx/htmlとしています。&lt;/p&gt;&#10;&lt;h3 id="インストールと設定ファイルの編集"&gt;インストールと設定ファイルの編集&#10;&lt;/h3&gt;&lt;pre&gt;`cd&#13; WPVER=4.6.1&#13; wget &lt;a href="https://ja.wordpress.org/wordpress-4.5.3-ja.zip"&gt;https://ja.wordpress.org/wordpress-${WPVER}-ja.zip&lt;/a&gt;&#13; unzip wordpress-${WPVER}-ja.zip&#13; sudo cp -a wordpress/* /usr/share/nginx/html/&#13; # ディレクトリ所有権の変更&#13; sudo chown -R nginx:nginx /usr/share/nginx/html&#13; # WordPressの設定&#13; cd /usr/share/nginx/html&#13; sudo cp -a wp-config-sample.php wp-config.php&#13; # wp-config.php を編集して、前節のデータベース名、ユーザー名、パスワードを反映&#13; # 認証用ユニークキーの設定&#13; sudo vi wp-config.php&#13; `&lt;/pre&gt;&#13;&#10;&lt;h3 id="サイトにアクセス"&gt;サイトにアクセス&#10;&lt;/h3&gt;&lt;p&gt;ここまでできたら、ブラウザからアクセスできるようになります。アクセスして、初期設定を行い、またパーマリンクの設定やプラグインの導入などを行います。これで、一通り完成です。&lt;/p&gt;&#10;&lt;h2 id="参考リンク"&gt;参考リンク&#10;&lt;/h2&gt;&lt;p&gt;多くの記事を参考にさせていただきました。ありがとうございます。&lt;/p&gt;&#10;&lt;ul&gt;&#10;&lt;li&gt;「&lt;a class="link" href="http://qiita.com/fk1/items/3ef1d989d1d5e44a1d03" target="_blank" rel="noopener"&#10; &gt;nginxでwordpressを動かすには - Qiita&lt;/a&gt;」…基本的な流れ&lt;/li&gt;&#10;&lt;li&gt;「&lt;a class="link" href="http://qiita.com/egnr-in-6matroom/items/a08f4851bf16d0131e60" target="_blank" rel="noopener"&#10; &gt;nginxでwordpressのパーマリンクをデフォルト以外に対応する - Qiita&lt;/a&gt;」…パーマリンクの設定&lt;/li&gt;&#10;&lt;li&gt;「&lt;a class="link" href="http://heartbeats.jp/hbblog/2012/04/nginx05.html" target="_blank" rel="noopener"&#10; &gt;nginx連載5回目: nginxの設定、その3 - locationディレクティブ - インフラエンジニアway - Powered by HEARTBEATS&lt;/a&gt;」nginxの設定ファイルの理解&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;p&gt;また、CentOS 7の基本的な操作については、下記の本を大いに参考にしました。&lt;/p&gt;&#10;&lt;iframe width="300" height="150" style="width: 120px; height: 240px;" src="//rcm-fe.amazon-adsystem.com/e/cm?lt1=_blank&amp;bc1=000000&amp;IS2=1&amp;bg1=FFFFFF&amp;fc1=000000&amp;lc1=0000FF&amp;t=hackle12-22&amp;o=9&amp;p=8&amp;l=as4&amp;m=amazon&amp;f=ifr&amp;ref=ss_til&amp;asins=4774172448" frameborder="0" marginwidth="0" marginheight="0" scrolling="no"&gt;&lt;/iframe&gt;</description></item><item><title>ReadyNas 104 のHD交換完了。NASは楽だなぁ…</title><link>https://hack-le.com/47583583-2/</link><pubDate>Wed, 18 May 2016 12:56:04 +0900</pubDate><guid>https://hack-le.com/47583583-2/</guid><description>&lt;p&gt;Seagateのハードディスクが壊れてしまい、Western DigitalのHDに交換しました（「&lt;a class="link" href="//hack-le.com/47562649.html" &gt;ReadyNasの調子が悪いと思っていたら、Seagateのハードディスクがお亡くなりになっていた : 或る阿呆の記&lt;/a&gt;」）。&lt;/p&gt;&#10;&lt;h2 id="ハードディスクの不調から交換の流れ"&gt;ハードディスクの不調から交換の流れ&#10;&lt;/h2&gt;&lt;p&gt;Webの管理画面から、不調なハードディスクのチャネルを確認します。本体を見ると、チャネルに相当する番号のインジケータが消灯しているので、わかりやすい。交換作業はとてもスムーズで、「&lt;a class="link" href="http://www.netgear.jp/products/details/RN10400-2/#tab-%e3%83%80%e3%82%a6%e3%83%b3%e3%83%ad%e3%83%bc%e3%83%89" target="_blank" rel="noopener"&#10; &gt;ReadyNAS® 104 4ベイ デスクトップ型ネットワークストレージ（ベアボーンタイプ） RN10400 | 46,600 円 | ネットギア【NETGEAR】&lt;/a&gt;」にあるハードウェアユーザーズマニュアルの通りです。ホットスワップ対応のため、電源を投入したままの状態で、当該ハードディスクを抜き出し、交換し、挿入する。それだけです。2TBのハードディスク4本でRAID-5、実際に使用している容量が2.5TB程度の状態で、再構築に36時間ほどかかりました。エラーも消えて、不調なく動くし、満足です。次に死ぬのは、どのハードディスクかな？&lt;/p&gt;&#10;&lt;h2 id="nasの便利さよ"&gt;NASの便利さよ&#10;&lt;/h2&gt;&lt;p&gt;LinuxでソフトウェアRAIDを組むのは簡単です。以前は自分でやっていました。幸いなことに、ハードディスクの破損には見舞われることはなかったのですが、もしあったら、たいへんだったろうなと思います。インストール時にRAIDを構成するのは簡単になり、初心者向けの特集でもよく紹介されていますが、実際に破損が起きて、交換、再構築する手順となると、ハードルが上がります。mdadmコマンドを使ってゴチャゴチャとやることになるのでしょうが、いかにも面倒です。そのことを思えば、何も考えずに、抜いて挿すだけ、RAID対応のNASは便利ですね。&lt;/p&gt;&#10;&lt;p&gt;RAIDはバックアップではありませんので、別途バックアップを取る必要はあります。しかし、こうしてハードディスクの不調の憂き目に遭いながらも、データを壊したり、データの移行作業なしに復旧させることができたのは、RAIDのおかげであり、嬉しいことです。データの損失もありません。ハードディスクが壊れたのは嬉しくありませんが、まぁハードディスクは消耗品ですから、RAID + バックアップのシステムは、家庭レベルでもやっておきたいですね。&lt;/p&gt;</description></item><item><title>VPS上のWordPress(CentOS 7)を、プラグインを使わずにバックアップして復元するまでの手順</title><link>https://hack-le.com/47038948-2/</link><pubDate>Mon, 14 Mar 2016 17:23:18 +0900</pubDate><guid>https://hack-le.com/47038948-2/</guid><description>&lt;p&gt;本記事では、プラグインを使わずに、WordPressをバックアップし、またバックアップしたデータを復元する手順を実際に手を動かして確認します。復元までがバックアップです。復元は仮想環境で行うことにします。&lt;/p&gt;&#10;&lt;p&gt;2016年4月27日追記：WordPressファイル群のコピー の節を追加。忘れていました。&lt;/p&gt;&#10;&lt;h2 id="やりたいこと"&gt;やりたいこと&#10;&lt;/h2&gt;&lt;ul&gt;&#10;&lt;li&gt;CentOS 7 をインストールしたVPS上のWordPressをバックアップしたい&lt;/li&gt;&#10;&lt;li&gt;いつでも復元作業ができるように、ローカル環境で復元を実行して手順を確認したい&lt;/li&gt;&#10;&lt;li&gt;プラグインは使わない&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;p&gt;プラグインを使わない理由は、データがどのように保存されているかを理解し、何かトラブルが合った時に対応できるようにするためです。プラグインを使ってボタン一発バックアップというのは確かに便利でしょうが、それではプラグインの挙動に問題が生じたとき、どうしてよいかわからなくなることが容易に想像され、長期的にはよろしくないと判断しました。バックアップがどのようになされるかを理解したうえで、信頼できるプラグインを導入し作業を簡便にするのはよいと思いますが、私は最近始めたばかりのWordPress初心者ですので、まずは手動で手順を確認します。&lt;/p&gt;&#10;&lt;p&gt;本作業には、&lt;strong&gt;Linuxとデータベースの基本的な知識が必要&lt;/strong&gt;です。&lt;/p&gt;&#10;&lt;h2 id="想定する環境"&gt;想定する環境&#10;&lt;/h2&gt;&lt;p&gt;本作業の環境は、ConoHaのVPS、OSがCentOS 7.1(ロケールは日本語)で、WordPressが4.4.2、またWebサーバーがApache、DBがMariaDBといったところです。ローカル環境は、Mac上にVagrantとVirtualBoxで構築します。OSは OSX 10.11 です。とはいえ、作業そのものは仮想環境上で行いますから、ホストOSが何かは本作業においては問題ではないと思います。&lt;/p&gt;&#10;&lt;p&gt;以下、本記事においては、バックアップ元を ドメイン example.com のサーバー上にあるものとします。また、Webサーバーのドキュメントルートは /var/www/html で、WordPressのファイルがその直下に展開されています。仮想環境のプライベートIPアドレスは、Vagrantのデフォルト設定である192.168.33.10 です。&lt;/p&gt;&#10;&lt;h2 id="ローカル環境の構築"&gt;ローカル環境の構築&#10;&lt;/h2&gt;&lt;p&gt;ローカル環境については、「&lt;a class="link" href="//hack-le.com/47039762.html" &gt;ローカルにWordPressの試験環境を Vagrant + VirtualBox + CentOS 7 で構築する : 或る阿呆の記&lt;/a&gt;」の第4節「WordPressを動作させるための環境を構築」までを実行して作成します。バックアップ元のサーバーとSSHでやりとりする場合は、加えてSSHの鍵認証の設定が必要です。この手順については、前述の記事「&lt;a class="link" href="//hack-le.com/archives/20462465-2/" &gt;SSHで鍵認証を用いて、パスワードなしでログインする方法 : 或る阿呆の記&lt;/a&gt;」を参照とします。まぁファイルのやりとりさえできればよいので、ホストOS経由でもなんでもいいと思います。どうせ仮環境ですから。&lt;/p&gt;&#10;&lt;h2 id="バックアップ手順"&gt;バックアップ手順&#10;&lt;/h2&gt;&lt;p&gt;おおまかにわけて、通常は /var/www/html 以下あたりに展開していると思われる、WordPressのPHPやらアップロードした画像やらのファイル群と、記事やコメント内容が格納されているデータベースのバックアップ作業が必要です。&lt;/p&gt;&#10;&lt;h3 id="wordpressのファイル群をコピーする"&gt;WordPressのファイル群をコピーする&#10;&lt;/h3&gt;&lt;p&gt;WordPressのファイルを置いている場所、Apacheを利用していて、ドキュメントルートを変更していないのであれば、/var/www/html あたりだと思いますが、フォルダまるごとコピーします。/var/www/htmlにある場合、たとえばsshを利用したコピーのコマンドは以下です。リモートホストはexample.com、ユーザー名はhackleとします。&lt;/p&gt;&#10;&lt;pre&gt;`scp -r hackle@example.com:/var/www/html .&#13; `&lt;/pre&gt;&#13;&#10;&lt;p&gt;カレントディレクトリに、example.comの /var/www/html が保存されます。&lt;/p&gt;&#10;&lt;h3 id="データベースをdumpする"&gt;データベースをdumpする&#10;&lt;/h3&gt;&lt;p&gt;記事の中身など、大事なところはデータベース上に保存されています。今回、データベースにはMariaDBを利用しているものとしますが、MySQLでも操作は同様だと思います。バックアップには、mysqldumpコマンドを利用します。保存したいデータベースのデータベース名、ユーザー名、パスワードを確認しておきましょう。今回、データベース名はwpdata、ユーザー名はwpdbuser、パスワードはpassとしてコマンドを実行します。&lt;/p&gt;&#10;&lt;pre&gt;`sudo mysqldump --single-transaction -u wpdbuser --password=pass wpdata &gt; wpdata.sql&#13; `&lt;/pre&gt;&#13;&#10;&lt;p&gt;このコマンドにより、 wpdata.sql というファイルにバックアップされます。オプションの意味ですが、&amp;ndash;single-transaction は、データの整合性を保つためのオプションとのことで、たとえばダンプに時間がかかっていても、終了した時点で最新の状態が反映されている、というようなものだそうですが、データベースについては不勉強なため、どれくらい信用してよいオプションなのかはちょっとわかりません。まぁ、つけて悪くなることはなかろうとつけています。他のオプションは名前からその意味を推測できるでしょう。&lt;/p&gt;&#10;&lt;h2 id="復元リストア手順"&gt;復元（リストア）手順&#10;&lt;/h2&gt;&lt;p&gt;バックアップと復元（リストア）はセットです。せっかくバックアップしていても、いざという時に復元できなければ、それはストレージの肥やしを作成しているに過ぎませんから、いつ何が起きても慌てなくて済むように、復元手順を確認します。今回は、前々節で作成したローカル環境上で復元を実行します。&lt;/p&gt;&#10;&lt;h3 id="wordpress-ファイル群のコピー"&gt;WordPress ファイル群のコピー&#10;&lt;/h3&gt;&lt;p&gt;前節でバックアップした WordPress のファイル群を、ドキュメントルート、Apacheのデデフォルトとして考えると、/var/www/html以下にコピーします。また、ファイルの所有者を apache にします。この場合は以下のコマンドです。&lt;/p&gt;&#10;&lt;pre&gt;`$ chown -R apache:apache /var/www/html&#13; `&lt;/pre&gt;&#13;&#10;&lt;p&gt;また、念の為にwp-config.phpのユニークキーを再設定します。ユニークキーの役割は「&lt;a class="link" href="http://wpdocs.osdn.jp/wp-config.php_%E3%81%AE%E7%B7%A8%E9%9B%86#.E8.AA.8D.E8.A8.BC.E7.94.A8.E3.83.A6.E3.83.8B.E3.83.BC.E3.82.AF.E3.82.AD.E3.83.BC" target="_blank" rel="noopener"&#10; &gt;wp-config.php の編集 - WordPress Codex 日本語版&lt;/a&gt;」にある通りで、クッキーに保存される情報の暗号化に用いられるキーのようです。なのでまぁ、同じサイトであれば、必ずしも再設定が必要ということはないのかもしれませんが…。ファイル群のコピーはこれでOKです。&lt;/p&gt;&#10;&lt;h3 id="データベースの復元"&gt;データベースの復元&#10;&lt;/h3&gt;&lt;p&gt;復元するデータベースを作成しておきます。&lt;/p&gt;&#10;&lt;pre&gt;`# 操作&#13; sudo mysql&#13; # データベースの作成（既に作成していればスキップ）&#13; create database wpdata;&#13; grant all on wpdata.* to wpdbuser@'localhost' identified by 'pass';&#13; flush privileges;&#13; # データベースがあることを確認&#13; show databases;&#13; `&lt;/pre&gt;&#13;&#10;&lt;p&gt;データベースを作成したら、なんらかの手段により、バックアップ元サーバーの wpdata.sql をローカルに落とし、適用します。&lt;/p&gt;&#10;&lt;pre&gt;`sudo mysql -u wpdbuser --password=pass wpdata &lt; wpdata.sql&#13; `&lt;/pre&gt;&#13;&#10;&lt;h3 id="ドメインの変更とサイトの確認"&gt;ドメインの変更とサイトの確認&#10;&lt;/h3&gt;&lt;p&gt;これで復元できているはずですが、192.168.33.10 にアクセスする前に、WordPressのアドレスを192.168.33.10に変更します。これをしないと、サイト内の内部リンクがすべて元のドメインを基づいて作られてしまいます。面倒なことに、サイトアドレスの情報はデータベース内にあるようなので、以下のようにデータベースの操作が必要です。&lt;/p&gt;&#10;&lt;pre&gt;`# 操作&#13; sudo mysql&#13; # WordPressのデータベースがあることを確認&#13; show databases;&#13; # Vagrant のプライベートIPアドレス（通常192.168.33.10）に変更、確認&#13; use wpdata;&#13; SELECT * FROM wp_options WHERE option_name IN ('home','siteurl');&#13; UPDATE wp_options SET option_value = '&lt;a href="http://192.168.33.10'"&gt;http://192.168.33.10'&lt;/a&gt; where option_name IN ('home','siteurl');&#13; SELECT * FROM wp_options WHERE option_name IN ('home','siteurl');&#13; `&lt;/pre&gt;&#13;&#10;&lt;p&gt;以上の操作後、Webブラウザより 192.168.33.10 にアクセスして、サイトが正常に復元されていることを確認します。&lt;/p&gt;&#10;&lt;p&gt;以上より、WordPressで作成したサイトを、プラグインを使わずにバックアップ、復元しました。あとは、WordPress を展開したフォルダと、mysqldump の出力ファイルを定期的にバックアップしておけば、何か問題があった時にも慌てず復元できます。定期的なバックアップについてはまた別途。&lt;/p&gt;&#10;&lt;h2 id="参考"&gt;参考&#10;&lt;/h2&gt;&lt;p&gt;主に以下のサイト、記事を参考にさせていただきました。ありがとうございます。&lt;/p&gt;&#10;&lt;ul&gt;&#10;&lt;li&gt;&lt;a class="link" href="http://naifix.com/backup/" target="_blank" rel="noopener"&#10; &gt;WordPress初心者でも簡単にできるバックアップ方法&lt;/a&gt;&lt;/li&gt;&#10;&lt;li&gt;&lt;a class="link" href="http://qiita.com/hishigataBOZE/items/bdd6009d3bfc1c7d313b" target="_blank" rel="noopener"&#10; &gt;[WordPress + MySQL] DBからサイトURLを変更 - Qiita&lt;/a&gt;&lt;/li&gt;&#10;&lt;li&gt;&lt;a class="link" href="http://qiita.com/knife0125/items/bb095a85d1a5d3c8f706" target="_blank" rel="noopener"&#10; &gt;【MySQL, SQL】データベースを扱う基本SQL一覧 - Qiita&lt;/a&gt;&lt;/li&gt;&#10;&lt;li&gt;&lt;a class="link" href="http://weblabo.oscasierra.net/mysql-mysqldump-01/" target="_blank" rel="noopener"&#10; &gt;MySQLのデータベースをmysqldumpでバックアップ/復元する方法 | WEB ARCH LABO&lt;/a&gt;&lt;/li&gt;&#10;&lt;li&gt;&lt;a class="link" href="http://qiita.com/ryounagaoka/items/7be0479a36c97618907f" target="_blank" rel="noopener"&#10; &gt;よく使うmysqldumpのオプションと使用例 - Qiita&lt;/a&gt;&lt;/li&gt;&#10;&lt;/ul&gt;</description></item><item><title>ReadyNAS 104の安定した運用に至るまで</title><link>https://hack-le.com/46372213-2/</link><pubDate>Sat, 26 Dec 2015 02:04:57 +0900</pubDate><guid>https://hack-le.com/46372213-2/</guid><description>&lt;p&gt;ReadyNAS 104を購入してからもう一ヶ月以上経ちます。NASとしては比較的安価なものということもあり、マシンスペックが低くてそれなりに苦労しましたが、ようやく安定的に運用できるようになってきたと思います。とにかく&lt;strong&gt;できるだけReadyNASに負荷をかけないこと&lt;/strong&gt;、が大事でした。&lt;/p&gt;&#10;&lt;h2 id="一ヶ月使っての結論"&gt;一ヶ月使っての結論&#10;&lt;/h2&gt;&lt;p&gt;私の用途は大別して二種類、&lt;strong&gt;各種マシンからsambaまたはsshでアクセスできるファイルサーバー、そしてMacのTimeMachine先としてバックアップサーバー&lt;/strong&gt;です。最初購入した時は、元がDebianならいろいろとできることがあるのでは？と夢が広がったりもしたのですが（owncloudで自前のオンラインストレージとか）、いざ運用してみるとあまりにも落ちる＆落ちる＆落ちるを繰り返すフォーリン・マシンだったので、&lt;strong&gt;あまりややこしいことはさせないでおこう&lt;/strong&gt;、という結論です。&lt;/p&gt;&#10;&lt;p&gt;2016/08/06追記：その後、TimeMachineサーバーの機能は結局使わなくなりました。理由は、エラーが出て初期化の憂き目に何度かあったこと、またデータの転送速度が非常に遅く、大容量のバックアップには不安があると判断した為です。TimeMachineは結局外付けハードディスクが一番安心ですよ…。（「&lt;a class="link" href="//hack-le.com/47700477-2/" &gt;結局TimeMachineはNASを使わず外付けハードディスクを利用するようになった&lt;/a&gt;」）&lt;/p&gt;&#10;&lt;h2 id="安定して動くまでの軌跡"&gt;安定して動くまでの軌跡&#10;&lt;/h2&gt;&lt;p&gt;ReadyNAS 104で運用を始めるにあたり心がけたいのは、&lt;strong&gt;何か作業やサービスを開始するときは1つずつ&lt;/strong&gt;、ということです。複数のことを同時にさせてはいけません。アップアップしてうんともすんとも言わなくなります。もう何度電源プラグを抜いたことやら。幸いなことに故障はありませんでしたが、心臓に悪い。最近の富豪マシンに慣れた身では、知らず知らずのうちに無理をさせてしまいます。&lt;/p&gt;&#10;&lt;p&gt;まず最初にハードディスクを挿入するわけですが、これは&lt;strong&gt;面倒でも一本ずつ入れて、そのたびにリビルド&lt;/strong&gt;させました。仕様上は4本一気に挿入しても問題ないと思いますし、実際それでもうまくいくかもしれません。しかし、一本ずつやったほうがよいと思います。まぁ、数日もあれば完了するでしょう。私が使用したハードディスクは2TB*4ですが、これが3TBや4TBのものだと、さらに時間がかかるのでしょうねぇ…。&lt;/p&gt;&#10;&lt;p&gt;RAIDは設定をいじればいろいろなパターンを組むことができるのですが、私は&lt;strong&gt;標準であるX-RAIDを使用するのが一番よいのではないか&lt;/strong&gt;と思います。この製品もそれを前提に作られていると思いますし、いざ何かがあったとき、&lt;strong&gt;標準的な構成であったほうが復旧が楽&lt;/strong&gt;だと思うのです。もちろん機能的には自由なRAIDパターンが可能なのですが……まぁ、ややこしいことはできるだけしないことにします。&lt;/p&gt;&#10;&lt;p&gt;さて、ハードウェアが使えるようになったら、SSHをONにします。&lt;strong&gt;ReadyNASは、初期設定ではroot以外のログインシェルが/bin/false(だったっけ？)なので、rootログインで運用するか、/etc/passwdをいじってユーザーのログインシェルを変更する&lt;/strong&gt;かしないといけません。ネットワーク外部からのアクセスを許可しなければ、root運用が一番手間いらずかもしれませんが、まぁrootログインはNGにしたほうが何かとよいでしょう。&lt;/p&gt;&#10;&lt;p&gt;以上の準備が整った段階で、次にいよいよデータのコピーを開始です。&lt;strong&gt;ネットワーク経由で、ssh + rsyncを利用して、データのコピーを行います&lt;/strong&gt;。sambaでもよいのですけれど、データの容量が大きい場合、一度のコピーを長時間続けるのが難しいこともありますから、途中でコピーが止まっても問題なく再開できるrsyncがやはり使いやすいと思います。ただ、OSXからLinuxにssh経由でファイルのコピーを行うとき、ファイルシステムの相違からくる&lt;strong&gt;濁点の問題&lt;/strong&gt;に注意しなければなりません（「&lt;a class="link" href="//hack-le.com/30878779.html" &gt;rsyncでiconvオプションをつけると、deleteオプションの挙動が変わる？？ : 或る阿呆の記&lt;/a&gt;」、「&lt;a class="link" href="//hack-le.com/archives/46001270-2/" &gt;Macでファイル共有の悩み…文字コード（濁点）、sambaの遅さ、iSCSIの対応 : 或る阿呆の記&lt;/a&gt;」）。具体的には、iconvオプションが必要です。&lt;/p&gt;&#10;&lt;p&gt;データのコピーが完了したら、今度はデータのバックアップをします。このとき、一番よいのはReadyNASに外付けハードディスクをつけることですが、どういうわけか、私の場合外付けハードディスクにバックアップさせようとすると落ちました。まさかI/Oの処理がおっつかないのでしょうか。USB 3.0に対応したポートがあるのですが。しかし何度やっても失敗し、電源プラグを抜く羽目になります。しまいに、再起動後はまた再構成を始めます。これでまた何十時間。仕方ありませんから、直接ハードディスクを繋ぐのは諦めて、まどろっこしいですが、&lt;strong&gt;ネットワーク上にある別のサーバーにバックアップデータを転送する&lt;/strong&gt;ようにしました。具体的には、Raspberry Piです。Raspberry Piならば場所もとりませんし、バックアップしたい時だけ外付けハードディスクをつけるようにすれば、トータルで見てReadyNASに接続しっぱなしにするより省エネでしょう。うまくいくか心配でしたが、これはうまくいきました。というわけで、現在PC ReadyNAS Raspberry Pi というネットワークが組まれています（「&lt;a class="link" href="//hack-le.com/46175547-2/" &gt;ReadyNASのバックアップに苦戦…負荷をかけると落ちる : 或る阿呆の記&lt;/a&gt;」）。なんだかけったいな感じがしなくもありません。&lt;/p&gt;&#10;&lt;p&gt;それが終われば、いよいよTimeMachineです。Macを複数持っていると、TimeMachineサーバーがあるのは有難いのですが、しかしながら、このTimeMachineも運用していると&lt;strong&gt;なんだかよくエラーが出る&lt;/strong&gt;ような気がします。何度かバックアップデータを消したりなんだりしていますが、消すのもちょっと一工夫必要で、こういうときsshが使えると楽です（「&lt;a class="link" href="//hack-le.com/46274190-2/" &gt;ReadyNASでTimeMachineのデータをsshでログインして直接削除 : 或る阿呆の記&lt;/a&gt;」）。&lt;strong&gt;仮想ディスクなど変更が多くまた大容量になりがちなものはTimeMachineの対象から外したうえで、かつまずは1台のみバックアップを取るようにしました&lt;/strong&gt;。これにより、いまのところ10日ほど問題なく稼働しており、安定しているように見えますが、ここに二台目のMacのバックアップを追加すると、ちょっとどうなるかわかりません。容量の大きな最初のバックアップでかち合わなければ大丈夫ではないかと思うのですが……。&lt;/p&gt;&#10;&lt;p&gt;だいたい以上のような経過を経て、現在ReadyNAS 104を運用しています。なんだか思っていたよりも苦労しました。それでも、自前で全部あれこれやるよりは楽だろうとも思いますし、今後ずっと使い続けていくことを考えれば、故障さえしてくれなければ良い物だと言えます。長いお付き合いになるといいのですが……。&lt;/p&gt;&#10;&lt;iframe width="300" height="150" style="width: 120px; height: 240px;" src="//rcm-fe.amazon-adsystem.com/e/cm?lt1=_blank&amp;bc1=000000&amp;IS2=1&amp;bg1=FFFFFF&amp;fc1=000000&amp;lc1=0000FF&amp;t=hackle12-22&amp;o=9&amp;p=8&amp;l=as4&amp;m=amazon&amp;f=ifr&amp;ref=ss_til&amp;asins=B00CHABREE" frameborder="0" marginwidth="0" marginheight="0" scrolling="no"&gt;&lt;/iframe&gt;</description></item><item><title>ReadyNASでTimeMachineのデータをsshでログインして直接削除</title><link>https://hack-le.com/46274190-2/</link><pubDate>Mon, 14 Dec 2015 01:32:48 +0900</pubDate><guid>https://hack-le.com/46274190-2/</guid><description>&lt;p&gt;先日、急にTimeMachineが失敗するようになりました。TimeMachineの保存先にはReadyNAS 104を使用しています。&lt;strong&gt;どうもTimeMachineは、ネットワークを経由すると不安定な印象&lt;/strong&gt;です。昔Mac miniをTimeMachineサーバーにして、MacBook Airのバックアップする母艦にしていましたが、この時もエラーが頻発した記憶があります。&lt;/p&gt;&#10;&lt;p&gt;原因がすぐ分かればいいな、と思って &lt;strong&gt;/var/log/system.logを見てみましたが、まぁよくわかりません&lt;/strong&gt;。こういう時はサクッと削除して、バックアップを再構築してしまうのが経験的に結局早いです。どうせそんな昔のデータを復元することなんてありませんし、さっさと作りなおしてしまいます。&lt;/p&gt;&#10;&lt;h2 id="readynas-104からtimemachineのデータを削除"&gt;ReadyNAS 104からTimeMachineのデータを削除&#10;&lt;/h2&gt;&lt;p&gt;「&lt;a class="link" href="http://www.readynas.com/ja/?p=1097" target="_blank" rel="noopener"&#10; &gt;ReadyNAS と Mac Time Machine を使う : NETGEAR Japan ReadyNAS Community&lt;/a&gt;」によると、手順としてはまずMac側からTimeMachineに使うディスクを削除するようです。「システム環境設定」→「TimeMachine」→「ディスクを選択」→「ディスクを削除」でできます。これは通常通り。&lt;/p&gt;&#10;&lt;p&gt;問題は次の手順でして、記事によると、FinderよりafpでReadyNASに接続し、当該データを削除せよ、とあります。確かにちゃんとアクセスできて、削除操作もできる、できるのですが…これがなかなか終わりません。そのうち終わるかなと思って半日ほど放っておいたのですが、終わりません。&lt;strong&gt;きっと永遠に終わりません&lt;/strong&gt;。そんな気がします。&lt;/p&gt;&#10;&lt;p&gt;埒が明かないので、削除を中断し、別の手段を取ることにします。&lt;strong&gt;sshでReadyNASにrootでログインし、直接削除する&lt;/strong&gt;ことにしました。問題はTimeMachineのデータがどこにあるのかですが、findで探してみると、 /data/.timemachine/ReadyNAS 下にありました。隠しディレクトリでしたか…。以下のコマンドで削除します。&lt;/p&gt;&#10;&lt;pre&gt;`$ ssh root@192.168.x.xxx パスワード入力、ReadyNASにログイン&#13; # cd /data/.timemachine/ReadyNAS&#13; # ls&#13; -&gt; 削除したいディレクトリ名を調べます&#13; # rm -rfv Mac\ mini.sparsebundle/&#13; -&gt; 先のlsで表示されたディレクトリを消去します&#13; `&lt;/pre&gt;&#13;&#10;&lt;p&gt;実行すると、数分で削除できました。最初からこうしておけばよかった。&lt;/p&gt;&#10;&lt;p&gt;ReadyNASは今のところ割と気に入ってはいるのですけれど、&lt;strong&gt;マシンスペックが低いためかちょっと無理させるとすぐに止まる&lt;/strong&gt;ので神経を使います。しかも何のフォローもなく盛大に止まってくれて、ログインもできないので、何度かコンセントをぶちっと…怖い。今回の削除も大丈夫かなと心配していたくらいです。&lt;strong&gt;外付けハードディスクにバックアップしようとするだけで固まってしまう&lt;/strong&gt;ので、ReadyNASのバックアップは別途Raspberry Pi経由で行うようになりました。ReadyNASは初心者向けとされていますけれど、本当にLinuxって何？みたいな初心者が扱うとかなり苦労するのではないかなと思います。&lt;/p&gt;</description></item><item><title>ReadyNASのバックアップに苦戦…負荷をかけると落ちる</title><link>https://hack-le.com/46175547-2/</link><pubDate>Thu, 03 Dec 2015 22:06:14 +0900</pubDate><guid>https://hack-le.com/46175547-2/</guid><description>&lt;p&gt;いまさら自宅サーバーでファイルサーバーというのもテンションが上がらない話だと思い（「&lt;a class="link" href="//hack-le.com/45948138-2/" &gt;自宅サーバーは浪漫枠 : 或る阿呆の記&lt;/a&gt;」）、先日NetgearのReadyNAS 104を購入しました。2万円ちょっとでした。4ベイのNASです。&lt;/p&gt;&#10;&lt;h2 id="第一印象は悪くなかったが"&gt;第一印象は悪くなかったが&#10;&lt;/h2&gt;&lt;p&gt;最初はやや苦労しました。前に使っていたHDを認識させるのに、一本一本入れてはリビルドを繰り返しました。今思うと、ここで数本入れて一気にやろうとしなくてよかったと思います。ましてデータ移動なんてさせなくてよかった。きっと、このマシンはそんなたいへんなことはうまくできない。&lt;/p&gt;&#10;&lt;p&gt;その後は数日かけて、3TB近いデータの転送です。これはrsyncを用いて行いました。ここまでは、一週間ほどかかりましたが、まぁそこそこうまくいったのです。sshでrootに入れるし、勝手にRAIDしてくれるし、最初からsambaも使えるし、これは良いものだと思ったのですが、現在バックアップで引っかかっており、これはなかなか難儀なマシンかもしれないなと思い始めました。&lt;/p&gt;&#10;&lt;h2 id="外付けハードディスクへのバックアップで苦戦"&gt;外付けハードディスクへのバックアップで苦戦&#10;&lt;/h2&gt;&lt;p&gt;まず最初に外付けハードディスクを接続するだけではまるで認識してくれないという問題がありました。&lt;strong&gt;ext4でフォーマットしないとダメらしい&lt;/strong&gt;のですが、せめて/dev下くらいにはあってほしかった。これではどうにもならないので、机の上に転がっていたRaspberry Piでext4にフォーマットして、ReadyNASに接続し、再起動させるとなんとか認識。認識するのはよいのですけれど、&lt;strong&gt;外部ストレージを接続したとして、再び再構成が始まるのはいったい何故&lt;/strong&gt;でしょう？まさか外部ストレージもRAIDに加えようとしているのでしょうか。そんなことをされては困りますが…。&lt;/p&gt;&#10;&lt;p&gt;まぁまさかそんなことあるまいなと思いつつ、再構成が終わるのにはまた数十時間かかるので、待っていられないなぁと外付けハードディスクへのバックアップを開始すると、&lt;strong&gt;落ちます&lt;/strong&gt;。再構成とバックアップが被るとダメなのだろうか？ウンともスンとも言わず、筐体のボタンを押しても無反応。仕方ありませんので、コンセントを引き抜きます。その後再起動すると、外付けハードディスクを認識しない。また再起動してもダメ。では、と再び外付けハードディスクをフォーマットしなおして、接続し再起動するとなんとか認識するものの、いざバックアップを開始すると同じ展開。その後再起動すると、今度は再起動後も外付けハードディスクを認識してくれていたが、バックアップを開始するまでもなく、しばらくすると落ちてまたウンともスンとも言わない。仕方なくコンセントを引き抜く。外付けハードディスクを外して再起動させると、今度はなんとか落ちずに動いてくれる。そして数十時間にも及ぶ再構成を再び0.0%から開始する。いったい何をしているのか…。&lt;/p&gt;&#10;&lt;p&gt;せっかく背面にあるUSB3.0ポートではありますが、こんなに不安定ではどうしようもありません。&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="頼みの綱はまさかのraspberry-pi"&gt;頼みの綱はまさかのRaspberry Pi&#10;&lt;/h2&gt;&lt;p&gt;そうは言っても、バックアップをしないわけにはいきません。これだけ色々と思う通りにいかないところがあると、&lt;strong&gt;論理障害や本体の故障というのもいかにも起きそうな話&lt;/strong&gt;です。そのとき、RAID-5で保存されたデータを救い出すのは、たいへんな苦労をしそうですから、やはりなにかしらのバックアップはしておきたい。&lt;/p&gt;&#10;&lt;p&gt;どうしたものかなと考えていて目についたのが、ハードディスクのフォーマットに使った&lt;strong&gt;Raspberry Pi&lt;/strong&gt;。これを使えばよいのではなかろうか。ファイルサーバーは荷が重いにしても、&lt;strong&gt;ネットワーク経由でのバックアップくらいはできる&lt;/strong&gt;でしょう。&lt;/p&gt;&#10;&lt;p&gt;というわけで、現在rsyncで同期中です。昨晩から実行して、かれこれ20時間近く何事も無く転送し続けてくれているようなので、なんとかうまくいきそうです。この分であれば、&lt;strong&gt;ひとまず運用はなんとかなりそうで安心&lt;/strong&gt;しました。補完的に稼働できる小型コンピュータはなかなか良いものですね。自宅サーバー周りがどうにも寒い昨今、小型コンピュータが熱い…。しかし20時間で約360GBの転送…3TB分の転送を終えるには、またしばらくかかりそうです。&lt;/p&gt;&#10;&lt;p&gt;それにしても、&lt;strong&gt;ReadyNAS、なかなか苦労するマシン&lt;/strong&gt;です。NASの初心者向けとも聞きますが、本当に初心者の人が扱うと、用途によっては非常に戸惑うのではないかと思います。決して悪い製品ではないと思いますが、Linuxの知識がない人には辛いのではないかなぁ…。&lt;/p&gt;&#10;&lt;iframe width="300" height="150" style="width: 120px; height: 240px;" src="//rcm-fe.amazon-adsystem.com/e/cm?lt1=_blank&amp;bc1=000000&amp;IS2=1&amp;bg1=FFFFFF&amp;fc1=000000&amp;lc1=0000FF&amp;t=hackle12-22&amp;o=9&amp;p=8&amp;l=as4&amp;m=amazon&amp;f=ifr&amp;ref=ss_til&amp;asins=B00CHABREE" frameborder="0" marginwidth="0" marginheight="0" scrolling="no"&gt;&lt;/iframe&gt;&lt;iframe width="300" height="150" style="width: 120px; height: 240px;" src="//rcm-fe.amazon-adsystem.com/e/cm?lt1=_blank&amp;bc1=000000&amp;IS2=1&amp;bg1=FFFFFF&amp;fc1=000000&amp;lc1=0000FF&amp;t=hackle12-22&amp;o=9&amp;p=8&amp;l=as4&amp;m=amazon&amp;f=ifr&amp;ref=ss_til&amp;asins=B00T9LR2I4" frameborder="0" marginwidth="0" marginheight="0" scrolling="no"&gt;&lt;/iframe&gt;</description></item><item><title>Macでファイル共有の悩み…文字コード（濁点）、sambaの遅さ、iSCSIの対応</title><link>https://hack-le.com/46001270-2/</link><pubDate>Sun, 15 Nov 2015 10:40:03 +0900</pubDate><guid>https://hack-le.com/46001270-2/</guid><description>&lt;p&gt;HPのMicroserverが逝ってしまいましたので、代替のサーバーを考えていましたが、今時LAN内で必要なサーバーといえばせいぜいファイルサーバーと、LAN内DNSくらいではないかという考えから、あまりアレコレと自宅サーバーを頑張る時代でもなかろうとNASを購入しました。&lt;/p&gt;&#10;&lt;h2 id="readynas-104-を買いました"&gt;ReadyNAS 104 を買いました&#10;&lt;/h2&gt;&lt;p&gt;NASの入門機として名高い&lt;strong&gt;NetgearのReadyNAS 104というマシンで、4台の3.5インチハードディスクを挿入出来ます&lt;/strong&gt;。NASとして既に完成されており、手軽にハードウェアレベルでRAIDが扱えますし、あくまでNAS目的に組まれたマシンですから消費電力も控えめです。最初から&lt;strong&gt;TimeMachineサーバーとして機能することも魅力的&lt;/strong&gt;。&lt;/p&gt;&#10;&lt;p&gt;なにより、&lt;strong&gt;内部的にはDebian&lt;/strong&gt;であるらしく、究極的にはDebianで出来ることは大概出来てしまうようで、この自由度の高さは嬉しい誤算でした。NASなんていうのは、Webサーバー経由で簡単な設定の操作しかさせてくれまいと思っていたのですが、&lt;strong&gt;普通にsshでrootログインできてしまい&lt;/strong&gt;、そんなに自由にさせてくれるのかと少し感動してしまいました。リソースに気をつけさえすれば、ちょっと遊べるLinuxマシンということで、これが&lt;strong&gt;2万円程度と考えると非常にリーズナブル&lt;/strong&gt;です。&lt;/p&gt;&#10;&lt;h2 id="macのファイル共有はちょっと鬼門"&gt;Macのファイル共有はちょっと鬼門&#10;&lt;/h2&gt;&lt;p&gt;たいへん良いマシンを手に入れたと思いますが、マシンの問題とは別に、Macのファイル共有はなかなか苦労があります。一昔前の話を聞いていると、随分良くなったのではないかと思うのですが、それでも色々とハマりどころがあり、しかもデータという大事な資産に密接に関わってくるところですから、慎重にならなくてはなりません。&lt;/p&gt;&#10;&lt;h3 id="sambaがなにか遅い"&gt;sambaがなにか遅い&#10;&lt;/h3&gt;&lt;p&gt;&lt;strong&gt;SMBはファイル共有では定番のプロトコル&lt;/strong&gt;であり、当然Macでもsambaが使用できるのですが、これが何故か妙に遅い。遅いというか、レスポンスが悪い。Windowsでは、まるでローカルのファイルのように扱えるのに、&lt;strong&gt;Macではフォルダを開くだけでもワンテンポ遅れが生じることがままあります&lt;/strong&gt;。ファイルの転送速度も微妙なもので、まぁそれでも&lt;strong&gt;大きなファイルであれば10MB/sくらいは出ている&lt;/strong&gt;ようなのですが、有線LANのギガビットイーサネット、もっと速度が出ても良いのではないかと思います。きちんとチューニングすればもっと早くなるのではないかと思うのですが、sambaの設定は不勉強で、どうしたらよいものか、なかなか難しいです。&lt;/p&gt;&#10;&lt;p&gt;表示のレスポンスについては、ファイラの問題も、あるのかもしれません。私はMac用二画面ファイラの定番&lt;strong&gt;ForkLift&lt;/strong&gt;を愛用していますが、標準のFinderよりもsamba経由だと表示に若干時間がかかるようです。&lt;/p&gt;&#10;&lt;p&gt;（追記）ある程度解決しました「&lt;a class="link" href="https://hack-le.com/rnas104smbup/" &gt;MacとReadyNAS 104の通信速度が遅い時の対処法(SMB)&lt;/a&gt;」。それでもWindowsに比べるとレスポンスはちょっとひっかかりがあるのですが。&lt;/p&gt;&#10;&lt;h3 id="sshにおける濁点問題"&gt;sshにおける濁点問題&#10;&lt;/h3&gt;&lt;p&gt;&lt;strong&gt;Macはsshもデフォルトで使えます&lt;/strong&gt;から、sambaを使わずともファイルのやり取りは可能です。先述した私の愛用するファイラForkLiftはsshにも対応している優秀なアプリで、使い勝手は良好。これが&lt;strong&gt;何故かsambaよりもレスポンスがよい&lt;/strong&gt;。ファイルの転送速度もsambaと遜色ないか、心なしかちょっと早い。sshが早いというよりはsambaが遅いような気がしますが、まずまずといったところです。&lt;/p&gt;&#10;&lt;p&gt;ではsshを使えば良いではないかというと、これがまた問題があります。それは&lt;strong&gt;濁点の問題&lt;/strong&gt;です。Macでは、&lt;strong&gt;ファイルシステムの仕様から濁点や半濁点が一文字として数えられます&lt;/strong&gt;。たとえば「がぎぐげご」は「か゛き゛く゛け゛こ゛」です。WindowsやLinuxではそのように扱われません（参考「&lt;a class="link" href="http://qiita.com/knaka/items/48e1799b56d520af6a09" target="_blank" rel="noopener"&#10; &gt;MacOSX - Mac OS X の NFD 問題での対策諸々 - Qiita&lt;/a&gt;」）。&lt;/p&gt;&#10;&lt;p&gt;ReadyNASはLinuxです。ですので、ファイル転送時に気をつけないと、非常に厄介なことになります。具体的には、端末やファイラからファイルは見えているのだが、いざ操作しようとすると「見つからない」と言われるという症状に見舞われます。これ、本当に面倒臭いです。&lt;/p&gt;&#10;&lt;p&gt;ファイル転送時に&lt;strong&gt;rsyncのiconvオプション&lt;/strong&gt;を使えばこの問題は回避することができます（「&lt;a class="link" href="//hack-le.com/30878779-2/" &gt;rsyncでiconvオプションをつけると、deleteオプションの挙動が変わる？？ : 或る阿呆の記&lt;/a&gt;」）。しかし、通常のscpでは何にもしてくれません。ファイルの転送にいちいちrsyncが必要とされるようでは、ちょっと使いづらいですね。&lt;/p&gt;&#10;&lt;p&gt;sambaを使えば、ちゃんと変換してくれるようで、少なくともこの濁点の問題で頭を悩ませる必要がないので、&lt;strong&gt;日常的にはやはりsshよりsambaのほうが使いやすい&lt;/strong&gt;のです。&lt;/p&gt;&#10;&lt;h3 id="macにおけるiscsiのイニシエータの寂しい状況"&gt;MacにおけるiSCSIのイニシエータの寂しい状況&#10;&lt;/h3&gt;&lt;p&gt;sshよりsambaとはいえ、やはり速度がもうちょっとなんとかならないものだろうかと考えたところで、ふと思い浮かぶのは&lt;strong&gt;iSCSI&lt;/strong&gt;です。ReadyNASは設定画面のタブに普通にiSCSIがあり、簡単にターゲットを作成してiSCSIを使用することが可能なのですが…。Macでは、iSCSIのイニシエータで実績のあるものが、1ライセンス$90したりします。「&lt;a class="link" href="https://sites.google.com/site/bknobiboroku/others/how_to_use_iscsi_with_readynas" target="_blank" rel="noopener"&#10; &gt;ReadyNASでiSCSIを利用する - @ビボーログ&lt;/a&gt;」には無料で頑張る方法もありますが、El Capitanだとどうにもうまくいきません。Yosemiteではうまくいくのでしょうか？「&lt;a class="link" href="https://github.com/iscsi-osx/iSCSIInitiator" target="_blank" rel="noopener"&#10; &gt;iscsi-osx/iSCSIInitiator · GitHub&lt;/a&gt;」なんてのもあったりしますが、情報が少なく果たしてどんなものやら。しかし広いネットの世界では頑張った人がいまして、「&lt;a class="link" href="http://www.jn1msd.net/lifeisrun/archives/2015-423/" target="_blank" rel="noopener"&#10; &gt;Mac El CapitanでDroboshare Dashboardを使ってiSCSIを無料で利用する 〜実践編 | Life is run!!&lt;/a&gt;」という記事を見つけました。なかなか手間暇かけて頑張っており、よくこんな方法見つけたなぁと思います（ネットでは本当に感心してしまうことがたくさん）。しかしながら、見るだけでなんだか面倒臭い。とりあえず、今はいいかな…という感じです。&lt;/p&gt;&#10;&lt;h2 id="一番楽なのは外付けハードディスクをつけること"&gt;一番楽なのは外付けハードディスクをつけること&#10;&lt;/h2&gt;&lt;p&gt;とまぁこのような感じで、Macでのファイル共有は、昔に比べればかなり進歩しているだろうとは思うものの、なかなか苦労があります。身も蓋もない話ですが、&lt;strong&gt;一番楽なのは外付けハードディスクをMacに接続してしまうこと&lt;/strong&gt;です。&lt;/p&gt;&#10;&lt;p&gt;まぁでも、部屋からハードディスクを追い出して、部屋の外にファイルサーバーがある生活、というのも悪くないものです。まだ3TBのデータ転送がまったく終わっていないので、ハードディスクを部屋から追い出せていないのですが…（あと数日はかかりそう…）。&lt;/p&gt;&#10;&lt;iframe width="300" height="150" style="width: 120px; height: 240px;" src="//rcm-fe.amazon-adsystem.com/e/cm?lt1=_blank&amp;bc1=000000&amp;IS2=1&amp;bg1=FFFFFF&amp;fc1=000000&amp;lc1=0000FF&amp;t=hackle12-22&amp;o=9&amp;p=8&amp;l=as4&amp;m=amazon&amp;f=ifr&amp;ref=ss_til&amp;asins=B00CHABREE" frameborder="0" marginwidth="0" marginheight="0" scrolling="no"&gt;&lt;/iframe&gt;</description></item><item><title>自宅サーバーは浪漫枠</title><link>https://hack-le.com/45948138-2/</link><pubDate>Mon, 09 Nov 2015 20:16:45 +0900</pubDate><guid>https://hack-le.com/45948138-2/</guid><description>&lt;p&gt;3,4年くらい前に、格安のサーバーが流行っていました。HPのMicroserverは、3.5インチのベイが4台分ある、コンパクトなサーバーマシンで、15,000円という今見ると破格の相場でした。他にも、探せば色々と格安のサーバーがひっかかったものですが、2015年現在、すっかり下火となってしまっているようです。Microserverの後継機は普通に数万円してしまいます。&lt;/p&gt;&#10;&lt;h2 id="microserverが死んで"&gt;Microserverが死んで&#10;&lt;/h2&gt;&lt;p&gt;それでも私の手元にはかつてのMicroserverがありましたから、これを使って自宅サーバーをまた本格的に運用するのも悪く無いと思っていたのですが、いざ始めようとしたところ、電源がつかず、一瞬ファンが回るだけ。マザーボードを引っ張りだして、お掃除したりコネクタの抜き差ししたり、バッテリーを交換したりしてみましたが、ダメ。マザーボードが逝ってしまったのかわかりませんが、動かないものはどうしようもありません。合掌です。&lt;/p&gt;&#10;&lt;p&gt;当てが外れた私は、代替となるマシンを考えねばなりませんでした。昔作った自作マシンなどもありますから、&lt;strong&gt;マシンがないわけではありません。&lt;/strong&gt; SSDやメモリなど、パーツも一通り揃っています。使えるマシンは、ある。&lt;/p&gt;&#10;&lt;h2 id="vpsやnasの存在を考えて"&gt;VPSやNASの存在を考えて&#10;&lt;/h2&gt;&lt;p&gt;マシンはありますが、今は2015年です。格安サーバーとか自作PCで若干の盛り上がりを見せていたのも今は昔です。自宅サーバーで構築することが多いものは、ファイル共有機能を含めたメディアサーバー、インターネットに公開するWebサーバーといったものでしょうが、前者はNASで安価かつ手軽に構築できますし、後者はもうVPSの時代でしょう。実際のところ、&lt;strong&gt;自宅サーバーの本領が発揮されるのは、なんらかのハードウェアを繋ぐ必要があったり、大容量のストレージと高い処理能力が要求されるような特殊な用途&lt;/strong&gt;で、まぁ録画サーバーなどがその代表選手でしょうか。逆に言うと、そうでもなければ&lt;strong&gt;自宅サーバーというのは実利を超えた夢、すなわち浪漫枠&lt;/strong&gt;ということになるのでしょう。&lt;/p&gt;&#10;&lt;p&gt;私も一昔前であれば、労を厭わず浪漫を追いかけたかもしれません。しかし、今さらファイルサーバーをたてることに喜びを感じることもなく、お金よりも時間が惜しくもあります。専用のマシンであれば、何も考えずにRAIDも組める。別に冗長性がないと困るわけではないのですが、まぁホットスワップで入れ替えができたほうが、いざ故障などが起きた時、楽に対応ができるでしょう。&lt;/p&gt;&#10;&lt;iframe width="300" height="150" style="width: 120px; height: 240px;" src="//rcm-fe.amazon-adsystem.com/e/cm?lt1=_blank&amp;bc1=000000&amp;IS2=1&amp;bg1=FFFFFF&amp;fc1=000000&amp;lc1=0000FF&amp;t=hackle12-22&amp;o=9&amp;p=8&amp;l=as4&amp;m=amazon&amp;f=ifr&amp;ref=ss_til&amp;asins=B00CHABREE" frameborder="0" marginwidth="0" marginheight="0" scrolling="no"&gt;&lt;/iframe&gt;そういうわけで、考えていた自宅サーバー計画は取りやめて、NASを注文してしまったのだ、という話です。NetgearのReadyNAS 104とかいうやつで、TimeMachineにも対応している割と評判のものですから、きっとうまく働いてくれるでしょう。少し、寂しい気もします。</description></item><item><title>HP Microserver N54L が逝きました</title><link>https://hack-le.com/45938665-2/</link><pubDate>Sun, 08 Nov 2015 15:30:13 +0900</pubDate><guid>https://hack-le.com/45938665-2/</guid><description>&lt;p&gt;約3年の命でした。小型のマイクロサーバーが、ちょうど三年ほど前に流行っていて、当時このマシンが15,000円ほどで買えたのです。今となっては信じられない。良い時代でした。&lt;/p&gt;&#10;&lt;h2 id="さようならmicroserver"&gt;さようならMicroserver&#10;&lt;/h2&gt;&lt;p&gt;かつてファイルサーバー、メディアサーバーとして活躍してくれていたマシンですが、最近は隠居気味でした。が、今回Mac miniのSSDを480GBに換装したのを気に、ハードディスクを部屋から追い出して、外にファイルサーバーを作ろうと、再び本格的に使おうとした矢先…死にました。あるいは、死んでいました。&lt;/p&gt;&#10;&lt;p&gt;電源がつきません。あんなに青々と光っていたhpマークが、うんともすんとも。コンセントに指したに電源を投入した一瞬だけ、赤く光ったりはしますが、それっきり。えぇ、と思い、一縷の望みをかけてマザーボードを取り出し、バッテリーを交換し、隅々まで掃除して、各種コネクタの抜き差しを行いました。ダメでした。ううん、BIOSどころかファンすら回らない…マザーボードかなぁ……。いろいろと抵抗してみましたが、ダメ。悲しい。&lt;/p&gt;&#10;&lt;p&gt;3年というのはちょっと短いような気もしますが、動かないものは仕方ありません。思えば、このマシンは初めて私がサーバーを実用的に使ったものです。たくさんのことを学ばせてもらいました。今までありがとう、お疲れ様。&lt;/p&gt;&#10;&lt;h2 id="次のサーバーは"&gt;次のサーバーは…&#10;&lt;/h2&gt;&lt;p&gt;Microserver N54Lが使えないとなると、どうしようか…結局ファイルサーバーが主な用途になりますから、NASを買えば十分に思えます。実際、それも考えているのですが、N54Lで使用していたパーツを使いたい貧乏根性や、やはり普通に使えるLinuxマシンが家にあると嬉しいというオタク心が、NASではないちゃんとしたマシンを欲しています。また、今回Mac miniのSSDを480GBに換装したため、256GBのものが余っており、それも使いたい。売ってもよいが、それではつまらない…。&lt;/p&gt;&#10;&lt;p&gt;そういえば、昔作った適当な自作機が、今職場であまり使われないテスト機として転がっています。あれを使うか。CPUはたしかデュアルコアのCeleron 2.4GHzですが、まぁ大したことをするわけではないので十分でしょう。問題は、ケースのベイと、MBのSATAポートがいくつあるかですが…。&lt;/p&gt;&#10;&lt;p&gt;NASを買っちゃうのが、一番楽なんでしょうけどね。それもいいかな。約2万円強。どうしよう。&lt;/p&gt;&#10;&lt;iframe width="300" height="150" style="width: 120px; height: 240px;" src="//rcm-fe.amazon-adsystem.com/e/cm?lt1=_blank&amp;bc1=000000&amp;IS2=1&amp;bg1=FFFFFF&amp;fc1=000000&amp;lc1=0000FF&amp;t=hackle12-22&amp;o=9&amp;p=8&amp;l=as4&amp;m=amazon&amp;f=ifr&amp;ref=ss_til&amp;asins=B00CHABREE" frameborder="0" marginwidth="0" marginheight="0" scrolling="no"&gt;&lt;/iframe&gt;</description></item><item><title>Raspberry Pi 1 B+ に Redmine を入れてみたがやや重い</title><link>https://hack-le.com/44942872-2/</link><pubDate>Fri, 31 Jul 2015 00:55:02 +0900</pubDate><guid>https://hack-le.com/44942872-2/</guid><description>&lt;p&gt;いい加減に少しはまともなプロジェクト管理をしたほうがよいのではないか、という話を職場でしていました。プロジェクト管理といえば Redmine が有名です。こういったツールは使いこなせればよいのでしょうが、なかなかに面倒であることも事実です。&lt;/p&gt;&#10;&lt;p&gt;まぁ、まずはやってみようかと、「&lt;a class="link" href="http://windmesser.cc/wiki/index.php?%E9%9B%91%E8%A8%98/2014-12-04" target="_blank" rel="noopener"&#10; &gt;Raspberry PI に Redmine インストール(1) - Wind Messer&lt;/a&gt;」を参考に、自宅のRaspberry Pi 1 Model B+ にインストールして、やってみました。&lt;/p&gt;&#10;&lt;p&gt;特にひっかかるところもなく、すんなりと導入できましたが…やや重い。まったく実用に堪えないかというと、そんなこともないのですが、重い。さすがに旧世代のRaspberry Piにはしんどいのだろうか。そう思って、普通のCentOS 6.6をインストールしているサーバーにRedmineを導入してみたところ、これは軽い。やはり負荷が大きかったようです。うーん、Raspberry Pi 2であればどうだろう？&lt;/p&gt;&#10;&lt;p&gt;しかし、CentOSサーバーに導入するときは色々とひっかかったのですが、Raspberry Piへのインストールは本当にすんなりといきました。この環境構築のしやすさはたいへん素晴らしいですね。&lt;/p&gt;</description></item><item><title>MiniDLNAをufwで許可する(Ubuntu Server 12.04)</title><link>https://hack-le.com/27494807-2/</link><pubDate>Sun, 26 May 2013 17:28:39 +0900</pubDate><guid>https://hack-le.com/27494807-2/</guid><description>&lt;p&gt;メディアサーバーソフトであるMiniDLNAでの通信を許可するよう、ファイアウォールで設定します。環境はUbuntu Server 12.04とMiniDLNA。OSがUbuntuなので、ファイアウォールの設定をいじるipatablesのフロントエンドであるufwが使えます。なので、ufwで設定を行います。&lt;/p&gt;&#10;&lt;p&gt;まずMiniDLNAで使うPort番号をチェックします。設定ファイル/etc/minidlna.confを開きます。&lt;/p&gt;&#10;&lt;pre&gt;`$ less /etc/minidlna.conf&#13; `&lt;/pre&gt;&#13;&#10;&lt;p&gt;で、port=の部分を探します。というか多分1,2行目です。&lt;/p&gt;&#10;&lt;pre&gt;`# port for HTTP (descriptions, SOAP, media transfer) traffic&#13; port=8200&#13; `&lt;/pre&gt;&#13;&#10;&lt;p&gt;デフォルトでは8200のはずです。特に問題なければこのまま。いじりたければ適当に。次に、ufwで使う設定ファイルを作成します。&lt;/p&gt;&#10;&lt;pre&gt;`$ sudo emacs /etc/ufw/applications.d/minidlna&#13; `&lt;/pre&gt;&#13;&#10;&lt;p&gt;まぁ名前はなんでもいいし、編集エディタはviでもなんでもよいのですが。で、次のように作成しました。&lt;/p&gt;&#10;&lt;pre&gt;`[MiniDLNA]&#13; title=Media Server&#13; description=lightweight DLNA/UPnP-AV server&#13; ports=8200/tcp&#13; `&lt;/pre&gt;&#13;&#10;&lt;p&gt;[MiniDLNA]がルールの名前になります。で、ports=8200/tcpが、8200番でTCP通信という意味になります。もしポート番号を変更していれば、この部分も適宜修正します。メディアサーバーなので最初UDPかと思い込んでいたのですが、そんなことなかったです。そうしたら、次のコマンドで設定し、ufwを再起動すればOKです。&lt;/p&gt;&#10;&lt;pre&gt;`$ sudo ufw allow from 192.168.1.0/24 to any app 'MiniDLNA'&#13; $ sudo service ufw restart&#13; `&lt;/pre&gt;&#13;&#10;&lt;p&gt;IPアドレスは適宜都合のいいように変えてください。なお、/etc/ufw/applications.d/minidlnaを修正したら、&lt;/p&gt;&#10;&lt;pre&gt;`$ sudo ufw app update 'MiniDLNA'&#13; `&lt;/pre&gt;&#13;&#10;&lt;p&gt;です。&lt;/p&gt;&#10;</description></item><item><title>Mac miniをTime Machineサーバーにした</title><link>https://hack-le.com/26479988-2/</link><pubDate>Sat, 04 May 2013 18:00:24 +0900</pubDate><guid>https://hack-le.com/26479988-2/</guid><description>&lt;p&gt;2015/12/17：いまさらな追記ですが、実際に運用しだすと、エラーがよく発生したので、結局この機能は使わなくなりました。&lt;/p&gt;&#10;&lt;p&gt;本記事は、Mac miniにOSX サーバーを導入し、Time Machineサーバーにした記録の記事です。追記のように、紆余曲折あって、現在は普通に外付けハードディスクによる運用をしています。&lt;/p&gt;&#10;&lt;h2 id="mac-mini購入して半年"&gt;Mac mini購入して半年&#10;&lt;/h2&gt;&lt;p&gt;Mac mini Late 2012を購入してもうすぐ半年になりましょうか。長らく自作のWin機をメインに使っていましたが、先月くらいからMac miniのほうにシフトしました。自作機はCPUがAMDのA8-3870Kで、これはこれで優秀なCPUですし、グラフィック機能も高いし、さらに元MBAのフラッシュメモリを使用したのでデータのIOもなかなか高速、とまぁマシン自体のバランスがよく、またWindowsにしか対応しないアプリもあり、なかなか移行しきれないところがありました。が、やはりOSXのほうがなにかと便利。Unixの資産も楽に使えるし、メインノートのMBAとの相性もよし。&lt;/p&gt;&#10;&lt;p&gt;というわけで最近ようやくあれこれと環境を整えて、Mac miniをメインのデスクトップマシンとして使うようになりました。現在SSDに換装するかどうかで悩んでいます。Win機もちょこちょこ使ってますけどね。&lt;/p&gt;&#10;&lt;h2 id="mac-mini-をtimemachineサーバーに"&gt;Mac mini をTimeMachineサーバーに&#10;&lt;/h2&gt;&lt;p&gt;とまぁ長い前振りでしたが、今回&lt;strong&gt;Mac miniをTime Machineのサーバーにしました&lt;/strong&gt;。具体的には、Mac miniに外付けハードディスクをとりつけ、そのハードディスクをMBAから無線でアクセスしバックアップを実行できるようにしました。&lt;/p&gt;&#10;&lt;p&gt;やること自体は単純で、OS X Server(1,700円)を購入し、Time Machineサービスを入にして、バックアップの作成先に外付けハードディスクを指定するだけです。つまり&lt;strong&gt;金払っただけ&lt;/strong&gt;です。&lt;/p&gt;&#10;&lt;p&gt;手順としては下記記事を参考にしました。&lt;/p&gt;&#10;&lt;p&gt;（1,700円から始めるお手軽タイムマシンサーバー » I messageな日々 | I messageな日々 &lt;a class="link" href="http://imessage-hibi.com/archives/496" target="_blank" rel="noopener"&#10; &gt;http://imessage-hibi.com/archives/496&lt;/a&gt; ）&lt;/p&gt;&#10;&lt;p&gt;そうすると、他のMacマシンからも指定した外付けハードディスクが見えるようになります。アクセスする際には、OS X Serverで登録しているユーザー名ないしApple IDが使えるのですが、参考記事の人と同様私もApple IDではアクセスできませんでした。いったいなぜ？まぁ別に構わないのですが。&lt;/p&gt;&#10;&lt;p&gt;いずれにせよ、これだけでも1,700円分の価値はあるかと思います。Time Capsule高いんだもの。さらにOS X Serverはなかなか多機能であるようですので、せっかく買ったのだからいろいろ調べて遊んでいきたいと思います。&lt;/p&gt;&#10;&lt;p&gt;やはりMacで揃えるといろいろとやりやすいものです囲い込まれているともいいます。Mac mini、MacbookAir、iPad、iPhone、iPod Classic、Apple TV…。現在家にあるApple製品です。振り返ってみるとひどい。でもiMacもなければマジックマウスもMagic Trackpadもないのがにわかマカーっぽいところです。なんだかんだでMac歴はまだ二年半ほどです。ちなみにiPod Touchももっていましたが、先日友人にあげました。お前も知らない間にマカーになるがいい。もともとはiPodをもってるだけの窓少年だったのに、数年の年月をかけて立派に貢ぐようになりました…。&lt;/p&gt;</description></item><item><title>小型のメディアサーバー兼NASをたてる その5 〜メディアサーバー(DLNA)編〜</title><link>https://hack-le.com/20075239-2/</link><pubDate>Tue, 13 Nov 2012 08:28:42 +0900</pubDate><guid>https://hack-le.com/20075239-2/</guid><description>&lt;p&gt;&lt;a class="link" href="//hack-le.com/19920233-2/" &gt;前回&lt;/a&gt;までで、遠隔操作ができて、ファイルサーバーとしても使えるようになりました。これだけでもいわゆるNASとしての機能はあるわけですが、せっかくのサーバーなのでもっと機能を追加します。今回のテーマはDLNAサーバーです。&lt;/p&gt;&#10;&lt;p&gt;環境：Ubuntu Server 12.04&lt;/p&gt;&#10;&lt;h2 id="dlnaについて"&gt;DLNAについて&#10;&lt;/h2&gt;&lt;p&gt;DLNA(Digital Living Network Association)とは、各メディア機器でネットワークを構成し、他端末からメディアファイルを再生したりなんだりするための規格です(参考：&lt;a class="link" href="http://allabout.co.jp/gm/gc/51191/" target="_blank" rel="noopener"&#10; &gt;5分でよく分かる〜DLNAとは？ [ホームシアター] All About&lt;/a&gt;)。具体例をあげると、スマートフォンからサーバーにアクセスして、置いてある動画ファイルをストリーミングするといったことが可能になります。サーバーマシンにはDLNAサーバーソフト、そして操作を行う端末にはDLNAクライアントソフトがそれぞれ必要です。&lt;/p&gt;&#10;&lt;p&gt;今回実装するのは、DLNAサーバーのほうです。DLNAクライアントについても、自分が使っているものについてだけちょろっと書きます。&lt;/p&gt;&#10;&lt;h2 id="minidlna"&gt;MiniDLNA&#10;&lt;/h2&gt;&lt;p&gt;DLNAサーバーを実現させるソフトウェアとしては、Mediatombが有名です。が、Mediatombは開発が止まって久しく、また多機能である分設定がなども複雑であるようです。私が今回もっとも参考にした&lt;a class="link" href="http://ascii.jp/elem/000/000/712/712153/" target="_blank" rel="noopener"&#10; &gt;ASCII.jp：NASになったHP MicroServerで動画も配信｜MicroServerとSambaで作るオリジナルNAS&lt;/a&gt; では、より簡潔で使いやすく必要十分なソフトウェアとしてMiniDLNAをあげています。で、私もそれを使うことにしました。実際、驚くほど簡単に導入できました。&lt;/p&gt;&#10;&lt;h3 id="インストールと設定"&gt;インストールと設定&#10;&lt;/h3&gt;&lt;p&gt;まずインストールです。&lt;/p&gt;&#10;&lt;pre&gt;`$ sudo apt-get install minidlna&#13; `&lt;/pre&gt;&#13;&#10;&lt;p&gt;Ubuntuは本当に便利ですね。次に設定ファイルを編集します。設定ファイルは/etc/minidlna.confです。いじる場所はファイルの置き場です。私の場合は以下。&lt;/p&gt;&#10;&lt;pre&gt;`media_dir=/home/user/data&#13; `&lt;/pre&gt;&#13;&#10;&lt;p&gt;適宜置き換えます。&lt;/p&gt;&#10;&lt;p&gt;さて、注意なのですが、共有ファイルについては、ディレクトリに実行権限を与えてやらないといけません。でないとクライアントソフトからディレクトリが見えませんでした。私の場合は共有ディレクトリのパーミッションはすべて775にしています。緩いのかもしれませんが…。&lt;/p&gt;&#10;&lt;p&gt;で、終わったら&lt;/p&gt;&#10;&lt;pre&gt;`$ sudo service minidlna force-reload&#13; `&lt;/pre&gt;&#13;&#10;&lt;p&gt;で設定を反映させます。設定ファイルをいじったときだけでなく、共有ディレクトリの中身をいじったときにもやってあげる必要があるみたいです。新しくディレクトリをつくったり、ディレクトリの名前を変更したりなんだりすると、反映されなかったりクライアントから(null)というディレクトリが見えたりします。&lt;/p&gt;&#10;&lt;p&gt;DLNAサーバーの設定については以上です。Sambaなんかよりよほど簡単ですね。今回はほとんど上記で紹介した参考記事通りに進めることができました。&lt;/p&gt;&#10;&lt;h2 id="dlnaクライアントソフト"&gt;DLNAクライアントソフト&#10;&lt;/h2&gt;&lt;p&gt;DLNAのクライアントソフトですが、OSによって様々です。が、参考記事にもあるように、基本的にちょっと鬼門である様子。&lt;/p&gt;&#10;&lt;h3 id="windowsの場合はwmp"&gt;Windowsの場合はWMP&#10;&lt;/h3&gt;&lt;p&gt;Windowsであれば、最近のWindows Media Player(WMP)が標準でDLNAに対応しています。たしかバージョン11か12あたりからです。なにげにWindows Media PlayerはDLNAサーバーの機能もあったりして優秀です。ライブラリの管理もそれなりに楽でわかりやすそうでしたし、使えない印象がありましたが、いつのまにか進化を遂げていました。まぁ、使いませんけど。&lt;/p&gt;&#10;&lt;h3 id="macやlinuxではうーん"&gt;MacやLinuxでは…うーん&#10;&lt;/h3&gt;&lt;p&gt;MacやLinuxはどうなんでしょう。少なくとも自分は何も使っていません。&lt;/p&gt;&#10;&lt;h3 id="タブレットスマートフォンの場合"&gt;タブレット、スマートフォンの場合&#10;&lt;/h3&gt;&lt;p&gt;DLNAクライアントの需要が大きいのはタブレットおよびスマートフォンのほうだと思います。iOSについては、私はAce Playerというソフトを使っています。元々250円くらいだったと思いましたが、いつのまにか450円になっていました。さらに前バージョンとは互換性がなく、私のAce Playerはもう古いようです。でも使えるので特に買い直したりはしていません。私はApple TVももっているので、これと組み合わせることで、テレビの大画面で動画を視聴することもできたりします。けっこうオススメです。でもAppleに囲い込まれまくってて辛い。&lt;/p&gt;&#10;&lt;p&gt;Androidについては、UPnPlayなるものを使っています。これも普通に使えます。Nexus 7で動画見るの楽しいです。Nexus 7解像度的にも最近の動画と相性がよいです。&lt;/p&gt;&#10;&lt;h2 id="おわり"&gt;おわり&#10;&lt;/h2&gt;&lt;p&gt;以上で、5回に渡ってつらつら書き綴った、小型のメディアサーバー兼NASをたてるの記事を終わります。&lt;a class="link" href="http://ascii.jp/elem/000/000/710/710331/" target="_blank" rel="noopener"&#10; &gt;ASCII.jp：HP MicroServer×Ubuntu ServerでNAS作り｜MicroServerとSambaで作るオリジナルNAS&lt;/a&gt;の元となるUbuntu Magazineの記事を見て始めたわけですが、いざ自分でやってみるとちょいちょい詰まるところもあったので、そんなところも含めてブログにまとめてみました。ここまでの内容をまとめると、HP MicroServerに、2TBのハードディスクを4本組み込んでRAIDを構築し、SSHサーバーを導入して遠隔操作ができるようにし、Sambaを導入してファイルサーバーとしての機能をもたせ、MiniDLNAによりメディアサーバーとしての機能ももたせた、といったところです。あとはこれを運用していくわけですが、たまにアップデートしたりログを監視したりするくらいで、特にたいへんなことはありません。構築さえクリアすれば、後は薔薇色の自堕落生活が待っている…！&lt;/p&gt;&#10;&lt;p&gt;とはいえ、今後もあれこれサーバーをいじるにしたがってなんだかんだとサーバー絡みの記事も増やしていくと思います。目下の目標は似非Dropboxみたいなことをしたい、とか、音楽を外部にストリーミングで流したい、とかです。が、今はまだそこまで手が回っていません。ひとまずこれにて。&lt;/p&gt;</description></item><item><title>小型のメディアサーバー兼NASをたてる その4 〜ファイルサーバー(Samba)編〜</title><link>https://hack-le.com/19920233-2/</link><pubDate>Fri, 09 Nov 2012 09:13:58 +0900</pubDate><guid>https://hack-le.com/19920233-2/</guid><description>&lt;p&gt;&lt;a class="link" href="//hack-le.com/19513021-2/" &gt;前回&lt;/a&gt;までで遠隔操作でサーバーを扱えるようになったので、今回はsambaを導入してファイルサーバーの機能をもたせます。これでようやくサーバーらしくなります。&lt;/p&gt;&#10;&lt;h2 id="samba"&gt;Samba&#10;&lt;/h2&gt;&lt;p&gt;SambaはWindowsマシンとファイル共有を行うためのソフトウェアです。非常に多機能でプリンタサーバーの機能もあったりするようですが、今回使うのはあくまでWindowsマシンとのファイル共有を目的とします。指定のIPアドレスから、パスワードなどを入力することで閲覧・編集できるような共有フォルダを目指します。&lt;/p&gt;&#10;&lt;h3 id="インストールとユーザー設定"&gt;インストールとユーザー設定&#10;&lt;/h3&gt;&lt;p&gt;とりあえずsambaをさくっとインストールします。&lt;/p&gt;&#10;&lt;pre&gt;`$ sudo apt-get install samba`&lt;/pre&gt;&#13;&#10;&lt;p&gt;Sambaの実行、停止は、&lt;/p&gt;&#10;&lt;pre&gt;`$ sudo service smbd start&#13; $ sudo service smbd stop`&lt;/pre&gt;&#13;&#10;&lt;p&gt;です。&lt;/p&gt;&#10;&lt;p&gt;さて、インストールしたらSambaのユーザーを作成します。Sambaのユーザーは、まず大元のLinuxマシン自体のユーザーである必要があります。&lt;/p&gt;&#10;&lt;pre&gt;`$ sudo pdbedit -a user`&lt;/pre&gt;&#13;&#10;&lt;p&gt;userの部分にユーザーの名前を代入します。&lt;strong&gt;パスワードは、通常Linuxシステムでユーザーに紐付けしてるパスワードと一緒にします&lt;/strong&gt;。sambaのユーザーのパスワードを変えるとLinuxのほうも変わっちまいます。パスワードはLinuxシステムのものと同じで。デフォルトでシステムのユーザーのアカウントと紐付けされているらしく、ユーザーが一人の場合は特にあれこれする必要はない、ということが下記の参考サイトでは記述されていましたが、一応私はやっています。というかやらないとログインできなかったのですが…。うーん…（参考：「&lt;a class="link" href="http://ubuntu.asciimw.jp/elem/000/000/010/10465/" target="_blank" rel="noopener"&#10; &gt;Ubuntu Magazine Japan vol.07記事を公開&lt;/a&gt;にある、MicroServerとSambaで作るオリジナルNAS」）&lt;/p&gt;&#10;&lt;h3 id="設定ファイル"&gt;設定ファイル&#10;&lt;/h3&gt;&lt;p&gt;次に設定ファイルをいじります。設定ファイルは/etc/samba/smb.confです。けっこういじいじするところがあります。なお&lt;strong&gt;行頭の ; は コメントアウトですので、必要な部分は適宜外していきましょう&lt;/strong&gt;。まず以下のようになものをGlobal Settingsの下に追記します。&lt;/p&gt;&#10;&lt;pre&gt;`[global]dos charset = CP932&#13; unix charset = UTF-8&#13; display charset = UTF-8&#13; server string = %h server (Samba, Ubuntu)&#13; local master = yes&#13; security = user&#13; `&lt;/pre&gt;&#13;&#10;&lt;p&gt;&lt;strong&gt;主に文字コード絡みの設定&lt;/strong&gt;です。以下の項目を次のように変更します。&lt;/p&gt;&#10;&lt;pre&gt;`workgroup = WORKGRUOP&#13; map to geust = Bad User&#13; interfaces = 127.0.0.0/8 eth0 192.168.1.0/24&#13; `&lt;/pre&gt;&#13;&#10;&lt;p&gt;&lt;strong&gt;WORKGROUPの部分は任意のネットワーク名&lt;/strong&gt;で。Windows 7のデフォルトがWORKGROUPなので、たいていはこのままでいいはず。map to geust = Bad UserはLinuxに存在しないユーザーでのアクセスはゲストとして扱う…とのこと（参考：「&lt;a class="link" href="http://debianj.com/ubuntu/install/samba.html" target="_blank" rel="noopener"&#10; &gt;Samba でファイルサーバー構築 | 自宅サーバー Debian/Ubuntu&lt;/a&gt;」）。interfaces = 127.0.0.0/8 eth0 192.168.1.0/24は&lt;strong&gt;アクセスを許可するアドレスの指定&lt;/strong&gt;です。security = userは自分とeth0、および192.168.1.0-255からsambaへのアクセスを許可する設定です。&lt;strong&gt;ユーザー名とパスワードを利用した、ユーザー認証を用いたやり方でアクセスする&lt;/strong&gt;、ということです。&lt;/p&gt;&#10;&lt;p&gt;最後に、以下を追記します。&lt;/p&gt;&#10;&lt;pre&gt;`[share]&#13; comment = user share&#13; path = /home/user/data&#13; guest ok = no&#13; valid users = user&#13; browseable = yes&#13; writable = yes&#13; dos filetimes = yes&#13; force create mode = 0774&#13; force directory mode = 0775&#13; force group = user&#13; share modes = yes&#13; `&lt;/pre&gt;&#13;&#10;&lt;p&gt;&lt;strong&gt;[share], path, valid users, force group の部分は適宜環境に合うように変えます&lt;/strong&gt;。ユーザー名はuserと仮定しています。うちの場合は~/dataをSambaで共有したいので、こうなりました。&lt;/p&gt;&#10;&lt;p&gt;これで、~/dataが、Windowsなどからはネットワークより「share」フォルダとして見えます。またユーザーやらグループの設定を設定をしないと、たしか作ったファイルがnobodyとかnogruopになってしまいます。作成するファイルの権限も設定しておきます。774や775はひょっとするとちょっとゆるゆるなのかもしれませんが、まぁ基本的には自分が一人で使う用の設定なので…。&lt;/p&gt;&#10;&lt;p&gt;とまぁ、設定が終わったら反映させます。&lt;/p&gt;&#10;&lt;pre&gt;`$ sudo service smbd reload&#13; $ sudo service smbd restart&#13; `&lt;/pre&gt;&#13;&#10;&lt;p&gt;&lt;strong&gt;reload&lt;/strong&gt;で設定ファイルを読み込みます。&lt;strong&gt;restart&lt;/strong&gt;で再起動です。まだ起動してなかったら&lt;strong&gt;start&lt;/strong&gt;ですが。で、Winodwsマシンのネットワークに表示されるようになったらOKです。自分の場合はうまくいかなくて、結局smbpasswd -a user コマンドを実行したのですが。pdbeditと同じです。samba2.x系ではこっちが使われていて、3.x系以降ではpdbeditが使われるようになったそうです。うーん、pdbedit使えば必要ないはずなんですけど…入力失敗したの気づいてなかったのだろうか。それでもうまくいかなかったらマシンの再起動とか設定ファイルの見直しとかいろいろ頑張ります。設定ファイル的にはこれで問題ないと思うのですが…。&lt;/p&gt;&#10;&lt;p&gt;というわけで、ファイルサーバーができました。これでぐっと実用度があがりました。次はDLNAクライアントからアクセスできるように、DLNAサーバーの機能をもたせます。けっこう本格的に家庭内メディアサーバーとして使えるようになります。&lt;/p&gt;&#10;&lt;p&gt;&lt;a class="link" href="//hack-le.com/20075239-2/" &gt;小型のメディアサーバー兼NASをたてる その5 〜メディアサーバー(DLNA)編〜 : 或る阿呆の記&lt;/a&gt;&lt;/p&gt;</description></item><item><title>Ace PlayerでDLNAサーバー(MiniDLNA)上のフォルダが更新されないときのメモ</title><link>https://hack-le.com/19596475-2/</link><pubDate>Wed, 31 Oct 2012 22:33:03 +0900</pubDate><guid>https://hack-le.com/19596475-2/</guid><description>&lt;h2 id="minidlnaで変更が即時反映されない時の対処"&gt;MiniDLNAで変更が即時反映されない時の対処&#10;&lt;/h2&gt;&lt;p&gt;Ace PlayerをDLNAクライアントとして、MiniDLNAで構築しているサーバーにアクセスしたとき、サーバー上でフォルダを作ったりなんだりしたものが即時には反映されないときの対処メモ。なおサーバーのOSはUbuntu Server 12.04。&lt;/p&gt;&#10;&lt;p&gt;既存のディレクトリに新しくファイルを追加したり、ファイルを移動させたりする分には問題ないようだが、新しくディレクトリをつくったり、フォルダに実行権限を与えてアクセスできるようにしたりすると、変更が即時には反映されず、場合によってはフォルダが(null)という名前に変わっていたりするようだ。&lt;/p&gt;&#10;&lt;p&gt;そんなときは、&lt;/p&gt;&#10;&lt;pre&gt;`$ sudo service minidlna force-reload`&lt;/pre&gt;&#13;&#10;&lt;p&gt;を行えば、表示されるフォルダが再構築される。ただし構築し終わるには、ファイルの量によっては多少時間がかかる。といっても数分程度の話。&lt;/p&gt;&#10;</description></item><item><title>小型のメディアサーバー兼NASをたてる その3 〜初期設定、SSH編〜</title><link>https://hack-le.com/19513021-2/</link><pubDate>Tue, 30 Oct 2012 00:44:13 +0900</pubDate><guid>https://hack-le.com/19513021-2/</guid><description>&lt;h2 id="ネットワーク周りの設定"&gt;ネットワーク周りの設定&#10;&lt;/h2&gt;&lt;p&gt;&lt;a class="link" href="//hack-le.com/19271208-2/" &gt;前回&lt;/a&gt;まででひとまずPCとして最低限のことはできるようになったわけですが、それだけではサーバーとは言えないので、今回からようやく各種機能を実現するソフトウェアの設定にとりかかります。といっても、今回は主にネットワーク絡みの設定をちょちょいとするだけです。具体的には、&lt;strong&gt;他のPCから遠隔操作するための設定&lt;/strong&gt;です。&lt;/p&gt;&#10;&lt;p&gt;やることはIPアドレスを固定し、SSHの設定をちょこっとだけ見直すだけです。&lt;/p&gt;&#10;&lt;h2 id="ipアドレスの固定"&gt;IPアドレスの固定&#10;&lt;/h2&gt;&lt;p&gt;IPアドレスの固定には大別して二種類あります。PC側で固定する方法と、ルータ側からMACアドレス指定で固定する方法です。OSを頻繁に入れ換えたり、ノートパソコンであちこち移動する端末でIPを固定したいのであれば、ルータ側から制御するほうが合理的だと思います。ただルータによってはできないものもあるようです…。今回は据え置きのサーバーで、特にOSを入れ換えたりというのもしませんから、PC側でIPアドレスを固定します。&lt;/p&gt;&#10;&lt;p&gt;Ubuntuでは、/etc/network/interfacesを編集し、serviceでnetworkingを再起動させます（参考「&lt;a class="link" href="http://blog.veryposi.info/server/server-setup/ubuntu-interfaces/" target="_blank" rel="noopener"&#10; &gt;UbuntuのＩＰアドレスをDHCPから固定IPへ変更 | PHPプログラマのバリ・ポジ情報ブログ&lt;/a&gt;」）。&lt;/p&gt;&#10;&lt;p&gt;参考リンクにあるとおりに設定すればよいのですが、/etc/network/interfacesの記述でこれに一つだけ付け加えます。DNSサーバーのアドレス設定です。多くの場合はルータのアドレスになると思います。我が家の場合は下記です。&lt;/p&gt;&#10;&lt;pre&gt;`dns-nameservers 192.168.1.1`&lt;/pre&gt;&#13;&#10;&lt;p&gt;多くのディストリビューションでは、/etc/resolv.confを編集してDNSを指定することになると思いますが、Ubuntu12.04において/etc/resolv.confは手動で設定すべきではない項目とされているらしく、/etc/network/interfacesの内容に従って起動時に/etc/resolv.confが生成される模様です。したがって、/etc/network/interfacesでDNSサーバーを設定せずに/etc/resolv.confのみを書き換えても、再起動時にリセットされてしまうので意味がありません（参考：「&lt;a class="link" href="http://blog.veryposi.info/server/server-setup/ubuntu-interfaces/" target="_blank" rel="noopener"&#10; &gt;Ubuntu 12.04 アップグレードでネット接続不能 | www.hbirds.net&lt;/a&gt;」）。&lt;/p&gt;&#10;&lt;p&gt;最終的に、/etc/network/interfacesの内容は下記のようになりました(以下は我が家の場合)。&lt;/p&gt;&#10;&lt;pre&gt;`# The loopback network interface&#13; auto loiface lo inet loopback&#13; # The primary network interface&#13; auto eth0&#13; iface eth0 inet static&#13; address 192.168.1.10&#13; netmask 255.255.255.0&#13; network 192.168.1.0&#13; broadcast 192.168.1.255&#13; gateway 192.168.1.1&#13; dns-nameservers 192.168.1.1&#13; `&lt;/pre&gt;&#13;&#10;&lt;p&gt;終わったら、&lt;/p&gt;&#10;&lt;pre&gt;`$ sudo service networking stop$ sudo service networking start`&lt;/pre&gt;&#13;&#10;&lt;p&gt;でサービスを再起動させて終了です。&lt;/p&gt;&#10;&lt;h2 id="sshサーバー"&gt;SSHサーバー&#10;&lt;/h2&gt;&lt;h3 id="sshの用意"&gt;SSHの用意&#10;&lt;/h3&gt;&lt;p&gt;IPアドレスを固定したら、遠隔操作を行うためにSSHの設定を行います。ssh(Secure SHell)は通信プロトコルの一種で、通信が暗号化されておりセキュアだとされています。インストール時に導入するソフトでSSHをチェックしていればデフォルトで使用できますが、そうでない場合は$ sudo apt-get install sshなどでインストールします。ちなみにソフトウェアの名前はOpenSSHです。外部ネットワークから特に接続する予定がないのであれば、これといって設定することはありません。このまま使えばOKです。&lt;/p&gt;&#10;&lt;pre&gt;`$ sudo service ssh start`&lt;/pre&gt;&#13;&#10;&lt;p&gt;で起動します。&lt;/p&gt;&#10;&lt;h3 id="リモートログイン"&gt;リモートログイン&#10;&lt;/h3&gt;&lt;p&gt;他のマシンから、端末を開いて&lt;/p&gt;&#10;&lt;pre&gt;`$ ssh ユーザー名@IPアドレス`&lt;/pre&gt;&#13;&#10;&lt;p&gt;でログインすることができます。他のマシンがMacやLinuxであれば、標準のターミナルから問題なく入ることができますが、Windowsマシンの場合は自分でSSHクライアント対応のソフトウェアを用意しなくてはいけません。ターミナルソフトを利用するのがもっともお手軽です。私はTera Termを使っていますが、使い方などの詳細はここでは省きます。&lt;/p&gt;&#10;&lt;h3 id="外部からログインする場合"&gt;外部からログインする場合&#10;&lt;/h3&gt;&lt;p&gt;自宅内だけでなく、外出先などからもリモートログインして操作を行いたいのであれば、最低限しておくべき設定がいくつかあります。ルートログインの禁止と、パスワード認証の禁止です。sshサーバーは非常に攻撃を受けやすく、パスワード認証の場合、でたらめな値を入れ続けいればいつかは破られてしまいます。ブルートフォース攻撃というやつですね。ただし、パスワード認証をしない場合、鍵認証というものをしなくてはなりません（「&lt;a class="link" href="//hack-le.com/20462465-2/" &gt;SSHで鍵認証を用いて、パスワードなしでログインする方法 : 或る阿呆の記&lt;/a&gt;」）&lt;/p&gt;&#10;&lt;p&gt;設定ファイルである/etc/ssh/sshd_configファイルをちょちょいと編集します。PermitRootLogin noPasswordAuthentication noとすればOKです。そうしたら、あとはサービスを再起動します。&lt;/p&gt;&#10;&lt;pre&gt;`$ sudo service ssh restart`&lt;/pre&gt;&#13;&#10;&lt;p&gt;あとはポート番号とかも変えたりするとなおよいです。SSHサーバーのセキュリティについては、ググればいくつも情報が出てくるので、少しずつ強化していけばよいと思います。&lt;/p&gt;&#10;&lt;p&gt;以上で遠隔操作のための手順を終わります。これで自由にいろんな端末から管理できるようになりました。次からようやくメディアサーバーとしての機能をもたせていくことになります。&lt;/p&gt;&#10;&lt;p&gt;&lt;a class="link" href="//hack-le.com/19920233-2/" &gt;小型のメディアサーバー兼NASをたてる その4 〜ファイルサーバー(Samba)編〜 : 或る阿呆の記&lt;/a&gt;&lt;/p&gt;</description></item><item><title>小型のメディアサーバー兼NASをたてる その2 〜RAID編〜</title><link>https://hack-le.com/19271208-2/</link><pubDate>Wed, 24 Oct 2012 01:17:21 +0900</pubDate><guid>https://hack-le.com/19271208-2/</guid><description>&lt;p&gt;&lt;a class="link" href="//hack-le.com/19182815-2/" &gt;前回&lt;/a&gt;に続いて、HPのProliant MicroServerにUbuntu Server 12.04をインストールし、DLNAサーバーやらNASやらにしてしまおうという話です。&lt;/p&gt;&#10;&lt;h2 id="構築参考記事"&gt;構築、参考記事&#10;&lt;/h2&gt;&lt;p&gt;前回まででモノの準備は整い、何のソフトを使うかも決まりました。後は構築するだけです。とはいうものの、実際にやってみるとあれこれひっかかるものです。いろいろな人の記事を参考にしました。今回のハードディスクの構成においては、ubuntu Magazine Vol.7 の P.92-97の記事、MicroServerとSambaで作るオリジナルNASという記事が参考になりました（「&lt;a class="link" href="http://ubuntu.asciimw.jp/elem/000/000/010/10465/" target="_blank" rel="noopener"&#10; &gt;Ubuntu Magazine Japan vol.07記事を公開&lt;/a&gt;」）。連載記事を元に、Web上にも記事を書かれたようです（「&lt;a class="link" href="http://ascii.jp/elem/000/000/710/710331/" target="_blank" rel="noopener"&#10; &gt;ASCII.jp：HP MicroServer×Ubuntu ServerでNAS作り｜MicroServerとSambaで作るオリジナルNAS&lt;/a&gt;」）。以上の記事では二台のHDをRAID 1のみで構成しているので、今回の環境とはだいぶ違うのですが、基本的なところは同じなのでずいぶん参考になりました。&lt;/p&gt;&#10;&lt;h2 id="osのインストールとraid"&gt;OSのインストールとRAID&#10;&lt;/h2&gt;&lt;p&gt;前回のとおり、今回の採用OSはUbuntu Server 12.04です。&lt;a class="link" href="http://www.ubuntu.com/" target="_blank" rel="noopener"&#10; &gt;Home | Ubuntu&lt;/a&gt;あまり話題になっていない気もしますが、この記事を書いている間に12.10も出ました。&lt;/p&gt;&#10;&lt;h3 id="言語の選択"&gt;言語の選択&#10;&lt;/h3&gt;&lt;p&gt;言語の選択が必要ですが、サーバー機として使う場合、言語は英語がよいと思います。エラーが出たときに、日本語よりも英語のほうが情報量が多いのが現状ですから。&lt;/p&gt;&#10;&lt;h3 id="raid"&gt;RAID&#10;&lt;/h3&gt;&lt;p&gt;あとはよくしたもので、指示通りにやればすんなりといきます。ただ今回はRAIDを組むことにしたので、その場合はパーティションの区切りなど多少考えないといけません。&lt;strong&gt;RAIDというのは、複数のHDを組み合わせて使う技術で、たとえば1台だめになっても他のHDがフォローしてデータを破損させないなどのデータ保護や、データを分散させてできるだけ同時に書き込み、読み込みを行い速度をあげるなどという機能&lt;/strong&gt;を実現できます。ハードウェアレベルで実現するものとソフトウェアレベルで実現するものがあります。&lt;/p&gt;&#10;&lt;p&gt;Linuxにはカーネルの機能としてソフトウェアRAIDが実装されていますので、今回はそれを利用します。&lt;/p&gt;&#10;&lt;h3 id="パーティションの区分け"&gt;パーティションの区分け&#10;&lt;/h3&gt;&lt;p&gt;以下はLinux標準のファイルシステムであるext4で組む場合です（参考として、ZFSを用いる場合も後述します）。パーティションの区分けとしては、各以下のようにわけました。パーティションの分け方については、先に紹介した記事の&lt;a class="link" href="http://ascii.jp/elem/000/000/710/710331/" target="_blank" rel="noopener"&#10; &gt;ASCII.jp：HP MicroServer×Ubuntu ServerでNAS作り｜MicroServerとSambaで作るオリジナルNAS&lt;/a&gt;が非常に参考になります。&lt;/p&gt;&#10;&lt;ul&gt;&#10;&lt;li&gt;/boot…ext4,300MB程度&lt;/li&gt;&#10;&lt;li&gt;/…ext4,80GB&lt;/li&gt;&#10;&lt;li&gt;スワップ…4GB&lt;/li&gt;&#10;&lt;li&gt;/home…残りの領域すべて&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;p&gt;/homeについて、残りの領域すべてところで、2TBこえのHDを扱うときには、頭に1MBの空白の領域をつくるべきだそうです。GPT(GUID Partion Table)という比較的新しいパーティションの分け方の規格にのっとるためだそうで、こうすることで従来は扱えなかった3TBのHDとかも扱えるようになるとのこと。でも今回は2TBだし、いらないんじゃないかなぁと思って特に作成しませんでした。&lt;/p&gt;&#10;&lt;p&gt;&lt;strong&gt;/bootはブートフラグをONにする&lt;/strong&gt;ことを忘れずに。容量が少ないと、古いカーネルですぐにいっぱいになって、/bootをいじることになります。まぁ専用のコマンドがあるのですが、面倒ですし、ちょっと焦ります。&lt;/p&gt;&#10;&lt;p&gt;ところで/bootにはブートローダーであるGrubをインストールするわけですが、このGrubははext2までしか対応していないなんて記事も散見されました。が、実際ext4でなんの問題もありませんでした。恐らくバージョンアップを重ねて対応するようになったのでしょう。今でも古いGrubを用いたディストリビューションなんかでは、ext2が無難なのだろうと思います。&lt;/p&gt;&#10;&lt;p&gt;さて、パーティションをわけたら次はRAIDの設定です。RAIDの設定の仕方についても、上記の記事が参考になりますが、問題はRAIDレベルです。/bootはこれまたGrubの関係上、RAID-1までしかダメなようです。さらに&lt;a class="link" href="https://user.miraclelinux.com/technet/faq/data/00080.html" target="_blank" rel="noopener"&#10; &gt;ミラクル・リナックス：ブートディスクをソフトウェア RAID 1 (ミラーリング) に構成する際の注意&lt;/a&gt;なんていう問題もあるようです。RAIDといいながら、一つのディスクにしかインストールされないという問題ですね。&lt;/p&gt;&#10;&lt;p&gt;とはいえ最初のインストールの段階ではどうしようもないことのようなので、そこは気にせず/bootはRAID-1を組んでしまいました。次に/と/homeですけれど、これはRAID-5がよいと思います。目的がメディアサーバーなのである程度の容量も欲しい、といってせっかくだから少しは冗長性も…となるとRAID-5になってしまいますね。壊れるときは壊れるんだという豪気な人ならRAID-0もいいかもしれないし、そこまで容量いらねーよって人ならRAID-10が速度とそれなりの堅牢さを兼ね備えてよいかもしれません。（2015/09/26追記：私の今はRAID-1が好きです。まぁそもそも個人用途じゃWebサーバーでもない限りRAIDいらないなぁと思いつつ、どうせRAID組むなら堅牢にいきたい、という風に考えるようになりました）&lt;/p&gt;&#10;&lt;h2 id="次回はソフトウェアの導入"&gt;次回はソフトウェアの導入&#10;&lt;/h2&gt;&lt;p&gt;以上でパーティションの作成を終えます。インストール画面であれこれする方法のほかに、インストールメディアからLiveでUbuntuを立ち上げて、その状態から端末を開き、直接fdiskコマンドでいじってしまうという方法もあります。次のZFSを用いる場合は、この方法を使うことになります。以上でRAID構築編は終わりです。最後に最初に導入するソフトウェアを選択するわけですが、サーバーとして使う場合は出来るだけ最小構成が基本です。ソフトウェアが増えれば、それだけバグやセキュリティホールの恐れも増えるということでしょう。とはいえ、さすがにSSHくらいは最初から導入しておいてもよいのではないかと思います。というわけで私はBaseにSSHを加えてインストールを行いました。次からソフトウェアの導入に入ります。&lt;/p&gt;&#10;&lt;p&gt;&lt;a class="link" href="//hack-le.com/19513021-2/" &gt;小型のメディアサーバー兼NASをたてる その3 〜初期設定、SSH編〜 : 或る阿呆の記&lt;/a&gt;&lt;/p&gt;&#10;&lt;h2 id="おまけzfs"&gt;おまけ：ZFS&#10;&lt;/h2&gt;&lt;p&gt;以下はZFSについての記事です。最初、物珍しさでZFSでフォーマットしてRAID-Zなんて組んで喜んでいましたが、パフォーマンスがでなかったことや再インストール時にいろいろめんどくさかったなどの事情で、今は使っていません(2013年5月24日現在)。参考までに。&lt;/p&gt;&#10;&lt;h3 id="zfsでraid-zを組む"&gt;ZFSでRAID-Zを組む&#10;&lt;/h3&gt;&lt;p&gt;ZFSを使わなければ、前項までの手順です。が、ZFSを用いたい場合は、多少手順が煩雑になります。私の場合は諸事情のため、ややこしいのすが/bootと/はext4、/homeはZFSにしました。あんまりオススメできません。やるならどーんと/からまるごとZFSにしたほうがわかりやすいというものです。わかりやすさは正義です。わかりづらいことはただそれだけでトラブルの原因になります。ただし、/bootだけはZFSに対応していないのでext4にするしかないようです。ZFSおよびRAID-Zの利用については、以下の記事を参考にしました。&lt;/p&gt;&#10;&lt;ul&gt;&#10;&lt;li&gt;&lt;a class="link" href="http://www.blackpig.jp/?p=214" target="_blank" rel="noopener"&#10; &gt;Ubuntu 12.04 LTS Precise Pangolin で Native ZFS | 自分用メモ&lt;/a&gt;ルートからまるっとZFSする場合。とてもわかりやすかったです。&lt;/li&gt;&#10;&lt;li&gt;&lt;a class="link" href="https://github.com/dajhorn/pkg-zfs/wiki/HOWTO-install-Ubuntu-to-a-Native-ZFS-Root-Filesystem" target="_blank" rel="noopener"&#10; &gt;HOWTO install Ubuntu to a Native ZFS Root Filesystem · dajhorn/pkg-zfs Wiki · GitHub&lt;/a&gt;英語ですが、上と合わせてよむとわかりやすいでしょう。&lt;/li&gt;&#10;&lt;li&gt;&lt;a class="link" href="http://blog.goo.ne.jp/66cri/e/eda2966680f927be8818fc998fdba1ea" target="_blank" rel="noopener"&#10; &gt;Ubuntu 11.04 on a Native ZFS root 後編 - へたれ日記。&lt;/a&gt;バージョンは11.04ですが解説付きでありがたかったです。fdiskのコマンドについてもわかります。&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;p&gt;ZFSを利用するためのリポジトリを読み込むときのコマンドが記事によって異なるのは、バージョンの差異のためでしょう。Ubuntu12.04においては、apt-add-repository ppa:zfs-native/dailyが正しいです。&lt;/p&gt;&#10;&lt;p&gt;ただルートでやる場合、私はどういうわけか debootstrap precise /mntだったかのコマンドが途中でとまるのか知りませんが、永遠に終わりませんでした。原因はよくわかりません。それで/をZFS化するのをなくなく諦め、/は通常通りext4でフォーマットし、/homeのみZFSでフォーマットしてRAID-Zにすることにしました。やり方は&lt;a class="link" href="http://hirom.net/?p=317" target="_blank" rel="noopener"&#10; &gt;hirom.net» Blog Archive » UbuntuでRAIDZファイルサーバ構築メモ&lt;/a&gt;を参考にさせてもらいました。ただ、私の場合は/homeそのものをZFSで構築したかったので、&lt;/p&gt;&#10;&lt;pre&gt;`$ cd&#13; $ sudo mv home home.bak&#13; $ sudo zfs set mountpoint=/home tank/data&#13; $ sudo zfs mount tank/data&#13; `&lt;/pre&gt;&#13;&#10;&lt;p&gt;と荒っぽいことをしています。&lt;/p&gt;</description></item><item><title>小型のメディアサーバー(兼NAS)をたてる その1 〜準備編〜</title><link>https://hack-le.com/19182815-2/</link><pubDate>Sun, 21 Oct 2012 17:03:57 +0900</pubDate><guid>https://hack-le.com/19182815-2/</guid><description>&lt;p&gt;小型で安価に動画とかをいろんな端末で見られるメディアサーバーをたてたいなぁ、と思っていろいろした(してる)ときの記事です。最終的には、他のPCからサーバー内のファイルにアクセスして自由にやりとりしたり、DLNAクライアントからサーバー内の動画ファイルをストリーミングしたり、といったことをできるように実装します。選定したハードもソフトも特に目新しいところはありませんが、一連の流れをひとまとめにするつもりなので、サーバーをたてたことはないけれど興味はある、という人にはけっこう参考になるのではないでしょうか。なったらいいな。断片的な情報を統合するのも、特に初心者にはなかなか骨の折れることです。私自身も初心者のため難しいことはしていませんので、その分わかりやすく書けるところもあるはずだと、つらつら書いていきます。&lt;/p&gt;&#10;&lt;p&gt;今回は準備編で、準備物とその選定理由のみです。実際的なことは次から。&lt;/p&gt;&#10;&lt;h2 id="目的"&gt;目的&#10;&lt;/h2&gt;&lt;p&gt;自宅で小型のメディアサーバー、NASを構築・運用し、PCのみならずiPadやスマートフォンなど、様々な端末から自由にアクセスできるようにしたい。もちろんコストはできるだけ抑え、安価であればあるほどよい。具体的には、私はWindowsのデスクトップ、Macノート、iPod Touch、iPad、Androidスマートフォンをもっているのですが、Windows、Macからはファイルに直接アクセスしてファイルの読み書きを行い(NAS)、またiPod Touch、iPad、Android機からはDLNAクライアントとしてサーバーにアクセスさせ、動画のストリーミングを行いたいのです。&lt;/p&gt;&#10;&lt;h2 id="必要なもの"&gt;必要なもの&#10;&lt;/h2&gt;&lt;p&gt;必要な機能はだいたいこんなところです。&lt;/p&gt;&#10;&lt;ul&gt;&#10;&lt;li&gt;ハードウェア…小型サーバー、大容量のハードディスク&lt;/li&gt;&#10;&lt;li&gt;ソフトウェア…DLNAサーバー、NAS、ソフトウェアRAID構築&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;p&gt;以上の実装として、揃えるものは以下のようになりました。&lt;/p&gt;&#10;&lt;ul&gt;&#10;&lt;li&gt;ハードウェア…HP Proliant MicroServer, 2TBのHD * 4&lt;/li&gt;&#10;&lt;li&gt;ソフトウェア…Ubuntu Server 12.04, minidlna, Samba&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;p&gt;予算は多分5万円くらいです。タイの洪水前なら4万円で済みましたね…。&lt;/p&gt;&#10;&lt;h2 id="各種ハードとソフト選定理由"&gt;各種ハードとソフト選定理由&#10;&lt;/h2&gt;&lt;h3 id="サーバー機本体"&gt;サーバー機本体&#10;&lt;/h3&gt;&lt;p&gt;小型サーバー機としては、HP Proliant MicroServerを採用しました。自作も考えましたが、本機はなかなか評判が良いですし、なんといっても安い。さらにネット上はもちろんUbuntu Magazineでも取り上げられたりして情報量が多く、また小型で安価という条件を十分に満たしていたので、これにしました(参考：&lt;a class="link" href="http://ubuntu.asciimw.jp/elem/000/000/010/10465/" target="_blank" rel="noopener"&#10; &gt;Ubuntu Magazine Japan vol.07記事を公開&lt;/a&gt;MicroServerとSambaで作るオリジナルNASというやつです)。&lt;/p&gt;&#10;&lt;p&gt;安価なサーバーといえばNECのExpress 5800、通称鼻毛鯖も有名ですが、いくらなんでもこれはあまりにでかい、でかすぎます。世の中にはこれをコレクションしている猛者もいるとのことですが、このクソ狭い日本でそんなことをするジャップはいったいどこのどいつですか、羨ましい。&lt;/p&gt;&#10;&lt;h3 id="ハードディスク"&gt;ハードディスク&#10;&lt;/h3&gt;&lt;p&gt;HD容量は4TBもあれば当面は十分なのですけれど、これからのことも考え大いに越したことはないと思いHDは2TBのものを4本購入しました。3TBもだいぶお値頃になってきましたし、3TBのHDで構成してもよかったのですが、HD容量が2TBを超えると取り扱いにいろいろ注意が必要らしいので、経験もないしいまのところそこまでの容量も必要ないので、2TBで構成することにしました。したがって計8TBですが、後述するRAID-5を構築するつもりなので実質の容量は6TB程度になります。RAIDとは複数のHDを一つのHDとして運用し、運用を楽ちんかつデータの保護などをするためのものです。HDはWestern DigitalとSamsungのものを2本ずつ購入しました。まとめて同じメーカーから買うと、ロットが同じであるため同時期に壊れやすいという話を聞いたので、分散させたほうがよいと思ったのです。同時期に壊れてしまってはRAIDもなにもあったものではありません。&lt;/p&gt;&#10;&lt;p&gt;RAIDはハードウェアとソフトウェアの両方で実現する方法がありますが、今回はソフトウェアで実装することにしました。そのほうが今後のためにも応用がききそうなので…。&lt;/p&gt;&#10;&lt;h3 id="メモリ"&gt;メモリ&#10;&lt;/h3&gt;&lt;p&gt;メモリも増設しています。Proliantのデフォルトは2GBで、それでもまぁ困らないだろうと思いますが、今回私はファイルシステムにZFSを使ってみたいと思い、ZFSは大量のリソースが必要とのことで8GBに増設してみました。メモリもすっかり安くなりましたし。ZFSとはSolaris生まれの先進的なファイルシステムで、FreeBSDなどでも用いることができます。ライセンスの問題でLinuxには標準搭載されておらず、使うには一苦労です(参考：&lt;a class="link" href="http://thinkit.co.jp/article/82/4" target="_blank" rel="noopener"&#10; &gt;第4回 ZFS、DTraceで管理が楽に！ | Think IT&lt;/a&gt;)。&lt;/p&gt;&#10;&lt;p&gt;追記：後述しますが、ZFSは実装してみたのはよいものの、何が問題なのかパフォーマンスが出ず、結局ext4で運用することにしました。&lt;/p&gt;&#10;&lt;h3 id="os"&gt;OS&#10;&lt;/h3&gt;&lt;p&gt;OSは悩みました。やりたいことを考えれば、Ubuntuが最も簡単であろうと思いました。で、UbuntuでRAID-5でも組もうかと思っていたのですが、いろいろと調べているうちにRAID-Zなる魅力的なRAIDがあることを知りました(参考：&lt;a class="link" href="http://www.pcserver1.jp/blog/40/20100413/13" target="_blank" rel="noopener"&#10; &gt;新世代のRAID「RAID-Z」で高速ストレージを構築しよう(1) | 寺脇のブログ | コンピューターのおっと&lt;/a&gt;)。しかしRAID-Zの構築には、ZFSというファイルシステムを採用する必要があります。Ubuntuでは普通ext4というファイルシステムが使われ、ZFSは前述したようにライセンスの問題でLinuxには標準搭載されていません。そうすると、ZFSが標準で使えるOpenSoralisかFreeBSDあたりが候補にあがってくるわけですが、OpenSoralisでメディアサーバーというのはどうにも茨の道らしいので、FreeBSDがよいだろうと思われました。それでFreeBSDをインストールしようと最初は試みたのですが…うまくいきません。どういうわけかちっともインストール画面にいきません。一度だけインストールすることができましたが…それっきりです。原因は不明です。ハードウェア的に使えないはずはないと思うのですが、工夫がいるのでしょうか…(参考：&lt;a class="link" href="http://blog.livedoor.jp/dankogai/archives/51697097.html" target="_blank" rel="noopener"&#10; &gt;404 Blog Not Found:備忘録 - HP ProLiant MicroServer + FreeBSD + ZFS&lt;/a&gt;)。なんにせよ、これではどうしようもありませんから、悩んだ末やはり無難にLinuxで運用することに決めました。また、Linuxであればメディアサーバーのような軟派な用途ではUbuntuがもっとも使いやすいだろうと考え、Ubuntu Server 12.04をsshを入れるだけのミニマムちょい程度の構成でインストールしました。サーバー機ですのでCUIです。なおUbuntuでもZFSを導入することは可能です。私は/homeのみZFSで構築することにしました。あまりスマートではないように思うのでオススメしません。どうせやるなら/からZFSで構築するのがよいでしょう…が、それなりの手間はかかります。&lt;/p&gt;&#10;&lt;p&gt;2013/05/24追記。今はもうZFSは導入せず、普通にext4 + RAID-5の組み合わせで運用しています。どういうわけか、ZFSのRAID-Zでは書き込み速度がものすごく遅かったり、またあれこれいじって再インストールする羽目になったとき標準で対応していないzfsを採用していると色々面倒だったりしたためです。&lt;/p&gt;&#10;&lt;h3 id="dlnaサーバーソフト"&gt;DLNAサーバーソフト&#10;&lt;/h3&gt;&lt;p&gt;iPadなどタブレット端末やスマートフォンでアクセスし、ストリーミングするためのものです。PS3とかでもできるのかな？DLNAサーバーにはたいていMediatombが用いられるようですが、今回私が参考にした資料の一つである、Ubuntu Magazineの記事では簡易なDLNAサーバーでは必要十分なものとして、より簡便に構築・運用が可能なMiniDLNAを取り上げていたので、私もそうすることにしました。&lt;/p&gt;&#10;&lt;h3 id="ファイルサーバーソフト"&gt;ファイルサーバーソフト&#10;&lt;/h3&gt;&lt;p&gt;NASの機能を実現するためにSambaを導入することにしました。Windowsとのファイル共有の定番ソフトですね。これも巨大なソフトウェアなので、深入りするとたいへんですが、とりあえずLinux以外のマシンから任意のディレクトリの中身を見て編集できたらOKとします。&lt;/p&gt;&#10;&lt;h2 id="選定完了"&gt;選定完了&#10;&lt;/h2&gt;&lt;p&gt;モノはこんなところです。次回より構築編です。&lt;/p&gt;&#10;&lt;p&gt;次回&#10;&lt;a class="link" href="//hack-le.com/19271208-2/" &gt;小型のメディアサーバー兼NASをたてる その2 〜RAID編〜 : 或る阿呆の記&lt;/a&gt;&lt;/p&gt;</description></item></channel></rss>