分類: 軟體介紹
捨棄nextcloud(容器)內背景排程,改用主機排程(cron)
nextcloud的背景排程,預設為 AJAX,雖說nextcloud建議使用系統cron,但是nextcloud容器cron是「不啟用」的,每次改用Cron,還要進容器另外處哩,非常麻煩,容器升級又要做一次,折磨人啊 。 久而久之,nextcloud一律使用預設值AJAX,我測試過AJAX不會失敗(私、失敗しないので)。
直到最近我使用nextcloud的看板系統(Deck),需要有「email通知 Deck系統裡 卡片異動通知」之功能,因此AJAX單人用還可以,但公司用我就得改用Cron,可是一想到要進容器啟用cron就覺得好煩,才來才知道我錯了。
原來改用cron意外地簡單!
不管是RockLinux、CentOS還是ubuntu,只要在容器宿主(Host)裡的cron,加上一條指令就完事了。
/usr/bin/docker exec -t -u www-data <容器名稱> php -d memory_limit=512M -f /var/www/html/cron.php
真是太棒了!
以下是排程我建議要執行的
docker exec -t -u www-data nextcloud php occ trashbin:expire --quiet
docker exec -t -u www-data nextcloud php occ versions:expire --quiet
docker exec -t -u www-data nextcloud php -d memory_limit=512M -f /var/www/html/cron.php
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
worpress (docker) 連接 Active Directory(ldap)
我為了要測試教育訓練相關外掛程式「LearnPress」,必須先搞定員工能登入網站「上課」這件事。
參考以往經驗,我選擇在wordpress系統,安裝教育訓練外掛,而不使用moodle這類風評好又完全免費的系統,原因在於moodle太龐大了,很難駕馭;反之,wordpress可當作公司內部公告網站,讓平時員工習慣上此網站,也趁此加裝教育訓練模組,員工比較容接觸而上課。
wordpress系統要能連上網域主控站,才可讓員工登入,我找到的外掛為next-active-directory-integration。
搜尋以下外掛且安裝完畢,於外掛啟用之前,容器必須安裝相關套件,才能正確連線,否則會出現錯誤。
docker exec -it wordpress_wordpress_1 /bin/bash
#####
apt-get update
apt-get install -y libldap2-dev
docker-php-ext-configure ldap --with-libdir=lib/x86_64-linux-gnu/
docker-php-ext-install ldap
rm -rf /var/lib/apt/lists/*
apt-get purge -y --auto-remove libldap2-dev
/etc/init.d/apache2 restart
#http://www.jaqb.gda.pl/eng/Community/Blog/Enable-LDAP-support-in-Docker-image-of-Wordpress
進容器安裝相關套件後,就可以啟用外掛,通知使用者輸入「帳號@域名」 就可以登入了。
至於ldap設定部分我就不多說,請自行依情況處理。
Let’s Encrypt 的 DNS-01 Challenge
自從我懂事以來,都是利用 certbot 進行 「HTTP-01 Challenge」,讓發證單位透過http方式驗證,以取得免費的https證書。
除非遇到Let’sEncrypt考驗伺服器秀逗,否則不可能出問題;長大後,我雄心壯志到各地歷練,發現有些主機 80、443 port 居然被封鎖,沒有了80 port (http),就無法透過HTTP-01考驗方式取得https證書。直到此時,我才知道「代誌不是我們憨人想的架甘丹」—事情不是我們想像的這麼簡單啊。
Let’s Encrypt的Challenge Types,列出支援的驗證類型,裡面提到若 HTTP-01 不能用,還有其他選擇,例如本文要說的:DNS-01 Challenge。
DNS-01 使用原理很簡單:DNS伺服器提供ACME DNS API,讓Let’s Encrypt能夠透過API進行考驗,就能取得https證書了。
2024-4-2
新作法 使用開源acme.sh專案
1. 線上安裝
# 若需要使用dns-01方式,email必須是提供API token相同帳號
curl https://get.acme.sh | sh -s email=xxx@test.com
# 安裝完畢程式會在 /root/.acme.sh/acme.sh ("root"因帳號而異)
2. 使用DNS方式授權
取得API Token 或 API Key (以 cloudflare 為例子)
3. 取得授權檔案
/root/.acme.sh/acme.sh --set-default-ca --server letsencrypt
export CF_Key = "b0e689102efab2cf7a1547aaa8b57c4eb65ff"
export CF_Email = "提供API Key之email帳號"
/root/.acme.sh/acme.sh --issue --dns dns_cf -d remote.test.com
或
export CF_Token = "ibrxxFFlKZ5FrsBpisXRU7GzO_2KzSwRAQoAwbsT"
export CF_Email = "提供API Token之email帳號"
/root/.acme.sh/acme.sh --issue --dns dns_cf -d remote.test.com
# 因為我使用apache httpd、CentOS 7.9;httpd 最高到2.4.6,只能支援RAS加密,不支援ECC;
# 然而acme預設產生的是ECC加密檔案,所以指令需額外加上 -k 4096改成產生RSA加密檔案。
/root/.acme.sh/acme.sh --issue --dns dns_cf -k 4096 -d remote.test.com
# 產生完授權證書後,進行安裝到letsencrypt所在目錄
/root/.acme.sh/acme.sh --install-cert -d remote.test.com \
--cert-file /etc/letsencrypt/live/remote.test.com/cert.pem \
--key-file /etc/letsencrypt/live/remote.test.com/privkey.pem \
--fullchain-file /etc/letsencrypt/live/remote.test.com/fullchain.pem
#自動更新授權證書(會自動加到crontab) /root/.acme.sh/acme.sh --upgrade --auto-upgrade
# acme產生檔案與 Let's encrypt檔案對應如下
ACME <-> Let's Encrypt
==========================================================
ca.cer <-> cer.pem
fullchain.cer <-> fullchain.pem
remote.test.com.cer <-> chain.pem
remote.test.com.key <-> privkey.pem
==========================================================
(已失效)以google domains 為範例:(很可惜google賣掉網域代管業務)
1、先建立權杖(token)
登入google domain後,點選「安全性」->ACME DNS API 「建立權杖」
此權杖只會出現一次,因此複製後,要妥善保存。
2、我想使用certbot方式取得憑證,所以到 「certbot-dns-google-domains 」github ,取得執行方式。
2.1 新增權杖檔案
vi /var/lib/letsencrypt/dns_google_domains_credentials.ini
dns_google_domains_access_token = QWVpQWZjT1xxxxxxg2N3lrMi1LUQ==
dns_google_domains_zone = test.com
2.2 docker方式執行,輕鬆取得https證書。
docker run \
-v '/var/lib/letsencrypt:/var/lib/letsencrypt' \
-v '/etc/letsencrypt:/etc/letsencrypt' \
--cap-drop=all \
ghcr.io/aaomidi/certbot-dns-google-domains:latest \
certbot certonly \
--authenticator 'dns-google-domains' \
--dns-google-domains-credentials '/var/lib/letsencrypt/dns_google_domains_credentials.ini' \
--server 'https://acme-v02.api.letsencrypt.org/directory' \
--non-interactive \
--dns-google-domains-zone 'test.com' \
-d 'xxx.test.com'
3、還有其他取得證書方式(一樣是google domain)
請參考 List of known ACME clients to work the ACME DNS API
若使用的是阿里雲解析,可參考這篇文章,我自己測試結果沒問題;提醒一下,要使用let’s encrypt,dns需要有CAA record 允許let’s encrypt 發證,否則會出現 「Verify error : CAA ……」錯誤
未免忘記,節錄一些指令;
除了指令外,還需要在阿里雲加上RAM帳號,授權該帳號能透過阿里雲OpenAPI修改DNS,
並且取得該RAM帳號「Key」與「Secret」,以下指令需要用到。
yum install socat
curl https://get.acme.sh | sh
vim /root/.acme.sh/acme.sh.env
export LE_WORKING_DIR="/root/.acme.sh"
alias acme.sh="/root/.acme.sh/acme.sh"
export Ali_Key="xxxx"
export Ali_Secret="yyyy"
source ~/.bashrc
env
acme.sh --set-default-ca --server letsencrypt
acme.sh --issue --dns dns_ali --dnssleep 180 -d xxxx.test.com
#若以上指令不行,可改以下指令
acme.sh -f --use-wget --issue --dns dns_ali --dnssleep 180 -d xxxx.test.com
2023/6/16 我在RockyLinux 9.2安裝失敗出現以下問題(google代管之網域)
[Errno 13] Permission denied: '/etc/letsencrypt/.certbot.lock'
這很複雜,原因很多,我的解法如下:
解法1. selinux 放行,然後再關起門來 setenforce 0 ; docker run \ -v '/var/lib/letsencrypt:/var/lib/letsencrypt' \ -v '/etc/letsencrypt:/etc/letsencrypt' \ --cap-drop=all \ ghcr.io/aaomidi/certbot-dns-google-domains:latest \ certbot certonly \ --authenticator 'dns-google-domains' \ --dns-google-domains-credentials '/var/lib/letsencrypt/dns_google_domains_credentials.ini' \ --server 'https://acme-v02.api.letsencrypt.org/directory' \ --non-interactive \ --dns-google-domains-zone 'test.com' \ -d 'xxx.test.com' ; setenforce 1; 解法2. 確認相關套件是否安裝 dnf install httpd mod_ssl certbot --apache #若出現The requested apache plugin does not appear to be installed,則代表缺少套件 yum list installed|grep certbot certbot.noarch 2.6.0-1.el9 @epel python3-certbot.noarch 2.6.0-1.el9 @epel 這樣還缺少 python3-certbot-apache , 我再安裝一下 dnf install python3-certbot-apache
推薦修復pst檔案軟體 SysTools outlook recovery
我很少推薦軟體, 但是pst這個outlook檔案大怪獸, 麻瓜常常因為超過50G爆掉, 連outlook封存功能, 也在封存檔案超過50G爆掉的同時, 造成本體檔案損毀, 我召喚 m$ 內建的scanpst 藍袍法師, 法師會跟你說修復完畢, 其實是障眼法, 一律嘴巴說好, 但實際上pst身體很誠實地說修不好, 於是我踏上谷歌尋找修復pst軟體之路, 測試了很多很多種, 都扛不住檔案太大,直接秀逗不執行, 所以也不知修復能力如何, 好在皇天不負IT人, 終於找到 SysTools outlook recovery 簡單好用, 速度極快, 表裡如一, 也不貴 50美金, 極力推薦使用.
Proxmox VE 建立虛擬桌面基礎架構(VDI)連線
Micro$oft outlook寄出的檔案常常變成dat, 該如何打開
Gitea(吉茶)認證綁定微軟網域主控站
根據官方文件 , 吉茶可以綁定各式各樣的登入認證, 也包含微軟網域主控認證, 但並沒有解釋太多, 因我有需求要綁定Micro$oft 網域主控站 , 因此記錄一下注意事項.
- 重點在於搞定使用者篩選
# (memberOf=xxx) xxx 為群組名稱 CN=GitGroup,OU=groups,DC=test,DC=com
# 意思就是帳號需隸屬於GitGroup這個群組, 若不需要可以拿掉.
# (mail=*) 代表帳號email屬性必須有值才能用, 若不需要也可以拿掉
(&(objectCategory=Person)(memberOf=CN=GitGroup,OU=groups,DC=test,DC=com)(sAMAccountName=%s)(mail=*)(!(UserAccountControl:1.2.840.113556.1.4.803:=2)))
- 對應帳號屬性與email屬性
- 若匯入的帳號不喜翻, 可以到資料庫刪除, 再執行作業重新匯入
MariaDB [gitea]> delete from email_address where id<>1;
Query OK, 2 rows affected (0.00 sec)
MariaDB [gitea]> delete from user where id<>1;
Query OK, 2 rows affected (0.00 sec)
安裝自己的照片管理軟體-piwigo
這陣子研究清末明初古幣, 於是想起乾脆架設一個照片管理服務器(self hosting), 功能也不用太多, 有hash tag, 搜尋功能也不是很需要, 試用了一款最有名的 https://photoprism.app/ 發現功能太多, 還有AI自動辨識功能, 不符合我的需求.
最後終於找到簡單好用的 https://piwigo.org/ piwigo也有docker版本, 真是太棒了.
我架設了錢幣照片管理網站 – 布書 , 有不輸之意, 布古代為錢之意.
安裝piwigo非常簡單
- 先準備好mysql 這個container, 底下範例,名字叫做 my-mariadb
- 指令如下, 請注意紅色部分需修改
docker volume create piwigo_config
docker volume create piwigo_gallery
docker run -d --restart always --name=piwigo --link my-mariadb:mysql -e PUID=1000 -e PGID=1000 -e TZ=Asia/Taipei -p 2342:80 -v piwigo_config:/config -v piwigo_gallery:/gallery --restart unless-stopped lscr.io/linuxserver/piwigo:12.3.0
- 登入 http://ip:2342
數據庫輸入mysql , 對應到以上指令中的 –link my-mariadb:mysql
再輸入該資料庫的帳號密碼, 以及資料庫名稱(這部分我是先創建好資料庫, 沒試過未創建是否自己建立)
加上 httpd 反向代理, 這樣就大功告成了
更改預設頁面,例如改成tags, docker 進入container, 修改設定檔案
cd /gallery/local/config
vi /gallery/local/config/config.inc.php
############################
$conf['random_index_redirect'] = array(
PHPWG_ROOT_PATH.'tags.php' => 'return true;',
);
############################
2022/10/15
—
piwigo釋出13.0.0 , 我迫不急待進行升級,結果失敗, 原因應該是我使用非官方的docker版本.
最後只能硬著頭皮,
1. 把舊版(12.3.0) piwigo_images 資料表匯出到新版本(13.0.0)去,
2.並且把舊版本/gallery/_data/i 目錄, 以及/gallery/upload 目錄複製到新版本去, 這樣新版本就告訴你有未處裡的照片, 再自己手動重新建立相本吧, 這也是無可奈何的事情, 希望官方能有解決方案.
android kotlin viewBinding 新做法
寫android總是寫不好, 之前取得view要使用findViewByI的方式, 過了一段時間回頭看, 現在又改了改成使用viewBinding 說是比較快…
- gradle(module)
buildFeatures {
viewBinding = true
}
- main activity
class MainActivity : AppCompatActivity() {
lateinit var binding: ActivityMainBinding
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
binding = ActivityMainBinding.inflate(layoutInflater)
setContentView(binding.root)
}
}
- 使用方式變簡單了
// 舊版
val myButton: Button = findViewById(R.id.my_button)
myButton.text = "A button"
// 新版
val myButton: Button = binding.myButton
myButton.text = "A button"
// Best way with view binding and no extra variable
binding.myButton.text = "A button"