services: app: # 拿掉基底的 GHCR 映像名:e2e 一律從原始碼 build,且產物維持叫 knotebook-e2e-app,不覆寫本機 # ghcr.io/sw-willie-wu/knotebook:latest(同一台機器上另一個 compose 專案用的是那個標籤)。 image: !reset null env_file: !override [] environment: DATABASE_URL: postgres://knotebook:knotebook@db:5432/knotebook APP_SECRET: "0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef" PUBLIC_URL: http://localhost:3100 ADMIN_EMAIL: admin@e2e.local ADMIN_PASSWORD: e2e-admin-password KNOTEBOOK_E2E_TEST_HOOKS: "1" # #272:自動存版等待可壓成秒(PUBLIC_URL 是 localhost 才生效;只給 e2e 疊) ports: !override - "127.0.0.1:3100:3000" db: scale: 1 # 同理顯式釘死:基底的 ${BUNDLED_DB:-1} 也讀 .env/shell——誰設了 BUNDLED_DB=0,e2e 疊就沒有 db environment: POSTGRES_PASSWORD: knotebook # 顯式釘死:基底的 ${POSTGRES_PASSWORD:-knotebook} 插值會讀 .env/shell—— # 誰設過該變數,db 就用新密碼初始化而 app 連舊密碼 fake-idp: build: { context: ./e2e, dockerfile: Dockerfile.stub } command: ["node", "stubs/fake-idp.mjs"] ports: - "127.0.0.1:9400:9400" # 瀏覽器經 host-resolver-rules 打進來;control endpoint 也走這 ai-stub: build: { context: ./e2e, dockerfile: Dockerfile.stub } command: ["node", "stubs/ai-stub.mjs"] # 只有 app 容器需要打它,不發布 host port