docker container啟動管理supervisord設定心得

supervisord是常用的docker啟動管理程序, 通常我們都把一大堆服務寫進去supervisord.conf, 我最近弄的docker mail server (綁定AD) , 常常遇到container重啟時(docker restart) , supervisord裡面的service會出現already started字樣, 爬了文, 好像是這個參數搞的鬼, startsecs , 官網解釋如下

The total number of seconds which the program needs to stay running after a startup to consider the start successful (moving the process from the STARTING state to the RUNNING state)

也就是說這些service啟動成功後, supervisord預設會等個1秒才移除STARTING狀態, 但有可能造成service本身誤判, 誤以為已啟動,又再啟動一次, 所以service會重複跑個幾次 , 甚至有時候就再起不能了.

目前測試結果可以修改兩個參數, 一個是startsecs=0(立即更新成running狀態) , 另一個是startretries=0(重複啟動次數)
我是決定只改 startsecs=0 , 果然就沒出現already started字樣


ps. 這只是我個人測試自己docker mail server的心得, 沒有多次驗證

誤刪docker 某個image, 重啟後, 相關連的container都無法使用了

真的手殘, 錯誤地停用某個 mariadb database 並且刪除了 image, 還好平常有記錄當時docker 執行的指令, 設定檔案也都在, 很快地就把該container 還原起來了.

但是參考到該container也跟著無法使用, 出現以下錯誤訊息:

 Cannot link to a non running container 

重開這些container, 也無法解決問題, 最後重新啟動 docker service ,才如願解決這個狀況.
我想應該是重啟docker時, 系統重新規劃這些container 內部ip, 就能順利參考到了.

docker安裝moodle線上學習初體驗

# 2024/05/03
這邊提醒一下,預設安裝,資料庫不需要密碼就能連線,這樣一般都不會有問題,因為資料庫沒有開放對外。
若資料庫開放外面連線的話,建議先設定資料庫密碼,然後再改設定開放外面連線。

以下是我將資料庫改完密碼後,再開放到外面透過3307連線
=========================== docker-compose.yml =====================================
version: '2'
services:
mariadb:
image: 'docker.io/bitnami/mariadb:10.6.8'
ports:
- '3307:3306'
environment:
# - ALLOW_EMPTY_PASSWORD=yes
- MARIADB_ROOT_PASSWORD=root的密碼
- MARIADB_USER=bn_moodle
- MARIADB_PASSWORD=密碼
- MARIADB_DATABASE=bitnami_moodle
- MARIADB_CHARACTER_SET=utf8mb4
- MARIADB_COLLATE=utf8mb4_unicode_ci
volumes:
- 'mariadb_data:/bitnami/mariadb'
moodle:
image: 'docker.io/bitnami/moodle:4.1.5'
ports:
- '8090:8080'
- '8446:8443'
environment:
- MOODLE_DATABASE_HOST=192.168.1.1(主機名稱或ip)
- MOODLE_DATABASE_PORT_NUMBER=3307
- MOODLE_DATABASE_USER=bn_moodle
- MOODLE_DATABASE_NAME=bitnami_moodle
- MOODLE_DATABASE_PASSWORD=密碼
- MOODLE_DATABASE_ROOT_PASSWORD=root的密碼
# - ALLOW_EMPTY_PASSWORD=yes

- MOODLE_SMTP_HOST=郵件伺服器IP
- MOODLE_SMTP_PORT=587
- MOODLE_SMTP_USER=帳號
- MOODLE_SMTP_PASSWORD=密碼
- MOODLE_SMTP_PROTOCOL=tls
volumes:
- 'moodle_data:/bitnami/moodle'
- 'moodledata_data:/bitnami/moodledata'
depends_on:
- mariadb
hostname:
'moodle.test.com'
volumes:
mariadb_data:
driver: local
moodle_data:
driver: local
moodledata_data:
driver: local
=========================== docker-compose.yml =====================================

若一開始測試系統安裝成功後(不需要密碼),之後要改需要密碼方式,這樣啟動會報告錯誤。
請改docker volume moodle_data 裡面的config.php ,在裡面加上密碼,才能正常運作。
$CFG->dbpass = '密碼';




docker搜尋一下, 找到 bitnami 製作的moodle images , 照著做滿簡單就能架站

0. 建立網路

docker network create moodle-network


1. 下載docker compose yaml檔案

curl -sSL https://raw.githubusercontent.com/bitnami/bitnami-docker-moodle/master/docker-compose.yml > docker-compose.yml

2. 修改yml如下

version: '2'
services:
mariadb:
image: 'docker.io/bitnami/mariadb:10.6'
hostname: mariadb
environment:
# 若開放外面連線,請務必加上#,否則很容易被入侵
- ALLOW_EMPTY_PASSWORD=yes

- MARIADB_USER=bn_moodle
- MARIADB_DATABASE=bitnami_moodle
- MARIADB_CHARACTER_SET=utf8mb4
- MARIADB_COLLATE=utf8mb4_unicode_ci
volumes:
- 'mariadb_data:/bitnami/mariadb'
moodle:
image: 'docker.io/bitnami/moodle:4.0.1'
ports:
- '8088:8080'
- '8445:8443'
environment:
- MOODLE_DATABASE_HOST=mariadb
- MOODLE_DATABASE_PORT_NUMBER=3306
- MOODLE_DATABASE_USER=bn_moodle
- MOODLE_DATABASE_NAME=bitnami_moodle
# 若開放外面連線,請務必加上#,否則很容易被入侵
- ALLOW_EMPTY_PASSWORD=yes

- MOODLE_SMTP_HOST=ip
- MOODLE_SMTP_PORT=587
- MOODLE_SMTP_USER=xxx
- MOODLE_SMTP_PASSWORD=yyy
- MOODLE_SMTP_PROTOCOL=tls

volumes:
- 'moodle_data:/bitnami/moodle'
- 'moodledata_data:/bitnami/moodledata'
depends_on:
- mariadb
hostname: moodle
volumes:
mariadb_data:
driver: local
moodle_data:
driver: local
moodledata_data:
driver: local

3. 這個moodle container 內部預設的http port 8080 , https port 8443, 我改成 80888445

docker-compose up -d

4. 瀏覽器輸入 https://ip:8445 登入, 預設帳號 user , 密碼 bitnami

5. 設定docker本體主機上面的let’s enpcrypt後, 進行httpd apache 與container對應工作

<VirtualHost *:443>
  ServerName 主機名稱
  ErrorLog /var/log/httpd/ssl_error_log
  TransferLog /var/log/httpd/ssl_access_log
  SSLEngine On
  SSLCertificateFile /etc/letsencrypt/live/<主機名稱>/cert.pem
  SSLCertificateKeyFile /etc/letsencrypt/live/<主機名稱>/privkey.pem
  SSLCACertificateFile /etc/letsencrypt/live/<主機名稱>/fullchain.pem
  SSLProxyEngine On
  ProxyRequests Off
  ProxyPreserveHost On
  RequestHeader set X-Forwarded-Proto "https"
  ProxyPass / http://localhost:8088/
  ProxyPassReverse / http://localhost:8088/
  <Location />
    Order allow,deny
    Allow from all
  </Location>
</VirtualHost>   

 

6. 進入container設定網址(預設為 http://127.0.0.1:8080

[root@firewall ~]# docker exec -it moodle_hlmt_moodle_1 bash
root@moodle:/# vi /bitnami/moodle/config.php
//////////////////////////////////////////////////
if (empty($_SERVER['HTTP_HOST'])) {
  $_SERVER['HTTP_HOST'] = '127.0.0.1:8080';
}
改成
if (empty($_SERVER['HTTP_HOST'])) {
  $_SERVER['HTTP_HOST'] = '你的網址';
}

//////////////////////////////////////////////////

2022/02/18

安裝的時候, 一直無法啟用, 後來才發現,原來docker本身已經有container叫做mariadb , 但moodle預設也剛好是,於是就衝突, 衝突之後就算修改docker-compose.yml的資料庫名稱, 一樣沒反應, 所以解決方式應該是把這兩個container獨立出一個區域網路,

我不是很熟docker-compose如何自成一個網路, 版本太亂, 因此只好轉向改用一般方式啟用, 這也是官網建議的方式.

  • 建立自己的網路
docker network create moodle-network
  • 建立mariadb
docker volume create --name moodle_mariadb_data

docker run --restart always -d --name moodle-mariadb \
  --env ALLOW_EMPTY_PASSWORD=yes \
  --env MARIADB_USER=bn_moodle \
  --env MARIADB_PASSWORD=bitnami \
  --env MARIADB_DATABASE=bitnami_moodle \
  --network moodle-network \
  --volume moodle_mariadb_data:/bitnami/mariadb \
  bitnami/mariadb:latest
  • 建立moodle
    到目前為止, 我覺得沮喪的是以下這一段常常失敗, 原來主機效能太差, 還是會造成影響, 因為資料庫需要時間建立資料, 這時候就不能啟用moodle主系統, 因此必須等上一段資料庫跑久一點大概5分鐘, 再執行, 當然主機效能好可能就秒開.
docker volume create --name moodle_moodle_data

 docker run --restart always  -d --name moodle \
  -p 8082:8080 -p 8445:8443 \
  --env MOODLE_DATABASE_HOST=moodle-mariadb \
  --env ALLOW_EMPTY_PASSWORD=yes \
  --env MOODLE_DATABASE_USER=bn_moodle \
  --env MOODLE_DATABASE_PASSWORD=bitnami \
  --env MOODLE_DATABASE_NAME=bitnami_moodle \
  --network moodle-network \
  --volume moodle_moodle_data:/bitnami/moodle \
  bitnami/moodle:latest
  • 注意事項
    第一次啟動會很慢,至少10分鐘,大概是建立一些元件吧

docker的nextcloud手動升級經驗17->20

公司 nextcloud 版本號為 17 , 今天突然心血來潮, 手動pull 最新版的nextcloud 20, 結果系統直接進入維護模式, 再起不能…
我自己犯了跨兩個大版本不能升級禁忌, 原本想說若失敗, 再把舊的啟用即可, 甚至連設定檔都懶得備份,
當我發現新版啟用失敗時, 只好回到舊的nextcloud,
哎呀! 居然無法啟動, 應該是新版本有改動到舊版設定檔案, 於是就GG了.
這下慘了! 我得趕緊想辦法解決, 在公司同仁發現前, 解決升版, 降版都失敗的窘境,
最後靈光一閃, 終於成功升級到最新版本!
以下真實記錄一下解決的過程:


1. pull nextcloud 最新版號20, 掛載舊的設定檔案, 啟動後出現維護模式, 無法使用. 我於是下指令解除維護模式, 瀏覽器上顯示出現可升級的選項, 上吧, 皮卡丘!

docker exec --user www-data nextcloud_2 php occ maintenance:mode --on

皮卡丘上場了, 但是不給力… 瀏覽器出現升級失敗, 版本不支援的訊息(Updates between multiple major versions are unsupported),
好險docker還能進入nextcloud, 我找到version.php這個檔案, 發現裡面指定只能從19升級到20

$OC_Version = array(20,0,5,2);
$OC_VersionString = '20.0.5';
$OC_Edition = '';
$OC_Channel = 'stable';
$OC_VersionCanBeUpgradedFrom = array (
   'nextcloud' => 
   array (
     '19.0' => true,
     '20.0' => true,
   ),
   'owncloud' => 
   array (
     '10.5' => true,
   ),
 );

2. 死馬當活馬醫, 把version.php的資料改成讓17能升級到18 (19改成17, 20改成18), 然後pull nextcloud 18版 , 再掛上舊有的設定檔案後, 啟動 nextcloud 18版, log 居然神奇的啪啪啪, 出現17升級到18的訊息, 瀏覽器也能成功登入nextcloud, 並且顯示幕前版本18版

Initializing nextcloud 18.0.13.1 …
Upgrading nextcloud from 17.0.5.2 …
Initializing finished
Nextcloud or one of the apps require upgrade - only a limited number of commands are available
You may use your browser or the occ upgrade command to do the upgrade
 Setting log level to debug
 Turned on maintenance mode
 Updating database schema
 Updated database
 Disabled incompatible app: workflow_pdf_converter
 Updating  …
 Migrate old user config
 Starting …
     0/0 [>---------------------------]   0%

3. pull nextcloud 19版 , 掛上舊設定檔案, 啟動後也成功升級到19版

4. 掛上之前最新的nextcloud 20版, 也能從19升到20囉 , 驚險完成升級任務.

後續 2022/8/8

這次從 21.0.9 升級到22.2.10就簡單多了 。

先把新版抓下來

docker pull  nextcloud:22.2.10  

進入舊版容器,安裝vim後,編輯 version.php

增加一行 ‘22.2’ => true

$OC_VersionCanBeUpgradedFrom = array (
   'nextcloud' => 
   array (    
     '21.0' => true,
     '22.0' => true,
     '22.1' => true,
     '22.2' => true,
   ),
   'owncloud' => 
   array (
     '10.5' => true,
   ),
 );

修改完畢,離開並停止執行舊版容器

重新執行新容器(需沿用原本舊容器的設定值) ,執行後系統就會自動更新,確認沒問題後,刪掉舊版容器,就完成整個更新了。

nextcloud連接onlyoffice體驗

我自己的nextcloud原本連結 Collabora Online 達到可線上編輯office檔案的功能, 但是最近發現only office更相容M$ office, 於是想試用only office線上編輯的功能, 這次也是使用docker 安裝,不使用only office內建的let’s encrypt功能, 使用docker本體主機上的let’s encrypt 與 onlyoffice 進行mapping.

*** 2022/11/28 以下作法安裝7.2居然失敗(docker 必須升級到20.10.21), 但我這版還沒升級, 只好退回7.1

docker volume create onlyoffice_fonts
docker run --restart always -v onlyoffice_fonts:/usr/share/fonts -v /etc/letsencrypt:/etc/letsencrypt  --name onlyoffice -d  -p 8443:443 onlyoffice/documentserver

 

*** 2023/09/19 安裝7.2以上,需要設定密碼,並且在nextcloud的「secret key」欄位輸入該密碼

docker volume create onlyoffice_fonts
docker run --restart always -v onlyoffice_fonts:/usr/share/fonts -v /etc/letsencrypt:/etc/letsencrypt  --name onlyoffice -d  -p 8443:443  -e JWT_SECRET=<密碼> onlyoffice/documentserver

這樣就安裝完畢了, 接下來就是進入only office, 進行憑證的對應
** onlyoffice_fonts 的路徑可以存放其他字型(TTF), 再進入only office執行 /usr/bin/documentserver-generate-allfonts.sh即可使用新的字型, 或是執行fc-cache -f /usr/share/fonts/xxxx目錄 ,fc-list 可得知那些字型生效。


#進入onlyoffice 
docker exec -it onlyoffice bash

###### 執行已下指令
mkdir /var/www/onlyoffice/Data/certs
cd /var/www/onlyoffice/Data/certs/
openssl dhparam -out dhparam.pem 2048
ln -s /etc/letsencrypt/live/onlyoffice.test.com/fullchain.pem /var/www/onlyoffice/Data/certs/onlyoffice.crt
ln -s /etc/letsencrypt/live/onlyoffice.test.com/privkey.pem /var/www/onlyoffice/Data/certs/onlyoffice.key
######

#離開container並且重開
exit
docker restart onlyoffice

上面紅色部分就是這個only office的網址, 請自行更改, 最後再到nextcloud啟用onlyoffice連結功能, 再輸入docker 的onlyoffice的網址, 如: https://onlyoffice.test.com , 就可以享用高度相容M$ office的線上編輯功能了

PS. 若docker onlyoffice的憑證是自己簽發的, 經過測試無法使用, 官網建議的做法一樣失敗, 請三思 https://api.onlyoffice.com/editors/nextcloud
測試的nextcloud 20.0.4 , 插件onlyoffice是6.1.0.83

dovecot v2 效能調校

調整cache

https://wiki.dovecot.org/Authentication/Caching
有三個可以調整

auth_cache_size: Authentication cache size, 0 disables caching (default). 
auth_cache_ttl: Time to live in seconds for cache entries. 
auth_cache_negative_ttl: If a passdb or userdb lookup didn't return any data (i.e. the user doesn't exist)
auth_cache_verify_password_with_worker: Password hash verifications are done by the auth master process by default. Setting this to "yes" moves the verification to auth-worker processes. v2.2.34+)
ps: It should be pretty safe to set very high TTLs

調整fsync與service_count

https://datahunter.org/dovecot_performance
可以調整fsync

#Default to no fsyncing
mail_fsync = never
protocol lda {
  # Enable fsyncing for LDA
  mail_fsync = optimized
}
protocol lmtp {
  # Enable fsyncing for LMTP
  mail_fsync = optimized
}
service imap-login {
   service_count = 0
   client_limit = $default_client_limit
   vsz_limit = 64M
}

CEntOS 7 postfix 新增lmtp 與 managesieve功能

之前自己製作的mail server (綁定AD) , 休假功能使用的是 lda + sieve + managesieve 的方式進行, 可是在朋友公司運行時, 卻發生效率不彰的狀況(活躍的email帳號約500個).
查詢了一下, 發現官方已經建議使用 lmtp 的方式取代 lda , 原因是lda屬於觸發類型, 而 lmtp是常駐服務類型, 常駐服務類型效率較好.
於是將自己製作的 docker mail server 改良成 lmtp , 有機會再請朋友測試效率.

以下是讓centos啟用lmtp功能的設定文件(登入帳號密碼guest)

https://docs.kafeiou.pw/iammis/技術文章/HowTo/10033_(CEntOS7.9)新增lmtp_managesieve功能.txt

CentOS 7.8 上安裝fail2ban

fail2ban 很好用, 可用來監控server的log, 智慧型增加防火牆設定, 阻擋暴力入侵.

但是google查詢 fail2ban ,可以發現一大堆設定, 嘆為觀止. 實際安裝起來真是“容易卻很艱難, 簡單又極複雜”.

最近我用自製的 docker快速建立支援Active Directory的Mail Server , 透過網域主控站, 管理郵件伺服器的帳號, 非常方便.

但是我卻遇到暴力破解帳號密碼的攻擊.

主機在越南, 該ip以前就曾被列入黑名單, 有可能過去”被用來“做壞事, 在吃好幫相報的效應下, 超級有名氣!
想當然這個ip被白道認定是壞主機要防禦, 黑道認定是好主機要入侵, 名符其實”被欺負又被全世界討厭的感覺”

tail 一下maillog , 真是不得了, 隨時隨地都有ip嘗試暴力入侵, 每分鐘大概有千次sasl auth連線入侵紀錄.

由於先前安裝mail server, docker 並沒有加上 –net=host , 所以log看不出來從哪個ip入侵,
因此使用我的docker mail server , 必須加上 –net=host 的參數, 使用fail2ban才有意義.

此外預設 fail2ban 查看的log跟docker不同, 需要注意一下 , fail2ban的 jail.local 參數backend要改用auto.

以下是安裝紀錄:

1. 安裝套件
***2020-12-10更新, 若系統運行很久才裝, 要考慮之前已預裝的fail2ban, 請先移除先前所有fail2ban套件,以及/etc/fail2ban的目錄後,再重新安裝

yum install epel-release -y
yum install fail2ban fail2ban-all fail2ban-systemd
systemctl enable fail2ban

2. 建立jail.local
postfix-sasl : 30分鐘入侵3次就關進監獄,關一天 ,
recidive: 一個月兩次進監獄的累犯關一年

vi /etc/fail2ban/jail.local
###############################
[DEFAULT]
# "ignoreip" can be an IP address, a CIDR mask or a DNS host. Fail2ban will not
# ban a host which matches an address in this list. Several addresses can be
# defined using space separator.
ignoreip = 127.0.0.1

# Override /etc/fail2ban/jail.d/00-firewalld.conf:
banaction = iptables-multiport

[postfix-sasl]
enabled = true
bantime  = 86400
findtime  = 1800
maxretry = 3
filter   = postfix[mode=auth]
logpath = <docker maillog>
backend  = auto

[dovecot]
enabled = true
maxretry = 3
bantime  = 86400
findtime  = 1800
filter = dovecot[mode=aggressive]
logpath =  <docker maillog>
backend  = auto

[recidive]

enabled  = true
bantime  = 31536000  ; 1 year
findtime = 18144000  ; 1 month
maxretry = 2
logpath = /var/log/fail2ban.log
backend = auto
###############################


3. 啟用fail2ban

systemctl start fail2ban


4. 查看狀態

fail2ban-client status postfix-sasl


5.手動解除

fail2ban-client set postfix-sasl unbanip <IP>

(docker)透過Web修改Active Directory密碼-PWM

微軟的網域主控站非常好用, 尤其用來管控帳號密碼.
但是修改密碼,就必須透過加入網域的主機才能修改, 有點不方便,
尤其有些人的電腦並沒有加入網域, 要是想改密碼更是麻煩.

基於APACHE 2.0授權的 https://github.com/pwm-project/pwm 就能協助我們修改密碼.

簡易安裝步驟:



確認AD安裝certificate service


產生ad自己的證書(需要有private key) , 否則無法使用port 636 + tls 加密方式連線


安裝


1. 下載做好的container
https://www.pwm-project.org/artifacts/pwm
下載最新版docker images .tar 檔案
如:
wget https://www.pwm-project.org/artifacts/pwm/build/2020-08-20T23_36_49Z/pwm-docker-image-2.0.0-SNAPSHOT.tar

2. 安裝
docker load –input=pwm-docker-image-2.0.0-SNAPSHOT.tar

3. docker 執行
docker run -d –name pwm -p 8443:8443 –restart always –dns=<active directory ip> -v “/opt/pwm/config/:/config/” pwm/pwm-webapp

4. 登入進行第一次安裝設定
https://ip:84443/


安裝過程注意事項:


1. 連線要用加密的方式,否則無法改密碼
2. 要提供管理者群組的LDAP
如:
CN=Domain Admins,CN=Users,DC=test,DC=com
3. 因為PWM額外提供安全提問, 這些提問並不是Active Directory原本的, 需要另外提供空間,此時請選擇local db存放.
其實這不是很重要, 忘了密碼,還能在域控直接修改

安裝成功後, 請先用管理者帳號登入, 登入時需要額外設定忘記密碼的安全提問(管理者可直接跳過),
此時要選擇修改設定檔案, 將修改密碼的複雜度降低(但不可低於原本網域設定), 我是順便將安全提問改成一個就好.

搭配httpd reverse proxy


需修改SiteURL,改完需要重開pwm才能生效
這種方式可以讓網址擁有正式的加密證書(e.g. let’s encrypt)

roundcubemail 加上Active Directory 通訊錄範例

修改config/config.inc.php
網域伺服器 192.168.1.1
網域: test.com

$config['address_book_type'] = 'ldap';

$config['ldap_public']['Global'] = array(
'name' => '台灣總公司',
'hosts' => array('192.168.1.1'),
'port' => 3268,
'user_specific' => false,
'base_dn' => 'dc=test,dc=com',
'bind_dn' => 'cn=administrator,cn=users,dc=test,dc=com',
'bind_pass' => 'password',
'ldap_version' => 3,
'search_fields' => array (
'mail','cn',),
'name_field' => 'cn',
'email_field' => 'mail',
'writable' => 'false',
'scope' => 'sub',
'sizelimit' => 6000,
'sort' => 'cn',
'filter' => '(&(mail=)(|(&(objectClass=user)(!(objectClass=computer)))))',
'fuzzy_search' => true,
'global_search' => true
);

2022/11/05

我後來使用docker doundcubemail 重新安裝, 因為用latest , 當時版本 1.6.x 版本 , 發現上面的設定已經不能用了, 改用以下設定(紅色部分需調整)

$config['address_book_type'] = 'ldap';
$config['ldap_debug'] = true;
$config['ldap_public'] = array(
    'MyAdLdap' => array (
        'name' => 'TW',
        'hosts' => array('網域主機IP'),
        'sizelimit' => 6000,
        'port' => 3268,
        'use_tls' => false,
        'user_specific' => false,
        'base_dn' => 'OU=group,DC=test,DC=com',
        'bind_dn' => 'user@test.com',
        'bind_pass' => 'password',
        'writable' => false,
        'ldap_version' => 3,
        'search_fields' => array(
           'mail',
           'cn',
        ),
        'fieldmap' => array(
            'name' => 'cn',
            'email' => 'mail',
            'surname' => 'sn',
            'firstname' => 'givenName',
        ),
        'sort' => 'sn',
        'scope' => 'sub', # or 'list'
        'filter' => '(&(mail=*)(|(&(objectClass=user)(!(objectClass=computer)))(objectClass=group)))',
        'global_search' => true,
        'fuzzy_search' => true,
        'vlv' => false,
    ),
);

詳請參考 https://github.com/roundcube/roundcubemail/wiki/Configuration:-LDAP-Address-Books#prerequisites

1 ... 9 10 11 12 13 ... 15