誤刪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

M$ office的另一種選擇onlyoffice

有一天幫同事看了一款筆電, 硬體規格很好, 價格也很優惠, 再仔細一看, 原來作業系統不是windows , 而是一款叫做 Endless OS 的作業系統, 難怪便宜多了.
一般這種非windows筆電,除非是MAC BOOK, 否則麻瓜們很難接受, 主要原因在於M$ office相容性, 雖然替代的軟體很多, 可惜相容度有待加強, 介面差異也頗大, 麻瓜使用的意願不可能高.
好奇心的驅使下, 讓我相知道為何廠商敢搭載非windows作業系統, 放到只有麻瓜會看的賣場上販賣.
於是我查了 Endless OS 規格, 發現預載了 only office , 試用了結果非常棒, 連介面都非常M$.
only office跟其他office替代軟體一樣, 並沒有台灣的新細明體, 標楷體, 若自用只能自行想辦法安裝(但這要小心, 不要觸法),
不過沒關係還是可以安裝其他相容的字型, 如國發會的全字庫 商用也沒問題呢.

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

jitsi-meet限定內部使用(VPN) 安裝注意事項

jitsi-meet安裝後, 可查看 /var/log/jitsi/jvb.log , jicofo.log 看看是否有錯誤


1. 若遇到 PKIX path building failed 錯誤, 會造成mcu錯誤, 也就是無法多人(3人)以上一起視訊以及分享
需要把自己簽名的證書(不合法) , 新增至java的證書區

keytool -importcert -file /var/lib/prosody/<主機名稱>.crt  -keystore <java SDK path>/jre/lib/security/cacerts 
#刪除請把 -importcert 改成 delete

Example

keytool -importcert -file /var/lib/prosody/meet.test.com.crt  -keystore /usr/lib/jvm/java-8-openjdk-amd64/jre/lib/security/cacerts 

有趣的是, 以上指令執行完畢, 需要輸入密碼,密碼預設是 changeit

改完後重開機.

ubuntu(VM)如何測試aes硬體解碼的功能

  1. 先讓vm不啟用aes, 然後執行
openssl speed -evp aes-256-cbc

再讓vm關機, 然後啟用aes, 重開機, 再執行上述指令, 比對數值即可.

2. 可以用以下指令測試支援哪些解碼

openssl ciphers -v 'ECDH+AESGCM:DH+AESGCM:ECDH+AES256:DH+AES256:ECDH+AES128:DH+AES:ECDH+3DES:DH+3DES:RSA+AES:RSA+3DES:!aNULL:!MD5:!DSS' 

3. nginx 與 apache httpd 都有加密的設定, 類似以下的寫法

ssl_ciphers ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-CHACHA20-POLY1305:ECDHE-RSA-CHACHA20-POLY1305:DHE-RSA-AES128-GCM-SHA256:DHE-RSA-AES256-GCM-SHA384;

4. openssl speed 這指令可以列出來加密速度, 非常實用

1 ... 24 25 26 27 28 ... 58