2025年10月28日 星期二

Windows Server RDP 解除單一連接線制 (同時間可多人用同一個帳號)

Windows Server RDP 解除單一連接線制 (同時間可多人用同一個帳號)

這功能是要付錢的,免費板最大上限是同時2個連入,大多數場合2個也很足夠用了


懶人包登錄檔設置指令是

REG ADD "HKLM\SYSTEM\CurrentControlSet\Control\Terminal Server" /v fSingleSessionPerUser /t REG_DWORD /d 0 /f


從群組原則的話設定在這個路徑:
電腦設定 → 系統管理範本 → Windows 元件 → 遠端桌面服務 → 遠端桌面工作階段主機 → 連線





2025年10月17日 星期五

Ubuntu 安裝 Node.js 的兩種最佳實踐方式

Ubuntu 安裝 Node.js 的兩種最佳實踐方式

在 Ubuntu 系統中,Node.js 其實已經存在於官方套件庫中,可以直接透過 apt 安裝。但這個版本通常落後於官方最新版本

若希望取得最新版或方便切換多版本,建議使用以下兩種方式之一




方法一:使用 NodeSource(官方建議的 APT 外部庫)

這是最常見的「系統層級」安裝方式,由 NodeSource 提供編譯好的二進制檔。
它能讓你直接透過 apt 安裝最新的穩定版 Node.js。


官方來源參考: distributions/DEV_README.md

步驟:

# 加入 NodeSource 官方提供的最新 Node.js 安裝腳本(以 24.x 為例)
curl -fsSL https://deb.nodesource.com/setup_24.x | sudo -E bash -

# 安裝 Node.js 與 npm
sudo apt install -y nodejs

# 驗證版本
node -v
npm -v

優點:

  • 系統層級安裝,所有使用者可共用。
  • 可與 Ubuntu 的自動更新整合。
  • 適合伺服器、CI/CD 環境。

缺點:

  • 安裝或升級需使用 sudo
  • 若需多版本切換(例如 Node 16 與 22 共存)不方便。




方法二:使用 NVM(Node Version Manager)

這是由社群維護的 Node.js 版本管理器,能讓你以使用者身份安裝 Node.js(非系統層級)。
適合開發者或有多專案需求的環境。

官方來源參考: nvm-sh/nvm GitHub Repository

步驟:

# 下載並安裝 nvm:
curl -o- https://raw.githubusercontent.com/nvm-sh/nvm/v0.40.3/install.sh | bash

# 不想重新啟動 shell 時,執行:
\. "$HOME/.nvm/nvm.sh"

# 下載並安裝 Node.js:
nvm install 24

# 核對板本:
node -v # Should print "v24.10.0".
npm -v # 應會印出 "11.6.1"。

優點:

  • 不需 sudo 權限即可安裝。
  • 可快速切換 Node.js 版本。
  • npm 安裝時自動位於使用者目錄(例如 ~/.npm),更安全。

缺點:

  • 只對目前使用者有效。
  • 系統服務(如 systemd)不會直接使用 NVM 環境。



2025年10月1日 星期三

npm 反向代理 http 服務 cockpit (自動更新SSL)

使用 Nginx Proxy Manager(NPM)做反向代理並自動更新 SSL 憑證

這是連續的關於架設網站的系列

  1. 在 ubuntu 使用 docker 架設 nginx 靜態網站伺服器
  2. 使用 duckdns 轉發自建的靜態網頁伺服器
  3. npm 反向代理 nginx 靜態網站 (自動更新SSL)
  4. npm 反向代理 http 服務 portainer (私簽SSL)
  5. npm 反向代理 http 服務 cockpit (自動更新SSL)



這是接續 npm 反向代理 nginx 靜態網站 (自動更新SSL) 的進階篇,前面的東西不再重複,記得先回到這篇做完才接著繼續看這裡

在上一篇已經完成網站的建制,現在要把改成一個實際的別人做的專案做練習
這裡使用 cockpit 當範例,創建一個 duck.dns 對外網域的網站

這篇跟直接反向代理 nginx 的那篇差異在於,範例用的靜態網站完全沒有安全限制所以不需要特別處理,這裡抓一個正常有安全限制的服務 cockpit 來當範例



安裝 cockpit

這個有被內建在 ubuntu 中直接用 apt 就可以安裝了

sudo apt install cockpit
sudo systemctl enable --now cockpit.socket

安裝好之後就可以用 http:\localhost:9090 直接打開了



反向代理設定注意事項

在使用 Nginx Proxy Manager 等反向代理時,需要在 cockpit.conf 中進行以下設定:

  1. AllowUnencrypted = true - 允許後端 HTTP 通訊
    由於反向代理與 Cockpit 之間通常使用未加密的 HTTP 連接,此設定讓 Cockpit 接受來自代理服務器的 HTTP 請求,而 SSL/TLS 加密則由前端代理統一處理。
  2. ProtocolHeader = X-Forwarded-Proto - 識別真實協議類型
    反向代理會通過 X-Forwarded-Proto header 告知 Cockpit 用戶端實際使用的協議(HTTPS),確保 Cockpit 生成正確的重定向 URL 並避免瀏覽器混合內容警告。
  3. Origins = https://your-domain.com - 限制跨域請求來源
    明確指定允許的域名以防止 CSRF 攻擊,切勿使用 Origins = https: 或 Origins = *,否則任何第三方網站都能向您的 Cockpit 發送請求,造成安全風險。


編輯 cockpit.conf

sudo nano /etc/cockpit/cockpit.conf

輸入以下 (第三行記得改成自己的網域)

[WebService]
AllowUnencrypted = true
ProtocolHeader = X-Forwarded-Proto
Origins = https://cockpit.yourdomain.com

然後存檔即可



npm 反向代理

這裡用上一篇已經生成的網域就好,回到 npm 的 proxy 頁面把 Forward Port 從 8081 改成 9090 即可續用。

然後再瀏覽你自己的網域 https://chgsite.duckdns.org 應該就能看見你的網站了







2025年9月28日 星期日

npm 反向代理 http 服務 portainer (私簽SSL)

npm 反向代理 http 服務 portainer (私簽SSL)

這是連續的關於架設網站的系列

  1. 在 ubuntu 使用 docker 架設 nginx 靜態網站伺服器
  2. 使用 duckdns 轉發自建的靜態網頁伺服器
  3. npm 反向代理 nginx 靜態網站 (自動更新SSL)
  4. npm 反向代理 http 服務 portainer (私簽SSL)
  5. npm 反向代理 http 服務 cockpit (自動更新SSL)


繼上一篇 CHG: 使用 duckdns 轉發自建的靜態網頁伺服器

已經介紹了如何使用 duckdns + npm 架設靜態網站,這次實際來跑一個服務測試
這篇跑的是自簽SSL來做,由於是自簽無法公開出去需要自行加入到信任區



安裝 portainer

安裝請參考這篇文章
CHG: 在 docker 中安裝 Portainer 管理介面

非企業環境本地間的通訊就不多架一層 https 直接用 http 當作範例

只需要做到可以使用 http://localhost:9000 能看到管理介面即可


自簽SSL

建立專屬的 CA(Certificate Authority)
CHG: 利用同一個CA自簽SSL憑證

在這一步你必須產出屬於你自己的域名的簽證

例如 portainer.chg


這個只是要在內網跑的私有域名沒有要公開出去,可以完全自定義的


npm載入自簽證書

參考自上一篇
CHG: 使用 npm 反向代理內部 nginx 的靜態網站為 https


架設好 npm 之後,再來進入它的SSL管理介面


載入剛剛創建的金鑰後存檔



再來新增一個反向代理


填上剛剛創建的域名與 portainer 的連接埠 9000


在SSL分頁頁選擇剛剛建造的憑證


然後存檔就設定完畢了


瀏覽自簽網址的 portainer

再來還需要搞定兩件事情就是 dns 與 信任自簽憑證

使用管理員打開 powershell 輸入以下命令編輯 host 檔案

notepad C:\Windows\System32\drivers\etc\hosts

在最底下新增一行

127.0.0.1   portainer.chg

這裡網址改成你自己的區網IP,如果是同一臺基器用 127.0.0.1 即可

存檔之後再來找到你的憑證,對他按右鍵安裝憑證


然後選擇本機


然後選擇 “授信任的憑證授權單位”


下一步即可安裝好了

然後需要你重啟一下瀏覽器,這樣才能重新載入剛剛安裝好的憑證

再來使用 https://portainer.chg 就可以打開 portainer 管理介面了



打不開的話檢查清單看一下

  • npm 是否設置正確
    • proxy設置
    • ssl設置
  • SSL憑證是否安裝到指定位置
  • 安裝後是否重啟瀏覽器
  • 系統 Host 網域是否設置正確



在 docker 中安裝 Portainer 管理介面

在 docker 中安裝 Portainer 管理介面



要安裝有幾種方式,其中直接啟動是最快的一個指令即可啟動,缺點就是自己得筆記這個啟動命令,否則到時候忘記了更新版本時要重新部署會很麻煩。

容器要是多了每個都必須筆記每次的啟動命令就會相對的有點麻煩,這個解法有兩個

  • docker compose
  • portainer stack

兩者其實是同一種方式,都是通過 yml 來管理容器的起動。區別在於前者要自己管理 yml 位置,後者可以直接在網頁介面輸入,由 portainer 幫你管理。

由於我們安裝的是 portainer 這個變成雞生蛋的問題了,只能用 docker compose 或是直接啟動的方式部署服務。



方式1 直接啟動

第二種方式,是最簡單的直接啟動只需要貼上這一個指令集即可

docker run -d \
  -p 8000:8000 \
  -p 9000:9000 \
  --name portainer \
  --restart=always \
  -v /var/run/docker.sock:/var/run/docker.sock \
  -v portainer_data:/data \
  portainer/portainer-ce:lts

啟動之後使用 http://localhost:9000 即可瀏覽管理介面

之後如果更新版本需要重新啟動容器的話,執行底下的命令更新映像檔

docker stop portainer
docker rm portainer
docker pull portainer/portainer-ce:lts

然後再次執行相同的啟動的命令即可




方式2 使用 docker compose

這個方式可以通過 yml 文件創建,就不用筆記啟動令命了,只需要好好管理 yml 即可。

這裡提供的管理結構如下,結構自己依照自己的需求調整即可。

# 系統級目錄結構
/srv/docker/
└── portainer/
       ├── docker-compose.yml
       ├── .env
       └── data/

用這樣方式來儲存,然後創建目錄並指定給 docker 群組

# 將使用者加入 docker 群組
sudo usermod -aG docker $USER

# 創建主目錄
sudo mkdir -p /srv/docker

# 設定目錄權限
sudo chown -R root:docker /srv/docker
sudo chmod -R 775 /srv/docker

# 設定 SGID(重要:確保新文件繼承群組權限)
sudo find /srv/docker -type d -exec chmod g+s {} \;

#  重新登入以套用群組變更
newgrp docker

再來啟動該 docker 容器

cd /srv/docker/portainer
docker compose pull
docker compose up -d

啟動之後使用 http://localhost:9000 即可瀏覽管理介面

如果需要更新版本只需要一樣的三行重新執行一次即可,用 compose 會比較簡單一些




2025年9月14日 星期日

利用 python 獲取 edge 瀏覽器的 cookies

利用 python 獲取 edge 瀏覽器的 cookies

要抓取網站資料的時候如果驗證太麻煩最簡單的做法就是登入之後直接拿瀏覽器的 cookies 來認證最快的

這邊提供一個用 python 抓 cookies 的範例代碼
hunandy14/get_edge_cookies


如果有安裝 git 可以直接同步下來

git clone https://github.com/hunandy14/get_edge_cookies.git
cd get_edge_cookies


第一次的時候先安裝一 下依賴

pip install -r requirements.txt


使用方法

python edge_cookies.py google.com


然後就可以取得該網域的 cookies 了,返回會是一個 json 的文本形式






利用同一個CA自簽SSL憑證

利用同一個CA自簽SSL憑證

為什麼要用同一個CA簽發是因為,這樣你可以在電腦裝只裝該CA的憑證即可使用該憑證簽出的任意SSL了,簡單說就是不用每個子網站都要重新裝憑證,就一個憑證可以適用全部。


創建 CA 憑證

這是我自己寫的函式庫,要看內容自行點網址連結過去

載入函式

iex "function New-RootCA {$(irm 'https://raw.githubusercontent.com/hunandy14/New-SSLCertificate/refs/heads/master/New-RootCA.ps1')}"

創建CA憑證

New-RootCA -CNName "MyCA"

執行後會在工作目錄底下產出 crt 與 key 檔案,crt 就是憑證用於安裝到電腦中



利用該憑證簽發域名

再來是簽發網站

載入函式

iex "function New-SSLCertificate {$(irm 'https://raw.githubusercontent.com/hunandy14/New-SSLCertificate/refs/heads/master/New-SSLCertificate.ps1')}"

簽發網站

New-SSLCertificate "MyCA" -CN "*.mysite.com"

執行完畢憑證就出來了,把他丟到服務中就能使用了