Proxmox VE中的vm新增硬碟檔qcow2, 卻因相同UUID無法掛載

出事了阿伯! pve 某linux vm系統裡面有重要檔案誤刪,於是我把NAS上的snapshot還原(qcow2), 想說掛載到原vm成為另一個硬碟,再提取裡面的檔案使用。 這種土炮做法, 我記錄一下:

  1. snapshot還原成另一個qcow2, 名稱先改成temp.qcow2,避免覆蓋或衝突。
  2. vm新增一顆hdd,想辦法讓這顆新硬碟與原硬碟一模一樣(含partition)。
  3. 關掉vm,刪除步驟2新增的hdd檔案;再將temp.qcow2改名取代刪掉的檔案名稱,然後重開vm。
  4. 如此一來,新檔案就有被誤刪的資料,此時可將誤刪檔案, 複製到原本的硬碟裡面,再關機,移除snapshots檔案即可。

步驟4掛載的同時,出現以下問題
該partition為xfs

wrong fs type, bad option, bad superblock on /dev/vdd1, missing codepage or helper program, or other error.

這問題應該是該還原的檔案, 與原本的檔案有相同UUID才導致無法掛載,

解法如下:

  1. 先確認UUID是否正常。
  2. 再用無UUID的方式掛載,確認是否正常
  3. 若正常,重新產生新UUID。
# xfs_db -c uuid /dev/vdc1
UUID = 56283b3b-c2f3-525e-90db-e9d26def629d

# 用無UUID方式掛載
# mount -t xfs -o nouuid /dev/vdc1 /mnt

# xfs_admin -U generate /dev/vdc1
Clearing log and setting UUID
writing all SBs
new UUID = 1eb81512-3f22-4b79-9a35-f22f29745c60

安裝derp(笨蛋伺服器),讓 tailscale 網路更安全順暢

前一篇文章 Tailscale+Headscale 自架VPN全紀錄 讓 tailscale node 能夠透過 headscale 管控, 互相連線, 但是有些 tailscale node 隱藏在區域網路中, 無法互相p2p(peer to peer)直接連線, 這時候就需要 derp 伺服器提供轉接, derp 伺服器預設有很多, 若需要效率更好的,更無資安疑慮的, 可以自架.

我想也因為 derp 只做資料轉接, 不會偷看內容, 因此才會叫這個名字 DERP(笨蛋) XD.
derp 伺服器有很多, 可以參考tailscale官網 .

此外若derp轉接延遲時間太長, 就需要自架 , 可參考 https://tailscale.com/kb/1118/custom-derp-servers/

本文提供CentOS 7 安裝derp過程

  1. 安裝go 1.20以上
  2. 安裝derper程式
  3. 執行指令
  4. 讓headscale納入derper伺服器
  • 安裝 go 1.20
wget https://golang.google.cn/dl/go1.20.linux-amd64.tar.gz
 
tar -C /usr/local -xzf go1.20.linux-amd64.tar.gz 
 
export GOROOT=/usr/local/go
export GOPATH=/usr/local/gopath
export GOBIN=$GOPATH/bin
export PATH=$PATH:$GOROOT/bin
export PATH=$PATH:$GOPATH/bin
 
source /etc/profile

#安裝完畢, 執行
 /usr/local/go/bin/go version
  • 安裝 derper
go install tailscale.com/cmd/derper@main
#安裝完畢, 應該會在
/usr/local/gopath/bin/derper
  • 啟動derp

先搞定letscrypt證書, 因為我選擇derp手動設定, 所以文件要對應好.

ln -s /etc/letsencrypt/live/derp.test.com/cert.pem /etc/letsencrypt/live/derp.test.com/derp.test.com.crt

ln -s /etc/letsencrypt/live/derp.test.com/privkey.pem /etc/letsencrypt/live/derp.test.com/derp.test.com.key

執行指令

#若要防止別人使用, 需先把derp server主機也加入tailscale 端點, 才可使用 --verify-clients 這個參數
/usr/local/gopath/bin/derper --hostname=derp.test.com --verify-clients -a=:8445 -http-port=-1 -certdir=/etc/letsencrypt/live/derp.test.com  -certmode=manual -stun 
#這樣就可以輸入 https://derp.test.com:8445 測試是否正常
  • 讓headscale納入derper伺服器
    修改headscale設定, 打開headscale yaml 設定檔案, 找到 derp , 將https:/derp.test.com:8445 加上去, 並且新增derp.yaml檔案, 重開headscale就可以了

新增 derp.yaml

重開 headscale 就可以,進行測試了

# 隨便找一個tailscale端點
tailscale netcheck
# 然後  tailscale ping <另一個端點的ip (100.64....)>
tailscale ping 100.64.0.2

在台灣, 我自己覺得架設derp除非有資安考量, 否則不見得需要.

Tailscale+Headscale 自架VPN全紀錄

Wireguard 與最近大熱門的ChatGPT一樣, 是邪惡的存在, 以往公司網管還能勉強管控員工自架VPN, P2P, 與遠端連線, 雖說辛苦,但員工相關網路行為終究掌握在手中.

現在不得了了, 使用wireguard技術的 Tailscale 已攔不住, 隨隨便便就能翻牆, 穿透內網. 我們網管就像是, 治水用阻擋的方式不再可行 , 該是要全面開放, 採用全面零信任的思維+員工契約進行資通安全的管控.

“新暗網時代” , 用wireguard, 能讓一個小群體, 自成一個暗網, 也可自行打造VPN暗黑王國, 市面上網紅推薦的乾爹乾爸VPN, 未來亦將勢微.

本文著重在翻牆, 與簽入公司內部網路, 若用來做site to site請參考以下 tailscale 建議, 直接用Wireguard 比較好.

Using WireGuard directly offers better performance than using Tailscale. Tailscale does more than WireGuard, so that will always be true. We aim to minimize that gap, and Tailscale generally offers good bandwidth and excellent latency, particularly compared to non-WireGuard VPNs.

環境

  1. Headscale
    headscale是開源軟體, 使用docker自行架設後, 可對安裝tailscale的端點進行權限控管, 也是整個VPN當中, 最主要的控制伺服器(control server).
  2. 公司內部架設 tailscale 端點
    Linux tailscale安裝了N次, 推薦安裝ubuntu.
    讓用戶端進行vpn連線, 可存取內網, 或是當作跳板,進行翻牆
  3. PC 用戶端
    windows 10/11 用戶端.
    安裝tailscale windows client , 透過headscale註冊, 即可串接到公司tailscale端點, 存取公司內網工作.
  4. Android
    搜尋tailscale並且安裝後, 修改server url , 導到自架的headscale server ,登入後, 透過公司架設之tailscale端點, 進行翻牆.
    **目前測試,使用台灣之星, 翻牆方面不是很穩定, 但是連到公司內網穩定**
  5. iphone
    安裝tailscale後, 不可修改server, 因此無法連接自架headscale server, 所以GG.

架設Headscale+UI

  • Headscale伺服器, 須提供http對外網址, 以便讓端點登入
    ex: http://headscale.test.com:8081 或是 https://headscale.test.com
    可用proxy reverse反向代理(但我失敗了, 很像是headscale的bug, 因此https我先pass, 改用 http )
    後來發現是apache httpd 版本太舊(2.4.6),不支援 upgrade=any 語法 , 只要讓proxy server 改成2.4.47以上就好了
  • 下載headscale yaml設定檔案
  • docker安裝(本範例vm為centos 7+docker)
    請務必用0.21版, 0.20有bug不能刪除路由表
    紅色請自行依照環境修改
# 存放headscale設定檔按
mkdir -p /root/headscale/config
mkdir -p /root/headscale/data

# 虛擬網路
docker network create reverseproxy-nw

vi /root/headscale/docker-compose.yml
###############################################################################
version: '3.5'
services:
  headscale:
    image: headscale/headscale:0.21
    container_name: headscale
    volumes:
      - '~/config:/etc/headscale'
      - '~/data:/var/lib/headscale'
    ports:
      - 8081:8080
      - 50443:50443
    command: headscale serve
    restart: unless-stopped
    networks:
      reverseproxy-nw:
  headscale-ui:
    image: ghcr.io/gurucomputing/headscale-ui:latest
    restart: unless-stopped
    container_name: headscale-ui
    ports:
      - 9443:443
    networks:
      reverseproxy-nw:
networks:
  reverseproxy-nw:
    external: true
volumes:
  data:
    driver: local
  config:
    driver: local
###############################################################################
  • 下載headscale設定檔
wget https://github.com/juanfont/headscale/raw/main/config-example.yaml -O /root/headscale/config/config.yaml
# 下載完畢, 修改yaml檔案中以下參數
server_url: https://headscale.test.com
listen_addr: 0.0.0.0:8080
base_domain: test.com

#是否改寫用戶端dns,請自行測試, 依照需求決定
override_local_dns: true

# 提供(expose)給用戶端dns
  nameservers:
    - 1.1.1.1
    - 8.8.4.4
# 公司內部專用網址,可分別參考不同dns
  restricted_nameservers:
     test.com:
       - 192.168.1.1
# 停用magic dns
magic_dns: false

#其他如derp, 有機會再另外寫文章
  • 啟用container
cd /root/headscale
docker-compose up -d
  • 設定apache httpd proxy server (版本務必2.4.47以上)
<VirtualHost *:443>
  ServerName headscale.test.com

  ErrorLog /var/log/httpd/ssl_error_log
  TransferLog /var/log/httpd/ssl_access_log

  SSLEngine On
  SSLCertificateFile /etc/letsencrypt/live/headscale.test.com/cert.pem
  SSLCertificateKeyFile /etc/letsencrypt/live/headscale.test.com/privkey.pem
  SSLCACertificateFile /etc/letsencrypt//live/headscale.test.com/fullchain.pem

  SSLProxyEngine On
  ProxyPreserveHost On
  Header add Access-Control-Allow-Origin "test.com";
  SSLProxyCheckPeerName  off
  ProxyPass /web https://localhost:9443/web
  ProxyPassReverse /web https://localhost:9443/web
  ProxyPass / http://localhost:8081/ upgrade=any
  ProxyPassReverse / http://localhost:8081/ upgrade=any
</VirtualHost>
  • 等個1分鐘, 測試
https://headscale.test.com/windows
  • 下指令產生apikey
 docker exec -it headscale headscale apikey  create
  • 將headscale 伺服器網址, 以及apiky , 輸入到 UI 介面
    https://headscale.test.com/web
    請注意,這網址沒有帳號驗證就能用, 要考慮加上帳號密碼認證, 或是限定ip連線
  • 可以開始到UI介面進行管理了
  • 建立使用者,並且提供authkey, 讓公司架設的tailscale 端點使用
# 建立使用者
# docker exec headscale headscale users create <使用者>
docker exec headscale headscale users create hlmtvpn
# 產生authkey, 讓tailscale端點使用
docker exec headscale  headscale --user hlmtvpn preauthkeys create --reusable --expiration 24h
  • 相關指令
1. 列出 tailscale 端點
docker exec headscale headscale node list

2. 刪除 tailscale 端點
docker exec headscale headscale node delete -i <ID>
docker exec headscale headscale node delete -i 1
3. 列出 tailsacle 路由
docker exec headscale headscale route list
4. 啟用路由功能
docker exec headscale headscale route enable -r <ID>
5. 刪除路由表
docker exec headscale headscale route delete -r <ID> --force

公司架設tailscale 端點

  • 建議安裝ubuntu
    之前一直習慣用CentOS, 或是RockyLinux , 但這次有點踢到鐵板, site to site vpn一直不成功, 改由ubuntu就成功了.
  • 請先決定此端點提供site to site 或是 nat
    1. 若是與外地子公司site to site連線, 參數就要加上–snat-subnet-routes=false , 但無法讓外面裝置當作跳板翻牆.
    2. 若是讓外面設備簽入使用, 不需要反向回連, 就使用 –snat-subnet-routes=true (這是預設值), 若外面裝置要用tiptop gp 5.x 連到公司, 則不能使用此設定.

    結論: 要翻牆, 就要設定成true, 要使用tiptop erp , 或是與子公司互相連線就要設定成 false
  • 決定端點當作翻牆或是site to site後, 複製好上一步驟 headscale 伺服器所產生出來的authkey
curl -fsSL https://pkgs.tailscale.com/stable/ubuntu/jammy.noarmor.gpg | sudo tee /usr/share/keyrings/tailscale-archive-keyring.gpg >/dev/null

curl -fsSL https://pkgs.tailscale.com/stable/ubuntu/jammy.tailscale-keyring.list | sudo tee /etc/apt/sources.list.d/tailscale.list

sudo apt-get update
sudo apt-get install tailscale
  • 啟用/設定tailscale端點
# http://headscale.test.com:8080是 headscale對外的URL
# d72e7351e24bbd21ecc99bbf5004c3e1f7cffa0631f8f5d5 是 authkey

# nat , 翻牆
tailscale up --reset --accept-routes --advertise-exit-node --snat-subnet-routes=true --accept-dns=false --advertise-routes=192.168.1.0/24 --login-server=https://headscale.test.com  --authkey=d72e7351e24bbd21ecc99bbf5004c3e1f7cffa0631f8f5d5 

# site to site , 不翻牆
tailscale up --reset --accept-routes --snat-subnet-routes=false --accept-dns=false --advertise-routes=192.168.1.0/24 --login-server=https://headscale.hlmt.com.tw  --authkey=d72e7351e24bbd21ecc99bbf5004c3e1f7cffa0631f8f5d5 

# 主機為vp, 不需要對外ip, 只要內網ip, 可上網, 要加上forward功能
# https://tailscale.com/kb/1019/subnets/
echo 'net.ipv4.ip_forward = 1' | sudo tee -a /etc/sysctl.conf
echo 'net.ipv6.conf.all.forwarding = 1' | sudo tee -a /etc/sysctl.conf
sudo sysctl -p /etc/sysctl.conf
  • 回到headscale,啟用路由
#列出路由表
docker exec headscale headscale route list
#啟用路由
 docker exec headscale headscale route enable -r <ID>

公司主要路由(router), 須額外設定靜態路由

若需要做到site to site

PC 用戶端安裝tailscale端點(可翻牆)

  • 先決條件: 公司tailscale端點已設定成nat(當作翻牆用)
  • 執行指令登入到headscale
    打開dos, 或是powershell (希望不用做這動作, 不然麻瓜會生氣)
    ** powershell or cmd run as administrator
cd C:\Program Files\Tailscale
tailscale login --login-server https://headscale.test.com --exit-node=<headscale ip 可為headscale server local ip> --exit-node-allow-lan-access=true

此時網頁會出現一串指令, 請將該node key 給管理人員註冊
**這邊要注意的是網址指令裡面的 USERNAME , 是一開始 headscale 新增的使用者帳號. 

# 管理人員到headscale主機註冊
docker exec headscale  headscale nodes register --user hlmtvpn --key nodekey:32a95789aa71c2dc7ccfa43a16cf1cff575e318c0a67117370ec9c847ff76828

若管理人員註冊完成, PC上面的tailscale會自動登入, 代表註冊成功, 此時可以選擇變身成公司tailscale 端點(如下圖 william-standard-pc-i440fx-piix-1996) , 就可以以公司ip的名義上網翻牆, 當然也可也存取公司內網(tiptop erp不行).

Android

  • play商店
    搜尋 tailscale後安裝並且執行, 執行後要連續按右上三個點, 連按四次, 會出現隱藏的Change server選項, 然後輸入 https://headscale.test.com:8081
  • 設定完headscale server 網址, 回到首頁, 點選 Sign in with other , 此時會出現網址顯示指令,內含一串node key , 如同上個步驟, 將auth key給網管人員註冊, 經網管通知註冊完畢, 即可登入使用.
    **這邊要注意的是網址指令裡面的 USERNAME , 指的是一開始我們在 headscale 伺服器中新增的使用者帳號.
  • 啟用可以翻牆的VPN惹, 要選擇exit node為可翻牆的主機
    實際測試,我自己手機(android 13)翻牆會秀逗不是很穩定, 有時候等1,2分鐘, 有時候秒連,有時候就GG

wireguard 初體驗

我打算用OPNsense取代目前老舊的硬體防火牆(Fortigate 80C) , 後來透過OPNsense 外掛, 試了suricata, AdGuard Home, tailcale , wireguard , 總共花了我2周的時間, 對於VPN, site to site , point to site 也都玩了一輪.

其中對於VPN心得:

  1. Wireguard 網路品質比OpenVPN好一些
  2. site to site vpn , 以及 point to site vpn
    請用OPNsense , 作法請參考 https://www.thomas-krenn.com/en/wiki/OPNsense_WireGuard_VPN_Site-to-Site_configuration
  3. wireguard 基本上綁定一個udp port , 與openvpn一樣都只能靠這個udp port做事, 很容易中國被擋下來
  4. 要規避中國防火牆, 請用tailscale + headscale + udp2raw
  5. tailscale安裝完畢,預設使用者管控機制滿好用的,但是要付費才能商用, 若不花錢, 請將使用者管控改成 headscale , headscale可用docker安裝, 然後讓tailscale login server改成headscale即可.
  6. tailscale 做site to site 只能以NAT方式完成, 這會有問題, 以鼎新tiptop GP 5.1來說就無法回撥source ip 的6400 port ,算是假的site to site vpn , 就算官方宣稱加上 –snat-subnet-routes=false 可以辦到, 但我怎麼試都失敗, 網路上大部分也都不在意,看來tailscale使用群更專注在翻牆功能.

wireguard 設定檔簡單解釋如下, 檔案為/etc/wireguard/wg0.conf, 該設定檔可形成 site to site , 但我在Linux設定一直失敗, 只能用NAT方式,最後發現OPNsense才能做到真正的site to site 功能, 太怪了!

[Interface]

# Site A
# private key 
PrivateKey = CG0svjlK7NdZ3U0MdYQzBHx7adDi1p2UlhPFXdH4HHw=
# Site A Tunnel IP
Address = 10.1.0.1/32
ListenPort = 51820

[Peer]
# Site B public key ,  tunnel ip 10.1.0.2/32
PublicKey = Jkdn621+amuCV8Wj7YQLMydtE9GO5kpq+oZdK/17XAY=
# 允許Site B內網, 以及Site B的tunnel ip
AllowedIPs = 10.1.0.2/32,10.176.5.0/24
Endpoint = <Site B 對外ip>:51820
PersistentKeepalive = 25

[Peer]
# Site C public key , tunnel ip 10.1.0.3/32
PublicKey = VaVaSY6SkizEhexj9vSTkzKgaIo5MwMnulu6I/D+iAI=
# 允許Site C內網, 以及Site C的tunnel ip
AllowedIPs = 10.1.0.3/32,192.1.0.0/22
Endpoint = <Site B 對外ip>:51820
PersistentKeepalive = 25

2017年寫了隻pdf上保護的java程式,現在整理開源釋出

2017年寫了隻pdf附加保護的java程式, 給公司文管人員使用, 程式可離線使用,讓指定目錄裡面的pdf檔案, 批次一鍵上保全, 後來隨著人員異動漸漸失傳.

直到最近, 公司有新人需要這功能, 原因是部門沒有購買或租用 acrobat pdf編輯功能程式, adobe reader又不能上保全, 更不敢線上使用免費上保全網站, 因此我這個老程式又可以重出江湖了, 也改成 java 11使用.

源碼程式在這 https://github.com/WilliamFromTW/InMethodProtectPDF

可執行檔在這 https://github.com/WilliamFromTW/InMethodProtectPDF/releases

程式為runnable jar檔案 , 可以跨平台執行, 後來使用lunch4j這隻程式, 可以轉成windows可執行檔,很方便.

備份軟體restic 進行forget時, 出現pack 錯誤

因為要減少備份snapshots數量, 因此執行forget + prune 瘦身指令

restic forget --keep-last 3 --prune -r <repository>

但是出現某某snapshots中有某些 pack missing 錯誤

some pack files are missing from the repository, getting their blobs from the repository index: [c3622b51e9c118521af211cd3a98f580f5902824b6b665e62d61061acedbe71d]

很慘, 於是只好找一下該 pack, 看看是哪些檔案不見

restic find --pack c3622b51e9c118521af211cd3a98f580f5902824b6b665e62d61061acedbe71d -r <repository>

最後終於找到某些snapshots遺失哪些檔案, 但依舊無法解決問題, 現主時只好忍痛直接將有問題的snapshots移除,等以後再研究解決方案

restic -r <repository>  forget <snapshot id>

2023/2/8 後續

儘管forget該snapshots, 以為成功了.
但是再次執行備份,還是出現這個pack missing錯誤.
於是爬文, 發現必須先刪除相關packs , 再重跑以下步驟:
restic rebuild-index
restic backup –force
restic prune

詳細處理方式請查看 https://feeding.cloud.geek.nz/posts/removing-corrupted-data-pack-restic-backup/ 或是我下載好該網頁內容


超簡單安裝nextcloud共筆功能collabora online Part II (v 2.4.17 )

我以前文章「超簡單安裝collabora online」敘述如何讓nextcloud搭配online document server達到線上編輯功能 ; 後來發現Onlyoffice 更好用, 版面格式比較不會跑掉,就變心改用onlyoffice。

隨著公司越來越多人使用onlyoffice ,沒想到onlyoffice免費版有10人開啟檔案的上限,預算考量,只能另想辦法。

我回過頭來看collabora online , 雖是免費,但官方編譯一樣有20人數限制;照這樣子應該真的要去拍桌,跟老闆說要加錢購買onlyoffice。

可是偶然間發現有個群組, 協助編譯開源版collabora online,並且解除20人限制, 甚至編譯成 docker 版本, 真是佛心來的

以下請參考github與docker網站:

https://github.com/tiredofit/docker-collabora-online

https://hub.docker.com/r/tiredofit/collabora-online/tags

官方文件很少。但不囉嗦, 我測試後直接寫如何安裝。

  • compose 文件
wget https://github.com/tiredofit/docker-collabora-online/raw/master/examples/docker-compose.yml
mv docker-compose.yml.traefik docker-compose.yml
vi docker-compose.yml
#改成醬
#紅色字需要修改
version: '3.7'
services:

  collabora-online-app:
    image: tiredofit/collabora-online:2.4.17
    container_name: collabora-online-app
    hostname: collabora-online.test.com
    expose:
      - 9980
    ports:
      - "9980:9980"
    cap_add:
      - MKNOD
      - NET_ADMIN
    privileged: true
    labels:
      - traefik.enable=true
      - traefik.frontend.rule=Host:collabora-online.test.com
      - traefik.port=9980
      - traefik.protocol=http
      - traefik.docker.network=proxy
      - traefik.backend=collabora-online-app
    volumes:
      - ./logs:/logs
    environment:
      - CONTAINER_NAME=collabora-online-app

      - ADMIN_USER=admin
      - ADMIN_PASS=collabora-online

# 允許哪些網站存取
      - ALLOWED_HOSTS=cloud.test.com,xxx.test.com

      - ENABLE_TLS=FALSE
      - ENABLE_TLS_REVERSE_PROXY=TRUE
    restart: always
#2023/6/14
#2.4.17這版本pdf下載會出問題,因此更換2.4.34版,但是無法啟用成功,出現:
#ERROR: Cannot create container for service collabora-online-app: Conflict
#若要換新版本,需docker-compose down; docker rm collabora-online;
#修改yml檔案,改成新的版本號碼2.4.34後,再重新docker-compose up -d才能執行成功
  • 反向代理(apache 2)
    以下主機名稱需與compose文件相同
<VirtualHost *:443>
  ServerName collabora-online.test.com:443

  # SSL configuration, you may want to take the easy route instead and use Lets Encrypt!
  SSLCertificateFile /etc/letsencrypt/live/collabora-online.test.com/cert.pem
  SSLCertificateKeyFile /etc/letsencrypt/live/collabora-online.test.com/privkey.pem
  SSLCACertificateFile /etc/letsencrypt/live/collabora-online.test.com/fullchain.pem
  SSLProtocol             all -SSLv2 -SSLv3
  SSLEngine on
  SSLHonorCipherOrder     on
  AllowEncodedSlashes NoDecode
  ProxyPreserveHost On


 # static html, js, images, etc. served from coolwsd
 # browser is the client part of Collabora Online
 ProxyPass           /browser http://127.0.0.1:9980/browser retry=0
 ProxyPassReverse    /browser http://127.0.0.1:9980/browser


 # WOPI discovery URL
 ProxyPass           /hosting/discovery http://127.0.0.1:9980/hosting/discovery retry=0
 ProxyPassReverse    /hosting/discovery http://127.0.0.1:9980/hosting/discovery


 # Capabilities
 ProxyPass           /hosting/capabilities http://127.0.0.1:9980/hosting/capabilities retry=0
 ProxyPassReverse    /hosting/capabilities http://127.0.0.1:9980/hosting/capabilities


 # Main websocket
 ProxyPassMatch      "/cool/(.*)/ws$"      ws://127.0.0.1:9980/cool/$1/ws nocanon


 # Admin Console websocket
 ProxyPass           /cool/adminws ws://127.0.0.1:9980/cool/adminws


 # Download as, Fullscreen presentation and Image upload operations
 ProxyPass           /cool http://127.0.0.1:9980/cool
 ProxyPassReverse    /cool http://127.0.0.1:9980/cool
 # Compatibility with integrations that use the /lool/convert-to endpoint
 ProxyPass           /lool http://127.0.0.1:9980/cool
 ProxyPassReverse    /lool http://127.0.0.1:9980/cool
</VirtualHost>
  • 反向代理(nginx)
server {
 listen       443 ssl;
 server_name  collaboraonline.example.com;


 ssl_certificate /path/to/certificate;
 ssl_certificate_key /path/to/key;


 # static files
 location ^~ /browser {
   proxy_pass http://127.0.0.1:9980;
   proxy_set_header Host $http_host;
 }


 # WOPI discovery URL
 location ^~ /hosting/discovery {
   proxy_pass http://127.0.0.1:9980;
   proxy_set_header Host $http_host;
 }


 # Capabilities
 location ^~ /hosting/capabilities {
   proxy_pass http://127.0.0.1:9980;
   proxy_set_header Host $http_host;
 }


 # main websocket
 location ~ ^/cool/(.*)/ws$ {
   proxy_pass http://127.0.0.1:9980;
   proxy_set_header Upgrade $http_upgrade;
   proxy_set_header Connection "Upgrade";
   proxy_set_header Host $http_host;
   proxy_read_timeout 36000s;
 }


 # download, presentation and image upload
 location ~ ^/(c|l)ool {
   proxy_pass http://127.0.0.1:9980;
   proxy_set_header Host $http_host;
 }


 # Admin Console websocket
 location ^~ /cool/adminws {
   proxy_pass http://127.0.0.1:9980;
   proxy_set_header Upgrade $http_upgrade;
   proxy_set_header Connection "Upgrade";
   proxy_set_header Host $http_host;
   proxy_read_timeout 36000s;
 }
}
  • nextcloud 設定
    要安裝Collabora Online

設定URL,以後開檔案將導入到 Collabora Online-server 達到線上作業功能

完成了

  • 檢查運行狀況
    需輸入compose上面的管理者帳號與密碼
https://collabora-online.test.com/browser/dist/admin/admin.html
  • 上傳字型,需要登入到容器,加上額外字型的設定
docker exec -it <容器名稱> bash
vi etc/coolwsd/coolwsd.xml
<remote_font_config>
  <url desc="URL of optional JSON file that lists fonts to be included in Online" type="string" default="">https://cloud.test.com/apps/richdocuments/settings/fonts.json</url>
</remote_font_config>
  • 若nextcloud安裝pdf viewer 請停用,否則會衝突
  • 唯讀請設定浮水印
    這很重要,若公司被稽核,稽核員通常要求只能線上看ISO文件、程序書,且考慮版本無法管控,預設不可以下載

另外要設定安全機制WOPI,一樣是修改 coolwsd,只允許相關ip才能存取

docker exec -it <容器名稱> bash
vi etc/coolwsd/coolwsd.xml
#########################################################
<alias_groups desc="xxxxxx" mode="groups">
  <group><host desc="hostname to allow or deny." allow="true">192.168.1.1</host></group>
  <group><host desc="hostname to allow or deny." allow="true">cloud.test.com</host></group>
</alias_groups>

很困擾的httpd反向代理與容器(container)之間的問題

httpd 反向代理很好用, 一個ip就能搞定無數個網站, 某種角度來看, 也兼具資安效果, 可以阻擋使用ip進行網站攻擊的效果.

可是很困擾的是, 當我每三個月需要 renew 免費的 let’s encrypt 證書, 證書是renew成功了, 但是該檔案對應到容器的服務,有些並不會跟著改用新的證書, 就出問題了.

以mail server為例子, postfix與dovecot服務, 都會咬住舊版的證書, 而不使用新的, 重開mail server又要公告, 只能半夜偷偷重開, 真是困擾阿

Proxmox VE安裝免費網域主控站Turnkey Domain Controller

微軟的網域主控站超級好用, 很適合用來管理, 甚至交給非IT人員,如管理部同仁協助作業

網域主控好用,若只用來群組權限控管, 帳號密碼控管, 建議安裝免費的網域管理伺服器Turnkey Domain Controller就好了.

另外, 像我使用自製的容器郵件伺服器(docker-postfix-ad) ,須綁定微軟網域伺服器認證 ,也很適合安裝Turnkey Domain Controller.

TurnkeyLinux 有一大堆免費的軟體, 且支援Proxmox VE , 有vm版本, lxc版本,及vmware版, 琳瑯滿目.

安裝Turnkey Domain Controller 相當簡單,只要下載iso檔案,安裝成一個vm就好了, 當然也有lxc版本,但我並沒有測試過.
詳細請參閱 https://www.youtube.com/watch?v=PMUUuXmtFc8
安裝完畢, 用我筆電的RSAT工具, 就能管理網域主控站了

以下為安裝之後, 要注意的部分

  • 設定ip
    安裝完畢, 因為沒有設定ip, 所以無法使用瀏覽器登入, 請輸入指令 confconsole, 並且設定ip
  • 設定完IP, 使用瀏覽器登入
    http://ip
    登入後點選“Samba conf via Webmin(login first)
  • 入Webmin, 需先開放網路介面接聽功能, 否則電腦無法加入網域
    Servers -> Samba Windows File Sharing -> Unix Networking
  • 將Network interfaces 改為 Automatic
    *Automatic
  • 修改後要重啟samba server
    Restart Samba Servers
  • 修改要加入網域之電腦dns ,
    第一dns請改成 Turnkey Domain Controller 的IP
    第二dns必須設定, 輸入1.1.1.1 這類可查詢的dns server , 因Turnkey Domain Controller預設沒有dns server, 所以無法正常解析.

電腦dns設定正確, 就能成功找到網域主控站, 並且加入囉

目前安裝版本為 16.2 , 樹系2008R2, 經測試win11 22h2無法加網域, 將在17.0 樹系2012R2獲得解決.

解決 oracle 11G 出現的ORA-01555 問題

oracle我很不熟, 但在公司使用exp指令備份oracle 11g資料時, 遇到以下錯誤訊息

EXP-00056: ORACLE error 1555 encountered
ORA-01555: snapshot too old: rollback segment number  with name "" too small
ORA-22924: snapshot too old

爬了文, 解法有三, 我從最簡單的解法開始, 第一種,第二種都失敗, 直到第三種方式才成功.
我建議從第三種方式開始解,該方法不需修改系統設定, 影響較小.

  • 方法一
    修改 undo_retention秒數, 把時間拉大,
    **我是用備份的方式測試, 發現改了之後還是一樣出錯
SQL>  show parameter undo;

NAME                                 TYPE        VALUE
------------------------------------ ----------- ------------------------------
undo_management                      string      AUTO
undo_retention                       integer     21600
undo_tablespace                      string      UNDOTBS1
SQL> ALTER SYSTEM SET UNDO_RETENTION = 43200;
SQL>
System altered.

SQL>
  • 方法二
    直接加大undo tablespace ,
    這要小心點, 有很多眉角, 似乎牽涉到小心舊undo tablesapce 是否已呈現”OFFLINE”, 且新的undo tablespace 呈現”ONLINE’
# 新增undo tablespace 
create undo tablespace UNDOTBS2 datafile '/.../oradata/undotbs02.dbf' size 30000M autoextend on next 100m maxsize unlimited;
#生效
alter system set undo_tablespace = UNDOTBS2 scope=both;

#查看狀態
select tablespace_name, status, count(*) from dba_rollback_segs group by tablespace_name, status; 
select status,segment_name from dba_rollback_segs where status not in ('OFFLINE') and tablespace_name='UNDOTBS1';
select tablespace_name, status, count(*) from dba_rollback_segs group by tablespace_name, status;
#確認舊的已是offline , 就可以刪掉舊的
Drop tablespace UNDOTBS1 including contents and datafiles;
#再次查看是否已變成新的undo tablespace
show parameter undo
select tablespace_name tablespace, status, sum(bytes)/1024/1024 sum_in_mb, count(*) counts
from dba_undo_extents
group by tablespace_name, status order by 1,2;
  • 方法三
# 先建立一個資料表, 用來儲存有問題的資料ID(ROWID)
SQL> CREATE TABLE CORRUPTED_ROWS (CORRUPTED_ROWID ROWID, ERROR_NUMBER NUMBER);

Table created.

接下來將有錯誤資料表table schema , 欄位類型為clob , blob 欄位列出來, 問題一定在這幾個欄位之中

# 以下紅色部分請改為有問題資料表與欄位名稱, 若沒有出現錯誤, 就換下一個欄位(fieldname)試試看
SET TIMING ON
DECLARE 
   ERROR_1578  EXCEPTION;
   ERROR_1555  EXCEPTION;
   ERROR_22922 EXCEPTION;
   PRAGMA EXCEPTION_INIT(ERROR_1578,  -1578);
   PRAGMA EXCEPTION_INIT(ERROR_1555,  -1555);
   PRAGMA EXCEPTION_INIT(ERROR_22922, -22922);
   N NUMBER;
BEGIN
   FOR ROW IN (SELECT ROWID, fieldname FROM user.table)
   LOOP
      BEGIN
         N:=DBMS_LOB.INSTR(ROW.fieldname, HEXTORAW('889911'));
	  EXCEPTION
         WHEN ERROR_1578  THEN 
              INSERT INTO CORRUPTED_ROWS VALUES (ROW.ROWID, 1578);
			  COMMIT;
         WHEN ERROR_1555  THEN 
              INSERT INTO CORRUPTED_ROWS VALUES (ROW.ROWID, 1555);
			  COMMIT;
         WHEN ERROR_22922 THEN 
              INSERT INTO CORRUPTED_ROWS VALUES (ROW.ROWID, 22922);
			  COMMIT;
       END;
   END LOOP;
END;
/

接下來查詢是否真有問題資料

SELECT * FROM CORRUPTED_ROWS;
#執行以下這行指令應該要出錯
SELECT fieldname FROM user.table WHERE ROWID IN (SELECT CORRUPTED_ROWID FROM CORRUPTED_ROWS);

清空有問題的資料欄位

#若欄位型態是clob就用empty_clob(), 若為blob,就改成empty_blob(), 有幾個欄位出問題就清空幾個
update xxx.table set fieldname = empty_clob()where ROWID IN (SELECT CORRUPTED_ROWID FROM CORRUPTED_ROWS);

若不敢清空, 可以跳過有問題的資料備份

exp system@yourinstance BUFFER=81920 file=/tmp/backup.dmp  tables=user.table QUERY=\"WHERE rowid NOT IN \(SELECT CORRUPTED_ROWID FROM CORRUPTED_ROWS\)\"

參考資料

https://www.modb.pro/db/47021

1 2 3 4 5 ... 18