Podman容器備份

備份手法很多,最簡單就是整個主機定期做快照,加上離線備份,這樣就沒甚麼問題了。
但是我最近思考一件事,若我們想將podman上的容器軟體改成docker或是改回實體機使用, 這樣就比較棘手了。

我自己因為遇到podman storage要改不同位置,依照我以前文章更改storage路徑的做法再改一次路徑,podman居然整個崩潰了,搞到還要執行 podman system reset 才能恢復使用,但是reset後,原本的容器軟體全部出問題,若我有乖乖針對容器軟體進行備份,就不會這麼難堪了,最後只能整個VM還原。

所以我想了又想,覺得還是要直接備份容器的「images」與「volumes」。

爬文爬了幾天,修修改改後,我終於融合一個能備份容器以及其volume的腳本,很適合容器母體(host)為Linux使用,該腳本會備份所有的images、volume與執行容器指令。

按此下載podman容器備份腳本(需要輸入guest/guest,下載後請記得修改開頭幾行之備份路徑)

執行備份,先備份images,然後掃描volume,查詢volume若與images互通款取,也一併備份,最後追蹤最初容器執行之指令,也一併圈禁備份起來。

備份後,每個目錄將包含容器使用之images、volumes與rush.sh(啟用指令)

後來我發現volume很適合restic增量備份方式,可以減少我這腳本full backup很耗空間的作法。

因此又改寫了一份針對volume能增量備份的腳本,兩種可以同時搭配使用,例如每個月一次full backup,剩下的定期每日或每周進行restic備份。

按此下載podman容器使用restic備份腳本(需要輸入guest/guest,下載後請記得修改開頭幾行之備份路徑)

nextcloud 25.0.7 搜尋檔案功能失效

同仁反應搜尋檔案(檔名)失敗,我重開nextcloud沒用,系統剛好出現可以升級到25.0.8訊息,升級後也沒用;我冷靜仔細想想,覺得可能跟檔案快取有關,然後就想到一個神奇的指令,這個指令應該跟資料庫重新作index類似吧。

這個適合「換新container」或一季做一次
docker exec -u www-data -it nextcloud php occ  files:scan --all

#這個適合每天做一次
docker exec -u www-data -it nextcloud php occ  files:scan --unscanned --all

重新scan檔案後,該同仁就可以搜尋到了。

最後我們要讓這個指令在host本體主機上,定期以排程(crontab)方式執行工作:

PVE 6 zfs 檢查硬碟狀況並且發通知

zfs很強,pve也支援,但很多要手動調整,例如zfs的快取。直到現在我才發現,pve設定好zfs,若硬碟壞了,是不會主動通知的,甚至使用pve介面查詢,一樣發現不了硬碟壞了,我真的有點驚訝到,或許其他系統如FreeNAS也是如此。

查詢zfs狀態

PVE設定好zfs之後,請定期執行zfs檢查

#zpool scrub <zfs名稱>
#例如我在pve使用3顆1T硬碟,作成zfs,名稱取為Z1
#我就可以輸入以下指令,進行背景檢查
zpool scrub Z1
#若不想背景檢查,則改成
zpool scrub -S Z1

當執行完 zpool scrub指令後,可以再下zpool status -v ,此時會出現 scrub in progress(正在執行中)字樣

最後發現一顆硬碟壞了

此時使用pve gui介面,才會出現錯誤訊息

設定zfs 設定檔案,使其能正確發送email

vi /etc/zfs/zed.d/zed.rc
######################################################3
#請修改紅色部分
ZED_EMAIL_ADDR="it@test.com"
ZED_NOTIFY_INTERVAL_SECS=3600

#若為1則任何zfs動作一律發email,懶得測試0,反正email多收比少收好 
ZED_NOTIFY_VERBOSE=1 
######################################################3

設定crontab並且測試

收到email了,但硬碟壞一顆,不開心

其他指令

#若更換硬碟後,需要resilver
zpool resilver <zpool名稱>

因nextcloud而認識F-Droid

nextcloud上面有個很讚的開源看板軟體「Deck」,看板(kanban)概念屬於敏捷(Agile)開發的一部分,既然是敏捷,我直覺想到Deck一定有mobile app版本;於是我查了一下,發現iOS, Android都有,而且Deck 行動版還開源,iOS直接在app store就可以免費下載安裝,Android Deck則須小收3.49 USD 辛苦費。

我的手機一向都使用android,若想要免費版還有一個方式,就是到 F-Droid 下載免費編譯好的Deck 安裝;後來甚至發現nextcloud建議聯絡人同步軟體 DAVx5 也開源,一樣可以在 F-Droid 下載安裝,非常方便。

F-Droid 理念

F-Droid 是一個可在 Android 平台上安裝的自由與開源FOSS(Free and Open Source Software)的應用程式目錄,可供您輕鬆瀏覽、安裝並持續追蹤裝置上應用程式的更新。

因為我有兩個軟體從F-Droid下載,沒有google商店,將會面臨更新問題,所以最後乾脆安裝 F-Droid App 商店,讓他幫我更新。

nextcloud(容器)連到windows檔案伺服器

nextcloud若能跟公司內部的檔案伺服器連線,在外面就能方便存取公司檔案,也不失為一個好方法;只要安裝「External Storage Support」這個app就能存取外部檔案。

External Storage support 預設無法連線windows檔案伺服器,我們需要額外安裝一些套件,安裝完畢就能支援了。

docker(podman) exec -it <nextcloud container> bash

apt update 
apt -y install libsmbclient-dev libmagickwand-dev 
pecl install smbclient 
pecl install inotify
echo "extension=smbclient.so" > /usr/local/etc/php/conf.d/docker-php-ext-smbclient.ini
echo "extension=inotify.so" > /usr/local/etc/php/conf.d/docker-php-ext-inotify.ini

安裝相關套件後,就能選取到「SMB/CIFS」

原本連線到\\10.1xxx.x.x\taipei 拆開成兩部分,帳號若屬於網域,也要填進去,最後還限制群組使用

nextcloud「通知(Notification)」功能兩三事

nextcloud 要做到系統通知,首先要確認是否安裝「Notification」與「Activity」兩個外掛app,安裝完畢還要確保自動排程(crontab)正常執行,請參考「捨棄nextcloud(容器)內背景排程,改用主機排程(cron)」。

我因為啟用nextcloud的「Deck看板」功能,被使用者要求email通知看板功能的進度,所以安裝了「通知」app,安裝完畢會有一個全域預設的設定值,可以設定那些事件需要通知。

現在問題來了,全域設定預設會通知一大推事件,例如行事曆異動、新增標籤、群組異動與新留言訊息等等,就算關掉這些設定,使用者還是抱怨持續收到一大堆通知;後來發現使用者可以自行設定這些設定值,原來是使用者登入後,就會把系統預設值謄一份到屬於使用者的基本設定上,當然關掉預設值是沒有用的,必須使用者自行更改通知方式才有用,無奈麻瓜就是醬子,很難請他們自己動手改,我只好自己研究系統資料庫內容,將所有使用者設定值改成跟我一樣

以下是例子,紅色須注意。

資料庫為mariadb

1. 取得我們帳號uid
select * from oc_accounts

2. 取消通知
update oc_preferences set configvalue = 0 where  appid='activity' and configkey like 'notify%' and configkey not in  (
select configkey from oc_preferences where userid='帳號uid' and appid='activity' and configkey like 'notify%' and configvalue='1'
)

3. 保留通知
update oc_preferences set configvalue = 1 where  appid='activity' and configkey like 'notify%' and configkey  in  (
select configkey from oc_preferences where userid='帳號uid' and appid='activity' and configkey like 'notify%' and configvalue='1'
)

使用者須自行設定通知

由網域主控站匯出VCARD 電子名片標準VERSION:3.0

一直以來公司的通訊錄使用ldap方式獲取。但是ldap缺點有二:

1、若連不上網域伺服器(越南夏天會停電還一次停兩天),就算我們使用outlook時,並不需要用到通訊錄,但outlook還是會一直出現錯誤,解決方式如下:outlook 關於ldap通訊錄的處理經驗

2、只能在內網使用,筆電拿到公司外就連不上網域主控站,outlook就會開始罵罵號。

這問題我滿頭痛的,好險最近我開始把重心放在nextcloud上,發現可以透過webdav連線方式,從網際網路直接獲取通訊錄以及行事曆,這樣可以解決上面兩個問題;雖然以後多了一個維護的地方,但這可以解決很多麻煩事,而且好處多多,例如可以透過手機、網頁等等多元方式,直接取得聯絡人以及行事曆。

說做就做,我連上公司nextcloud雲端系統後,原本打算一筆一筆「手動」輸入數百筆通訊錄,但是想想還是從三個廠的網域主控站匯出聯絡人比較實在,再由nextcloud提供的匯入功能匯入即可。

nextcloud提供匯入的檔案格式為vcf format,意即VCARD,而且規定要3.0或以上版本才能匯入,格式長這樣:

BEGIN:VCARD
VERSION:3.0
FN:william

ORG:HT
TITLE:
TEL;TYPE=WORK:
TEL;TYPE=HOME:
TEL;TYPE=CELL:
EMAIL;TYPE=WORK:william@test.com
CATEGORIES:test

NOTE:
UID:79996fd9-b2d6-1111-111e-85f7cd5896e5
END:VCARD

這種需求當然往github找尋解方,找了很久都是2.0的powershell腳本,後來終於在這裡找到,試跑了一次還ok,就差在沒有使用utf8輸出,匯入nextcloud會有亂碼,因此我改了一下寫法如下:

紅色部分請自行斟酌修改,存成xxx.ps1 並且在powershell裡執行;要注意屬性CATEGORIES,對應到nextcloud的聯絡人群組(Contact Group),這很重要。

<#
.SYNOPSIS

Export AD Users as single vcf file

#>

cls

$filename = "C:\temp\vCards.vcf"

remove-item $filename

Get-ADUser -filter {Enabled -eq $True} -Properties * | where {$_.enabled -eq $true} | Foreach-Object {

$user = $_.sAMAccountName
$email = $_.EmailAddress
$phone = $_.OfficePhone
$name = $_.Name
$short = $_.HomePhone
$mobile = $_.MobilePhone
$sede = $_.physicalDeliveryOfficeName
$ufficio = $_.Department
$qualifica = $_.title
$responsabile = ($_.manager -split ',*..=')[1]

if ($phone -or $email -or $mobile){
    write-host $user

    # Generate vCard
    Add-Content -Encoding UTF8 -Path $filename "BEGIN:VCARD"
    Add-Content -Encoding UTF8 -Path $filename "VERSION:3.0"
    Add-Content -Encoding UTF8 -Path $filename ("FN:" + $_.cn)
    Add-Content -Encoding UTF8 -Path $filename ("ORG:test")
    Add-Content -Encoding UTF8 -Path $filename ("TITLE:" + $qualifica)
    Add-Content -Encoding UTF8 -Path $filename ("TEL;TYPE=WORK:" + $phone)
    Add-Content -Encoding UTF8 -Path $filename ("TEL;TYPE=HOME:" + $short)
    Add-Content -Encoding UTF8 -Path $filename ("TEL;TYPE=CELL:" + $mobile)
    Add-Content -Encoding UTF8 -Path $filename ("EMAIL;TYPE=WORK:" + $email)
    Add-Content -Encoding UTF8 -Path $filename ("CATEGORIES:test")
    $notedate = (get-date).ToString('d/MM/yyyy')
    Add-Content -Encoding UTF8 -Path $filename ("NOTE:")
    Add-Content -Encoding UTF8 -Path $filename ("UID:" + $_.objectGUID )
    Add-Content -Encoding UTF8 -Path $filename "END:VCARD" #`r`n"
    }

}

讓moodle透過nextcloud提供的oauth2 服務進行登入認證

1. moodle與nextcloud需要有一樣名稱的管理者帳號
有點類似微軟網域伺服器之間的互信,我這邊兩方都建立admin這個有管理權限的帳號。

2. 管理者帳號登入nextcloud網站進行設定
新增客戶端
名稱: moodle
網址: https://xxxxx/admin/oauth2callback.php (xxxxx 為您moodle伺服器網址)

3.管理者帳號登入moodle網站,讓oauth2納入認證範圍
網站管理->外掛->身分認證->管理身分認帳

4.管理者帳號登入moodle網站,將nextcloud產生的帳密輸入進去

   

    

    

儲存變更後,點選以下小圖示,進行moodle與nextcloud的第一次交流驗證,成功後會出現一個綠色勾勾

   

4. 大功告成

最後建議安裝keepalive,延長已登入狀態,否則常常要登入,麻瓜會生氣氣(安裝時,要注意/bitnami/moodle/local目錄是否可讀寫)

安裝完畢,可以設定session存活時間,最多300分鐘

此時我們就可以設定外觀,隱藏需要登入帳號與密碼的畫面

在「原始初始化SCSS」輸入以下語法隱藏登入畫面,只剩下oauth2登入。

.login-form {display:none}

設定完登出,重新登入就只能透過oauth2登入了

moodle無法使用多個網域主控認證(Ldap server)

moodle 是目前最強開源線上學習系統,台灣學校在疫情期間紛紛安裝線上開課,當然也很適合公司當作知識管理系統、線上無紙化測驗使用;可惜只能認證一個ldap server,有多網域伺服器就很麻煩,除非上雲端或許還可以解決此問題。

好險我想到moodle支援oauth2,可以透過公司目前最常用的nextcloud 雲端檔案伺服器進行驗證,而nextcloud可以連結多個ldap server進行驗證,那這樣可以解決問題了。

1 ... 3 4 5 6 7 ... 57