Skip to content

Instantly share code, notes, and snippets.

@MarshalW
Last active July 18, 2022 07:58
Show Gist options
  • Save MarshalW/595290f51de6da4d953bb52796d88121 to your computer and use it in GitHub Desktop.
Save MarshalW/595290f51de6da4d953bb52796d88121 to your computer and use it in GitHub Desktop.
nocobase 基于 docker 的部署

nocobase 基于 docker 的部署

最简单的部署

使用官方的 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 统一处理。另外,前后端在日志和监控上逻辑不同,分开便于运维。

生成 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

compose 文件

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:

.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=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
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment