「Tolgee」自行架設(self-hosted),使用docker

上一篇文章「Tolgee」協助您開發多語系APP我建議公司內部使用tolgee;本篇簡易tolgee教學「tolgee該如何使用docker自行架設」

  1. 前置作業要把docker或podman,可以看這篇RockyLinux 安裝 docker準備好。
  2. 準備好外部的資料庫容器(postgres、mariadb),postgress可參考這篇postgres 指令(連線、安裝)
  3. 安裝容器
    這裡我採用連結外部postgres,請先行建立資料庫tolgee,
    其他環境變數(標示紅字),需自行調整。

docker-compose.yaml檔案

version: '3'

services:
app:
image: tolgee/tolgee:latest
volumes:
- ./data:/data
- ./config.yaml:/config.yaml
ports:
- '8090:8080'
deploy:
restart_policy:
condition: on-failure
env_file:
- .env
#若不使用外部postgres,可自架內部專用postgres
# db:
# image: postgres:13
# environment:
# POSTGRES_DB: tolgee
# POSTGRES_USER: admin
# POSTGRES_PASSWORD: admin
# volumes:
# - ./data/postgres:/var/lib/postgresql/data
# ports:
# - '5432ˊ:5432' # 讓外面也可存取

.config.yaml檔案

tolgee:
postgres-autostart:
enabled: false
spring:
datasource:
url: jdbc:postgresql://外部postgreIP:5432/tolgee
username: 帳號
password: 密碼

.env檔案

spring.config.additional-location: file:///config.yaml
TOLGEE_AUTHENTICATION_ENABLED=true
TOLGEE_AUTHENTICATION_INITIAL_PASSWORD=admin
TOLGEE_AUTHENTICATION_INITIAL_USERNAME=admin
TOLGEE_AUTHENTICATION_JWT_SECRET=my_jwt_secret #長度必須大於64
#TOLGEE_MACHINE_TRANSLATION_GOOGLE_API_KEY=my_google_api_key
TOLGEE_SMTP_AUTH=true
TOLGEE_SMTP_FROM=Tolgee <no-reply@mydomain.com>
TOLGEE_SMTP_HOST=email-smtp.regional-region.amazonaws.com
TOLGEE_SMTP_PASSWORD=omg/my/password
TOLGEE_SMTP_PORT=465
TOLGEE_SMTP_SSL_ENABLED=true
TOLGEE_SMTP_USERNAME=user@company.com

# 停用自行註冊功能,只能管理者邀請
TOLGEE_AUTHENTICATION_REGISTRATIONS_ALLOWED=false

# 搞定反向代理之後,請設定網站名稱(不然邀請函只會出現ip)
TOLGEE_FRONT_END_URL=https://tolgee.test.com

安裝完畢,管理者就可以寄發邀請email,或是連結給使用者,讓使用者加入專案

心得結論

Tolgee自架版本雖說有些限制,但已經很好用了,一般小公司有開發app的人已經不得了,不需要用企業版複雜功能。

windows 10 22h2啟用sslv3以及老舊加密法

windows 10 22h2 已經停用 sslv3 加密, 但是有些公司郵件伺服器還在使用sslv3,以及很老舊的加密方式,所以有必要啟用他們。

要啟用sslv3,可到 Nartac Software 下載 IIS Crypto 4.0

執行IIS Crypto程式,如下圖所示,點選 「Best Practices」-> 再選SSL3.0 ,或是全選也可,然後套用 Apply ->重開機,就可以重新讓windows 10 22h2 重振雄風繼續支援老舊加密法。

這樣就能爭取時間,趕緊升級舊系統囉。

選擇 “Cipher Suites”(如下圖) ,將能勾選的都選上,然後手動加上以下加密法,最後再一次apply,Reboot。

#請手動加入
TLS_DHE_RSA_WITH_AES_256_GCM_SHA384
TLS_DHE_RSA_WITH_AES_128_GCM_SHA256
TLS_RSA_WITH_3DES_EDE_CBC_SHA

windows uwp怎確認網站是否可存取

   try
{
var request = WebRequest.Create("https://tw.yahoo.com");
request.Timeout = 5000;
request.Method = "HEAD";

using (var response = (HttpWebResponse)request.GetResponse())
{
String s = response.StatusCode.ToString();
response.Close();
return s.Equals(System.Net.HttpStatusCode.OK.ToString());
}
}
catch (System.Net.WebException exception)
{
return false;
}

RockyLinux 9 使用usb硬碟備份,要避免硬碟進入休眠

過年要到了,小公司需要利用這時間進行系統備份,外接usb備份也很重要,備份完直接切斷usb硬碟連線,但我發現usb會進入休眠,不確定是否能終端機叫醒,因此乾脆直接改成不休眠狀態。

2013年有篇文章,有大佬分享心得

Linux官方參考資料

又是windows 11,停用TLS 1.0、TLS 1.1,只支援1.2

windows 11 從2024年開始,預設就停用TLS 1.0、TLS 1.1了。

表姊公司dovecot 內送郵件伺服器沒有支援TLS 1.2,解法就兩種

  1. 啟用windows 11 TLS 1.0、TLS 1.1
    https://learn.microsoft.com/en-us/windows/win32/secauthn/tls-10-11-deprecation-in-windows
  2. 讓dovecot相容TLS 1.2
    重點在Linux Server上的openssl 版本必須1.0.1或以上
    dovecot啟用TLS 1.2 做法如下:
    https://serverfault.com/questions/959186/error-performing-tls-handshake-with-dovecot-2-3-upgrade

我自己修改dovecot啟用TLS 1.2 做法如下:

  1. 產生dh.pem
    openssl dhparam 4096 > /etc/dovecot/dh.pem
  2. 修改 /etc/dovecot/conf.d/10-ssl.conf

ssl_dh =</etc/dovecot/dh.pem
ssl_min_protocol = TLSv1.2
ssl_cipher_list = ALL:!LOW:!SSLv2:!EXP:!aNULL
ssl_prefer_server_ciphers = yes

最後再更新我自己整合的郵件伺服器(綁定本地端微軟網域伺服器)
https://github.com/WilliamFromTW/docker-Postfix-AD


2024/01/10 (冏只隔一天又出現其他問題)

上次問題解決之後(windows 11其實有更新到24h2),後續又發現其他台windows 11未更新24h2,收發信還是有問題,但問題不太一樣

Jan 10 09:49:02 docker dovecot: pop3-login: Disconnected: Connection closed: SSL_accept() failed: error:1417A0C1:SSL routines:tls_post_process_client_hello:no shared cipher 

我除了更新mail server的postfix 、dovecot、openssl (RockyLinux 8.8) 外,變更dovecot一些設定,就解決問題了。

  1. 啟用windows 11 的TLS 1.0 、TLS 1.1
    依照微軟建議,我做成reg檔案,請按此下載匯入到windows啟用
  2. 更改dovecot設定,改成最小可支援 TLS 1.1 ,ssl_cipher_lis也修改(出處請參照這裡)
ssl_min_protocol = TLSv1.1
#ssl_cipher_list = ALL:!kRSA:!SRP:!kDHd:!DSS:!aNULL:!eNULL:!EXPORT:!DES:!3DES:!MD5:!PSK:!RC4:!ADH:!LOW:!DH@STRENGTH
ssl_cipher_list = ALL:!LOW:!SSLv2:!EXP:!aNULL

win11 22h2帶來的影響,無法連線MSSQL 2005

我表姊公司在1999年就開始使用高格EPR系統,這個系統使用當時開發windows程式的顯學 Borland 軟體架構(2-tier、3-tier),資料庫使用interbase 。

高格一路上升級,資料庫改成BDE+mssql 2005混合體,連線方式從netbeui改tcpip,用戶端作業系統從windown 98到windows 10也能使用。

我認為高格是一款很棒的軟體,不比我二姊公司現在還在使用生產力中心開發的老古董”excel 97 進銷存系統”差。

直到最近,表姊公司換新的筆電,原本依照步驟,將windows啟用.net framework 3.5、smb 1.0 ,安裝interbase、mssql 2005 client 就可以連到 mssql 2005 server,實際上安裝後,卻無法正常連線到資料庫;我找了很久找不出原因,只好google一下”win11 mssql 2005″,居然在ITHOME找到解法 https://ithelp.ithome.com.tw/questions/10212352(感謝 aaron3399mihihi) ,只要利用 IISCrypto 這個軟體(備用下載),將win11被移除的加密方式加回來,就可以連上mssql 2005 server了,也讓高格能繼續生存下去。

加回來的加密協定:

TLS_DHE_RSA_WITH_AES_256_GCM_SHA384
TLS_DHE_RSA_WITH_AES_128_GCM_SHA256
TLS_RSA_WITH_3DES_EDE_CBC_SHA

國外參考

老派java+eclipse+sprint boot遇到3DES加密問題

API,傳資料只用簡單的3DES加解密,但是java 預設只有3DES的PKCS5Padding,要達到PKCS7Padding(windows c# 只支援PKCS7Padding),就只能請Bouncy Castle幫忙,我使用bcprov-jdk15to18-1.78.1.jar、jdk17。

程式改寫大概如下:

// java 只有padding5,用bouncycastle,改寫成可使用padding7
static {
if(Security.getProvider("BC")!=null) Security.removeProvider("BC");
Security.addProvider(new BouncyCastleProvider());
}


// 使用CBC、PKCS7Padding
原本寫法
Cipher decryptCipher = Cipher.getInstance("DESede/CBC/PKCS5Padding");
改成
Cipher decryptCipher = Cipher.getInstance("DESede/CBC/PKCS7Padding","BC");

在Eclipse開發時很正常,正式執行時,出現以下錯誤:

jce cannot authenticate the provider bc

我查了一下原來jdk 17是17.0.9版,這問題於jdk 17.0.10(2024年1月)解決,就這麼剛好只差一版;最後,我升級至目前最新 jdk17.0.12版就解決了。參考來源


另外 windows uwp c#寫法也幾乎一至,因java是API,windows app為client,所以也就順手了解一下

public static String Encrypt3DesCbcPKCS7Padding(String sIV,String sSecretKey, String sData)
{
TripleDES tdes = TripleDES.Create();
IvParameterSpec ivSpec = new IvParameterSpec(System.Text.Encoding.UTF8.GetBytes(sIV));
SecretKeySpec secretKeySpec = new SecretKeySpec(System.Text.Encoding.UTF8.GetBytes(sSecretKey), "DESede");
Cipher encryptCipher = Cipher.GetInstance("DESede/CBC/PKCS7Padding", "BC");
encryptCipher.Init(Cipher.ENCRYPT_MODE, secretKeySpec, ivSpec);
return Base64.ToBase64String(encryptCipher.DoFinal(System.Text.Encoding.UTF8.GetBytes(sData)));

}

讓 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

這裡強烈建議「文件掃描PDF檔」需要利用acrobat adobe pro版內建文字辨識功能(OCR),進行一次自我辨識

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

最後還需要額外執行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

** 目錄裡面新增「 .noindex」 這個檔案,就可以不做index

** 若有安裝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

** 以前安裝Micro$oft單機版sharepoint,是個重量級系統,早就有全文檢索功能,但實在是太吃系統資源了,果斷不用。

1 2 3 ... 6