分類: 技術
捨棄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
感謝”Linux技術手扎”對於apache http調校說明
長期以來,我「HTTP反向代理伺服器」只使用「Apache Http」, 理由簡單:習慣了;然而,新興的代理伺服器總讓我有種「雖簡單卻很艱難」的感受,雖說採用新服務器是進步的象徵,但我考量自己管理的網站達數十個,非常在意網站穩定性,若貿然決定更換新「反向代理服務器」,則需要很大的勇氣,誰都無法知道被代理的服務器會不會水土不服,造成災難,因而作罷。
一般來說,apache httpd運作很穩定,沒事就不要動設定;但是我總是遇到代理服務器重啟很慢的問題,原本也沒有多想,訓練自己忍耐力XD,直到遇見”Linux技術手扎“,網站中有兩篇文章,對於apache http效能,防止阻斷攻擊(DoS)有詳細說明。我拜讀之後,受用不盡,因此也節錄下來,作為自己快速參考用。
1、解決apache http重啟慢問題
vi /usr/lib/systemd/system/httpd.service
[Service]
...
KillMode=none
systemctl daemon-reload
2、防止阻斷攻擊(Dos)
vi /etc/httpd/conf/httpd.conf
...
RequestReadTimeout header=20-40,MinRate=500 body=20,MinRate=500
systemctl restart http
想知道修改原因、運作原理,請參考網站。
outlook搜尋不到email原因為何
公司的麻瓜有一天跑來說:「我無法搜尋郵件,昨天能搜尋到,今天就不行了。」原本我還想說,一定是沒有這封信才會找不到(當然先相信outloook);我當下要求麻瓜證明真有這些email。沒多久,還真的找出來!可是我再次輸入該封email的標題,一樣搜尋不到,這下掉漆了。
我趕緊回位子google「outlook can’t search email」,google出現很多解法,步驟有二:
第一、先確認索引狀態。(這部分可以設計給麻瓜自行確認是否索引正在進行中)
我遇到的狀況,email檔案有49GB,很巨大。因outlook本身也會自動定期「重建索引」,但檔案超級大,需要很久很久時間才能完成,在完成之前,當然搜尋不到;而我們也無計可施。
第二、進行「重建索引(rebuild index)」的工作。
Certificat renewal failure during secondary validation: Remote PerformValidation RPC failed
今天公司有個網站, 到了每三個月要更新(renew)證書的日子, 沒想到卻出現「Certificat renewal failure during secondary validation: Remote PerformValidation RPC failed」這個錯誤訊息. 開始我還以為防火牆或網頁服務器出問題, 摸索一陣子卻找不出原因 XD
這麼多年來, 頭一遭遇到這問題; 隨著同仁瘋狂反應, 我緊張到瑟瑟發抖 ! 此時, 我突然想到可以到let’s encrypt官方論壇,查看有沒有人有相同問題. 幸運的是滿滿都是問題回報;原來是官網的主機出問題, 需要30~60分鐘時間修復.
經此風波, 我覺得有必要訂定SOP,用來解決發證書所造成的問題:
第一步: 發現renew失敗, 看log(/var/log/letsencrypt/letsencrypt.log).
第二步: 查看Let’s encrypt伺服器是否正常 https://letsencrypt.status.io/
第三步: 到let’s encrypt社群看看有沒有相同的問題反映
windows啟用”離線檔案”功能, 反而無法存取伺服器目錄
好煩的outlook pst檔案最大只能50GB
舉個例子,很煩的是透過 imap , 麻瓜郵件放在server上超過 300GB , 但是ost/pst只能50GB, 就算封存50G, 還是不夠, 然後就沒有然後了(檔案掛掉).
爬文後, office 2016,2019以後, 可以設定最大值, 這個網站說可以到4PB ,也就是無限大了, 不知真假, 先把registry做好再說.
按此下載registry檔案 , 或是自己照著m$網站做也可以
奇怪的知識增加了-您的Windows授權即將到期
公司某台筆電突然出現這個訊息, 原來是windows 7升級到windows 10, 判斷應該是升級後某種原因授權不過,這很怪,筆電購置一定都是正版的, 不過因為使用者急著用, 但是又一直跳出這視窗, 非常煩, 因此爬文, 先解決這惱人視窗問題.
做法好多種, 可以參考這裡 , 我自己用的是其中一種“停用windows授權管理員服務”&”windwos update”
- 執行”服務”
Window+R 輸入 “services.msc” , 執行服務 Service Manager
- 停用授權管理員服務, 以及windows更新服務
先停止, 啟動類型再改成”已停用”, 然後重新開機測試即可