jgit clone專案失敗,原來要把帳號密碼存起來才行

自己寫 java 呼叫 jgit 函式庫clone專案,卻失敗,我看到錯誤訊息是沒有帳號密碼;可是程式明明有輸入帳號密碼,後來爬文才發現我有案子有使用LFS,需要設定快取把帳號密碼儲存起來,否則會一直要求輸入帳號密碼造成程式錯誤。

git lfs 需要2.0或是以上才行

git config --global lfs.cachecredentials

小公司應用軟體系統-戰略與戰術

對於一個小公司來說,當然非常想用各式各樣的應用軟體系統,可是公司沒人懂IT,對於所謂的上雲端更是丈二金剛摸不著頭腦,搞不清楚,若找來軟體公司,公司說了一大堆,一開口說預算多少,老闆也跟著張大口嚇得不要不要的。

所以我常建議軟體公司,必須提供小企業能負擔的解決方案,至少要能解決小公司「辦公室能用到的軟體系統」,如nextcloud這樣的雲端檔案系統,同樣也必須做到虛擬伺服器(proxmox ve) + 虛擬主機(容器服務);一個應用系統必須虛擬化、容器化,千萬不要安裝在一台實體主機(除非是故意的,這樣才能賺錢,反正客戶都不懂)。

前幾天看到YT閱部客談到《跨能致勝:顛覆一萬小時打造天才的迷思,最適用於AI世代的成功法》這本書,提到「戰略與戰術」,我相當認同其中的見解:單一專業的部分交給AI,綜觀全局的部分就交給人類。

https://www.youtube.com/watch?v=-j8MSMqDfs0

軟體公司能提供給小公司的戰略重點就是「備份」,而且要麻瓜都懂的備份方式,我先前就遇到一家小公司透過朋友輾轉向我求救,他們IT突然跑了,沒有交接,他做好的系統是運行3年多的實體機,看起來搖搖欲墜,後端NAS也無人知曉如何登入。

我接手後,先確認他們只需要mail server 與 對會員收費網站(wordpress),我花了很多功夫,終於移植到一台單一主機(ssd*1 for os、hdd*3 for zfs),pve 8.0 +RockyLinux 9.2 +podman container。

系統移植成功後,還要考慮麻瓜備份問題,戰略戰術一併考慮,我額外安裝一個容器:nextcloud雲端檔案系統,透過此雲端檔案系統能連到外部空間的特異能力(external storage support),直接俗又有力的掛載宿主(pve)主機已準備好的備份目錄,最後只要讓麻瓜安裝nextcloud 用戶端app,就能同步備份目錄到麻瓜其他檔案空間,達到離線備份的效果,離線異地備份就再也跟IT沒關(頂多半年協助做個還原演練即可),我也能全身而退。

iredmail 1.6.3 設定白名單

幫朋友安裝開源好用的mail server 「iredmail」,若需要加白名單,有兩個方法:

  1. 購買專業版
  2. 下指令
    https://docs.iredmail.org/amavisd.wblist.html
# python wblist_admin.py --list --whitelist
# python wblist_admin.py --list --blacklist
# python wblist_admin.py --add --whitelist 202.96.134.133 john@example.com @test.com @.abc.com
# python wblist_admin.py --add --blacklist 202.96.134.133 john@example.com @test.com @.abc.co

先找出 wblist_admin 在哪個地方,然後加上白名單即可

nginx 反向代理wordpress容器,出現failed (111: Connection refused) while connecting to upstream

系統大概長這樣,一個RockyLinux 9.2 主機安裝 iRedMail 1.6.3版(容器還在Beta版),iRedMail安裝滿簡單的,很快就搞定;但因為太霸氣應改主機的nginx設定,並且深度修改,若這主機只當mail server倒是沒問題,但可惜因為種種原因需要再安裝一個wordperss容器,這就麻煩了,我得了解如何讓nginx使用反向代理方式(proxy),才能連到wordpress,nginx反向代理設定似乎很簡單,也成功了,可惜log卻一直跳出錯誤:

connect() failed (111: Connection refused) while connecting to upstream

我祭出google大神,試了很多建議與解法卻失敗了,就在第9999次嘗試之後,突然意識到甚麼,將設定改了一下,只是簡單的將原本連到容器的方式 http://127.0.0.1:8080 改成該具名稱連線 http://www.test.com:8080 (該wordpress容器對外連結為https://www.test.com),錯誤訊息居然就停止了,真是神奇。

proxy_pass http://127.0.0.1:8080;
改成以下具名設定
proxy_pass http://www.test.com:8080;

算一算農曆七月快到了,就當作是靈異事件好了。

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)方式執行工作:

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 2 3 ... 7