From 091496e95c9f89a58407225c1eccc7cf3096d29e Mon Sep 17 00:00:00 2001 From: Sulthan Zaki Date: Tue, 18 Aug 2026 13:54:51 +0700 Subject: [PATCH] add docker container deployment support --- .dockerignore | 13 +++++++++++++ .gitignore | 5 +++++ Dockerfile | 16 ++++++++++++++++ docker-compose.yml | 48 ++++++++++++++++++++++++++++++++++++++++++++++ src/index.js | 6 +++--- 5 files changed, 85 insertions(+), 3 deletions(-) create mode 100644 .dockerignore create mode 100644 Dockerfile create mode 100644 docker-compose.yml diff --git a/.dockerignore b/.dockerignore new file mode 100644 index 0000000..6edf9b0 --- /dev/null +++ b/.dockerignore @@ -0,0 +1,13 @@ +node_modules +npm-debug.log +.git +.env +.env.* +!.env.example +oldCode +test +docs +README.md +vercel.json +.github +src/uploads diff --git a/.gitignore b/.gitignore index 677bd26..02b7ce4 100755 --- a/.gitignore +++ b/.gitignore @@ -151,3 +151,8 @@ uploads/ .vercel .vercel/*.json .env*.local + +# AI agent tooling +.agents/ +skills-lock.json +.claude/ diff --git a/Dockerfile b/Dockerfile new file mode 100644 index 0000000..27acf93 --- /dev/null +++ b/Dockerfile @@ -0,0 +1,16 @@ +FROM node:20-slim + +RUN apt-get update && apt-get install -y --no-install-recommends openssl ca-certificates \ + && rm -rf /var/lib/apt/lists/* + +WORKDIR /app +ENV NODE_ENV=production + +COPY package*.json ./ +COPY prisma ./prisma +RUN npm ci --omit=dev + +COPY src ./src + +EXPOSE 3000 +CMD ["sh", "-c", "npx prisma migrate deploy && node src/index.js"] diff --git a/docker-compose.yml b/docker-compose.yml new file mode 100644 index 0000000..24ae0d8 --- /dev/null +++ b/docker-compose.yml @@ -0,0 +1,48 @@ +services: + db: + image: mysql:8 + restart: unless-stopped + environment: + MYSQL_DATABASE: ${MYSQL_DATABASE:-internify_db} + MYSQL_USER: ${MYSQL_USER:-internify} + MYSQL_PASSWORD: ${MYSQL_PASSWORD:?set MYSQL_PASSWORD} + MYSQL_ROOT_PASSWORD: ${MYSQL_ROOT_PASSWORD:?set MYSQL_ROOT_PASSWORD} + volumes: + - db_data:/var/lib/mysql + healthcheck: + test: ["CMD", "mysqladmin", "ping", "-h", "127.0.0.1", "-p$$MYSQL_ROOT_PASSWORD"] + interval: 10s + timeout: 5s + retries: 10 + + app: + build: . + restart: unless-stopped + depends_on: + db: + condition: service_healthy + environment: + NODE_ENV: production + PORT: 3000 + DATABASE_URL: ${DATABASE_URL:-mysql://${MYSQL_USER:-internify}:${MYSQL_PASSWORD}@db:3306/${MYSQL_DATABASE:-internify_db}} + ALLOWED_ORIGINS: ${ALLOWED_ORIGINS} + JWT_PRIVATE_KEY: ${JWT_PRIVATE_KEY} + JWT_PUBLIC_KEY: ${JWT_PUBLIC_KEY} + RECAPTCHA_SECRET_KEY: ${RECAPTCHA_SECRET_KEY} + RECAPTCHA_SITE_KEY: ${RECAPTCHA_SITE_KEY} + SWAGGER_ENABLED: ${SWAGGER_ENABLED:-false} + AUTH_EMAIL: ${AUTH_EMAIL} + AUTH_PASSWORD: ${AUTH_PASSWORD} + SEED_ADMIN_EMAIL: ${SEED_ADMIN_EMAIL} + SEED_ADMIN_PASSWORD: ${SEED_ADMIN_PASSWORD} + SEED_ACTIVE_BATCH_NUMBER: ${SEED_ACTIVE_BATCH_NUMBER} + volumes: + - uploads:/tmp/uploads + - mentor_uploads:/app/src/uploads + expose: + - "3000" + +volumes: + db_data: + uploads: + mentor_uploads: diff --git a/src/index.js b/src/index.js index 7571fdd..888e629 100755 --- a/src/index.js +++ b/src/index.js @@ -118,9 +118,9 @@ app.use((err, req, res, next) => { const server = http.createServer(app); initSocket(server); -if (process.env.NODE_ENV !== 'production') { - server.listen(PORT, () => { - console.log(`listening at http://localhost:${PORT}`); +if (!process.env.VERCEL) { + server.listen(PORT || 3000, () => { + console.log(`listening on port ${PORT || 3000}`); }); }