nextcloud還原甘苦談

幾天前我想把nextcloud 25.0.11 升級到 26.0.5 ,這麼多年來從18版一路高歌升到25版,都沒遇到問題,這次卻栽了無法升級,原因卡在資料庫那段,這問題似乎無解,在不想等待的情況下,我決定還原回去。

2023/9/22 發現我25.0.11升級會出錯,官方馬上釋出25.0.12 ,但我升級還是失敗,原來資料庫mariadb 10.3.2版本有問題,我直接docker pull mariadb:10.3 後面不接了,這樣就從25->26能升級成功

還原步驟:

我先將restic 所備份最新版nextcloud備份的snapshot掛載起來,接著停用目前的資料庫(mariadb 10.3.2 多個容器共用);再將nextcloud的相關volume、資料庫還原,結果失敗,失敗原因不明,docker看log也看不出來,web登入出現「Nextcloud the server was unable to complete your request」錯誤,真真急死人;後來爬文,歸納問題可能有三種:目錄權限沒設定好、資料庫問題與ldap無法連線。

不屈不撓檢查才發現原來是我偷懶,當初所有容器所用到的資料庫都統一讓唯一的資料庫容器管理,現在要還原,我停止資料庫容器後,只有還原其中nextcloud的資料庫,其他資料庫不還原,導致重新啟動資料庫容器時,nextcloud資料庫居然有一些資料表損毀(ENGINE=InnoDB)。

好在損毀的資料表是oc_authtoken,只要重建就好了,但是重建失敗,mysql會說該資料表已在,但是query時,mysql又說沒有該資料表,網上有位苦命工程師說建資料表時,遇到這情形,請改用ENGINE=MyISAM格式就能成功,我照著做之後,nextcloud又恢復往日雄風還原成功,但重建的資料表MyISAM跟其他使用InnoDB的資料表格格不入,以後要找一天將資料庫修復才行。
這故事告訴我們,還原資料庫容器要全部都還原,不可只還原其中一部分資料庫。

CREATE TABLE `oc_authtoken` (   `id` bigint(20) unsigned NOT NULL AUTO_INCREMENT,   `uid` varchar(64) COLLATE utf8_bin NOT NULL DEFAULT '',   `login_name` varchar(64) COLLATE utf8_bin NOT NULL DEFAULT '',   `password` longtext COLLATE utf8_bin,   `name` longtext COLLATE utf8_bin NOT NULL,   `token` varchar(200) COLLATE utf8_bin NOT NULL DEFAULT '',   `type` smallint(5) unsigned NOT NULL DEFAULT '0',   `remember` smallint(5) unsigned NOT NULL DEFAULT '0',   `last_activity` int(10) unsigned NOT NULL DEFAULT '0',   `last_check` int(10) unsigned NOT NULL DEFAULT '0',   `scope` longtext COLLATE utf8_bin,   `expires` int(10) unsigned DEFAULT NULL,   `private_key` longtext COLLATE utf8_bin,   `public_key` longtext COLLATE utf8_bin,   `version` smallint(5) unsigned NOT NULL DEFAULT '1',   `password_invalid` tinyint(1) NOT NULL DEFAULT '0',   PRIMARY KEY (`id`),   UNIQUE KEY `authtoken_token_index` (`token`),   KEY `authtoken_last_activity_idx` (`last_activity`),   KEY `authtoken_uid_index` (`uid`),   KEY `authtoken_version_index` (`version`) ) ENGINE=InnoDB AUTO_INCREMENT=4 DEFAULT CHARSET=utf8 COLLATE=utf8_bin;

以上重建table失敗

CREATE TABLE `oc_authtoken` (   `id` bigint(20) unsigned NOT NULL AUTO_INCREMENT,   `uid` varchar(64) COLLATE utf8_bin NOT NULL DEFAULT '',   `login_name` varchar(64) COLLATE utf8_bin NOT NULL DEFAULT '',   `password` longtext COLLATE utf8_bin,   `name` longtext COLLATE utf8_bin NOT NULL,   `token` varchar(200) COLLATE utf8_bin NOT NULL DEFAULT '',   `type` smallint(5) unsigned NOT NULL DEFAULT '0',   `remember` smallint(5) unsigned NOT NULL DEFAULT '0',   `last_activity` int(10) unsigned NOT NULL DEFAULT '0',   `last_check` int(10) unsigned NOT NULL DEFAULT '0',   `scope` longtext COLLATE utf8_bin,   `expires` int(10) unsigned DEFAULT NULL,   `private_key` longtext COLLATE utf8_bin,   `public_key` longtext COLLATE utf8_bin,   `version` smallint(5) unsigned NOT NULL DEFAULT '1',   `password_invalid` tinyint(1) NOT NULL DEFAULT '0',   PRIMARY KEY (`id`),   UNIQUE KEY `authtoken_token_index` (`token`),   KEY `authtoken_last_activity_idx` (`last_activity`),   KEY `authtoken_uid_index` (`uid`),   KEY `authtoken_version_index` (`version`) ) ENGINE=MyISAM AUTO_INCREMENT=4 DEFAULT CHARSET=utf8 COLLATE=utf8_bin;

改成MyISAM就成功重建table

nextcloud雲端檔案,新增額外屬性

公司有追蹤「檔案過期」需求,最方便就是賦予檔案新的屬性—過期日,作為nextcloud粉絲,當然由nextcloud著手,萬幸有個app customproperties能達到要求,最後再寫個程式追查一下資料庫資料表oc_properties 過期日資料,就可以完成系統自動通知功能,定期通知檔案主人快到期,讓主人進行延展或是不再追蹤。

但是該app已經有一陣子沒更新了,不支援nextcloud 25以上版本,有人告知可以小改繼續在25、26版使用,真是幸運,我也依樣畫葫蘆,弄了一個支援25、26的版本來,有興趣的可以按此下載,下載後先解開zip可得tar.gz檔案,再解開放在app目錄,並且確認目錄權限正確後,再次刷新nextcloud 未啟用app列表,即可啟用。

outlook另存msg格式檔案,對方看不懂

outlook作為麻瓜收發郵件軟體最高殿堂,另存檔案當然只能讓outlook打開,其餘閒雜軟體皆不可冒犯。

某日一麻瓜以附件方式,寄給朋友,豈料朋友並沒有outlook,無法開啟msg格式附件,真是大膽!麻瓜求助郎中,郎中開出一帖msgviewer軟體,該軟體佐以java服用,即可將outlook之msg檔案,轉成eml格式(國際標準rfc822格式),經熬煮60個時辰煉化成eml,檔案寄給朋友,朋友以異端thunderbird軟體開啟,正確無誤。

onlyoffice再次回歸啟用

我在去年讓nextcloud改用collabora online,原因為onlyoffice官方編譯的社群版本限制只能20人使用,只好用collabora online 無限人版;最近同事又開始抱怨與M$ office相容性不好,這樣會影響我想要讓大家習慣上雲端進行檔案編輯的目標。於是我挖呀挖呀挖,找了找,想要找一款好用的線上編輯office軟體。

首選台灣晟鑫科技https://www.ossii.com.tw/,一般社群版就很好用了,與微軟相容性極高。

但公司需要更多的功能,只好捨棄oxoo office社群版,我又花了些時間回頭看onlyoffice,冀望有人重新編譯無限人版,沒多久還真的找到,藏在一個很低調的github頁面上,直接是容器版本,實在太棒了。

這裡是自己手動編譯的教學文章

我建議的安裝方式與之前一樣,只要改後面的images來源就可以了,請參考這裡

ghcr.io/thomisus/onlyoffice-documentserver-unlimited:7.4.1

點選這裡「隱藏的網址」,要低調阿

不過我在重新回歸onlyoffice時候,發現無法透過在nextcloud的 「onlyoffice 設定畫面」進行設定,甚至無法清除設定,只能使用指令,我只好將相關指令一併紀錄下來。

# 列出onlyoffice設定
docker exec -u www-data nextcloud php occ config:list onlyoffice
# 清除nextcloud設定
docker exec -u www-data nextcloud php occ config:app:delete onlyoffice DocumentServerUrl
docker exec -u www-data nextcloud php occ config:app:delete onlyoffice StorageUrl
docker exec -u www-data nextcloud php occ config:app:delete onlyoffice advanced
docker exec -u www-data nextcloud php occ config:app:delete onlyoffice customizationChat
docker exec -u www-data nextcloud php occ config:app:delete onlyoffice customizationCompactHeader
docker exec -u www-data nextcloud php occ config:app:delete onlyoffice customizationFeedback
docker exec -u www-data nextcloud php occ config:app:delete onlyoffice DocumentServerInternalUrl
docker exec -u www-data nextcloud php occ config:app:delete onlyoffice customizationForcesave
docker exec -u www-data nextcloud php occ config:app:delete onlyoffice customizationHelp
docker exec -u www-data nextcloud php occ config:app:delete onlyoffice customizationReviewDisplay
docker exec -u www-data nextcloud php occ config:app:delete onlyoffice customizationTheme
docker exec -u www-data nextcloud php occ config:app:delete onlyoffice customizationToolbarNoTabs
docker exec -u www-data nextcloud php occ config:app:delete onlyoffice customization_macros
docker exec -u www-data nextcloud php occ config:app:delete onlyoffice defFormats
docker exec -u www-data nextcloud php occ config:app:delete onlyoffice demo
docker exec -u www-data nextcloud php occ config:app:delete onlyoffice editFormats
docker exec -u www-data nextcloud php occ config:app:delete onlyoffice enabled
docker exec -u www-data nextcloud php occ config:app:delete onlyoffice groups
docker exec -u www-data nextcloud php occ config:app:delete onlyoffice installed_version
docker exec -u www-data nextcloud php occ config:app:delete onlyoffice jwt_header
docker exec -u www-data nextcloud php occ config:app:delete onlyoffice jwt_secret
docker exec -u www-data nextcloud php occ config:app:delete onlyoffice sameTab
docker exec -u www-data nextcloud php occ config:app:delete onlyoffice settings_error
docker exec -u www-data nextcloud php occ config:app:delete onlyoffice types
docker exec -u www-data nextcloud php occ config:app:delete onlyoffice verify_peer_off
docker exec -u www-data nextcloud php occ config:app:delete onlyoffice versionHistory
docker exec -u www-data nextcloud php occ config:app:delete onlyoffice preview
#設定onlyoffice網址,忽略證書,密碼
docker exec -u www-data nextcloud php occ config:app:set onlyoffice DocumentServerUrl --value=https://xxx
docker exec -u www-data nextcloud php occ config:app:set onlyoffice verify_peer_off --value=true
docker exec -u www-data nextcloud php occ config:app:set onlyoffice jwt_secret --value=密碼

2023/9/25 後記,原來是「Collaborative tags」害我不能正常使用onlyoffice設定功能。

簡易電子白板,可整合nextcloud、可同時共同編輯

docker安裝

#修改紅色部分
docker volume create app
docker run -d -p 80:8080 -v app:/opt/app --restart=always --name whiteboard rofl256/whiteboard

安裝完畢使用反向代理就可使用了。參考文件如下:

https://hub.docker.com/r/rofl256/whiteboard

https://github.com/cracker0dks/whiteboard

還可以跟nextcloud整合

這個很陽春,可以設定密碼,但麻煩;白板可以取名字就可以開多個白板,但是掛載nextcloud只能掛同一個。

https://xxx.xxx.xxx/whiteboard/?whiteboardid=WHITEBOARDNAME

關掉wordpress的xml-rpc API呼叫功能

最近發現我安裝的nextcloud常常優雅的關閉(shutting down gracefully),當然原因很多很多,終究是我不好(一副政治人物的口吻);我接著查看log的時候,意外發現有個xmlrpc.php一直被呼叫,於是查了一下,原來是被攻擊了,當然這種無差別攻擊最後也是失敗告終。

像我這種對資安敏感度差的人,又管很多很多開源網站,一般只知道版本更新,不看是否有資安漏洞,除非網站出問題。現在問題來了,我爬了文,一般都建議關閉xml-rpc api,反正99.99%都用不到。wordkpress裡面就能找到停用XML-RPC外掛。

同場加映,我從wordpress 4.9開始使用,裡面有個阻擋廣告留言的Akismet Anti-Spam,很好用,後來升級5.x之後,又出現另一個Akismet Anti-Spam,所以我的網站有兩個Aiti-Spam但版本不同,我也不以為意;但期間我這個網站一直會要求訪問網站的人「同意訂閱」,這問題我找了很久,終於抓到是舊版Akismet Anti-Spam搞的鬼,或許是該外掛有漏洞我不自知,兼沒移除所致。現在刪掉就清爽多,也不再詢問訪問網站者是否訂閱惹。

舊版Akismet Anti-Spam存在的時候,會有一個wp_pushup目錄,裡面時常出現一個js檔案,刪了又會出現,導致來我網站的人們,都會被要求訂閱;在移除舊版Akismet Anti-Spam之後,該wp_pushup目錄也隨之被移除,也不會出現要求訂閱的訊息了。

CentOS 更新特定版本APP

上一則文章提到docker必須升級到20.10.6版,但是我刷了yum update發現原本20.10.3要直上 24.x.x版,有點怕怕的,因此希望能更新到20.10.6就好了,爬文之後解答如下:

sudo yum list docker-ce --showduplicates | sort -r
sudo yum install docker-ce-<VERSION_STRING>  docker-ce-cli-<VERSION_STRING>
#一般來說docker-ce與docker-ce-cli版本要一致比較好

gitea(吉茶)需要更新docker版本20.10.6或以上

前陣子我協助機構部門導入git LFS大檔案版本控管,當時希望push資料時,觸發webhooks,執行我寫好的程式進行分析。

我使用gitea內建測試功能,能很順利觸發webhooks,進而執行程式。

可是實作時卻觸發不了,經檢查logs與爬文後,發現docker版本必須大於等於 20.10.6 有作用,我更新到20.10.6之後測試,還是一樣沒用,只好先擺著,希望主機重開後,能有改善,但無論如何,吉茶說要更新我就照作了。

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

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

git lfs 需要2.0或是以上才行

git config --global lfs.cachecredentials

原來檔案總管理面的檔案,可以自己排列

一直以來我都以為檔案總管的檔案,只能依照上面的欄位進行排序,但是今天被中國同事教育了一番,我錯了!

這位同事工作需要拍照,再將照片存到電腦,檔案總管選擇「圖示(大中小)」進行手動排序,就可以很容易觀看到差異;原本他使用的電腦可以這樣隨意移動,但是換個電腦就不行。

最後問到我這裡來,我就說不可能,只能針對上面的欄位進行自動排序(信心滿滿);但是該同事啪啪打臉我,拿能自己排序的電腦給我看,最後我汗顏了,真是不能太鐵齒。

後來才發現,這功能是windows xp專有的,也就是xp能夠停用「自動排序」,win7以後基本上不能停用自動排序,於是有神人就弄出可以停用自動排序的設定檔案,請按此下載,解開點兩下就可以了。

1 2 3 4 5 ... 73