#Docker 安装(内置 Nginx)
前提条件
- 已安装 Docker 和 Docker Compose
- 确保 Docker 服务正在运行
#1. 新建 docker-compose.yml
# 创建一个名为 my-project(可以是其他名称)的文件夹,用于存放 NocoBase 生成的系统文件
mkdir my-project && cd my-project
# 创建一个空的 docker-compose.yml 文件
vi docker-compose.yml#2. 配置 docker-compose.yml
选择 NocoBase 版本(版本对比)和数据库类型,复制对应的配置到 docker-compose.yml 里。
配置说明
- 选择镜像:
latestlatest-fullbetabeta-fullalphaalpha-full1.7.141.7.14-full- 生产环境建议固定为具体数字版本,避免无意自动升级。查看所有版本
- 阿里云镜像:
registry.cn-shanghai.aliyuncs.com/nocobase/nocobase:latest-full - Docker Hub 镜像:
nocobase/nocobase:latest-full - full 镜像包含了备份管理、迁移管理插件所需的 PostgreSQL 16/17 客户端、MySQL 8.0 客户端、Oracle 19.25 客户端以及模板打印(PDF)所需的 LibreOffice
- 如需自建镜像,可参考官方提供的 Dockerfile(精简版) 和 Dockerfile-full(完整版)
- 修改
APP_KEY:请将your-secret-key替换为随机字符串,用于加密用户 token 等敏感信息 - 使用已有数据库:如果已有数据库服务,请修改
DB_HOST为数据库服务器地址,并删除或注释掉数据库服务配置(如postgres、mysql、mariadb服务) - 端口映射:默认将容器的 80 端口映射到主机的 13000 端口,可根据需要修改
Latest 版本
Beta 版本
Alpha 版本
PostgreSQL
MySQL
MariaDB
networks:
nocobase:
driver: bridge
services:
app:
image: registry.cn-shanghai.aliyuncs.com/nocobase/nocobase:latest-full
restart: always
networks:
- nocobase
depends_on:
- postgres
environment:
# 应用的密钥,用于生成用户 token 等
# 如果 APP_KEY 修改了,旧的 token 也会随之失效
# 可以是任意随机字符串,并确保不对外泄露
- APP_KEY=your-secret-key
# 数据库类型,支持 postgres, mysql, mariadb
- DB_DIALECT=postgres
# 数据库主机,可以替换为已有的数据库服务器 IP
- DB_HOST=postgres
# Database port
- DB_PORT=5432
# 数据库名
- DB_DATABASE=nocobase
# 数据库用户
- DB_USER=nocobase
# 数据库密码
- DB_PASSWORD=nocobase
# 时区
- TZ=Asia/Shanghai
volumes:
- ./storage:/app/nocobase/storage
ports:
- '13000:80'
# init: true
# 如果使用已有数据库服务,可以不启动 postgres
postgres:
image: registry.cn-shanghai.aliyuncs.com/nocobase/postgres:16
restart: always
command: postgres -c wal_level=logical
environment:
POSTGRES_USER: nocobase
POSTGRES_DB: nocobase
POSTGRES_PASSWORD: nocobase
volumes:
- ./storage/db/postgres:/var/lib/postgresql/data
networks:
- nocobasenetworks:
nocobase:
driver: bridge
services:
app:
image: registry.cn-shanghai.aliyuncs.com/nocobase/nocobase:latest-full
restart: always
networks:
- nocobase
depends_on:
- mysql
environment:
# 应用的密钥,用于生成用户 token 等
# 如果 APP_KEY 修改了,旧的 token 也会随之失效
# 可以是任意随机字符串,并确保不对外泄露
- APP_KEY=your-secret-key
# 数据库类型,支持 postgres, mysql, mariadb
- DB_DIALECT=mysql
# 数据库主机,可以替换为已有的数据库服务器 IP
- DB_HOST=mysql
# Database port
- DB_PORT=3306
# 数据库名
- DB_DATABASE=nocobase
# 数据库用户
- DB_USER=root
# 数据库密码
- DB_PASSWORD=nocobase
# 数据库表名、字段名是否转为 snake case 风格
- DB_UNDERSCORED=true
# 时区
- TZ=Asia/Shanghai
volumes:
- ./storage:/app/nocobase/storage
ports:
- '13000:80'
# init: true
# 如果使用已有数据库服务,可以不启动 mysql
mysql:
image: registry.cn-shanghai.aliyuncs.com/nocobase/mysql:8
environment:
MYSQL_DATABASE: nocobase
MYSQL_USER: nocobase
MYSQL_PASSWORD: nocobase
MYSQL_ROOT_PASSWORD: nocobase
restart: always
volumes:
- ./storage/db/mysql:/var/lib/mysql
networks:
- nocobasenetworks:
nocobase:
driver: bridge
services:
app:
image: registry.cn-shanghai.aliyuncs.com/nocobase/nocobase:latest-full
restart: always
networks:
- nocobase
depends_on:
- mariadb
environment:
# 应用的密钥,用于生成用户 token 等
# 如果 APP_KEY 修改了,旧的 token 也会随之失效
# 可以是任意随机字符串,并确保不对外泄露
- APP_KEY=your-secret-key
# 数据库类型,支持 postgres, mysql, mariadb
- DB_DIALECT=mariadb
# 数据库主机,可以替换为已有的数据库服务器 IP
- DB_HOST=mariadb
# Database port
- DB_PORT=3306
# 数据库名
- DB_DATABASE=nocobase
# 数据库用户
- DB_USER=root
# 数据库密码
- DB_PASSWORD=nocobase
# 数据库表名、字段名是否转为 snake case 风格
- DB_UNDERSCORED=true
# 时区
- TZ=Asia/Shanghai
volumes:
- ./storage:/app/nocobase/storage
ports:
- '13000:80'
# init: true
# 如果使用已有数据库服务,可以不启动 mariadb
mariadb:
image: registry.cn-shanghai.aliyuncs.com/nocobase/mariadb:11
environment:
MYSQL_DATABASE: nocobase
MYSQL_USER: nocobase
MYSQL_PASSWORD: nocobase
MYSQL_ROOT_PASSWORD: nocobase
restart: always
volumes:
- ./storage/db/mariadb:/var/lib/mysql
networks:
- nocobasePostgreSQL
MySQL
MariaDB
networks:
nocobase:
driver: bridge
services:
app:
image: registry.cn-shanghai.aliyuncs.com/nocobase/nocobase:beta-full
restart: always
networks:
- nocobase
depends_on:
- postgres
environment:
# 应用的密钥,用于生成用户 token 等
# 如果 APP_KEY 修改了,旧的 token 也会随之失效
# 可以是任意随机字符串,并确保不对外泄露
- APP_KEY=your-secret-key
# 数据库类型,支持 postgres, mysql, mariadb
- DB_DIALECT=postgres
# 数据库主机,可以替换为已有的数据库服务器 IP
- DB_HOST=postgres
# Database port
- DB_PORT=5432
# 数据库名
- DB_DATABASE=nocobase
# 数据库用户
- DB_USER=nocobase
# 数据库密码
- DB_PASSWORD=nocobase
# 时区
- TZ=Asia/Shanghai
volumes:
- ./storage:/app/nocobase/storage
ports:
- '13000:80'
# init: true
# 如果使用已有数据库服务,可以不启动 postgres
postgres:
image: registry.cn-shanghai.aliyuncs.com/nocobase/postgres:16
restart: always
command: postgres -c wal_level=logical
environment:
POSTGRES_USER: nocobase
POSTGRES_DB: nocobase
POSTGRES_PASSWORD: nocobase
volumes:
- ./storage/db/postgres:/var/lib/postgresql/data
networks:
- nocobasenetworks:
nocobase:
driver: bridge
services:
app:
image: registry.cn-shanghai.aliyuncs.com/nocobase/nocobase:beta-full
restart: always
networks:
- nocobase
depends_on:
- mysql
environment:
# 应用的密钥,用于生成用户 token 等
# 如果 APP_KEY 修改了,旧的 token 也会随之失效
# 可以是任意随机字符串,并确保不对外泄露
- APP_KEY=your-secret-key
# 数据库类型,支持 postgres, mysql, mariadb
- DB_DIALECT=mysql
# 数据库主机,可以替换为已有的数据库服务器 IP
- DB_HOST=mysql
# Database port
- DB_PORT=3306
# 数据库名
- DB_DATABASE=nocobase
# 数据库用户
- DB_USER=root
# 数据库密码
- DB_PASSWORD=nocobase
# 数据库表名、字段名是否转为 snake case 风格
- DB_UNDERSCORED=true
# 时区
- TZ=Asia/Shanghai
volumes:
- ./storage:/app/nocobase/storage
ports:
- '13000:80'
# init: true
# 如果使用已有数据库服务,可以不启动 mysql
mysql:
image: registry.cn-shanghai.aliyuncs.com/nocobase/mysql:8
environment:
MYSQL_DATABASE: nocobase
MYSQL_USER: nocobase
MYSQL_PASSWORD: nocobase
MYSQL_ROOT_PASSWORD: nocobase
restart: always
volumes:
- ./storage/db/mysql:/var/lib/mysql
networks:
- nocobasenetworks:
nocobase:
driver: bridge
services:
app:
image: registry.cn-shanghai.aliyuncs.com/nocobase/nocobase:beta-full
restart: always
networks:
- nocobase
depends_on:
- mariadb
environment:
# 应用的密钥,用于生成用户 token 等
# 如果 APP_KEY 修改了,旧的 token 也会随之失效
# 可以是任意随机字符串,并确保不对外泄露
- APP_KEY=your-secret-key
# 数据库类型,支持 postgres, mysql, mariadb
- DB_DIALECT=mariadb
# 数据库主机,可以替换为已有的数据库服务器 IP
- DB_HOST=mariadb
# Database port
- DB_PORT=3306
# 数据库名
- DB_DATABASE=nocobase
# 数据库用户
- DB_USER=root
# 数据库密码
- DB_PASSWORD=nocobase
# 数据库表名、字段名是否转为 snake case 风格
- DB_UNDERSCORED=true
# 时区
- TZ=Asia/Shanghai
volumes:
- ./storage:/app/nocobase/storage
ports:
- '13000:80'
# init: true
# 如果使用已有数据库服务,可以不启动 mariadb
mariadb:
image: registry.cn-shanghai.aliyuncs.com/nocobase/mariadb:11
environment:
MYSQL_DATABASE: nocobase
MYSQL_USER: nocobase
MYSQL_PASSWORD: nocobase
MYSQL_ROOT_PASSWORD: nocobase
restart: always
volumes:
- ./storage/db/mariadb:/var/lib/mysql
networks:
- nocobasePostgreSQL
MySQL
MariaDB
networks:
nocobase:
driver: bridge
services:
app:
image: registry.cn-shanghai.aliyuncs.com/nocobase/nocobase:alpha-full
restart: always
networks:
- nocobase
depends_on:
- postgres
environment:
# 应用的密钥,用于生成用户 token 等
# 如果 APP_KEY 修改了,旧的 token 也会随之失效
# 可以是任意随机字符串,并确保不对外泄露
- APP_KEY=your-secret-key
# 数据库类型,支持 postgres, mysql, mariadb
- DB_DIALECT=postgres
# 数据库主机,可以替换为已有的数据库服务器 IP
- DB_HOST=postgres
# Database port
- DB_PORT=5432
# 数据库名
- DB_DATABASE=nocobase
# 数据库用户
- DB_USER=nocobase
# 数据库密码
- DB_PASSWORD=nocobase
# 时区
- TZ=Asia/Shanghai
volumes:
- ./storage:/app/nocobase/storage
ports:
- '13000:80'
# init: true
# 如果使用已有数据库服务,可以不启动 postgres
postgres:
image: registry.cn-shanghai.aliyuncs.com/nocobase/postgres:16
restart: always
command: postgres -c wal_level=logical
environment:
POSTGRES_USER: nocobase
POSTGRES_DB: nocobase
POSTGRES_PASSWORD: nocobase
volumes:
- ./storage/db/postgres:/var/lib/postgresql/data
networks:
- nocobasenetworks:
nocobase:
driver: bridge
services:
app:
image: registry.cn-shanghai.aliyuncs.com/nocobase/nocobase:alpha-full
restart: always
networks:
- nocobase
depends_on:
- mysql
environment:
# 应用的密钥,用于生成用户 token 等
# 如果 APP_KEY 修改了,旧的 token 也会随之失效
# 可以是任意随机字符串,并确保不对外泄露
- APP_KEY=your-secret-key
# 数据库类型,支持 postgres, mysql, mariadb
- DB_DIALECT=mysql
# 数据库主机,可以替换为已有的数据库服务器 IP
- DB_HOST=mysql
# Database port
- DB_PORT=3306
# 数据库名
- DB_DATABASE=nocobase
# 数据库用户
- DB_USER=root
# 数据库密码
- DB_PASSWORD=nocobase
# 数据库表名、字段名是否转为 snake case 风格
- DB_UNDERSCORED=true
# 时区
- TZ=Asia/Shanghai
volumes:
- ./storage:/app/nocobase/storage
ports:
- '13000:80'
# init: true
# 如果使用已有数据库服务,可以不启动 mysql
mysql:
image: registry.cn-shanghai.aliyuncs.com/nocobase/mysql:8
environment:
MYSQL_DATABASE: nocobase
MYSQL_USER: nocobase
MYSQL_PASSWORD: nocobase
MYSQL_ROOT_PASSWORD: nocobase
restart: always
volumes:
- ./storage/db/mysql:/var/lib/mysql
networks:
- nocobasenetworks:
nocobase:
driver: bridge
services:
app:
image: registry.cn-shanghai.aliyuncs.com/nocobase/nocobase:alpha-full
restart: always
networks:
- nocobase
depends_on:
- mariadb
environment:
# 应用的密钥,用于生成用户 token 等
# 如果 APP_KEY 修改了,旧的 token 也会随之失效
# 可以是任意随机字符串,并确保不对外泄露
- APP_KEY=your-secret-key
# 数据库类型,支持 postgres, mysql, mariadb
- DB_DIALECT=mariadb
# 数据库主机,可以替换为已有的数据库服务器 IP
- DB_HOST=mariadb
# Database port
- DB_PORT=3306
# 数据库名
- DB_DATABASE=nocobase
# 数据库用户
- DB_USER=root
# 数据库密码
- DB_PASSWORD=nocobase
# 数据库表名、字段名是否转为 snake case 风格
- DB_UNDERSCORED=true
# 时区
- TZ=Asia/Shanghai
volumes:
- ./storage:/app/nocobase/storage
ports:
- '13000:80'
# init: true
# 如果使用已有数据库服务,可以不启动 mariadb
mariadb:
image: registry.cn-shanghai.aliyuncs.com/nocobase/mariadb:11
environment:
MYSQL_DATABASE: nocobase
MYSQL_USER: nocobase
MYSQL_PASSWORD: nocobase
MYSQL_ROOT_PASSWORD: nocobase
restart: always
volumes:
- ./storage/db/mariadb:/var/lib/mysql
networks:
- nocobase#3. 安装并启动 NocoBase
# 拉取最新镜像
docker compose pull
# 在后台运行(首次运行会自动执行安装)
docker compose up -d
# 查看安装和运行日志
docker compose logs -f app
app-postgres-app-1 | nginx started
app-postgres-app-1 | yarn run v1.22.15
app-postgres-app-1 | $ cross-env DOTENV_CONFIG_PATH=.env node -r dotenv/config packages/app/server/lib/index.js install -s
app-postgres-app-1 | Done in 2.72s.
app-postgres-app-1 | yarn run v1.22.15
app-postgres-app-1 | $ pm2-runtime start --node-args="-r dotenv/config" packages/app/server/lib/index.js -- start
app-postgres-app-1 | 2022-04-28T15:45:38: PM2 log: Launching in no daemon mode
app-postgres-app-1 | 2022-04-28T15:45:38: PM2 log: App [index:0] starting in -fork mode-
app-postgres-app-1 | 2022-04-28T15:45:38: PM2 log: App [index:0] online
app-postgres-app-1 | 🚀 NocoBase server running at: http://localhost:13000/#4. 登录 NocoBase
使用浏览器打开 http://localhost:13000,初始化账号和密码是 admin@nocobase.com 和 admin123。
账号安全提示
首次登录后,请及时修改默认密码以确保系统安全。
#5. 生产环境部署
如果你用的是内置 Nginx 镜像,通常来说不建议直接把 13000 暴露给公网。更常见的做法是把容器端口保留在宿主机本地,再由宿主机上的 Nginx 统一处理域名、HTTPS 和反向代理。
#通过 Nginx 代理根路径
下面这份配置把域名请求代理到 http://127.0.0.1:13000/:
server {
listen 80;
server_name your_domain.com; # 把 your_domain.com 替换成你的域名
location / {
proxy_pass http://127.0.0.1:13000/;
proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection $connection_upgrade;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $upstream_x_forwarded_proto;
proxy_set_header Host $final_host;
proxy_set_header Referer $http_referer;
proxy_set_header User-Agent $http_user_agent;
add_header Cache-Control "no-cache, no-store" always;
proxy_cache_bypass $http_upgrade;
proxy_connect_timeout 600;
proxy_send_timeout 600;
proxy_read_timeout 600;
send_timeout 600;
proxy_buffering off;
}
}如果你还要启用 HTTPS,可以继续在宿主机 Nginx 上配置 443 和证书。NocoBase 容器本身不需要额外处理证书。
这份根路径配置中的 location / 会同时代理 /api/、/ws 和 /files/。如果你拆分了静态资源和应用路由,仍需要确保 /files/ 被转发到 NocoBase,不能把它当作静态目录处理。
#子路径部署
如果你要把应用部署到子路径,比如 https://your_domain.com/nocobase/,那么需要先配置 APP_PUBLIC_PATH 环境变量:
services:
app:
image: nocobase/nocobase:latest
environment:
+ - APP_PUBLIC_PATH=/nocobase/这里的路径要保留前后的 /。配置完成后,应用的访问地址会变成 http://127.0.0.1:13000/nocobase/。
接着把宿主机 Nginx 配置成同样的子路径代理:
server {
listen 80;
server_name your_domain.com; # 把 your_domain.com 替换成你的域名
location /nocobase/ {
proxy_pass http://127.0.0.1:13000/nocobase/;
proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection $connection_upgrade;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $upstream_x_forwarded_proto;
proxy_set_header Host $final_host;
proxy_set_header Referer $http_referer;
proxy_set_header User-Agent $http_user_agent;
add_header Cache-Control "no-cache, no-store" always;
proxy_cache_bypass $http_upgrade;
proxy_connect_timeout 600;
proxy_send_timeout 600;
proxy_read_timeout 600;
send_timeout 600;
proxy_buffering off;
}
# 兼容根路径形式的文件访问 URL。
location ^~ /files/ {
proxy_pass http://127.0.0.1:13000;
proxy_http_version 1.1;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $upstream_x_forwarded_proto;
proxy_set_header Host $final_host;
proxy_set_header Referer $http_referer;
proxy_set_header User-Agent $http_user_agent;
add_header Cache-Control "no-cache, no-store" always;
proxy_connect_timeout 600;
proxy_send_timeout 600;
proxy_read_timeout 600;
send_timeout 600;
}
}其中:
APP_PUBLIC_PATH和proxy_pass里的路径必须保持一致。只要其中一边少了/nocobase/,静态资源和路由通常就会不正常/nocobase/files/会由location /nocobase/转发;根路径的/files/兼容入口需要单独转发到 NocoBase
#其他方案
如果你不想使用内置 Nginx,也可以看这两种单独的代理方案:

