คำตอบสั้น ๆ: ติดตั้ง Odoo ระบบ ERP โอเพนซอร์สบนเซิร์ฟเวอร์ของตัวเอง พร้อมตั้งค่าที่จำเป็นสำหรับใช้งานจริง ทั้ง SSL การสำรองข้อมูล และการติดตั้งโมดูลเพิ่ม
คู่มือนี้อธิบาย Docker ทีละขั้นตอน พร้อมคำสั่งที่ใช้ได้จริงและปัญหาที่พบบ่อย
Odoo เป็นระบบ ERP โอเพนซอร์สที่ครอบคลุมทั้งการขาย คลังสินค้า บัญชี และงานบุคคล การติดตั้งบนเซิร์ฟเวอร์ของตัวเองทำให้ไม่มีค่าใช้จ่ายรายผู้ใช้ต่อเดือน และปรับแต่งได้เต็มที่
คู่มือนี้ติดตั้งรุ่น Community ด้วย Docker Compose พร้อมการตั้งค่าด้านความปลอดภัยที่จำเป็นก่อนใช้งานจริง โดยเฉพาะการปิดหน้าจัดการฐานข้อมูลซึ่งเป็นช่องโหว่ที่พบบ่อยที่สุด
สิ่งที่ต้องเตรียม
- Cloud VPS ที่มี RAM อย่างน้อย 4 GB สำหรับผู้ใช้ไม่เกิน 20 คน
- โดเมนที่ชี้มาที่เซิร์ฟเวอร์
- Docker และ Docker Compose
ขั้นตอนที่ 1: เตรียมไฟล์
sudo mkdir -p /opt/odoo/{config,addons,data,db}
sudo chown -R 101:101 /opt/odoo/{addons,data}
cd /opt/odoo
sudo nano .env
POSTGRES_USER=odoo
POSTGRES_PASSWORD=รหัสผ่านที่ยาวและสุ่ม
POSTGRES_DB=postgres
ADMIN_PASSWORD=รหัสผ่านหลักของ Odoo
sudo chmod 600 .env
sudo nano config/odoo.conf
[options]
addons_path = /mnt/extra-addons
data_dir = /var/lib/odoo
; รหัสผ่านหลัก ใช้สร้างและลบฐานข้อมูล ต้องยาวและเก็บเป็นความลับ
admin_passwd = รหัสผ่านหลักของ Odoo
; ปิดหน้าจัดการฐานข้อมูลหลังติดตั้งเสร็จ สำคัญมาก
list_db = False
; จำนวน worker คำนวณจาก (คอร์ * 2) + 1
workers = 5
max_cron_threads = 2
; จำกัดหน่วยความจำต่อ worker
limit_memory_soft = 640000000
limit_memory_hard = 768000000
limit_time_cpu = 600
limit_time_real = 1200
; proxy
proxy_mode = True
sudo nano docker-compose.yml
services:
db:
image: postgres:16-alpine
restart: unless-stopped
environment:
POSTGRES_USER: ${POSTGRES_USER}
POSTGRES_PASSWORD: ${POSTGRES_PASSWORD}
POSTGRES_DB: ${POSTGRES_DB}
PGDATA: /var/lib/postgresql/data/pgdata
volumes:
- ./db:/var/lib/postgresql/data
healthcheck:
test: ["CMD-SHELL", "pg_isready -U ${POSTGRES_USER}"]
interval: 10s
retries: 5
odoo:
image: odoo:17
restart: unless-stopped
depends_on:
db:
condition: service_healthy
ports:
- "127.0.0.1:8069:8069"
- "127.0.0.1:8072:8072"
volumes:
- ./config:/etc/odoo
- ./addons:/mnt/extra-addons
- ./data:/var/lib/odoo
environment:
HOST: db
USER: ${POSTGRES_USER}
PASSWORD: ${POSTGRES_PASSWORD}
TZ: Asia/Bangkok
sudo docker compose up -d
sudo docker compose logs -f odoo
พอร์ต 8072 คือช่องทาง longpolling ที่ใช้สำหรับการแจ้งเตือนและแชทในตัว Odoo จำเป็นเมื่อตั้ง workers มากกว่า 0
ขั้นตอนที่ 2: ตั้ง Nginx และ SSL
sudo nano /etc/nginx/sites-available/odoo
upstream odoo { server 127.0.0.1:8069; }
upstream odoochat { server 127.0.0.1:8072; }
server {
listen 80;
server_name erp.example.com;
client_max_body_size 200M;
proxy_read_timeout 720s;
proxy_connect_timeout 720s;
proxy_send_timeout 720s;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
location /websocket {
proxy_pass http://odoochat;
proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection "upgrade";
}
location / {
proxy_pass http://odoo;
proxy_redirect off;
}
# ไฟล์คงที่ แคชได้ยาว
location ~* /web/static/ {
proxy_pass http://odoo;
proxy_cache_valid 200 90m;
expires 90d;
}
gzip on;
gzip_types text/css text/plain application/javascript application/json;
}
sudo ln -s /etc/nginx/sites-available/odoo /etc/nginx/sites-enabled/
sudo nginx -t && sudo systemctl reload nginx
sudo certbot --nginx -d erp.example.com --agree-tos -m [email protected] --redirect
ขั้นตอนที่ 3: สร้างฐานข้อมูลแรก
ชั่วคราวให้เปิด list_db = True ก่อน แล้วรีสตาร์ต เข้าหน้าเว็บจะเห็นหน้าสร้างฐานข้อมูล
- Master Password ใส่ตามที่ตั้งใน
admin_passwd - Database Name ตั้งชื่อ เช่น
production - Language เลือก Thai
- Country เลือก Thailand เพื่อให้ผังบัญชีและภาษีถูกตั้งตามกฎหมายไทย
- ไม่ต้องติ๊ก Demo data สำหรับฐานข้อมูลที่จะใช้งานจริง เพราะลบข้อมูลตัวอย่างออกภายหลังยากมาก
เมื่อสร้างเสร็จแล้วกลับไปตั้ง list_db = False ทันที แล้วรีสตาร์ต
sudo sed -i 's/^list_db = True/list_db = False/' /opt/odoo/config/odoo.conf
sudo docker compose restart odoo
หน้าจัดการฐานข้อมูลที่เปิดทิ้งไว้ทำให้ใครก็ตามที่เดารหัสผ่านหลักได้ สามารถลบฐานข้อมูลทั้งหมดหรือดาวน์โหลดข้อมูลไปได้