odoo-dev-assistant
Odoo 开发与运维辅助技能
这是一个面向 Odoo 日常开发、排查和维护 的总入口技能,不是单一功能 skill。
当前版本已内置四个工作流:重置 Odoo 登录用户 admin 的密码、生成/维护 Odoo 模块介绍页文档、根据 odoo.conf 识别当前运行数据库与 addons 路径,以及 恢复 Odoo.sh 备份并配置 odoo.conf。后续凡是与 Odoo 相关的能力,都应优先沉淀到这个 skill 中,而不是不断新建很多零散的 Odoo 子 skill。
When to Apply
- 用户在做 Odoo 模块开发、运行调试、配置排查、账号修复、数据库维护
- 用户提到 Odoo 的
odoo.conf、模块目录、__manifest__.py、addons、升级模块、用户权限、数据库记录 - 用户希望把某个 Odoo 操作沉淀为可复用流程
Skill Positioning
这个 skill 是一个 Odoo 任务总入口。
当前已包含:
- 重置 Odoo 登录用户
admin密码 - 生成或维护 Odoo 模块文档与
static/description/index.html - 根据
odoo.conf识别当前运行数据库与 addons 路径 - 恢复 Odoo.sh 备份并配置
odoo.conf
后续建议继续增加:
- 升级指定模块
- 初始化/检查自定义模块结构
- 修复常见 XML / Python / security / access rights 问题
- 数据修复与脚本化维护
Global Rules
-
先区分 Odoo 概念,再动手。 对用户提到的“管理员密码”“数据库密码”“admin 密码”这类词,必须先判断是:
- Odoo 登录用户密码
admin_passwd- PostgreSQL 用户密码
-
优先读取当前实例配置。 任何数据库相关操作,优先读取
odoo.conf,确认:db_namedb_hostdb_portdb_userdb_passwordaddons_path
-
优先用 Odoo 框架方式操作 Odoo 数据。 能用
odoo-bin shell+ ORM 处理的,不要直接手写底层哈希或盲改业务表。 -
最小范围修改。 只改用户要求的对象,不顺带改别的配置、别的密码、别的模块。
-
结果汇报必须明确边界。 要明确告诉用户:
- 改了什么
- 没改什么
- 当前操作的是哪个数据库 / 哪个模块 / 哪个用户
Workflow 1: 重置 Odoo 登录用户 admin 密码
这个工作流用于修改 Odoo 应用内登录用户 admin 的密码,不是 PostgreSQL 账号密码,也不是 odoo.conf 里的 admin_passwd。
When to Apply
- 用户说“把 Odoo 登录用户名 admin 的密码改为 xxx”
- 用户说“重置 Odoo admin 登录密码”
- 用户说“修改数据库里 admin 登录密码”,但上下文明确是在说 Odoo 后台登录账号
Must Distinguish First
必须先确认目标不是下面两种:
- Odoo 管理主密码 (
admin_passwd) - PostgreSQL 用户密码 (
db_user/db_password)
Execution Steps
- 读取当前
odoo.conf,确定活动数据库 - 明确告诉用户当前将操作哪个数据库
- 确认
res_users中存在login='admin'的用户 - 使用
odoo-bin shell+ ORM 更新密码 - 提醒用户通过 Odoo 登录页做最终验证
Preferred ORM Snippet
user = env['res.users'].search([('login', '=', 'admin')], limit=1)
assert user, 'admin user not found'
user.write({'password': '<NEW_PASSWORD>'})
env.cr.commit()
print(f'password updated for user id={user.id} login={user.login}')
Report Template
已处理当前 Odoo 数据库:<DB_NAME>
- 目标用户:admin
- 已执行操作:将 Odoo 登录密码改为 <NEW_PASSWORD>
- 未修改:admin_passwd / PostgreSQL 用户密码
- 建议验证:使用 admin / <NEW_PASSWORD> 登录 Odoo 页面
Workflow 2: 生成或维护 Odoo 模块介绍页文档
这个工作流用于把 Odoo 模块中的 Markdown 文档整理为 static/description/index.html,或者在缺少文档时根据模块结构自动生成一份可用的介绍内容。
When to Apply
- 用户说“给这个 Odoo 模块生成介绍页”
- 用户说“把 README 转成 Odoo 模块 description 页面”
- 用户说“帮我维护模块文档”
- 用户需要生成
static/description/index.html
Must Distinguish First
必须先确认当前对象是 Odoo 模块文档/介绍页,而不是普通项目 README、美化官网页面或通用 HTML 文档。
Execution Steps
- 确认目标目录是否是 Odoo 模块,优先检查是否存在
__manifest__.py - 确定文档来源:
- 用户显式指定的 Markdown 文件
- 自动查找
docs/README.md、docs/index.md、dos/README.md或根目录README.md
- 如果没有现成文档,则读取
__manifest__.py与模块结构,生成docs/AUTO_SUMMARY.md - 优先使用
npx markdown-to-html-cli转换为static/description/index.html - 补足基础样式,确保输出符合 Odoo
description页面使用场景 - 如存在本地图片,确保资源路径可用,必要时迁移到
static/description下
Preferred Conversion Command
npx markdown-to-html-cli --source <SOURCE_MD> --output static/description/index.html
Content Rules
- 若自动总结,至少包含:
- 模块标题
- 单句摘要(Summary)
- 核心功能点(Features)
- 依赖说明(Dependencies)
- 生成结果应具备清晰层级,而不是只输出一整块纯文本
- 页面样式应克制、整洁、适合 Odoo 后台展示,不要做成营销落地页风格
Report Template
已处理 Odoo 模块文档:<MODULE_PATH>
- 文档源:<SOURCE_MD>
- 输出文件:static/description/index.html
- 已执行操作:转换/生成模块介绍页
- 如无原始文档:已补充自动总结内容
Workflow 3: 根据 odoo.conf 识别当前运行数据库与 addons 路径
这个工作流用于在 Odoo 项目中快速确认当前实例实际连接的数据库、PostgreSQL 连接参数,以及当前生效的 addons_path,适合排查“现在到底跑的是哪个库、哪个模块路径”的问题。
When to Apply
- 用户说“读取
odoo.conf现在正在使用的” - 用户说“看看当前 Odoo 连的是哪个数据库”
- 用户说“确认当前 addons 路径”
- 用户在 Docker / 多数据库 / 多套 addons 环境里排查实例配置
Must Distinguish First
必须先区分以下几个概念:
- 当前配置文件声明的数据库:例如
db_name - PostgreSQL 连接参数:例如
db_host/db_port/db_user/db_password - Odoo 模块搜索路径:例如
addons_path
如果项目里有多个配置文件,必须先确认当前要读的是哪一个 odoo.conf。
Execution Steps
- 读取目标
odoo.conf - 提取关键配置:
db_namedb_hostdb_portdb_userdb_passwordaddons_path- 如有必要也包括
http_port、admin_passwd
- 明确区分哪些是:
- Odoo 数据库名
- PostgreSQL 连接账户
- Odoo 模块路径
- 如配置中存在多组被注释的候选值,只报告当前未注释、实际生效的那一组
- 回答时直接给出当前实例实际使用的值,不要让用户自己再从原文件里找
Report Template
当前 Odoo 配置文件:<CONF_PATH>
- 数据库名:<DB_NAME>
- PostgreSQL 地址:<DB_HOST>:<DB_PORT>
- PostgreSQL 用户:<DB_USER>
- PostgreSQL 密码:<DB_PASSWORD>
- addons_path:<ADDONS_PATH>
说明:以上为当前未注释、实际生效的配置;这不等同于 Odoo 登录用户密码。
Workflow 4: 恢复 Odoo.sh 备份并配置 odoo.conf
这个工作流用于把 Odoo.sh 或 Odoo 导出的备份恢复到本地开发环境,并把 odoo.conf 配置到可启动、可连接、可加载附件的状态。目标不是只把数据库“导进去”,而是让本地 Odoo 实例可以正确打开恢复后的数据库。
When to Apply
- 用户说“帮我把 Odoo.sh 导出的备份恢复到本地”
- 用户说“导入这个
.zip/.dump/dump.sql到本地 Odoo” - 用户说“恢复数据库后顺便把
odoo.conf配好” - 用户把备份包交给 AI,希望 AI 自动恢复数据库、复制 filestore、更新配置
Must Distinguish First
必须先识别当前是哪一种恢复输入:
- 标准 Odoo 备份压缩包:例如
.zip,优先走odoo-bin db load - 已解压备份目录:例如包含
dump.sql、.dump、filestore/ - 只给了数据库 dump,没有 filestore
- 只给了 filestore,没有数据库 dump
还必须先确认以下信息:
- 目标数据库名是什么
- 本地 Odoo 版本与备份来源是否同大版本
- 本地是否具备所需 enterprise / custom addons
odoo.conf应该使用哪个文件作为当前配置
Execution Steps
- 识别备份格式,并决定恢复路径:
- 如果是标准 Odoo
.zip备份,优先使用odoo-bin db load <db> <backup.zip> --force - 如果已解压为
dump.sql/.dump+filestore/,走手动恢复路径 - 如果在 Windows 本地环境下,
odoo-bin db load直接接收本地文件路径失败(例如被当成 URL 处理),不要反复猜参数,直接回退到手动恢复路径
- 如果是标准 Odoo
- 在恢复前确认:
- PostgreSQL 连接参数可用:
db_host、db_port、db_user、db_password - 目标数据库名已确定,且是否允许覆盖现有数据库
- 本地有足够磁盘空间
- 自定义模块路径和企业版代码已包含在
addons_path中或可被补齐 - 是否需要按统一规则把恢复后的数据库命名为“项目名 + 当前年月日时间”
- PostgreSQL 连接参数可用:
- 如果走
db load:- 使用 Odoo 官方 CLI 恢复备份
- 如为本地调试环境,优先考虑
--neutralize
- 如果走手动恢复:
dump.sql使用createdb + psql.dump使用createdb + pg_restore- 再把
filestore/放到data_dir/filestore/<db_name>/
- 更新或确认
odoo.conf至少包含:db_namedb_hostdb_portdb_userdb_passwordaddons_pathdata_dir- 如有多数据库或本地环境混用,再补
dbfilter
- 启动 Odoo 并验证:
- 数据库能被识别
- Odoo 能启动
- 自定义模块不会因缺失路径而报错
- 附件、图片、二进制资源能正常读取,说明 filestore 对齐成功
- 明确向用户报告:
- 当前恢复使用了哪条路径
- 哪些配置已改
- 哪些风险仍存在,例如版本不一致、模块缺失、filestore 缺失
Windows Fallback Rule
在 Windows 本地环境里,如果 odoo-bin db load 对本地 zip 路径报类似“把路径当作 URL 处理”的错误,不要继续在路径格式上盲试多轮。此时应直接切到手动恢复流程:
- 从 zip 中解出
dump.sql或.dump - 创建目标数据库
- 使用
psql或pg_restore导入 - 如有真实 filestore,再复制到
data_dir/filestore/<db_name>/
这个回退规则优先保证恢复成功,而不是执着于必须走 db load。
nofs Backup Rule
如果备份文件名、目录结构或压缩包内容显示它是 nofs 备份,或者 filestore/ 目录存在但没有实际文件,则必须把它视为 数据库恢复成功但附件资源不完整 的场景。
此时必须明确告诉用户:
- 数据库本身可以恢复并启动
- 但附件、图片、文档、二进制资源可能缺失
- 这不是 SQL 恢复失败,而是备份本身不含真实 filestore
Default Naming Rule
如果用户希望恢复后的数据库名更易管理,默认优先采用:
<project_name>_<YYYYMMDDHHMMSS>
例如:
shanghaimeowai_winston1_20260409103933
恢复完成后,如用户要求按此规则命名:
- 先完成数据库恢复
- 再用 filestore-aware 的数据库重命名方式处理
- 同步更新
odoo.conf中的db_name
不要只改 PostgreSQL 数据库名而忽略 Odoo 配置和潜在 filestore 目录。
Preferred Restore Paths
A. 标准 Odoo 备份压缩包
python odoo-bin db load <DB_NAME> <BACKUP_ZIP> --force
如本地调试环境需要安全中性化,可考虑:
python odoo-bin db load <DB_NAME> <BACKUP_ZIP> --force --neutralize
B. 手动恢复 dump.sql
createdb -U <DB_USER> <DB_NAME>
psql -U <DB_USER> -d <DB_NAME> -f dump.sql
C. 手动恢复 .dump
createdb -U <DB_USER> <DB_NAME>
pg_restore --no-owner -U <DB_USER> -d <DB_NAME> backup.dump
D. 恢复 filestore
把 filestore/ 放到:
<data_dir>/filestore/<DB_NAME>/
如果 data_dir 未显式配置,必须先确认当前 Odoo 实例实际使用的默认目录,再复制过去。
Config Rules
data_dir是强制检查项,不是可选项;它决定 Odoo 到哪里找 filestoreaddons_path必须覆盖恢复后的数据库所依赖的自定义模块和企业版模块dbfilter在多数据库环境里非常重要,可避免用户打开错误数据库admin_passwd与恢复数据库本身无关,不要混为一谈
Validation Checklist
- 目标数据库已成功创建或覆盖
odoo.conf指向正确数据库- Odoo 启动后能看到目标库
- 登录后附件、图片、文档可正常打开
- 没有因为缺少 addons 路径导致模块加载失败
- 若未中性化,已明确提醒用户可能触发邮件、定时任务、Webhook、支付或外部连接器
- 在可能的情况下,至少做一次
odoo-bin shell --no-http --stop-after-init或等价 registry 加载验证,确认数据库不是“只导入成功但 Odoo 打不开” - 如果是
nofs包,应把“附件缺失预期”标注为已知风险,而不是把它计入数据库恢复失败
Report Template
已处理 Odoo 备份恢复:<BACKUP_PATH>
- 恢复目标数据库:<DB_NAME>
- 恢复方式:db load / psql / pg_restore
- filestore 状态:已恢复 / 缺失 / 待确认
- 已更新配置:db_name, db_host, db_port, db_user, db_password, addons_path, data_dir[, dbfilter]
- 当前风险:<RISKS>
- 建议验证:启动 Odoo,打开目标数据库并检查附件与模块加载情况
Must Not Do
- 不要把
admin_passwd误当成 Odoo 登录用户admin的密码 - 不要把
db_user/db_password误当成 Odoo 登录用户密码 - 不要直接手写
res_users.password哈希,除非 Odoo ORM 方式不可用 - 不要在用户没确认时顺带修改多个密码体系
- 不要擅自删除、禁用或重建 Odoo 用户
- 不要把普通仓库 README 当作 Odoo 模块介绍页直接硬套,除非已确认目标是模块文档
- 不要生成与 Odoo 模块场景不匹配的过度营销化页面
- 不要把被注释掉的候选配置当成当前生效配置
- 不要在 filestore 未对齐时就宣布“恢复成功”
- 不要忽略 Odoo 版本、enterprise/custom addons 与备份数据库之间的匹配问题
- 不要在未确认的情况下覆盖现有本地数据库
- 不要只恢复 SQL 却默认附件和图片会自动可用
- 不要在 Windows 下因为
db load读本地路径失败就误判“备份损坏” - 不要恢复完数据库却忘记同步
odoo.conf的db_name和data_dir
How to Extend This Skill Later
后续新增 Odoo 能力时,直接在本文件里继续追加新的 workflow 分节,例如:
## Workflow 5: 升级指定模块## Workflow 6: 生成模块初始化骨架## Workflow 7: 排查 access rights 与 security rule## Workflow 8: 根据 odoo.conf 与 docker 环境定位数据库实例
保持统一结构:
- When to Apply
- Must Distinguish First
- Execution Steps
- Report Template
- Must Not Do
More from imhansiy/my-skills
localtunnel-auto-expose
Automatically exposes local services using LocalTunnel via npx and provides the public URL along with the access password. Use when starting a new service or when external web access is requested.
13cliproxy-manager
Unified management skill for CLIProxyAPI, enabling AI to dynamically update service configurations (API Keys, model aliases, proxy rules) and monitor usage statistics.
7plantuml-image-generator
Triggered when the user requests an image (e.g., architecture, flowchart, sequence diagram) or needs a technical illustration inserted into a document. This skill dynamically generates and inserts images using the official PlantUML public API.
1odoorpc-agent-skill
>-
1hexo-blog-manager
Handles the creation workflow for Hexo blog posts and the uploading of images/covers to GitHub_Oss using the jsDelivr CDN. Use exclusively for publishing or updating Hexo blog content with images.
1cliproxyapi-manager-skill
>-
1