🔍 Vấn Đề Gặp Phải
Gần đây, một trong các website Odoo của mình đột nhiên bị lỗi giao diện sau khi nâng cấp version. Mọi thứ trông rối tung: giao diện mất style, JavaScript không hoạt động. Sau khi kiểm tra log và server, mình phát hiện lỗi chính:
FileNotFoundError: [Errno 2] No such file or directory: '/var/lib/odoo/odoo-data/filestore/re-cloud-website/27/27ab4bc01c7f509cdbf4ea8b81dce1ce766c8145'
Odoo cũng trả về lỗi 500 Internal Server Error khi cố gắng tải:
/web/assets/1/8c95773/web.assets_frontend.min.css
🧠 Nguyên Nhân Chính
Có hai lý do chính gây ra sự cố này:
1. Frontend Asset Bundles chưa tải đầy đủ
Giao diện website của Odoo phụ thuộc nhiều vào các file JS và CSS được biên dịch sẵn (ví dụ như web.assets_frontend). Nếu các gói này bị thiếu hoặc bị lỗi, website sẽ hiển thị sai hoàn toàn.
2. Xung Đột Attachment Trong Filestore
Odoo lưu các tài sản frontend dưới dạng ir.attachment trong cơ sở dữ liệu, và file nhị phân được lưu trong thư mục filestore. Khi Odoo tái tạo các gói này, nó có thể phát hiện ra file cũ đã tồn tại và không ghi đè được, đặc biệt nếu có vấn đề về checksum hoặc quyền truy cập.
Trong trường hợp của mình, lỗi xảy ra ở hai file:
- web.assets_frontend.css
- web.assets_frontend_minimal.js
Mặc dù quá trình tạo lại tài sản hoàn tất, nhưng file không được lưu hoặc không thể truy cập được — có thể do xung đột file hoặc file bị thiếu
🛠️ Cách khắc phục
Đây là những bước mình đã thực hiện để xử lý sự cố:
1. Tái Tạo Các File Asset
Tất cả các tài sản frontend đều được lưu trong bảng ir.attachment. Mình đã xoá các bản ghi asset cũ để buộc Odoo tạo lại.
Chạy câu lệnh SQL sau: (⚠️ nhớ sao lưu database trước nhé):
DELETE FROM ir_attachment WHERE url LIKE '/web/assets/%';
Nếu bạn muốn chạy bằng python (Version 18):
def regenerate_assets_bundles(self):
self.search([
('public', '=', True),
("url", "=like", "/web/assets/%"),
('res_model', '=', 'ir.ui.view'),
('res_id', '=', 0),
('create_uid', '=', SUPERUSER_ID),
]).unlink()
self.env.registry.clear_cache('assets')
model: ir.attachment
Sau đó khởi động lại Odoo hoặc đơn giản hơn chuyển sang mode debug=assets. Nó sẽ tự tạo lại các file bị thiếu.
2. Nâng cấp module web (nếu vẫn còn tồn đọng cache)
Dù đã xoá attachment, vẫn có thể còn cache tồn đọng. Mình chạy lệnh upgrade cho module web để xoá sạch cache frontend và buộc tái tạo tài sản:
./odoo-bin -d your_db_name -u web
Hoặc bạn có thể bấm nút Upgrade cho module web trên phần mềm
Đây là cách hiệu quả nhất nếu việc xoá attachment không giải quyết được nhưng không khuyến khích sử dụng giải pháp này thay cho bước 1.
🚀 Mẹo Thêm: Kiểm Tra Quyền Truy Cập
Đảm bảo user chạy Odoo có quyền đọc/ghi trong thư mục filestore. Nếu không, Odoo sẽ không thể ghi file và phát sinh lỗi như trên.
📌 Kết luận
Nếu giao diện website Odoo của bạn bỗng dưng "sập":
- Kiểm tra log để xem có thiếu file nào không
- Xoá các bản ghi ir.attachment liên quan đến assets
- Nâng cấp module web để xoá cache và rebuild lại frontend
Đây là loại lỗi khá thường gặp, đặc biệt sau khi backup, khôi phục hoặc nâng cấp hệ thống.
Theo dõi thêm nhiều mẹo hữu ích khác tại GreenSpaxe nhé!