慘,3DES今年(2023)過後就不能用了
java Servlet 取得遠端ip
原來不是這麼簡單
private static final String[] VALID_IP_HEADER_CANDIDATES = { "X-Forwarded-For", "Proxy-Client-IP", "WL-Proxy-Client-IP", "HTTP_X_FORWARDED_FOR", "HTTP_X_FORWARDED", "HTTP_X_CLUSTER_CLIENT_IP", "HTTP_CLIENT_IP", "HTTP_FORWARDED_FOR", "HTTP_FORWARDED", "HTTP_VIA", "REMOTE_ADDR" }; public static String getClientIpAddress(HttpServletRequest request) { for (String header : VALID_IP_HEADER_CANDIDATES) { String ipAddress = request.getHeader(header); if (ipAddress != null && ipAddress.length() != 0 && !"unknown".equalsIgnoreCase(ipAddress)) { return ipAddress; } } return request.getRemoteAddr(); }
備份神器restic必須搭配restic-browser
windows畢竟還是主流,所以在windows上設定restic備份之後,事後要提取還原,windows系統上必須搭配好用的GUI軟體,因此我推薦 https://github.com/emuell/restic-browser
moodle 有email通知功能,居然要額外安裝測試外掛
nextcloud密碼忘了,出現您的IP多次嘗試登入無效錯誤
nextcloud誤刪檔案,還原失敗
慘,我的錯。
解決方式:
1. 到nextcloud該使用者目錄,找出<user>/files_trashbin/files 複製到 <user>/files
2. 執行 php occ files:scan –all
若出現 Exception during scan: “files/xxx”) is locked 則進入資料庫,刪除資料表資料 DELETE FROM oc_file_locks WHERE 1;
刪除之後,再次執行 php occ files:scan –all 還原檔案後,原本分享的狀態可能會不見,要自己重新設定了。
nextcloud 聯盟功能Federation
先講結論,nextcloud聯盟功能分享的目錄,並不會把檔案傳到對方服務器。(這樣就無法達到檔案兩邊都有的需求)
如何正確啟用聯盟功能
1. 啟用「Federation」app
2. 在管理介面->分享頁面,做好設定以及加入遠端服務器

3. 設定檔加上「allow_local_remote_servers = true」
修改 config/config.php

或是下指令
occ config:system:set allow_local_remote_servers --value true --type bool
4. 同步位址簿(需加入crontab定期執行)
occ dav:sync-system-addressbook occ federation:sync-addressbooks
5. 分享目錄給遠端的聯盟使用者

6. 遠端使用者將會接收到分享目錄的請求

nextcloud踩雷「Collaborative tags」
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