Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
17 changes: 10 additions & 7 deletions .env.example
Original file line number Diff line number Diff line change
Expand Up @@ -5,19 +5,22 @@ NODE_ENV=development
PORT=3000
API_PORT=3000

# CockroachDB Database (Prisma)
# Use the CockroachDB/PostgreSQL-compatible connection string from Cockroach Cloud.
# Example: postgresql://USER:PASSWORD@HOST:26257/defaultdb?sslmode=verify-full
DATABASE_URL=postgresql://USER:PASSWORD@HOST:26257/defaultdb?sslmode=verify-full
# PostgreSQL Database (used by Docker Compose)
POSTGRES_DB=graduation_backend
POSTGRES_USER=graduation
POSTGRES_PASSWORD=change_me

# Direct Prisma/PostgreSQL connection string for local commands outside Docker
DATABASE_URL=postgresql://graduation:change_me@localhost:5432/graduation_backend?schema=public

# Auth
JWT_ACCESS_KEY=
JWT_ACCESS_KEY=change-me-access-token-secret
ACCESS_TOKEN_EXPIRED_IN=1h
JWT_REFRESH_KEY=
JWT_REFRESH_KEY=change-me-refresh-token-secret
REFRESH_TOKEN_EXPIRED_IN=7d
FRONTEND_URL=

# Elasticsearch
ELASTICSEARCH_URL=http://elasticsearch:9200
ELASTICSEARCH_USERNAME=elastic
ELASTICSEARCH_PASSWORD=changeme
ELASTICSEARCH_PASSWORD=change_me
13 changes: 11 additions & 2 deletions Dockerfile
Original file line number Diff line number Diff line change
Expand Up @@ -21,7 +21,7 @@ CMD ["npm", "run", "start:dev"]
FROM base AS build

ENV NODE_ENV=development
ENV DATABASE_URL=postgresql://root@localhost:26257/defaultdb?sslmode=disable
ENV DATABASE_URL=postgresql://postgres:postgres@postgres:5432/graduation_backend?schema=public

RUN npm ci

Expand All @@ -36,11 +36,20 @@ FROM base AS production

ENV NODE_ENV=production

RUN mkdir -p logs && chown -R node:node /app

COPY --from=build /app/node_modules ./node_modules
COPY --from=build /app/dist ./dist
COPY package*.json ./
COPY prisma.config.ts ./
COPY src/docs ./src/docs
COPY prisma ./prisma

USER node

EXPOSE 3000

CMD ["npm", "start"]
HEALTHCHECK --interval=30s --timeout=5s --start-period=30s --retries=3 \
CMD node -e "require('http').get('http://127.0.0.1:3000/health', (res) => process.exit(res.statusCode === 200 ? 0 : 1)).on('error', () => process.exit(1))"

CMD ["sh", "-c", "npx prisma migrate deploy && npm start"]
39 changes: 33 additions & 6 deletions docker-compose.yml
Original file line number Diff line number Diff line change
Expand Up @@ -8,43 +8,70 @@ services:
environment:
NODE_ENV: production
PORT: 3000
DATABASE_URL: ${DATABASE_URL:?DATABASE_URL is required}
JWT_ACCESS_KEY: ${JWT_ACCESS_KEY:?JWT_ACCESS_KEY is required}
JWT_REFRESH_KEY: ${JWT_REFRESH_KEY:?JWT_REFRESH_KEY is required}
DATABASE_URL: postgresql://${POSTGRES_USER:-graduation}:${POSTGRES_PASSWORD:-change_me}@postgres:5432/${POSTGRES_DB:-graduation_backend}?schema=public
JWT_ACCESS_KEY: ${JWT_ACCESS_KEY:-change-me-access-token-secret}
JWT_REFRESH_KEY: ${JWT_REFRESH_KEY:-change-me-refresh-token-secret}
ACCESS_TOKEN_EXPIRED_IN: ${ACCESS_TOKEN_EXPIRED_IN:-1h}
REFRESH_TOKEN_EXPIRED_IN: ${REFRESH_TOKEN_EXPIRED_IN:-7d}
FRONTEND_URL: ${FRONTEND_URL:-}
ELASTICSEARCH_URL: http://elasticsearch:9200
ELASTICSEARCH_USERNAME: ${ELASTICSEARCH_USERNAME:-elastic}
ELASTICSEARCH_PASSWORD: ${ELASTICSEARCH_PASSWORD:-changeme}
ELASTICSEARCH_PASSWORD: ${ELASTICSEARCH_PASSWORD:-change_me}
ports:
- '${API_PORT:-3000}:3000'
depends_on:
postgres:
condition: service_healthy
elasticsearch:
condition: service_healthy
restart: unless-stopped

postgres:
image: postgres:16-alpine
container_name: graduation_postgres
environment:
POSTGRES_DB: ${POSTGRES_DB:-graduation_backend}
POSTGRES_USER: ${POSTGRES_USER:-graduation}
POSTGRES_PASSWORD: ${POSTGRES_PASSWORD:-change_me}
POSTGRES_INITDB_ARGS: --auth-host=scram-sha-256
expose:
- '5432'
volumes:
- postgres_data:/var/lib/postgresql/data
healthcheck:
test: ['CMD-SHELL', 'pg_isready -U "$${POSTGRES_USER}" -d "$${POSTGRES_DB}"']
interval: 10s
timeout: 5s
retries: 5
restart: unless-stopped

elasticsearch:
image: docker.elastic.co/elasticsearch/elasticsearch:8.12.0
container_name: elasticsearch
environment:
- discovery.type=single-node
- xpack.security.enabled=true
- xpack.security.http.ssl.enabled=false
- ELASTIC_PASSWORD=${ELASTICSEARCH_PASSWORD:-changeme}
- ELASTIC_PASSWORD=${ELASTICSEARCH_PASSWORD:-change_me}
- 'ES_JAVA_OPTS=-Xms512m -Xmx512m'
expose:
- '9200'
- '9300'
volumes:
- elasticsearch_data:/usr/share/elasticsearch/data
healthcheck:
test: ['CMD-SHELL', 'curl -fsS -u elastic:$${ELASTIC_PASSWORD} http://localhost:9200/_cluster/health || exit 1']
test:
[
'CMD-SHELL',
'curl -fsS -u elastic:$${ELASTIC_PASSWORD} http://localhost:9200/_cluster/health || exit 1',
]
interval: 30s
timeout: 10s
retries: 5
restart: unless-stopped

volumes:
postgres_data:
driver: local
elasticsearch_data:
driver: local
Loading
Loading