我的 n8n 架在 AWS EC2 裡、用 docker 啟動,接在cloudfront distribution 跟 ALB 後面。cloudfront 對外使用 redirect HTTP to HTTPS、origin 是使用 HTTP 連 ALB。ALB 的 listener 是 HTTP、target group 也是用 HTTP 連到 target。

n8n 升級到 v1.86 後 editor 右上角會出現 Connection lost 的警告:

alt text

用瀏覽器的 devtool 看是 web socket wss:// 連線有問題,會想換 protocol 、往 http:// 走。

這篇看起來可以更改 push backend 為 sse ,就可以不使用 web socket。對應的 environment variable (ref):

1
N8N_PUSH_BACKEND=sse

設定 push backend 為 sse 後用 devtool 看沒有對 web socket 的連線,但依然 Connection lost。

發現 n8n 的 log 有這段:

1
2
3
4
5
6
7
8
9
10
11
n8n-1  | Origin header is missing
n8n-1 | ResponseError: Invalid origin!
n8n-1 | at Push.handleRequest (/usr/local/lib/node_modules/n8n/src/push/index.ts:143:10)
n8n-1 | at /usr/local/lib/node_modules/n8n/src/push/index.ts:100:10
n8n-1 | at Layer.handleRequest (/usr/local/lib/node_modules/n8n/node_modules/.pnpm/router@2.2.0/node_modules/router/lib/layer.js:152:17)
n8n-1 | at trimPrefix (/usr/local/lib/node_modules/n8n/node_modules/.pnpm/router@2.2.0/node_modules/router/index.js:342:13)
n8n-1 | at /usr/local/lib/node_modules/n8n/node_modules/.pnpm/router@2.2.0/node_modules/router/index.js:297:9
n8n-1 | at processParams (/usr/local/lib/node_modules/n8n/node_modules/.pnpm/router@2.2.0/node_modules/router/index.js:582:12)
n8n-1 | at next (/usr/local/lib/node_modules/n8n/node_modules/.pnpm/router@2.2.0/node_modules/router/index.js:291:5)
n8n-1 | at /usr/local/lib/node_modules/n8n/src/auth/auth.service.ts:110:18
n8n-1 | at processTicksAndRejections (node:internal/process/task_queues:105:5)

看來是 cloudfront 往 origin 這段送的 request 缺少 origin header,參考這篇後我直接在 cloudfront distribution 的 origin 設定加 header origin 、value 寫 n8n.mydomain.org:[ALB_LISTENER_PORT]

alt text

解決啦!!🎉🎉🎉

在 cloudfront distribution 設好 header 後,即使把 push backend 改回 web socket 也能正常運作!🥳

修改 /etc/nixos/configuration.nix

1
2
3
4
5
{ config, pkgs, ... }:

{
networking.hostName = "[HOSTNAME]";
}

有用 flakes 的話也要改 /etc/nixos/flake.nix

1
2
3
4
5
6
7
8
9
10
11
{
outputs = { self, nixpkgs }:
let
system = "x86_64-linux";
in {
nixosConfigurations.nixos = nixpkgs.lib.nixosSystem {
inherit system;
modules = [ ./configuration.nix ];
};
};
}

[HOSTNAME] 改成要的 hostname,接著 rebuild:

1
sudo nixos-rebuild switch --flake .#[HOSTNAME]

最後重開機!

Perplexity 的 AI 結合 search engine,我在 Open WebUI 上使用起來的感覺比開啟搜尋引擎的其他 AI 好得多,單純 gpt-4 配合 Open WebUI 開啟網頁搜尋常常會出現 error。我還不確定是 Open WebUI 還是 search engine 的問題,目前至少用了 gogoduck 跟 google search engine 都會有 error。

Perplexity 要用 API 至少要有 pro 的訂閱(之前續約手機有送一年的使用 😝),而且也是要儲值才能使用。

Setup

  1. 社群上已經有人寫好 function Perplexity Sonar API with citations 了,進到該 function > Get > Import(或者 export 後手動 import) > 輸入 Open WebUI 的 url 來 import 進自己的 Open WebUI > 儲存函式
  2. 在 Open WebUI 的管理員控制台 > 函式 > 點函式的齒輪設定函式
    • Perplexity Api Base Url: https://api.perplexity.ai
    • Perplexity Api Key:[你的 perplexity api key]
  3. 設定完網頁重新整理,在 model 選單就可以看到 Perplexity 的 Sonar 系列 model 囉~
    menu

環境:NixOS 25.05 + KDE 6 + Wayland

configuration.nix ,設定:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
{ config, pkgs, ... }:
{
i18n.inputMethod = {
# NixOS 24.11 起的用法
enable = true;
type = "fcitx5";

fcitx5 = {
plasma6Support = true;
waylandFrontend = true;
ignoreUserConfig = true; # 吃下面的 settings,不用 user 的
addons = with pkgs; [
fcitx5-chewing # 新酷音
fcitx5-chinese-addons
fcitx5-mozc # 日文輸入法
];
settings = {
inputMethod = {
"Groups/0" = {
Name = "Default";
"Default Layout" = "us";
DefaultIM = "keyboard-us";
};
"Groups/0/Items/0".Name = "keyboard-us";
"Groups/0/Items/1".Name = "chewing";
"Groups/0/Items/2".Name = "mozc";
};
};
};
};
}

rebuild 跟重開機後就能打中文了!但還是會跳這個訊息:

wayland

暫時找不到 NixOS 對應設定的地方,而且折騰了一段時間也先不搬到 home manager,所以手動照著訊息設定 virtual keyboard。

切換輸入法後出現 Not available

environment.systemPackages 不要設定 fcitx5 相關 package,不然在切換到新酷音時會出現 Not available 之類的字樣,也無法輸入中文。(ref)

env var GTK_IM_MODULE 與 QT_IM_MODULE

在 Wayland 底下即使沒 NixOS 跟 home manager 內設定這兩個 env variable,也還是會被設定成 fcitx,所以會一直跳這個訊息:

env var GTK_IM_MODULE & QT_IM_MODULE

加上 waylandFrontend = true; 可以讓它別跳了。(ref)

Ref

NixOS + KDE 第一次連 wifi 會跳出 KWallet,但一開始沒有 GPG key 所以選 GPG key 的加密方式會出錯,接著就無法連上 wifi。因為 NixOS 預設安裝的 package 很少,安裝又需要網路,連 gpg 指令需要的 pinentry-qt 都無法安裝,所以先選用 Blowfish 模式避開 GPG。

如果一開始選了 Blowfish 還是一直出現 wifi 連線錯誤,先刪掉 KWallet 設定:

1
2
rm -rf ~/.local/share/kwalletd
rm -rf ~/.config/kwalletrc

再重新登入應該能正常連線啦~ 🎉

這個問題在用 Plasma GUI 安裝 NixOS 的時候也會出現,只是既然在 installation media 索性不加密。😛

昨天介紹了 ECS Cluster Auto Scaling,今天來看看 ECS service 的 auto scaling。(本日程式碼

ECS cluster auto scaling 透過 auto scaling group 控制 container instance 的數量來滿足 task 的需求。ECS 會把 CPU 跟 Memory 使用資訊傳給 Cloudwatch,ECS service auto scaling 則是利用這些 loading 資訊自動增減 task 數量,loading 高便增加 task 數量來提供服務,loading 低則減少 task 以節省資源。ECS 是使用 Application Auto Scaling 的功能來做 service 的 auto scaling。

Read more »

昨天幫 ALB 加上 CDN 但還沒開啟 cache,今天要來實驗一下 CDN 的 cache 機制~

cloudfront distribution 的 cache 相關參數是透過 cache policy 設定的,我們會先新增一個 cache policy、設置相關參數,接著在 distribution 多加一個 behavior,開啟某個 path pattern 的 cache 功能。(本日程式碼

Read more »

今天的主題是幫我們的 Laravel web service 加上 CDN(Content Delivery Network 或 Content Distribution Network),讓使用者可以更快取得取得服務。AWS 的 CDN 服務是 Cloudfront,是個 global 層級的服務。

之前用 ALB DNS name 連 Laravel 的時候是用 HTTP 連線,但在這時代沒有 HTTPS 大概是很難過下去(?)的,我們要在 ALB 前面加上 CDN,並且由 CDN 提供 HTTPS 的存取。這麼做可以讓從 CDN 往 cloud 內部的 network traffic 都不需要再做加解密的動作,因為已經在 cloud 內部是可以不用在傳輸時加密,稍微可以提昇 performance。

使用 Cloudfront 會需要一個 domain name,我們會以 Route 53 管理的 domain name 來實作。那~就開始吧~

Read more »

到目前為止我們都只開一個 container instance 跟兩個 task,這樣雖然有兩個 task 可以分擔工作,但都只在一台 EC2 instance 上,如果這台 EC2 instance 掛掉,整個 application 就掛掉了QQ

為了有更好的 availability,在有機器甚至機房出問題時我們的 application 能維持運作,今天我們要把架構改成經典的 High Availability(HA)架構!(本日程式碼

Read more »