透過 frp 與 GCP 打通家用 kubernetes cluster 的對外連線

概述 在家裡面架著一台 lab,使用 proxmox ve 作為 vm server 透過 qemu 虛擬化一台 ubuntu server vm 在這個 vm 上使用 k3s,啟動 kubernetes 的服務 在 kubernetes 內跑著眾多 dockerize 的 containers。 雖然我不是資深維運專家,但我知道這可能很搞笑。 會需要這麼麻煩還不是為了省一點點 GKE 的成本(即便可能沒省到),但在自家建一個 lab 環境而不用計算由時間計價的 infra 成本,還是挺省腦袋的。 過去僅是將 service 使用 nodePort 來讓家裡面的其他裝置可以連線,或是使用 wireguard 作為 VPN 來從遠端連線,就是沒有動力處理好 http service 與 TLS,趁這個假日剛好需要把 自架 vaultwarden 後端 給 expose 出來,便誕生了這篇。 在當前的雲端運算時代,許多開發者和 IT 專業人員都面臨著一個共同的挑戰:如何有效地將位於不同網絡環境中的服務整合並暴露給公眾。特別是對於那些希望將家用網絡中的服務有效連接到公共雲端(如 GCP,AWS,Azure,OCI)的用戶來說,這一挑戰尤為突出。文內主要講述通過在 GCP VM 上部署 FRP(Fast Reverse Proxy)服務器,結合家中的 kubernetes cluster 上配置的 FRP 客戶端,來實現一個高效且安全的服務部署流程。 透過此方式,我們不僅可以利用 GCP VM 作為公共 IP 的代理,實現從互聯網到家庭網絡的無縫連接,還能藉助 kubernetes 的強大功能進行快速的服務部署和管理。同時,利用 ingress-nginx 作為 ingress 控制器和 cert-manager 進行 TLS 設定,我們能夠確保服務的安全性和可靠性。...

2023-11-12 · 5 min · 923 words

KDE neon / Ubuntu 啟用 PipeWire 與 LDAC/AAC/AptX 藍芽編碼

Ubuntu 22.10 將 Audio Server 從 PulseAudio 切換成 PipeWire 遇到了什麼問題 明明使用著有 LDAC 或是 AptX 解碼能力的藍芽耳機,卻只能被迫接受 sbc 的低傳輸率音質嗎,身為規格黨怎麼可以忍受這件事(即便大部份時間都只使用 Youtube Music 的 128K bps opus) 解決方法 我們可以在 KDE neon 上啟用 PipeWire,並安裝更多藍芽轉碼器 安裝 WirePlumber(PipeWire Manager) sudo apt install -y pipewire-media-session- wireplumber 透過 systemd 管理 WirePlumber 的開機自啟 daemon systemctl --user --now enable wireplumber.service 安裝 ALSA sudo apt install -y pipewire-audio-client-libraries 安裝藍芽轉碼器 sudo apt install -y \ libfdk-aac2 \ libldacbt-{abr,enc}2 \ libopenaptx0 sudo apt install -y \ libspa-0....

2023-10-01 · 1 min · 112 words

使用 wireguard 與 aws 搭建虛擬內網

先前在「在 AWS 上使用 EC2 建立 FRP 玩玩內網穿透」一文中敘述了如何透過 AWS 實現虛擬穿透,也在內文中提到或許可以使用 wireguard 搭建內網,其原因也很簡單:每更新一個 port 都要重新設定 server side 實在是太麻煩了,拖更了進一年終於要開始寫 wireguard 的使用了。(AWS 免費也快到期了) 遇到了什麼問題 在使用 wireguard 來搭建 VPN 前,我是使用 zerotier 搭配 Mikrotik RB5009 所執行的 RouterOS 7.x 版本,讓外網可以連回家裡的網路環境 但 zerotier 的網路拓樸是存在他們官方伺服氣上,與其相信 zerotier,我想在 vps 上建立虛擬機,並只許特定 ip 登入,可能更加可靠(? 解決方法 於是我在 frp tunnel VM 上建立了 wireguard 節點,作為外網與內網溝通的橋樑。 wireguard 是一個高效的現代化 VPN,目標是比 IPsec 更快。在 2020 年時正式推出 1.0.0 版本。 wireguard 的拓樸實際上是 peer2peer,甚至可以達到 full mesh,但礙於錢錢不夠,單一個節點作為 server side 就足夠了。 server 使用 docker-compose 能快速部署 wireguard 服務,我們使用的是 wg-easy 簡單換掉一些參數:...

2023-10-01 · 2 min · 314 words

透過 WakaTime 幫助來紀錄自己做了哪些事,並製作獨特的 GitHub Profile

WakaTime 介紹 WakaTime 是一款紀錄自己生產力的工具,透過客戶端插件、集成工具紀錄「行徑」並發送到官方|非官方伺服器,可以分析花了多久時間在哪個專案、哪個程式語言、會議、code review。 記憶力不佳,過去常常無法想起某段時間做了哪些專案,甚至 daily standup 前忘記昨天做了什麼,發現了 wakatime 可以透過 vscode 插件、terminal 插件來查看自己在哪些時間變更了哪些專案、檔案,甚至可以紀錄下過得指令(僅 binary 的部份,不含參數不會洩漏資料)。 在使用 WakaTime 前,先到 WakaTime 官網上註冊並登入,取得最重要的 API Key(API Token): 安裝相應的客戶端插件。wakatime 支援的插件、編輯器包括但不限於: Visual Studio Code Vim Excel Terminal zsh bash fish iTerm2 舉例來說我們可以安裝 vscode 插件,並跟著 Installation 輸入完 API Key 就可以開始寫點東西了。 查看報告 使用了一段時間後,可以回到官網查看 dashboard 查看自己上週、前兩週、前一個月每天花了(浪費)了多少時間,以前三十天的圖為例: 或是 YoY 的活動圖 以此 blog 的 repo 來作為舉例,可以查看某個 project 的細節 在該專案花了多少時間、什麼語言: 檔案、分支的時間分配: 費用 免費版本的功能已經十分完整了,完整費用方案在此。 透過學生帳號可以申請教育折扣,年度付費 Premium 方案的話一年只要 59 美元,就可以享有完整的 WakaTime 服務。 雖然付費方案的功能幾乎都可以透過免費版本就有的 API 來完成,但仍可以花點小錢支持團隊,或是開啟公司計畫。...

2023-08-03 · 2 min · 298 words

KDE Neon 使用心得與踩雷紀錄

前言 年初為了 arc browser 裝了一台 Hackintosh,因為原因又花了點時間裝了 KDE Neon,這邊紀錄一下使用心得與踩雷紀錄。時間線大概是 快快樂樂使用 wsl2 wsl 中踩了不少坑,想要嘗試 unix liked 的系統 好心人提供 arc browser 的邀請,萌生了裝 Hackintosh 的念頭 在 HP Z2 G4 上裝了 Hackintosh,但是沒有事前做足功課,內顯圖形記憶體(P630)始終是 7mb 買了張 amd WX4100 督上去,大幅提昇圖形性能,卻也沒再花時間繼續深入 嘗試在 windows 主機上雙系統 (windows + linux): 一開始直接選擇熟悉的 ubuntu,安裝了 ubuntu desktop 版本,由於是 nvidia 顯示卡,很快的遇到了硬體解碼問題 開始嘗試 nvidia-vaapi-driver,但是遇到了很多問題,最後放棄 想換到 amd 顯示卡,但是又不想花錢,於是想說看看其他發布版是否能解決 從 Linux Mint, Manjaro, KEO Neon 中選擇了同樣是 ubuntu 底,卻是 KDE 團隊維護團隊的 KDE Neon 不出意外的一樣遇到了 nvidia 驅動問題,雖然 firefox 已經可以順利硬體加速,但是 chromium 等仍然無法硬體加速 這時候已經花了不少時間在這個問題上,於是決定換到 amd 顯示卡(內顯) 在 Minisforum UM560 上安裝了 KDE Neon,一切順利,驅動毫無問題,硬體加速也正常 嘗試裝了 ventura theme,讓他稍微好看一點 持續與 wayland 相處,走一步是一步… ❯ neofetch `....

2023-06-04 · 4 min · 675 words

golang 樂觀鎖、悲觀鎖 學習筆記與實驗

介紹 改變數值的三個步驟 取出 修改 保存 但這三者間的時間差在不同 process、不同 thread、不同 corutine/goroutine 中會造成競爭危害(race condition)。 可以使用多種發法確保並行(concurrency)處理時保持資料的一致性,這裡介紹的是最常使用的悲觀鎖與樂觀鎖。 悲觀鎖: 總可能發生問題 lock (1) 取值 (2) 修改 (3) 保存 unlock 樂觀鎖: 不會總是發生問題 (1) 取值 if *addr == old { (2) 修改 (3) 保存 return true } return false 悲觀鎖 golang 中主要使用 sync.Mutex 作為悲觀鎖,看似會阻塞住其他 goroutines,但其實 sync.Mutex 中也使用到了 CAS。 sync.Mutex 中有一個 int32 的 state 與 uint32 的 sema(semaphore) type Mutex struct { state int32 sema uint32 } const ( mutexLocked = 1 << iota // mutex is locked mutexWoken mutexStarving mutexWaiterShift = iota starvationThresholdNs = 1e6 ) func (m *Mutex) Lock() { if atomic....

2023-05-14 · 3 min · 503 words

讓 BOOX 也使用繁體中文辭典

由於最近讀原文書讀得挺辛苦,邊用電子閱讀器看書,騰不出手用手機查字典,內建的辭典又只有英文翻譯簡體中文,在網上衝浪也找不到繁體中文的 mdx 英漢辭典可以直接使用。 所需依賴 任何英漢辭典 文內以 BOOX 內下載的英漢辭典,參考教學。 python 環境,用以安裝 mdict-utils 經測試後 windows 與 wsl 中均能完成,文內 python 環境以 wsl 為主。 任何繁簡轉換軟體 文內以新發現的 ConvertZZ 最為 GUI 簡轉繁示例。 文末有使用 OpenCC 作為 CLI 示例。 主要流程 將 mdx 拆成 txt 簡轉繁 將 txt 包成 mdx 安裝 安裝 mdict-utils ❯ pip install mdict-utils Defaulting to user installation because normal site-packages is not writeable Collecting mdict-utils Downloading mdict_utils-1.3.12-py3-none-any.whl (36 kB) Collecting xxhash Downloading xxhash-3.2.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (212 kB) ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 212....

2023-05-04 · 2 min · 250 words

如何優雅地批次安裝 Nerd font 字型

fonts repo 接觸 wsl/ubuntu 的這幾年,經常會需要安裝 zsh 以及字型,因此誕生了 cheat sheet,久而久之連下載->解壓縮->安裝這個過程,都懶了。 於是寫了一個批次下載並安裝最新版本的 Nerd Fond 字型的 shell script,讓 wsl 可以安裝 windows 的字型,linux 可以安裝 linux 字型。 #!/bin/bash declare target="linux" declare repo="ryanoasis/nerd-fonts" declare -a fonts=( BitstreamVeraSansMono CodeNewRoman DroidSansMono FiraCode FiraMono Go-Mono Hack Hermit JetBrainsMono Meslo Noto Overpass ProggyClean RobotoMono SourceCodePro SpaceMono Ubuntu UbuntuMono ) ARGS=`getopt -o p --long windows -- "$@"` if [ $? -ne 0 ]; then echo "getopt failed: " $ARGS exit 1 fi eval set -- "${ARGS}" while true do case "$1" in -p|--windows) target=windows shift ;; --) shift break ;; esac done get_latest_release() { echo $(curl --silent "https://api....

2023-05-03 · 2 min · 310 words

golang 中使用 Line LIFF 實作 Single Sign-On

文章中的程式碼放在https://github.com/omegaatt36/line-verify-id-token中。 Requirements Line Login Channel channel id channel secret Line LIFF APP 用 liff.getIDToken() 獲取 ID Token 在現代網站中,單一登錄 (Single Sign-On, SSO) 已經成為了一個普遍存在的功能,它能夠讓使用者在不同的應用程式和服務之間自動地登錄,而不需要再輸入帳號和密碼。這樣可以方便使用者的使用,並且也能夠增加安全性,減少帳號密碼被盜用的風險。 我們將使用 Golang 語言來實作單一登錄功能,並且使用 Line LIFF 來進行身份驗證。在此之前,我們需要先了解幾個概念。 Line LIFF (Line Front-end Framework) 是一個由 Line 提供的 Web 應用程式框架,開發者可以使用它來建立 Line 的客戶端應用程式。使用 Line LIFF 開發的應用程式可以在 Line 客戶端中被直接執行,而不需要額外安裝或下載。此外,Line LIFF 還提供了一些功能,例如使用者的身份驗證、分享資料等等。 JWT (JSON Web Token) 則是一種開放標準,用於在不同系統之間安全地傳輸訊息。它通常用於認證和授權,因為它可以確保傳輸的訊息是可信的,而且在傳輸過程中不會被竄改。 我們可以使用 Line 的 Verify API,同時也可以選擇後端自己驗證,解出 jwt 中的資訊。 我們的目的是拿到每個使用者在 Line 的 UserID,做為身分識別。於是根據 Line 提供的 JWT 欄位對應,定義一個結構用來存放驗證後的資訊。 // DecodedIDToken defines decoded payload by id token....

2023-04-22 · 3 min · 571 words

跟風寫了個使用 OpenAI API 的 Telegram Chat Bot

前言 放在最前面 Github repo 原本打算使用別人寫好的 bot,免費的版本均是透過儲存 cookies 的方式,直接透過 ChatGPT 網頁建立新的 「Chat」。好景不常,OpenAI 馬上把登入頁面到聊天頁面中間安插了類似 reCaptcha,來驗證是否為真人。看到有好心人提供了 go 版本的 OpenAi API,就打算自己寫一寫,順便當作 《Clean Architecture》 的讀後作業。 依賴注入 架構圖待補 我需要對 OpenAI 詢問,並用 stream(逐字)的方式回給我,也需要對 Telegram 逐字回答。 在這個 8931bf 版本中,很明確定義對於 OpenAI 與 Telegram 的 usecase chatgpt_usecase.go // ChatGPTUseCase defines ChatGPT send question use case. type ChatGPTUseCase interface { Stream(ctx context.Context, question string) (<-chan string, <-chan error) } telegram_usecase.go // TelegramUseCase defines telegram send message use case. type TelegramUseCase interface { SendAsLiveOutput(chatID int64, feed <-chan string) error } 在 *_repository....

2023-03-17 · 2 min · 242 words