CentOS6 NAT

公司大陸廠縮編但還剩20多人,原本的fortinet防火牆突然壞了,現主時那裏也沒寬頻上網分享器來替換防火牆;不過內部mail server因不透過防火牆,所以運行正常,server有兩片網卡,一個對外、一個對內,作業系統CentOS 6,算是老伺服器。

我必須在短時間內讓大家上網,也必須讓vpn server透過mail server,重新搞定site to site vpn,才能讓同事從大陸使用台北ERP等伺服器

講這麼多,就是把NAT搞定,CentOS 6還在用老式的iptables,好險我有印象,google爬一爬,趕緊從台北遠端連到大陸任一台主機再,連到mail server進行設定並且測試。

# eth1網卡對外
# eth0網卡對內
iptables -F
iptables -t nat -F
iptables -t mangle -F
iptables -X
iptables -t nat -X
iptables -t mangle -X
iptables -P OUTPUT ACCEPT
iptables -P INPUT ACCEPT
iptables -P FORWARD DROP
iptables -t nat -A POSTROUTING -o eth1 -j MASQUERADE
iptables -A INPUT -i eth0 -j ACCEPT
iptables -A INPUT -j DROP
iptables -A FORWARD -i eth0 -j ACCEPT
iptables -A FORWARD -i eth1 -o eth0 -m state --state RELATED,ESTABLISHED -j ACCEPT
# 把原本的路由加回去
route add -net 192.168.0.0 netmask 255.255.255.0 gw 192.168.1.1

讓 nextcloud 有全文檢索能力FullText Search ElasticSearch

nextcloud 搜尋很好用,若能有全文檢索能力就更棒了,於是外掛 fulltextsearch_elasticsearch就登場了。

開發團隊只針對還在維護的nextcloud版本進行更新,也就是說一旦我們的nextcloud已經EOL了,就不會再收到ElasticSearch的更新。

以下是甘苦談

原本使用的nextcloud 25.x 能搭配ElasticSearch 7.x ,但遇到外掛存在非常嚴重效能低下問題(兩萬個檔案有設定分享,100人使用,建立索引表算一算需要至少三、四個月,太誇張了);由於nextcloud 25版已經停止維護,於是我只剩下升級nextcloud一途。 

我的nextcloud架設在 CentOS 7,docker上面跑好多容器,很穩定;但nextcloud要升級到26時候,出現容器dns錯亂,無法進行dns查詢,只好先還原回25版。

初步認定是CentOS 7或docker版本過於老舊,但我不敢隨意升級docker,最後只能將nextcloud資料複製到新的虛擬主機(RockyLinux 9.4),測試由25升級到26,然後26升級27 結果就很正常,沒有出現dns錯亂問題。

移轉注意事項請參考「將nextcloud從CentOS7移轉到RockyLinux9。

** 升級nextcloud到27,搭配新fulltextsearch外掛,初始索引要18小時,效率差了百倍以上。

開始安裝囉


安裝 ElasticSearch 8.x(ES 8) 引擎

Nextcloud 26或以上必須搭配 ES 8,最新docker版本可至此查詢 https://hub.docker.com/_/elasticsearch

#RockyLinux 9.4、docker 27.0.2

##############  檔案 ./docker-compose.yaml  ################

version: "3.9"

services:
elasticsearch:
build:
context: .
dockerfile: ./docker/es/Dockerfile
container_name: elasticsearch

environment:
- discovery.type=single-node
- xpack.security.enabled=false
- xpack.security.http.ssl:enabled=false
ports:
- 9200:9200
- 9300:9300
networks:
- elastic
restart: always
volumes:
- indexdata:/usr/share/elasticsearch/data
# 索引過的資料將存放到 /usr/share/elasticsearch/data裡面

networks:
elastic:
driver: bridge

volumes:
indexdata:
driver: local

###########################################################



################ 檔案 ./docker/es/Dockerfile ###############
FROM elasticsearch:8.14.2
# ingest-attachment 一定要安裝
RUN bin/elasticsearch-plugin install ingest-attachment
###########################################################
# 執行容器
docker-compose up -d

安裝完畢,瀏覽器測試一下引擎是否正常 http://ip:9200/ ,事後需填入到nextcloud外掛設定裡面。


nextcloud 安裝外掛 fulltextsearch

#若安裝出問題,請移除app後,再刪除以下資料庫資料,之後就可以正常安裝了
drop table oc_fulltextsearch_indexes;
drop table oc_fulltextsearch_ticks;
delete from oc_appconfig where appid='fulltextsearch';
delete from oc_appconfig where appid='fulltextsearch_elasticsearch';
delete from oc_appconfig where appid='files_fulltextsearch';
delete from oc_appconfig where appid='files_fulltextsearch_tesseract';
DELETE FROM oc_migrations WHERE app='fulltextsearch';
DELETE FROM oc_preferences WHERE appid='fulltextsearch';

外掛設定

外掛安裝完畢,還需要填入引擎網址、與索引名稱,其他預設值即可。

「檢查」外掛設定是否正常

docker exec -t --user www-data <nextcloud容器名稱> php occ fulltextsearch:check

「測試」外掛設定是否正常

 docker exec -t --user www-data <nextcloud容器名稱> php occ fulltextsearch:test


一切正常後,就可以開始建立索引表了,這裡建議定期重做索引。

 docker exec -t --user www-data <nextcloud容器名稱> php occ fulltextsearch:index

這裡強烈建議nextcloud裡面所有的文件,只要是「掃描.產生的PDF檔」,需要先利用acrobat adobe pro或adobe線上文字辨識功能(OCR),進行一次自我辨識


第一次初始化索引建立後,nextcloud就可以使用


最後還需要額外執行live指令,針對後續異動的檔案進行索引

# 自動索引官方沒建議怎做,我自己是在容器本體VM(RL9.4)利用console常駐執行
# 這樣做比較麻煩,需要注意重開後需要手動做
docker exec -t --user www-data <nextcloud容器名稱> php occ fulltextsearch:live

** 有一次我要刪除原本的索引,一直失敗,搞了很久很久很久很久,才發現要先進入容器下指令才有用

docker exec -t --user www-data <nextcloud容器名稱> php occ fulltextsearch:reset

** nextcloud存放檔案的目錄,新增「 .noindex」,就可以不做index


** nextcloud若有安裝tesseract ocr這個外掛,記得再進nextcloud容器,安裝相關程式(此功能我一直沒成功過)

apt install tesseract-ocr tesseract-ocr-chi-tra-vert  tesseract-ocr-chi-tra tesseract-ocr-chi-sim  tesseract-ocr-script-viet tesseract-ocr-script-hant tesseract-ocr-script-hant-vert

wordpress 6.5.5 出現ERR_TOO_MANY_REDIRECTS error

場景

  1. 有對外IP充當反向代理程式VM(CentOS 7.9)
    httpd reverse proxy 2.4.6
  2. 無對外IP,內部vm (RockyLinux 9.4)
    Docker CE + Container WordPress 6.5.5

讓反向代理程式連到wordpress,網頁測試居然出現ERR_TOO_MANY_REDIRECTS 錯誤

爬文之後,要在wordpress的wp-config.php加上

if (isset($_SERVER['HTTP_X_FORWARDED_PROTO']) && $_SERVER['HTTP_X_FORWARDED_PROTO'] === 'https') {
$_SERVER['HTTPS'] = 'on';
}

再不行,要加上

if (isset($_SERVER['HTTP_X_FORWARDED_HOST']) && isset($_SERVER['HTTP_X_FORWARDED_PORT'])) {
$_SERVER['HTTP_HOST'] = $_SERVER["HTTP_X_FORWARDED_HOST"];
$_SERVER['SERVER_PORT'] = $_SERVER["HTTP_X_FORWARDED_PORT"];
}

來源 https://lukashermann.dev/writing/wordpress-too-many-redirects/

docker上的nextcloud 為何要移轉到新的vm上?

為何要移轉到新的虛擬主機上? 因為原本虛擬主機已經是EOL了,若nextcloud升級,會面臨資料庫版本不符、docker版本過舊問題;需要另外安裝新虛擬主機、安裝新docker,升級資料庫版本,才能解決nextcloud無法升級問題。

作法如下:

  1. 使用mysqldump 將nextcloud資料匯出,並匯入到新的vm上的資料庫
  2. 將 volume 資料匯出,新docker建立相對應的volume後,再將匯出的資料丟進volume裡面
  3. docker 拉取nextcloud原本images後,重新啟動nextcloud容器
  4. 確認啟動成功後,才能進行nextcloud升級

Linux背景執行

以前我在Linux要背景執行程式,在最後面加上 「&」即可,後來發現這樣好像不正統,因此改用nohub以shell方式執行。

啟動(start.sh)

#!/bin/bash
nohup /usr/lib/jvm/jdk-17-oracle-x64/bin/java -jar api.jar &> /dev/null &

結束(stop.sh)

#!/bin/bash
ps -ef | grep "api.jar" | grep -v grep | sed 's/ [ ]*/:/g'|cut -d: -f2| kill -9 `cat`

nohub解釋如下(出處)

說明
nohup 指令會執行 Command 參數及任何相關 Arg 參數所指定的指令,忽略所有掛斷信號 (SIGHUP) 或修改使用 -p 選項指定的處理程序以忽略所有 SIGHUP 信號。 SIGHUP 是在處理程序的控制端關閉時傳送給處理程序的信號。

在登出之後,也可以使用 nohup 指令在背景中執行程式。 To run a nohup command in the background, add an & (ampersand) to the end of the command.

安裝bookstack書架

我的軟體工程概念很差,最近遇到一個案子,我想要找人一起,但是那個同事主管說要寫提案,了解後才會分配資源。

於是我想到了「SRS(Software Request Spec)軟體需求規格」當作提案,但是又不想要用傳統的word檔案書寫(很難維護),於是上網找了一下軟體需求與功能規格書的範例,終於找到滿意的書寫格式-使用gitbook

https://mason1762.gitbook.io/samxinbakery/gong-neng-ge

可惜gitbook自架很麻煩,於是我又找到相似而且可以自架、開源的系統-bookstack
bookstack宣稱是wiki軟體,也可以當知識管理,以書架、書本為基本架構的系統
https://demo.bookstackapp.com/books

安裝方式很簡單,我這次寫在網誌裡,也沒放在svn系統(https://docs.kafeiou.pw/!/#iammis),而是直接現學現賣,把安裝方式寫在自架的bookstack上。

https://book.kafeiou.pw/

另外有個很棒bookstack網站建議大家參考一下 BUBU 知識庫 & 秉迅資訊.Studio

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

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 在哪個地方,然後加上白名單即可

1 2 3 ... 14