Bỏ qua để đến nội dung

Troubleshooting

10 case lỗi phổ biến team test/triển khai gặp phải. Mỗi case: triệu chứng + nguyên nhân + cách fix.

Triệu chứng: User login OK, làm 5-10 phút thì bị kick về login. Hoặc click action báo “Session expired”.

Nguyên nhân:

  • Cookie session bị reset do browser xóa cache
  • Multi-instance Odoo không share session (cần sticky session ở nginx/cloudflare)
  • Server time mismatch nhiều hơn 5 phút với browser

Fix:

Terminal window
# Check time sync
ntpdate -q time.google.com
# Nginx sticky session
upstream odoo {
ip_hash; # Sticky theo IP
server odoo1:8069;
server odoo2:8069;
}

Triệu chứng: User click menu báo “You don’t have access to this view”.

Nguyên nhân: ACL ir.model.access.csv chưa grant đủ model cho group user.

Fix: Settings → Users & Companies → Users → check group đã assign. Hoặc dev mode → Technical → ACL list → search model bị thiếu.

Ví dụ: User group re_loan.group_loan_user cần access account.tax, account.account.tag, res.partner.bank để mở form HĐ NH.

Triệu chứng: Browser load page hiện blank, F12 Console báo lỗi JS.

Nguyên nhân:

  • Asset bundle stale (cache cũ sau deploy code mới)
  • View XML có lỗi syntax (xpath không match)
  • Module dependency bị thiếu

Fix:

Terminal window
# Xoá asset cache trong DB
docker compose exec -T db psql -U odoo -d dev -c \
"DELETE FROM ir_attachment WHERE name LIKE '%web.assets%';"
# Restart Odoo
docker compose restart odoo
# Browser Cmd+Shift+R hard refresh

Triệu chứng: Tạo record mới báo IntegrityError: duplicate key value violates unique constraint.

Nguyên nhân:

  • Sequence reset thủ công sai
  • Restore backup làm sequence pointer lệch

Fix:

-- Reset sequence dựa trên max ID hiện có
SELECT setval('rp_contract_id_seq',
(SELECT MAX(id) FROM rp_contract) + 1);

Triệu chứng: Cron schedule đã set nhưng tới giờ không trigger.

Nguyên nhân:

  • Cron worker không running (docker compose thiếu --workers)
  • Cron bị active=False
  • Cron last execution stuck

Fix:

Terminal window
# Check cron worker
docker compose logs odoo | grep -i cron
# Verify cron active in Settings → Technical → Scheduled Actions
# Reset stuck cron:
UPDATE ir_cron SET active=true WHERE id=X;
UPDATE ir_cron SET nextcall=NOW() WHERE id=X;

Triệu chứng: Cron generate báo cáo OK, log “Email sent” nhưng inbox không nhận.

Nguyên nhân:

  • SMTP config sai
  • Email gửi vào spam folder
  • DNS SPF/DKIM/DMARC chưa setup

Fix:

  1. Settings → Technical → Outgoing Mail Servers → Test connection
  2. Mail queue: Settings → Technical → Email → Emails — check state failed + lý do
  3. SPF: thêm domain Odoo server vào DNS TXT record
  4. Test với mailtrap.io trước khi switch sang SMTP prod

Triệu chứng: Click “Export Excel” báo lỗi 500 hoặc download file 0 byte.

Nguyên nhân:

  • Large dataset (hơn 50K rows) — Odoo timeout
  • Field có ký tự special không escape
  • Worker timeout proxy_read_timeout quá thấp

Fix:

nginx.conf
proxy_read_timeout 300s;
proxy_send_timeout 300s;

Filter dataset nhỏ hơn (theo project + thời gian) trước khi export. Hoặc dùng API JSON + xử lý phía client.

Triệu chứng: Sau deploy code mới, UI vẫn hiện feature cũ. Hard refresh không khắc phục.

Nguyên nhân: Browser hold cached assets từ old asset bundle hash.

Fix: User mở Chrome DevTools → Network tab → check “Disable cache” → reload. Hoặc trong Odoo:

# Bump asset version (force browser re-download)
env['ir.attachment'].search([('name','like','%web.assets%')]).unlink()

Triệu chứng: Random báo OperationalError: server closed the connection unexpectedly.

Nguyên nhân:

  • Connection pool exhausted
  • DB restart trong khi Odoo còn connection
  • Network glitch (Docker bridge)

Fix: Odoo.conf:

[options]
db_maxconn = 64
limit_time_cpu = 600
limit_time_real = 1200

Restart Odoo container.

Triệu chứng: List view 10K+ records load hơn 30 giây. Report cross-module timeout.

Nguyên nhân:

  • Field computed not stored
  • Missing index
  • N+1 query problem trong compute

Fix:

  1. Profile với Odoo dev tools: query log → tìm slow query
  2. Add index cho field thường filter:
class Foo(models.Model):
project_id = fields.Many2one('re.project', index=True)
state = fields.Selection(..., index=True)
  1. Store computed field nếu được:
amount_total = fields.Monetary(compute='_compute', store=True)
  1. Convert compute từ Python loop sang SQL aggregate:
self.env.cr.execute("""
SELECT contract_id, SUM(amount) FROM milestone GROUP BY contract_id
""")
Chia sẻ: