Docker App Config 協助 InvoiceNinja

OK 各位,

我正在嘗試讓另一個容器運作。我想探索 InvoiceNinja,看看是否適合我的業務。我已經讓容器及其支援應用程式運行起來,但我無法存取它。我已在 InvoiceNinja 論壇尋求協助,他們已告訴我所有他們知道的內容……但還是無法運作。他們建議我來這裡問問。所以也許你們這些 Compose 專家可以幫我找出我做錯了什麼……

這是我的 compose 檔案:

services:
  app:
    build:
      context: .
    image: invoiceninja/invoiceninja-debian:latest
    restart: unless-stopped
    env_file:
      - /share/Container/invoiceninja/.env
    environment:
      - PUID=1000
      - PGID=1000
      - TZ=America/Chicago
    volumes:
      # - ./php/php.ini:/usr/local/etc/php/conf.d/invoiceninja.ini:ro
      # - ./php/php-fpm.conf:/usr/local/etc/php-fpm.d/invoiceninja.conf:ro
      # - ./supervisor/supervisord.conf:/etc/supervisor/conf.d/supervisord.conf:ro
      - /share/Container/invoiceninja/public:/var/www/html/public
      - /share/Container/invoiceninja/storage:/var/www/html/storage
    depends_on:
      mysql:
        condition: service_healthy
      redis:
        condition: service_healthy

  nginx:
    image: nginx:alpine
    restart: unless-stopped
    ports:
      - "8012:80"
    volumes:
      - ./share/Container/invoiceninja/nginx:/etc/nginx/conf.d:ro
      - /share/Container/invoiceninja/public:/var/www/html/public:ro
      - /share/Container/invoiceninja/storage:/var/www/html/storage:ro
    depends_on:
      app:
        condition: service_healthy

  mysql:
    image: mysql:8
    restart: unless-stopped
    environment:
      MYSQL_DATABASE: ${DB_DATABASE}
      MYSQL_USER: ${DB_USERNAME}
      MYSQL_PASSWORD: ${DB_PASSWORD}
      MYSQL_ROOT_PASSWORD: ${DB_ROOT_PASSWORD}
    volumes:
      - /share/Container/invoiceninja/mysql_data:/var/lib/mysql
    healthcheck:
      test:
        [
          "CMD",
          "mysqladmin",
          "ping",
          "-h",
          "localhost",
          "-u${MYSQL_USER}",
          "-p${MYSQL_PASSWORD}",
        ]

  redis:
    image: redis:alpine
    restart: unless-stopped
    volumes:
      - /share/Container/invoiceninja/redis_data:/data
    healthcheck:
      test: ["CMD", "redis-cli", "ping"]

由於這個應用程式使用 .env 檔案,這是該檔案(部分資訊已遮蔽):

# IN application vars
APP_URL=http://192.168.0.3:8012
APP_KEY=base64:7some_key_code
APP_ENV=production
APP_DEBUG=true
REQUIRE_HTTPS=false
PHANTOMJS_PDF_GENERATION=false
PDF_GENERATOR=snappdf
TRUSTED_PROXIES='*'


CACHE_DRIVER=redis
QUEUE_CONNECTION=redis
SESSION_DRIVER=redis

REDIS_HOST=redis
REDIS_PASSWORD=null
REDIS_PORT=6379

FILESYSTEM_DISK=debian_docker

# DB connection
DB_HOST=mysql
DB_PORT=3306
DB_DATABASE=ninja
DB_USERNAME=ninja
DB_PASSWORD=*******
DB_ROOT_PASSWORD=********
DB_CONNECTION=mysql

# Create initial user
# Default to these values if empty
IN_USER_EMAIL=admin@example.com
IN_PASSWORD=changeme!
# IN_USER_EMAIL=
# IN_PASSWORD=

# Mail options
MAIL_MAILER=log
MAIL_HOST=smtp.mailtrap.io
MAIL_PORT=2525
MAIL_USERNAME=null
MAIL_PASSWORD=null
MAIL_ENCRYPTION=null
MAIL_FROM_ADDRESS='user@example.com'
MAIL_FROM_NAME='Self Hosted User'

# MySQL
MYSQL_ROOT_PASSWORD=*****
MYSQL_USER=ninja
MYSQL_PASSWORD=*****
MYSQL_DATABASE=ninja

# GoCardless/Nordigen API key for banking integration
NORDIGEN_SECRET_ID=
NORDIGEN_SECRET_KEY=

IS_DOCKER=true
SCOUT_DRIVER=null
#SNAPPDF_CHROMIUM_PATH=/usr/bin/google-chrome-stable

所以它啟動了,但如我所說——我無法存取網站。網頁無法顯示。在 InvoiceNinja 論壇,有位用戶協助我時說了以下內容:

3. 檢查 Nginx 設定
你有一個 Nginx 的 volume 映射:- ./nginx:/etc/nginx/conf.d:ro

  • 確保該資料夾內的設定檔正確指向內部的 app 服務(通常如果用 FPM 是 9000 port,如果用 web-server variant 是 8000 port)。
  • 如果你使用標準的 Invoice Ninja docker-compose 範例,確保 fastcgi_pass 設為 app:9000

所以我把 ./nginx:/etc/nginx/conf.d:ro 改成 ./share/Container/invoiceninja/nginx:/etc/nginx/conf.d:ro

然而,那個資料夾並沒有被建立,如果我進去檢查 Nginx 容器,我發現 etc/nginx/conf.d 其實被映射到 /share/ZFS530_DATA/.qpkg/container-station/data/application/invoiceninja/share/Container/invoiceninja/nginx

為什麼 QNAP 沒有按照我的指示,把容器映射到我要求的儲存位置?我不知道這是否能解決我的問題,但我想看看那個設定檔並且能更好地控制它。

而且當我用 SSH shell 進去那個目錄時,裡面什麼都沒有。所以 Nginx 沒有任何設定檔……

大家還有看到我這裡可能有什麼問題嗎?

你為什麼有時候使用相對路徑,有時候又用絕對路徑來掛載某些卷(volume)?

嗯?我所有地方都用了 /share/Container/invoiceninja。我哪裡沒用到呢?

那不是絕對路徑嗎?

還有,對,我應該去看那個影片……

volumes:
      - ./share/Container/invoiceninja/nginx:/etc/nginx/conf.d:ro
      - /share/Container/invoiceninja/public:/var/www/html/public:ro
      - /share/Container/invoiceninja/storage:/var/www/html/storage:ro

一個有「點」,兩個沒有

哦,還有看看影片,如何在卷的路徑名中出現 ZFSxx,普通的 share/xxx 只適用於 QTS

是的,我剛剛自己也看到了。那是一個打字錯誤……

本來不應該有那個點。

剛剛已將備註添加到上方的 ZFS 路徑名稱和 QuTS。

首先,原始的 YAML 檔案有一個點,我更改了路徑名稱但沒注意到:

    volumes:
      - ./nginx:/etc/nginx/conf.d:ro
      - app_public:/var/www/html/public:ro
      - app_storage:/var/www/html/storage:ro

在 QuTS 中使用 /share/Container/.... 絕對沒問題。我所有容器都是這麼用的……

現在,我確實有 /share/Container/nginx 資料夾,但裡面什麼都沒有……

咦,我以前總是必須在路徑名稱中加入 ZFSxx_DATA,否則就無法運作。

但是上面的程式碼現在沒有任何卷(volumes)的路徑名稱,這樣對嗎?

我沒有像那樣建立獨立的卷,而是直接加入完整的路徑名稱。

不過沒錯,你也可以這樣做:

/share/SharedFolderName 在 QuTS 中。

這樣對所有情境都適用……

我也不知道發生了什麼事,因為在最近一次嘗試重建/重啟應用程式後,現在它完全無法運行了。

唉……

我建議你直接把環境變數寫進 compose 檔案裡。CS 其實不太支援 .env 檔案,這可能就是你遇到問題的原因。

任何有用到 .env 的 docker,我都是直接把細節寫在 compose 裡,這樣對我來說都能正常運作。

我也在想這個問題。這有點奇怪,因為 .env 檔案必須存在,Compose 檔案才能通過「檢查」測試,但看起來 CS 從那個檔案讀取的內容,頂多只能說是不太一致……

好吧,那我就試著把所有東西都加到 Compose 檔案裡吧……