使用官方的 docker image,前后端在同一个 docker container 中。
docker-compose.yml
version: "3"
networks:
nocobase:
driver: bridge
services:
app:
image: ${APP_VERSION}
container_name: app
networks:
- nocobase
depends_on:
- mysql
volumes:
- upload-data:/app/nocobase/storage/uploads
- /etc/localtime:/etc/localtime:ro
ports:
- "13000:80"
mysql:
image: ${MYSQL_VERSION}
container_name: mysql
restart: unless-stopped
cap_add:
- SYS_NICE
volumes:
- mysql-data:/var/lib/mysql
- /etc/localtime:/etc/localtime:ro
networks:
- nocobase
volumes:
mysql-data:
upload-data:
.env
APP_ENV=production
APP_KEY=p90B25MBkBPYJ5cGuQvGRTdoQzkBjf7yH/Y+mAzJ0nsC9MH2udxuNJIztAMaPQlGe50ph5frobSDcgrsb76MDI+Gd092UrOA+UV+/KpQaEvZ6UbC4+GC4uk4IxbTHEjO7t69efl06LS3LjLrcBG7rcxIc2KRtmhj8vgsf1YuhBA1gStJrW2WCq0RFGP6DUVmyo9AnbG3/di1KgEGY14biByb9Ml4adahceXtdCQ3B4SqVVyUhfeMgPuzRYtPKJb7H+T3rZ1lHwMKPlCxA0anmLp44WUjEpZ3Sp4sHocZ+FUvg103NYvVhmXVhSA+BozZayICOhFODTLUh/IpTWS4+g==
APP_PORT=13000
API_BASE_PATH=/api/
API_BASE_URL=
DB_LOGGING=off
DB_DIALECT=mysql
DB_HOST=localhost
DB_PORT=3306
DB_DATABASE=nocobase
DB_USER=nocobase
DB_PASSWORD=nocobase
INIT_ROOT_EMAIL=admin@nocobase.com
INIT_ROOT_PASSWORD=admin123
INIT_ROOT_NICKNAME=Super Admin
APP_VERSION=nocobase/nocobase:0.7.2-alpha.7
MYSQL_VERSION=mysql:8.0.29-debian
MYSQL_ROOT_PASSWORD=password
MYSQL_USER=nocobase
MYSQL_PASSWORD=nocobase
MYSQL_DATABASE=nocobase
两个文件放在同一个目录下,然后:
docker-compose up -d
前端和后端在同一个容器中,要么自己要写脚本,要么使用比如 supervisor
处理子进程,都带来额外的复杂性。
不如直接用 docker 统一处理。另外,前后端在日志和监控上逻辑不同,分开便于运维。
Dockerfile:
FROM node:18-bullseye-slim
WORKDIR /usr/src/app
RUN cd /usr/src/app \
&& yarn create nocobase-app my-app -a -e APP_ENV=production \
&& cd /usr/src/app/my-app \
&& yarn install --production
FROM nginx:alpine as my-app-client
COPY --from=0 /usr/src/app/my-app/packages/app/client/dist /usr/share/nginx/html
COPY ./nginx/nginx.conf /etc/nginx/conf.d/default.conf
WORKDIR /usr/share/nginx/html
CMD nginx -g 'daemon off;'
FROM node:18-alpine as my-app-server
WORKDIR /usr/src/app/my-app
COPY --from=0 /usr/src/app/my-app .
COPY start.sh /usr/src/app/my-app
CMD ["/usr/src/app/my-app/start.sh"]
./nginx/nginx.conf:
server {
listen 80;
listen [::]:80;
server_name localhost;
location / {
root /usr/share/nginx/html;
try_files $uri /index.html;
# index index.html index.htm;
}
#error_page 404 /404.html;
# redirect server error pages to the static page /50x.html
#
error_page 500 502 503 504 /50x.html;
location = /50x.html {
root /usr/share/nginx/html;
}
location ^~ /api/ {
proxy_pass http://server:13000/api/;
proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection 'upgrade';
proxy_set_header Host $host;
proxy_cache_bypass $http_upgrade;
}
}
start.sh:
#!/bin/sh
set -e
node packages/app/server/lib/index.js install -s
node packages/app/server/lib/index.js upgrade -S
node packages/app/server/lib/index.js start
生成镜像:
# 生成服务器端镜像
docker build . -t my-server-client
# 生成前端镜像
docker build . -t my-app-client --target my-app-client
docker-compose.yml:
version: "3"
networks:
nocobase:
driver: bridge
services:
client:
image: my-app-client
container_name: client
networks:
- nocobase
env_file:
- .env
ports:
- "13000:80"
depends_on:
- server
server:
image: my-app-server
container_name: server
init: true
networks:
- nocobase
depends_on:
- mysql
volumes:
- upload-data:/app/nocobase/storage/uploads
- /etc/localtime:/etc/localtime:ro
env_file:
- .env
mysql:
image: ${MYSQL_VERSION}
container_name: mysql
restart: unless-stopped
cap_add:
- SYS_NICE
volumes:
- mysql-data:/var/lib/mysql
- /etc/localtime:/etc/localtime:ro
networks:
- nocobase
env_file:
- .env
volumes:
mysql-data:
upload-data:
APP_ENV=production
APP_KEY=p90B25MBkBPYJ5cGuQvGRTdoQzkBjf7yH/Y+mAzJ0nsC9MH2udxuNJIztAMaPQlGe50ph5frobSDcgrsb76MDI+Gd092UrOA+UV+/KpQaEvZ6UbC4+GC4uk4IxbTHEjO7t69efl06LS3LjLrcBG7rcxIc2KRtmhj8vgsf1YuhBA1gStJrW2WCq0RFGP6DUVmyo9AnbG3/di1KgEGY14biByb9Ml4adahceXtdCQ3B4SqVVyUhfeMgPuzRYtPKJb7H+T3rZ1lHwMKPlCxA0anmLp44WUjEpZ3Sp4sHocZ+FUvg103NYvVhmXVhSA+BozZayICOhFODTLUh/IpTWS4+g==
APP_PORT=13000
API_BASE_PATH=/api/
API_BASE_URL=http://192.168.5.188:13000/api
DB_LOGGING=off
DB_DIALECT=mysql
DB_HOST=mysql
DB_PORT=3306
DB_DATABASE=nocobase
DB_USER=nocobase
DB_PASSWORD=nocobase
INIT_ROOT_EMAIL=admin@nocobase.com
INIT_ROOT_PASSWORD=admin123
INIT_ROOT_NICKNAME=Super Admin
APP_VERSION=nocobase/nocobase:0.7.2-alpha.7
MYSQL_VERSION=mysql:8.0.29-debian
MYSQL_ROOT_PASSWORD=password
MYSQL_USER=nocobase
MYSQL_PASSWORD=nocobase
MYSQL_DATABASE=nocobase