{"_id":"123ts-backend-setup-prod","name":"123ts-backend-setup-prod","dist-tags":{"latest":"1.0.0"},"versions":{"1.0.0":{"name":"123ts-backend-setup-prod","version":"1.0.0","description":"Production-ready Node.js + TypeScript Express template with opinionated tooling, security middleware, logging, MongoDB connectivity, migrations, Docker, PM2, and NGINX examples.","main":"src/server.js","scripts":{"dist":"npx tsc","dev":"cross-env NODE_ENV=development nodemon --legacy-watch src/server.ts","start":"cross-env NODE_ENV=production node dist/server.js","lint":"eslint","lint:fix":"eslint --fix","format:check":"prettier . --check","format:fix":"prettier . --fix","prepare":"husky","migrate:dev":"cross-env MIGRATE_MODE=development node script/migration.js","migrate:prod":"cross-env MIGRATE_MODE=production node script/migration.js"},"author":{"name":"coder bb"},"license":"ISC","lint-staged":{"*.ts":["npm run lint:fix","npm run format:fix"]},"devDependencies":{"@commitlint/cli":"^19.4.0","@commitlint/config-conventional":"^19.2.2","@eslint/js":"^9.9.0","@types/cors":"^2.8.17","@types/eslint__js":"^8.42.3","@types/express":"^4.17.21","@types/node":"^22.2.0","@types/source-map-support":"^0.5.10","eslint":"^9.9.0","eslint-config-prettier":"^9.1.0","husky":"^9.1.4","lint-staged":"^15.2.8","nodemon":"^3.1.4","prettier":"3.3.3","ts-node":"^10.9.2","typescript":"^5.5.4","typescript-eslint":"^8.0.1"},"dependencies":{"colorette":"^2.0.20","cors":"^2.8.5","cross-env":"^7.0.3","dotenv-flow":"^4.1.0","express":"^4.19.2","helmet":"^7.1.0","mongoose":"^8.5.2","rate-limiter-flexible":"^5.0.3","source-map-support":"^0.5.21","ts-migrate-mongoose":"^3.8.3","winston":"^3.14.1","winston-mongodb":"^5.1.1"},"_id":"123ts-backend-setup-prod@1.0.0","gitHead":"e7fa5c3fe25b7b4936eee64bcc8461e94c54a1b9","_nodeVersion":"22.17.1","_npmVersion":"10.9.2","dist":{"integrity":"sha512-rG/ozHLgbUXN8AB7qliS6w/QsR6q0NGowPSgntrqXLMneVA7RLkRoZNaFiRHV9/70Uux784Lig3TCHQwdzJmcQ==","shasum":"a0b3ace1e46226d1a8bfb97a5980cf4f7da9d2e0","tarball":"https://registry.npmjs.org/123ts-backend-setup-prod/-/123ts-backend-setup-prod-1.0.0.tgz","fileCount":44,"unpackedSize":38595,"signatures":[{"keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U","sig":"MEUCIQC2vjTW/Nzr0t0cT9e6/cFx2uxRiRmkq5C7Qu/suWzpLwIgVeRi/Gunwa4J1tnVKw8y0tuJKvYC+q0rNaDj7IpUzPc="}]},"_npmUser":{"name":"dsselkari","email":"dsselkari@gmail.com"},"directories":{},"maintainers":[{"name":"dsselkari","email":"dsselkari@gmail.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages-npm-production","tmp":"tmp/123ts-backend-setup-prod_1.0.0_1763921489084_0.9470879827334251"},"_hasShrinkwrap":false}},"time":{"created":"2025-11-23T18:11:28.965Z","1.0.0":"2025-11-23T18:11:29.276Z","modified":"2025-11-23T18:11:29.693Z"},"maintainers":[{"name":"dsselkari","email":"dsselkari@gmail.com"}],"description":"Production-ready Node.js + TypeScript Express template with opinionated tooling, security middleware, logging, MongoDB connectivity, migrations, Docker, PM2, and NGINX examples.","author":{"name":"coder bb"},"license":"ISC","readme":"# TS Backend Production Template\n\nProduction-ready Node.js + TypeScript Express template with opinionated tooling, security middleware, logging, MongoDB connectivity, migrations, Docker, PM2, and NGINX examples.\n\n## Features\n- **Typescript-first** with strict compiler options and source maps\n- **Express** app with modular routing and middlewares\n- **Security** via Helmet, CORS, and rate limiting\n- **Global error handling** and 404 handler\n- **Structured logging** with Winston (MongoDB transport configured)\n- **MongoDB** with Mongoose\n- **Migrations** via `ts-migrate-mongoose` and helper script\n- **Dotenv Flow** for multi-env configuration\n- **ESLint + Prettier** with TypeScript rules\n- **Husky + lint-staged** for pre-commit checks\n- **Nodemon** for DX and **PM2** for production process management\n- **Docker** setup for development and production\n- **NGINX** reverse-proxy examples (HTTP/HTTPS)\n\n## Tech Stack\n- Node.js, TypeScript, Express\n- Mongoose (MongoDB)\n- Helmet, CORS, rate-limiter-flexible\n- Winston, winston-mongodb\n- dotenv-flow\n- ESLint, Prettier, Husky, lint-staged\n- PM2\n- Docker\n\n## Project Structure\n```\nsrc/\n  app.ts               # Express app, middleware, routes, error handler\n  server.ts            # App bootstrap, DB connect, rate limiter init, startup logs\n  router/apiRouter.ts  # Routes: GET /self, GET /health\n  controller/          # Controllers (apiController)\n  middleware/          # globalErrorHandler, etc.\n  service/             # databaseService\n  config/              # config, rateLimiter\n  util/                # logger, httpError, etc.\npublic/                # Static assets\ndocker/                # Dockerfiles (development, production)\nnginx/                 # http.conf, https.conf examples\nscript/migration.js    # Helper for running migrations\necosystem.config.js    # PM2 configuration\n```\n\n## Getting Started\n\n### Prerequisites\n- Node.js LTS (recommended)\n- MongoDB instance (local or remote)\n\n### Install\n```\nnpm install\n```\n\n### Environment Variables\nCopy `.env.example` to the appropriate dotenv-flow files. dotenv-flow loads files by `NODE_ENV`.\n\nMinimum variables:\n```\n# General\nENV=development # production\nPORT=3000\nSERVER_URL=http://localhost:3000\n\n# Database\nDATABASE_URL=\"mongodb://localhost:27017/your-db\"\n\n# Migration\nMIGRATE_MONGO_URI=\"mongodb://localhost:27017/your-db\"\nMIGRATE_AUTOSYNC=\"true\" # or false\n```\n\n### Useful NPM Scripts\n- `npm run dev` — Start development mode with nodemon (`NODE_ENV=development`)\n- `npm run dist` — Compile TypeScript to `dist/`\n- `npm start` — Run compiled app (`NODE_ENV=production`)\n- `npm run lint` / `npm run lint:fix` — Lint and auto-fix\n- `npm run format:check` / `npm run format:fix` — Prettier check and write\n- `npm run migrate:dev` — Run migration helper (development)\n- `npm run migrate:prod` — Run migration helper (production)\n\n### Run (Development)\n```\nnpm run dev\n```\nThe app listens on `PORT` (default 3000). Static files served from `public/`.\n\n### Build and Run (Production)\n```\nnpm run dist\nnpm start\n```\n\n## API\nBase path: `/api/v1`\n\n- `GET /api/v1/self` — Returns basic service info\n- `GET /api/v1/health` — Health check endpoint\n\n## Error Handling\n- Centralized error handling via `globalErrorHandler`\n- 404 handler converts unknown routes to errors\n- `httpError` utility standardizes error responses\n\n## Security\n- `helmet()` enabled by default\n- `cors()` configured with an allowlist (update `origin` in `src/app.ts`)\n- Rate limiting initialized after DB connection via `initRateLimiter`\n\n## Logging\n- `winston` logger with support for MongoDB transport (`winston-mongodb`)\n- Startup, DB connection, and rate limiter init logs emitted from `server.ts`\n- Logs directory and MongoDB logging can be configured in `util/logger`\n\n## Database\n- `mongoose` for ODM\n- Connection handled in `service/databaseService`\n- Provide `DATABASE_URL` in your env\n\n### Migrations\nPowered by `ts-migrate-mongoose` with a helper script.\n\nCommands (via helper):\n```\n# Syntax: node script/migration.js <command> [name]\n# Valid commands: create | up | down | list | prune\n\n# examples\nnode script/migration.js create add-users-collection\nnode script/migration.js up add-users-collection\nnode script/migration.js down add-users-collection\nnode script/migration.js list\nnode script/migration.js prune\n```\nSet `MIGRATE_MONGO_URI` (usually same as `DATABASE_URL`).\n\n## Docker\n\n### Development\nDockerfile: `docker/development/Dockerfile`\n\nExample build/run:\n```\ndocker build -f docker/development/Dockerfile -t ts-backend-dev .\ndocker run --env-file .env -p 3000:3000 ts-backend-dev\n```\n\n### Production\nDockerfile: `docker/production/Dockerfile`\n\nExample build/run:\n```\ndocker build -f docker/production/Dockerfile -t ts-backend-prod .\ndocker run --env-file .env -p 3000:3000 ts-backend-prod\n```\n\n## PM2 (Production)\n`ecosystem.config.js` runs `dist/server.js` in cluster mode.\n```\npm2 start ecosystem.config.js\npm2 status\npm2 logs\n```\n\n## NGINX (Reverse Proxy)\nExamples in `nginx/http.conf` and `nginx/https.conf`. Point upstream to your app container/host and expose 80/443 accordingly.\n\n## Linting & Formatting\n- ESLint config at `eslint.config.mjs` (TypeScript-aware, Prettier-compatible)\n- Prettier config at `.prettierrc`\n- Pre-commit hooks via Husky + lint-staged for staged `.ts` files\n\n## Troubleshooting\n- Ensure `DATABASE_URL` is reachable from the app container/host\n- If CORS blocks requests, update the `origin` allowlist in `src/app.ts`\n- For rate limit store, ensure DB is connected before requests\n- Use `npm run dist` to confirm type safety and build output\n- Check `logs/` and PM2 logs for runtime issues\n\n## License\nISC — see `package.json`.","readmeFilename":"README.md","_rev":"1-1cf024fb9f685e0dad93e3066aa5038c"}