การตั้งค่า Environment Variables (.env)
ในการนำ RawPush ไป Deploy เพื่อใช้งานจริง ไม่ว่าจะเป็นส่วนของ Backend หรือ Dashboard หัวใจสำคัญที่หลีกเลี่ยงไม่ได้เลยก็คือการตั้งค่า Environment Variables (ตัวแปรสภาพแวดล้อม)
หน้านี้จะอธิบายความแตกต่างของไฟล์ .env ที่คุณมักจะพบเจอ และรวบรวมตัวอย่างไฟล์ .env ฉบับสมบูรณ์ที่พร้อมก๊อปปี้ไปปรับใช้งานตอน Deploy ได้เลย
1. 📂 .env กับ .env.local ต่างกันอย่างไร?
ในการพัฒนาแอปพลิเคชัน (โดยเฉพาะฝั่ง Dashboard ที่ใช้ Next.js) คุณจะเจอกับไฟล์ที่ลงท้ายด้วย env หลายรูปแบบ:
.env.exampleไฟล์แม่แบบ โค้ดในนี้เป็นเพียงตัวอย่างและคำอธิบาย (ไม่มีรหัสผ่านจริง) ปกติจะถูกอัพขึ้น Git เพื่อให้ทีมรู้ว่าระบบต้องใช้ตัวแปรอะไรบ้าง.envตัวแปรสภาพแวดล้อม ค่าเริ่มต้น (Default) หากมีตัวแปรไหนที่ไม่เป็นความลับและสามารถใช้ร่วมกันได้ทุกคนในทีม มักจะตั้งไว้ที่นี่ (บางทีมอาจอัพขึ้น Git ได้ถ้าไม่มี Secret key).env.localตัวแปรสภาพแวดล้อม เฉพาะเครื่องของคุณ (Local Default) ปกติไฟล์นี้จะ ถูก Ignore จาก Git (ห้ามขึ้น Git เด็ดขาด!) คุณควรนำรหัสผ่านฐานข้อมูล, API Key ของจริง หรือ Secret Key ใส่ไว้ในไฟล์นี้ระหว่างทำการพัฒนาในเครื่องตัวเอง
💡 สรุปง่ายๆ: ตอน Dev บนเครื่องตัวเอง: เรามักใช้
.env.localใส่ข้อมูลความลับ ตอน Deploy บน Cloud (Vercel, Docker, VPS): เราจะไม่เอาไฟล์.envไปวาง แต่จะเอาบรรทัดต่างๆ ไปกรอกใส่ในช่อง Environment Variables บนหน้าเว็บตั้งค่าของ Server/Hosting นั้นๆแทน
2. ⚙️ ไฟล์ .env ฉบับเต็ม (พร้อม Deploy)
ทั้ง Backend รันบน Go และ Dashboard รันบน Next.js ต่างก็เป็น "บ้านแฝด" ที่ใช้ขุมพลังเบื้องหลังร่วมกัน (Database และ Redis ก้อนเดียวกัน) ดังนั้น ค่าหลายตัวต้องตรงกันเป๊ะๆ
นี่คือ Sample .env แบบจัดเต็ม แบ่งให้เห็นชัดเจน นำไปปรับค่าเล็กน้อยและ Deploy ได้เลย:
🟩 ส่วนที่ 1: ฝั่ง RawPush Backend
ตั้งค่าให้กับ Server Go ของคุณ ไม่ว่าจะรันผ่าน Docker หรือ VPS ห้ามลืมเปลี่ยนค่าที่เป็นความลับให้ยากต่อการเดา
# 1. โหมดระบบ (บังคับ Production ตอนขึ้นระบบจริง)
ENV=production
# 2. Ports สำหรับ Server
HTTP_PORT=8080
WS_PORT=8081
# 3. การเชื่อมต่อ ฐานข้อมูล & Redis (ของจริงเปลี่ยนแค่ User/Password/IP)
DATABASE_URL="postgresql://myapp:mysecretpassword@10.0.0.5:5432/websocket?sslmode=disable"
REDIS_URL="redis://:myredispassword@10.0.0.6:6379/0"
NATS_URL="nats://localhost:4222"
# 4. ความปลอดภัย (!!! สำคัญ ต้องตรงกับฝั่ง Dashboard !!!)
ADMIN_KEY="MyStrongSuperRandomAdminKeyHere123"
# สำคัญ: ENCRYPTION_KEY ต้องมีความยาว 64 ตัวอักษรเป๊ะ (32 bytes ในรูป hex)
ENCRYPTION_KEY="0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef"
# 5. ความปลอดภัย Web (CORS) อนุญาตหน้าเว็บไหนให้ต่อ WebSocket ได้บ้าง
WS_ALLOWED_ORIGINS=https://app.mydomain.com
API_ALLOWED_ORIGINS=https://app.mydomain.com🟦 ส่วนที่ 2: ฝั่ง RawPush Dashboard (Next.js)
ตั้งค่านี้ให้หน้าบ้านของคุณ (เช่น กรอกบน Vercel หรือ Docker Environment)
# 1. ฐานข้อมูลและ Redis (!!! ต้องเป็นก้อนเดียวกับ Backend ข้างบน !!!)
DATABASE_URL="postgresql://myapp:mysecretpassword@10.0.0.5:5432/websocket?sslmode=disable"
REDIS_URL="redis://:myredispassword@10.0.0.6:6379/0"
# 2. URL ระบบสำหรับติดต่อกันเองและแสดงผลให้ผู้ใช้
NEXT_PUBLIC_APP_URL="https://app.mydomain.com"
NEXT_PUBLIC_API_URL="https://api.mydomain.com/api/v1"
NEXT_PUBLIC_WS_URL="wss://ws.mydomain.com/ws"
# 3. URL ของ Go Backend แบบเจาะจงที่อยู่เครื่องภายใน (Internal IPs) แบบยิงตรง
# ถ้าลงใน Server ตัวเดียวกันชี้ไปที่ localhost ได้เลย
GO_API_URL="http://10.0.0.10:8080"
GO_REALTIME_URL="http://10.0.0.10:8081"
# 4. ความปลอดภัย (!!! สำคัญ ต้องตรงกับฝั่ง Backend !!!)
ADMIN_KEY="MyStrongSuperRandomAdminKeyHere123"
ENCRYPTION_KEY="0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef"
# 5. บริการส่งรหัสผ่าน/ยินยันอีเมล (Resend.com)
RESEND_API_KEY="re_YourResendApiKey"
EMAIL_APP_NAME="RawPush"
EMAIL_APP_URL="https://app.mydomain.com"
EMAIL_FROM="noreply@mydomain.com"
EMAIL_BRAND_COLOR="#2563eb"
# 6. กุญแจกันสแปม Cloudflare Turnstile (Captcha)
# หาขอได้ฟรีจาก Cloudflare แนะนำให้ใส่เพื่อป้องกันเว็บล่มจากการโดนยิงสมัคร
NEXT_PUBLIC_TURNSTILE_SITE_KEY="0x4AAAAAAAPxxxxxx_"
TURNSTILE_SECRET_KEY="0x4AAAAAAAPxxxxxxxxxxxxxxxxxxxx_"⚠️ เช็คลิสต์ 3 ข้อก่อน Deploy
- คีย์ต้องเหมือนกัน: โปรดเอาไม้บรรทัดมาเทียบว่า
DATABASE_URL,REDIS_URL,ADMIN_KEY, และENCRYPTION_KEYของ Backend และ Dashboard เหมือนกันทุกตัวอักษร หากไม่ตรง ระบบจะไม่สามารถอ่านข้อมูลถึงกันได้ หรือเกิดการถอดรหัสความลับผิดพลาด - อย่าเผลอเปิด Allow All Origins: ในฝั่ง Backend ส่วน
WS_ALLOWED_ORIGINSอย่าเว้นว่างไว้ตอนทำ Production เพราะจะเป็นการเปิดให้ใครก็ได้เอาโค้ดไปรันที่คอมฯตัวเองและต่อหน้าบ้านคุณ NEXT_PUBLIC_หลุดออกไปที่ Browser เสมอ: จำไว้ว่าตัวแปรที่นำหน้าด้วยNEXT_PUBLIC_ในฝั่ง Dashboard จะเผยแพร่ออกไปที่ Browser ทั้งสิ้น ห้ามเอารหัสผ่าน Secret อะไรมาไว้ตรงนี้เด็ดขาด
