Physical Address

304 North Cardinal St.
Dorchester Center, MA 02124

[OmekaS]實作分散架構的OmekaS on Dcoker

內容目錄

實作分散架構的omekas on Dcoker

好吧,我不太確定這次標題要怎麼寫XD終於完成了專案的環境轉移,原先我們的OmekaS是建置Vmware上,最近由於辦公室搬遷關係,順便做了系統環境大搬遷(才怪),這邊就分享整個架構的作法與遇到問題。

架構說明

考慮到一個好系統的三大特性:可靠性 (Reliabilty)、可擴展性 (Scalability)、可維護性 (Maintainability),毅然決然選定了Docker為基礎來進行轉移,並且一定要實作負載平衡(load balancing),由於辦公室已經採用proxmox(PVE)環境(上述的Vmware架在別的辦公室),那就來試試看PVE的LXC(LinuX Containers) + Docker吧!

也許有人會問用了LXC為什麼還要用Docker?我們的考量點是也許未來不一定還會使用PVE環境,為了最大幅度的可搬遷性決定使用泛用度更高的Docker

既然已經選定建置方式了,那接下來就得考慮幾個實務問題:

  1. 資料庫放在哪?
  2. 檔案放在哪?

關於資料庫

OmekaS使用MySQL,因為分散架構關係,我們將SQL拉出去獨立做一台Docker。

關於檔案

麻煩的就在於檔案,但還好OmekaS這種典藏系統我們在使用過程中不太常出現大量檔案存取問題,所以考慮「共同存取」特性就好,於是決定使用了NAS來存放系統文件,再使用NFS形式mount在不同台主機中,實作「共同存取」功能。

根據上述,最後就會產生出幾台Docke in LXC的服務(參考架構圖)
Frontend(WebServer) 2
Backend(SQL)
1
NAS * 1 (採用trueNAS建置)

架構圖

相關文章:docker-compose for OmekaS

遇到問題

一如往常地沒那麼順利,很快就遇到幾個問題XD

NAS掛載

原本我們打算使用synology的NAS來當作Docker使用的磁碟區,已解決共同使用,但最後發現檔案權限會卡住,以至於OmekaS不能順利取用媒體。最後只好改為在PVE中也建置一台NAS來掛載,原本擔心效能但發現其實還不錯。
使用NAS掛載要注意幾件事:

  1. 我們是用NFS來實作
  2. 注意LSC的特權容器要打開
  3. docker-compose.yml的特權不一定要開

sendmail

OmekaS有些功能會需要寄信,這部分就會需要本機內建smtp,所以要加上兩件事,首先是Dockerfile中要設定安裝與啟動sendmail

RUN apt-get update && \
    apt-get install -y --no-install-recommends sendmail && \
    rm -rf /var/lib/apt/lists/*

再來就是需要賦予FQDN這樣sendmail才能正常運作,須在docker-compose.yml加上

hostname: <your-domain> #need FQDN for mail

喚醒

以下是兩台設定的分享

Backend(SQL)

docker-compose.yml

version: "3"

services:
  mariadb:
    image: mariadb:latest
    restart: always
    environment:
      MYSQL_ROOT_PASSWORD: blabla
      MYSQL_DATABASE: omeka
      MYSQL_USER: user
      MYSQL_PASSWORD: password
    ports:
      - "3306:3306"

Frontend

docker-compose.yml

version: "3"

services:
  omekas:
    build: .
    container_name: omekas
    hostname: <your-domain> #need FADN for mail
    restart: always
    ports:
      - "80:80"
    volumes:
      - html:/var/www/html
    privileged: true

volumes:
  html:
    driver_opts:
      type: "nfs"
      o: "addr=address"
      device: ":/floder/"

Dockerfile

FROM pudding/dlll-paas-base-image:php-7.4-apache-20220617-1837

USER root
EXPOSE 80
RUN apt-get update && \
    apt-get install -y --no-install-recommends sendmail && \
    rm -rf /var/lib/apt/lists/*

RUN docker-php-ext-configure gd --with-freetype --with-jpeg --enable-gd
RUN docker-php-ext-install gd

RUN rm -rf /var/www/html
RUN mkdir -p /var/www/html

WORKDIR /var/www/

COPY ./wait-for-it.sh /var/www/wait-for-it.sh
RUN chmod +x wait-for-it.sh

#start senmail
RUN sed -i '/#!\/bin\/sh/aservice sendmail restart' 

CMD ["./wait-for-it.sh", "targetHost:port","--strict", "--", "apache2-foreground"]