moodle 升級(docker)

去年安裝了moodle想要當作公司知識管理,沒多久就遇到資安問題,系統需要升級。
可是 moodle 網站 對於升級並沒有太多說明;反而有點誤導,似乎只要容器(container)更新到最新即可自動更新。
其實不是的, 必須:1、先在舊版容器內,下載並更新新版程式, 後再停用且刪除正在運行之舊容器;2、改用最新的images(套用原先的volume資料)。 才是正確做法

以下紀錄相關作法:

  • 本文必須搭配bitnami moodle docker-compose 安裝。
    https://kafeiou.pw/2021/01/18/2961/
  • 先用管理者登入, 在網站管理->主機->網站維護模式, 改成維護模式
  • 在網站管理->一般->通知(反正就是找到通知) ,點選"檢查可用的更新", 查看是否有新版本可供下載。
  • 若發現新版本, 系統會出現連結讓我們下載(但連結通常都怪怪的, 請自行想辦法到官網找到真的下載網址),然後下載到docker container裡面。

    docker exec -it <container name> bash
    apt update
    apt install wget
    wget .....
  • 備份舊版本程式(先備後刪)
/bin/cp -R /bitnami/moodle /bitnami/moodledata
rm -rf /bitnami/moodle/*
  • 下載並更新最新程式
    下載最新版zip檔, 解開會有一個moodle目錄,請複製或覆蓋到 /bitnami/moodle 。
  • 將先前備份moodle.bak目錄, 裡面的config.php檔案複製(取代)到 /opt/bitnami/moodle
  • 接下來改用瀏覽器登入,系統自動會發現有新版,且要求一系列升級工作。
  • 升級完畢,請關閉維護模式
  • 這樣升級就大功告成。因為現主時container為舊版, 可停用且刪除目前舊版容器,修改yaml檔案改用新的container版本。

    官方網站建議做法如下
Step 1: Get the updated image
$ docker pull bitnami/moodle:latest

Step 2: Stop the running container
Stop the currently running container using the command
#這部分有時候會停用失敗,請用docker stop 方式直接停用container
$ docker-compose stop moodle

Step 3: Take a snapshot of the application state
Backup your container 要備分(我之前有做了)

Step 4: Remove the currently running container
Remove the currently running container by executing the following command:
docker-compose rm -v moodle

Step 5: Run the new image (修改yml裡面moodle版本->到最新)
Update the image tag in docker-compose.yml and re-create your container with the new image

$ docker-compose up -d

升級docker images, 舊版images變成none

最近升級moodle到4.0.1版本, 發現有問題, 想用回舊版, 發現舊版的變成 moodle:<none> , 這樣一來不就不能使用舊版了, 後來發現只要知道舊版images id , 就可以改成想要的tag, 也就能繼續使用了

docker tag <images id> <images name>:x.x
docker tag 43b9473f010d bitnami/moodle:3.10

docker安裝moodle線上學習初體驗

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. 若需要發email , 除了設定server ip 帳號密碼外, 還需要進入container , 安裝vim 與 sendmail 這支程式 (2021/03/02)
另外需要進入container, 手動新增crontab規則(2021/03/04)

crontab -u www-data -e
####
*/15 * * * * /opt/bitnami/php/bin/php /bitnami/moodle/admin/cli/cron.php >/dev/null
#請確認php路徑,與moodle安裝路徑是否正確

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分鐘,大概是建立一些元件吧