From f96fb843de3664c50046e97677a0d60dff5fd62d Mon Sep 17 00:00:00 2001 From: Sanjib Sen Date: Wed, 15 Jan 2025 17:19:21 +0600 Subject: [PATCH] organized --- .env.example | 17 ++++---- .gitignore | 2 +- docker-compose.services.yaml | 48 ++++++++++++++++++++++ docker-compose.yaml | 59 +-------------------------- src/db/index.ts | 5 ++- src/index.ts | 15 ++++--- src/lib/storage/{s3.ts => storage.ts} | 0 src/lib/utils/env.ts | 31 +++++++++++++- 8 files changed, 103 insertions(+), 74 deletions(-) create mode 100644 docker-compose.services.yaml rename src/lib/storage/{s3.ts => storage.ts} (100%) diff --git a/.env.example b/.env.example index 492d320..db7d25b 100644 --- a/.env.example +++ b/.env.example @@ -1,8 +1,11 @@ -DB_USER=postgres -DB_PASSWORD= -DB_NAME=postgres -DB_HOST=localhost -DB_PORT=5432 +PORT=3000 +SERVICE_NAME= +DATABASE_URL="postgresql://..." +MINIO_ACCESS_KEY= +MINIO_SECRET_KEY= +MINIO_ENDPOINT_URL= +MINIO_BUCKET_NAME= +BETTER_AUTH_SECRET= - -DATABASE_URL='postgres://${DB_USER}:${DB_PASSWORD}@${DB_HOST}:${DB_PORT}/${DB_NAME}' \ No newline at end of file +# DO NOT CHANGE +BETTER_AUTH_URL=http://127.0.0.1:${PORT} diff --git a/.gitignore b/.gitignore index ec53828..a8afeaa 100644 --- a/.gitignore +++ b/.gitignore @@ -29,6 +29,7 @@ yarn-error.log* .env.local .env.development.local .env.test.local +.env.services .env.production.local # vercel @@ -43,4 +44,3 @@ package-lock.json **/*.bun ./server -./.storage_data diff --git a/docker-compose.services.yaml b/docker-compose.services.yaml new file mode 100644 index 0000000..9de4fcb --- /dev/null +++ b/docker-compose.services.yaml @@ -0,0 +1,48 @@ +services: + tracing: + image: jaegertracing/all-in-one:latest + environment: + COLLECTOR_ZIPKIN_HOST_PORT: 9411 + COLLECTOR_OTLP_ENABLED: true + ports: + - "16686:16686" + + db: + image: postgres:latest + env_file: + - .env + environment: + POSTGRES_USER: ${DB_USER} + POSTGRES_PASSWORD: ${DB_PASSWORD} + POSTGRES_DB: ${DB_NAME} + ports: + - "5432:5432" + volumes: + - postgres_data:/var/lib/postgresql/data + + minio: + image: minio/minio:latest + ports: + - "9000:9000" + - "9001:9001" + environment: + MINIO_ROOT_USER: ${MINIO_ROOT_USER} + MINIO_ROOT_PASSWORD: ${MINIO_ROOT_PASSWORD} + MINIO_ACCESS_KEY: ${MINIO_ACCESS_KEY} + MINIO_SECRET_KEY: ${MINIO_SECRET_KEY} + command: server /data --console-address ":9001" + volumes: + - minio_data:/data + healthcheck: + test: ["CMD", "mc", "ready", "local"] + interval: 30s + timeout: 20s + retries: 3 + +networks: + api-network: + driver: bridge + +volumes: + postgres_data: + minio_data: diff --git a/docker-compose.yaml b/docker-compose.yaml index d8c86f1..ffbf3ab 100644 --- a/docker-compose.yaml +++ b/docker-compose.yaml @@ -4,67 +4,10 @@ services: context: . dockerfile: Dockerfile ports: - - "3000:3000" + - "${PORT}:${PORT}" environment: NODE_ENV: production OTEL_EXPORTER_OTLP_ENDPOINT: http://tracing:4318 OTEL_EXPORTER_OTLP_PROTOCOL: http/protobuf DATABASE_URL: ${DATABASE_URL} - networks: - - api-network - depends_on: - - tracing - tracing: - image: jaegertracing/all-in-one:latest - environment: - COLLECTOR_ZIPKIN_HOST_PORT: 9411 - COLLECTOR_OTLP_ENABLED: true - ports: - - "16686:16686" - networks: - - api-network - - db: - image: postgres:latest - env_file: - - .env - environment: - POSTGRES_USER: postgres - POSTGRES_PASSWORD: ${DB_PASSWORD} - POSTGRES_DB: postgres - ports: - - "5432:5432" - volumes: - - postgres_data:/var/lib/postgresql/data - networks: - - api-network - - minio: - image: minio/minio:latest - ports: - - "9000:9000" - - "9001:9001" - environment: - MINIO_ROOT_USER: ${MINIO_ROOT_USER} - MINIO_ROOT_PASSWORD: ${MINIO_ROOT_PASSWORD} - MINIO_ACCESS_KEY: ${MINIO_ACCESS_KEY} - MINIO_SECRET_KEY: ${MINIO_SECRET_KEY} - command: server /data --console-address ":9001" - volumes: - - minio_data:/data - healthcheck: - test: ["CMD", "mc", "ready", "local"] - interval: 30s - timeout: 20s - retries: 3 - networks: - - api-network - -networks: - api-network: - driver: bridge - -volumes: - postgres_data: - minio_data: diff --git a/src/db/index.ts b/src/db/index.ts index 53dcac8..23aa82b 100644 --- a/src/db/index.ts +++ b/src/db/index.ts @@ -1,4 +1,7 @@ import "dotenv/config"; import { drizzle } from "drizzle-orm/node-postgres"; +import { getDbConfig } from "../lib/utils/env"; -export const db = drizzle(process.env.DATABASE_URL!); +const dbConfig = getDbConfig() + +export const db = drizzle(dbConfig.DATABASE_URL); diff --git a/src/index.ts b/src/index.ts index 5c23788..616b772 100644 --- a/src/index.ts +++ b/src/index.ts @@ -6,11 +6,15 @@ import { cors } from '@elysiajs/cors' import { note } from "./api/note/note.route"; import { betterAuthView } from "./lib/auth/auth-view"; import { userMiddleware, userInfo } from "./middlewares/auth-middleware"; -import { validateEnv } from "./lib/utils/env"; +import { getBaseConfig, validateEnv } from "./lib/utils/env"; + +const baseConfig = getBaseConfig() const app = new Elysia() .use(cors()) - .use(opentelemetry()) + .use(opentelemetry({ + "serviceName": baseConfig.SERVICE_NAME + })) .use(swagger({ path: "/docs", })) @@ -22,8 +26,9 @@ const app = new Elysia() .derive(({ request }) => userMiddleware(request)) .all("/api/auth/*", betterAuthView) .use(note) - .get("/user", ({ user, session }) => userInfo(user, session)); + .get("/user", ({ user, session }) => userInfo(user, session)) + .get("/", () => "Server is Running") validateEnv(); -app.listen(3000); -console.log("Server is running on: http://localhost:3000") +app.listen(baseConfig.PORT); +console.log(`Server is running on: http://127.0.0.1:${baseConfig.PORT}`) diff --git a/src/lib/storage/s3.ts b/src/lib/storage/storage.ts similarity index 100% rename from src/lib/storage/s3.ts rename to src/lib/storage/storage.ts diff --git a/src/lib/utils/env.ts b/src/lib/utils/env.ts index 5bffa5c..b8f7d60 100644 --- a/src/lib/utils/env.ts +++ b/src/lib/utils/env.ts @@ -2,6 +2,10 @@ import { z } from 'zod'; // Define the environment schema const envSchema = z.object({ + // Base + PORT: z.string().max(5), + SERVICE_NAME: z.string(), + // Database DATABASE_URL: z.string().url(), @@ -9,7 +13,11 @@ const envSchema = z.object({ MINIO_ACCESS_KEY: z.string(), MINIO_SECRET_KEY: z.string().min(8), MINIO_ENDPOINT_URL: z.string().url(), - MINIO_BUCKET_NAME: z.string().url(), + MINIO_BUCKET_NAME: z.string(), + + // Auth + BETTER_AUTH_SECRET: z.string().min(32), + BETTER_AUTH_URL: z.string().url(), }); // Create a type from the schema @@ -42,7 +50,9 @@ export const validateEnv = (): EnvConfig => { if (path.startsWith('MINIO_')) { warningMessage += '\n ⚠️ File storage functionality may not work properly'; } - + if (path.startsWith('BETTER_AUTH_')) { + warningMessage += '\n ⚠️ Authentication functionality may not work properly'; + } warnings.push(warningMessage); }); @@ -64,6 +74,15 @@ export const getConfig = (): EnvConfig => { return validateEnv(); }; + +export const getBaseConfig = (): Pick => { + const config = getConfig(); + return { + PORT: config.PORT, + SERVICE_NAME: config.SERVICE_NAME, + }; +}; + // Optional: Export individual config getters with type safety export const getDbConfig = (): Pick => { const config = getConfig(); @@ -82,6 +101,14 @@ export const getMinioConfig = (): Pick => { + const config = getConfig(); + return { + BETTER_AUTH_SECRET: config.BETTER_AUTH_SECRET, + BETTER_AUTH_URL: config.BETTER_AUTH_URL, + }; +}; + // Usage example: try { const config = getConfig();