wip: testing container workflows and deployment images (#715)

* feat: add Dockerfile.multi for building API, Client, and Data Provider

feat: add nginx.conf for client-side routing in Nginx

feat: add deploy-compose.yml for deploying the application with Docker Compose

chore: update version in deploy-compose.yml to 3.8

chore: remove unused configuration in docs/dev/deploy-compose.yml

* chore(Dockerfile.multi): Remove data-provider build stage
chore(deploy-compose.yml): Add NODE_ENV=production environment variable

* chore(Dockerfile.multi): add environment variable NODE_OPTIONS with value "--max-old-space-size=776"
feat(Dockerfile.multi): copy client build output to api build stage

* chore(Dockerfile.multi): update NODE_OPTIONS to increase max-old-space-size to 2048
chore(deploy-compose.yml): remove NODE_ENV=production environment variable

* feat(dev-images.yml): add GitHub Actions workflow for Docker multi-stage build on push to main branch
This commit is contained in:
Danny Avila 2023-07-27 16:24:06 -04:00 committed by GitHub
parent 369b1f4eba
commit 32281d1b8d
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
5 changed files with 155 additions and 43 deletions

46
.github/workflows/dev-images.yml vendored Normal file
View file

@ -0,0 +1,46 @@
name: Docker Multi-Stage Build on Push to Main
# The workflow is triggered when a push is made to the main branch
on:
push:
branches:
- main
jobs:
build:
runs-on: ubuntu-latest
steps:
# Check out the repository
- name: Checkout
uses: actions/checkout@v2
# Set up Docker
- name: Set up Docker
uses: docker/setup-buildx-action@v1
# Log in to GitHub Container Registry
- name: Log in to GitHub Container Registry
uses: docker/login-action@v2
with:
registry: ghcr.io
username: ${{ github.actor }}
password: ${{ secrets.GITHUB_TOKEN }}
# Build Docker images
- name: Build Docker images
run: |
cp .env.example .env
docker build -f Dockerfile.multi --target api-build -t librechat-dev-api .
docker build -f Dockerfile.multi --target prod-stage -t librechat-dev-client .
docker build -f Dockerfile -t librechat-dev .
# Tag and push the images to GitHub Container Registry
- name: Tag and push images
run: |
docker tag librechat-dev-api:latest ghcr.io/${{ github.repository_owner }}/librechat-dev-api:${{ github.sha }}
docker push ghcr.io/${{ github.repository_owner }}/librechat-dev-api:${{ github.sha }}
docker tag librechat-dev-client:latest ghcr.io/${{ github.repository_owner }}/librechat-dev-client:${{ github.sha }}
docker push ghcr.io/${{ github.repository_owner }}/librechat-dev-client:${{ github.sha }}
docker tag librechat-dev:latest ghcr.io/${{ github.repository_owner }}/librechat-dev:${{ github.sha }}
docker push ghcr.io/${{ github.repository_owner }}/librechat-dev:${{ github.sha }}

33
Dockerfile.multi Normal file
View file

@ -0,0 +1,33 @@
# Build API, Client and Data Provider
FROM node:19-alpine AS base
WORKDIR /app
COPY config/loader.js ./config/
RUN npm install dotenv
WORKDIR /app/api
COPY api/package*.json ./
COPY api/ ./
RUN npm install
# React client build
FROM base AS client-build
WORKDIR /app/client
COPY ./client/ ./
RUN npm install
ENV NODE_OPTIONS="--max-old-space-size=2048"
RUN npm run build
# Node API setup
FROM base AS api-build
COPY --from=client-build /app/client/dist /app/client/dist
EXPOSE 3080
ENV HOST=0.0.0.0
CMD ["NODE_ENV=production", "node", "server/index.js"]
# Nginx setup
FROM nginx:1.21.1-alpine AS prod-stage
COPY --from=client-build /app/client/dist /usr/share/nginx/html
COPY ./client/nginx.conf /etc/nginx/conf.d/default.conf
CMD ["nginx", "-g", "daemon off;"]

View file

@ -1,9 +1,4 @@
events { server {
worker_connections 1024;
}
http {
server {
listen 80; listen 80;
server_name localhost; server_name localhost;
@ -15,5 +10,4 @@ http {
root /usr/share/nginx/html; root /usr/share/nginx/html;
try_files $uri $uri/ /index.html; try_files $uri $uri/ /index.html;
} }
}
} }

55
deploy-compose.yml Normal file
View file

@ -0,0 +1,55 @@
version: "3.8"
services:
api:
build:
context: .
dockerfile: Dockerfile.multi
target: api-build
container_name: LibreChat-API
ports:
- 9000:3080
depends_on:
- mongodb
restart: always
extra_hosts:
- "host.docker.internal:host-gateway"
env_file:
- .env
environment:
- HOST=0.0.0.0
- MONGO_URI=mongodb://mongodb:27017/LibreChat
- MEILI_HOST=http://meilisearch:7700
- MEILI_HTTP_ADDR=meilisearch:7700
client:
build:
context: .
dockerfile: Dockerfile.multi
target: prod-stage
ports:
- 80:80
- 443:443
depends_on:
- api
restart: always
mongodb:
container_name: chat-mongodb
ports:
- 27018:27017
image: mongo
restart: always
volumes:
- ./data-node:/data/db
command: mongod --noauth
meilisearch:
container_name: chat-meilisearch
image: getmeili/meilisearch:v1.0
ports:
- 7700:7700
env_file:
- .env
environment:
- MEILI_HOST=http://meilisearch:7700
- MEILI_HTTP_ADDR=meilisearch:7700
- MEILI_NO_ANALYTICS=true
volumes:
- ./meili_data:/meili_data

View file

@ -1,46 +1,30 @@
version: "3.4" version: "3.8"
services: services:
client:
image: nginx:latest
restart: always
ports:
- 80:80
- 443:443
volumes:
- ../../client/nginx.conf:/etc/nginx/nginx.conf
- /app/client/node_modules
depends_on:
- api
api: api:
image: api
container_name: LibreChat container_name: LibreChat
ports: ports:
- 9000:3080 - 9000:3080
depends_on: depends_on:
- mongodb - mongodb
image: ghcr.io/danny-avila/librechat:latest
# image: librechat_deploy
# build:
# context: ../../
# target: node
restart: always restart: always
extra_hosts: extra_hosts:
- "host.docker.internal:host-gateway" - "host.docker.internal:host-gateway"
env_file: env_file:
- ../../.env - .env
environment: environment:
- HOST=0.0.0.0 - HOST=0.0.0.0
- MONGO_URI=mongodb://mongodb:27017/LibreChat - MONGO_URI=mongodb://mongodb:27017/LibreChat
- MEILI_HOST=http://meilisearch:7700 - MEILI_HOST=http://meilisearch:7700
- MEILI_HTTP_ADDR=meilisearch:7700 - MEILI_HTTP_ADDR=meilisearch:7700
volumes: client:
- /app/client/node_modules image: client
- ../../api:/app/api ports:
- ../../.env:/app/.env - 80:80
- ../../.env.development:/app/.env.development - 443:443
- ../../.env.production:/app/.env.production depends_on:
- /app/api/node_modules - api
- ../../images:/app/client/public/images restart: always
mongodb: mongodb:
container_name: chat-mongodb container_name: chat-mongodb
ports: ports:
@ -56,7 +40,7 @@ services:
ports: ports:
- 7700:7700 - 7700:7700
env_file: env_file:
- ../../.env - .env
environment: environment:
- MEILI_HOST=http://meilisearch:7700 - MEILI_HOST=http://meilisearch:7700
- MEILI_HTTP_ADDR=meilisearch:7700 - MEILI_HTTP_ADDR=meilisearch:7700