<?xml version="1.0" encoding="UTF-8"?><?xml-stylesheet href="/rss/feed.xsl" type="text/xsl"?><rss version="2.0" xmlns:content="http://purl.org/rss/1.0/modules/content/"><channel><title>丁丁的亂寫空間</title><description>隨意寫寫，筆記記錄，以免忘記，後悔莫及</description><link>https://preview.astro.kaitaku.xyz</link><item><title>Docker Volume 類型比較</title><link>https://preview.astro.kaitaku.xyz/post/docker/docker-volume-%E9%A1%9E%E5%9E%8B%E6%AF%94%E8%BC%83</link><guid isPermaLink="false">docker/docker-volume-類型比較</guid><description>#Docker #Linux
Docker Volume 類型比較
1. Named Volumes (命名卷)
說明
Named Volumes 是由 Docker 管理的持久化儲存方案,資料儲存在 Docker 的管理目錄中(Linux 通常在</description><pubDate>Tue, 07 Jul 2026 16:00:00 GMT</pubDate><content:encoded>&lt;p&gt;#Docker #Linux&lt;/p&gt;
&lt;h1&gt;Docker Volume 類型比較&lt;a href=&quot;#docker-volume-類型比較&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;/a&gt;&lt;/h1&gt;
&lt;h2&gt;1. Named Volumes (命名卷)&lt;a href=&quot;#1-named-volumes-命名卷&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;
&lt;h3&gt;說明&lt;a href=&quot;#說明&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;Named Volumes 是由 Docker 管理的持久化儲存方案,資料儲存在 Docker 的管理目錄中(Linux 通常在 &lt;code&gt;/var/lib/docker/volumes/&lt;/code&gt;)。這是最推薦的資料持久化方式。&lt;/p&gt;
&lt;h3&gt;特點&lt;a href=&quot;#特點&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;✅ 由 Docker 完全管理,不需要指定主機路徑&lt;/li&gt;
&lt;li&gt;✅ 可以在多個容器間共享&lt;/li&gt;
&lt;li&gt;✅ 支援 volume drivers,可擴展至遠端儲存&lt;/li&gt;
&lt;li&gt;✅ 容易備份和遷移&lt;/li&gt;
&lt;li&gt;✅ 在 Windows 和 Mac 上效能較好&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;Docker Compose 設定&lt;a href=&quot;#docker-compose-設定&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;
&lt;pre&gt;&lt;code&gt;&lt;span&gt;&lt;span&gt;services&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;  db&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;    image&lt;/span&gt;&lt;span&gt;: &lt;/span&gt;&lt;span&gt;postgres:15&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;    volumes&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;      - &lt;/span&gt;&lt;span&gt;postgres_data:/var/lib/postgresql/data&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;    environment&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;      POSTGRES_PASSWORD&lt;/span&gt;&lt;span&gt;: &lt;/span&gt;&lt;span&gt;example&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;volumes&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;  postgres_data&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;    driver&lt;/span&gt;&lt;span&gt;: &lt;/span&gt;&lt;span&gt;local&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;    # 可選:指定 driver options&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;    driver_opts&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;      type&lt;/span&gt;&lt;span&gt;: &lt;/span&gt;&lt;span&gt;none&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;      device&lt;/span&gt;&lt;span&gt;: &lt;/span&gt;&lt;span&gt;/path/on/host&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;      o&lt;/span&gt;&lt;span&gt;: &lt;/span&gt;&lt;span&gt;bind&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;h3&gt;Docker 命令&lt;a href=&quot;#docker-命令&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;
&lt;pre&gt;&lt;code&gt;&lt;span&gt;&lt;span&gt;# 建立基本 volume&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;docker&lt;/span&gt;&lt;span&gt; volume&lt;/span&gt;&lt;span&gt; create&lt;/span&gt;&lt;span&gt; my_volume&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;# 建立 volume 並指定 driver&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;docker&lt;/span&gt;&lt;span&gt; volume&lt;/span&gt;&lt;span&gt; create&lt;/span&gt;&lt;span&gt; --driver&lt;/span&gt;&lt;span&gt; local&lt;/span&gt;&lt;span&gt; my_volume&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;# 建立 volume 並設定 driver_opts (對應 docker-compose 的 driver_opts)&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;docker&lt;/span&gt;&lt;span&gt; volume&lt;/span&gt;&lt;span&gt; create&lt;/span&gt;&lt;span&gt; \&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;  --driver&lt;/span&gt;&lt;span&gt; local&lt;/span&gt;&lt;span&gt; \&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;  --opt&lt;/span&gt;&lt;span&gt; type=none&lt;/span&gt;&lt;span&gt; \&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;  --opt&lt;/span&gt;&lt;span&gt; device=/path/on/host&lt;/span&gt;&lt;span&gt; \&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;  --opt&lt;/span&gt;&lt;span&gt; o=bind&lt;/span&gt;&lt;span&gt; \&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;  postgres_data&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;# 使用短選項 -o (等同於 --opt)&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;docker&lt;/span&gt;&lt;span&gt; volume&lt;/span&gt;&lt;span&gt; create&lt;/span&gt;&lt;span&gt; \&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;  --driver&lt;/span&gt;&lt;span&gt; local&lt;/span&gt;&lt;span&gt; \&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;  -o&lt;/span&gt;&lt;span&gt; type=none&lt;/span&gt;&lt;span&gt; \&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;  -o&lt;/span&gt;&lt;span&gt; device=/absolute/path/on/host&lt;/span&gt;&lt;span&gt; \&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;  -o&lt;/span&gt;&lt;span&gt; o=bind&lt;/span&gt;&lt;span&gt; \&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;  my_volume&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;# NFS volume 範例&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;docker&lt;/span&gt;&lt;span&gt; volume&lt;/span&gt;&lt;span&gt; create&lt;/span&gt;&lt;span&gt; \&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;  --driver&lt;/span&gt;&lt;span&gt; local&lt;/span&gt;&lt;span&gt; \&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;  -o&lt;/span&gt;&lt;span&gt; type=nfs&lt;/span&gt;&lt;span&gt; \&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;  -o&lt;/span&gt;&lt;span&gt; o=addr=192.168.1.100,rw&lt;/span&gt;&lt;span&gt; \&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;  -o&lt;/span&gt;&lt;span&gt; device=:/path/to/nfs/share&lt;/span&gt;&lt;span&gt; \&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;  nfs_volume&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;# 使用 volume 啟動容器&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;docker&lt;/span&gt;&lt;span&gt; run&lt;/span&gt;&lt;span&gt; -d&lt;/span&gt;&lt;span&gt; \&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;  --name&lt;/span&gt;&lt;span&gt; my_container&lt;/span&gt;&lt;span&gt; \&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;  -v&lt;/span&gt;&lt;span&gt; my_volume:/app/data&lt;/span&gt;&lt;span&gt; \&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;  nginx:latest&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;# 查看所有 volumes&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;docker&lt;/span&gt;&lt;span&gt; volume&lt;/span&gt;&lt;span&gt; ls&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;# 查看 volume 詳細資訊(包含 driver_opts)&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;docker&lt;/span&gt;&lt;span&gt; volume&lt;/span&gt;&lt;span&gt; inspect&lt;/span&gt;&lt;span&gt; my_volume&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;# 刪除 volume&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;docker&lt;/span&gt;&lt;span&gt; volume&lt;/span&gt;&lt;span&gt; rm&lt;/span&gt;&lt;span&gt; my_volume&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;# 清理未使用的 volumes&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;docker&lt;/span&gt;&lt;span&gt; volume&lt;/span&gt;&lt;span&gt; prune&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;h3&gt;Volume SubPath (掛載子目錄)&lt;a href=&quot;#volume-subpath-掛載子目錄&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;Docker 支援使用 &lt;code&gt;volume-subpath&lt;/code&gt; 參數來掛載 volume 內的特定子目錄,而不是整個 volume。這在多容器共享同一 volume 時特別有用。&lt;/p&gt;
&lt;h4&gt;重要限制&lt;a href=&quot;#重要限制&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;/a&gt;&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;子目錄必須預先存在&lt;/strong&gt;於 volume 中,否則掛載會失敗&lt;/li&gt;
&lt;li&gt;只能使用 &lt;code&gt;--mount&lt;/code&gt; 語法,不支援 &lt;code&gt;-v&lt;/code&gt; 簡短語法&lt;/li&gt;
&lt;li&gt;Docker Compose 目前官方文件未明確說明支援此功能&lt;/li&gt;
&lt;/ul&gt;
&lt;h4&gt;Docker 命令語法&lt;a href=&quot;#docker-命令語法&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;/a&gt;&lt;/h4&gt;
&lt;pre&gt;&lt;code&gt;&lt;span&gt;&lt;span&gt;--mount&lt;/span&gt;&lt;span&gt; src=&lt;/span&gt;&lt;span&gt;&amp;lt;&lt;/span&gt;&lt;span&gt;volume-nam&lt;/span&gt;&lt;span&gt;e&lt;/span&gt;&lt;span&gt;&amp;gt;&lt;/span&gt;&lt;span&gt;,dst=&lt;/span&gt;&lt;span&gt;&amp;lt;&lt;/span&gt;&lt;span&gt;container-pat&lt;/span&gt;&lt;span&gt;h&lt;/span&gt;&lt;span&gt;&amp;gt;&lt;/span&gt;&lt;span&gt;,volume-subpath=&lt;/span&gt;&lt;span&gt;&amp;lt;&lt;/span&gt;&lt;span&gt;subdi&lt;/span&gt;&lt;span&gt;r&lt;/span&gt;&lt;span&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;h4&gt;完整範例&lt;div&gt;&lt;/div&gt;&lt;a href=&quot;#完整範例&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;/a&gt;&lt;/h4&gt;
&lt;pre&gt;&lt;code&gt;&lt;span&gt;&lt;span&gt;# 1. 建立 volume&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;docker&lt;/span&gt;&lt;span&gt; volume&lt;/span&gt;&lt;span&gt; create&lt;/span&gt;&lt;span&gt; logs&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;# 2. 初始化子目錄結構(必須先建立)&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;docker&lt;/span&gt;&lt;span&gt; run&lt;/span&gt;&lt;span&gt; --rm&lt;/span&gt;&lt;span&gt; \&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;  --mount&lt;/span&gt;&lt;span&gt; src=logs,dst=/logs&lt;/span&gt;&lt;span&gt; \&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;  alpine&lt;/span&gt;&lt;span&gt; mkdir&lt;/span&gt;&lt;span&gt; -p&lt;/span&gt;&lt;span&gt; /logs/app1&lt;/span&gt;&lt;span&gt; /logs/app2&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;# 3. App1 只掛載 logs volume 的 app1 子目錄&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;docker&lt;/span&gt;&lt;span&gt; run&lt;/span&gt;&lt;span&gt; -d&lt;/span&gt;&lt;span&gt; \&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;  --name&lt;/span&gt;&lt;span&gt; app1&lt;/span&gt;&lt;span&gt; \&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;  --mount&lt;/span&gt;&lt;span&gt; src=logs,dst=/var/log/app,volume-subpath=app1&lt;/span&gt;&lt;span&gt; \&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;  myapp1:latest&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;# 4. App2 只掛載 logs volume 的 app2 子目錄&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;docker&lt;/span&gt;&lt;span&gt; run&lt;/span&gt;&lt;span&gt; -d&lt;/span&gt;&lt;span&gt; \&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;  --name&lt;/span&gt;&lt;span&gt; app2&lt;/span&gt;&lt;span&gt; \&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;  --mount&lt;/span&gt;&lt;span&gt; src=logs,dst=/var/log/app,volume-subpath=app2&lt;/span&gt;&lt;span&gt; \&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;  myapp2:latest&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;# 5. 查看整個 volume 的內容(用於管理)&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;docker&lt;/span&gt;&lt;span&gt; run&lt;/span&gt;&lt;span&gt; --rm&lt;/span&gt;&lt;span&gt; \&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;  --mount&lt;/span&gt;&lt;span&gt; src=logs,dst=/logs&lt;/span&gt;&lt;span&gt; \&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;  alpine&lt;/span&gt;&lt;span&gt; ls&lt;/span&gt;&lt;span&gt; -lR&lt;/span&gt;&lt;span&gt; /logs&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;h4&gt;實用範例&lt;div&gt;&lt;/div&gt;&lt;a href=&quot;#實用範例&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;/a&gt;&lt;/h4&gt;
&lt;pre&gt;&lt;code&gt;&lt;span&gt;&lt;span&gt;# 建立共享資料 volume&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;docker&lt;/span&gt;&lt;span&gt; volume&lt;/span&gt;&lt;span&gt; create&lt;/span&gt;&lt;span&gt; shared_data&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;# 初始化多個應用的子目錄&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;docker&lt;/span&gt;&lt;span&gt; run&lt;/span&gt;&lt;span&gt; --rm&lt;/span&gt;&lt;span&gt; \&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;  --mount&lt;/span&gt;&lt;span&gt; src=shared_data,dst=/data&lt;/span&gt;&lt;span&gt; \&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;  alpine&lt;/span&gt;&lt;span&gt; sh&lt;/span&gt;&lt;span&gt; -c&lt;/span&gt;&lt;span&gt; &quot;&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;    mkdir -p /data/uploads/user1 /data/uploads/user2 &amp;amp;&amp;amp;&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;    mkdir -p /data/cache/app1 /data/cache/app2 &amp;amp;&amp;amp;&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;    chown -R 1000:1000 /data&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;  &quot;&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;# 上傳服務 - 使用 uploads/user1 子目錄&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;docker&lt;/span&gt;&lt;span&gt; run&lt;/span&gt;&lt;span&gt; -d&lt;/span&gt;&lt;span&gt; \&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;  --name&lt;/span&gt;&lt;span&gt; upload_user1&lt;/span&gt;&lt;span&gt; \&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;  --mount&lt;/span&gt;&lt;span&gt; src=shared_data,dst=/app/uploads,volume-subpath=uploads/user1&lt;/span&gt;&lt;span&gt; \&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;  upload_service:latest&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;# 快取服務 - 使用 cache/app1 子目錄&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;docker&lt;/span&gt;&lt;span&gt; run&lt;/span&gt;&lt;span&gt; -d&lt;/span&gt;&lt;span&gt; \&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;  --name&lt;/span&gt;&lt;span&gt; cache_app1&lt;/span&gt;&lt;span&gt; \&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;  --mount&lt;/span&gt;&lt;span&gt; src=shared_data,dst=/app/cache,volume-subpath=cache/app1&lt;/span&gt;&lt;span&gt; \&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;  cache_service:latest&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;h4&gt;Docker Compose (非官方支援,但可變通)&lt;a href=&quot;#docker-compose-非官方支援但可變通&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;/a&gt;&lt;/h4&gt;
&lt;p&gt;Docker Compose 目前沒有直接的 &lt;code&gt;volume-subpath&lt;/code&gt; 語法,但可以使用以下變通方式:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;&lt;span&gt;&lt;span&gt;# 方法 1: 使用 driver_opts 將 volume 綁定到主機子目錄&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;services&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;  app1&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;    image&lt;/span&gt;&lt;span&gt;: &lt;/span&gt;&lt;span&gt;myapp:latest&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;    volumes&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;      - &lt;/span&gt;&lt;span&gt;app1_logs:/var/log/app&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;  app2&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;    image&lt;/span&gt;&lt;span&gt;: &lt;/span&gt;&lt;span&gt;myapp:latest&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;    volumes&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;      - &lt;/span&gt;&lt;span&gt;app2_logs:/var/log/app&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;volumes&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;  app1_logs&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;    driver&lt;/span&gt;&lt;span&gt;: &lt;/span&gt;&lt;span&gt;local&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;    driver_opts&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;      type&lt;/span&gt;&lt;span&gt;: &lt;/span&gt;&lt;span&gt;none&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;      device&lt;/span&gt;&lt;span&gt;: &lt;/span&gt;&lt;span&gt;/host/shared/logs/app1&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;      o&lt;/span&gt;&lt;span&gt;: &lt;/span&gt;&lt;span&gt;bind&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;  app2_logs&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;    driver&lt;/span&gt;&lt;span&gt;: &lt;/span&gt;&lt;span&gt;local&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;    driver_opts&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;      type&lt;/span&gt;&lt;span&gt;: &lt;/span&gt;&lt;span&gt;none&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;      device&lt;/span&gt;&lt;span&gt;: &lt;/span&gt;&lt;span&gt;/host/shared/logs/app2&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;      o&lt;/span&gt;&lt;span&gt;: &lt;/span&gt;&lt;span&gt;bind&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;# 方法 2: 使用 init 容器 + 環境變數&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;services&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;  init&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;    image&lt;/span&gt;&lt;span&gt;: &lt;/span&gt;&lt;span&gt;alpine&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;    volumes&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;      - &lt;/span&gt;&lt;span&gt;shared_data:/data&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;    command&lt;/span&gt;&lt;span&gt;: &lt;/span&gt;&lt;span&gt;mkdir -p /data/app1 /data/app2&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;    restart&lt;/span&gt;&lt;span&gt;: &lt;/span&gt;&lt;span&gt;&quot;no&quot;&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;  app1&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;    image&lt;/span&gt;&lt;span&gt;: &lt;/span&gt;&lt;span&gt;myapp:latest&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;    depends_on&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;      - &lt;/span&gt;&lt;span&gt;init&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;    volumes&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;      - &lt;/span&gt;&lt;span&gt;shared_data:/data&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;    working_dir&lt;/span&gt;&lt;span&gt;: &lt;/span&gt;&lt;span&gt;/data/app1&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;    environment&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;      DATA_PATH&lt;/span&gt;&lt;span&gt;: &lt;/span&gt;&lt;span&gt;/data/app1&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;  app2&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;    image&lt;/span&gt;&lt;span&gt;: &lt;/span&gt;&lt;span&gt;myapp:latest&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;    depends_on&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;      - &lt;/span&gt;&lt;span&gt;init&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;    volumes&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;      - &lt;/span&gt;&lt;span&gt;shared_data:/data&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;    working_dir&lt;/span&gt;&lt;span&gt;: &lt;/span&gt;&lt;span&gt;/data/app2&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;    environment&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;      DATA_PATH&lt;/span&gt;&lt;span&gt;: &lt;/span&gt;&lt;span&gt;/data/app2&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;volumes&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;  shared_data&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;h4&gt;使用場景&lt;a href=&quot;#使用場景&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;/a&gt;&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;多容器共享單一 volume 時隔離資料&lt;/li&gt;
&lt;li&gt;為每個容器維護獨立的日誌目錄&lt;/li&gt;
&lt;li&gt;精細控制資料存取範圍&lt;/li&gt;
&lt;li&gt;節省 volume 數量(一個 volume 多個用途)&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;使用場景&lt;a href=&quot;#使用場景-1&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;資料庫資料持久化(PostgreSQL, MySQL, MongoDB)&lt;/li&gt;
&lt;li&gt;應用程式上傳的檔案儲存&lt;/li&gt;
&lt;li&gt;需要在多個容器間共享的資料&lt;/li&gt;
&lt;li&gt;生產環境的資料儲存&lt;/li&gt;
&lt;/ul&gt;
&lt;hr /&gt;
&lt;h2&gt;2. Bind Mounts (綁定掛載)&lt;a href=&quot;#2-bind-mounts-綁定掛載&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;
&lt;h3&gt;說明&lt;a href=&quot;#說明-1&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;Bind Mounts 將主機上的特定檔案或目錄直接掛載到容器中。提供了最直接的檔案系統存取,但依賴主機的檔案系統結構。&lt;/p&gt;
&lt;h3&gt;特點&lt;a href=&quot;#特點-1&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;✅ 可以直接存取和編輯主機檔案&lt;/li&gt;
&lt;li&gt;✅ 適合開發環境的即時程式碼更新&lt;/li&gt;
&lt;li&gt;✅ 可以掛載單一檔案或整個目錄&lt;/li&gt;
&lt;li&gt;⚠️ 依賴主機的目錄結構&lt;/li&gt;
&lt;li&gt;⚠️ 在 Windows/Mac 上效能可能較差&lt;/li&gt;
&lt;li&gt;⚠️ 安全性較低(容器可以修改主機檔案)&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;Docker Compose 設定&lt;a href=&quot;#docker-compose-設定-1&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;
&lt;pre&gt;&lt;code&gt;&lt;span&gt;&lt;span&gt;services&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;  web&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;    image&lt;/span&gt;&lt;span&gt;: &lt;/span&gt;&lt;span&gt;node:18&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;    working_dir&lt;/span&gt;&lt;span&gt;: &lt;/span&gt;&lt;span&gt;/app&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;    volumes&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;      # 長語法(推薦)&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;      - &lt;/span&gt;&lt;span&gt;type&lt;/span&gt;&lt;span&gt;: &lt;/span&gt;&lt;span&gt;bind&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;        source&lt;/span&gt;&lt;span&gt;: &lt;/span&gt;&lt;span&gt;./src&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;        target&lt;/span&gt;&lt;span&gt;: &lt;/span&gt;&lt;span&gt;/app&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;        read_only&lt;/span&gt;&lt;span&gt;: &lt;/span&gt;&lt;span&gt;false&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;      # 短語法&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;      - &lt;/span&gt;&lt;span&gt;./config:/app/config:ro&lt;/span&gt;&lt;span&gt;  # :ro 表示唯讀&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;      - &lt;/span&gt;&lt;span&gt;./logs:/app/logs&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;    command&lt;/span&gt;&lt;span&gt;: &lt;/span&gt;&lt;span&gt;npm run dev&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;    ports&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;      - &lt;/span&gt;&lt;span&gt;&quot;3000:3000&quot;&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;  nginx&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;    image&lt;/span&gt;&lt;span&gt;: &lt;/span&gt;&lt;span&gt;nginx:latest&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;    volumes&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;      # 掛載設定檔&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;      - &lt;/span&gt;&lt;span&gt;./nginx.conf:/etc/nginx/nginx.conf:ro&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;      # 掛載靜態檔案&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;      - &lt;/span&gt;&lt;span&gt;./public:/usr/share/nginx/html:ro&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;    ports&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;      - &lt;/span&gt;&lt;span&gt;&quot;80:80&quot;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;h3&gt;Docker 命令&lt;a href=&quot;#docker-命令-1&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;
&lt;pre&gt;&lt;code&gt;&lt;span&gt;&lt;span&gt;# 使用絕對路徑掛載&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;docker&lt;/span&gt;&lt;span&gt; run&lt;/span&gt;&lt;span&gt; -d&lt;/span&gt;&lt;span&gt; \&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;  --name&lt;/span&gt;&lt;span&gt; dev_container&lt;/span&gt;&lt;span&gt; \&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;  -v&lt;/span&gt;&lt;span&gt; /absolute/path/on/host:/app&lt;/span&gt;&lt;span&gt; \&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;  -v&lt;/span&gt;&lt;span&gt; $(&lt;/span&gt;&lt;span&gt;pwd&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt;/config:/app/config:ro&lt;/span&gt;&lt;span&gt; \&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;  node:18&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;# 使用相對路徑(需要完整路徑)&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;docker&lt;/span&gt;&lt;span&gt; run&lt;/span&gt;&lt;span&gt; -d&lt;/span&gt;&lt;span&gt; \&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;  --name&lt;/span&gt;&lt;span&gt; web&lt;/span&gt;&lt;span&gt; \&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;  -v&lt;/span&gt;&lt;span&gt; &quot;$(&lt;/span&gt;&lt;span&gt;pwd&lt;/span&gt;&lt;span&gt;)&quot;:/app&lt;/span&gt;&lt;span&gt; \&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;  -w&lt;/span&gt;&lt;span&gt; /app&lt;/span&gt;&lt;span&gt; \&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;  nginx:latest&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;# 掛載單一檔案&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;docker&lt;/span&gt;&lt;span&gt; run&lt;/span&gt;&lt;span&gt; -d&lt;/span&gt;&lt;span&gt; \&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;  --name&lt;/span&gt;&lt;span&gt; app&lt;/span&gt;&lt;span&gt; \&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;  -v&lt;/span&gt;&lt;span&gt; $(&lt;/span&gt;&lt;span&gt;pwd&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt;/.env:/app/.env:ro&lt;/span&gt;&lt;span&gt; \&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;  myapp:latest&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;# 使用 --mount 語法(更明確,推薦)&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;docker&lt;/span&gt;&lt;span&gt; run&lt;/span&gt;&lt;span&gt; -d&lt;/span&gt;&lt;span&gt; \&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;  --name&lt;/span&gt;&lt;span&gt; app&lt;/span&gt;&lt;span&gt; \&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;  --mount&lt;/span&gt;&lt;span&gt; type=bind,source=&lt;/span&gt;&lt;span&gt;$(&lt;/span&gt;&lt;span&gt;pwd&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt;/src,target=/app,readonly=&lt;/span&gt;&lt;span&gt;false&lt;/span&gt;&lt;span&gt; \&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;  node:18&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;h3&gt;使用場景&lt;a href=&quot;#使用場景-2&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;開發環境的即時程式碼更新&lt;/li&gt;
&lt;li&gt;掛載設定檔到容器&lt;/li&gt;
&lt;li&gt;需要在主機上直接查看/編輯容器檔案&lt;/li&gt;
&lt;li&gt;CI/CD 建置過程中的檔案共享&lt;/li&gt;
&lt;/ul&gt;
&lt;hr /&gt;
&lt;h2&gt;3. Anonymous Volumes (匿名卷)&lt;a href=&quot;#3-anonymous-volumes-匿名卷&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;
&lt;h3&gt;說明&lt;a href=&quot;#說明-2&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;Anonymous Volumes 是沒有指定名稱的 volume,由 Docker 自動產生隨機名稱。當容器被刪除時,通常也會一起被刪除(除非使用特定選項)。&lt;/p&gt;
&lt;h3&gt;特點&lt;a href=&quot;#特點-2&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;✅ 自動管理,無需手動建立&lt;/li&gt;
&lt;li&gt;✅ 適合臨時資料儲存&lt;/li&gt;
&lt;li&gt;⚠️ 難以追蹤和管理&lt;/li&gt;
&lt;li&gt;⚠️ 容器刪除後可能遺留孤立 volumes&lt;/li&gt;
&lt;li&gt;⚠️ 無法在容器間共享(每次都會建立新的)&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;Docker Compose 設定&lt;a href=&quot;#docker-compose-設定-2&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;
&lt;pre&gt;&lt;code&gt;&lt;span&gt;&lt;span&gt;services&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;  app&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;    image&lt;/span&gt;&lt;span&gt;: &lt;/span&gt;&lt;span&gt;node:18&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;    volumes&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;      # 匿名 volume(不指定主機路徑或 volume 名稱)&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;      - &lt;/span&gt;&lt;span&gt;/app/node_modules&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;      - &lt;/span&gt;&lt;span&gt;/app/cache&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;    working_dir&lt;/span&gt;&lt;span&gt;: &lt;/span&gt;&lt;span&gt;/app&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;    command&lt;/span&gt;&lt;span&gt;: &lt;/span&gt;&lt;span&gt;npm start&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;  db&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;    image&lt;/span&gt;&lt;span&gt;: &lt;/span&gt;&lt;span&gt;postgres:15&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;    volumes&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;      # 結合 bind mount 和匿名 volume&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;      - &lt;/span&gt;&lt;span&gt;./app:/app&lt;/span&gt;&lt;span&gt;                    # bind mount&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;      - &lt;/span&gt;&lt;span&gt;/app/node_modules&lt;/span&gt;&lt;span&gt;             # 匿名 volume,避免覆蓋&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;    environment&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;      POSTGRES_PASSWORD&lt;/span&gt;&lt;span&gt;: &lt;/span&gt;&lt;span&gt;example&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;h3&gt;Docker 命令&lt;a href=&quot;#docker-命令-2&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;
&lt;pre&gt;&lt;code&gt;&lt;span&gt;&lt;span&gt;# 建立匿名 volume&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;docker&lt;/span&gt;&lt;span&gt; run&lt;/span&gt;&lt;span&gt; -d&lt;/span&gt;&lt;span&gt; \&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;  --name&lt;/span&gt;&lt;span&gt; app&lt;/span&gt;&lt;span&gt; \&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;  -v&lt;/span&gt;&lt;span&gt; /app/data&lt;/span&gt;&lt;span&gt; \&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;  nginx:latest&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;# 容器刪除時自動清理匿名 volume&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;docker&lt;/span&gt;&lt;span&gt; run&lt;/span&gt;&lt;span&gt; --rm&lt;/span&gt;&lt;span&gt; \&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;  -v&lt;/span&gt;&lt;span&gt; /tmp/cache&lt;/span&gt;&lt;span&gt; \&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;  alpine:latest&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;# 查看容器的匿名 volumes&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;docker&lt;/span&gt;&lt;span&gt; inspect&lt;/span&gt;&lt;span&gt; app&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;# 範例:避免 node_modules 被覆蓋&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;docker&lt;/span&gt;&lt;span&gt; run&lt;/span&gt;&lt;span&gt; -d&lt;/span&gt;&lt;span&gt; \&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;  --name&lt;/span&gt;&lt;span&gt; node_app&lt;/span&gt;&lt;span&gt; \&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;  -v&lt;/span&gt;&lt;span&gt; $(&lt;/span&gt;&lt;span&gt;pwd&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt;:/app&lt;/span&gt;&lt;span&gt; \&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;  -v&lt;/span&gt;&lt;span&gt; /app/node_modules&lt;/span&gt;&lt;span&gt; \&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;  node:18&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;h3&gt;使用場景&lt;a href=&quot;#使用場景-3&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;保護容器內特定目錄不被 bind mount 覆蓋(如 node_modules)&lt;/li&gt;
&lt;li&gt;臨時快取資料&lt;/li&gt;
&lt;li&gt;不需要持久化的資料&lt;/li&gt;
&lt;li&gt;開發環境的臨時檔案&lt;/li&gt;
&lt;/ul&gt;
&lt;hr /&gt;
&lt;h2&gt;4. tmpfs Mounts (臨時檔案系統掛載)&lt;a href=&quot;#4-tmpfs-mounts-臨時檔案系統掛載&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;
&lt;h3&gt;說明&lt;a href=&quot;#說明-3&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;tmpfs Mounts 將資料儲存在主機的記憶體中,不會寫入磁碟。當容器停止時,資料就會消失。只在 Linux 上可用。&lt;/p&gt;
&lt;h3&gt;特點&lt;a href=&quot;#特點-3&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;✅ 極快的讀寫速度(記憶體存取)&lt;/li&gt;
&lt;li&gt;✅ 敏感資料不會寫入磁碟&lt;/li&gt;
&lt;li&gt;✅ 容器停止後自動清理&lt;/li&gt;
&lt;li&gt;⚠️ 資料不持久化&lt;/li&gt;
&lt;li&gt;⚠️ 佔用主機記憶體&lt;/li&gt;
&lt;li&gt;⚠️ 只支援 Linux&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;Docker Compose 設定&lt;a href=&quot;#docker-compose-設定-3&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;
&lt;pre&gt;&lt;code&gt;&lt;span&gt;&lt;span&gt;services&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;  web&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;    image&lt;/span&gt;&lt;span&gt;: &lt;/span&gt;&lt;span&gt;nginx:latest&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;    tmpfs&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;      - &lt;/span&gt;&lt;span&gt;/tmp&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;      - &lt;/span&gt;&lt;span&gt;/run&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;    # 或使用長語法&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;    volumes&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;      - &lt;/span&gt;&lt;span&gt;type&lt;/span&gt;&lt;span&gt;: &lt;/span&gt;&lt;span&gt;tmpfs&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;        target&lt;/span&gt;&lt;span&gt;: &lt;/span&gt;&lt;span&gt;/app/cache&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;        tmpfs&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;          size&lt;/span&gt;&lt;span&gt;: &lt;/span&gt;&lt;span&gt;100M&lt;/span&gt;&lt;span&gt;  # 限制大小為 100MB&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;          mode&lt;/span&gt;&lt;span&gt;: &lt;/span&gt;&lt;span&gt;1777&lt;/span&gt;&lt;span&gt;  # 設定權限&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;  app&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;    image&lt;/span&gt;&lt;span&gt;: &lt;/span&gt;&lt;span&gt;myapp:latest&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;    volumes&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;      - &lt;/span&gt;&lt;span&gt;type&lt;/span&gt;&lt;span&gt;: &lt;/span&gt;&lt;span&gt;tmpfs&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;        target&lt;/span&gt;&lt;span&gt;: &lt;/span&gt;&lt;span&gt;/app/temp&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;        tmpfs&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;          size&lt;/span&gt;&lt;span&gt;: &lt;/span&gt;&lt;span&gt;50M&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;      - &lt;/span&gt;&lt;span&gt;data:/app/data&lt;/span&gt;&lt;span&gt;  # 結合 named volume&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;volumes&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;  data&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;h3&gt;Docker 命令&lt;a href=&quot;#docker-命令-3&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;
&lt;pre&gt;&lt;code&gt;&lt;span&gt;&lt;span&gt;# 基本使用&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;docker&lt;/span&gt;&lt;span&gt; run&lt;/span&gt;&lt;span&gt; -d&lt;/span&gt;&lt;span&gt; \&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;  --name&lt;/span&gt;&lt;span&gt; app&lt;/span&gt;&lt;span&gt; \&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;  --tmpfs&lt;/span&gt;&lt;span&gt; /tmp&lt;/span&gt;&lt;span&gt; \&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;  nginx:latest&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;# 使用 --mount 指定選項&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;docker&lt;/span&gt;&lt;span&gt; run&lt;/span&gt;&lt;span&gt; -d&lt;/span&gt;&lt;span&gt; \&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;  --name&lt;/span&gt;&lt;span&gt; app&lt;/span&gt;&lt;span&gt; \&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;  --mount&lt;/span&gt;&lt;span&gt; type=tmpfs,target=/app/cache,tmpfs-size=100M,tmpfs-mode=&lt;/span&gt;&lt;span&gt;1770&lt;/span&gt;&lt;span&gt; \&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;  myapp:latest&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;# 多個 tmpfs mounts&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;docker&lt;/span&gt;&lt;span&gt; run&lt;/span&gt;&lt;span&gt; -d&lt;/span&gt;&lt;span&gt; \&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;  --name&lt;/span&gt;&lt;span&gt; app&lt;/span&gt;&lt;span&gt; \&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;  --tmpfs&lt;/span&gt;&lt;span&gt; /tmp:rw,size=50M,mode=&lt;/span&gt;&lt;span&gt;1777&lt;/span&gt;&lt;span&gt; \&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;  --tmpfs&lt;/span&gt;&lt;span&gt; /run:rw,size=10M&lt;/span&gt;&lt;span&gt; \&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;  nginx:latest&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;# 查看掛載資訊&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;docker&lt;/span&gt;&lt;span&gt; inspect&lt;/span&gt;&lt;span&gt; app&lt;/span&gt;&lt;span&gt; |&lt;/span&gt;&lt;span&gt; grep&lt;/span&gt;&lt;span&gt; -A&lt;/span&gt;&lt;span&gt; 10&lt;/span&gt;&lt;span&gt; Mounts&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;h3&gt;使用場景&lt;a href=&quot;#使用場景-4&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;敏感資料處理(密碼、金鑰等)&lt;/li&gt;
&lt;li&gt;高速快取需求&lt;/li&gt;
&lt;li&gt;臨時檔案處理&lt;/li&gt;
&lt;li&gt;Session 儲存&lt;/li&gt;
&lt;li&gt;編譯過程的臨時檔案&lt;/li&gt;
&lt;/ul&gt;
&lt;hr /&gt;
&lt;h2&gt;Volume 類型比較表&lt;a href=&quot;#volume-類型比較表&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;


















































































&lt;table&gt;&lt;thead&gt;&lt;tr&gt;&lt;th&gt;特性&lt;/th&gt;&lt;th&gt;Named Volume&lt;/th&gt;&lt;th&gt;Bind Mount&lt;/th&gt;&lt;th&gt;Anonymous Volume&lt;/th&gt;&lt;th&gt;tmpfs Mount&lt;/th&gt;&lt;/tr&gt;&lt;/thead&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td&gt;&lt;strong&gt;持久化&lt;/strong&gt;&lt;/td&gt;&lt;td&gt;✅ 是&lt;/td&gt;&lt;td&gt;✅ 是&lt;/td&gt;&lt;td&gt;✅ 是&lt;/td&gt;&lt;td&gt;❌ 否&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;strong&gt;Docker 管理&lt;/strong&gt;&lt;/td&gt;&lt;td&gt;✅ 是&lt;/td&gt;&lt;td&gt;❌ 否&lt;/td&gt;&lt;td&gt;✅ 是&lt;/td&gt;&lt;td&gt;❌ 否&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;strong&gt;主機路徑控制&lt;/strong&gt;&lt;/td&gt;&lt;td&gt;❌ 否&lt;/td&gt;&lt;td&gt;✅ 是&lt;/td&gt;&lt;td&gt;❌ 否&lt;/td&gt;&lt;td&gt;❌ 否&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;strong&gt;容器間共享&lt;/strong&gt;&lt;/td&gt;&lt;td&gt;✅ 容易&lt;/td&gt;&lt;td&gt;✅ 可以&lt;/td&gt;&lt;td&gt;❌ 困難&lt;/td&gt;&lt;td&gt;❌ 不可&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;strong&gt;效能(Linux)&lt;/strong&gt;&lt;/td&gt;&lt;td&gt; 好&lt;/td&gt;&lt;td&gt; 好&lt;/td&gt;&lt;td&gt; 好&lt;/td&gt;&lt;td&gt; 極佳&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;strong&gt;效能(Win/Mac)&lt;/strong&gt;&lt;/td&gt;&lt;td&gt; 好&lt;/td&gt;&lt;td&gt; 較差&lt;/td&gt;&lt;td&gt; 好&lt;/td&gt;&lt;td&gt;N/A&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;strong&gt;備份容易度&lt;/strong&gt;&lt;/td&gt;&lt;td&gt; 容易&lt;/td&gt;&lt;td&gt; 中等&lt;/td&gt;&lt;td&gt; 困難&lt;/td&gt;&lt;td&gt;N/A&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;strong&gt;安全性&lt;/strong&gt;&lt;/td&gt;&lt;td&gt; 高&lt;/td&gt;&lt;td&gt; 中等&lt;/td&gt;&lt;td&gt; 高&lt;/td&gt;&lt;td&gt; 高&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;strong&gt;使用複雜度&lt;/strong&gt;&lt;/td&gt;&lt;td&gt; 簡單&lt;/td&gt;&lt;td&gt; 中等&lt;/td&gt;&lt;td&gt; 簡單&lt;/td&gt;&lt;td&gt; 簡單&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;strong&gt;生產環境&lt;/strong&gt;&lt;/td&gt;&lt;td&gt;✅ 推薦&lt;/td&gt;&lt;td&gt;⚠️ 謹慎&lt;/td&gt;&lt;td&gt;❌ 不推薦&lt;/td&gt;&lt;td&gt;✅ 特定場景&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;
&lt;hr /&gt;
&lt;h2&gt;實用技巧與最佳實踐&lt;a href=&quot;#實用技巧與最佳實踐&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;
&lt;h3&gt;1. Volume 備份與還原&lt;a href=&quot;#1-volume-備份與還原&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;
&lt;pre&gt;&lt;code&gt;&lt;span&gt;&lt;span&gt;# 備份 named volume&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;docker&lt;/span&gt;&lt;span&gt; run&lt;/span&gt;&lt;span&gt; --rm&lt;/span&gt;&lt;span&gt; \&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;  -v&lt;/span&gt;&lt;span&gt; my_volume:/source:ro&lt;/span&gt;&lt;span&gt; \&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;  -v&lt;/span&gt;&lt;span&gt; $(&lt;/span&gt;&lt;span&gt;pwd&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt;:/backup&lt;/span&gt;&lt;span&gt; \&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;  alpine&lt;/span&gt;&lt;span&gt; tar&lt;/span&gt;&lt;span&gt; czf&lt;/span&gt;&lt;span&gt; /backup/backup.tar.gz&lt;/span&gt;&lt;span&gt; -C&lt;/span&gt;&lt;span&gt; /source&lt;/span&gt;&lt;span&gt; .&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;# 還原 volume&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;docker&lt;/span&gt;&lt;span&gt; run&lt;/span&gt;&lt;span&gt; --rm&lt;/span&gt;&lt;span&gt; \&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;  -v&lt;/span&gt;&lt;span&gt; my_volume:/target&lt;/span&gt;&lt;span&gt; \&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;  -v&lt;/span&gt;&lt;span&gt; $(&lt;/span&gt;&lt;span&gt;pwd&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt;:/backup&lt;/span&gt;&lt;span&gt; \&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;  alpine&lt;/span&gt;&lt;span&gt; tar&lt;/span&gt;&lt;span&gt; xzf&lt;/span&gt;&lt;span&gt; /backup/backup.tar.gz&lt;/span&gt;&lt;span&gt; -C&lt;/span&gt;&lt;span&gt; /target&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;h3&gt;2. 複製 Volume 資料&lt;a href=&quot;#2-複製-volume-資料&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;
&lt;pre&gt;&lt;code&gt;&lt;span&gt;&lt;span&gt;# 從一個 volume 複製到另一個&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;docker&lt;/span&gt;&lt;span&gt; run&lt;/span&gt;&lt;span&gt; --rm&lt;/span&gt;&lt;span&gt; \&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;  -v&lt;/span&gt;&lt;span&gt; old_volume:/from:ro&lt;/span&gt;&lt;span&gt; \&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;  -v&lt;/span&gt;&lt;span&gt; new_volume:/to&lt;/span&gt;&lt;span&gt; \&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;  alpine&lt;/span&gt;&lt;span&gt; sh&lt;/span&gt;&lt;span&gt; -c&lt;/span&gt;&lt;span&gt; &quot;cd /from &amp;amp;&amp;amp; cp -av . /to&quot;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;h3&gt;3. 組合使用範例&lt;a href=&quot;#3-組合使用範例&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;
&lt;pre&gt;&lt;code&gt;&lt;span&gt;&lt;span&gt;services&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;  app&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;    image&lt;/span&gt;&lt;span&gt;: &lt;/span&gt;&lt;span&gt;node:18&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;    volumes&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;      # Bind mount: 開發時即時更新程式碼&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;      - &lt;/span&gt;&lt;span&gt;./src:/app/src&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;      # Named volume: 持久化上傳檔案&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;      - &lt;/span&gt;&lt;span&gt;uploads:/app/uploads&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;      # Anonymous volume: 保護 node_modules&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;      - &lt;/span&gt;&lt;span&gt;/app/node_modules&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;      # tmpfs: 高速快取&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;    tmpfs&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;      - &lt;/span&gt;&lt;span&gt;/app/cache:size=100M&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;  db&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;    image&lt;/span&gt;&lt;span&gt;: &lt;/span&gt;&lt;span&gt;postgres:15&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;    volumes&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;      # Named volume: 資料庫資料持久化&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;      - &lt;/span&gt;&lt;span&gt;db_data:/var/lib/postgresql/data&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;    environment&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;      POSTGRES_PASSWORD&lt;/span&gt;&lt;span&gt;: &lt;/span&gt;&lt;span&gt;example&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;volumes&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;  uploads&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;  db_data&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;h3&gt;4. 清理未使用的 Volumes&lt;a href=&quot;#4-清理未使用的-volumes&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;
&lt;pre&gt;&lt;code&gt;&lt;span&gt;&lt;span&gt;# 清理所有未使用的 volumes&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;docker&lt;/span&gt;&lt;span&gt; volume&lt;/span&gt;&lt;span&gt; prune&lt;/span&gt;&lt;span&gt; -f&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;# 清理特定 volume&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;docker&lt;/span&gt;&lt;span&gt; volume&lt;/span&gt;&lt;span&gt; rm&lt;/span&gt;&lt;span&gt; volume_name&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;# 查看 volume 使用情況&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;docker&lt;/span&gt;&lt;span&gt; system&lt;/span&gt;&lt;span&gt; df&lt;/span&gt;&lt;span&gt; -v&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;h3&gt;5. 使用 Volume SubPath 實現多租戶資料隔離&lt;a href=&quot;#5-使用-volume-subpath-實現多租戶資料隔離&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;
&lt;pre&gt;&lt;code&gt;&lt;span&gt;&lt;span&gt;# 實際場景:多個微服務共享一個資料 volume,但各自有獨立空間&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;# 建立共享 volume&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;docker&lt;/span&gt;&lt;span&gt; volume&lt;/span&gt;&lt;span&gt; create&lt;/span&gt;&lt;span&gt; microservices_data&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;# 初始化子目錄結構&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;docker&lt;/span&gt;&lt;span&gt; run&lt;/span&gt;&lt;span&gt; --rm&lt;/span&gt;&lt;span&gt; \&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;  --mount&lt;/span&gt;&lt;span&gt; src=microservices_data,dst=/data&lt;/span&gt;&lt;span&gt; \&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;  alpine&lt;/span&gt;&lt;span&gt; sh&lt;/span&gt;&lt;span&gt; -c&lt;/span&gt;&lt;span&gt; &quot;&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;    mkdir -p /data/{auth,user,order}/{uploads,cache,logs} &amp;amp;&amp;amp;&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;    mkdir -p /data/shared/{config,templates} &amp;amp;&amp;amp;&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;    chown -R 1000:1000 /data&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;  &quot;&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;# 認證服務 - 只能存取 auth 子目錄&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;docker&lt;/span&gt;&lt;span&gt; run&lt;/span&gt;&lt;span&gt; -d&lt;/span&gt;&lt;span&gt; \&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;  --name&lt;/span&gt;&lt;span&gt; auth_service&lt;/span&gt;&lt;span&gt; \&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;  --mount&lt;/span&gt;&lt;span&gt; src=microservices_data,dst=/app/data,volume-subpath=auth&lt;/span&gt;&lt;span&gt; \&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;  --mount&lt;/span&gt;&lt;span&gt; src=microservices_data,dst=/app/shared,volume-subpath=shared,readonly&lt;/span&gt;&lt;span&gt; \&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;  auth:latest&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;# 使用者服務 - 只能存取 user 子目錄&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;docker&lt;/span&gt;&lt;span&gt; run&lt;/span&gt;&lt;span&gt; -d&lt;/span&gt;&lt;span&gt; \&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;  --name&lt;/span&gt;&lt;span&gt; user_service&lt;/span&gt;&lt;span&gt; \&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;  --mount&lt;/span&gt;&lt;span&gt; src=microservices_data,dst=/app/data,volume-subpath=user&lt;/span&gt;&lt;span&gt; \&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;  --mount&lt;/span&gt;&lt;span&gt; src=microservices_data,dst=/app/shared,volume-subpath=shared,readonly&lt;/span&gt;&lt;span&gt; \&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;  user:latest&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;# 訂單服務 - 只能存取 order 子目錄&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;docker&lt;/span&gt;&lt;span&gt; run&lt;/span&gt;&lt;span&gt; -d&lt;/span&gt;&lt;span&gt; \&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;  --name&lt;/span&gt;&lt;span&gt; order_service&lt;/span&gt;&lt;span&gt; \&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;  --mount&lt;/span&gt;&lt;span&gt; src=microservices_data,dst=/app/data,volume-subpath=order&lt;/span&gt;&lt;span&gt; \&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;  --mount&lt;/span&gt;&lt;span&gt; src=microservices_data,dst=/app/shared,volume-subpath=shared,readonly&lt;/span&gt;&lt;span&gt; \&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;  order:latest&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;# 管理容器 - 可以存取完整 volume(用於維護)&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;docker&lt;/span&gt;&lt;span&gt; run&lt;/span&gt;&lt;span&gt; --rm&lt;/span&gt;&lt;span&gt; -it&lt;/span&gt;&lt;span&gt; \&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;  --mount&lt;/span&gt;&lt;span&gt; src=microservices_data,dst=/data&lt;/span&gt;&lt;span&gt; \&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;  alpine&lt;/span&gt;&lt;span&gt; sh&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;# 備份特定服務的資料&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;docker&lt;/span&gt;&lt;span&gt; run&lt;/span&gt;&lt;span&gt; --rm&lt;/span&gt;&lt;span&gt; \&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;  --mount&lt;/span&gt;&lt;span&gt; src=microservices_data,dst=/data,volume-subpath=auth&lt;/span&gt;&lt;span&gt; \&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;  -v&lt;/span&gt;&lt;span&gt; $(&lt;/span&gt;&lt;span&gt;pwd&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt;/backups:/backup&lt;/span&gt;&lt;span&gt; \&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;  alpine&lt;/span&gt;&lt;span&gt; tar&lt;/span&gt;&lt;span&gt; czf&lt;/span&gt;&lt;span&gt; /backup/auth-&lt;/span&gt;&lt;span&gt;$(&lt;/span&gt;&lt;span&gt;date&lt;/span&gt;&lt;span&gt; +%Y%m%d&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt;.tar.gz&lt;/span&gt;&lt;span&gt; -C&lt;/span&gt;&lt;span&gt; /data&lt;/span&gt;&lt;span&gt; .&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;hr /&gt;
&lt;h2&gt;選擇建議&lt;a href=&quot;#選擇建議&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;
&lt;h3&gt;使用 Named Volumes 當&lt;a href=&quot;#使用-named-volumes-當&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;生產環境的資料持久化&lt;/li&gt;
&lt;li&gt;需要簡單的備份和遷移&lt;/li&gt;
&lt;li&gt;資料需要在容器間共享&lt;/li&gt;
&lt;li&gt;使用 Windows 或 Mac 進行開發&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;使用 Bind Mounts 當&lt;a href=&quot;#使用-bind-mounts-當&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;開發環境需要即時程式碼更新&lt;/li&gt;
&lt;li&gt;需要精確控制檔案位置&lt;/li&gt;
&lt;li&gt;設定檔需要頻繁修改&lt;/li&gt;
&lt;li&gt;與主機工具整合(如 IDE)&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;使用 Anonymous Volumes 當&lt;a href=&quot;#使用-anonymous-volumes-當&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;保護特定目錄不被覆蓋&lt;/li&gt;
&lt;li&gt;臨時資料儲存&lt;/li&gt;
&lt;li&gt;不需要跨容器共享&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;使用 tmpfs Mounts 當&lt;a href=&quot;#使用-tmpfs-mounts-當&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;處理敏感資料&lt;/li&gt;
&lt;li&gt;需要極高的 I/O 效能&lt;/li&gt;
&lt;li&gt;臨時快取或 session 儲存&lt;/li&gt;
&lt;li&gt;資料不需要持久化&lt;/li&gt;
&lt;/ul&gt;
&lt;hr /&gt;
&lt;h2&gt;參考資源&lt;a href=&quot;#參考資源&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://docs.docker.com/storage/volumes/&quot;&gt;Docker 官方文件 - Volumes&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://docs.docker.com/storage/bind-mounts/&quot;&gt;Docker 官方文件 - Bind Mounts&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://docs.docker.com/compose/compose-file/&quot;&gt;Docker Compose 文件參考&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;</content:encoded><category>category:docker</category><category>tag:Linux</category><category>tag:Docker</category></item><item><title>Linux 常用壓縮/解壓縮命令</title><link>https://preview.astro.kaitaku.xyz/post/linux/linux-%E5%B8%B8%E7%94%A8%E5%A3%93%E7%B8%AE-%E8%A7%A3%E5%A3%93%E7%B8%AE%E5%91%BD%E4%BB%A4</link><guid isPermaLink="false">linux/linux-常用壓縮-解壓縮命令</guid><description>.tar.tar.gz.tar.bz.tar.bz2.tar.xz.tar.Z.tgz.tar.tgz.tar.zst.gz.bz.bz2.xz.Z.7z.zip.rar.lha.zst
.tar (無壓縮)

打包

tar cvf dir.tar dir_name

解包

tar xvf</description><pubDate>Sun, 07 Apr 2024 16:00:00 GMT</pubDate><content:encoded>&lt;table&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td&gt;&lt;a href=&quot;#tar-%E7%84%A1%E5%A3%93%E7%B8%AE&quot;&gt;.tar&lt;/a&gt;&lt;/td&gt;&lt;td&gt;&lt;a href=&quot;#targz&quot;&gt;.tar.gz&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;a href=&quot;#tarbz&quot;&gt;.tar.bz&lt;/a&gt;&lt;/td&gt;&lt;td&gt;&lt;a href=&quot;#tarbz2&quot;&gt;.tar.bz2&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;a href=&quot;#tarxz&quot;&gt;.tar.xz&lt;/a&gt;&lt;/td&gt;&lt;td&gt;&lt;a href=&quot;#tarz&quot;&gt;.tar.Z&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;a href=&quot;#tgz&quot;&gt;.tgz&lt;/a&gt;&lt;/td&gt;&lt;td&gt;&lt;a href=&quot;#tartgz&quot;&gt;.tar.tgz&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;a href=&quot;#tarzst&quot;&gt;.tar.zst&lt;/a&gt;&lt;/td&gt;&lt;td&gt;&lt;a href=&quot;#gz&quot;&gt;.gz&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;a href=&quot;#bz&quot;&gt;.bz&lt;/a&gt;&lt;/td&gt;&lt;td&gt;&lt;a href=&quot;#bz2&quot;&gt;.bz2&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;a href=&quot;#xz&quot;&gt;.xz&lt;/a&gt;&lt;/td&gt;&lt;td&gt;&lt;a href=&quot;#z&quot;&gt;.Z&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;a href=&quot;#7z&quot;&gt;.7z&lt;/a&gt;&lt;/td&gt;&lt;td&gt;&lt;a href=&quot;#zip&quot;&gt;.zip&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;a href=&quot;#rar&quot;&gt;.rar&lt;/a&gt;&lt;/td&gt;&lt;td&gt;&lt;a href=&quot;#lha&quot;&gt;.lha&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;a href=&quot;#zst&quot;&gt;.zst&lt;/a&gt;&lt;/td&gt;&lt;td&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;
&lt;h1&gt;.tar (無壓縮)&lt;a href=&quot;#tar-無壓縮&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;/a&gt;&lt;/h1&gt;
&lt;ul&gt;
&lt;li&gt;打包&lt;/li&gt;
&lt;/ul&gt;
&lt;pre&gt;&lt;code&gt;&lt;span&gt;&lt;span&gt;tar&lt;/span&gt;&lt;span&gt; cvf&lt;/span&gt;&lt;span&gt; dir.tar&lt;/span&gt;&lt;span&gt; dir_name&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;ul&gt;
&lt;li&gt;解包&lt;/li&gt;
&lt;/ul&gt;
&lt;pre&gt;&lt;code&gt;&lt;span&gt;&lt;span&gt;tar&lt;/span&gt;&lt;span&gt; xvf&lt;/span&gt;&lt;span&gt; dir.tar&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;h1&gt;.tar.gz&lt;a href=&quot;#targz&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;/a&gt;&lt;/h1&gt;
&lt;ul&gt;
&lt;li&gt;壓縮&lt;/li&gt;
&lt;/ul&gt;
&lt;pre&gt;&lt;code&gt;&lt;span&gt;&lt;span&gt;tar&lt;/span&gt;&lt;span&gt; zcvf&lt;/span&gt;&lt;span&gt; dir.tar.gz&lt;/span&gt;&lt;span&gt; dir_name&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;ul&gt;
&lt;li&gt;解壓縮&lt;/li&gt;
&lt;/ul&gt;
&lt;pre&gt;&lt;code&gt;&lt;span&gt;&lt;span&gt;tar&lt;/span&gt;&lt;span&gt; zxvf&lt;/span&gt;&lt;span&gt; dir.tar.gz&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;h1&gt;.tar.bz&lt;a href=&quot;#tarbz&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;/a&gt;&lt;/h1&gt;
&lt;ul&gt;
&lt;li&gt;壓縮&lt;/li&gt;
&lt;/ul&gt;
&lt;pre&gt;&lt;code&gt;&lt;span&gt;&lt;span&gt;tar&lt;/span&gt;&lt;span&gt; zcvf&lt;/span&gt;&lt;span&gt; dir.tar.gz&lt;/span&gt;&lt;span&gt; dir_name&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;ul&gt;
&lt;li&gt;解壓縮&lt;/li&gt;
&lt;/ul&gt;
&lt;pre&gt;&lt;code&gt;&lt;span&gt;&lt;span&gt;tar&lt;/span&gt;&lt;span&gt; jxvf&lt;/span&gt;&lt;span&gt; dir.tar.bz&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;h1&gt;.tar.bz2&lt;a href=&quot;#tarbz2&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;/a&gt;&lt;/h1&gt;
&lt;ul&gt;
&lt;li&gt;壓縮&lt;/li&gt;
&lt;/ul&gt;
&lt;pre&gt;&lt;code&gt;&lt;span&gt;&lt;span&gt;tar&lt;/span&gt;&lt;span&gt; jcvf&lt;/span&gt;&lt;span&gt; dir.tar.bz2&lt;/span&gt;&lt;span&gt; dir_name&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;ul&gt;
&lt;li&gt;解壓縮&lt;/li&gt;
&lt;/ul&gt;
&lt;pre&gt;&lt;code&gt;&lt;span&gt;&lt;span&gt;tar&lt;/span&gt;&lt;span&gt; jxvf&lt;/span&gt;&lt;span&gt; dir.tar.bz2&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;h1&gt;.tar.xz&lt;a href=&quot;#tarxz&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;/a&gt;&lt;/h1&gt;
&lt;ul&gt;
&lt;li&gt;壓縮&lt;/li&gt;
&lt;/ul&gt;
&lt;pre&gt;&lt;code&gt;&lt;span&gt;&lt;span&gt;tar&lt;/span&gt;&lt;span&gt; Jcvf&lt;/span&gt;&lt;span&gt; dir.tar.xz&lt;/span&gt;&lt;span&gt; dir_name&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;ul&gt;
&lt;li&gt;解壓縮&lt;/li&gt;
&lt;/ul&gt;
&lt;pre&gt;&lt;code&gt;&lt;span&gt;&lt;span&gt;tar&lt;/span&gt;&lt;span&gt; Jxvf&lt;/span&gt;&lt;span&gt; dir.tar.xz&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;h1&gt;.tar.Z&lt;a href=&quot;#tarz&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;/a&gt;&lt;/h1&gt;
&lt;ul&gt;
&lt;li&gt;壓縮&lt;/li&gt;
&lt;/ul&gt;
&lt;pre&gt;&lt;code&gt;&lt;span&gt;&lt;span&gt;tar&lt;/span&gt;&lt;span&gt; Zcvf&lt;/span&gt;&lt;span&gt; dir.tar.Z&lt;/span&gt;&lt;span&gt; dir_name&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;ul&gt;
&lt;li&gt;解壓縮&lt;/li&gt;
&lt;/ul&gt;
&lt;pre&gt;&lt;code&gt;&lt;span&gt;&lt;span&gt;tar&lt;/span&gt;&lt;span&gt; Zxvf&lt;/span&gt;&lt;span&gt; dir.tar.Z&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;h1&gt;.tgz&lt;a href=&quot;#tgz&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;/a&gt;&lt;/h1&gt;
&lt;ul&gt;
&lt;li&gt;壓縮&lt;/li&gt;
&lt;/ul&gt;
&lt;pre&gt;&lt;code&gt;&lt;span&gt;&lt;span&gt;tar&lt;/span&gt;&lt;span&gt; zcvf&lt;/span&gt;&lt;span&gt; dir.tgz&lt;/span&gt;&lt;span&gt; dir&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;ul&gt;
&lt;li&gt;解壓縮&lt;/li&gt;
&lt;/ul&gt;
&lt;pre&gt;&lt;code&gt;&lt;span&gt;&lt;span&gt;tar&lt;/span&gt;&lt;span&gt; zxvf&lt;/span&gt;&lt;span&gt; dir.tgz&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;h1&gt;.tar.tgz&lt;a href=&quot;#tartgz&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;/a&gt;&lt;/h1&gt;
&lt;ul&gt;
&lt;li&gt;壓縮&lt;/li&gt;
&lt;/ul&gt;
&lt;pre&gt;&lt;code&gt;&lt;span&gt;&lt;span&gt;tar&lt;/span&gt;&lt;span&gt; zcvf&lt;/span&gt;&lt;span&gt; dir.tar.tgz&lt;/span&gt;&lt;span&gt; dir&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;ul&gt;
&lt;li&gt;解壓縮&lt;/li&gt;
&lt;/ul&gt;
&lt;pre&gt;&lt;code&gt;&lt;span&gt;&lt;span&gt;tar&lt;/span&gt;&lt;span&gt; zxvf&lt;/span&gt;&lt;span&gt; dir.tar.tgz&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;h1&gt;.tar.zst&lt;a href=&quot;#tarzst&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;/a&gt;&lt;/h1&gt;
&lt;ul&gt;
&lt;li&gt;壓縮&lt;/li&gt;
&lt;/ul&gt;
&lt;pre&gt;&lt;code&gt;&lt;span&gt;&lt;span&gt;tar&lt;/span&gt;&lt;span&gt; -I&lt;/span&gt;&lt;span&gt; zstd&lt;/span&gt;&lt;span&gt; -cvf&lt;/span&gt;&lt;span&gt; dir.tar.zst&lt;/span&gt;&lt;span&gt; dir_name&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;ul&gt;
&lt;li&gt;解壓縮&lt;/li&gt;
&lt;/ul&gt;
&lt;pre&gt;&lt;code&gt;&lt;span&gt;&lt;span&gt;tar&lt;/span&gt;&lt;span&gt; -I&lt;/span&gt;&lt;span&gt; zstd&lt;/span&gt;&lt;span&gt; -xvf&lt;/span&gt;&lt;span&gt; dir.tar.zst&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;h1&gt;.gz&lt;a href=&quot;#gz&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;/a&gt;&lt;/h1&gt;
&lt;ul&gt;
&lt;li&gt;壓縮&lt;/li&gt;
&lt;/ul&gt;
&lt;pre&gt;&lt;code&gt;&lt;span&gt;&lt;span&gt;gzip&lt;/span&gt;&lt;span&gt; dir&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;ul&gt;
&lt;li&gt;解壓縮 1&lt;/li&gt;
&lt;/ul&gt;
&lt;pre&gt;&lt;code&gt;&lt;span&gt;&lt;span&gt;gunzip&lt;/span&gt;&lt;span&gt; dir.gz&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;ul&gt;
&lt;li&gt;解壓縮 2&lt;/li&gt;
&lt;/ul&gt;
&lt;pre&gt;&lt;code&gt;&lt;span&gt;&lt;span&gt;gzip&lt;/span&gt;&lt;span&gt; -d&lt;/span&gt;&lt;span&gt; dir.gz&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;h1&gt;.bz&lt;a href=&quot;#bz&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;/a&gt;&lt;/h1&gt;
&lt;ul&gt;
&lt;li&gt;解壓縮 1&lt;/li&gt;
&lt;/ul&gt;
&lt;pre&gt;&lt;code&gt;&lt;span&gt;&lt;span&gt;bzip2&lt;/span&gt;&lt;span&gt; -d&lt;/span&gt;&lt;span&gt; dir.bz&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;ul&gt;
&lt;li&gt;解壓縮 2&lt;/li&gt;
&lt;/ul&gt;
&lt;pre&gt;&lt;code&gt;&lt;span&gt;&lt;span&gt;bunzip2&lt;/span&gt;&lt;span&gt; dir.bz&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;h1&gt;.bz2&lt;a href=&quot;#bz2&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;/a&gt;&lt;/h1&gt;
&lt;ul&gt;
&lt;li&gt;壓縮&lt;/li&gt;
&lt;/ul&gt;
&lt;pre&gt;&lt;code&gt;&lt;span&gt;&lt;span&gt;bzip2&lt;/span&gt;&lt;span&gt; -z&lt;/span&gt;&lt;span&gt; dir&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;ul&gt;
&lt;li&gt;解壓縮 1&lt;/li&gt;
&lt;/ul&gt;
&lt;pre&gt;&lt;code&gt;&lt;span&gt;&lt;span&gt;bzip2&lt;/span&gt;&lt;span&gt; -d&lt;/span&gt;&lt;span&gt; dir.bz2&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;ul&gt;
&lt;li&gt;解壓縮 2&lt;/li&gt;
&lt;/ul&gt;
&lt;pre&gt;&lt;code&gt;&lt;span&gt;&lt;span&gt;bunzip2&lt;/span&gt;&lt;span&gt; dir.bz2&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;h1&gt;.xz&lt;a href=&quot;#xz&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;/a&gt;&lt;/h1&gt;
&lt;ul&gt;
&lt;li&gt;壓縮&lt;/li&gt;
&lt;/ul&gt;
&lt;pre&gt;&lt;code&gt;&lt;span&gt;&lt;span&gt;xz&lt;/span&gt;&lt;span&gt; -z&lt;/span&gt;&lt;span&gt; dir&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;ul&gt;
&lt;li&gt;解壓縮&lt;/li&gt;
&lt;/ul&gt;
&lt;pre&gt;&lt;code&gt;&lt;span&gt;&lt;span&gt;xz&lt;/span&gt;&lt;span&gt; -d&lt;/span&gt;&lt;span&gt; dir.xz&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;h1&gt;.Z&lt;a href=&quot;#z&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;/a&gt;&lt;/h1&gt;
&lt;ul&gt;
&lt;li&gt;壓縮&lt;/li&gt;
&lt;/ul&gt;
&lt;pre&gt;&lt;code&gt;&lt;span&gt;&lt;span&gt;compress&lt;/span&gt;&lt;span&gt; dir&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;ul&gt;
&lt;li&gt;解壓縮&lt;/li&gt;
&lt;/ul&gt;
&lt;pre&gt;&lt;code&gt;&lt;span&gt;&lt;span&gt;uncompress&lt;/span&gt;&lt;span&gt; dir.Z&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;h1&gt;.7z&lt;a href=&quot;#7z&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;/a&gt;&lt;/h1&gt;
&lt;ul&gt;
&lt;li&gt;壓縮&lt;/li&gt;
&lt;/ul&gt;
&lt;pre&gt;&lt;code&gt;&lt;span&gt;&lt;span&gt;7z&lt;/span&gt;&lt;span&gt; a&lt;/span&gt;&lt;span&gt; dir.7z&lt;/span&gt;&lt;span&gt; dir&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;ul&gt;
&lt;li&gt;使用密碼 (PASSWORD) 壓縮&lt;/li&gt;
&lt;/ul&gt;
&lt;pre&gt;&lt;code&gt;&lt;span&gt;&lt;span&gt;7z&lt;/span&gt;&lt;span&gt; a&lt;/span&gt;&lt;span&gt; dir.7z&lt;/span&gt;&lt;span&gt; dir&lt;/span&gt;&lt;span&gt; -pPASSWORD&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;ul&gt;
&lt;li&gt;解壓縮&lt;/li&gt;
&lt;/ul&gt;
&lt;pre&gt;&lt;code&gt;&lt;span&gt;&lt;span&gt;7z&lt;/span&gt;&lt;span&gt; x&lt;/span&gt;&lt;span&gt; dir.7z&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;h1&gt;.zip&lt;a href=&quot;#zip&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;/a&gt;&lt;/h1&gt;
&lt;ul&gt;
&lt;li&gt;壓縮&lt;/li&gt;
&lt;/ul&gt;
&lt;pre&gt;&lt;code&gt;&lt;span&gt;&lt;span&gt;zip&lt;/span&gt;&lt;span&gt; -r&lt;/span&gt;&lt;span&gt; dir.zip&lt;/span&gt;&lt;span&gt; dir_name&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;ul&gt;
&lt;li&gt;解壓縮&lt;/li&gt;
&lt;/ul&gt;
&lt;pre&gt;&lt;code&gt;&lt;span&gt;&lt;span&gt;unzip&lt;/span&gt;&lt;span&gt; dir.zip&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;h1&gt;.rar&lt;a href=&quot;#rar&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;/a&gt;&lt;/h1&gt;
&lt;ul&gt;
&lt;li&gt;壓縮&lt;/li&gt;
&lt;/ul&gt;
&lt;pre&gt;&lt;code&gt;&lt;span&gt;&lt;span&gt;rar&lt;/span&gt;&lt;span&gt; a&lt;/span&gt;&lt;span&gt; dir.rar&lt;/span&gt;&lt;span&gt; dir_name&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;ul&gt;
&lt;li&gt;解壓縮 1&lt;/li&gt;
&lt;/ul&gt;
&lt;pre&gt;&lt;code&gt;&lt;span&gt;&lt;span&gt;rar&lt;/span&gt;&lt;span&gt; e&lt;/span&gt;&lt;span&gt; dir.rar&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;ul&gt;
&lt;li&gt;解壓縮 2&lt;/li&gt;
&lt;/ul&gt;
&lt;pre&gt;&lt;code&gt;&lt;span&gt;&lt;span&gt;unrar&lt;/span&gt;&lt;span&gt; e&lt;/span&gt;&lt;span&gt; dir.rar&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;ul&gt;
&lt;li&gt;解壓縮 3 在指定目錄內解壓縮。&lt;/li&gt;
&lt;/ul&gt;
&lt;pre&gt;&lt;code&gt;&lt;span&gt;&lt;span&gt;rar&lt;/span&gt;&lt;span&gt; x&lt;/span&gt;&lt;span&gt; dir.rar&lt;/span&gt;&lt;span&gt; dir_name&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;h1&gt;.lha&lt;a href=&quot;#lha&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;/a&gt;&lt;/h1&gt;
&lt;ul&gt;
&lt;li&gt;壓縮&lt;/li&gt;
&lt;/ul&gt;
&lt;pre&gt;&lt;code&gt;&lt;span&gt;&lt;span&gt;lha&lt;/span&gt;&lt;span&gt; -a&lt;/span&gt;&lt;span&gt; dir.lha&lt;/span&gt;&lt;span&gt; dir&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;ul&gt;
&lt;li&gt;解壓縮&lt;/li&gt;
&lt;/ul&gt;
&lt;pre&gt;&lt;code&gt;&lt;span&gt;&lt;span&gt;lha&lt;/span&gt;&lt;span&gt; -e&lt;/span&gt;&lt;span&gt; dir.lha&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;h1&gt;.zst&lt;a href=&quot;#zst&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;/a&gt;&lt;/h1&gt;
&lt;ul&gt;
&lt;li&gt;壓縮&lt;/li&gt;
&lt;/ul&gt;
&lt;pre&gt;&lt;code&gt;&lt;span&gt;&lt;span&gt;zst&lt;/span&gt;&lt;span&gt; dir&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;ul&gt;
&lt;li&gt;解壓縮&lt;/li&gt;
&lt;/ul&gt;
&lt;pre&gt;&lt;code&gt;&lt;span&gt;&lt;span&gt;zstd&lt;/span&gt;&lt;span&gt; -d&lt;/span&gt;&lt;span&gt; dir.zst&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;a href=&quot;/tags/Linux/&quot;&gt;Linux&lt;/a&gt;&lt;a href=&quot;/tags/%E8%A7%A3%E5%A3%93%E7%B8%AE/&quot;&gt;解壓縮&lt;/a&gt;&lt;a href=&quot;/tags/%E5%A3%93%E7%B8%AE/&quot;&gt;壓縮&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;此文章已被阅读次数&lt;/p&gt;&lt;div&gt;&lt;/div&gt;…更新於 2024-04-09&lt;p&gt;&lt;/p&gt;</content:encoded><category>category:linux</category><category>tag:Linux</category><category>tag:解壓縮</category><category>tag:壓縮</category></item><item><title>HyperX QuadCast 聲音很小</title><link>https://preview.astro.kaitaku.xyz/post/windows/hyperx-quadcast-%E8%81%B2%E9%9F%B3%E5%BE%88%E5%B0%8F</link><guid isPermaLink="false">windows/hyperx-quadcast-聲音很小</guid><description>HyperX QuadCast 聲音很小
因為正在服役的 HyperX cloud 耳麥的麥克風已經半死不活了，趁著 1212 的時候坑了一隻 HyperX QuadCast
然後因為是桌上型的 mic 所以距離嘴巴其實有一段不小的距離 (中間還隔了鍵盤)
image</description><pubDate>Fri, 16 Dec 2022 16:00:00 GMT</pubDate><content:encoded>&lt;h1&gt;HyperX QuadCast 聲音很小&lt;a href=&quot;#hyperx-quadcast-聲音很小&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;/a&gt;&lt;/h1&gt;
&lt;p&gt;因為正在服役的 HyperX cloud 耳麥的麥克風已經半死不活了，趁著 1212 的時候坑了一隻 HyperX QuadCast&lt;/p&gt;
&lt;p&gt;然後因為是桌上型的 mic 所以距離嘴巴其實有一段不小的距離 (中間還隔了鍵盤)&lt;br /&gt;
&lt;/p&gt;&lt;figure&gt;&lt;img src=&quot;/assets/images/windows/post/hyperx_quadcast.webp&quot; alt=&quot;image&quot; loading=&quot;lazy&quot; /&gt;&lt;figcaption&gt;image&lt;/figcaption&gt;&lt;/figure&gt;&lt;p&gt;&lt;/p&gt;
&lt;p&gt;但在平時白天被朋友說講話的聲音很小聲，就整個很困惑，明明已經把增益轉到最大了還小聲？！&lt;br /&gt;
然後就看到這篇文章&lt;br /&gt;
但請各位小心服用 畢竟會對硬體造成什麼影響目前我也不知道&lt;/p&gt;
&lt;p&gt;如果您的設備直接或間接損壞，我拒絕承擔任何責任，請自行考慮好再使用～&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://www.reddit.com/r/HyperX/comments/97s0ez/hyperx_cloud_2_quiet_mic_solved/&quot;&gt;來源文章&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;簡單濃縮來說就是使用軟體 &lt;code&gt;Equalizer APO&lt;/code&gt; 和其擴充套件 &lt;code&gt;Peace&lt;/code&gt; 來提高麥克風音量&lt;/p&gt;
&lt;p&gt;實際的操作如下…&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;安裝 Equalizer APO&lt;br /&gt;
一般來說只要下一步下一步安裝完之後會跳出 Configurator 要求選擇哪個裝置，例如我是要讓 HyperX QuadCast 就選擇這個裝置&lt;br /&gt;
如果沒有跳出來則打開程式目錄並啟動 Configurator.exe，轉到 “捕獲設備” 並選擇 / 勾選麥克風&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://sourceforge.net/projects/equalizerapo/&quot;&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://sourceforge.net/projects/equalizerapo/&quot;&gt;Equalizer APO (sourceforge)&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Equalizer APO 下載頁面&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;安裝 Peace&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://sourceforge.net/projects/peace-equalizer-apo-extension/&quot;&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://sourceforge.net/projects/peace-equalizer-apo-extension/&quot;&gt;Peace Equalizer, interface Equalizer APO (sourceforge)&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Peace Equalizer, interface Equalizer APO 下載頁面&lt;/p&gt;
&lt;p&gt;Peace 就比較簡單有中文介面，安裝完之後選擇 “簡潔介面”&lt;/p&gt;
&lt;p&gt;首先從右下角的菜單中選擇您的麥克風 (預設為 “全部音訊設備”)&lt;br /&gt;
然後就可以在最上面調整想要大聲還是小聲&lt;br /&gt;
最後再按完成就完成調整麥克風大小聲拉～&lt;br /&gt;
&lt;/p&gt;&lt;figure&gt;&lt;img src=&quot;https://user-images.githubusercontent.com/12424898/208232169-88e470a5-186b-4c95-929c-91e2d125c2fa.png&quot; alt=&quot;image&quot; loading=&quot;lazy&quot; /&gt;&lt;figcaption&gt;image&lt;/figcaption&gt;&lt;/figure&gt;&lt;p&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;&lt;a href=&quot;/tags/windows/&quot;&gt;windows&lt;/a&gt;&lt;a href=&quot;/tags/%E9%BA%A5%E5%85%8B%E9%A2%A8%E5%BE%88%E5%B0%8F%E8%81%B2/&quot;&gt;麥克風很小聲&lt;/a&gt;&lt;a href=&quot;/tags/HyperX/&quot;&gt;HyperX&lt;/a&gt;&lt;a href=&quot;/tags/QuadCast/&quot;&gt;QuadCast&lt;/a&gt;&lt;a href=&quot;/tags/HyperX-QuadCast/&quot;&gt;HyperX QuadCast&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;此文章已被阅读次数&lt;/p&gt;&lt;div&gt;&lt;/div&gt;…更新於 2022-12-17&lt;p&gt;&lt;/p&gt;</content:encoded><category>category:windows</category><category>tag:windows</category><category>tag:麥克風很小聲</category><category>tag:HyperX</category><category>tag:QuadCast</category><category>tag:HyperX QuadCast</category></item><item><title>Minecraft 安裝 fabric</title><link>https://preview.astro.kaitaku.xyz/post/games/minecraft/minecraft-%E5%AE%89%E8%A3%9D-fabric</link><guid isPermaLink="false">games/minecraft/minecraft-安裝-fabric</guid><description>前言 (廢話 w)
玩 minecraft 到最後一定會想玩玩廣大開發者開發的各種 mods
而現在整個 minecraft vanilla 版本的 mod loader 就兩個

fabric
forge

而這邊介紹 fabric 的安裝流程
準備好 minecraft 客戶端</description><pubDate>Thu, 15 Sep 2022 16:00:00 GMT</pubDate><content:encoded>&lt;h1&gt;前言 (廢話 w)&lt;a href=&quot;#前言-廢話-w&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;/a&gt;&lt;/h1&gt;
&lt;p&gt;玩 minecraft 到最後一定會想玩玩廣大開發者開發的各種 mods&lt;br /&gt;
而現在整個 minecraft vanilla 版本的 mod loader 就兩個&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;fabric&lt;/li&gt;
&lt;li&gt;forge&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;而這邊介紹 fabric 的安裝流程&lt;/p&gt;
&lt;h1&gt;準備好 minecraft 客戶端&lt;a href=&quot;#準備好-minecraft-客戶端&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;/a&gt;&lt;/h1&gt;
&lt;p&gt;當你下載好了客戶端並且看到下方的畫面的時候就先放著不理它，這邊就已經可以準備安裝 fabric&lt;br /&gt;
&lt;/p&gt;&lt;figure&gt;&lt;img src=&quot;https://user-images.githubusercontent.com/12424898/190607741-a1ffe80f-64b7-48bf-a8d9-7e1457cf48b3.png&quot; alt=&quot;image&quot; loading=&quot;lazy&quot; /&gt;&lt;figcaption&gt;image&lt;/figcaption&gt;&lt;/figure&gt;&lt;p&gt;&lt;/p&gt;
&lt;h1&gt;下載 fabric&lt;a href=&quot;#下載-fabric&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;/a&gt;&lt;/h1&gt;
&lt;p&gt;前往 &lt;a href=&quot;https://fabricmc.net/use/installer/&quot;&gt;fabric&lt;/a&gt; 下載 fabric&lt;/p&gt;
&lt;p&gt;開啟頁面後可以選擇下載 jar 檔或 exe 檔，兩個都可以使用&lt;br /&gt;
下載後會看到這個 UI&lt;br /&gt;
&lt;/p&gt;&lt;figure&gt;&lt;img src=&quot;https://user-images.githubusercontent.com/12424898/190611089-abb290be-78ed-4eae-b27a-681087498121.png&quot; alt=&quot;image&quot; loading=&quot;lazy&quot; /&gt;&lt;figcaption&gt;image&lt;/figcaption&gt;&lt;/figure&gt;&lt;p&gt;&lt;/p&gt;
&lt;p&gt;注意 1 確定上方頁籤是: “客戶端”&lt;br /&gt;
注意 2 確定 “Minecraft 版本” 是你即將遊玩的版本號&lt;br /&gt;
注意 3 確定 “安裝位置” 這個位置如果沒有&lt;strong&gt;刻意&lt;/strong&gt;去做調整就預設即可&lt;br /&gt;
注意 4 確定 “建立設定檔” 這個選項有打勾&lt;/p&gt;
&lt;figure&gt;&lt;img src=&quot;https://user-images.githubusercontent.com/12424898/190611323-9b791f77-86ea-4a0d-aa8c-80dd51f15b89.png&quot; alt=&quot;image&quot; loading=&quot;lazy&quot; /&gt;&lt;figcaption&gt;image&lt;/figcaption&gt;&lt;/figure&gt;
&lt;p&gt;接著把 minecraft 客戶端關閉，並且在 _&lt;strong&gt;fabric 安裝程式&lt;/strong&gt;_中直接按下安裝就會開始安裝 fabric&lt;/p&gt;
&lt;p&gt;等待安裝完後再開啟 minecraft 客戶端，就會看到新的設定檔&lt;/p&gt;
&lt;figure&gt;&lt;img src=&quot;https://user-images.githubusercontent.com/12424898/190612152-41def0bb-276e-4dac-ad08-4d3bfd53f482.png&quot; alt=&quot;image&quot; loading=&quot;lazy&quot; /&gt;&lt;figcaption&gt;image&lt;/figcaption&gt;&lt;/figure&gt;
&lt;h1&gt;安裝 mods&lt;a href=&quot;#安裝-mods&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;/a&gt;&lt;/h1&gt;
&lt;p&gt;安裝 mods 很簡單，只要在 minecraft 客戶端上方的頁籤切換成 &lt;strong&gt;“安裝檔”&lt;/strong&gt;&lt;br /&gt;
並懸停在 fabric 的設定檔上，後方就會有三個按鈕可以按，點擊第二個會開啟資料夾&lt;br /&gt;
&lt;/p&gt;&lt;figure&gt;&lt;img src=&quot;https://user-images.githubusercontent.com/12424898/190612475-075b2c2e-b548-4fa7-bbe0-94cf6472d77b.png&quot; alt=&quot;image&quot; loading=&quot;lazy&quot; /&gt;&lt;figcaption&gt;image&lt;/figcaption&gt;&lt;/figure&gt;&lt;p&gt;&lt;/p&gt;
&lt;p&gt;此時只要將你下載的 fabric mods 放入 mods 資料夾內，重開遊戲就會自動載入 mods 了&lt;br /&gt;
&lt;/p&gt;&lt;figure&gt;&lt;img src=&quot;https://user-images.githubusercontent.com/12424898/190613055-b20118fc-db4e-4690-908f-0a632cee36d4.png&quot; alt=&quot;image&quot; loading=&quot;lazy&quot; /&gt;&lt;figcaption&gt;image&lt;/figcaption&gt;&lt;/figure&gt;&lt;p&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;/tags/games/&quot;&gt;games&lt;/a&gt;&lt;a href=&quot;/tags/minecraft/&quot;&gt;minecraft&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;此文章已被阅读次数&lt;/p&gt;&lt;div&gt;&lt;/div&gt;…更新於 2022-09-16&lt;p&gt;&lt;/p&gt;</content:encoded><category>category:games</category><category>category:minecraft</category><category>tag:games</category><category>tag:minecraft</category></item><item><title>DSM photo、drive 反向代理</title><link>https://preview.astro.kaitaku.xyz/post/synology/dsm-photodrive-%E5%8F%8D%E5%90%91%E4%BB%A3%E7%90%86</link><guid isPermaLink="false">synology/dsm-photodrive-反向代理</guid><description>DSM photo、drive 反向代理
預設 Synology 的 NAS photo 和 drive 兩個應用程式的 port 是與 DSM 相同
http 5000
https 5001
image
image
image
詳細的套件對應 port 可以參考 Synology 官方的文件</description><pubDate>Wed, 24 Aug 2022 16:00:00 GMT</pubDate><content:encoded>&lt;h1&gt;DSM photo、drive 反向代理&lt;a href=&quot;#dsm-photodrive-反向代理&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;/a&gt;&lt;/h1&gt;
&lt;p&gt;預設 Synology 的 NAS photo 和 drive 兩個應用程式的 port 是與 DSM 相同&lt;br /&gt;
http 5000&lt;br /&gt;
https 5001&lt;br /&gt;
&lt;/p&gt;&lt;figure&gt;&lt;img src=&quot;https://user-images.githubusercontent.com/12424898/186729195-d5316b2c-c527-4d59-85d1-aec53e80fc21.png&quot; alt=&quot;image&quot; loading=&quot;lazy&quot; /&gt;&lt;figcaption&gt;image&lt;/figcaption&gt;&lt;/figure&gt;&lt;br /&gt;
&lt;figure&gt;&lt;img src=&quot;https://user-images.githubusercontent.com/12424898/186729301-f985e8ed-bb6d-4a88-8980-1c88c094db85.png&quot; alt=&quot;image&quot; loading=&quot;lazy&quot; /&gt;&lt;figcaption&gt;image&lt;/figcaption&gt;&lt;/figure&gt;&lt;br /&gt;
&lt;figure&gt;&lt;img src=&quot;https://user-images.githubusercontent.com/12424898/186729388-436a4809-a905-4302-bd24-2fa64561f4f2.png&quot; alt=&quot;image&quot; loading=&quot;lazy&quot; /&gt;&lt;figcaption&gt;image&lt;/figcaption&gt;&lt;/figure&gt;&lt;p&gt;&lt;/p&gt;
&lt;p&gt;詳細的套件對應 port 可以參考 &lt;a href=&quot;https://kb.synology.com/zh-tw/DSM/tutorial/What_network_ports_are_used_by_Synology_services&quot;&gt;Synology 官方的文件&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;所以今天如果我們要在外面使用&lt;strong&gt;自有網域&lt;/strong&gt;透過網際網路存取 photo 和 drive 有兩種方式&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;利用群輝自帶的 QuickConnect&lt;/li&gt;
&lt;li&gt;利用反向代理&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;第一個就不在此敘述如何設定，故這裡要使用的是第二個，利用反向代理&lt;/p&gt;
&lt;h2&gt;設定 photo 和 drive 的 port&lt;a href=&quot;#設定-photo-和-drive-的-port&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;首先我們要先修改 photo 和 drive 的應用程式所使用的 port&lt;br /&gt;
進到 &lt;code&gt;DSM -&amp;gt; 控制台 -&amp;gt; 登入入口 -&amp;gt; 應用程式 -&amp;gt; Synology Drive&lt;/code&gt;&lt;br /&gt;
在自訂連接埠設定 https 的 port 值，&lt;/p&gt;
&lt;p&gt;測試 warning 提醒&lt;/p&gt;
&lt;p&gt;這邊設定的 http 或 https 和 port 會影響到後續的反向代理設定&lt;br /&gt;
這邊舉例使用 https 並且連接埠 (port) 為 20000&lt;/p&gt;
&lt;figure&gt;&lt;img src=&quot;https://user-images.githubusercontent.com/12424898/186730230-e3fd170c-a3b0-4f76-b340-e07ac31ee40c.png&quot; alt=&quot;image&quot; loading=&quot;lazy&quot; /&gt;&lt;figcaption&gt;image&lt;/figcaption&gt;&lt;/figure&gt;
&lt;h2&gt;設定反向代理&lt;a href=&quot;#設定反向代理&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;接著到 &lt;code&gt;控制台 -&amp;gt; 登入入口 -&amp;gt; 進階 -&amp;gt; 反向代理&lt;/code&gt; 新增反向代理&lt;br /&gt;
&lt;/p&gt;&lt;figure&gt;&lt;img src=&quot;https://user-images.githubusercontent.com/12424898/186730915-278f431b-a7ad-4f1c-a234-17f0acb0c72d.png&quot; alt=&quot;image&quot; loading=&quot;lazy&quot; /&gt;&lt;figcaption&gt;image&lt;/figcaption&gt;&lt;/figure&gt;&lt;p&gt;&lt;/p&gt;
&lt;figure&gt;&lt;img src=&quot;https://user-images.githubusercontent.com/12424898/186731409-e2085639-8d89-4c1f-aabb-697e8d666ae6.png&quot; alt=&quot;image&quot; loading=&quot;lazy&quot; /&gt;&lt;figcaption&gt;image&lt;/figcaption&gt;&lt;/figure&gt;
&lt;h3&gt;反向代理 - 來源&lt;a href=&quot;#反向代理---來源&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;反向代理名稱 輸入一個你自己懂得這是什麼服務的名字&lt;br /&gt;
通訊協定 在 &lt;a href=&quot;#%E8%A8%AD%E5%AE%9A-photo-%E5%92%8C-drive-%E7%9A%84-port&quot;&gt;設定 photo 和 drive 的 port&lt;/a&gt; 的地方所設定的連接埠 (port) 所對應的協定，這邊舉例使用 https 並且連接埠 (port) 為 20000&lt;br /&gt;
主機名稱 因為是 NAS 本機服務，所以這邊都是使用 &lt;code&gt;localhost&lt;/code&gt;&lt;br /&gt;
連接埠 在 &lt;a href=&quot;#%E8%A8%AD%E5%AE%9A-photo-%E5%92%8C-drive-%E7%9A%84-port&quot;&gt;設定 photo 和 drive 的 port&lt;/a&gt; 的地方所設定的連接埠 (port)，這邊舉例為 20000&lt;/p&gt;
&lt;h3&gt;反向代理 - 目的地&lt;a href=&quot;#反向代理---目的地&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;通訊協定 這邊建議都選擇 &lt;code&gt;https&lt;/code&gt; 可以到 &lt;code&gt;控制台 -&amp;gt; 安全性 -&amp;gt; 憑證&lt;/code&gt; 申請一個 TLS 證書&lt;br /&gt;
主機名稱 你的網域，例如我要用 &lt;code&gt;photo.example.com&lt;/code&gt; 開啟 photo 服務 就在此輸入 &lt;code&gt;photo.example.com&lt;/code&gt;&lt;br /&gt;
連接埠 如果第一個&lt;strong&gt;通訊協定&lt;/strong&gt;選擇為 https 這邊就要是 443；http 為 80&lt;br /&gt;
整體設定後就如下圖&lt;br /&gt;
&lt;/p&gt;&lt;figure&gt;&lt;img src=&quot;https://user-images.githubusercontent.com/12424898/186734520-b1c15620-0080-4329-a819-0163a212ee2d.png&quot; alt=&quot;image&quot; loading=&quot;lazy&quot; /&gt;&lt;figcaption&gt;image&lt;/figcaption&gt;&lt;/figure&gt;&lt;p&gt;&lt;/p&gt;
&lt;p&gt;設定完成後就可以透過自己的網域訪問服務啦&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;/tags/Synology/&quot;&gt;Synology&lt;/a&gt;&lt;a href=&quot;/tags/NAS/&quot;&gt;NAS&lt;/a&gt;&lt;a href=&quot;/tags/DSM/&quot;&gt;DSM&lt;/a&gt;&lt;a href=&quot;/tags/Synology-photo/&quot;&gt;Synology photo&lt;/a&gt;&lt;a href=&quot;/tags/Synology-drive/&quot;&gt;Synology drive&lt;/a&gt;&lt;a href=&quot;/tags/%E5%8F%8D%E5%90%91%E4%BB%A3%E7%90%86/&quot;&gt;反向代理&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;此文章已被阅读次数&lt;/p&gt;&lt;div&gt;&lt;/div&gt;…更新於 2024-03-31&lt;p&gt;&lt;/p&gt;</content:encoded><category>category:synology</category><category>tag:Synology</category><category>tag:NAS</category><category>tag:DSM</category><category>tag:Synology photo</category><category>tag:Synology drive</category><category>tag:反向代理</category></item><item><title>let&apos;s encrypt 證書簽署失敗 bad handshake</title><link>https://preview.astro.kaitaku.xyz/post/linux/let-s-encrypt-%E8%AD%89%E6%9B%B8%E7%B0%BD%E7%BD%B2%E5%A4%B1%E6%95%97-bad-handshake</link><guid isPermaLink="false">linux/let-s-encrypt-證書簽署失敗-bad-handshake</guid><description>
let’s encrypt 證書簽署失敗 bad handshake
當平時自動運作的 Let’s encrypt 都正常運作時，最近要簽署新證書卻發現下 certbot renew 無法正常簽署並出現錯誤 unexpected error: bad handshake 要怎麼處理這問題呢</description><pubDate>Wed, 15 Dec 2021 16:00:00 GMT</pubDate><content:encoded>&lt;figure&gt;&lt;img src=&quot;/assets/images/linux/cover/hotlink-ok/LetsEncrypt-SocialShare.webp&quot; alt=&quot;&quot; loading=&quot;lazy&quot; /&gt;&lt;/figure&gt;
&lt;h1&gt;let’s encrypt 證書簽署失敗 bad handshake&lt;a href=&quot;#lets-encrypt-證書簽署失敗-bad-handshake&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;/a&gt;&lt;/h1&gt;
&lt;p&gt;當平時自動運作的 Let’s encrypt 都正常運作時，最近要簽署新證書卻發現下 &lt;code&gt;certbot renew&lt;/code&gt; 無法正常簽署並出現錯誤 &lt;strong&gt;unexpected error: bad handshake&lt;/strong&gt; 要怎麼處理這問題呢&lt;/p&gt;
&lt;p&gt;其實這問題在先前官方有公告要調整 root 證書&lt;a href=&quot;https://letsencrypt.org/zh-tw/docs/dst-root-ca-x3-expiration-september-2021/&quot;&gt;公告&lt;/a&gt;，原先使用的 DST Root CA X3 將於 2021 年 9 月 30 日到期，而新的 ISRG Root X1 在舊裝置上並不存在，所以導致切換成 ISRG Root X1 而舊裝置找不到該憑證就導致 TLS handshake 失敗&lt;/p&gt;
&lt;p&gt;最簡單就是更新套件，而有些主機可能因為歷史包袱不好做套件更新等等處理，所以就手動新增 ISRG Root X1 證書來驗證&lt;/p&gt;
&lt;p&gt;首先先測試看看能不能訪問新的驗證端 API&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;&lt;span&gt;&lt;span&gt;curl&lt;/span&gt;&lt;span&gt; -v&lt;/span&gt;&lt;span&gt; https://acme-v02.api.letsencrypt.org/directory&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;回傳的結果應該會有個 &lt;code&gt;SSL certificate problem: unable to get local issuer certificate&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;接著到官網這邊取得 &lt;a href=&quot;https://letsencrypt.org/zh-tw/certificates/&quot;&gt;ISRG Root X1 證書&lt;/a&gt;&lt;/p&gt;
&lt;figure&gt;&lt;img src=&quot;/assets/images/linux/post/Snipaste_2021-12-16_17-45-15.webp&quot; alt=&quot;ISRG Root X1 證書&quot; loading=&quot;lazy&quot; /&gt;&lt;figcaption&gt;ISRG Root X1 證書&lt;/figcaption&gt;&lt;/figure&gt;
&lt;p&gt;將裡面的文字複製起來，並且到主機中的 &lt;code&gt;/usr/local/share/ca-certificates&lt;/code&gt; 建立一個檔案 &lt;code&gt;isrgrootx1.pem&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;接著將內容貼上該檔案中，然後執行 &lt;code&gt;sudo update-ca-certificates&lt;/code&gt; 正常會顯示 &lt;code&gt;1 add&lt;/code&gt; ，此時在進行 &lt;code&gt;certbot renew&lt;/code&gt; 就可以正常執行了&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;/tags/Linux/&quot;&gt;Linux&lt;/a&gt;&lt;a href=&quot;/tags/let-s-encrypt/&quot;&gt;let’s encrypt&lt;/a&gt;&lt;a href=&quot;/tags/bad-handshake/&quot;&gt;bad handshake&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;此文章已被阅读次数&lt;/p&gt;&lt;div&gt;&lt;/div&gt;…更新於 2022-08-25&lt;p&gt;&lt;/p&gt;</content:encoded><category>category:linux</category><category>tag:Linux</category><category>tag:let&apos;s encrypt</category><category>tag:bad handshake</category></item><item><title>CentOS 安裝 Webmin</title><link>https://preview.astro.kaitaku.xyz/post/linux/centos-%E5%AE%89%E8%A3%9D-webmin</link><guid isPermaLink="false">linux/centos-安裝-webmin</guid><description>利用 yum 安裝 Webmin
首先先下載 repo 到 /etc/yum.repos.d
cd /etc/yum.repos.d
接著 yum install 安裝即可
yum install webmin -y
LinuxWebminCentOS
此文章已被阅读次数…更新於</description><pubDate>Fri, 15 May 2020 16:00:00 GMT</pubDate><content:encoded>&lt;p&gt;利用 yum 安裝 Webmin&lt;/p&gt;
&lt;p&gt;首先先下載 repo 到 /etc/yum.repos.d&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;&lt;span&gt;&lt;span&gt;cd&lt;/span&gt;&lt;span&gt; /etc/yum.repos.d&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;接著 yum install 安裝即可&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;&lt;span&gt;&lt;span&gt;yum&lt;/span&gt;&lt;span&gt; install&lt;/span&gt;&lt;span&gt; webmin&lt;/span&gt;&lt;span&gt; -y&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;a href=&quot;/tags/Linux/&quot;&gt;Linux&lt;/a&gt;&lt;a href=&quot;/tags/Webmin/&quot;&gt;Webmin&lt;/a&gt;&lt;a href=&quot;/tags/CentOS/&quot;&gt;CentOS&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;此文章已被阅读次数&lt;/p&gt;&lt;div&gt;&lt;/div&gt;…更新於 2022-08-24&lt;p&gt;&lt;/p&gt;</content:encoded><category>category:linux</category><category>tag:Linux</category><category>tag:Webmin</category><category>tag:CentOS</category></item><item><title>Centos7 安裝多版本 Python</title><link>https://preview.astro.kaitaku.xyz/post/linux/centos7-%E5%AE%89%E8%A3%9D%E5%A4%9A%E7%89%88%E6%9C%AC-python</link><guid isPermaLink="false">linux/centos7-安裝多版本-python</guid><description>雖然現在 Python 最新版本已經到了 3.7 但是 Linux 上還是有蠻多的套件使用 Python2，加上 Python2.7 的支援期間只到 2020 (不知是否會再延長)，但越來越多的開發者已經轉移版本到 3.x 了
那要如何保留原始版本的 Python 另外再安裝 Python3.x</description><pubDate>Sat, 28 Sep 2019 16:00:00 GMT</pubDate><content:encoded>&lt;p&gt;雖然現在 Python 最新版本已經到了 3.7 但是 Linux 上還是有蠻多的套件使用 Python2，加上 Python2.7 的支援期間只到 2020 (不知是否會再延長)，但越來越多的開發者已經轉移版本到 3.x 了&lt;br /&gt;
那要如何保留原始版本的 Python 另外再安裝 Python3.x 呢？&lt;br /&gt;
首先要有 ROOT 權限或者 sudo (廢話 w&lt;br /&gt;
然後到 &lt;a href=&quot;https://www.python.org/downloads/&quot;&gt;Python 官網&lt;/a&gt;找你要下載的版本連結&lt;br /&gt;
ps: 這邊範例為下載最新版本 3.7.4&lt;br /&gt;
如果要安裝多個 3.x 建議還是寫完整版號&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;&lt;span&gt;&lt;span&gt;cd&lt;/span&gt;&lt;span&gt; /tmp&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;大致上到這邊就是完成安裝，但是不管用 python3 python3.7 python37 都是回應 command not found&lt;br /&gt;
很簡單因為剛剛安裝完沒有在預設的 command 資料夾中&lt;br /&gt;
所以我們要建立軟連結&lt;br /&gt;
PS: 這邊也是做個範例&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;&lt;span&gt;&lt;span&gt;ln&lt;/span&gt;&lt;span&gt; -s&lt;/span&gt;&lt;span&gt; /usr/local/python3/bin/python3&lt;/span&gt;&lt;span&gt; /usr/bin/python3&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;這樣子你再執行 &lt;code&gt;python3 -V&lt;/code&gt; 照理就會出現 Python3.x.x 的訊息，同時執行 &lt;code&gt;python -V&lt;/code&gt; 會得到 Python2.7.5&lt;br /&gt;
這樣就安裝好其他版本的 Python 也保留預設的 Python2.7&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;/tags/Linux/&quot;&gt;Linux&lt;/a&gt;&lt;a href=&quot;/tags/Python/&quot;&gt;Python&lt;/a&gt;&lt;a href=&quot;/tags/Centos7/&quot;&gt;Centos7&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;此文章已被阅读次数&lt;/p&gt;&lt;div&gt;&lt;/div&gt;…更新於 2022-08-25&lt;p&gt;&lt;/p&gt;</content:encoded><category>category:linux</category><category>tag:Linux</category><category>tag:Python</category><category>tag:Centos7</category></item><item><title>phpMyAdmin 啟用2FA</title><link>https://preview.astro.kaitaku.xyz/post/linux/phpmyadmin-%E5%95%9F%E7%94%A82fa</link><guid isPermaLink="false">linux/phpmyadmin-啟用2fa</guid><description>phpMyAdmin 啟用 2FA
最近把伺服器的 phpMyAdmin 升級到 4.9.1
然後就在設定裡面發現可以開啟 2FA 的選項
phpMyAdmin 中啟用 2FA
後來去看看 documentation 之後發現其實在 4.8.0 (2018/4/19)</description><pubDate>Tue, 24 Sep 2019 16:00:00 GMT</pubDate><content:encoded>&lt;h1&gt;phpMyAdmin 啟用 2FA&lt;a href=&quot;#phpmyadmin-啟用-2fa&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;/a&gt;&lt;/h1&gt;
&lt;p&gt;最近把伺服器的 phpMyAdmin 升級到 4.9.1&lt;br /&gt;
然後就在設定裡面發現可以開啟 2FA 的選項&lt;/p&gt;
&lt;figure&gt;&lt;img src=&quot;/assets/images/linux/post/phpmyadmin-enable-2fa.webp&quot; alt=&quot;phpMyAdmin 中啟用 2FA&quot; loading=&quot;lazy&quot; /&gt;&lt;figcaption&gt;phpMyAdmin 中啟用 2FA&lt;/figcaption&gt;&lt;/figure&gt;
&lt;p&gt;後來去看看 documentation 之後發現其實在 4.8.0 (2018/4/19) 就加入這個功能了，沒錯啦我就是沒在更新，因為之前有過更新完系統直接掛掉的陰影存在，但其實為了安全性還是要好好的更新套件跟軟體 XD&lt;/p&gt;
&lt;p&gt;如果直接從 phpMyAdmin 官網下載下來的 zip 檔其實可以直接啟動 2FA 功能，那如果是直接 git 下來的就還要另外安裝一些套件，這邊不加以闡述&lt;/p&gt;
&lt;p&gt;啟用 2FA 非常簡單，只要選擇第二項 “認證應用程式 (2FA)“&lt;br /&gt;
然後按下” 設定雙因素認證 ”&lt;/p&gt;
&lt;figure&gt;&lt;img src=&quot;/assets/images/linux/post/phpmyadmin-enable-2fa-2.webp&quot; alt=&quot;phpMyAdmin 中啟用 2FA&quot; loading=&quot;lazy&quot; /&gt;&lt;figcaption&gt;phpMyAdmin 中啟用 2FA&lt;/figcaption&gt;&lt;/figure&gt;
&lt;p&gt;接下來就會看到一個 QRcode 跟密碼&lt;/p&gt;
&lt;figure&gt;&lt;img src=&quot;/assets/images/linux/post/phpmyadmin-enable-2fa-3.webp&quot; alt=&quot;phpMyAdmin 中啟用 2FA&quot; loading=&quot;lazy&quot; /&gt;&lt;figcaption&gt;phpMyAdmin 中啟用 2FA&lt;/figcaption&gt;&lt;/figure&gt;
&lt;p&gt;這邊就要用到你的手機了，使用 Google Two Factor Authentication 或者 Authy 兩個應用程式都可以，掃描 QRCode 之後並輸入該 2FA 的驗證就可以開啟了～&lt;/p&gt;
&lt;figure&gt;&lt;img src=&quot;/assets/images/linux/post/phpmyadmin-enable-2fa-finish.webp&quot; alt=&quot;phpMyAdmin 中啟用 2FA&quot; loading=&quot;lazy&quot; /&gt;&lt;figcaption&gt;phpMyAdmin 中啟用 2FA&lt;/figcaption&gt;&lt;/figure&gt;
&lt;p&gt;那接下來就是緊急處理，如果是用 Google Two Factor Authentication 的使用者要注意，在做手機更換的時候 &lt;strong&gt;一定！一定！一定！一定！&lt;/strong&gt; 一定要先把 2FA 先解除在做更換手機的動作，不然會導致無法登入 phpMyAdmin&lt;/p&gt;
&lt;p&gt;那如果真的很不幸你真的忘記了，是有解決辦法&lt;br /&gt;
先用 ssh 登入你的 mysql&lt;br /&gt;
PS: 這邊是範例，忘記 root 的 2FA，請依照你自己的伺服器做處理&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;&lt;span&gt;&lt;span&gt;mysql&lt;/span&gt;&lt;span&gt; -u&lt;/span&gt;&lt;span&gt; root&lt;/span&gt;&lt;span&gt; -p&lt;/span&gt;&lt;span&gt; # 使用 root 登入 mysql&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;之後會看到一些資料&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;&lt;span&gt;&lt;span&gt;|&lt;/span&gt;&lt;span&gt; root&lt;/span&gt;&lt;span&gt;     |&lt;/span&gt;&lt;span&gt; 2019-09-25&lt;/span&gt;&lt;span&gt; 16:21:20&lt;/span&gt;&lt;span&gt; |&lt;/span&gt;&lt;span&gt; {&lt;/span&gt;&lt;span&gt;&quot;Server\/hide_db&quot;&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt;&quot;information_schema|mysql|performance_schema|information_schema&quot;&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;span&gt;&quot;lang&quot;&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt;&quot;zh_TW&quot;&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;span&gt;&quot;collation_connection&quot;&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt;&quot;utf8mb4_unicode_ci&quot;&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;span&gt;&quot;Console\/Mode&quot;&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt;&quot;collapse&quot;&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;span&gt;&quot;DefaultConnectionCollation&quot;&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt;&quot;utf8_unicode_ci&quot;&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;span&gt;&quot;2fa&quot;&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt;{&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;backend&lt;/span&gt;&lt;span&gt;&quot;:&quot;&lt;/span&gt;&lt;span&gt;application&lt;/span&gt;&lt;span&gt;&quot;,&quot;&lt;/span&gt;&lt;span&gt;settings&lt;/span&gt;&lt;span&gt;&quot;:{&quot;&lt;/span&gt;&lt;span&gt;secret&lt;/span&gt;&lt;span&gt;&quot;:&quot;&lt;/span&gt;&lt;span&gt;KKASIRHQ904U2KS918JSEBTJ9132459U1902&lt;/span&gt;&lt;span&gt;&quot;}},&quot;&lt;/span&gt;&lt;span&gt;ThemeDefault&lt;/span&gt;&lt;span&gt;&quot;:&quot;&lt;/span&gt;&lt;span&gt;pmahomme&lt;/span&gt;&lt;span&gt;&quot;} |&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;最重要最重要的就是在後面的 JSON 資料中的 “2fa”&lt;br /&gt;
裡面有個”secret” 把這段輸入到 Google Two Factor Authentication 中就可以繼續使用了&lt;br /&gt;
PS: 這邊的範例是假的，當然沒有這麼的長&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;/tags/Linux/&quot;&gt;Linux&lt;/a&gt;&lt;a href=&quot;/tags/2FA/&quot;&gt;2FA&lt;/a&gt;&lt;a href=&quot;/tags/phpMyAdmin/&quot;&gt;phpMyAdmin&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;此文章已被阅读次数&lt;/p&gt;&lt;div&gt;&lt;/div&gt;…更新於 2022-08-25&lt;p&gt;&lt;/p&gt;</content:encoded><category>category:linux</category><category>tag:Linux</category><category>tag:2FA</category><category>tag:phpMyAdmin</category></item><item><title>Nginx+Cloudflare-取得使用者真實IP</title><link>https://preview.astro.kaitaku.xyz/post/linux/nginx-cloudflare-%E5%8F%96%E5%BE%97%E4%BD%BF%E7%94%A8%E8%80%85%E7%9C%9F%E5%AF%A6ip</link><guid isPermaLink="false">linux/nginx-cloudflare-取得使用者真實ip</guid><description>Nginx+Cloudflare - 取得使用者真實 IP
使用 Python 或者其他的程式語言架設網站的時候勢必一定要有個 Webserver 作為代理，但在有些時候網站的一些套件需要取得使用者的 IP 要如何取得？
一般來說 Nginx 只要在 virtualhost conf</description><pubDate>Sun, 22 Sep 2019 16:00:00 GMT</pubDate><content:encoded>&lt;h1&gt;Nginx+Cloudflare - 取得使用者真實 IP&lt;a href=&quot;#nginxcloudflare---取得使用者真實-ip&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;/a&gt;&lt;/h1&gt;
&lt;p&gt;使用 Python 或者其他的程式語言架設網站的時候勢必一定要有個 Webserver 作為代理，但在有些時候網站的一些套件需要取得使用者的 IP 要如何取得？&lt;/p&gt;
&lt;p&gt;一般來說 Nginx 只要在 virtualhost conf 中設定以下就可以了&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;&lt;span&gt;&lt;span&gt;proxy_set_header&lt;/span&gt;&lt;span&gt; Host&lt;/span&gt;&lt;span&gt; $host; &lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;在程式部分 (使用 flask)&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;&lt;span&gt;&lt;span&gt;from&lt;/span&gt;&lt;span&gt; flask &lt;/span&gt;&lt;span&gt;import&lt;/span&gt;&lt;span&gt; request &lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;這樣就可以取得使用者的 IP 了&lt;br /&gt;
但如果在 Nginx 前面還加個 Cloudflare CDN 怎麼辦？&lt;br /&gt;
其實在官方文件中有提到這點 &lt;a href=&quot;https://support.cloudflare.com/hc/en-us/articles/200170786-Restoring-original-visitor-IPs-Logging-visitor-IP-addresses-with-mod-cloudflare-&quot;&gt;Restoring original visitor IPs&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Nginx 上有提到的 Cloudflare IP 區間不一定是固定的，可能隨時會變動&lt;br /&gt;
&lt;a href=&quot;https://github.com/ergin/&quot;&gt;ergin&lt;/a&gt; 就寫出一個可以自動更新的腳本 &lt;a href=&quot;https://github.com/ergin/nginx-cloudflare-real-ip&quot;&gt;nginx-cloudflare-real-ip&lt;/a&gt;&lt;br /&gt;
然後我就 fork 之後把他的 readme 做翻譯&lt;br /&gt;
大致上跟著操作就可以了 最後別忘了到 Nginx 的 access log 查看 IP 是不是變成使用者的 IP&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;/tags/Linux/&quot;&gt;Linux&lt;/a&gt;&lt;a href=&quot;/tags/Python/&quot;&gt;Python&lt;/a&gt;&lt;a href=&quot;/tags/cloudflare/&quot;&gt;cloudflare&lt;/a&gt;&lt;a href=&quot;/tags/Nginx/&quot;&gt;Nginx&lt;/a&gt;&lt;a href=&quot;/tags/Real-IP-address/&quot;&gt;Real IP address&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;此文章已被阅读次数&lt;/p&gt;&lt;div&gt;&lt;/div&gt;…更新於 2022-08-25&lt;p&gt;&lt;/p&gt;</content:encoded><category>category:linux</category><category>tag:Linux</category><category>tag:Python</category><category>tag:cloudflare</category><category>tag:Nginx</category><category>tag:Real IP address</category></item><item><title>使用 certbot+cloudflare 讓 wildcard certificate 自動更新憑證</title><link>https://preview.astro.kaitaku.xyz/post/linux/%E4%BD%BF%E7%94%A8-certbot-cloudflare-%E8%AE%93-wildcard-certificate-%E8%87%AA%E5%8B%95%E6%9B%B4%E6%96%B0%E6%86%91%E8%AD%89</link><guid isPermaLink="false">linux/使用-certbot-cloudflare-讓-wildcard-certificate-自動更新憑證</guid><description>下方使用 CentOS7 當作示範環境
如果你還沒裝 certbot，請先執行 yum install certbot

首先要先登入 Cloudflare，右上角 My Profile 那就可找到 Global API Key
請點選 View 輸入密碼就會出現，這把 Key 很重要請小心保管</description><pubDate>Tue, 18 Jun 2019 16:00:00 GMT</pubDate><content:encoded>&lt;p&gt;下方使用 CentOS7 當作示範環境&lt;br /&gt;
如果你還沒裝 certbot，請先執行 &lt;code&gt;yum install certbot&lt;/code&gt;&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;首先要先登入 Cloudflare，右上角 My Profile 那就可找到 Global API Key&lt;br /&gt;
請點選 View 輸入密碼就會出現，這把 Key 很重要請小心保管&lt;/li&gt;
&lt;/ol&gt;
&lt;figure&gt;&lt;img src=&quot;/assets/images/linux/post/Snipaste_2019-06-19_19-07-35.webp&quot; alt=&quot;api key&quot; loading=&quot;lazy&quot; /&gt;&lt;figcaption&gt;api key&lt;/figcaption&gt;&lt;/figure&gt;
&lt;ol&gt;
&lt;li&gt;由於這把 Key 很重要，所以要放在一個安全的地方&lt;br /&gt;
原作者把它放在 &lt;code&gt;/root/.secrets&lt;/code&gt; 裡面（你要改地方也行，最後的參數路徑記得改就好）&lt;br /&gt;
但系統預設沒有 &lt;code&gt;/root/.secrets&lt;/code&gt; 這個目錄&lt;br /&gt;
所以要先建立這個目錄 &lt;code&gt;mkdir /root/.secrets&lt;/code&gt;&lt;br /&gt;
然後把下面這兩行填好後放到 &lt;code&gt;/root/.secrets/cloudflare.ini&lt;/code&gt; 裡面&lt;/li&gt;
&lt;/ol&gt;
&lt;pre&gt;&lt;code&gt;&lt;span&gt;&lt;span&gt;dns_cloudflare_email = &quot;請填你的cloudflare帳號，也就是email&quot;&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;dns_cloudflare_api_key = &quot;請輸入上述的 Global API Key&quot;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;ol&gt;
&lt;li&gt;修改 &lt;code&gt;/root/.secrets/cloudflare.ini&lt;/code&gt; 權限&lt;/li&gt;
&lt;/ol&gt;
&lt;pre&gt;&lt;code&gt;&lt;span&gt;&lt;span&gt;chmod 0700 /root/.secrets/&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;chmod 0400 /root/.secrets/cloudflare.ini&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;ol&gt;
&lt;li&gt;安裝 Certbot 及 CloudFlare DNS 認證套件&lt;/li&gt;
&lt;/ol&gt;
&lt;pre&gt;&lt;code&gt;&lt;span&gt;&lt;span&gt;yum install python-pip&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;pip install certbot-dns-cloudflare&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;ol&gt;
&lt;li&gt;申請 Wildcard SSL 憑證&lt;br /&gt;
把 &lt;code&gt;example.com&lt;/code&gt; 更換成自己的域名，如果有 4 級域名也要一起加入&lt;/li&gt;
&lt;/ol&gt;
&lt;pre&gt;&lt;code&gt;&lt;span&gt;&lt;span&gt;certbot certonly --dns-cloudflare --dns-cloudflare-credentials /root/.secrets/cloudflare.ini -d example.com,*.example.com --preferred-challenges dns-01&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;ol&gt;
&lt;li&gt;於 crontab 設定自動 renew&lt;/li&gt;
&lt;/ol&gt;
&lt;ul&gt;
&lt;li&gt;nginx&lt;/li&gt;
&lt;/ul&gt;
&lt;pre&gt;&lt;code&gt;&lt;span&gt;&lt;span&gt;14 5 * * * /usr/local/bin/certbot renew --quiet --post-hook &quot;/usr/sbin/service nginx reload&quot; &amp;gt; /dev/null 2&amp;gt;&amp;amp;1&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;ul&gt;
&lt;li&gt;apache&lt;/li&gt;
&lt;/ul&gt;
&lt;pre&gt;&lt;code&gt;&lt;span&gt;&lt;span&gt;14 5 * * * /usr/local/bin/certbot renew --quiet --post-hook &quot;systemctl reload httpd&quot; &amp;gt; /dev/null 2&amp;gt;&amp;amp;1&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;a href=&quot;/tags/Linux/&quot;&gt;Linux&lt;/a&gt;&lt;a href=&quot;/tags/certbot/&quot;&gt;certbot&lt;/a&gt;&lt;a href=&quot;/tags/cloudflare/&quot;&gt;cloudflare&lt;/a&gt;&lt;a href=&quot;/tags/certificate/&quot;&gt;certificate&lt;/a&gt;&lt;a href=&quot;/tags/wildcard-certificate/&quot;&gt;wildcard certificate&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;此文章已被阅读次数&lt;/p&gt;&lt;div&gt;&lt;/div&gt;…更新於 2022-08-25&lt;p&gt;&lt;/p&gt;</content:encoded><category>category:linux</category><category>tag:Linux</category><category>tag:certbot</category><category>tag:cloudflare</category><category>tag:certificate</category><category>tag:wildcard certificate</category></item><item><title>Debian / Ubuntu 安裝 Webmin</title><link>https://preview.astro.kaitaku.xyz/post/linux/debian-ubuntu-%E5%AE%89%E8%A3%9D-webmin</link><guid isPermaLink="false">linux/debian-ubuntu-安裝-webmin</guid><description>首先加入 Webmin 官方 repository, 開啟檔案 /etc/apt/sources.list
sudo vi /etc/apt/sources.list
加入以下兩行:
deb http://download.webmin.com/download/repository sarge</description><pubDate>Sun, 02 Jun 2019 16:00:00 GMT</pubDate><content:encoded>&lt;p&gt;首先加入 Webmin 官方 repository, 開啟檔案 /etc/apt/sources.list&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;&lt;span&gt;&lt;span&gt;sudo&lt;/span&gt;&lt;span&gt; vi&lt;/span&gt;&lt;span&gt; /etc/apt/sources.list&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;加入以下兩行:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;&lt;span&gt;&lt;span&gt;deb http://download.webmin.com/download/repository sarge contrib&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;deb http://webmin.mirror.somersettechsolutions.co.uk/repository sarge contrib&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;然後取得以上 repository 的 GPG key:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;&lt;span&gt;&lt;span&gt;cd&lt;/span&gt;&lt;span&gt; /root&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;加入 Webmin 的 repository 後，用安就很簡單了，更新 apt-get 就可以開始安裝了:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;&lt;span&gt;&lt;span&gt;sudo&lt;/span&gt;&lt;span&gt; apt-get&lt;/span&gt;&lt;span&gt; update&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Webmin 預設使用 10000 埠號，設定 firewall 開通 10000 埠號:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;&lt;span&gt;&lt;span&gt;sudo&lt;/span&gt;&lt;span&gt; ufw&lt;/span&gt;&lt;span&gt; allow&lt;/span&gt;&lt;span&gt; 10000&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Webmin 預設使用的埠號是 10000, 可以這樣存取:&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;http://localhost:10000&quot;&gt;http://localhost&lt;/a&gt;&lt;/p&gt;&lt;div&gt;&lt;/div&gt;&lt;br /&gt;
或&lt;br /&gt;
&lt;a href=&quot;https://localhost:10000&quot;&gt;https://localhost&lt;div&gt;&lt;/div&gt;&lt;/a&gt;&lt;p&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;/tags/Linux/&quot;&gt;Linux&lt;/a&gt;&lt;a href=&quot;/tags/Webmin/&quot;&gt;Webmin&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;此文章已被阅读次数&lt;/p&gt;&lt;div&gt;&lt;/div&gt;…更新於 2022-08-24&lt;p&gt;&lt;/p&gt;</content:encoded><category>category:linux</category><category>tag:Linux</category><category>tag:Webmin</category></item><item><title>OpenVPN 使用帳號密碼認證</title><link>https://preview.astro.kaitaku.xyz/post/linux/openvpn-%E4%BD%BF%E7%94%A8%E5%B8%B3%E8%99%9F%E5%AF%86%E7%A2%BC%E8%AA%8D%E8%AD%89</link><guid isPermaLink="false">linux/openvpn-使用帳號密碼認證</guid><description>如果安裝好 OpenVPN 其實可以使用他預設的製作金鑰來連線，但是要新增帳號或者管理帳號這部分就比較麻煩，所以還是用帳號密碼做管理比較容易
首先先安裝以下編譯程式需要的日常庫
yum -y install gcc gcc-c++ autoconf libjpeg libjpeg-devel \</description><pubDate>Sun, 02 Jun 2019 16:00:00 GMT</pubDate><content:encoded>&lt;p&gt;如果安裝好 OpenVPN 其實可以使用他預設的製作金鑰來連線，但是要新增帳號或者管理帳號這部分就比較麻煩，所以還是用帳號密碼做管理比較容易&lt;/p&gt;
&lt;p&gt;首先先安裝以下編譯程式需要的日常庫&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;&lt;span&gt;&lt;span&gt;yum&lt;/span&gt;&lt;span&gt; -y&lt;/span&gt;&lt;span&gt; install&lt;/span&gt;&lt;span&gt; gcc&lt;/span&gt;&lt;span&gt; gcc-c++&lt;/span&gt;&lt;span&gt; autoconf&lt;/span&gt;&lt;span&gt; libjpeg&lt;/span&gt;&lt;span&gt; libjpeg-devel&lt;/span&gt;&lt;span&gt; \&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;下面安装 pam 组件&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;&lt;span&gt;&lt;span&gt;yum&lt;/span&gt;&lt;span&gt; install&lt;/span&gt;&lt;span&gt; pam_krb5&lt;/span&gt;&lt;span&gt; pam_mysql&lt;/span&gt;&lt;span&gt; pam&lt;/span&gt;&lt;span&gt; pam-devel&lt;/span&gt;&lt;span&gt; -y&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;我們需要安裝 mysql 服務器&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;&lt;span&gt;&lt;span&gt;yum&lt;/span&gt;&lt;span&gt; install&lt;/span&gt;&lt;span&gt; mysql&lt;/span&gt;&lt;span&gt; mysql-server&lt;/span&gt;&lt;span&gt; mysql-devel&lt;/span&gt;&lt;span&gt; mysql-libs&lt;/span&gt;&lt;span&gt; -y&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;登錄 mysql 建立一個驗證用的測試數據庫，添加使用者帳號&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;&lt;span&gt;&lt;span&gt;mysql&lt;/span&gt;&lt;span&gt; -u&lt;/span&gt;&lt;span&gt; root&lt;/span&gt;&lt;span&gt; -p&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;在 /etc/pam.d/ 下建立一個配置文件&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;&lt;span&gt;&lt;span&gt;vim&lt;/span&gt;&lt;span&gt; /etc/pam.d/openvpn&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;輸入以下內容並保存&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;&lt;span&gt;&lt;span&gt;auth&lt;/span&gt;&lt;span&gt; sufficient&lt;/span&gt;&lt;span&gt; pam_mysql.so&lt;/span&gt;&lt;span&gt; user=vpn&lt;/span&gt;&lt;span&gt; passwd=vpn123&lt;/span&gt;&lt;span&gt; host=localhost&lt;/span&gt;&lt;span&gt; db=vpn&lt;/span&gt;&lt;span&gt; table=vpnuser&lt;/span&gt;&lt;span&gt; usercolumn=name&lt;/span&gt;&lt;span&gt; passwdcolumn=password&lt;/span&gt;&lt;span&gt; where=active=&lt;/span&gt;&lt;span&gt;1&lt;/span&gt;&lt;span&gt; sqllog=&lt;/span&gt;&lt;span&gt;0&lt;/span&gt;&lt;span&gt; crypt=&lt;/span&gt;&lt;span&gt;2&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;現在可以測試 pam_mysql 是否工作正常，但這個動作之前需要安裝 sasl&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;&lt;span&gt;&lt;span&gt;yum&lt;/span&gt;&lt;span&gt; install&lt;/span&gt;&lt;span&gt; cyrus-sasl&lt;/span&gt;&lt;span&gt; cyrus-sasl-plain&lt;/span&gt;&lt;span&gt; cyrus-sasl-devel&lt;/span&gt;&lt;span&gt; cyrus-sasl-lib&lt;/span&gt;&lt;span&gt; cyrus-sasl-gssapi&lt;/span&gt;&lt;span&gt; -y&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;測試是否成功&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;&lt;span&gt;&lt;span&gt;saslauthd&lt;/span&gt;&lt;span&gt; -a&lt;/span&gt;&lt;span&gt; pam&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;如果成功，顯示 0: OK 「Success.」，pam_mysql 工作正常了&lt;/p&gt;
&lt;p&gt;下面可以開始配置 OpenVPN 服務器了。&lt;/p&gt;
&lt;p&gt;這裡需要有一部非常重要的步驟，2.1 以上的 OpenVPN 的 openvpn-auth-pam.so 都會出現驗證錯誤的問題，這裡需要我們重新編譯一個低版本的，我這裡用 2.0.7 的，大家也可以使用 2.0.9 版本的。&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;&lt;span&gt;&lt;span&gt;cd&lt;/span&gt;&lt;span&gt; /etc/openvpn&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;之後在伺服器端的 conf 檔中加入以下&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;&lt;span&gt;&lt;span&gt;client-cert-not-required&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;客戶端的 conf 檔&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;&lt;span&gt;&lt;span&gt;client&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;如果要讓客戶端連線時自動輸入帳號密碼可以在客戶端 conf 中的 &lt;code&gt;auth-user-pass&lt;/code&gt; 結尾加上 &lt;code&gt;檔案名稱+副檔名&lt;/code&gt;&lt;br /&gt;
&lt;code&gt;auth-user-pass account.txt&lt;/code&gt;&lt;br /&gt;
並在同一個目錄底下新增一個 account 的 txt 檔&lt;br /&gt;
在第一行打上帳號，第二行打上密碼儲存即可&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;/tags/Linux/&quot;&gt;Linux&lt;/a&gt;&lt;a href=&quot;/tags/OpenVPN/&quot;&gt;OpenVPN&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;此文章已被阅读次数&lt;/p&gt;&lt;div&gt;&lt;/div&gt;…更新於 2022-08-25&lt;p&gt;&lt;/p&gt;</content:encoded><category>category:linux</category><category>tag:Linux</category><category>tag:OpenVPN</category></item><item><title>CentOS 更新Kernel</title><link>https://preview.astro.kaitaku.xyz/post/linux/centos-%E6%9B%B4%E6%96%B0kernel</link><guid isPermaLink="false">linux/centos-更新kernel</guid><description>1. 導入 Public Key
rpm --import https://www.elrepo.org/RPM-GPG-KEY-elrepo.org
2. 安裝 ELRepo
CentOS 5
rpm -Uvh</description><pubDate>Sun, 02 Jun 2019 16:00:00 GMT</pubDate><content:encoded>&lt;p&gt;1. 導入 Public Key&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;&lt;span&gt;&lt;span&gt;rpm&lt;/span&gt;&lt;span&gt; --import&lt;/span&gt;&lt;span&gt; https://www.elrepo.org/RPM-GPG-KEY-elrepo.org&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;2. 安裝 ELRepo&lt;/p&gt;
&lt;p&gt;CentOS 5&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;&lt;span&gt;&lt;span&gt;rpm&lt;/span&gt;&lt;span&gt; -Uvh&lt;/span&gt;&lt;span&gt; http://www.elrepo.org/elrepo-release-5-5.el5.elrepo.noarch.rpm&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;CentOS6&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;&lt;span&gt;&lt;span&gt;rpm&lt;/span&gt;&lt;span&gt; -Uvh&lt;/span&gt;&lt;span&gt; http://www.elrepo.org/elrepo-release-6-6.el6.elrepo.noarch.rpm&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;CentOS7&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;&lt;span&gt;&lt;span&gt;rpm&lt;/span&gt;&lt;span&gt; -Uvh&lt;/span&gt;&lt;span&gt; http://www.elrepo.org/elrepo-release-7.0-2.el7.elrepo.noarch.rpm&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;3. 升級 Kernel&lt;/p&gt;
&lt;p&gt;※在 ELRepo 中有兩個內核選項，一個是 kernel-lt (長期支持版本)，一個是 kernel-ml (主線最新版本)&lt;/p&gt;
&lt;p&gt;kernel-lt&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;&lt;span&gt;&lt;span&gt;yum&lt;/span&gt;&lt;span&gt; --enablerepo=elrepo-kernel&lt;/span&gt;&lt;span&gt; install&lt;/span&gt;&lt;span&gt; kernel-lt&lt;/span&gt;&lt;span&gt; -y&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;kernel-ml&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;&lt;span&gt;&lt;span&gt;yum&lt;/span&gt;&lt;span&gt; --enablerepo=elrepo-kernel&lt;/span&gt;&lt;span&gt; install&lt;/span&gt;&lt;span&gt; kernel-ml&lt;/span&gt;&lt;span&gt; -y&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;4. 更改 Grub&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;&lt;span&gt;&lt;span&gt;vi /etc/grub.conf&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;根據安裝好以後的內核位置，修改 default 的值，一般是修改為 0，因為 default 從 0 開始，一般新安裝的內核在第一個位置，所以設置&lt;br /&gt;
default=0&lt;/p&gt;
&lt;p&gt;5. 查看 Kernel&lt;/p&gt;
&lt;p&gt;重啟主機，重啟後執行&lt;br /&gt;
&lt;code&gt;uname -r&lt;/code&gt;&lt;br /&gt;
，查看內核版本號，判斷是否升級成功&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;/tags/Linux/&quot;&gt;Linux&lt;/a&gt;&lt;a href=&quot;/tags/CentOS/&quot;&gt;CentOS&lt;/a&gt;&lt;a href=&quot;/tags/Kernel/&quot;&gt;Kernel&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;此文章已被阅读次数&lt;/p&gt;&lt;div&gt;&lt;/div&gt;…更新於 2022-08-25&lt;p&gt;&lt;/p&gt;</content:encoded><category>category:linux</category><category>tag:Linux</category><category>tag:CentOS</category><category>tag:Kernel</category></item><item><title>SSH 使用 key 登入</title><link>https://preview.astro.kaitaku.xyz/post/linux/ssh-%E4%BD%BF%E7%94%A8-key-%E7%99%BB%E5%85%A5</link><guid isPermaLink="false">linux/ssh-使用-key-登入</guid><description>一般 ssh 會使用帳號跟密碼的方式登入遠端主機，這方式雖然方便但是卻有風險
只要其他人知道帳號跟密碼一樣就可以登入主機進行任何動作，所以可以使用 key 來登入，只要沒有這個 key 就不能登入主機，這樣也比帳號密碼安全。
而其實它還有另一種用途，如果要用 rsync</description><pubDate>Sun, 02 Jun 2019 16:00:00 GMT</pubDate><content:encoded>&lt;p&gt;一般 ssh 會使用帳號跟密碼的方式登入遠端主機，這方式雖然方便但是卻有風險&lt;/p&gt;
&lt;p&gt;只要其他人知道帳號跟密碼一樣就可以登入主機進行任何動作，所以可以使用 key 來登入，只要沒有這個 key 就不能登入主機，這樣也比帳號密碼安全。&lt;/p&gt;
&lt;p&gt;而其實它還有另一種用途，如果要用 rsync 備份或更新其他主機的內容也可以用這個方式，就不用一台一台主機輸入密碼才能傳輸檔案。&lt;/p&gt;
&lt;h1&gt;1. 製作 ssh key&lt;a href=&quot;#1-製作-ssh-key&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;/a&gt;&lt;/h1&gt;
&lt;p&gt;&lt;code&gt;ssh-keygen -t rsa&lt;/code&gt; 或 &lt;code&gt;ssh-keygen -d (dsa)&lt;/code&gt; =&amp;gt; 產生出 id_rsa, id_rsa.pub 在使用者目錄中.ssh 資料夾裡面&lt;/p&gt;
&lt;p&gt;製作時會問 Enter passphrase (empty for no passphrase): 此處直接 enter 跳過，下次才不會詢問密碼&lt;/p&gt;
&lt;p&gt;&lt;code&gt;id_rsa&lt;/code&gt; 是私鑰 private key&lt;/p&gt;
&lt;p&gt;&lt;code&gt;id_rsa.pub&lt;/code&gt; 是公鑰 public key&lt;/p&gt;
&lt;h1&gt;2. 讓遠端登入到其他遠端主機&lt;a href=&quot;#2-讓遠端登入到其他遠端主機&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;/a&gt;&lt;/h1&gt;
&lt;p&gt;假如現在你有 A 跟 B 主機，A 主機照上方的方式做出了 ssh 金鑰&lt;/p&gt;
&lt;p&gt;主要要讓 &lt;strong&gt;A 主機&lt;/strong&gt; 可以不用使用密碼用 key 登入到 &lt;strong&gt;B 主機&lt;/strong&gt; 進行操作&lt;/p&gt;
&lt;p&gt;那就要將 &lt;strong&gt;A 主機&lt;/strong&gt; 的 ” &lt;strong&gt;公鑰&lt;/strong&gt; ” 上傳到 &lt;strong&gt;B 主機&lt;/strong&gt; 中才能讓 A 主機免密碼登入到 B 主機，只要在 A 主機輸入以下指令&lt;/p&gt;
&lt;p&gt;ssh-copy-id -i $HOME/.ssh/id_rsa.pub (B 主機)&lt;br /&gt;
上方紅字的部分改為主機 IP 或名稱&lt;/p&gt;
&lt;p&gt;大致上主機回應如下方：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;&lt;span&gt;&lt;span&gt;# ssh-copy-id -i $HOME/.ssh/id_rsa.pub (主機名稱)&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;The authenticity of host &apos;(主機名稱) (IP)&apos; can’t be established.&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;RSA key fingerprint is 金鑰指紋.&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;Are you sure you want to continue connecting (yes/no)? yes&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;Warning: Permanently added &apos;(主機名稱),(IP)&apos; (RSA) to the list of known hosts.&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;Now try logging into the machine, with &quot;ssh &apos;(主機名稱)&apos;&quot;, and check in:&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;.ssh/authorized_keys&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;to make sure we haven’t added extra keys that you weren’t expecting.&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;※(主機名稱),(IP) 部分會依金鑰及主機名稱 IP 而改變&lt;/p&gt;
&lt;p&gt;這個時候用 ssh 連線嘗試看看有沒有匯入成功&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;&lt;span&gt;&lt;span&gt;ssh root@主機名稱&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;如果有成功匯入金鑰的話不用打密碼就可以連線進去了&lt;/p&gt;
&lt;h1&gt;3. 本地電腦免密碼登入遠端主機&lt;a href=&quot;#3-本地電腦免密碼登入遠端主機&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;/a&gt;&lt;/h1&gt;
&lt;p&gt;當我們用 windows 要遠端控制主機時大部分都會使用到 PieTTY 或 PuTTY 這兩款 SSH 連線軟體，平常設定都是使用帳號跟密碼做登入，如果要用免密碼登入增加安全性就要使用下方的方式&lt;/p&gt;
&lt;p&gt;(1) 準備好 PieTTY 或 PuTTY (觀眾：廢話 (打丁丁&lt;/p&gt;
&lt;p&gt;(2) 將遠端主機使用者的 &lt;strong&gt;公鑰&lt;/strong&gt; 重新命名成 &lt;code&gt;authorized_keys&lt;/code&gt;&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;&lt;span&gt;&lt;span&gt;cp&lt;/span&gt;&lt;span&gt; ~/.ssh/id_rsa.pub&lt;/span&gt;&lt;span&gt; ~/.ssh/authorized_keys&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;(3) 將 id_rsa 私鑰 private key 下載到 windows 上&lt;/p&gt;
&lt;p&gt;並下載 PuTTYgen ，開啟 PuTTYgen 上方有個 “Conversions” 選擇 “Import key” 選擇你從主機下載下來的 &lt;strong&gt;id_rsa 私鑰&lt;/strong&gt;，選擇後點擊下方會有個 “Save private key”，&lt;/p&gt;
&lt;p&gt;軟體會問你說 &lt;code&gt;Are you sure you want to save this key without passphrase to protext it?&lt;/code&gt; ，主要的意思是說 “你確定要儲存這個 key 並不使用任何密碼保護它？”&lt;/p&gt;
&lt;p&gt;選擇 yes 輸出 ppk 檔，ppk 檔是給 PuTTY or PieTTY 使用的，給 PuTTY or PieTTY ppk 檔路徑就可以免密碼登入囉～&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;/tags/Linux/&quot;&gt;Linux&lt;/a&gt;&lt;a href=&quot;/tags/SSH/&quot;&gt;SSH&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;此文章已被阅读次数&lt;/p&gt;&lt;div&gt;&lt;/div&gt;…更新於 2022-08-24&lt;p&gt;&lt;/p&gt;</content:encoded><category>category:linux</category><category>tag:Linux</category><category>tag:SSH</category></item><item><title>Apache 透過 ITK Multi-Processing Module 讓虛擬主機以不同使用者執行</title><link>https://preview.astro.kaitaku.xyz/post/linux/apache-%E9%80%8F%E9%81%8E-itk-multi-processing-module-%E8%AE%93%E8%99%9B%E6%93%AC%E4%B8%BB%E6%A9%9F%E4%BB%A5%E4%B8%8D%E5%90%8C%E4%BD%BF%E7%94%A8%E8%80%85%E5%9F%B7%E8%A1%8C</link><guid isPermaLink="false">linux/apache-透過-itk-multi-processing-module-讓虛擬主機以不同使用者執行</guid><description>一般來說 Linux Apache 服務啟動時，預設都是限定一組使用者與群組來執行程序（CentOS 是 apache ，Ubuntu 是 www-data）。
但有時我們常透過 VirtualHost 在同一個 Apache 上存放著許多網站。</description><pubDate>Thu, 30 May 2019 16:00:00 GMT</pubDate><content:encoded>&lt;p&gt;一般來說 Linux Apache 服務啟動時，預設都是限定一組使用者與群組來執行程序（CentOS 是 apache ，Ubuntu 是 www-data）。&lt;/p&gt;
&lt;p&gt;但有時我們常透過 VirtualHost 在同一個 Apache 上存放著許多網站。&lt;/p&gt;
&lt;p&gt;這樣子有些網站的權限可能就有問題，可能會導致網頁無法下載或上傳檔案等等，對於主機上的網站也有安全性的問題，所以這裡使用 MPM 來指定 Apache VirtualHost 程序的使用者與群組。&lt;/p&gt;
&lt;p&gt;以下操作皆為 CentOS 6.8&lt;/p&gt;
&lt;p&gt;1. 安裝 mpm-itk 套件&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;&lt;span&gt;&lt;span&gt;yum&lt;/span&gt;&lt;span&gt; install&lt;/span&gt;&lt;span&gt; httpd-itk&lt;/span&gt;&lt;span&gt; -y&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;2. 編輯 /etc/sysconfig/httpd 指定用 httpd.itk 來執行&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;&lt;span&gt;&lt;span&gt;vi&lt;/span&gt;&lt;span&gt; /etc/sysconfig/httpd&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;並加入以下設定 (後方為 httpd.itk 的絕對路徑，可以使用 find 去完整蒐尋位置)&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;&lt;span&gt;&lt;span&gt;HTTPD=/usr/sbin/httpd.itk&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;3. 編輯 /etc/httpd/conf.d/php.conf 載入 PHP Module&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;&lt;span&gt;&lt;span&gt;vi /etc/httpd/conf.d/php.conf&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;並加入以下設定&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;&lt;span&gt;&lt;span&gt;&amp;lt;IfModule itk.c&amp;gt;&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;LoadModule php5_module modules/libphp5.so&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;&amp;lt;/IfModule&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;4. 編輯 Virtual Host 設定檔，透過 AssignUserID 參數設定 Apache 程序的使用者與群組，範例如下：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;&lt;span&gt;&lt;span&gt;&amp;lt;VirtualHost *:80&amp;gt;&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;DocumentRoot (網頁根目錄)&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;ServerName (VirtualHost 名稱)&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;ErrorLog logs (ErrorLog 存放檔案路徑)&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;CustomLog logs (CustomLog 存放檔案路徑)&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;AssignUserId (使用者名稱) (群組)&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;&amp;lt;/VirtualHost&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;最重要的就是 AssignUserId (使用者名稱) (群組)&lt;/p&gt;
&lt;p&gt;名稱及群組中間有一個空格，設定完後重新啟動 Apache&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;&lt;span&gt;&lt;span&gt;service&lt;/span&gt;&lt;span&gt; httpd&lt;/span&gt;&lt;span&gt; restart&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;如果不知道有沒有正確的套用執行請在網頁根目錄中放一個 php 網頁，內容為：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;&lt;span&gt;&lt;span&gt;&amp;lt;?&lt;/span&gt;&lt;span&gt;php&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;這會顯示執行 php 的使用者名稱，看是不是你設定 AssignUserId 的使用者名稱。&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;/tags/Linux/&quot;&gt;Linux&lt;/a&gt;&lt;a href=&quot;/tags/Apache/&quot;&gt;Apache&lt;/a&gt;&lt;a href=&quot;/tags/VirtualHost/&quot;&gt;VirtualHost&lt;/a&gt;&lt;a href=&quot;/tags/Multi-Processing/&quot;&gt;Multi-Processing&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;此文章已被阅读次数&lt;/p&gt;&lt;div&gt;&lt;/div&gt;…更新於 2022-08-25&lt;p&gt;&lt;/p&gt;</content:encoded><category>category:linux</category><category>tag:Linux</category><category>tag:Apache</category><category>tag:VirtualHost</category><category>tag:Multi-Processing</category></item><item><title>Linux Python3.7+ 執行 pip 時 SSLError 錯誤</title><link>https://preview.astro.kaitaku.xyz/post/linux/linux-python3-7-%E5%9F%B7%E8%A1%8C-pip-%E6%99%82-sslerror-%E9%8C%AF%E8%AA%A4</link><guid isPermaLink="false">linux/linux-python3-7-執行-pip-時-sslerror-錯誤</guid><description>
在用 Centos7 安裝 Python3.7+ 一般來說都沒有任何的問題
只要從原始碼編譯安裝就可以直接使用 Python3.7+ 了
但是如果要用 pip 安裝 (搜尋) 套件的時候就會發生錯誤
pip-sslerror
學長之前有問過我這個問題，想不到自己也碰到了
雖然學長的做法是把</description><pubDate>Sun, 19 May 2019 16:00:00 GMT</pubDate><content:encoded>&lt;figure&gt;&lt;img src=&quot;/assets/images/linux/cover/hotlink-ok/python37-pip-ssl-error.webp&quot; alt=&quot;&quot; loading=&quot;lazy&quot; /&gt;&lt;/figure&gt;
&lt;p&gt;在用 Centos7 安裝 Python3.7+ 一般來說都沒有任何的問題&lt;/p&gt;
&lt;p&gt;只要從原始碼編譯安裝就可以直接使用 Python3.7+ 了&lt;/p&gt;
&lt;p&gt;但是如果要用 pip 安裝 (搜尋) 套件的時候就會發生錯誤&lt;/p&gt;
&lt;figure&gt;&lt;img src=&quot;/assets/images/linux/post/python37-pip-ssl-error.webp&quot; alt=&quot;pip-sslerror&quot; loading=&quot;lazy&quot; /&gt;&lt;figcaption&gt;pip-sslerror&lt;/figcaption&gt;&lt;/figure&gt;
&lt;p&gt;學長之前有問過我這個問題，想不到自己也碰到了&lt;/p&gt;
&lt;p&gt;雖然學長的做法是把 Python 的版本下降到 3.6 解決這個問題&lt;/p&gt;
&lt;p&gt;但是因為 3.6 跟 3.7 在 async/await 的寫法上不一樣&lt;/p&gt;
&lt;p&gt;3.7 的寫法比起 3.6 更精簡，所以才想要在自己的伺服器上配置 Python3.7&lt;/p&gt;
&lt;p&gt;&lt;/p&gt;&lt;figure&gt;&lt;img src=&quot;/assets/images/linux/post/python-version.webp&quot; alt=&quot;python多版本&quot; loading=&quot;lazy&quot; /&gt;&lt;figcaption&gt;python多版本&lt;/figcaption&gt;&lt;/figure&gt;&lt;br /&gt;
(很多 Linux 自帶 Python2 而 3 之後的版本都要自行安裝)&lt;p&gt;&lt;/p&gt;
&lt;p&gt;然後如果編譯安裝會跳出以下提示&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;&lt;span&gt;&lt;span&gt;Python&lt;/span&gt;&lt;span&gt; build&lt;/span&gt;&lt;span&gt; finished&lt;/span&gt;&lt;span&gt; successfully!&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;然後查了 Centos7 的 openssl 版本……&lt;/p&gt;
&lt;p&gt;恩… 很好 1.0.2k 照理說是符合的&lt;/p&gt;
&lt;p&gt;結果就是文字遊戲，上述的提示是指 openssl 版本要 ” &lt;strong&gt;超過&lt;/strong&gt; ” 1.0.2 或 1.1&lt;/p&gt;
&lt;p&gt;並不是說最低要求 1.0.2 or 1.1&lt;/p&gt;
&lt;p&gt;所以從 openssl 下載最新的版本 openssl-1.1.1&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;&lt;span&gt;&lt;span&gt;# 下載 openssl-1.1.1 原始碼&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;編譯安裝好之後應該就可以執行 pip 不會出現 SSLError 錯誤了&lt;/p&gt;
&lt;figure&gt;&lt;img src=&quot;/assets/images/linux/post/pip-install-success.webp&quot; alt=&quot;成功執行pip&quot; loading=&quot;lazy&quot; /&gt;&lt;figcaption&gt;成功執行pip&lt;/figcaption&gt;&lt;/figure&gt;
&lt;p&gt;&lt;a href=&quot;/tags/Linux/&quot;&gt;Linux&lt;/a&gt;&lt;a href=&quot;/tags/Python/&quot;&gt;Python&lt;/a&gt;&lt;a href=&quot;/tags/SSLError/&quot;&gt;SSLError&lt;/a&gt;&lt;a href=&quot;/tags/pip/&quot;&gt;pip&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;此文章已被阅读次数&lt;/p&gt;&lt;div&gt;&lt;/div&gt;…更新於 2022-08-25&lt;p&gt;&lt;/p&gt;</content:encoded><category>category:linux</category><category>tag:Linux</category><category>tag:Python</category><category>tag:SSLError</category><category>tag:pip</category></item><item><title>Webmin 啟用 Two Factor Authentication</title><link>https://preview.astro.kaitaku.xyz/post/linux/webmin-%E5%95%9F%E7%94%A8-two-factor-authentication</link><guid isPermaLink="false">linux/webmin-啟用-two-factor-authentication</guid><description>
Webmin Two Factor Authentication Authen::OATH
這個問題從我一開始接觸到 Webmin 到現在都沒有解決的問題，所以這邊從其他方式去修復這個問題讓使用者可以用 Two Factor Authentication。
安裝 Webmin 後，為了增加你的</description><pubDate>Thu, 16 May 2019 16:00:00 GMT</pubDate><content:encoded>&lt;figure&gt;&lt;img src=&quot;/assets/images/linux/cover/hotlink-ok/WebminXTwoFactor.webp&quot; alt=&quot;&quot; loading=&quot;lazy&quot; /&gt;&lt;/figure&gt;
&lt;p&gt;Webmin Two Factor Authentication Authen::OATH&lt;br /&gt;
這個問題從我一開始接觸到 Webmin 到現在都沒有解決的問題，所以這邊從其他方式去修復這個問題讓使用者可以用 Two Factor Authentication。&lt;/p&gt;
&lt;p&gt;安裝 Webmin 後，為了增加你的 Webmin 的安全性&lt;br /&gt;
可以通過設定 Webmin Two Factor Authentication 輕鬆達成&lt;/p&gt;
&lt;p&gt;但是 Webmin 上安裝會產生許多不同的錯誤&lt;br /&gt;
其中一個令人惱火的是 Authen :: OATH perl 模塊錯誤&lt;/p&gt;
&lt;p&gt;當選擇 &lt;code&gt;Google Authentication&lt;/code&gt; 並按 &lt;code&gt;下一步&lt;/code&gt; 時，您可能會遇到以下錯誤&lt;/p&gt;
&lt;figure&gt;&lt;img src=&quot;/assets/images/linux/post/webmin_oath_perl_issue.webp&quot; alt=&quot;webmin_oath_perl_issue&quot; loading=&quot;lazy&quot; /&gt;&lt;figcaption&gt;webmin_oath_perl_issue&lt;/figcaption&gt;&lt;/figure&gt;
&lt;p&gt;如果點擊連結 &lt;code&gt;Perl Modules&lt;/code&gt; 將從原始碼安裝它，但是再次可能存在其他依賴項錯誤&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;&lt;span&gt;&lt;span&gt;Can&apos;t locate ExtUtils/MakeMaker.pm&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;然後就開始無限迴圈了，不管怎麼案都會卡在這兩個動作&lt;br /&gt;
原因很簡單，可以是以下任何一個或全部&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;缺少像 Moose，Digest 或 Build 包這樣的 Perl 模塊。&lt;/li&gt;
&lt;li&gt;Authen :: OATH 未正確安裝。&lt;/li&gt;
&lt;li&gt;安裝 OATH 後，您沒有重新啟動 Webmin 核心。&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;最後一個主要問題，因為 Authen::OATH 是從原始碼安裝的&lt;br /&gt;
除非重新啟動核心，否則 Webmin 將無法檢測到它&lt;br /&gt;
安裝 Authen::OATH 後嘗試使用 SSH 重啟 Webmin 服務，問題應該得到解決。&lt;br /&gt;
如果沒有，請按照以下步驟正確安裝&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;安裝 Perl 包&lt;/li&gt;
&lt;/ol&gt;
&lt;pre&gt;&lt;code&gt;&lt;span&gt;&lt;span&gt;yum&lt;/span&gt;&lt;span&gt; install&lt;/span&gt;&lt;span&gt; gcc&lt;/span&gt;&lt;span&gt; &apos;perl(Moose)&apos;&lt;/span&gt;&lt;span&gt; &apos;perl(Digest::HMAC)&apos;&lt;/span&gt;&lt;span&gt; &apos;perl(Module::Build)&apos;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;這將為 Source 構建安裝所有必需的 perl 包，並支持 WebMin 雙因素身份驗證。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;注意&lt;/strong&gt;：如果收到錯誤 &lt;code&gt;No package perl（Moose）available&lt;/code&gt; ，請通過此下方從 tar 包安裝 perl-Moose&lt;br /&gt;
下載 Authen :: OATH 原始碼並解壓縮&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;&lt;span&gt;&lt;span&gt;# 下載&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;然後再次回到 Webmin 設定就可以正常使用 Two Factor Authentication&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;/tags/Linux/&quot;&gt;Linux&lt;/a&gt;&lt;a href=&quot;/tags/Webmin/&quot;&gt;Webmin&lt;/a&gt;&lt;a href=&quot;/tags/2FA/&quot;&gt;2FA&lt;/a&gt;&lt;a href=&quot;/tags/Two-Factor-Authentication/&quot;&gt;Two Factor Authentication&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;此文章已被阅读次数&lt;/p&gt;&lt;div&gt;&lt;/div&gt;…更新於 2022-08-25&lt;p&gt;&lt;/p&gt;</content:encoded><category>category:linux</category><category>tag:Linux</category><category>tag:Webmin</category><category>tag:2FA</category><category>tag:Two Factor Authentication</category></item><item><title>pyinstaller: lib not found 報錯處理</title><link>https://preview.astro.kaitaku.xyz/post/python/pyinstaller-lib-not-found-%E5%A0%B1%E9%8C%AF%E8%99%95%E7%90%86</link><guid isPermaLink="false">python/pyinstaller-lib-not-found-報錯處理</guid><description>使用 pyinstaller 打包 py 檔時
發生非常多的 WARNING: lib not found: api-ms-win-crt-*.dll
2019-05-16-pyinstaller.png
那要如何解決這個問題呢？
一般開發者在 Windows 使用 Python 是不會用虛擬環境</description><pubDate>Wed, 15 May 2019 16:00:00 GMT</pubDate><content:encoded>&lt;p&gt;使用 pyinstaller 打包 py 檔時&lt;br /&gt;
發生非常多的 WARNING: lib not found: api-ms-win-crt-*.dll&lt;/p&gt;
&lt;figure&gt;&lt;img src=&quot;/assets/images/python/post/2019-05-16-pyinstaller-lib-not-found-%E5%A0%B1%E9%8C%AF%E8%99%95%E7%90%86-1.webp&quot; alt=&quot;2019-05-16-pyinstaller.png&quot; loading=&quot;lazy&quot; /&gt;&lt;figcaption&gt;2019-05-16-pyinstaller.png&lt;/figcaption&gt;&lt;/figure&gt;
&lt;p&gt;那要如何解決這個問題呢？&lt;/p&gt;
&lt;p&gt;一般開發者在 Windows 使用 Python 是不會用虛擬環境 (virtualenv)&lt;/p&gt;
&lt;p&gt;但這邊我是有使用虛擬環境，但操作差不多～&lt;/p&gt;
&lt;p&gt;假如今天我們要打包一個名為 &lt;code&gt;app.py&lt;/code&gt; 這個檔案&lt;/p&gt;
&lt;p&gt;我們要先建立 &lt;code&gt;app.py&lt;/code&gt; 的 spec 檔&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;&lt;span&gt;&lt;span&gt;pyi-makespec&lt;/span&gt;&lt;span&gt; app.py&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;之後打開 &lt;code&gt;app.spec&lt;/code&gt; 如下圖&lt;br /&gt;
&lt;/p&gt;&lt;figure&gt;&lt;img src=&quot;/assets/images/python/post/2019-05-16-pyinstaller-lib-not-found-%E5%A0%B1%E9%8C%AF%E8%99%95%E7%90%86-2.webp&quot; alt=&quot;2019-05-16-pyinstaller.png&quot; loading=&quot;lazy&quot; /&gt;&lt;figcaption&gt;2019-05-16-pyinstaller.png&lt;/figcaption&gt;&lt;/figure&gt;&lt;p&gt;&lt;/p&gt;
&lt;p&gt;紅色框起來就是對於我們打包來說比較重要的幾個參數&lt;/p&gt;
&lt;p&gt;&lt;code&gt;pathex&lt;/code&gt; : 打包時要用到的檔案之環境路徑&lt;br /&gt;
&lt;code&gt;datas&lt;/code&gt; : 打包完成後程式會使用到的檔案&lt;br /&gt;
&lt;code&gt;hiddenimports&lt;/code&gt; : 手動 import 該程式會使用到的 lib 或者自己寫的 modules&lt;/p&gt;
&lt;p&gt;要解決 lib not found 的問題就是要 &lt;code&gt;pathex&lt;/code&gt; 這個&lt;br /&gt;
在加入路徑前我們要先安裝 &lt;a href=&quot;https://developer.microsoft.com/en-us/windows/downloads/windows-10-sdk&quot;&gt;Windows SDK&lt;/a&gt;&lt;br /&gt;
因為 Windows 本身沒有內建這些 dll 檔&lt;/p&gt;
&lt;p&gt;安裝完成後到你的安裝目錄 (這邊因人而異，也有可能因版本不同所以有些出入)&lt;br /&gt;
&lt;code&gt;C:\Program Files (x86)\Windows Kits\10\Redist\10.0.18362.0\ucrt\DLLs&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;到這個路徑之後會看到有 &lt;code&gt;x64&lt;/code&gt; , &lt;code&gt;x86&lt;/code&gt; , &lt;code&gt;arm&lt;/code&gt; 三個資料夾&lt;br /&gt;
接著就是依照你的 python 版本去選擇資料夾&lt;br /&gt;
因為我的 python 是 64bit 所以我就選擇 x64&lt;/p&gt;
&lt;p&gt;在 &lt;code&gt;app.spec&lt;/code&gt; 中的 &lt;code&gt;pathex&lt;/code&gt; 加入該路徑如下圖&lt;br /&gt;
&lt;/p&gt;&lt;figure&gt;&lt;img src=&quot;/assets/images/python/post/2019-05-16-pyinstaller-lib-not-found-%E5%A0%B1%E9%8C%AF%E8%99%95%E7%90%86-3.webp&quot; alt=&quot;2019-05-16-pyinstaller.png&quot; loading=&quot;lazy&quot; /&gt;&lt;figcaption&gt;2019-05-16-pyinstaller.png&lt;/figcaption&gt;&lt;/figure&gt;&lt;p&gt;&lt;/p&gt;
&lt;p&gt;接著要打包的指令不要傻傻的把 py 檔帶進去&lt;br /&gt;
pyinstaller 預設如果是帶 py 檔進去就會重新生成 spec 檔&lt;/p&gt;
&lt;p&gt;所以我們要打的指令是&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;&lt;span&gt;&lt;span&gt;pyinstaller&lt;/span&gt;&lt;span&gt; app.spec&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;就會讀取 app.spec 的內容將 py 檔打包成 exe 然後這樣就不會噴錯啦～&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;/tags/Linux/&quot;&gt;Linux&lt;/a&gt;&lt;a href=&quot;/tags/Python/&quot;&gt;Python&lt;/a&gt;&lt;a href=&quot;/tags/PyInstaller/&quot;&gt;PyInstaller&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;此文章已被阅读次数&lt;/p&gt;&lt;div&gt;&lt;/div&gt;…更新於 2022-08-25&lt;p&gt;&lt;/p&gt;</content:encoded><category>category:python</category><category>tag:Linux</category><category>tag:Python</category><category>tag:PyInstaller</category></item></channel></rss>