打造 ChatGPT 對話自動整理與技術筆記發布流程

將 ChatGPT troubleshooting 對話自動整理成技術文章,並在遮罩機敏資料後自動提交到 GitHub Pages repo。

背景 原始內容描述了一套適合技術筆記型 blog 的自動化流程,目標是把 ChatGPT 上的問題處理過程,在解決後整理成可發布的文章,並自動送進 GitHub repo,形成長期可累積的 troubleshooting archive 或 DevOps knowledge base。文件中以 GitHub Pages repo、n8n、GitHub Actions、OpenAI、Markdown 與 PDF 匯出等方式,逐步構成完整方案。 問題 手動整理 ChatGPT 對話、移除雜訊、遮罩 token/password/IP/email/domain 等敏感資訊,再轉成可發佈的 Markdown 或 blog 文章,流程繁瑣且不易長期維護;若想穩定累積技術知識庫,需要一套可自動化、可重複執行、可直接整合到 repo 的處理流程。 調查過程 先定義整體流程:ChatGPT conversation 匯出後,進入自動化管線,依序進行內容整理、敏感資料遮罩、文章生成、Markdown 輸出與 GitHub commit。 比較兩種實作方向:一種是 n8n workflow,透過 Webhook、遮罩節點、OpenAI 節點與 GitHub API 完成;另一種是 repo 內建 scripts 搭配 GitHub Actions,自動監聽 conversations 目錄中的檔案變化。 整理文章結構需求,固定輸出 title、background、problem、investigation、solution、lessons learned,並要求移除無關對話噪音、保留技術細節與必要 code block。 設計敏感資料遮罩規則,使用 regex 處理 Bearer ********、GitHub token、password、私有 IP、AWS key、email 與私有網域,避免機敏資訊進入文章或 commit 歷史。 規劃 repo 結構,例如 conversations、posts、scripts、prompt、. [閱讀全文]

修正 GHCR manifest unknown 拉取失敗

記錄部署容器時遇到 ghcr.io 映像拉取失敗,最後確認是映像名稱大小寫與 tag 不一致造成的錯誤。

背景

在伺服器上使用 docker compose 部署來自 GitHub Container Registry 的映像時,服務無法正常拉起,需要快速確認是權限、tag,還是 registry 名稱造成的問題。

問題

執行 docker compose up -d 後出現 manifest unknown,代表 registry 找不到指定的映像或 tag。

調查過程

  1. 先確認 ghcr.io 的 repository 名稱與 owner 大小寫是否一致。
  2. 檢查 GitHub Personal Access Token 是否具備 read:packages 權限。
  3. 使用 docker pull 手動驗證映像完整路徑與 tag 是否存在。
  4. 重新比對 CI 發布出的 tag 與部署檔案中的 tag 是否相同。

解決方案

確認映像名稱需與 GHCR 實際發布名稱一致,並改用存在的 tag 重新拉取後即可正常部署。

docker pull ghcr.io/konohaderek/bitfinex-strategy-bot:426aa46
docker compose up -d

經驗總結

  • GHCR 的映像名稱與 owner 命名需要精準一致。
  • 部署前可以先用 docker pull 驗證映像是否存在。
  • 把部署用 tag 與 CI 輸出綁在一起,可以降低人工填錯機率。

參考資料

20210822

又過了10天沒更新了WWWWWW 真的很容易就忘記要更新日誌這件事情

不過還是來記錄一下近況吧!

最近換到了新公司,比之前公司更遠了,遠到的有點不太習慣,大概是因為上一份工作離家真的很近,走路只要30分鐘就可以到,騎車不到10分鐘 現在去公司騎車都要30分鐘了 不過因為是疫情期間,只好忍耐了。

這次的公司主要是用 golang 開發的,所以我也必須要學會golang,好在之前有稍微寫過,不算難上手 但是還是很不習慣有一堆東西還要另外安裝,基本上就是被 visual studio 養壞了 像是使用 grpc & graphql 各種的 command not found 然後就必須自己手動 go get

現在開始有點擔心自己的 C# 會不會因此被遺忘掉了,所以決定來寫幾個常用的 C# SDK 吧! 目前規劃的有 LineTelegramSlackTeamsDiscore 還在考慮中 也想把之前寫的 Excel 工具 再用 .net6 重新改寫一遍,但是我也還沒想好要用哪一套 Excel library處理,希望有人可以給我意見吧

目前就這樣繼續加油吧!

20210812

這幾日試著用 golang 建立一個 CleanArchitecture 的實作。 希望能用短短的時間來複習前幾日學習 DDD 的成果 也因為後面工作會稍微的用到 golang 所以就來重拾很久沒寫的 golang 希望不要跟以前差太多 也為了這個目標新開了一個專案 GolangCleanArchitecture
希望這個小專案能夠有完成的一天(笑)

這邊來說說目前遇到的小困擾吧

  1. package name 的引用,在過去都是在同一個 package name 下進行開發 , 這次特別拆分了 package name 導致在引用的過程出現了很醜的程式碼,這部分要再來找找解決方案了

  2. interface 的使用,在 Repository 的部份想用介面做隔離,降低相依性,但是沒辦法把 struct 拆出去,只能跟 interface 在同一層裡面,這樣就沒辦法把實作的地方轉到 Infrastructure 去,畢竟存取資料庫算是外部引用的層級,能夠搬出去使用 DI 的方式我覺得才是最好的,這個也是要在想辦法處理的!

以上就是目前覺得比較麻煩的困擾,而且目前也還沒做到 DomainEvent 的觸發,這部分也是要來好好思考怎麼處理跟同步狀態。 明天再繼續努力吧!加油

  • 目前寫下來還是覺得 C# 輕鬆許多,大概也是因為寫得久跟有完整的CQRSDI 處理 ,不像 golang 這邊有想法卻不知道怎麼實作

20210809

這幾天去參加了 Teddy 的 領域驅動設計與簡潔架構入門實作班 雖然只有 8/5~8/8 短短的三天,但我覺得真的是收穫滿滿 一開始 Teddy 會由 Event Storming 慢慢帶入 DDD,之後才會提到 CQRS & Clean Architecture Teddy 上課方式真的很生動又有趣,Teddy 會不斷地舉生活中的案例讓學員們更好地瞭解 後面讓大家在做 Event Storming 時也是慢慢地給大家觀念之後才讓大家一步一步的實作 進入 DDD 後也是用實例+ EzKanban 讓大家了解各種戰術設計及拆分理由 後面也就自然地帶入了 CQRS + Clean Architecture 原本之前在實作的時候都會先用 Clean Architecture 拆分再去歸類 CQRS 項目,但其實應該是反過來 由 Event Storming 得知有哪些 Command 跟 Domain Event 再去套用 CQRS 整個就明確了許多 後面再把 Clean Architecture 分層加入,就整個串連了起來。 以前在看 jasontaylordev/CleanArchitecture 這個專案,總是用 API 去套用,現在終於了解以前不明白的地方了 上完 Teddy 的課後再重新看這專案,很簡單就明白了為何是這樣分層,也更清楚了 DomainEventHandler 處理的理由和 MediatR IPipelineBehavior 作用 真的很慶幸自己決定花這個錢去上課,雖然不知道未來的團隊夥伴是否有用 DDD , 但我相信我自己的專案可以用這個方式來重新處理過。 [閱讀全文]

VSCode Dev Container 測試

今天在測試 .net core 使用 vscode debug 的時候 發現了在遠端部分多出了 DevVolumes ! 但是我一開始也不知道這是什麼,就點了 Clone Repostry in Container Volume 後面就挑出 Clone a repository from GitHub in a Container Volume ! 沒想到這個可以直接把在 GitHub 上的專案直接用 Docker 執行起來!!! 這也太方便了吧! 如果已經有 Dockerfiledocker-compose 還可以直接使用,就把環境用 Docker 執行! 這個真的是福音啊! 終於可以不用再自己本機裝一堆東西,只要設定好 devcontainer.json 專案就帶著走啦! 只要有 vscode 哪裡都是相同的開發環境! 還有測試開啟 golang.net core 專案,也直接有 go-clidotnet-cli 方便阿! 預設還有 git-cli 可以用!! 不過好像用 vscode 內建的就夠用了! 再來研究研究如何將 Volume 輸出到外部,或許這樣可以用 fork 來控制 git 項目!

Docker dotnet-symbol 安裝方式

緣由 今日前同事在line上面問我說要如何安裝 dotnet-symbol ? 因為他在安裝上出現下面錯誤 Could not execute because the application was not found or a compatible .NET SDK is not installed. Possible reasons for this include: * You intended to execute a .NET program: The application 'tool' does not exist. * You intended to execute a .NET SDK command: It was not possible to find any installed .NET SDKs. Install a .NET SDK from: https://aka.ms/dotnet-download 看了一下,他的環境是我之前用的 Docker ,裡面用的 base image 是 mcr. [閱讀全文]

20210728

本日的 LeetCode 計畫中止 為什麼呢? 因為我的電腦忽然掛掉拉!! 因為我的IPhone忘記備份就直接用itunes更新 結果居然給我更新失敗! 然後想用電腦本身的還原檔還原,又因為先備份導致我的備份檔案被覆蓋掉!(無言) 想說,算了,我直接找我模擬器裡面的遊戲記錄好了,結果切個系統 MBR 就給我死去! 結果搞了兩天,連還原 USB 都用上了,最後卻是使用指令方式把系統救回來了! 所以來說一下步驟吧 此次的問題為 : Windows Boot Manager 的 device 出現 unknow 處理過程: 修復 mbr (失敗) 修復 BootLoader (失敗) 使用 USB 修復系統 (失敗) 思考項目: 只留主硬碟,其他硬碟先移除,一樣無法啟動 發現 Windows Boot Manager 的 device 出現 unknow 使用 diskpart 查看硬碟資料,發現有兩個隱藏磁區,一個應該是紀錄 MBR 的 解決方式: 先使用 diskpart 將隱藏磁區掛載起來 使用 dir 查看隱藏磁區內資料,果然發現了檔案 使用 bcdedit /set 設定 device 為有檔案的隱藏磁區 重新啟動,進入了 Windows ,果然成功了!!!! 經過這次的事件,我覺得我應該要固定每個月或每半年來備份一次手機檔案好了,但是備份的檔案要丟哪好了? 不管了~修好電腦就是要先來看奧運拉!!! 小戴加油! 小天加油! 子維加油! [閱讀全文]

php - Add Two Numbers

php - Add Two Numbers

今天用php來改寫吧! Let’s Go!!! 題目為 You are given two non-empty linked lists representing two non-negative integers. The digits are stored in reverse order, and each of their nodes contains a single digit. Add the two numbers and return the sum as a linked list. You may assume the two numbers do not contain any leading zero, except the number 0 itself. Example 1 : Input: l1 = [2,4,3], l2 = [5,6,4] Output: [7,0,8] Explanation: 342 + 465 = 807. [閱讀全文]

golang - Add Two Numbers

golang - Add Two Numbers

今天寫的題目跟昨天一樣 不過我們來改為用Golang 寫吧! 題目為 You are given two non-empty linked lists representing two non-negative integers. The digits are stored in reverse order, and each of their nodes contains a single digit. Add the two numbers and return the sum as a linked list. You may assume the two numbers do not contain any leading zero, except the number 0 itself. Example 1 : Input: l1 = [2,4,3], l2 = [5,6,4] Output: [7,0,8] Explanation: 342 + 465 = 807. [閱讀全文]