Odoo V15迁移至新Proxmox后出现500内部服务器错误
Odoo 15公网访问500错误(本地IP正常):附件冲突问题解决指南
问题背景
- 环境:Odoo 15,从雷击损坏的Proxmox服务器迁移至新节点
- 异常现象:通过本地IP
192.168.5.100访问网站及后台完全正常,但公网访问时触发500 Internal Server Error - 错误日志核心:
KeyError最终抛出UserError: "The attachment is colliding with an existing file" - 已排查操作:重装模板、检查网络/代理/SSL配置、确认
web.base.url参数设置,均未解决问题
问题根源
Odoo的附件存储路径是通过请求域名(或web.base.url)的SHA1哈希值生成的。迁移后,公网域名与原本地IP对应的哈希路径前缀重复,导致Odoo处理公网请求时,试图访问的附件路径已被本地IP对应的附件占用,触发文件碰撞错误。
解决方案
1. 批量更新附件存储路径与文件系统
步骤1:备份数据(必须操作)
先全量备份Odoo数据库和附件存储目录,避免数据丢失。
步骤2:计算哈希前缀
登录Odoo数据库执行SQL,分别获取本地IP和公网域名的哈希前缀(取前2位):
-- 计算本地IP的哈希前缀 SELECT SUBSTRING(hash('sha1', 'http://192.168.5.100') FROM 1 FOR 2) AS local_hash; -- 计算公网域名的哈希前缀(替换为你的实际域名) SELECT SUBSTRING(hash('sha1', 'https://your-public-domain.com') FROM 1 FOR 2) AS public_hash;
步骤3:更新数据库中的附件路径
将ir_attachment表中本地IP对应的路径替换为公网域名的路径:
UPDATE ir_attachment SET store_fname = REPLACE(store_fname, '[local_hash]/', '[public_hash]/') WHERE store_fname LIKE '[local_hash]/%';
将[local_hash]和[public_hash]替换为上一步得到的实际值。
步骤4:同步文件系统附件目录
进入Odoo的附件存储目录(默认路径为/var/lib/odoo/.local/share/Odoo/filestore/[your-db-name]),执行以下命令同步文件:
# 复制原哈希目录的文件到新哈希目录 cp -r [local_hash]/ [public_hash]/ # 验证文件正常后,可删除原目录(可选) # rm -rf [local_hash]/
2. 强制Odoo使用统一域名生成附件路径
编辑Odoo配置文件odoo.conf,添加以下参数:
web.base.url = https://your-public-domain.com web.base.url.freeze = True
添加后重启Odoo服务:
systemctl restart odoo
该配置会强制Odoo始终使用公网域名生成附件路径,避免因请求域名不同导致的路径冲突。
3. 清理重复附件记录(可选)
如果上述步骤仍未解决,可查询并清理ir_attachment表中的重复附件:
-- 查询存在路径冲突的附件记录 SELECT id, name, store_fname FROM ir_attachment WHERE store_fname IN ( SELECT store_fname FROM ir_attachment GROUP BY store_fname HAVING COUNT(*) > 1 );
手动保留有效记录,删除重复项,或通过Odoo后台的「设置-技术-附件-附件管理」界面清理。
注意事项
- 所有数据库操作前必须备份,防止数据丢失
- 若使用Nginx等反向代理,确保配置中正确传递
Host请求头(如添加proxy_set_header Host $host;) - 检查Odoo运行用户对附件存储目录的读写权限,避免因权限问题导致的访问失败
内容的提问来源于stack exchange,提问作者Pascal Ottiger
相关产品推荐
相关产品推荐

