作者: william
使用容器(docker)自架N8N
使用容器 docker 自架N8N社群版非常簡單,但功能有所限制;雲端付費版每月最低20歐元,可解鎖更多功能,建議先使用雲端版14天試用看看,不符合期待再考慮自架。自架方式有很多種,容器方式為首選。
我的環境是:
1. 容器主機
RockyLinux 9.4,docker ce 27.03,postgres sql server 17
2. 代理伺服器主機 apache httpd 2.4
3. dns n8n.test.com
1. 建立docker-compose.yaml檔案
紅字部分須注意斟酌修改
version: "3"
services:
n8n:
image: n8nio/n8n
restart: always
ports:
- "5678:5678"
environment:
- N8N_BASIC_AUTH_ACTIVE=true
- N8N_BASIC_AUTH_USER
- N8N_BASIC_AUTH_PASSWORD
- N8N_HOST=n8n.test.com
- N8N_PORT=5678
- N8N_PROTOCOL=http
- NODE_ENV=production
- WEBHOOK_URL=https://n8n.test.com/
- DB_TYPE=postgresdb
- DB_POSTGRESDB_DATABASE=n8n
- DB_POSTGRESDB_HOST=postgres主機ip
- DB_POSTGRESDB_PORT=5432
- DB_POSTGRESDB_USER=使用者
- DB_POSTGRESDB_PASSWORD=密碼
- DB_POSTGRESDB_SCHEMA=public
- TZ=Asia/Taipei
- GENERIC_TIMEZONE=Asia/Taipei
- N8N_RUNNERS_ENABLED=true
- N8N_ENFORCE_SETTINGS_FILE_PERMISSIONS=true
- N8N_EMAIL_MODE=smtp
- N8N_SMTP_HOST=mail.hlmt.com.tw
- N8N_SMTP_PORT=587
- N8N_SMTP_USER=郵件帳號
- N8N_SMTP_PASS=郵件密碼
- N8N_SMTP_SENDER=sender@test.com
- N8N_SMTP_SSL=false
- N8N_SMTP_STARTTLS=true
- EXPRESS_TRUST_PROXY=true
- N8N_PROXY_HOPS=1
- N8N_PUSH_BACKEND=sse
# 若使用httpd proxy透過web socket請改成N8N_PUSH_BACKEND=websocket
volumes:
- .n8n:/home/node/.n8n
經過測試這版v1.86版,有權限問題,需要先手動建立.n8n,使用者設定為 1000
# mkdir -p .n8n
# chown -R 1000:1000 .n8n
2. 啟用n8n容器

執行 https://n8n.test.com 之後,就可以設定主人了



安裝完畢 ***社群版限制一個帳號,若郵件設定正確,可以再邀請別人加入。
實作一個玩玩看-檢查咖啡偶文章,有新的就通知

一開始先新增RSS Feed trigger:每天晚上查看一次咖啡偶網站 https://kafeiou.pw/feed

中間增加過濾器 filter,過濾當天是否有新的文章,若有就發email通知。
左邊使用java script,左邊變數名稱可以用拖拉的,把第一關卡日期拉進去,再調整日期格式。
右邊則為目前系統日期。
左右相同才會觸發右邊發郵件通知


測試一下,大功告成。
另外在步驟一有提到使用web socket的方式進行反向代理參數設定,須修改docker-compose.yaml檔案
請改為N8N_PUSH_BACKEND=websocket 。httpd config 設定參考如下:
<VirtualHost *:443>
ServerName n8n.test.com
ErrorLog /var/log/httpd/ssl_error_log
TransferLog /var/log/httpd/ssl_access_log
SSLEngine On
SSLCertificateFile /etc/letsencrypt/live/n8n.test.com/cert.pem
SSLCertificateKeyFile /etc/letsencrypt/live/n8n.test.com/privkey.pem
SSLCACertificateFile /etc/letsencrypt//live/n8n.test.com/fullchain.pem
SSLProxyEngine On
ProxyRequests Off
ProxyPreserveHost On
RequestHeader set X-Forwarded-Proto "https"
RewriteEngine On
RewriteCond %{HTTP:Upgrade} =websocket [NC]
RewriteRule /(.*) ws://容器主機IP:5678/$1 [P,L]
RewriteCond %{HTTP:Upgrade} !=websocket [NC]
RewriteRule /(.*) http://容器主機IP:5678/$1 [P,L]
<Location />
Order allow,deny
Allow from all
</Location>
</VirtualHost>
Windows UWP C#程式踩雷-TextBox元件
Windows UWP C#程式踩到雷了-TextBox元件,這元件居然有bug,有可能跟我使用最新版開發環境有關。
我使用visual studio 2022(17.14.0 preview 2.0) 開發uwp 藍牙程式,NuGet使用uwp 套件6.2,14(2022年6月)來開發藍牙用戶端程式,使用的範例在此,這範例限制作業系統需為windows 11 22h2版本以上,嚇死人啊,為了這個我也硬升級到此版本。



windows uwp C#開發程式很簡單,將範例程式拉下來,叫出工具箱加入想要的元件即可。

我這次加上TextBox元件,要讓掃描槍BarCode Scanner,將條碼掃到TextBox元件裡面,元件設定當內容變動(TextChanged)就會觸發程式,讓程式檢查內容。


條碼機將掃描的資料輸入到TextBox時,會觸發TextChanged,程式檢查輸入內容長度為9,才會進行寫入序號任務。
windows uwp程式讓使用者測試一段時間。挖哩勒,使用者每次掃描條碼,程式都會重複執行寫入序號任務多次,理應只執行一次啊。剛好使用者覺得無所謂,一直都沒回報,直到幾周後才回報問題。
我連過去越南廠線上觀察,發現當地使用windows平板,掃描條碼時,會讓TextBox元件觸發多次一樣內容。
例如,掃描123456789這個字串,程式會觸發9次,每次內容為1(長度1)、2(長度2)…直至9(長度9);很可惜,實際上卻不穩定觸發,如,1(長度1)、9(長度9)、9(長度9)、9(長度9),造成程式秀逗,我在開發時卻沒有,很難歸納是掃描器輸入太快。
最後我只能用lock的方式解決(這每人解法不同,就不多說了)。

使用者升級到windows 11 22h2就頭痛了,這程式還特別挑藍牙硬體,應該是windowns藍牙驅動問題,安裝在筆電或是windows平板最穩定。
「Tolgee」自行架設(self-hosted),使用docker
上一篇文章「Tolgee」協助您開發多語系APP我建議公司內部使用tolgee;本篇簡易tolgee教學「tolgee該如何使用docker自行架設」。
- 前置作業要把docker或podman,可以看這篇RockyLinux 安裝 docker準備好。
- 準備好外部的資料庫容器(postgres、mariadb),postgress可參考這篇postgres 指令(連線、安裝)。
- 安裝容器
這裡我採用連結外部postgres,請先行建立資料庫tolgee,
其他環境變數(標示紅字),需自行調整。
docker-compose.yaml檔案
version: '3'
services:
app:
image: tolgee/tolgee:latest
volumes:
- ./data:/data
- ./config.yaml:/config.yaml
ports:
- '8090:8080'
deploy:
restart_policy:
condition: on-failure
env_file:
- .env
#若不使用外部postgres,可自架內部專用postgres
# db:
# image: postgres:13
# environment:
# POSTGRES_DB: tolgee
# POSTGRES_USER: admin
# POSTGRES_PASSWORD: admin
# volumes:
# - ./data/postgres:/var/lib/postgresql/data
# ports:
# - '5432ˊ:5432' # 讓外面也可存取
.config.yaml檔案
tolgee:
postgres-autostart:
enabled: false
spring:
datasource:
url: jdbc:postgresql://外部postgreIP:5432/tolgee
username: 帳號
password: 密碼
.env檔案
spring.config.additional-location: file:///config.yaml
TOLGEE_AUTHENTICATION_ENABLED=true
TOLGEE_AUTHENTICATION_INITIAL_PASSWORD=admin
TOLGEE_AUTHENTICATION_INITIAL_USERNAME=admin
TOLGEE_AUTHENTICATION_JWT_SECRET=my_jwt_secret #長度必須大於64
#TOLGEE_MACHINE_TRANSLATION_GOOGLE_API_KEY=my_google_api_key
TOLGEE_SMTP_AUTH=true
TOLGEE_SMTP_FROM=Tolgee <no-reply@mydomain.com>
TOLGEE_SMTP_HOST=email-smtp.regional-region.amazonaws.com
TOLGEE_SMTP_PASSWORD=omg/my/password
TOLGEE_SMTP_PORT=465
TOLGEE_SMTP_SSL_ENABLED=true
TOLGEE_SMTP_USERNAME=user@company.com
# 停用自行註冊功能,只能管理者邀請
TOLGEE_AUTHENTICATION_REGISTRATIONS_ALLOWED=false
# 搞定反向代理之後,請設定網站名稱(不然邀請函只會出現ip)
TOLGEE_FRONT_END_URL=https://tolgee.test.com
安裝完畢,管理者就可以寄發邀請email,或是連結給使用者,讓使用者加入專案

心得結論
Tolgee自架版本雖說有些限制,但已經很好用了,一般小公司有開發app的人已經不得了,不需要用企業版複雜功能。
「Tolgee」協助您開發多語系APP
「Tolgee」是一款新興的翻譯輔助系統,可以協助您開發多語系APP。
目前最有名的雲端翻譯網站為 crowdin,功能強大的付費系統,很推薦使用;若公司需要自行架設(self-hosted),可以參考weblate或tolgee,這兩樣都是較有名的免費開源翻譯系統。
以下是 Weblate 和 Tolgee 的比較表,以幫助你選擇適合的翻譯與本地化平台:
特性 | Weblate | Tolgee |
---|---|---|
類型 | 自託管 + 雲端 | 自託管 + 雲端 |
開源 | ✅(完全開源) | ✅(開源,但部分功能需付費) |
托管方式 | 自託管 / Weblate 服務 | 自託管 / Tolgee Cloud |
即時協作 | ✅ | ✅ |
支援的格式 | 40+ 種格式(JSON、YAML、PO、XLIFF、TS、ResX 等) | JSON、XLIFF、PO、YAML、TS、Java Properties 等 |
機器翻譯 | 支援 Google、DeepL、Azure、Apertium | 支援 Google、DeepL、Azure |
翻譯記憶庫(TM) | ✅ | ✅ |
自動提議翻譯 | ✅ | ✅ |
語言品質檢查 | ✅(內建 QA 機制) | ✅(內建錯誤檢查) |
上下文支援 | 🟡(需手動提供) | ✅(可透過 Tolgee SDK 自動擷取) |
API & SDK | REST API,可與 Git、CI/CD 整合 | REST API,專有 SDK(適用於 React、Vue、Angular 等) |
Git 整合 | ✅(自動同步) | ✅(自動同步) |
視覺化翻譯(In-context) | 🟡(有限支援) | ✅(內建即時預覽) |
權限管理 | ✅(細緻的角色與權限控制) | ✅(細緻的角色與權限控制) |
價格 | 免費(自託管)/ 付費雲端 | 免費(基本功能)/ 進階功能需付費 |
適合對象 | 開發團隊、開源專案、企業 | 需要即時翻譯預覽的開發團隊 |
實作總結(推薦使用tolgee)
- Weblate 需先選定APP翻譯格式,然後再進行翻譯,這樣可以直接與APP版控整合,但跨平台APP需要重複翻譯多次(多個格式),另外weblate本身語言翻譯很差(乾脆不要提供各國語系版),寧願使用英文版。
- Tolgee 則採先翻譯方式,然後再整合不同APP開發格式輸出,這樣只要翻譯一次即可,再匯出讓工程師使用,但無法整合git較不方便。

ps. 到本日(2025/3/22) weblate尚未支援apple string catalog翻譯檔案(.xcstrings),很不方便;而tolgee 3/5之後支援了。

Android自動調整文字大小
我是個半吊子Android程式師,有時候常常被使用者罵文字版面跑掉,深深覺得andoird要能自動調整textview文字大小非常重要。
有些android使用者會調整手機預設字型大小,有些因為手機本身解析度不同,甚至摺疊手機,都會影響APP使用體驗;因此我們設計app一定要考慮文字大小。
官網已經有詳細的介紹,請點選這裡參考。
我自己則常用以下設定來解決文字大小問題。
android:autoSizeTextType="uniform"
android:autoSizeMinTextSize="20sp"
android:autoSizeMaxTextSize="24sp"
android:autoSizeStepGranularity="2sp"

windows 10 22h2啟用sslv3以及老舊加密法
windows 10 22h2 已經停用 sslv3 加密, 但是有些公司郵件伺服器還在使用sslv3,以及很老舊的加密方式,所以有必要啟用他們。
要啟用sslv3,可到 Nartac Software 下載 IIS Crypto 4.0 。
執行IIS Crypto程式,如下圖所示,點選 「Best Practices」-> 再選SSL3.0 ,或是全選也可,然後套用 Apply ->重開機,就可以重新讓windows 10 22h2 重振雄風繼續支援老舊加密法。
這樣就能爭取時間,趕緊升級舊系統囉。

選擇 “Cipher Suites”(如下圖) ,將能勾選的都選上,然後手動加上以下加密法,最後再一次apply,Reboot。
#請手動加入
TLS_DHE_RSA_WITH_AES_256_GCM_SHA384
TLS_DHE_RSA_WITH_AES_128_GCM_SHA256
TLS_RSA_WITH_3DES_EDE_CBC_SHA

mac lid closed 如何避免mac蓋子蓋上後電源關閉
Prevent Macbook Pro to sleep when lid closed
sudo pmset -a disablesleep 1
此外還要停用進入保護模式,以及休眠
Click Lock Screen, then select the menu next to Turn display off on power adapter when inactive. Pick Never.
https://www.lifewire.com/prevent-macbook-from-sleeping-when-lid-is-closed-5203069
windows uwp怎確認網站是否可存取
try
{
var request = WebRequest.Create("https://tw.yahoo.com");
request.Timeout = 5000;
request.Method = "HEAD";
using (var response = (HttpWebResponse)request.GetResponse())
{
String s = response.StatusCode.ToString();
response.Close();
return s.Equals(System.Net.HttpStatusCode.OK.ToString());
}
}
catch (System.Net.WebException exception)
{
return false;
}
RockyLinux 9 使用usb硬碟備份,要避免硬碟進入休眠
過年要到了,小公司需要利用這時間進行系統備份,外接usb備份也很重要,備份完直接切斷usb硬碟連線,但我發現usb會進入休眠,不確定是否能終端機叫醒,因此乾脆直接改成不休眠狀態。
2013年有篇文章,有大佬分享心得
