diff --git a/.dockerignore b/.dockerignore new file mode 100644 index 0000000..9784c4d --- /dev/null +++ b/.dockerignore @@ -0,0 +1,11 @@ +node_modules +.next +.turbo +dist +.git +*.log +.env +.env.local +.env.* +!packages/database/.env.example +apps/web/.env.local diff --git a/docker/Dockerfile.ai b/docker/Dockerfile.ai new file mode 100644 index 0000000..cf0e0e6 --- /dev/null +++ b/docker/Dockerfile.ai @@ -0,0 +1,20 @@ +FROM node:20-alpine + +RUN corepack enable && corepack prepare pnpm@9.0.0 --activate + +WORKDIR /app + +COPY package.json pnpm-lock.yaml pnpm-workspace.yaml ./ +COPY apps/api/package.json apps/api/ +COPY apps/ai-service/package.json apps/ai-service/ +COPY packages/database/package.json packages/database/ +COPY packages/shared/package.json packages/shared/ + +RUN pnpm install --frozen-lockfile + +COPY . . + +RUN pnpm build --filter=@coursecraft/ai-service... + +WORKDIR /app +CMD ["node", "apps/ai-service/dist/index.js"] diff --git a/docker/Dockerfile.api b/docker/Dockerfile.api new file mode 100644 index 0000000..b34bc28 --- /dev/null +++ b/docker/Dockerfile.api @@ -0,0 +1,21 @@ +FROM node:20-alpine + +RUN corepack enable && corepack prepare pnpm@9.0.0 --activate + +WORKDIR /app + +COPY package.json pnpm-lock.yaml pnpm-workspace.yaml ./ +COPY apps/api/package.json apps/api/ +COPY apps/web/package.json apps/web/ +COPY apps/ai-service/package.json apps/ai-service/ +COPY packages/database/package.json packages/database/ +COPY packages/shared/package.json packages/shared/ + +RUN pnpm install --frozen-lockfile + +COPY . . + +RUN pnpm build --filter=@coursecraft/api... + +EXPOSE 3125 +CMD ["node", "apps/api/dist/main.js"] diff --git a/docker/Dockerfile.web b/docker/Dockerfile.web new file mode 100644 index 0000000..6085d98 --- /dev/null +++ b/docker/Dockerfile.web @@ -0,0 +1,23 @@ +FROM node:20-alpine + +RUN corepack enable && corepack prepare pnpm@9.0.0 --activate + +WORKDIR /app + +COPY package.json pnpm-lock.yaml pnpm-workspace.yaml ./ +COPY apps/api/package.json apps/api/ +COPY apps/web/package.json apps/web/ +COPY apps/ai-service/package.json apps/ai-service/ +COPY packages/database/package.json packages/database/ +COPY packages/shared/package.json packages/shared/ + +RUN pnpm install --frozen-lockfile + +COPY . . + +RUN pnpm build --filter=@coursecraft/web... + +EXPOSE 3080 +ENV PORT=3080 +WORKDIR /app +CMD ["pnpm", "--filter", "@coursecraft/web", "start"] diff --git a/docker/docker-compose.yml b/docker/docker-compose.yml index c8ac6ad..1691412 100644 --- a/docker/docker-compose.yml +++ b/docker/docker-compose.yml @@ -50,6 +50,59 @@ services: timeout: 5s retries: 5 + api: + build: + context: .. + dockerfile: docker/Dockerfile.api + container_name: coursecraft-api + restart: unless-stopped + env_file: ../.env + environment: + DATABASE_URL: postgresql://postgres:postgres@postgres:5432/coursecraft?schema=public + REDIS_URL: redis://redis:6379 + REDIS_HOST: redis + REDIS_PORT: "6379" + MEILISEARCH_HOST: http://meilisearch:7700 + PORT: "3125" + NODE_ENV: production + ports: + - "3125:3125" + depends_on: + postgres: { condition: service_healthy } + redis: { condition: service_healthy } + meilisearch: { condition: service_healthy } + + ai-service: + build: + context: .. + dockerfile: docker/Dockerfile.ai + container_name: coursecraft-ai-service + restart: unless-stopped + env_file: ../.env + environment: + REDIS_URL: redis://redis:6379 + REDIS_HOST: redis + REDIS_PORT: "6379" + NODE_ENV: production + depends_on: + redis: { condition: service_healthy } + + web: + build: + context: .. + dockerfile: docker/Dockerfile.web + container_name: coursecraft-web + restart: unless-stopped + env_file: ../.env + environment: + API_URL: http://api:3125 + PORT: "3080" + NODE_ENV: production + ports: + - "3080:3080" + depends_on: + - api + networks: default: name: coursecraft-network