diff --git a/.dockerignore b/.dockerignore new file mode 100644 index 00000000..ea583aa9 --- /dev/null +++ b/.dockerignore @@ -0,0 +1,9 @@ +.env +node_modules +logs +dist +website +page +client/desktop +client/desktop-old +client/app diff --git a/Dockerfile b/Dockerfile index e2f9101a..8645ec1e 100644 --- a/Dockerfile +++ b/Dockerfile @@ -4,28 +4,27 @@ FROM node:lts-alpine WORKDIR /app # Install dependencies -RUN npm install -g pnpm@7.1.9 +RUN npm install -g pnpm@7.3.0 # Install plugins and sdk dependency COPY ./server/packages ./server/packages COPY ./server/plugins ./server/plugins COPY ./server/package.json ./server/package.json +COPY ./server/tsconfig.json ./server/tsconfig.json COPY ./package.json ./pnpm-lock.yaml ./pnpm-workspace.yaml ./.npmrc ./ RUN pnpm install +# Copy client +COPY ./client ./client +RUN pnpm install + # Copy source COPY . . RUN pnpm install # Build and cleanup ENV NODE_ENV=production -RUN cd server && \ - pnpm run build && \ - # Install plugins(whitelist) - pnpm run plugin:install com.msgbyte.tasks com.msgbyte.linkmeta com.msgbyte.github com.msgbyte.simplenotify - -# Copy public files -RUN cd server && mkdir -p ./dist/public && cp -r ./public/plugins ./dist/public && cp ./public/registry.json ./dist/public +RUN pnpm run build # web static service port EXPOSE 3000 diff --git a/docker-compose.env b/docker-compose.env new file mode 100644 index 00000000..6f40a917 --- /dev/null +++ b/docker-compose.env @@ -0,0 +1,26 @@ +LOGGER=true +LOGLEVEL=info +SERVICEDIR=services + +TRANSPORTER=redis://redis:6379 + +CACHER=redis://redis:6379 + +REDIS_URL=redis://redis:6379 +MONGO_URL=mongodb://mongo/tailchat +SECRET= + +# file +API_URL=https://paw-server-nightly.moonrailgun.com + +# minio +MINIO_URL=minio:9000 +MINIO_USER=tailchat +MINIO_PASS=com.msgbyte.tailchat + +# SMTP +SMTP_SENDER= +SMTP_URI= + +# metrics +PROMETHEUS=1 diff --git a/docker-compose.yml b/docker-compose.yml new file mode 100644 index 00000000..2a7d5e15 --- /dev/null +++ b/docker-compose.yml @@ -0,0 +1,176 @@ +version: "3.3" + +services: + # 应用网关 + service-gateway: + build: + context: . + image: tailchat + restart: unless-stopped + env_file: docker-compose.env + environment: + SERVICES: core/gateway + PORT: 3000 + depends_on: + - mongo + - redis + labels: + - "traefik.enable=true" + - "traefik.http.routers.api-gw.rule=PathPrefix(`/`)" + - "traefik.http.services.api-gw.loadbalancer.server.port=3000" + networks: + - internal + + # 用户服务 + service-user: + build: + context: . + image: tailchat + restart: unless-stopped + env_file: docker-compose.env + environment: + SERVICES: core/user/* + depends_on: + - mongo + - redis + networks: + - internal + + # 群组服务 + service-group: + build: + context: . + image: tailchat + restart: unless-stopped + env_file: docker-compose.env + environment: + SERVICES: core/group/* + depends_on: + - mongo + - redis + networks: + - internal + + # 聊天服务 + service-chat: + build: + context: . + image: tailchat + restart: unless-stopped + env_file: docker-compose.env + environment: + SERVICES: core/chat/* + depends_on: + - mongo + - redis + networks: + - internal + + # 文件服务 / 插件注册中心 / 配置服务 + service-file: + build: + context: . + image: tailchat + restart: unless-stopped + env_file: docker-compose.env + environment: + SERVICES: core/file,core/plugin/registry,core/config + depends_on: + - mongo + - redis + - minio + networks: + - internal + + service-openapi: + build: + context: . + image: tailchat + restart: unless-stopped + env_file: docker-compose.env + environment: + SERVICES: openapi/app,openapi/oidc/oidc + OPENAPI_PORT: 3003 + OPENAPI_UNDER_PROXY: "true" + depends_on: + - mongo + - redis + - minio + labels: + - "traefik.enable=true" + - "traefik.http.routers.openapi-oidc.rule=PathPrefix(`/open`)" + - "traefik.http.services.openapi-oidc.loadbalancer.server.port=3003" + networks: + - internal + + # 插件服务(所有插件) + service-all-plugins: + build: + context: . + image: tailchat + restart: unless-stopped + env_file: docker-compose.env + environment: + SERVICEDIR: plugins + depends_on: + - mongo + - redis + - minio + networks: + - internal + + # 数据库 + mongo: + image: mongo:4 + restart: on-failure + volumes: + - data:/data/db + networks: + - internal + + # 数据缓存与中转通讯 + redis: + image: redis:alpine + restart: on-failure + networks: + - internal + + # 存储服务 + minio: + image: minio/minio + restart: on-failure + networks: + - internal + environment: + MINIO_ROOT_USER: tailchat + MINIO_ROOT_PASSWORD: com.msgbyte.tailchat + volumes: + - storage:/data + command: minio server /data --console-address ":9001" + + # 路由转发 + traefik: + image: traefik:v2.1 + restart: unless-stopped + command: + - "--api.insecure=true" # Don't do that in production! + - "--providers.docker=true" + - "--providers.docker.exposedbydefault=false" + - "--entryPoints.web.address=:80" + - "--entryPoints.web.forwardedHeaders.insecure" # Not good + ports: + - 11000:80 + - 127.0.0.1:11001:8080 + volumes: + - /var/run/docker.sock:/var/run/docker.sock:ro + networks: + - internal + - default + +networks: + internal: + name: tailchat-internal + +volumes: + data: + storage: diff --git a/package.json b/package.json index 05f80c55..cefdbfb4 100644 --- a/package.json +++ b/package.json @@ -8,6 +8,10 @@ "dev:web": "cd client/web && pnpm run dev", "dev:server": "cd server && pnpm run dev", "start:service": "cd server && pnpm run start:service", + "build": "concurrently npm:build:web npm:build:server", + "build:web": "cd client/web && pnpm run build", + "build:server": "cd server && pnpm run build && echo \"Install server side plugin:\" && pnpm run plugin:install com.msgbyte.tasks com.msgbyte.linkmeta com.msgbyte.github com.msgbyte.simplenotify && mkdir -p ./dist/public && cp -r ./public/plugins ./dist/public && cp ./public/registry.json ./dist/public", + "postbuild": "cp -r client/web/dist/* server/dist/public", "preinstall": "npx only-allow pnpm", "lint:fix": "eslint --fix './**/*.{ts,tsx}'", "prepare": "husky install"