安裝 Guacamole 1.6.0 使用ubuntu+docker+postgresql

使用 Docker 安裝酪梨醬 Guacamole

安裝環境:

  • Ubuntu 24.04
  • Docker 28.1.1
  • Guacamole 1.6.0-RC1
  • 日期:2025/05/18

參考官方文件:Guacamole Docker

本文件安裝三個容器

  1. PostgreSQL 資料庫
  2. guacamole/guacd
  3. guacamole/guacamole

⚠️ 注意事項:以下步驟請務必注意 IP、Port、以及容器名稱,請記得調整。


步驟說明

1. 安裝並啟用 guacd

docker run --restart always --name guacd -d -p 4822:4822 guacamole/guacd:1.6.0-RC1

2. 安裝 PostgreSQL 資料庫伺服器,並建立 Guacamole 資料庫

docker run -d --restart=always --name postgres-17 -p 5432:5432 \
  -e POSTGRES_USER=root \
  -e POSTGRES_PASSWORD=密碼 \
  -v postgres-17-data:/var/lib/postgresql/data postgres:17.4-bookworm

進入容器:

docker exec -it postgres-17 bash  

進入 PostgreSQL 服務器:

psql -U root -p 5432 -h localhost -W

建立資料庫:

create database guacamole;

3. 產生資料庫 schema 並匯入 PostgreSQL

docker run --rm guacamole/guacamole:1.6.0-RC1 /opt/guacamole/bin/initdb.sh --postgresql > initdb.sql
apt-get install -y postgresql-client
psql -U root -p 5432 -h <容器IP> -W -d guacamole < initdb.sql

4. 安裝 guacamole 主應用

docker run --restart always --name guacamole \
  -e GUACD_HOSTNAME=<guacd ip> \
  -e GUACD_PORT=4822 \
  -e POSTGRESQL_HOSTNAME=<postgres ip> \
  -e POSTGRESQL_PORT=5432 \
  -e POSTGRESQL_DATABASE=guacamole \
  -e POSTGRESQL_USERNAME=root \
  -e POSTGRESQL_PASSWORD=密碼 \
  -d -p 8080:8080 guacamole/guacamole:1.6.0-RC1

5. nginx 反向代理設定

location /guacamole/ {
    proxy_pass http://ip:8081;
    proxy_buffering off;
    proxy_http_version 1.1;
    proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
    proxy_set_header Upgrade $http_upgrade;
    proxy_set_header Connection $http_connection;
    client_max_body_size 1g;
    #proxy_cookie_path /guacamole/ /new-path/;  若位置不一樣
    access_log off;
}

nginx proxy manager 忘了密碼

才剛安裝nginx 反向代理程式容器,沒多久就忘了密碼 XD,我安裝時不綁定外部資料庫,內建的是sqlite。

要救回來原理:先進容器將所有使用者設定刪除,重開容器後,系統會以為初始化,此時就可以用預設帳密登入,然後再進容器把刪除的狀態回原,這樣就可以重設原使用者的密碼囉。

步驟如下:

docker exec -it 容器名稱 bash
apt update && apt install sqlite3 -y
sqlite3 /data/database.sqlite
UPDATE user SET is_deleted=1;

然後重開容器,接下來就可以用預設的帳號登入

帳號:admin@example.com
密碼:changeme

接下來再進一次容器,將剛剛設定刪除的管理者還原

這樣用預設帳號登入重新查看,原本管理者的帳號就出現了,改掉其密碼,這樣就救回來了

出處

CentOS6 NAT

公司大陸廠縮編但還剩20多人,原本的fortinet防火牆突然壞了,現主時那裏也沒寬頻上網分享器來替換防火牆;不過內部mail server因不透過防火牆,所以運行正常,server有兩片網卡,一個對外、一個對內,作業系統CentOS 6,算是老伺服器。

我必須在短時間內讓大家上網,也必須讓vpn server透過mail server,重新搞定site to site vpn,才能讓同事從大陸使用台北ERP等伺服器

講這麼多,就是把NAT搞定,CentOS 6還在用老式的iptables,好險我有印象,google爬一爬,趕緊從台北遠端連到大陸任一台主機再,連到mail server進行設定並且測試。

# eth1網卡對外
# eth0網卡對內
iptables -F
iptables -t nat -F
iptables -t mangle -F
iptables -X
iptables -t nat -X
iptables -t mangle -X
iptables -P OUTPUT ACCEPT
iptables -P INPUT ACCEPT
iptables -P FORWARD DROP
iptables -t nat -A POSTROUTING -o eth1 -j MASQUERADE
iptables -A INPUT -i eth0 -j ACCEPT
iptables -A INPUT -j DROP
iptables -A FORWARD -i eth0 -j ACCEPT
iptables -A FORWARD -i eth1 -o eth0 -m state --state RELATED,ESTABLISHED -j ACCEPT
# 把原本的路由加回去
route add -net 192.168.0.0 netmask 255.255.255.0 gw 192.168.1.1

為了n8n能用mcp,我得改用 Nginx Proxy Manager (docker)

我這種老派工程師,一直以來都用apache httpd 做反向代理,也沒用docker安裝,直到為了n8n能用mcp,果斷改用docker 安裝 nginx proxy manager。

nginx proxy manager 安裝方式請參考官方文件,安裝完畢反向對應到本地端的n8n(docker),此時需要額外設定,避開gzip壓縮問題,才能順利搭上n8n上的mcp server。

# disable gzip and proxy buffering for both /mcp/ and /mcp-test/
location ~* ^/(?:mcp|mcp-test)/ {
    gzip                       off;
    proxy_buffering            off;
    chunked_transfer_encoding  off;

    # prevent upstream compression
    proxy_set_header           Connection "";
    proxy_set_header           Accept-Encoding "";

    # re‑declare NPM’s proxy headers using built‑in variables
    proxy_http_version         1.1;
    proxy_set_header           Host                 $host;
    proxy_set_header           X-Real-IP            $remote_addr;
    proxy_set_header           X-Forwarded-For      $proxy_add_x_forwarded_for;
    proxy_set_header           X-Forwarded-Proto    $scheme;

    # send to your upstream based on NPM’s variables
    proxy_pass                 $forward_scheme://$server:$port;
}

解法出處

PVE 8.2 RTX 5090 GPU Passthrough (顯卡通透)

PVE 8 加上GPU Passthrough(顯卡通透),可能是PVE、5090、或主機板太新,一直卡關,因此我有必要紀錄一下如何攻克。

話說我前幾天終於說服公司購買好一點的顯示卡,因為先前提早研究,知道顯卡很吃PCI-E 16x,但那是什麼鬼我都不懂,於是快馬加鞭衝去原價屋,找專業店家買主機,服務人員聽說要買頂規的5090,很熱情地自動展開相關配置,這些專業建議不額外收費。

主機板:Z890 Aorus master 
CPU:Intel Core ultra 9 285K
記憶體:256GB
M.2.: 1T
顯卡:ASUS ROG ASTRAL RTX 5090 32G 水冷
power:1300 瓦

原價屋組裝好,我收到貨之後,想說主機這麼好,應該要安裝pve多工使用。

爬文得知兩個重點:

  1. 主機板要打開vt-d (iommu)、sr-iov 之類的功能
    主機板建議安裝一個hdmi欺騙器,並且在bios設定開機顯示介面優先使用內建顯示,讓獨立顯卡完全用於VM
  2. pve 要修改能支援PCI passthrough,開通vfio-pci功能
    請參考官網作法

首先我安裝pve 8.4.1,且照著官網建議的設定,但一直不成功,VM開不起來;後來想說是不是pve版本太新,因此改用8.3.1也不行,再改成8.2.2也不行。我總共參考以下文章,也測試了N輪,都快放棄了 XD

  1. Avic.blog
  2. Zen’s blog
  3. ithome的william mou

文章都說只要開通vfio-pci以及iommu就可以了,我照做也很順利

執行 lspci -nnk,可以看出顯卡已開通 vfio-pci

執行 dmesg | grep -e DMAR -e IOMMU ,可看到IOMMU enabled

可惜無論如何努力,vm一直無法出現開機畫面,一看就知道通透失敗。

甚至我都扒出有些設定新版pve 8已棄用,也改用新的設定 initcall_blacklist=sysfb_init,但一樣GG。

不死心,失敗了N次,我無意間在這裡發現新大陸,裡面提到一個設定disable_denylist=1要加到vfio.conf,雖然最後還是失敗XD


很神奇,當時突然如到電影盜夢空間(全面啟動)情節,彷彿有人偷偷修改我的記憶,不自覺自己無意識下了一個指令 modinfo -p vfio-pci,系統居然多嘴跟我說還有其他設定要加上企

最後,我把系統建議的這些設定都加到 /etc/modprobe.d/vfio.conf 裡面( 加完記得要 update-initramfs -u -k all )。

disable_vga=1 disable_denylist=1 disable_idle_d3=1 enable_sriov=1

再重開vm就成功進入開機畫面了,太棒了!


vm 安裝ubuntu 24.04,還要加裝 nvidia 驅動。

vm如何安裝nvidia驅動,我參考了以下這兩篇

https://docs.nvidia.com/datacenter/tesla/driver-installation-guide/index.html#ubuntu-installation

https://docs.nvidia.com/cuda/cuda-installation-guide-linux/index.html#common-installation-instructions-for-ubuntu

安裝完畢,執行 nvidia-smi,看到心愛的 5090 就安心了。


接下來安裝docker,我參考張騰元文章

docker安裝完畢,咱門還需要讓docker也能使用 nvidia ,請參考 https://docs.nvidia.com/datacenter/cloud-native/container-toolkit/latest/install-guide.html

最後啟動ollama docker

docker run -d –gpus=all -v ollama:/root/.ollama -p 11434:11434 –name ollama ollama/ollama

至此大功告成。


這是我pve的相關設定

/etc/default/grub

GRUB_CMDLINE_LINUX_DEFAULT="quiet intel_iommu=on iommu=pt initcall_blacklist=sysfb_init"

修改完畢,記得套用 update-grub 生效。

/etc/modules

vfio
vfio_iommu_type1
vfio_pci
vfio_virqfd
kvm
kvm_intel
kvmgt
xengt
vfio-mdev
i915.enable_gvt=1

/etc/modprobe.d/pve-blacklist.conf


blacklist nouveau
blacklist i2c_nvidia_gpu
blacklist snd_hda_intel
blacklist snd_hda_codec_hdmi
blacklist nvidia*

/etc/modprobe.d/vfio.conf

以下紅色部分,是顯卡的代號,請自己修改
nvidia有兩個video與audio硬體代號,可執行 lspci -nnk | grep -i nvidia 取得

softdep nouveau pre: vfio-pci
softdep nvidia pre: vfio-pci
softdep nvidiafb pre: vfio-pci
softdep nvidia_drm pre: vfio-pci
softdep drm pre: vfio-pci
options vfio-pci ids=10de:2b85,10de:22e8 disable_vga=1 disable_denylist=1 disable_idle_d3=1 enable_sriov=1

修改modprobe相關檔案,記得要執行 update-initramfs -u 套用更新。

VM的設定
重點在紅框的 host、PCI Device(hostpci0)、 與 q35

使用容器(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,左邊變數名稱可以用拖拉的,把第一關卡日期拉進去,再調整日期格式。
右邊則為目前系統日期。
左右相同才會觸發右邊發郵件通知
左邊抓取RSS Feed Trigger從kafeiou獲得地的日期,右邊是當天

測試一下,大功告成。


另外在步驟一有提到使用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自行架設」

  1. 前置作業要把docker或podman,可以看這篇RockyLinux 安裝 docker準備好。
  2. 準備好外部的資料庫容器(postgres、mariadb),postgress可參考這篇postgres 指令(連線、安裝)
  3. 安裝容器
    這裡我採用連結外部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),可以參考weblatetolgee,這兩樣都是較有名的免費開源翻譯系統。

以下是 WeblateTolgee 的比較表,以幫助你選擇適合的翻譯與本地化平台:

特性WeblateTolgee
類型自託管 + 雲端自託管 + 雲端
開源✅(完全開源)✅(開源,但部分功能需付費)
托管方式自託管 / 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 & SDKREST 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之後支援了。

1 2 3 ... 78