diff --git a/Dockerfile b/Dockerfile new file mode 100644 index 0000000..70017bf --- /dev/null +++ b/Dockerfile @@ -0,0 +1,28 @@ +FROM node:20-alpine AS deps +WORKDIR /app +RUN corepack enable +COPY package.json pnpm-lock.yaml pnpm-workspace.yaml ./ +COPY apps/api/package.json apps/api/package.json +RUN pnpm install --frozen-lockfile + +FROM node:20-alpine AS build +WORKDIR /app +RUN corepack enable +COPY --from=deps /app/node_modules ./node_modules +COPY --from=deps /app/apps/api/node_modules ./apps/api/node_modules +COPY . . +RUN pnpm --filter @cryptowallet/api build +RUN pnpm prune --prod + +FROM node:20-alpine AS runtime +WORKDIR /app +ENV NODE_ENV=production +RUN corepack enable +COPY --from=build /app/package.json /app/pnpm-lock.yaml /app/pnpm-workspace.yaml ./ +COPY --from=build /app/node_modules ./node_modules +COPY --from=build /app/apps/api/package.json ./apps/api/package.json +COPY --from=build /app/apps/api/node_modules ./apps/api/node_modules +COPY --from=build /app/apps/api/dist ./apps/api/dist +COPY --from=build /app/apps/api/swagger.json ./apps/api/swagger.json +EXPOSE 3001 +CMD ["pnpm","--filter","@cryptowallet/api","start"] diff --git a/docker-compose.yml b/docker-compose.yml new file mode 100644 index 0000000..150a854 --- /dev/null +++ b/docker-compose.yml @@ -0,0 +1,59 @@ +services: + api: + build: + context: . + dockerfile: Dockerfile + restart: unless-stopped + ports: + - '${API_PORT:-3001}:${API_PORT:-3001}' + environment: + API_PORT: '${API_PORT:-3001}' + LOG_LEVEL: '${LOG_LEVEL:-INFO}' + DB_HOST: '${DB_HOST:-postgres}' + DB_PORT: '${DB_PORT:-5432}' + DB_USER: '${DB_USER:-cryptowallet}' + DB_PASSWORD: '${DB_PASSWORD:-cryptowallet}' + DB_NAME: '${DB_NAME:-cryptowallet}' + VAULT_ADDR: '${VAULT_ADDR:-}' + VAULT_ROLE_ID: '${VAULT_ROLE_ID:-}' + VAULT_SECRET_ID: '${VAULT_SECRET_ID:-}' + VAULT_MOUNT_POINT: '${VAULT_MOUNT_POINT:-dev-secrets}' + VAULT_SECRET_PATH: '${VAULT_SECRET_PATH:-database}' + VAULT_JWT_KID_PATH: '${VAULT_JWT_KID_PATH:-jwt/kid}' + VAULT_JWT_KIDS_PREFIX: '${VAULT_JWT_KIDS_PREFIX:-jwt/kids}' + VAULT_CSRF_PATH: '${VAULT_CSRF_PATH:-}' + JWT_ALGORITHM: '${JWT_ALGORITHM:-RS256}' + JWT_ISSUER: '${JWT_ISSUER:-auth-service}' + JWT_AUDIENCE: '${JWT_AUDIENCE:-elcsa}' + CORS_ORIGINS: '${CORS_ORIGINS:-}' + CORS_ALLOW_CREDENTIALS: '${CORS_ALLOW_CREDENTIALS:-true}' + RELAY_API_KEY: '${RELAY_API_KEY:-}' + TRON_API_KEY: '${TRON_API_KEY:-}' + JUPITER_API_KEY: '${JUPITER_API_KEY:-}' + JUPITER_REFERRAL_ACCOUNT: '${JUPITER_REFERRAL_ACCOUNT:-}' + JUPITER_FEE_BPS: '${JUPITER_FEE_BPS:-70}' + ETHERSCAN_API_KEY: '${ETHERSCAN_API_KEY:-}' + BSCSCAN_API_KEY: '${BSCSCAN_API_KEY:-}' + depends_on: + postgres: + condition: service_healthy + + postgres: + image: postgres:16-alpine + restart: unless-stopped + environment: + POSTGRES_USER: '${DB_USER:-cryptowallet}' + POSTGRES_PASSWORD: '${DB_PASSWORD:-cryptowallet}' + POSTGRES_DB: '${DB_NAME:-cryptowallet}' + ports: + - '${POSTGRES_PORT:-5432}:5432' + volumes: + - postgres-data:/var/lib/postgresql/data + healthcheck: + test: ['CMD-SHELL','pg_isready -U "$$POSTGRES_USER" -d "$$POSTGRES_DB"'] + interval: 5s + timeout: 5s + retries: 10 + +volumes: + postgres-data: