Odoo 19 首次登录自动创建数据库方案
——安装后访问时自动生成 Demo 数据库的完整解决方案
在 Odoo 19 的默认行为中,首次访问系统时会停留在数据库选择页面(/web/database/selector)。管理员需要手动点击“创建数据库”来创建新数据库,或选择现有数据库进行登录。
然而,在某些场景下,这种默认行为无法满足需求,例如:
- SaaS 模式期望用户在首次访问时获得自动创建的试用数据库;
- 内部环境期望 Odoo 在安装后即可直接进行系统访问,无需手动创建数据库;
- Demo/demo 环境需要稳定生成一个演示库并自动导航进入其中;
- 在自动化部署场景中,期望实现零接触体验。
本文将全面介绍如何从原理、实现方式、配置方法和增强方案四个层面,在Odoo 19中实现“首次访问时自动创建数据库”的能力。
1. Odoo 19 的默认数据库创建行为
Odoo 19 在安装后默认启用 dbfilter 机制:
- 未指定数据库时,将进入数据库管理页面。
- 用户需要手动输入数据库名称、管理员邮箱、密码和其他内容以完成初始化。
此方法对初学者不友好,也不适合自动化部署。
2. 需求分析:自动创建演示数据库的逻辑
目标行为如下:
- 首次访问 Odoo 门户 /
-
系统检测:
- 演示数据库是否已经存在?
- 如果不存在 → 自动创建
- 如果存在 → 自动重定向进入
- 用户无需点击任何按钮即可直接进入后台界面。
自动创建的演示数据库可以包含:
- 指定一个名称(例如 demo_db)
- 自动安装所选模块(销售、CRM、库存等)
- 自动设置管理员密码
- 根据需求注入初始数据
III. 实施计划(适用于 Odoo 19)
为了在首次访问时自动创建数据库,我们可以采用以下“三层方法”,你可以选择其中任意一种或多种方法的组合。
选项 1:使用 --init 参数 + 指定默认数据库(最简单)
适用于 Docker 或命令行部署。
1. 启动参数语法
在 odoo.conf 或启动命令中添加:
db_name = demo_db
首次启动时,如果数据库不存在,Odoo 将自动尝试创建一个同名数据库。
与自动安装模块配合使用:
init = base,website,sale,crm
2. Docker Compose 示例
命令: >
odoo --db_host=db --db_user=odoo --db_password=odoo
--db_name=demo_db
--init=base,website,sale,crm
3. 功能
- 简单且稳定
- 无需开发
- 但不支持高级逻辑(例如首次访问检测、跳转控制等)
选项 2:通过反向代理强制路径重定向(零接触体验)
当用户访问 / 时,他们会被直接重定向到用于自动创建数据库的 URL。
Nginx 示例:
location / {
return 302 /web?db=demo_db;
}
如果在 Odoo 配置中启用了自动创建数据库(选项 1),则此方法可以实现真正的:
安装 → 启动 → 通过浏览器访问 → 自动进入后端
选项 3(推荐):开发自动初始化模块(自动数据库创建器)
这是满足 SaaS/自托管需求的最灵活、可扩展且可投入生产的解决方案。
核心思想
编写一个自定义模块,在用户首次访问 Odoo 路由时执行以下逻辑:
- 调用 Odoo API 检查 demo_db 是否存在
- 如果不存在 → 调用Odoo的内部服务自动创建
- 创建后自动重定向到 /web?db=demo_db
- 管理员初始密码从配置或环境变量中读取。
- 一组模块可以自动安装
- 可以自动导入演示数据
代码设计结构
auto_db_creator/
├── __manifest__.py
├── controllers/
│ └── main.py
└── data/
└── auto_init.xml
控制器(核心判断逻辑)
from odoo import http
from odoo.http import request
class AutoDBCreator(http.Controller):
@http.route('/', type='http', auth='none')
def auto_create_db(self, **kwargs):
db_list = http.db_list()
target_db = 'demo_db'
if target_db not in db_list:
# 自动创建数据库
request.env['ir.http'].sudo()._create_database(
target_db,
admin_password='admin',
demo=True,
lang='zh_CN'
)
# 自动重定向到系统
return http.redirect_with_hash('/web?db=%s' % target_db)
功能
- 模块可以自动安装
- 控制复杂逻辑(仅在首次访问时触发)
- 可用于在SaaS平台上批量创建示例数据库
- 强大的可扩展性,支持添加审计、初始化数据和二次重定向等功能。
4. 高级:自动生成多个数据库(适用于 SaaS)
如果您需要根据子域名或 URL 自动创建数据库,可以结合 Odoo 内置的 dbfilter:
dbfilter = ^%h$
示例:
访问:
abc.myodoo.com
系统自动创建并加载:
abc
结合本文所述的自动创建模块,可以实现动态数据库创建。
5. 部署建议
为降低维护成本,建议采用以下方法:
-
-
Docker + 配置文件方法
→ 自动指定 db_name + 安装模块
-
Docker + 配置文件方法
-
自定义自动创建模块
→ 控制初始化行为、跳转、数据模板
-
自定义自动创建模块
-
反向代理重定向
→ 让用户无缝访问数据库
-
反向代理重定向
三者的结合带来最佳体验。
6. 典型使用场景
| 场景 | 推荐方案 |
|---|---|
| 官方演示 | 选项 1 + 选项 2 |
| 内部 ERP 自动部署 | 选项 1 |
| SaaS 自动创建多租户 | 方案三(模块) |
| 零交互安装体验 | 选项 1 + 反向代理重定向 |
