From 808233191ddaf972b4aef7641de3087ab3a96a67 Mon Sep 17 00:00:00 2001 From: Your Name Date: Fri, 16 Oct 2026 13:28:04 +0700 Subject: [PATCH] fix(docker): copy public/ into production image MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit taskpane wordaddin พังใน production — "โหลด Office.js ไม่สำเร็จ" เพราะ browser ยิง /docedit/wordaddin/office-js/office.js ได้ 404: image ไม่มี public/wordaddin อยู่เลย สาเหตุ: Next 14.2 standalone ไม่ copy public/ เอง (comment เดิมใน Dockerfile เข้าใจผิด) — ไฟล์ static ที่เคยใช้ได้หลุดเข้า image แบบ บังเอิญผ่าน output file tracing ที่ตาม fs.readFile ใน server code (public/note จาก lib/server-pdf.ts, ฟอนต์ Sarabun จาก export route) แต่ public/wordaddin/** ไม่มี server code ไหนอ่านผ่าน fs จึงไม่ถูก ดึงมา แก้: เพิ่ม COPY --from=builder /app/public ./public ใน runner stage ตามเอกสาร deploy ของ Next + แก้ comment Dockerfile และ docs/WORDADDIN-DEV.md ให้เล่ากลไกจริง ยืนยันด้วยการ build image ใหม่แล้วรัน container จริง: office.js / manifest.xml / word-win32-16.01.js / th-th strings / pdf.worker ทุก URL ตอบ 200 Co-Authored-By: Claude Code --- docker/web.Dockerfile | 8 ++++++-- docs/WORDADDIN-DEV.md | 2 +- 2 files changed, 7 insertions(+), 3 deletions(-) diff --git a/docker/web.Dockerfile b/docker/web.Dockerfile index 016f1a1..38f1602 100644 --- a/docker/web.Dockerfile +++ b/docker/web.Dockerfile @@ -33,10 +33,14 @@ ENV NODE_ENV=production \ PORT=3000 \ HOSTNAME=0.0.0.0 RUN addgroup -S nodejs && adduser -S nextjs -G nodejs -# Next 14.2 รวม public/ (pdf.worker, ฟอนต์ Sarabun, samples PDF) ไว้ใน standalone แล้ว -# แต่ไม่รวม .next/static (JS chunks) — ต้องคัดลอกเพิ่ม ไม่งั้นหน้าเว็บไม่มี JS +# Next 14.2 standalone **ไม่รวม public/ และ .next/static เอง** — ต้องคัดลอกเองทั้งคู่ +# (ก่อนหน้านี้เข้าใจผิดว่า Next รวม public/ ให้: จริง ๆ มันหลุดเข้ามาแค่บางส่วนผ่าน output +# file tracing ที่ตาม fs.readFile ของ server code (public/note จาก lib/server-pdf.ts, +# ฟอนต์ Sarabun จาก export route) — public/wordaddin/office-js ไม่มีใครอ่านผ่าน fs +# จึงไม่ถูกดึงมา แล้ว taskpane พังใน production 2026-10-16) COPY --from=builder --chown=nextjs:nodejs /app/.next/standalone ./ COPY --from=builder --chown=nextjs:nodejs /app/.next/static ./.next/static +COPY --from=builder --chown=nextjs:nodejs /app/public ./public # migration: ไฟล์ SQL (drizzle-kit generate) + runner — รันตอน container start COPY --from=builder --chown=nextjs:nodejs /app/drizzle ./drizzle COPY --from=builder --chown=nextjs:nodejs /app/scripts ./scripts diff --git a/docs/WORDADDIN-DEV.md b/docs/WORDADDIN-DEV.md index b77db8d..5baa0f4 100644 --- a/docs/WORDADDIN-DEV.md +++ b/docs/WORDADDIN-DEV.md @@ -60,6 +60,6 @@ Deploy จริง (intranet): rewrite URL ทุกตัวใน manifest ## Docker -ไม่ต้องทำอะไรเพิ่ม — `docker/web.Dockerfile` รัน `scripts/fetch-office-js.mjs` ใน build อยู่แล้ว (build stage ต้องออกอินเทอร์เน็ตถึง `appsforoffice.microsoft.com` ได้) และ Next รวม `public/` ไว้ใน standalone อัตโนมัติ +ไม่ต้องทำอะไรเพิ่ม — `docker/web.Dockerfile` รัน `scripts/fetch-office-js.mjs` ใน build อยู่แล้ว (build stage ต้องออกอินเทอร์เน็ตถึง `appsforoffice.microsoft.com` ได้) และ runner stage คัดลอก `public/` เข้า image เอง (`COPY /app/public ./public` — **Next 14.2 standalone ไม่รวม `public/` ให้อัตโนมัติ** ต้อง copy เองตามเอกสาร deploy ของ Next; เคยเข้าใจผิดว่า Next รวมให้ เพราะบางไฟล์หลุดเข้า image ผ่าน output file tracing ของ Next ที่ตาม `fs.readFile` ใน server code — แต่ `public/wordaddin/office-js` ไม่มีใครอ่านผ่าน fs จึงไม่ถูกดึงมา แล้ว taskpane พังใน production 2026-10-16) > ทำไมต้องเป็นฉบับ CDN ล่าสุด: แพ็กเกจ npm `@microsoft/office-js` เลิกอัปเดตที่ 1.1.110 (~2018) ก่อน WordApi 1.4/1.5 — runtime ตัวนั้นไม่มี `Document.close` (ปุ่ม "บันทึกเวอร์ชันและปิดเอกสาร" พัง: `context.document.close is not a function`) และไม่มี enum `Word.CloseBehavior`/`SaveBehavior` ทับ ๆ กับ `@types/office-js` ฉบับใหม่ที่ใช้ compile