<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>Docs on 筆記</title><link>https://05d2be60.notes-54i.pages.dev/docs/</link><description>Recent content in Docs on 筆記</description><generator>Hugo</generator><language>zh-tw</language><atom:link href="https://05d2be60.notes-54i.pages.dev/docs/index.xml" rel="self" type="application/rss+xml"/><item><title>Getting Started</title><link>https://05d2be60.notes-54i.pages.dev/docs/getting-started/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://05d2be60.notes-54i.pages.dev/docs/getting-started/</guid><description/></item><item><title/><link>https://05d2be60.notes-54i.pages.dev/docs/log-%E5%BE%AA%E7%92%B0%E7%B4%80%E9%8C%84%E9%83%A8%E7%BD%B2-tams-hmi/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://05d2be60.notes-54i.pages.dev/docs/log-%E5%BE%AA%E7%92%B0%E7%B4%80%E9%8C%84%E9%83%A8%E7%BD%B2-tams-hmi/</guid><description>&lt;h1 id="log-循環紀錄部署tams--hmi"&gt;Log 循環紀錄部署（TAMS + HMI）&lt;a class="anchor" href="#log-%e5%be%aa%e7%92%b0%e7%b4%80%e9%8c%84%e9%83%a8%e7%bd%b2tams--hmi"&gt;#&lt;/a&gt;&lt;/h1&gt;
&lt;ul&gt;
&lt;li&gt;TAMS：每小時更新當天 log；每日 &lt;code&gt;00:10&lt;/code&gt; 完整匯出前一天。&lt;/li&gt;
&lt;li&gt;HMI：每日 &lt;code&gt;09:00&lt;/code&gt; 從 &lt;code&gt;172.18.35.29:3100&lt;/code&gt; 完整匯出前一天。&lt;/li&gt;
&lt;li&gt;兩者皆保留 90 天。&lt;/li&gt;
&lt;li&gt;輸出格式為 JSONL。&lt;/li&gt;
&lt;li&gt;Log 儲存根目錄為 &lt;code&gt;/Data/Log/&lt;/code&gt;。&lt;/li&gt;
&lt;li&gt;使用 &lt;code&gt;loki-readers&lt;/code&gt; 群組控管讀取權限。&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;目錄結構：&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-javascript" data-lang="javascript"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#960050;background-color:#1e0010"&gt;/Data/Log/&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#960050;background-color:#1e0010"&gt;├──&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;tams&lt;/span&gt;&lt;span style="color:#f92672"&gt;/&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#960050;background-color:#1e0010"&gt;│&lt;/span&gt; &lt;span style="color:#960050;background-color:#1e0010"&gt;├──&lt;/span&gt; &lt;span style="color:#ae81ff"&gt;2026&lt;/span&gt;&lt;span style="color:#f92672"&gt;-&lt;/span&gt;&lt;span style="color:#ae81ff"&gt;08&lt;/span&gt;&lt;span style="color:#f92672"&gt;-&lt;/span&gt;&lt;span style="color:#ae81ff"&gt;04.&lt;/span&gt;&lt;span style="color:#a6e22e"&gt;jsonl&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#960050;background-color:#1e0010"&gt;│&lt;/span&gt; &lt;span style="color:#960050;background-color:#1e0010"&gt;└──&lt;/span&gt; &lt;span style="color:#ae81ff"&gt;2026&lt;/span&gt;&lt;span style="color:#f92672"&gt;-&lt;/span&gt;&lt;span style="color:#ae81ff"&gt;08&lt;/span&gt;&lt;span style="color:#f92672"&gt;-&lt;/span&gt;&lt;span style="color:#ae81ff"&gt;05.&lt;/span&gt;&lt;span style="color:#a6e22e"&gt;jsonl&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#960050;background-color:#1e0010"&gt;├──&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;hmi&lt;/span&gt;&lt;span style="color:#f92672"&gt;/&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#960050;background-color:#1e0010"&gt;│&lt;/span&gt; &lt;span style="color:#960050;background-color:#1e0010"&gt;└──&lt;/span&gt; &lt;span style="color:#ae81ff"&gt;2026&lt;/span&gt;&lt;span style="color:#f92672"&gt;-&lt;/span&gt;&lt;span style="color:#ae81ff"&gt;08&lt;/span&gt;&lt;span style="color:#f92672"&gt;-&lt;/span&gt;&lt;span style="color:#ae81ff"&gt;04.&lt;/span&gt;&lt;span style="color:#a6e22e"&gt;jsonl&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#960050;background-color:#1e0010"&gt;├──&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;loki&lt;/span&gt;&lt;span style="color:#f92672"&gt;-&lt;/span&gt;&lt;span style="color:#66d9ef"&gt;export&lt;/span&gt;&lt;span style="color:#f92672"&gt;-&lt;/span&gt;&lt;span style="color:#a6e22e"&gt;cron&lt;/span&gt;.&lt;span style="color:#a6e22e"&gt;log&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#960050;background-color:#1e0010"&gt;└──&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;loki&lt;/span&gt;&lt;span style="color:#f92672"&gt;-&lt;/span&gt;&lt;span style="color:#66d9ef"&gt;export&lt;/span&gt;&lt;span style="color:#f92672"&gt;-&lt;/span&gt;&lt;span style="color:#a6e22e"&gt;hmi&lt;/span&gt;&lt;span style="color:#f92672"&gt;-&lt;/span&gt;&lt;span style="color:#a6e22e"&gt;cron&lt;/span&gt;.&lt;span style="color:#a6e22e"&gt;log&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id="1-安裝-logcli"&gt;1. 安裝 LogCLI&lt;a class="anchor" href="#1-%e5%ae%89%e8%a3%9d-logcli"&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;已安裝者可跳過。&lt;/p&gt;
&lt;p&gt;LogCLI 建議與 Loki 使用相同版本。以下以 Loki &lt;code&gt;v2.9.2&lt;/code&gt;、Linux amd64 為例：&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;sudo apt-get update
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;sudo apt-get install -y curl unzip util-linux
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;tmp_dir&lt;span style="color:#f92672"&gt;=&lt;/span&gt;&lt;span style="color:#e6db74"&gt;&amp;#34;&lt;/span&gt;&lt;span style="color:#66d9ef"&gt;$(&lt;/span&gt;mktemp -d&lt;span style="color:#66d9ef"&gt;)&lt;/span&gt;&lt;span style="color:#e6db74"&gt;&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;curl -fL &lt;span style="color:#ae81ff"&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; https://github.com/grafana/loki/releases/download/v2.9.2/logcli-linux-amd64.zip &lt;span style="color:#ae81ff"&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; -o &lt;span style="color:#e6db74"&gt;&amp;#34;&lt;/span&gt;$tmp_dir&lt;span style="color:#e6db74"&gt;/logcli.zip&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;unzip &lt;span style="color:#e6db74"&gt;&amp;#34;&lt;/span&gt;$tmp_dir&lt;span style="color:#e6db74"&gt;/logcli.zip&amp;#34;&lt;/span&gt; -d &lt;span style="color:#e6db74"&gt;&amp;#34;&lt;/span&gt;$tmp_dir&lt;span style="color:#e6db74"&gt;&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;sudo install &lt;span style="color:#ae81ff"&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; -m &lt;span style="color:#ae81ff"&gt;0755&lt;/span&gt; &lt;span style="color:#ae81ff"&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#e6db74"&gt;&amp;#34;&lt;/span&gt;$tmp_dir&lt;span style="color:#e6db74"&gt;/logcli-linux-amd64&amp;#34;&lt;/span&gt; &lt;span style="color:#ae81ff"&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; /usr/local/bin/logcli
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;rm -rf &lt;span style="color:#e6db74"&gt;&amp;#34;&lt;/span&gt;$tmp_dir&lt;span style="color:#e6db74"&gt;&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;sudo /usr/local/bin/logcli --version&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id="2-建立群組授權"&gt;2. 建立群組授權&lt;a class="anchor" href="#2-%e5%bb%ba%e7%ab%8b%e7%be%a4%e7%b5%84%e6%8e%88%e6%ac%8a"&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;建議使用群組授權，不要直接開放所有帳號讀取 backend log。&lt;/p&gt;</description></item><item><title/><link>https://05d2be60.notes-54i.pages.dev/docs/%E9%9B%A2%E7%B7%9A%E9%83%A8%E7%BD%B2-docker-image/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://05d2be60.notes-54i.pages.dev/docs/%E9%9B%A2%E7%B7%9A%E9%83%A8%E7%BD%B2-docker-image/</guid><description>&lt;h1 id="離線部署-docker-image"&gt;離線部署 docker image&lt;a class="anchor" href="#%e9%9b%a2%e7%b7%9a%e9%83%a8%e7%bd%b2-docker-image"&gt;#&lt;/a&gt;&lt;/h1&gt;
&lt;p&gt;以下是 frontend + backend 的離線部署流程。假設建置機有外網、部署機為一般 Linux x86_64。&lt;/p&gt;
&lt;h2 id="1-有外網的建置機建立-image"&gt;1. 有外網的建置機：建立 image&lt;a class="anchor" href="#1-%e6%9c%89%e5%a4%96%e7%b6%b2%e7%9a%84%e5%bb%ba%e7%bd%ae%e6%a9%9f%e5%bb%ba%e7%ab%8b-image"&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;在專案根目錄執行（版本號可自行替換）：&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;export RELEASE_TAG&lt;span style="color:#f92672"&gt;=&lt;/span&gt;&lt;span style="color:#ae81ff"&gt;20260804&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Frontend：&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;cd tams-frontend
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;docker buildx build &lt;span style="color:#ae81ff"&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; --platform linux/amd64 &lt;span style="color:#ae81ff"&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; --load &lt;span style="color:#ae81ff"&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; -t tams-frontend:&lt;span style="color:#e6db74"&gt;${&lt;/span&gt;RELEASE_TAG&lt;span style="color:#e6db74"&gt;}&lt;/span&gt; &lt;span style="color:#ae81ff"&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; -t tams-frontend:latest &lt;span style="color:#ae81ff"&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; --build-arg VITE_WS_URL&lt;span style="color:#f92672"&gt;=&lt;/span&gt;same-origin &lt;span style="color:#ae81ff"&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; --build-arg VITE_API_URL&lt;span style="color:#f92672"&gt;=&lt;/span&gt;/api/v1 &lt;span style="color:#ae81ff"&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; --build-arg VITE_LIDAR_MODE&lt;span style="color:#f92672"&gt;=&lt;/span&gt;real &lt;span style="color:#ae81ff"&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; --build-arg VITE_LIDAR_TEST_ROBOT&lt;span style="color:#f92672"&gt;=&lt;/span&gt;true &lt;span style="color:#ae81ff"&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; --build-arg VITE_HOSPITAL_INITIAL_RELEASE&lt;span style="color:#f92672"&gt;=&lt;/span&gt;true &lt;span style="color:#ae81ff"&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; --build-arg VITE_LOW_BATTERY_THRESHOLD_MIN&lt;span style="color:#f92672"&gt;=&lt;/span&gt;&lt;span style="color:#ae81ff"&gt;20&lt;/span&gt; &lt;span style="color:#ae81ff"&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; .&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Backend：&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;cd ../tams-backend-service
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;docker buildx build &lt;span style="color:#ae81ff"&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; --platform linux/amd64 &lt;span style="color:#ae81ff"&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; --target production &lt;span style="color:#ae81ff"&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; --load &lt;span style="color:#ae81ff"&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; -t tams-backend:&lt;span style="color:#e6db74"&gt;${&lt;/span&gt;RELEASE_TAG&lt;span style="color:#e6db74"&gt;}&lt;/span&gt; &lt;span style="color:#ae81ff"&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; -t tams-backend:production &lt;span style="color:#ae81ff"&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; .&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;&lt;code&gt;VITE_API_URL=/api/v1&lt;/code&gt; 會編譯進 frontend bundle，因此瀏覽器會對前端同源 &lt;code&gt;/api/v1/...&lt;/code&gt; 發請求，再由 Nginx 轉送至 backend。&lt;/p&gt;</description></item></channel></rss>