LibreNMS 可以在 Docker 中運行嗎?

大家好,

有沒有人在 Docker 容器中安裝過 LibreNMS?我想這麼做。我已經找到了推薦的 YAML compose 檔案,但因為我不是 YAML 專家,不太確定在 QNAP 上需要修改哪些地方等等。

謝謝!

你可以貼上 YAML 嗎?

主要是網路和共享資料夾需要為 WNAP 做調整。

name: librenms

services:
  db:
    image: mariadb:10
    container_name: librenms_db
    command:
      - "mysqld"
      - "--innodb-file-per-table=1"
      - "--lower-case-table-names=0"
      - "--character-set-server=utf8mb4"
      - "--collation-server=utf8mb4_unicode_ci"
    volumes:
      - "./db:/var/lib/mysql"
    environment:
      - "TZ=${TZ}"
      - "MARIADB_RANDOM_ROOT_PASSWORD=yes"
      - "MYSQL_DATABASE=${MYSQL_DATABASE}"
      - "MYSQL_USER=${MYSQL_USER}"
      - "MYSQL_PASSWORD=${MYSQL_PASSWORD}"
    restart: always

  redis:
    image: redis:7.2-alpine
    container_name: librenms_redis
    environment:
      - "TZ=${TZ}"
    restart: always

  msmtpd:
    image: crazymax/msmtpd:latest
    container_name: librenms_msmtpd
    env_file:
      - "./msmtpd.env"
    restart: always

  librenms:
    image: librenms/librenms:latest
    container_name: librenms
    hostname: librenms
    cap_add:
      - NET_ADMIN
      - NET_RAW
    ports:
      - target: 8000
        published: 8000
        protocol: tcp
    depends_on:
      - db
      - redis
      - msmtpd
    volumes:
      - "./librenms:/data"
    env_file:
      - "./librenms.env"
    environment:
      - "TZ=${TZ}"
      - "PUID=${PUID}"
      - "PGID=${PGID}"
      - "DB_HOST=db"
      - "DB_NAME=${MYSQL_DATABASE}"
      - "DB_USER=${MYSQL_USER}"
      - "DB_PASSWORD=${MYSQL_PASSWORD}"
      - "DB_TIMEOUT=60"
    restart: always

  dispatcher:
    image: librenms/librenms:latest
    container_name: librenms_dispatcher
    hostname: librenms-dispatcher
    cap_add:
      - NET_ADMIN
      - NET_RAW
    depends_on:
      - librenms
      - redis
    volumes:
      - "./librenms:/data"
    env_file:
      - "./librenms.env"
    environment:
      - "TZ=${TZ}"
      - "PUID=${PUID}"
      - "PGID=${PGID}"
      - "DB_HOST=db"
      - "DB_NAME=${MYSQL_DATABASE}"
      - "DB_USER=${MYSQL_USER}"
      - "DB_PASSWORD=${MYSQL_PASSWORD}"
      - "DB_TIMEOUT=60"
      - "DISPATCHER_NODE_ID=dispatcher1"
      - "SIDECAR_DISPATCHER=1"
    restart: always

  syslogng:
    image: librenms/librenms:latest
    container_name: librenms_syslogng
    hostname: librenms-syslogng
    cap_add:
      - NET_ADMIN
      - NET_RAW
    depends_on:
      - librenms
      - redis
    ports:
      - target: 514
        published: 514
        protocol: tcp
      - target: 514
        published: 514
        protocol: udp
    volumes:
      - "./librenms:/data"
    env_file:
      - "./librenms.env"
    environment:
      - "TZ=${TZ}"
      - "PUID=${PUID}"
      - "PGID=${PGID}"
      - "DB_HOST=db"
      - "DB_NAME=${MYSQL_DATABASE}"
      - "DB_USER=${MYSQL_USER}"
      - "DB_PASSWORD=${MYSQL_PASSWORD}"
      - "DB_TIMEOUT=60"
      - "SIDECAR_SYSLOGNG=1"
    restart: always

  snmptrapd:
    image: librenms/librenms:latest
    container_name: librenms_snmptrapd
    hostname: librenms-snmptrapd
    cap_add:
      - NET_ADMIN
      - NET_RAW
    depends_on:
      - librenms
      - redis
    ports:
      - target: 162
        published: 162
        protocol: tcp
      - target: 162
        published: 162
        protocol: udp
    volumes:
      - "./librenms:/data"
    env_file:
      - "./librenms.env"
    environment:
      - "TZ=${TZ}"
      - "PUID=${PUID}"
      - "PGID=${PGID}"
      - "DB_HOST=db"
      - "DB_NAME=${MYSQL_DATABASE}"
      - "DB_USER=${MYSQL_USER}"
      - "DB_PASSWORD=${MYSQL_PASSWORD}"
      - "DB_TIMEOUT=60"
      - "SIDECAR_SNMPTRAPD=1"
    restart: always

在 QTS 上,你可以用 /share/sharename/subfolder 來宣告你的共享資料夾

我通常這樣做(以 httpd 容器為例)


    volumes:
    - '/share/Web/webstage1:/usr/local/apache2/htdocs'

所以在這個例子中,我在我的共享資料夾 ‘Web’ 裡有一個名為 ‘webstage1’ 的資料夾

這個資料夾會在容器內掛載為 /usr/local/apache2/htdocs

如果你想讓它成為唯讀(例如你不希望容器編輯這些檔案),可以在最後加上 :ro


    volumes:
    - '/share/Web/webstage1:/usr/local/apache2/htdocs:ro'

所以那個資料夾就是在 QNAP docker 檔案系統「外部」的資料夾。那麼在這種情況下,我應該把它放在 /share/Container/LibreNMS,對嗎?

那麼,我需要安裝 MariaDB 嗎?我需要設定所有的密碼和資料庫等等嗎?

???

你需要對所有的卷(volumes)都這麼做

資料庫應該是 compose 套件的一部分,你唯一需要調整的,就是卷(volumes)和網路設定(如果你不想用 NAT,而是想用橋接模式等),以及你想更改的使用者名稱和密碼。

OK。所以我最後得到了這樣的 compose 檔案:

name: librenms

services:
  db:
    image: mariadb:10
    container_name: librenms_db
    command:
      - "mysqld"
      - "--innodb-file-per-table=1"
      - "--lower-case-table-names=0"
      - "--character-set-server=utf8mb4"
      - "--collation-server=utf8mb4_unicode_ci"
    volumes:
      - "/share/Container/LibreNMS/db:/var/lib/mysql"
    environment:
      - "TZ=${TZ}"
      - "MARIADB_RANDOM_ROOT_PASSWORD=yes"
      - "MYSQL_DATABASE=${MYSQL_DATABASE}"
      - "MYSQL_USER=${MYSQL_USER}"
      - "MYSQL_PASSWORD=${MYSQL_PASSWORD}"
    restart: always

  redis:
    image: redis:7.2-alpine
    container_name: librenms_redis
    environment:
      - "TZ=${TZ}"
    restart: always

  msmtpd:
    image: crazymax/msmtpd:latest
    container_name: librenms_msmtpd
    env_file:
      - "/share/Container/LibreNMS/msmtpd.env"
    restart: always

  librenms:
    image: librenms/librenms:latest
    container_name: librenms
    hostname: librenms
    cap_add:
      - NET_ADMIN
      - NET_RAW
    ports:
      - target: 8000
        published: 8000
        protocol: tcp
    depends_on:
      - db
      - redis
      - msmtpd
    volumes:
      - "/share/Container/LibreNMS:/data"
    env_file:
      - "/share/Container/LibreNMS/librenms.env"
    environment:
      - "TZ=${TZ}"
      - "PUID=${PUID}"
      - "PGID=${PGID}"
      - "DB_HOST=db"
      - "DB_NAME=${MYSQL_DATABASE}"
      - "DB_USER=${MYSQL_USER}"
      - "DB_PASSWORD=${MYSQL_PASSWORD}"
      - "DB_TIMEOUT=60"
    restart: always

  dispatcher:
    image: librenms/librenms:latest
    container_name: librenms_dispatcher
    hostname: librenms-dispatcher
    cap_add:
      - NET_ADMIN
      - NET_RAW
    depends_on:
      - librenms
      - redis
    volumes:
      - "/share/Container/LibreNMS:/data"
    env_file:
      - "/share/Container/LibreNMS/librenms.env"
    environment:
      - "TZ=${TZ}"
      - "PUID=${PUID}"
      - "PGID=${PGID}"
      - "DB_HOST=db"
      - "DB_NAME=${MYSQL_DATABASE}"
      - "DB_USER=${MYSQL_USER}"
      - "DB_PASSWORD=${MYSQL_PASSWORD}"
      - "DB_TIMEOUT=60"
      - "DISPATCHER_NODE_ID=dispatcher1"
      - "SIDECAR_DISPATCHER=1"
    restart: always

  syslogng:
    image: librenms/librenms:latest
    container_name: librenms_syslogng
    hostname: librenms-syslogng
    cap_add:
      - NET_ADMIN
      - NET_RAW
    depends_on:
      - librenms
      - redis
    ports:
      - target: 514
        published: 514
        protocol: tcp
      - target: 514
        published: 514
        protocol: udp
    volumes:
      - "/share/Container/LibreNMS:/data"
    env_file:
      - "/share/Container/LibreNMS/librenms.env"
    environment:
      - "TZ=${TZ}"
      - "PUID=${PUID}"
      - "PGID=${PGID}"
      - "DB_HOST=db"
      - "DB_NAME=${MYSQL_DATABASE}"
      - "DB_USER=${MYSQL_USER}"
      - "DB_PASSWORD=${MYSQL_PASSWORD}"
      - "DB_TIMEOUT=60"
      - "SIDECAR_SYSLOGNG=1"
    restart: always

  snmptrapd:
    image: librenms/librenms:latest
    container_name: librenms_snmptrapd
    hostname: librenms-snmptrapd
    cap_add:
      - NET_ADMIN
      - NET_RAW
    depends_on:
      - librenms
      - redis
    ports:
      - target: 162
        published: 162
        protocol: tcp
      - target: 162
        published: 162
        protocol: udp
    volumes:
      - "/share/Container/LibreNMS:/data"
    env_file:
      - "/share/Container/LibreNMS/librenms.env"
    environment:
      - "TZ=${TZ}"
      - "PUID=${PUID}"
      - "PGID=${PGID}"
      - "DB_HOST=db"
      - "DB_NAME=${MYSQL_DATABASE}"
      - "DB_USER=${MYSQL_USER}"
      - "DB_PASSWORD=${MYSQL_PASSWORD}"
      - "DB_TIMEOUT=60"
      - "SIDECAR_SNMPTRAPD=1"
    restart: always
    cap_add:
      - NET_ADMIN
      - NET_RAW
    ports:
      - target: 8000
        published: 8000
        protocol: tcp
    depends_on:
      - db
      - redis
      - msmtpd
    volumes:
      - "/share/Container/LibreNMS:/data"
    env_file:
      - "/share/Container/LibreNMS/librenms.env"
    environment:
      - "TZ=${TZ}"
      - "PUID=${PUID}"
      - "PGID=${PGID}"
      - "DB_HOST=db"
      - "DB_NAME=${MYSQL_DATABASE}"
      - "DB_USER=${MYSQL_USER}"
      - "DB_PASSWORD=${MYSQL_PASSWORD}"
      - "DB_TIMEOUT=60"
    restart: always

  dispatcher:
    image: librenms/librenms:latest
    container_name: librenms_dispatcher
    hostname: librenms-dispatcher
    cap_add:
      - NET_ADMIN
      - NET_RAW
    depends_on:
      - librenms
      - redis
    volumes:
      - "/share/Container/LibreNMS:/data"
    env_file:
      - "/share/Container/LibreNMS/librenms.env"
    environment:
      - "TZ=${TZ}"
      - "PUID=${PUID}"
      - "PGID=${PGID}"
      - "DB_HOST=db"
      - "DB_NAME=${MYSQL_DATABASE}"
      - "DB_USER=${MYSQL_USER}"
      - "DB_PASSWORD=${MYSQL_PASSWORD}"
      - "DB_TIMEOUT=60"
      - "DISPATCHER_NODE_ID=dispatcher1"
      - "SIDECAR_DISPATCHER=1"
    restart: always

  syslogng:
    image: librenms/librenms:latest
    container_name: librenms_syslogng
    hostname: librenms-syslogng
    cap_add:
      - NET_ADMIN
      - NET_RAW
    depends_on:
      - librenms
      - redis
    ports:
      - target: 514
        published: 514
        protocol: tcp
      - target: 514
        published: 514
        protocol: udp
    volumes:
      - "./librenms:/data"
    env_file:
      - "./librenms.env"
    environment:
      - "TZ=${TZ}"
      - "PUID=${PUID}"
      - "PGID=${PGID}"
      - "DB_HOST=db"
      - "DB_NAME=${MYSQL_DATABASE}"
      - "DB_USER=${MYSQL_USER}"
      - "DB_PASSWORD=${MYSQL_PASSWORD}"
      - "DB_TIMEOUT=60"
      - "SIDECAR_SYSLOGNG=1"
    restart: always

  snmptrapd:
    image: librenms/librenms:latest
    container_name: librenms_snmptrapd
    hostname: librenms-snmptrapd
    cap_add:
      - NET_ADMIN
      - NET_RAW
    depends_on:
      - librenms
      - redis
    ports:
      - target: 162
        published: 162
        protocol: tcp
      - target: 162
        published: 162
        protocol: udp
    volumes:
      - "/share/Container/LibreNMS:/data"
    env_file:
      - "/share/Container/LibreNMS/librenms.env"
    environment:
      - "TZ=${TZ}"
      - "PUID=${PUID}"
      - "PGID=${PGID}"
      - "DB_HOST=db"
      - "DB_NAME=${MYSQL_DATABASE}"
      - "DB_USER=${MYSQL_USER}"
      - "DB_PASSWORD=${MYSQL_PASSWORD}"
      - "DB_TIMEOUT=60"
      - "SIDECAR_SNMPTRAPD=1"
    restart: always

但是它產生了錯誤。在 GitHub repository 上,有一個 .env 檔案內容如下:

TZ=Europe/Paris
PUID=1000
PGID=1000

MYSQL_DATABASE=librenms
MYSQL_USER=librenms
MYSQL_PASSWORD=asupersecretpassword

我在這些變數上遇到錯誤。我猜我應該直接把這些值寫進 Compose 檔案裡嗎?

另外,他們還有另外兩個檔案:

librenms.env

MEMORY_LIMIT=256M
MAX_INPUT_VARS=1000
UPLOAD_MAX_SIZE=16M
OPCACHE_MEM_SIZE=128
REAL_IP_FROM=0.0.0.0/32
REAL_IP_HEADER=X-Forwarded-For
LOG_IP_VAR=remote_addr

CACHE_DRIVER=redis
SESSION_DRIVER=redis
REDIS_HOST=redis

LIBRENMS_SNMP_COMMUNITY=librenmsdocker

LIBRENMS_WEATHERMAP=false
LIBRENMS_WEATHERMAP_SCHEDULE=*/5 * * * *

以及 msmtpd.env

# https://github.com/crazy-max/docker-msmtpd
SMTP_HOST=smtp.gmail.com
SMTP_PORT=587
SMTP_TLS=on
SMTP_STARTTLS=on
SMTP_TLS_CHECKCERT=on
SMTP_AUTH=on
SMTP_USER=foo
SMTP_PASSWORD=bar
SMTP_FROM=foo@gmail.com

我是不是應該把這些檔案放在 /share/Container/LibreNMS 資料夾裡再 build 這個 app?是的,我知道我需要更改裡面的值。

我想我從來沒用過它們

但我認為你可以將它們綁定到 NAS 的某個使用者/群組

id admin(反正這通常是預設),如果你想的話

這會顯示 admin 的 PUID 和 GUID,如果你想用其他權限執行容器,請檢查你想用來執行的那個使用者的值

另請參閱

我想你可能誤解了我的問題……

我應該可以隨意創建任何用戶名/密碼。對於容器來說,它與 NAS 沒有任何關係。所以在 .env 檔案中,我可以把這些資訊寫進 compose 腳本裡。

我的疑問是該如何處理 librenms.env 和 msmtpd.env 這兩個檔案。

不知道,我從未建立過帶有環境變數的容器

我用過的容器都能在 compose 視窗中設定,並且配置檔案都放在共享資料夾裡。

抱歉

好的。那我來看看我能做些什麼! :smiley:

OK,所以 ContainerStation 在 Compose 檔案的 “cap_add:” 行這裡拋出了錯誤。你知道這是做什麼用的嗎?

      - "DB_PASSWORD=xxxxx"
      - "DB_TIMEOUT=60"
      - "SIDECAR_SNMPTRAPD=1"
    restart: always
    cap_add:
      - NET_ADMIN
      - NET_RAW
    ports:
      - target: 8000
        published: 8000
        protocol: tcp

這裡是我快速用 Google 找到的資料

如果這個出現錯誤,也許是在 QNAP 的 Docker 版本中尚未實作?

是啊,也許還沒實作?這很奇怪。

我在想要不要嘗試:

CAP_NET_ADMIN
CAP_NET_RAW

直接寫在 Compose 檔案裡。還是這肯定行不通?

當你省略它時會發生什麼?

否則你可以查閱 Compose 手冊

所以我的 compose 檔案有一個重大缺陷。我不小心在結尾重複貼上了一堆內容。那些 cap_add: 指令本身沒問題,在檔案的其他地方也能正常被接受。不知怎麼的,我把某些東西複製貼上了不只一次。

現在你必須在驗證 YAML 程式碼之前,先在你指定的目錄裡放好那些 .env 檔案。如果沒有,你就會遇到錯誤。

當一切都準備好並正確建置後,我現在已成功建立了應用程式,但它創建了 7 個容器,每個都有自己的 IP 位址。全部都使用 QNAP 在 Network and Virtual Switch 提供的 IP 範圍。我現在需要想辦法處理這些容器。是要把它們放到我的主網路上,還是就這樣放著。到目前為止,我還沒能打開 LibreNMS 或其他任何網頁。所以還需要再調查。不過好消息是,我已經讓它跑起來了……

Grrr。這東西看起來相當複雜……

這個應用程式不斷崩潰並重新啟動。這裡出現了一個錯誤……

以以下週期欄位建立 LibreNMS daily.sh 的 cron 任務:15 0 * * *
建立 LibreNMS cron artisan schedule:run
修正 crontabs 權限……
chmod: 正在變更 ‘/var/spool/cron/crontabs/librenms’ 的權限:位址錯誤

我猜 QNAP 不喜歡 /var 路徑。也許我需要把它映射到外部路徑?我沒辦法進入 shell 查看是否可存取,因為它崩潰並重啟得太快了。

打算嘗試把 /var 映射到外部……