Docker setup

This commit is contained in:
Ahmed Al-Taiar
2024-09-05 12:14:36 -04:00
parent 97db911c48
commit 3204a8319c
8 changed files with 305 additions and 1 deletions

18
.dockerignore Normal file
View File

@ -0,0 +1,18 @@
**/node_modules
**/dist
.redwood
.env
README.md
LICENSE
.git
.gitignore
.vscode
.editorconfig
Dockerfile
docker-compose*
.dockerignore

1
.gitignore vendored
View File

@ -23,3 +23,4 @@ api/src/lib/generateGraphiQLHeader.*
!.yarn/sdks !.yarn/sdks
!.yarn/versions !.yarn/versions
files_* files_*
postgres

162
Dockerfile Normal file
View File

@ -0,0 +1,162 @@
# base
# ----
FROM node:20-bookworm-slim as base
RUN corepack enable
# We tried to make the Dockerfile as lean as possible. In some cases, that means we excluded a dependency your project needs.
# By far the most common is Python. If you're running into build errors because `python3` isn't available,
# add `python3 make gcc \` before the `openssl \` line below and in other stages as necessary:
RUN apt-get update && apt-get install -y \
openssl \
&& rm -rf /var/lib/apt/lists/*
USER node
WORKDIR /home/node/app
COPY --chown=node:node .yarnrc.yml .
COPY --chown=node:node package.json .
COPY --chown=node:node api/package.json api/
COPY --chown=node:node web/package.json web/
COPY --chown=node:node yarn.lock .
RUN mkdir -p /home/node/.yarn/berry/index
RUN mkdir -p /home/node/.cache
RUN --mount=type=cache,target=/home/node/.yarn/berry/cache,uid=1000 \
--mount=type=cache,target=/home/node/.cache,uid=1000 \
CI=1 yarn install
COPY --chown=node:node redwood.toml .
COPY --chown=node:node graphql.config.js .
COPY --chown=node:node .env.defaults .env.defaults
# api build
# ---------
FROM base as api_build
# If your api side build relies on build-time environment variables,
# specify them here as ARGs. (But don't put secrets in your Dockerfile!)
#
# ARG MY_BUILD_TIME_ENV_VAR
COPY --chown=node:node api api
RUN yarn rw build api
# web prerender build
# -------------------
FROM api_build as web_build_with_prerender
ARG NAME
ARG API_ADDRESS_PROD
ARG API_ADDRESS_DEV
COPY --chown=node:node web web
RUN yarn rw build web
# web build
# ---------
FROM base as web_build
ARG NAME
ARG API_ADDRESS_PROD
ARG API_ADDRESS_DEV
COPY --chown=node:node web web
RUN yarn rw build web --no-prerender
# api serve
# ---------
FROM node:20-bookworm-slim as api_serve
RUN corepack enable
RUN apt-get update && apt-get install -y \
openssl \
&& rm -rf /var/lib/apt/lists/*
USER node
WORKDIR /home/node/app
COPY --chown=node:node .yarnrc.yml .
COPY --chown=node:node package.json .
COPY --chown=node:node api/package.json api/
COPY --chown=node:node yarn.lock .
RUN mkdir -p /home/node/.yarn/berry/index
RUN mkdir -p /home/node/.cache
RUN --mount=type=cache,target=/home/node/.yarn/berry/cache,uid=1000 \
--mount=type=cache,target=/home/node/.cache,uid=1000 \
CI=1 yarn workspaces focus api --production
COPY --chown=node:node redwood.toml .
COPY --chown=node:node graphql.config.js .
COPY --chown=node:node .env.defaults .env.defaults
COPY --chown=node:node --from=api_build /home/node/app/api/dist /home/node/app/api/dist
COPY --chown=node:node --from=api_build /home/node/app/api/db /home/node/app/api/db
COPY --chown=node:node --from=api_build /home/node/app/node_modules/.prisma /home/node/app/node_modules/.prisma
ENV NODE_ENV=production
# default api serve command
# ---------
# If you are using a custom server file, you must use the following
# command to launch your server instead of the default api-server below.
# This is important if you intend to configure GraphQL to use Realtime.
#
# CMD [ "./api/dist/server.js" ]
CMD [ "node_modules/.bin/rw-server", "api" ]
# web serve
# ---------
FROM node:20-bookworm-slim as web_serve
RUN corepack enable
USER node
WORKDIR /home/node/app
COPY --chown=node:node .yarnrc.yml .
COPY --chown=node:node package.json .
COPY --chown=node:node web/package.json web/
COPY --chown=node:node yarn.lock .
RUN mkdir -p /home/node/.yarn/berry/index
RUN mkdir -p /home/node/.cache
RUN --mount=type=cache,target=/home/node/.yarn/berry/cache,uid=1000 \
--mount=type=cache,target=/home/node/.cache,uid=1000 \
CI=1 yarn workspaces focus web --production
COPY --chown=node:node redwood.toml .
COPY --chown=node:node graphql.config.js .
COPY --chown=node:node .env.defaults .env.defaults
COPY --chown=node:node --from=web_build /home/node/app/web/dist /home/node/app/web/dist
ENV NODE_ENV=production \
API_PROXY_TARGET=http://api:8911
# We use the shell form here for variable expansion.
CMD "node_modules/.bin/rw-web-server" "--api-proxy-target" "$API_PROXY_TARGET"
# console
# -------
FROM base as console
# To add more packages:
#
# ```
# USER root
#
# RUN apt-get update && apt-get install -y \
# curl
#
# USER node
# ```
COPY --chown=node:node api api
COPY --chown=node:node web web
COPY --chown=node:node scripts scripts

58
docker-compose.dev.yml Normal file
View File

@ -0,0 +1,58 @@
services:
redwood:
build:
context: .
dockerfile: ./Dockerfile
target: base
command: yarn rw dev
volumes:
- .:/home/node/app
- node_modules:/home/node/app/node_modules
ports:
- '8910:8910'
depends_on:
- db
environment:
- DATABASE_URL=postgresql://redwood:redwood@db:5432/redwood
- TEST_DATABASE_URL=postgresql://redwood:redwood@db:5432/redwood_test
- SESSION_SECRET=super_secret_session_key_change_me_in_production_please
- CI=
- NODE_ENV=development
- REDWOOD_API_HOST=0.0.0.0
db:
image: postgres:16-bookworm
environment:
POSTGRES_USER: redwood
POSTGRES_PASSWORD: redwood
POSTGRES_DB: redwood
ports:
- '5432:5432'
volumes:
- postgres:/var/lib/postgresql/data
# After starting with `docker compose -f ./docker-compose.dev.yml up`,
# use the console to run commands in the container:
#
# ```
# docker compose -f ./docker-compose.dev.yml run --rm -it console /bin/bash
# root@...:/home/node/app# yarn rw prisma migrate dev
# ```
console:
user: root
build:
context: .
dockerfile: ./Dockerfile
target: console
tmpfs:
- /tmp
command: 'true'
environment:
- DATABASE_URL=postgresql://redwood:redwood@db:5432/redwood
- TEST_DATABASE_URL=postgresql://redwood:redwood@db:5432/redwood_test
depends_on:
- db
volumes:
node_modules:
postgres:

63
docker-compose.prod.yml Normal file
View File

@ -0,0 +1,63 @@
services:
api:
build:
context: .
dockerfile: ./Dockerfile
target: api_serve
# Without a command specified, the Dockerfile's api_serve CMD will be used.
# If you are using a custom server file, you should either use the following
# command to launch your server or update the Dockerfile to do so.
# This is important if you intend to configure GraphQL to use Realtime.
# command: "./api/dist/server.js"
ports:
- '8911:8911'
depends_on:
- db
environment:
- DATABASE_URL=postgresql://redwood:redwood@db:5432/redwood
- TEST_DATABASE_URL=postgresql://redwood:redwood@db:5432/redwood_test
- SESSION_SECRET=super_secret_session_key_change_me_in_production_please
web:
build:
context: .
dockerfile: ./Dockerfile
target: web_serve
ports:
- '8910:8910'
depends_on:
- api
environment:
- API_PROXY_TARGET=http://api:8911
db:
image: postgres:16-bookworm
environment:
POSTGRES_USER: redwood
POSTGRES_PASSWORD: redwood
POSTGRES_DB: redwood
ports:
- '5432:5432'
volumes:
- ./postgres:/var/lib/postgresql/data
# After starting with `docker compose -f ./docker-compose.prod.yml up`,
# use the console to run commands in the container:
#
# ```
# docker compose -f ./docker-compose.prod.yml run --rm -it console /bin/bash
# ```
console:
user: root
build:
context: .
dockerfile: ./Dockerfile
target: console
tmpfs:
- /tmp
command: 'true'
environment:
- DATABASE_URL=postgresql://redwood:redwood@db:5432/redwood
- TEST_DATABASE_URL=postgresql://redwood:redwood@db:5432/redwood_test
depends_on:
- db

View File

@ -16,6 +16,6 @@
[api] [api]
port = 8911 port = 8911
[browser] [browser]
open = true open = false
[notifications] [notifications]
versionUpdates = ["latest"] versionUpdates = ["latest"]

View File

@ -18,6 +18,7 @@
"@redwoodjs/forms": "8.0.0", "@redwoodjs/forms": "8.0.0",
"@redwoodjs/router": "8.0.0", "@redwoodjs/router": "8.0.0",
"@redwoodjs/web": "8.0.0", "@redwoodjs/web": "8.0.0",
"@redwoodjs/web-server": "8.0.0",
"@uppy/compressor": "^2.0.1", "@uppy/compressor": "^2.0.1",
"@uppy/core": "^4.1.0", "@uppy/core": "^4.1.0",
"@uppy/dashboard": "^4.0.2", "@uppy/dashboard": "^4.0.2",

View File

@ -18220,6 +18220,7 @@ __metadata:
"@redwoodjs/router": "npm:8.0.0" "@redwoodjs/router": "npm:8.0.0"
"@redwoodjs/vite": "npm:8.0.0" "@redwoodjs/vite": "npm:8.0.0"
"@redwoodjs/web": "npm:8.0.0" "@redwoodjs/web": "npm:8.0.0"
"@redwoodjs/web-server": "npm:8.0.0"
"@types/react": "npm:^18.2.55" "@types/react": "npm:^18.2.55"
"@types/react-dom": "npm:^18.2.19" "@types/react-dom": "npm:^18.2.19"
"@uppy/compressor": "npm:^2.0.1" "@uppy/compressor": "npm:^2.0.1"