Repository files navigation

Oculus

Oculus

Did you know?

An oculus is Latin for “eye” symbolizing vision and insight. This project is designed to give developers a clear view into building scalable microservices.

About

Oculus is a scalable microservices template built with NestJS, RabbitMQ, PostgreSQL, and Redis. It provides an efficient and developer-friendly foundation for building distributed systems, supporting both Docker and Kubernetes deployments. The system now leverages Minio for object storage, offering a reliable and scalable solution for handling files across services.

Key Changes:

1- Kafka → RabbitMQ Migration:

  • The description now mentions RabbitMQ instead of Kafka.
  • To make it easier to develop.

Getting Started

git clone https://github.com/Jeccoman/oculus.git
cd oculus
pnpm i
docker-compose up --build # For the first add the --build

Web UI Tools

Note: The following ports (8087, 15679 and 5549) are defined in the docker-compose file.

PgAdmin

username: test@test.compassword: randompassword2connection:
host-name_address: postgresport: 5432username: postgrespassword: randompassword

Rabbitmq UI

username: userpassword: randompassword

Redis UI

username: userpassword: randompasswordconnection:
host: redisport: 6379username: nonepassword: none

Minio

username: adminpassword: randompassword
mcli aliasset oculus http://localhost:9100 admin randompassword

Project Structure

oculus
|
├── apps
│ ├── auth
│ │ ├── Dockerfile
│ │ ├── Dockerfile.dev
│ │ ├── package.json
│ │ ├── src
│ │ ├── test
│ │ └── tsconfig.app.json
│ │ └── .env
│ ├── storage
│ │ ├── Dockerfile
│ │ ├── Dockerfile.dev
│ │ ├── package.json
│ │ ├── src
│ │ ├── test
│ │ └── tsconfig.app.json
│ │ └── .env
│ └── store
│ ├── Dockerfile
│ ├── Dockerfile.dev
│ ├── package.json
│ ├── src
│ ├── test
│ └── tsconfig.app.json
│ └── .env
├── docker-compose-test.yaml
├── docker-compose.yaml
├── init-scripts
│ └── seed-data.sql
├── init-scripts-test
├── libs
│ └── common
│ ├── src
│ └── tsconfig.lib.json
├── migrations
│ ├── developing
│ │ ├── auth
│ │ ├── storage
│ │ └── store
│ ├── production
│ │ ├── auth
│ │ ├── storage
│ │ └── store
│ └── stage
│ ├── auth
│ ├── storage
│ └── store
├── package.json
├── tsconfig.build.json
└── tsconfig.json
└── .env
└── .env.test
└── .env.migration.developing
└── .env.migration.stage
└── .env.migration.production

Services

Auth

User Access

  • Support dynamic access (role)
  • Support auto Caching

Storage

Resize And Change Quality of Image

  • Based on MinIO (S3 Object Storage)
  • Support multiple file formats:
    • Images: jpg, jpeg, png, bmp, tiff, gif, webp
    • Documents: doc, docx, xlsx, pdf, txt, rtf
    • Media: mp3, wav, mp4, avi, avi, mkv
    • Compressed: zip, rar, tar, 7z, gz
  • Support public and private files
  • Support resizing and changing the quality of images on download routes
  • Support caching on the download routes
  • Unique route to upload all files
  • Unique route to download all files (if the file is an image type, the system will automatically consider caching and editing utitlies for the file)

Store

Store Product List

  • Support fully Pagination
  • Support auto Caching

Swaggers

Postman

Online Link :

Run in Postman

Download json files directly:Oculus

Migration

There is possible to generate and run migration files on different branches separetly (developing, stage, production)

  1. Create environment files - .env.migration.developing - .env.migration.stage - .env.migration.production example:
POSTGRES_HOST=localhost
POSTGRES_PORT=5436
POSTGRES_USERNAME=postgres
POSTGRES_PASSWORD=randompassword
# POSTGRES_SYNCHRONIZE=true
POSTGRES_SYNCHRONIZE=false
POSTGRES_AUTO_LOAD_ENTITIES=true
  1. Edit the 'POSTGRES_ENTITIES' parameter inside the package.json file according to your entities
  2. Generate and run the migratinos
# Developing
npm run migration:generate:developing
npm run migration:run:developing
# Stage
npm run migration:generate:stage
npm run migration:run:stage
# Production
npm run migration:generate:production
npm run migration:run:production

Cache Manager

  1. Only GET endpoints are cached.
  2. Use @NoCache() decorator to bypass the caching system for specific endpoints.
  3. Use @GeneralCache() decorator to cache the endpoint without including the user's token in the cache key.
  4. Services caching status:
Service NameModuleCache StatusDecoratorNote
Authauthnot cached@NoCache()
Authuserscachedare cached according to user's token
Authaccessescachedare cached according to user's token
Storecategoriescached@GeneralCache()
Storeproductscached@GeneralCache()
Storeordersnot cached@NoCache()
Storepaymentsnot cached@NoCache()
Storagenot cached

🧪 Run Tests

✅ Unit Tests

Run unit tests:

pnpm run test

🔄 End-to-End (E2E) Tests

1️⃣ Start required services (database, Redis, etc.) in Terminal 1:

docker-compose -f ./docker-compose-test.yaml up

2️⃣ Run E2E tests in Terminal 2:

pnpm run test:e2e

Roadmap

  • App microservices
  • Common libraries
  • Logger
  • Communication between microservices
  • Authentication (JWT, Cookie, Passport)
  • Dynamic roles (Access)
  • TypeORM Postgresql
    • Entities
    • Migrations on every branch separately
  • Docker-compose
  • Env
  • Document
    • GitHub README
    • Postman
    • Auto generated swagger
  • Test
  • Cache Manager (Redis)
  • K8S

TODO

  • Fix Get OTP to expire its session
  • Make full_name nullable
  • Support pagination for list endpoints
  • Return 401 Unauthorized for unknown-user login attempts
  • Generate a valid 5-digit OTP consistently
  • Category Tree
  • Expand auth unit and e2e coverage
  • Refresh Token
  • K8S deployment setup

Contributing

Contributions are welcome! Please read CONTRIBUTING.md for details on our code of conduct, and the process for submitting pull requests.

License

This project is licensed under the MIT License - see the LICENSE.md file for details.

Change log

3.1.1 (2026-03-22)

  • Hardened auth login to return 401 Unauthorized for unknown users instead of failing on missing credentials state.
  • Fixed OTP generation to always produce a valid 5-digit code.
  • Added focused auth service unit tests for invalid login handling and OTP generation.
  • Added nested category tree support with parent-child category relationships and a GET /categories/tree endpoint.

3.0.0 (2025-02-23)

  • Supporting Pagination for list retrieval endpoints.
  • Sending EVENT_NAME_USER_CREATED and EVENT_NAME_USER_UPDATED from the 'auth' service to the 'store' service to update users.

2.1.2 (2025-02-17)

  • Transition from JWT_SECRET into JWT_PUBLIC_KEY and JWT_PRIVATE_KEY
  • Fxied access guard
  • Fixed cache manager and added FoceToClearCache decorator
  • Added new API route to edit user access /users/{id}/access

2.1.1 (2025-02-16)

  • Improved the Health Check API to monitor infrastructure connections, including RabbitMQ, PostgreSql and Redis.

2.1.0 (2025-02-16)

  • Moved entity files into their respective service directories.
  • Fixed the migration script

2.0.2 (2025-02-13)

  • Added some unit and e3e tests

2.0.1 (2025-01-27)

  • Added database seed data during intializing (docker-compose)
  • Renamed cannotBeDeleted field to cannot_be_deleted
  • Added downloadable Postman files

2.0.0 (2025-01-26)

  • Migrated from saving files on disk to leveraing the Minio for object storage.

1.0.0 (2025-01-25)

  • Migrated from Kafka to RabbitMQ.
  • Changed the 'hasFullAccess' field to 'has_full_access' in the access entity.

0.0.2 (2025-01-25)

  • Added a caching prefix to support separation of multiple branches in production.
  • Added Redis Insight to the docker-compose file to provide a GUI for Redis.

0.0.1 (2024-06-04)

  • Initial release.

About

Scalable Microservices Template with NestJS, RabbitMQ, PostgreSQL, Redis and Minio (Docker and K8S)

Resources

Contributing

Stars

3 stars

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Add copy buttons to all
 blocks\n(function() {\n function addCopyButtons() {\n document.querySelectorAll('pre code').forEach(function(codeBlock) {\n if (codeBlock.parentElement.hasAttribute('data-copy-added')) return;\n codeBlock.parentElement.setAttribute('data-copy-added', 'true');\n \n var btn = document.createElement('button');\n btn.textContent = 'Copy';\n btn.style.cssText = 'position:absolute;top:4px;right:4px;padding:2px 8px;font-size:11px;background:#4ecdc4;border:none;border-radius:4px;color:#1a1a2e;cursor:pointer;opacity:0.7;transition:opacity 0.2s;';\n btn.onmouseover = function() { this.style.opacity = '1'; };\n btn.onmouseout = function() { this.style.opacity = '0.7'; };\n btn.onclick = function() {\n navigator.clipboard.writeText(codeBlock.textContent).then(function() {\n btn.textContent = 'Copied!';\n setTimeout(function() { btn.textContent = 'Copy'; }, 1500);\n });\n };\n codeBlock.parentElement.style.position = 'relative';\n codeBlock.parentElement.appendChild(btn);\n });\n }\n \n addCopyButtons();\n \n // Re-run on dynamic content\n var observer = new MutationObserver(addCopyButtons);\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Add Copy Buttons to Code Blocks");
}
} catch(__e) { console.warn('[Userscript:Add Copy Buttons to Code Blocks]', __e); }
})();
(function(){
try {
var __m = "github.com";
var __re = new RegExp('^' + "github\\.com" + '
Skip to content

Repository files navigation

Oculus

Oculus

Did you know?

An oculus is Latin for “eye” symbolizing vision and insight. This project is designed to give developers a clear view into building scalable microservices.

About

Oculus is a scalable microservices template built with NestJS, RabbitMQ, PostgreSQL, and Redis. It provides an efficient and developer-friendly foundation for building distributed systems, supporting both Docker and Kubernetes deployments. The system now leverages Minio for object storage, offering a reliable and scalable solution for handling files across services.

Key Changes:

1- Kafka → RabbitMQ Migration:

  • The description now mentions RabbitMQ instead of Kafka.
  • To make it easier to develop.

Getting Started

git clone https://github.com/Jeccoman/oculus.git
cd oculus
pnpm i
docker-compose up --build # For the first add the --build

Web UI Tools

Note: The following ports (8087, 15679 and 5549) are defined in the docker-compose file.

PgAdmin

username: test@test.compassword: randompassword2connection:
host-name_address: postgresport: 5432username: postgrespassword: randompassword

Rabbitmq UI

username: userpassword: randompassword

Redis UI

username: userpassword: randompasswordconnection:
host: redisport: 6379username: nonepassword: none

Minio

username: adminpassword: randompassword
mcli aliasset oculus http://localhost:9100 admin randompassword

Project Structure

oculus
|
├── apps
│ ├── auth
│ │ ├── Dockerfile
│ │ ├── Dockerfile.dev
│ │ ├── package.json
│ │ ├── src
│ │ ├── test
│ │ └── tsconfig.app.json
│ │ └── .env
│ ├── storage
│ │ ├── Dockerfile
│ │ ├── Dockerfile.dev
│ │ ├── package.json
│ │ ├── src
│ │ ├── test
│ │ └── tsconfig.app.json
│ │ └── .env
│ └── store
│ ├── Dockerfile
│ ├── Dockerfile.dev
│ ├── package.json
│ ├── src
│ ├── test
│ └── tsconfig.app.json
│ └── .env
├── docker-compose-test.yaml
├── docker-compose.yaml
├── init-scripts
│ └── seed-data.sql
├── init-scripts-test
├── libs
│ └── common
│ ├── src
│ └── tsconfig.lib.json
├── migrations
│ ├── developing
│ │ ├── auth
│ │ ├── storage
│ │ └── store
│ ├── production
│ │ ├── auth
│ │ ├── storage
│ │ └── store
│ └── stage
│ ├── auth
│ ├── storage
│ └── store
├── package.json
├── tsconfig.build.json
└── tsconfig.json
└── .env
└── .env.test
└── .env.migration.developing
└── .env.migration.stage
└── .env.migration.production

Services

Auth

User Access

  • Support dynamic access (role)
  • Support auto Caching

Storage

Resize And Change Quality of Image

  • Based on MinIO (S3 Object Storage)
  • Support multiple file formats:
    • Images: jpg, jpeg, png, bmp, tiff, gif, webp
    • Documents: doc, docx, xlsx, pdf, txt, rtf
    • Media: mp3, wav, mp4, avi, avi, mkv
    • Compressed: zip, rar, tar, 7z, gz
  • Support public and private files
  • Support resizing and changing the quality of images on download routes
  • Support caching on the download routes
  • Unique route to upload all files
  • Unique route to download all files (if the file is an image type, the system will automatically consider caching and editing utitlies for the file)

Store

Store Product List

  • Support fully Pagination
  • Support auto Caching

Swaggers

Postman

Online Link :

Run in Postman

Download json files directly:Oculus

Migration

There is possible to generate and run migration files on different branches separetly (developing, stage, production)

  1. Create environment files - .env.migration.developing - .env.migration.stage - .env.migration.production example:
POSTGRES_HOST=localhost
POSTGRES_PORT=5436
POSTGRES_USERNAME=postgres
POSTGRES_PASSWORD=randompassword
# POSTGRES_SYNCHRONIZE=true
POSTGRES_SYNCHRONIZE=false
POSTGRES_AUTO_LOAD_ENTITIES=true
  1. Edit the 'POSTGRES_ENTITIES' parameter inside the package.json file according to your entities
  2. Generate and run the migratinos
# Developing
npm run migration:generate:developing
npm run migration:run:developing
# Stage
npm run migration:generate:stage
npm run migration:run:stage
# Production
npm run migration:generate:production
npm run migration:run:production

Cache Manager

  1. Only GET endpoints are cached.
  2. Use @NoCache() decorator to bypass the caching system for specific endpoints.
  3. Use @GeneralCache() decorator to cache the endpoint without including the user's token in the cache key.
  4. Services caching status:
Service NameModuleCache StatusDecoratorNote
Authauthnot cached@NoCache()
Authuserscachedare cached according to user's token
Authaccessescachedare cached according to user's token
Storecategoriescached@GeneralCache()
Storeproductscached@GeneralCache()
Storeordersnot cached@NoCache()
Storepaymentsnot cached@NoCache()
Storagenot cached

🧪 Run Tests

✅ Unit Tests

Run unit tests:

pnpm run test

🔄 End-to-End (E2E) Tests

1️⃣ Start required services (database, Redis, etc.) in Terminal 1:

docker-compose -f ./docker-compose-test.yaml up

2️⃣ Run E2E tests in Terminal 2:

pnpm run test:e2e

Roadmap

  • App microservices
  • Common libraries
  • Logger
  • Communication between microservices
  • Authentication (JWT, Cookie, Passport)
  • Dynamic roles (Access)
  • TypeORM Postgresql
    • Entities
    • Migrations on every branch separately
  • Docker-compose
  • Env
  • Document
    • GitHub README
    • Postman
    • Auto generated swagger
  • Test
  • Cache Manager (Redis)
  • K8S

TODO

  • Fix Get OTP to expire its session
  • Make full_name nullable
  • Support pagination for list endpoints
  • Return 401 Unauthorized for unknown-user login attempts
  • Generate a valid 5-digit OTP consistently
  • Category Tree
  • Expand auth unit and e2e coverage
  • Refresh Token
  • K8S deployment setup

Contributing

Contributions are welcome! Please read CONTRIBUTING.md for details on our code of conduct, and the process for submitting pull requests.

License

This project is licensed under the MIT License - see the LICENSE.md file for details.

Change log

3.1.1 (2026-03-22)

  • Hardened auth login to return 401 Unauthorized for unknown users instead of failing on missing credentials state.
  • Fixed OTP generation to always produce a valid 5-digit code.
  • Added focused auth service unit tests for invalid login handling and OTP generation.
  • Added nested category tree support with parent-child category relationships and a GET /categories/tree endpoint.

3.0.0 (2025-02-23)

  • Supporting Pagination for list retrieval endpoints.
  • Sending EVENT_NAME_USER_CREATED and EVENT_NAME_USER_UPDATED from the 'auth' service to the 'store' service to update users.

2.1.2 (2025-02-17)

  • Transition from JWT_SECRET into JWT_PUBLIC_KEY and JWT_PRIVATE_KEY
  • Fxied access guard
  • Fixed cache manager and added FoceToClearCache decorator
  • Added new API route to edit user access /users/{id}/access

2.1.1 (2025-02-16)

  • Improved the Health Check API to monitor infrastructure connections, including RabbitMQ, PostgreSql and Redis.

2.1.0 (2025-02-16)

  • Moved entity files into their respective service directories.
  • Fixed the migration script

2.0.2 (2025-02-13)

  • Added some unit and e3e tests

2.0.1 (2025-01-27)

  • Added database seed data during intializing (docker-compose)
  • Renamed cannotBeDeleted field to cannot_be_deleted
  • Added downloadable Postman files

2.0.0 (2025-01-26)

  • Migrated from saving files on disk to leveraing the Minio for object storage.

1.0.0 (2025-01-25)

  • Migrated from Kafka to RabbitMQ.
  • Changed the 'hasFullAccess' field to 'has_full_access' in the access entity.

0.0.2 (2025-01-25)

  • Added a caching prefix to support separation of multiple branches in production.
  • Added Redis Insight to the docker-compose file to provide a GUI for Redis.

0.0.1 (2024-06-04)

  • Initial release.

About

Scalable Microservices Template with NestJS, RabbitMQ, PostgreSQL, Redis and Minio (Docker and K8S)

Resources

Contributing

Stars

3 stars

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Force GitHub README to respect dark mode\n(function() {\n var style = document.createElement('style');\n style.textContent = '\n .markdown-body {\n color-scheme: dark light;\n }\n .markdown-body pre { background: #161b22 !important; }\n .markdown-body code { background: rgba(110, 118, 129, 0.4) !important; }\n .markdown-body table th, .markdown-body table td { border-color: #30363d !important; }\n .markdown-body img { background: #0d1117; }\n .markdown-body blockquote { border-left-color: #8b949e; }\n .markdown-body hr { border-color: #30363d; }\n ';\n document.head.appendChild(style);\n})();", "GitHub Dark Mode README Fix"); } } catch(__e) { console.warn('[Userscript:GitHub Dark Mode README Fix]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

Repository files navigation

Oculus

Oculus

Did you know?

An oculus is Latin for “eye” symbolizing vision and insight. This project is designed to give developers a clear view into building scalable microservices.

About

Oculus is a scalable microservices template built with NestJS, RabbitMQ, PostgreSQL, and Redis. It provides an efficient and developer-friendly foundation for building distributed systems, supporting both Docker and Kubernetes deployments. The system now leverages Minio for object storage, offering a reliable and scalable solution for handling files across services.

Key Changes:

1- Kafka → RabbitMQ Migration:

  • The description now mentions RabbitMQ instead of Kafka.
  • To make it easier to develop.

Getting Started

git clone https://github.com/Jeccoman/oculus.git
cd oculus
pnpm i
docker-compose up --build # For the first add the --build

Web UI Tools

Note: The following ports (8087, 15679 and 5549) are defined in the docker-compose file.

PgAdmin

username: test@test.compassword: randompassword2connection:
host-name_address: postgresport: 5432username: postgrespassword: randompassword

Rabbitmq UI

username: userpassword: randompassword

Redis UI

username: userpassword: randompasswordconnection:
host: redisport: 6379username: nonepassword: none

Minio

username: adminpassword: randompassword
mcli aliasset oculus http://localhost:9100 admin randompassword

Project Structure

oculus
|
├── apps
│ ├── auth
│ │ ├── Dockerfile
│ │ ├── Dockerfile.dev
│ │ ├── package.json
│ │ ├── src
│ │ ├── test
│ │ └── tsconfig.app.json
│ │ └── .env
│ ├── storage
│ │ ├── Dockerfile
│ │ ├── Dockerfile.dev
│ │ ├── package.json
│ │ ├── src
│ │ ├── test
│ │ └── tsconfig.app.json
│ │ └── .env
│ └── store
│ ├── Dockerfile
│ ├── Dockerfile.dev
│ ├── package.json
│ ├── src
│ ├── test
│ └── tsconfig.app.json
│ └── .env
├── docker-compose-test.yaml
├── docker-compose.yaml
├── init-scripts
│ └── seed-data.sql
├── init-scripts-test
├── libs
│ └── common
│ ├── src
│ └── tsconfig.lib.json
├── migrations
│ ├── developing
│ │ ├── auth
│ │ ├── storage
│ │ └── store
│ ├── production
│ │ ├── auth
│ │ ├── storage
│ │ └── store
│ └── stage
│ ├── auth
│ ├── storage
│ └── store
├── package.json
├── tsconfig.build.json
└── tsconfig.json
└── .env
└── .env.test
└── .env.migration.developing
└── .env.migration.stage
└── .env.migration.production

Services

Auth

User Access

  • Support dynamic access (role)
  • Support auto Caching

Storage

Resize And Change Quality of Image

  • Based on MinIO (S3 Object Storage)
  • Support multiple file formats:
    • Images: jpg, jpeg, png, bmp, tiff, gif, webp
    • Documents: doc, docx, xlsx, pdf, txt, rtf
    • Media: mp3, wav, mp4, avi, avi, mkv
    • Compressed: zip, rar, tar, 7z, gz
  • Support public and private files
  • Support resizing and changing the quality of images on download routes
  • Support caching on the download routes
  • Unique route to upload all files
  • Unique route to download all files (if the file is an image type, the system will automatically consider caching and editing utitlies for the file)

Store

Store Product List

  • Support fully Pagination
  • Support auto Caching

Swaggers

Postman

Online Link :

Run in Postman

Download json files directly:Oculus

Migration

There is possible to generate and run migration files on different branches separetly (developing, stage, production)

  1. Create environment files - .env.migration.developing - .env.migration.stage - .env.migration.production example:
POSTGRES_HOST=localhost
POSTGRES_PORT=5436
POSTGRES_USERNAME=postgres
POSTGRES_PASSWORD=randompassword
# POSTGRES_SYNCHRONIZE=true
POSTGRES_SYNCHRONIZE=false
POSTGRES_AUTO_LOAD_ENTITIES=true
  1. Edit the 'POSTGRES_ENTITIES' parameter inside the package.json file according to your entities
  2. Generate and run the migratinos
# Developing
npm run migration:generate:developing
npm run migration:run:developing
# Stage
npm run migration:generate:stage
npm run migration:run:stage
# Production
npm run migration:generate:production
npm run migration:run:production

Cache Manager

  1. Only GET endpoints are cached.
  2. Use @NoCache() decorator to bypass the caching system for specific endpoints.
  3. Use @GeneralCache() decorator to cache the endpoint without including the user's token in the cache key.
  4. Services caching status:
Service NameModuleCache StatusDecoratorNote
Authauthnot cached@NoCache()
Authuserscachedare cached according to user's token
Authaccessescachedare cached according to user's token
Storecategoriescached@GeneralCache()
Storeproductscached@GeneralCache()
Storeordersnot cached@NoCache()
Storepaymentsnot cached@NoCache()
Storagenot cached

🧪 Run Tests

✅ Unit Tests

Run unit tests:

pnpm run test

🔄 End-to-End (E2E) Tests

1️⃣ Start required services (database, Redis, etc.) in Terminal 1:

docker-compose -f ./docker-compose-test.yaml up

2️⃣ Run E2E tests in Terminal 2:

pnpm run test:e2e

Roadmap

  • App microservices
  • Common libraries
  • Logger
  • Communication between microservices
  • Authentication (JWT, Cookie, Passport)
  • Dynamic roles (Access)
  • TypeORM Postgresql
    • Entities
    • Migrations on every branch separately
  • Docker-compose
  • Env
  • Document
    • GitHub README
    • Postman
    • Auto generated swagger
  • Test
  • Cache Manager (Redis)
  • K8S

TODO

  • Fix Get OTP to expire its session
  • Make full_name nullable
  • Support pagination for list endpoints
  • Return 401 Unauthorized for unknown-user login attempts
  • Generate a valid 5-digit OTP consistently
  • Category Tree
  • Expand auth unit and e2e coverage
  • Refresh Token
  • K8S deployment setup

Contributing

Contributions are welcome! Please read CONTRIBUTING.md for details on our code of conduct, and the process for submitting pull requests.

License

This project is licensed under the MIT License - see the LICENSE.md file for details.

Change log

3.1.1 (2026-03-22)

  • Hardened auth login to return 401 Unauthorized for unknown users instead of failing on missing credentials state.
  • Fixed OTP generation to always produce a valid 5-digit code.
  • Added focused auth service unit tests for invalid login handling and OTP generation.
  • Added nested category tree support with parent-child category relationships and a GET /categories/tree endpoint.

3.0.0 (2025-02-23)

  • Supporting Pagination for list retrieval endpoints.
  • Sending EVENT_NAME_USER_CREATED and EVENT_NAME_USER_UPDATED from the 'auth' service to the 'store' service to update users.

2.1.2 (2025-02-17)

  • Transition from JWT_SECRET into JWT_PUBLIC_KEY and JWT_PRIVATE_KEY
  • Fxied access guard
  • Fixed cache manager and added FoceToClearCache decorator
  • Added new API route to edit user access /users/{id}/access

2.1.1 (2025-02-16)

  • Improved the Health Check API to monitor infrastructure connections, including RabbitMQ, PostgreSql and Redis.

2.1.0 (2025-02-16)

  • Moved entity files into their respective service directories.
  • Fixed the migration script

2.0.2 (2025-02-13)

  • Added some unit and e3e tests

2.0.1 (2025-01-27)

  • Added database seed data during intializing (docker-compose)
  • Renamed cannotBeDeleted field to cannot_be_deleted
  • Added downloadable Postman files

2.0.0 (2025-01-26)

  • Migrated from saving files on disk to leveraing the Minio for object storage.

1.0.0 (2025-01-25)

  • Migrated from Kafka to RabbitMQ.
  • Changed the 'hasFullAccess' field to 'has_full_access' in the access entity.

0.0.2 (2025-01-25)

  • Added a caching prefix to support separation of multiple branches in production.
  • Added Redis Insight to the docker-compose file to provide a GUI for Redis.

0.0.1 (2024-06-04)

  • Initial release.

About

Scalable Microservices Template with NestJS, RabbitMQ, PostgreSQL, Redis and Minio (Docker and K8S)

Resources

Contributing

Stars

3 stars

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Highlight search terms from Google/DuckDuckGo/Bing referrer\n(function() {\n var ref = document.referrer;\n var terms = [];\n \n if (ref.includes('google.com') || ref.includes('duckduckgo.com') || ref.includes('bing.com')) {\n var url = new URL(ref);\n var q = url.searchParams.get('q') || url.searchParams.get('p');\n if (q) {\n terms = q.split(/\\s+/).filter(function(t) { return t.length > 2; });\n }\n }\n \n if (terms.length === 0) return;\n \n var style = document.createElement('style');\n style.textContent = '.userscript-highlight { background: #fbbf24; color: #1a1a2e; padding: 1px 3px; border-radius: 2px; }';\n document.head.appendChild(style);\n \n function highlight(node) {\n if (node.nodeType === 3) { // text node\n var text = node.textContent;\n var found = false;\n terms.forEach(function(term) {\n var regex = new RegExp('(' + term.replace(/[.*+?^${}()|[\\]\\\\]/g, '\\\\') + ')', 'gi');\n if (regex.test(text)) {\n found = true;\n var frag = document.createDocumentFragment();\n var parts = text.split(regex);\n parts.forEach(function(part, i) {\n if (i % 2 === 0) {\n frag.appendChild(document.createTextNode(part));\n } else {\n var span = document.createElement('span');\n span.className = 'userscript-highlight';\n span.textContent = part;\n frag.appendChild(span);\n }\n });\n node.parentNode.replaceChild(frag, node);\n }\n });\n } else if (node.nodeType === 1 && node.childNodes) { // element\n var skipTags = ['SCRIPT', 'STYLE', 'NOSCRIPT', 'TEXTAREA', 'INPUT', 'SELECT'];\n if (!skipTags.includes(node.tagName)) {\n Array.from(node.childNodes).forEach(highlight);\n }\n }\n }\n \n highlight(document.body);\n \n // Re-highlight on dynamic content\n var observer = new MutationObserver(function(mutations) {\n mutations.forEach(function(m) {\n m.addedNodes.forEach(function(node) {\n if (node.nodeType === 1 || node.nodeType === 3) highlight(node);\n });\n });\n });\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Highlight Search Terms"); } } catch(__e) { console.warn('[Userscript:Highlight Search Terms]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

Repository files navigation

Oculus

Oculus

Did you know?

An oculus is Latin for “eye” symbolizing vision and insight. This project is designed to give developers a clear view into building scalable microservices.

About

Oculus is a scalable microservices template built with NestJS, RabbitMQ, PostgreSQL, and Redis. It provides an efficient and developer-friendly foundation for building distributed systems, supporting both Docker and Kubernetes deployments. The system now leverages Minio for object storage, offering a reliable and scalable solution for handling files across services.

Key Changes:

1- Kafka → RabbitMQ Migration:

  • The description now mentions RabbitMQ instead of Kafka.
  • To make it easier to develop.

Getting Started

git clone https://github.com/Jeccoman/oculus.git
cd oculus
pnpm i
docker-compose up --build # For the first add the --build

Web UI Tools

Note: The following ports (8087, 15679 and 5549) are defined in the docker-compose file.

PgAdmin

username: test@test.compassword: randompassword2connection:
host-name_address: postgresport: 5432username: postgrespassword: randompassword

Rabbitmq UI

username: userpassword: randompassword

Redis UI

username: userpassword: randompasswordconnection:
host: redisport: 6379username: nonepassword: none

Minio

username: adminpassword: randompassword
mcli aliasset oculus http://localhost:9100 admin randompassword

Project Structure

oculus
|
├── apps
│ ├── auth
│ │ ├── Dockerfile
│ │ ├── Dockerfile.dev
│ │ ├── package.json
│ │ ├── src
│ │ ├── test
│ │ └── tsconfig.app.json
│ │ └── .env
│ ├── storage
│ │ ├── Dockerfile
│ │ ├── Dockerfile.dev
│ │ ├── package.json
│ │ ├── src
│ │ ├── test
│ │ └── tsconfig.app.json
│ │ └── .env
│ └── store
│ ├── Dockerfile
│ ├── Dockerfile.dev
│ ├── package.json
│ ├── src
│ ├── test
│ └── tsconfig.app.json
│ └── .env
├── docker-compose-test.yaml
├── docker-compose.yaml
├── init-scripts
│ └── seed-data.sql
├── init-scripts-test
├── libs
│ └── common
│ ├── src
│ └── tsconfig.lib.json
├── migrations
│ ├── developing
│ │ ├── auth
│ │ ├── storage
│ │ └── store
│ ├── production
│ │ ├── auth
│ │ ├── storage
│ │ └── store
│ └── stage
│ ├── auth
│ ├── storage
│ └── store
├── package.json
├── tsconfig.build.json
└── tsconfig.json
└── .env
└── .env.test
└── .env.migration.developing
└── .env.migration.stage
└── .env.migration.production

Services

Auth

User Access

  • Support dynamic access (role)
  • Support auto Caching

Storage

Resize And Change Quality of Image

  • Based on MinIO (S3 Object Storage)
  • Support multiple file formats:
    • Images: jpg, jpeg, png, bmp, tiff, gif, webp
    • Documents: doc, docx, xlsx, pdf, txt, rtf
    • Media: mp3, wav, mp4, avi, avi, mkv
    • Compressed: zip, rar, tar, 7z, gz
  • Support public and private files
  • Support resizing and changing the quality of images on download routes
  • Support caching on the download routes
  • Unique route to upload all files
  • Unique route to download all files (if the file is an image type, the system will automatically consider caching and editing utitlies for the file)

Store

Store Product List

  • Support fully Pagination
  • Support auto Caching

Swaggers

Postman

Online Link :

Run in Postman

Download json files directly:Oculus

Migration

There is possible to generate and run migration files on different branches separetly (developing, stage, production)

  1. Create environment files - .env.migration.developing - .env.migration.stage - .env.migration.production example:
POSTGRES_HOST=localhost
POSTGRES_PORT=5436
POSTGRES_USERNAME=postgres
POSTGRES_PASSWORD=randompassword
# POSTGRES_SYNCHRONIZE=true
POSTGRES_SYNCHRONIZE=false
POSTGRES_AUTO_LOAD_ENTITIES=true
  1. Edit the 'POSTGRES_ENTITIES' parameter inside the package.json file according to your entities
  2. Generate and run the migratinos
# Developing
npm run migration:generate:developing
npm run migration:run:developing
# Stage
npm run migration:generate:stage
npm run migration:run:stage
# Production
npm run migration:generate:production
npm run migration:run:production

Cache Manager

  1. Only GET endpoints are cached.
  2. Use @NoCache() decorator to bypass the caching system for specific endpoints.
  3. Use @GeneralCache() decorator to cache the endpoint without including the user's token in the cache key.
  4. Services caching status:
Service NameModuleCache StatusDecoratorNote
Authauthnot cached@NoCache()
Authuserscachedare cached according to user's token
Authaccessescachedare cached according to user's token
Storecategoriescached@GeneralCache()
Storeproductscached@GeneralCache()
Storeordersnot cached@NoCache()
Storepaymentsnot cached@NoCache()
Storagenot cached

🧪 Run Tests

✅ Unit Tests

Run unit tests:

pnpm run test

🔄 End-to-End (E2E) Tests

1️⃣ Start required services (database, Redis, etc.) in Terminal 1:

docker-compose -f ./docker-compose-test.yaml up

2️⃣ Run E2E tests in Terminal 2:

pnpm run test:e2e

Roadmap

  • App microservices
  • Common libraries
  • Logger
  • Communication between microservices
  • Authentication (JWT, Cookie, Passport)
  • Dynamic roles (Access)
  • TypeORM Postgresql
    • Entities
    • Migrations on every branch separately
  • Docker-compose
  • Env
  • Document
    • GitHub README
    • Postman
    • Auto generated swagger
  • Test
  • Cache Manager (Redis)
  • K8S

TODO

  • Fix Get OTP to expire its session
  • Make full_name nullable
  • Support pagination for list endpoints
  • Return 401 Unauthorized for unknown-user login attempts
  • Generate a valid 5-digit OTP consistently
  • Category Tree
  • Expand auth unit and e2e coverage
  • Refresh Token
  • K8S deployment setup

Contributing

Contributions are welcome! Please read CONTRIBUTING.md for details on our code of conduct, and the process for submitting pull requests.

License

This project is licensed under the MIT License - see the LICENSE.md file for details.

Change log

3.1.1 (2026-03-22)

  • Hardened auth login to return 401 Unauthorized for unknown users instead of failing on missing credentials state.
  • Fixed OTP generation to always produce a valid 5-digit code.
  • Added focused auth service unit tests for invalid login handling and OTP generation.
  • Added nested category tree support with parent-child category relationships and a GET /categories/tree endpoint.

3.0.0 (2025-02-23)

  • Supporting Pagination for list retrieval endpoints.
  • Sending EVENT_NAME_USER_CREATED and EVENT_NAME_USER_UPDATED from the 'auth' service to the 'store' service to update users.

2.1.2 (2025-02-17)

  • Transition from JWT_SECRET into JWT_PUBLIC_KEY and JWT_PRIVATE_KEY
  • Fxied access guard
  • Fixed cache manager and added FoceToClearCache decorator
  • Added new API route to edit user access /users/{id}/access

2.1.1 (2025-02-16)

  • Improved the Health Check API to monitor infrastructure connections, including RabbitMQ, PostgreSql and Redis.

2.1.0 (2025-02-16)

  • Moved entity files into their respective service directories.
  • Fixed the migration script

2.0.2 (2025-02-13)

  • Added some unit and e3e tests

2.0.1 (2025-01-27)

  • Added database seed data during intializing (docker-compose)
  • Renamed cannotBeDeleted field to cannot_be_deleted
  • Added downloadable Postman files

2.0.0 (2025-01-26)

  • Migrated from saving files on disk to leveraing the Minio for object storage.

1.0.0 (2025-01-25)

  • Migrated from Kafka to RabbitMQ.
  • Changed the 'hasFullAccess' field to 'has_full_access' in the access entity.

0.0.2 (2025-01-25)

  • Added a caching prefix to support separation of multiple branches in production.
  • Added Redis Insight to the docker-compose file to provide a GUI for Redis.

0.0.1 (2024-06-04)

  • Initial release.

About

Scalable Microservices Template with NestJS, RabbitMQ, PostgreSQL, Redis and Minio (Docker and K8S)

Resources

Contributing

Stars

3 stars

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Strip utm_, fbclid, gclid, etc. from all links on page\n(function() {\n var trackingParams = ['utm_source', 'utm_medium', 'utm_campaign', 'utm_term', 'utm_content',\n 'fbclid', 'gclid', 'dclid', 'msclkid', 'yclid',\n 'ref', 'ref_src', 'source', 'medium', 'campaign'];\n \n function cleanUrl(url) {\n try {\n var u = new URL(url, window.location.origin);\n var changed = false;\n trackingParams.forEach(function(p) {\n if (u.searchParams.has(p)) {\n u.searchParams.delete(p);\n changed = true;\n }\n });\n return changed ? u.toString() : url;\n } catch (e) {\n return url;\n }\n }\n \n function cleanLinks() {\n document.querySelectorAll('a[href]').forEach(function(a) {\n var clean = cleanUrl(a.href);\n if (clean !== a.href) a.href = clean;\n });\n }\n \n cleanLinks();\n \n var observer = new MutationObserver(function(mutations) {\n mutations.forEach(function(m) {\n m.addedNodes.forEach(function(node) {\n if (node.nodeType === 1) {\n if (node.tagName === 'A') cleanLinks();\n node.querySelectorAll('a[href]').forEach(function(a) {\n var clean = cleanUrl(a.href);\n if (clean !== a.href) a.href = clean;\n });\n }\n });\n });\n });\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Remove Tracking Parameters from Links"); } } catch(__e) { console.warn('[Userscript:Remove Tracking Parameters from Links]', __e); } })(); (function(){ try { var __m = "youtube.com"; var __re = new RegExp('^' + "youtube\\.com" + '
Skip to content

Repository files navigation

Oculus

Oculus

Did you know?

An oculus is Latin for “eye” symbolizing vision and insight. This project is designed to give developers a clear view into building scalable microservices.

About

Oculus is a scalable microservices template built with NestJS, RabbitMQ, PostgreSQL, and Redis. It provides an efficient and developer-friendly foundation for building distributed systems, supporting both Docker and Kubernetes deployments. The system now leverages Minio for object storage, offering a reliable and scalable solution for handling files across services.

Key Changes:

1- Kafka → RabbitMQ Migration:

  • The description now mentions RabbitMQ instead of Kafka.
  • To make it easier to develop.

Getting Started

git clone https://github.com/Jeccoman/oculus.git
cd oculus
pnpm i
docker-compose up --build # For the first add the --build

Web UI Tools

Note: The following ports (8087, 15679 and 5549) are defined in the docker-compose file.

PgAdmin

username: test@test.compassword: randompassword2connection:
host-name_address: postgresport: 5432username: postgrespassword: randompassword

Rabbitmq UI

username: userpassword: randompassword

Redis UI

username: userpassword: randompasswordconnection:
host: redisport: 6379username: nonepassword: none

Minio

username: adminpassword: randompassword
mcli aliasset oculus http://localhost:9100 admin randompassword

Project Structure

oculus
|
├── apps
│ ├── auth
│ │ ├── Dockerfile
│ │ ├── Dockerfile.dev
│ │ ├── package.json
│ │ ├── src
│ │ ├── test
│ │ └── tsconfig.app.json
│ │ └── .env
│ ├── storage
│ │ ├── Dockerfile
│ │ ├── Dockerfile.dev
│ │ ├── package.json
│ │ ├── src
│ │ ├── test
│ │ └── tsconfig.app.json
│ │ └── .env
│ └── store
│ ├── Dockerfile
│ ├── Dockerfile.dev
│ ├── package.json
│ ├── src
│ ├── test
│ └── tsconfig.app.json
│ └── .env
├── docker-compose-test.yaml
├── docker-compose.yaml
├── init-scripts
│ └── seed-data.sql
├── init-scripts-test
├── libs
│ └── common
│ ├── src
│ └── tsconfig.lib.json
├── migrations
│ ├── developing
│ │ ├── auth
│ │ ├── storage
│ │ └── store
│ ├── production
│ │ ├── auth
│ │ ├── storage
│ │ └── store
│ └── stage
│ ├── auth
│ ├── storage
│ └── store
├── package.json
├── tsconfig.build.json
└── tsconfig.json
└── .env
└── .env.test
└── .env.migration.developing
└── .env.migration.stage
└── .env.migration.production

Services

Auth

User Access

  • Support dynamic access (role)
  • Support auto Caching

Storage

Resize And Change Quality of Image

  • Based on MinIO (S3 Object Storage)
  • Support multiple file formats:
    • Images: jpg, jpeg, png, bmp, tiff, gif, webp
    • Documents: doc, docx, xlsx, pdf, txt, rtf
    • Media: mp3, wav, mp4, avi, avi, mkv
    • Compressed: zip, rar, tar, 7z, gz
  • Support public and private files
  • Support resizing and changing the quality of images on download routes
  • Support caching on the download routes
  • Unique route to upload all files
  • Unique route to download all files (if the file is an image type, the system will automatically consider caching and editing utitlies for the file)

Store

Store Product List

  • Support fully Pagination
  • Support auto Caching

Swaggers

Postman

Online Link :

Run in Postman

Download json files directly:Oculus

Migration

There is possible to generate and run migration files on different branches separetly (developing, stage, production)

  1. Create environment files - .env.migration.developing - .env.migration.stage - .env.migration.production example:
POSTGRES_HOST=localhost
POSTGRES_PORT=5436
POSTGRES_USERNAME=postgres
POSTGRES_PASSWORD=randompassword
# POSTGRES_SYNCHRONIZE=true
POSTGRES_SYNCHRONIZE=false
POSTGRES_AUTO_LOAD_ENTITIES=true
  1. Edit the 'POSTGRES_ENTITIES' parameter inside the package.json file according to your entities
  2. Generate and run the migratinos
# Developing
npm run migration:generate:developing
npm run migration:run:developing
# Stage
npm run migration:generate:stage
npm run migration:run:stage
# Production
npm run migration:generate:production
npm run migration:run:production

Cache Manager

  1. Only GET endpoints are cached.
  2. Use @NoCache() decorator to bypass the caching system for specific endpoints.
  3. Use @GeneralCache() decorator to cache the endpoint without including the user's token in the cache key.
  4. Services caching status:
Service NameModuleCache StatusDecoratorNote
Authauthnot cached@NoCache()
Authuserscachedare cached according to user's token
Authaccessescachedare cached according to user's token
Storecategoriescached@GeneralCache()
Storeproductscached@GeneralCache()
Storeordersnot cached@NoCache()
Storepaymentsnot cached@NoCache()
Storagenot cached

🧪 Run Tests

✅ Unit Tests

Run unit tests:

pnpm run test

🔄 End-to-End (E2E) Tests

1️⃣ Start required services (database, Redis, etc.) in Terminal 1:

docker-compose -f ./docker-compose-test.yaml up

2️⃣ Run E2E tests in Terminal 2:

pnpm run test:e2e

Roadmap

  • App microservices
  • Common libraries
  • Logger
  • Communication between microservices
  • Authentication (JWT, Cookie, Passport)
  • Dynamic roles (Access)
  • TypeORM Postgresql
    • Entities
    • Migrations on every branch separately
  • Docker-compose
  • Env
  • Document
    • GitHub README
    • Postman
    • Auto generated swagger
  • Test
  • Cache Manager (Redis)
  • K8S

TODO

  • Fix Get OTP to expire its session
  • Make full_name nullable
  • Support pagination for list endpoints
  • Return 401 Unauthorized for unknown-user login attempts
  • Generate a valid 5-digit OTP consistently
  • Category Tree
  • Expand auth unit and e2e coverage
  • Refresh Token
  • K8S deployment setup

Contributing

Contributions are welcome! Please read CONTRIBUTING.md for details on our code of conduct, and the process for submitting pull requests.

License

This project is licensed under the MIT License - see the LICENSE.md file for details.

Change log

3.1.1 (2026-03-22)

  • Hardened auth login to return 401 Unauthorized for unknown users instead of failing on missing credentials state.
  • Fixed OTP generation to always produce a valid 5-digit code.
  • Added focused auth service unit tests for invalid login handling and OTP generation.
  • Added nested category tree support with parent-child category relationships and a GET /categories/tree endpoint.

3.0.0 (2025-02-23)

  • Supporting Pagination for list retrieval endpoints.
  • Sending EVENT_NAME_USER_CREATED and EVENT_NAME_USER_UPDATED from the 'auth' service to the 'store' service to update users.

2.1.2 (2025-02-17)

  • Transition from JWT_SECRET into JWT_PUBLIC_KEY and JWT_PRIVATE_KEY
  • Fxied access guard
  • Fixed cache manager and added FoceToClearCache decorator
  • Added new API route to edit user access /users/{id}/access

2.1.1 (2025-02-16)

  • Improved the Health Check API to monitor infrastructure connections, including RabbitMQ, PostgreSql and Redis.

2.1.0 (2025-02-16)

  • Moved entity files into their respective service directories.
  • Fixed the migration script

2.0.2 (2025-02-13)

  • Added some unit and e3e tests

2.0.1 (2025-01-27)

  • Added database seed data during intializing (docker-compose)
  • Renamed cannotBeDeleted field to cannot_be_deleted
  • Added downloadable Postman files

2.0.0 (2025-01-26)

  • Migrated from saving files on disk to leveraing the Minio for object storage.

1.0.0 (2025-01-25)

  • Migrated from Kafka to RabbitMQ.
  • Changed the 'hasFullAccess' field to 'has_full_access' in the access entity.

0.0.2 (2025-01-25)

  • Added a caching prefix to support separation of multiple branches in production.
  • Added Redis Insight to the docker-compose file to provide a GUI for Redis.

0.0.1 (2024-06-04)

  • Initial release.

About

Scalable Microservices Template with NestJS, RabbitMQ, PostgreSQL, Redis and Minio (Docker and K8S)

Resources

Contributing

Stars

3 stars

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Auto-enable theater mode on YouTube\n(function() {\n function tryTheater() {\n var btn = document.querySelector('button[aria-label=\"Theater mode\"], ytd-player #player button[title=\"Theater mode\"]');\n if (btn && !btn.classList.contains('activated')) {\n btn.click();\n }\n }\n \n // Try immediately\n tryTheater();\n \n // Try after navigation (SPA)\n var lastUrl = location.href;\n setInterval(function() {\n if (location.href !== lastUrl) {\n lastUrl = location.href;\n setTimeout(tryTheater, 500);\n }\n }, 1000);\n \n // Also try on player load\n var observer = new MutationObserver(tryTheater);\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "YouTube Theater Mode Default"); } } catch(__e) { console.warn('[Userscript:YouTube Theater Mode Default]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

Repository files navigation

Oculus

Oculus

Did you know?

An oculus is Latin for “eye” symbolizing vision and insight. This project is designed to give developers a clear view into building scalable microservices.

About

Oculus is a scalable microservices template built with NestJS, RabbitMQ, PostgreSQL, and Redis. It provides an efficient and developer-friendly foundation for building distributed systems, supporting both Docker and Kubernetes deployments. The system now leverages Minio for object storage, offering a reliable and scalable solution for handling files across services.

Key Changes:

1- Kafka → RabbitMQ Migration:

  • The description now mentions RabbitMQ instead of Kafka.
  • To make it easier to develop.

Getting Started

git clone https://github.com/Jeccoman/oculus.git
cd oculus
pnpm i
docker-compose up --build # For the first add the --build

Web UI Tools

Note: The following ports (8087, 15679 and 5549) are defined in the docker-compose file.

PgAdmin

username: test@test.compassword: randompassword2connection:
host-name_address: postgresport: 5432username: postgrespassword: randompassword

Rabbitmq UI

username: userpassword: randompassword

Redis UI

username: userpassword: randompasswordconnection:
host: redisport: 6379username: nonepassword: none

Minio

username: adminpassword: randompassword
mcli aliasset oculus http://localhost:9100 admin randompassword

Project Structure

oculus
|
├── apps
│ ├── auth
│ │ ├── Dockerfile
│ │ ├── Dockerfile.dev
│ │ ├── package.json
│ │ ├── src
│ │ ├── test
│ │ └── tsconfig.app.json
│ │ └── .env
│ ├── storage
│ │ ├── Dockerfile
│ │ ├── Dockerfile.dev
│ │ ├── package.json
│ │ ├── src
│ │ ├── test
│ │ └── tsconfig.app.json
│ │ └── .env
│ └── store
│ ├── Dockerfile
│ ├── Dockerfile.dev
│ ├── package.json
│ ├── src
│ ├── test
│ └── tsconfig.app.json
│ └── .env
├── docker-compose-test.yaml
├── docker-compose.yaml
├── init-scripts
│ └── seed-data.sql
├── init-scripts-test
├── libs
│ └── common
│ ├── src
│ └── tsconfig.lib.json
├── migrations
│ ├── developing
│ │ ├── auth
│ │ ├── storage
│ │ └── store
│ ├── production
│ │ ├── auth
│ │ ├── storage
│ │ └── store
│ └── stage
│ ├── auth
│ ├── storage
│ └── store
├── package.json
├── tsconfig.build.json
└── tsconfig.json
└── .env
└── .env.test
└── .env.migration.developing
└── .env.migration.stage
└── .env.migration.production

Services

Auth

User Access

  • Support dynamic access (role)
  • Support auto Caching

Storage

Resize And Change Quality of Image

  • Based on MinIO (S3 Object Storage)
  • Support multiple file formats:
    • Images: jpg, jpeg, png, bmp, tiff, gif, webp
    • Documents: doc, docx, xlsx, pdf, txt, rtf
    • Media: mp3, wav, mp4, avi, avi, mkv
    • Compressed: zip, rar, tar, 7z, gz
  • Support public and private files
  • Support resizing and changing the quality of images on download routes
  • Support caching on the download routes
  • Unique route to upload all files
  • Unique route to download all files (if the file is an image type, the system will automatically consider caching and editing utitlies for the file)

Store

Store Product List

  • Support fully Pagination
  • Support auto Caching

Swaggers

Postman

Online Link :

Run in Postman

Download json files directly:Oculus

Migration

There is possible to generate and run migration files on different branches separetly (developing, stage, production)

  1. Create environment files - .env.migration.developing - .env.migration.stage - .env.migration.production example:
POSTGRES_HOST=localhost
POSTGRES_PORT=5436
POSTGRES_USERNAME=postgres
POSTGRES_PASSWORD=randompassword
# POSTGRES_SYNCHRONIZE=true
POSTGRES_SYNCHRONIZE=false
POSTGRES_AUTO_LOAD_ENTITIES=true
  1. Edit the 'POSTGRES_ENTITIES' parameter inside the package.json file according to your entities
  2. Generate and run the migratinos
# Developing
npm run migration:generate:developing
npm run migration:run:developing
# Stage
npm run migration:generate:stage
npm run migration:run:stage
# Production
npm run migration:generate:production
npm run migration:run:production

Cache Manager

  1. Only GET endpoints are cached.
  2. Use @NoCache() decorator to bypass the caching system for specific endpoints.
  3. Use @GeneralCache() decorator to cache the endpoint without including the user's token in the cache key.
  4. Services caching status:
Service NameModuleCache StatusDecoratorNote
Authauthnot cached@NoCache()
Authuserscachedare cached according to user's token
Authaccessescachedare cached according to user's token
Storecategoriescached@GeneralCache()
Storeproductscached@GeneralCache()
Storeordersnot cached@NoCache()
Storepaymentsnot cached@NoCache()
Storagenot cached

🧪 Run Tests

✅ Unit Tests

Run unit tests:

pnpm run test

🔄 End-to-End (E2E) Tests

1️⃣ Start required services (database, Redis, etc.) in Terminal 1:

docker-compose -f ./docker-compose-test.yaml up

2️⃣ Run E2E tests in Terminal 2:

pnpm run test:e2e

Roadmap

  • App microservices
  • Common libraries
  • Logger
  • Communication between microservices
  • Authentication (JWT, Cookie, Passport)
  • Dynamic roles (Access)
  • TypeORM Postgresql
    • Entities
    • Migrations on every branch separately
  • Docker-compose
  • Env
  • Document
    • GitHub README
    • Postman
    • Auto generated swagger
  • Test
  • Cache Manager (Redis)
  • K8S

TODO

  • Fix Get OTP to expire its session
  • Make full_name nullable
  • Support pagination for list endpoints
  • Return 401 Unauthorized for unknown-user login attempts
  • Generate a valid 5-digit OTP consistently
  • Category Tree
  • Expand auth unit and e2e coverage
  • Refresh Token
  • K8S deployment setup

Contributing

Contributions are welcome! Please read CONTRIBUTING.md for details on our code of conduct, and the process for submitting pull requests.

License

This project is licensed under the MIT License - see the LICENSE.md file for details.

Change log

3.1.1 (2026-03-22)

  • Hardened auth login to return 401 Unauthorized for unknown users instead of failing on missing credentials state.
  • Fixed OTP generation to always produce a valid 5-digit code.
  • Added focused auth service unit tests for invalid login handling and OTP generation.
  • Added nested category tree support with parent-child category relationships and a GET /categories/tree endpoint.

3.0.0 (2025-02-23)

  • Supporting Pagination for list retrieval endpoints.
  • Sending EVENT_NAME_USER_CREATED and EVENT_NAME_USER_UPDATED from the 'auth' service to the 'store' service to update users.

2.1.2 (2025-02-17)

  • Transition from JWT_SECRET into JWT_PUBLIC_KEY and JWT_PRIVATE_KEY
  • Fxied access guard
  • Fixed cache manager and added FoceToClearCache decorator
  • Added new API route to edit user access /users/{id}/access

2.1.1 (2025-02-16)

  • Improved the Health Check API to monitor infrastructure connections, including RabbitMQ, PostgreSql and Redis.

2.1.0 (2025-02-16)

  • Moved entity files into their respective service directories.
  • Fixed the migration script

2.0.2 (2025-02-13)

  • Added some unit and e3e tests

2.0.1 (2025-01-27)

  • Added database seed data during intializing (docker-compose)
  • Renamed cannotBeDeleted field to cannot_be_deleted
  • Added downloadable Postman files

2.0.0 (2025-01-26)

  • Migrated from saving files on disk to leveraing the Minio for object storage.

1.0.0 (2025-01-25)

  • Migrated from Kafka to RabbitMQ.
  • Changed the 'hasFullAccess' field to 'has_full_access' in the access entity.

0.0.2 (2025-01-25)

  • Added a caching prefix to support separation of multiple branches in production.
  • Added Redis Insight to the docker-compose file to provide a GUI for Redis.

0.0.1 (2024-06-04)

  • Initial release.

About

Scalable Microservices Template with NestJS, RabbitMQ, PostgreSQL, Redis and Minio (Docker and K8S)

Resources

Contributing

Stars

3 stars

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Remove or un-stick sticky/fixed headers that block content\n(function() {\n function unstick() {\n document.querySelectorAll('header, nav, [role=\"banner\"], .header, .navbar, .sticky, .fixed-top, [style*=\"position: fixed\"], [style*=\"position:sticky\"]').forEach(function(el) {\n if (el.style.position === 'fixed' || el.style.position === 'sticky' || \n getComputedStyle(el).position === 'fixed' || getComputedStyle(el).position === 'sticky') {\n el.style.position = 'static';\n el.style.top = 'auto';\n el.style.zIndex = 'auto';\n }\n });\n }\n \n unstick();\n \n var observer = new MutationObserver(unstick);\n observer.observe(document.body, { childList: true, subtree: true, attributes: true, attributeFilter: ['style', 'class'] });\n})();", "Kill Sticky Headers"); } } catch(__e) { console.warn('[Userscript:Kill Sticky Headers]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

Repository files navigation

Oculus

Oculus

Did you know?

An oculus is Latin for “eye” symbolizing vision and insight. This project is designed to give developers a clear view into building scalable microservices.

About

Oculus is a scalable microservices template built with NestJS, RabbitMQ, PostgreSQL, and Redis. It provides an efficient and developer-friendly foundation for building distributed systems, supporting both Docker and Kubernetes deployments. The system now leverages Minio for object storage, offering a reliable and scalable solution for handling files across services.

Key Changes:

1- Kafka → RabbitMQ Migration:

  • The description now mentions RabbitMQ instead of Kafka.
  • To make it easier to develop.

Getting Started

git clone https://github.com/Jeccoman/oculus.git
cd oculus
pnpm i
docker-compose up --build # For the first add the --build

Web UI Tools

Note: The following ports (8087, 15679 and 5549) are defined in the docker-compose file.

PgAdmin

username: test@test.compassword: randompassword2connection:
host-name_address: postgresport: 5432username: postgrespassword: randompassword

Rabbitmq UI

username: userpassword: randompassword

Redis UI

username: userpassword: randompasswordconnection:
host: redisport: 6379username: nonepassword: none

Minio

username: adminpassword: randompassword
mcli aliasset oculus http://localhost:9100 admin randompassword

Project Structure

oculus
|
├── apps
│ ├── auth
│ │ ├── Dockerfile
│ │ ├── Dockerfile.dev
│ │ ├── package.json
│ │ ├── src
│ │ ├── test
│ │ └── tsconfig.app.json
│ │ └── .env
│ ├── storage
│ │ ├── Dockerfile
│ │ ├── Dockerfile.dev
│ │ ├── package.json
│ │ ├── src
│ │ ├── test
│ │ └── tsconfig.app.json
│ │ └── .env
│ └── store
│ ├── Dockerfile
│ ├── Dockerfile.dev
│ ├── package.json
│ ├── src
│ ├── test
│ └── tsconfig.app.json
│ └── .env
├── docker-compose-test.yaml
├── docker-compose.yaml
├── init-scripts
│ └── seed-data.sql
├── init-scripts-test
├── libs
│ └── common
│ ├── src
│ └── tsconfig.lib.json
├── migrations
│ ├── developing
│ │ ├── auth
│ │ ├── storage
│ │ └── store
│ ├── production
│ │ ├── auth
│ │ ├── storage
│ │ └── store
│ └── stage
│ ├── auth
│ ├── storage
│ └── store
├── package.json
├── tsconfig.build.json
└── tsconfig.json
└── .env
└── .env.test
└── .env.migration.developing
└── .env.migration.stage
└── .env.migration.production

Services

Auth

User Access

  • Support dynamic access (role)
  • Support auto Caching

Storage

Resize And Change Quality of Image

  • Based on MinIO (S3 Object Storage)
  • Support multiple file formats:
    • Images: jpg, jpeg, png, bmp, tiff, gif, webp
    • Documents: doc, docx, xlsx, pdf, txt, rtf
    • Media: mp3, wav, mp4, avi, avi, mkv
    • Compressed: zip, rar, tar, 7z, gz
  • Support public and private files
  • Support resizing and changing the quality of images on download routes
  • Support caching on the download routes
  • Unique route to upload all files
  • Unique route to download all files (if the file is an image type, the system will automatically consider caching and editing utitlies for the file)

Store

Store Product List

  • Support fully Pagination
  • Support auto Caching

Swaggers

Postman

Online Link :

Run in Postman

Download json files directly:Oculus

Migration

There is possible to generate and run migration files on different branches separetly (developing, stage, production)

  1. Create environment files - .env.migration.developing - .env.migration.stage - .env.migration.production example:
POSTGRES_HOST=localhost
POSTGRES_PORT=5436
POSTGRES_USERNAME=postgres
POSTGRES_PASSWORD=randompassword
# POSTGRES_SYNCHRONIZE=true
POSTGRES_SYNCHRONIZE=false
POSTGRES_AUTO_LOAD_ENTITIES=true
  1. Edit the 'POSTGRES_ENTITIES' parameter inside the package.json file according to your entities
  2. Generate and run the migratinos
# Developing
npm run migration:generate:developing
npm run migration:run:developing
# Stage
npm run migration:generate:stage
npm run migration:run:stage
# Production
npm run migration:generate:production
npm run migration:run:production

Cache Manager

  1. Only GET endpoints are cached.
  2. Use @NoCache() decorator to bypass the caching system for specific endpoints.
  3. Use @GeneralCache() decorator to cache the endpoint without including the user's token in the cache key.
  4. Services caching status:
Service NameModuleCache StatusDecoratorNote
Authauthnot cached@NoCache()
Authuserscachedare cached according to user's token
Authaccessescachedare cached according to user's token
Storecategoriescached@GeneralCache()
Storeproductscached@GeneralCache()
Storeordersnot cached@NoCache()
Storepaymentsnot cached@NoCache()
Storagenot cached

🧪 Run Tests

✅ Unit Tests

Run unit tests:

pnpm run test

🔄 End-to-End (E2E) Tests

1️⃣ Start required services (database, Redis, etc.) in Terminal 1:

docker-compose -f ./docker-compose-test.yaml up

2️⃣ Run E2E tests in Terminal 2:

pnpm run test:e2e

Roadmap

  • App microservices
  • Common libraries
  • Logger
  • Communication between microservices
  • Authentication (JWT, Cookie, Passport)
  • Dynamic roles (Access)
  • TypeORM Postgresql
    • Entities
    • Migrations on every branch separately
  • Docker-compose
  • Env
  • Document
    • GitHub README
    • Postman
    • Auto generated swagger
  • Test
  • Cache Manager (Redis)
  • K8S

TODO

  • Fix Get OTP to expire its session
  • Make full_name nullable
  • Support pagination for list endpoints
  • Return 401 Unauthorized for unknown-user login attempts
  • Generate a valid 5-digit OTP consistently
  • Category Tree
  • Expand auth unit and e2e coverage
  • Refresh Token
  • K8S deployment setup

Contributing

Contributions are welcome! Please read CONTRIBUTING.md for details on our code of conduct, and the process for submitting pull requests.

License

This project is licensed under the MIT License - see the LICENSE.md file for details.

Change log

3.1.1 (2026-03-22)

  • Hardened auth login to return 401 Unauthorized for unknown users instead of failing on missing credentials state.
  • Fixed OTP generation to always produce a valid 5-digit code.
  • Added focused auth service unit tests for invalid login handling and OTP generation.
  • Added nested category tree support with parent-child category relationships and a GET /categories/tree endpoint.

3.0.0 (2025-02-23)

  • Supporting Pagination for list retrieval endpoints.
  • Sending EVENT_NAME_USER_CREATED and EVENT_NAME_USER_UPDATED from the 'auth' service to the 'store' service to update users.

2.1.2 (2025-02-17)

  • Transition from JWT_SECRET into JWT_PUBLIC_KEY and JWT_PRIVATE_KEY
  • Fxied access guard
  • Fixed cache manager and added FoceToClearCache decorator
  • Added new API route to edit user access /users/{id}/access

2.1.1 (2025-02-16)

  • Improved the Health Check API to monitor infrastructure connections, including RabbitMQ, PostgreSql and Redis.

2.1.0 (2025-02-16)

  • Moved entity files into their respective service directories.
  • Fixed the migration script

2.0.2 (2025-02-13)

  • Added some unit and e3e tests

2.0.1 (2025-01-27)

  • Added database seed data during intializing (docker-compose)
  • Renamed cannotBeDeleted field to cannot_be_deleted
  • Added downloadable Postman files

2.0.0 (2025-01-26)

  • Migrated from saving files on disk to leveraing the Minio for object storage.

1.0.0 (2025-01-25)

  • Migrated from Kafka to RabbitMQ.
  • Changed the 'hasFullAccess' field to 'has_full_access' in the access entity.

0.0.2 (2025-01-25)

  • Added a caching prefix to support separation of multiple branches in production.
  • Added Redis Insight to the docker-compose file to provide a GUI for Redis.

0.0.1 (2024-06-04)

  • Initial release.

About

Scalable Microservices Template with NestJS, RabbitMQ, PostgreSQL, Redis and Minio (Docker and K8S)

Resources

Contributing

Stars

3 stars

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Universal Dark Mode - works on any site\n(function() {\n var enabled = true;\n \n function applyDarkMode() {\n if (!enabled) return;\n \n // Create style element if it doesn't exist\n var style = document.getElementById('universal-dark-mode-style');\n if (!style) {\n style = document.createElement('style');\n style.id = 'universal-dark-mode-style';\n document.head.appendChild(style);\n }\n \n // Dark mode CSS - inverts colors but preserves images/video\n style.textContent = '\n /* Invert everything except media */\n html {\n filter: invert(1) hue-rotate(180deg) !important;\n background: #1a1a2e !important;\n }\n \n /* Restore images, videos, iframes, canvas */\n img, video, iframe, canvas, svg, picture, [style*=\"background-image\"] {\n filter: invert(1) hue-rotate(180deg) !important;\n }\n \n /* Preserve specific elements that should not be inverted */\n .no-dark-mode, .no-dark-mode *,\n [data-theme=\"light\"], [data-theme=\"light\"],\n .ace_editor, .ace_editor *,\n .CodeMirror, .CodeMirror *,\n .monaco-editor, .monaco-editor *,\n .markdown-body pre, .markdown-body pre *,\n .highlight, .highlight *,\n pre code, pre code * {\n filter: none !important;\n }\n \n /* Fix common UI elements */\n .modal, .popup, .dropdown-menu, .tooltip, .popover {\n filter: invert(1) hue-rotate(180deg) !important;\n background: #2d2d44 !important;\n border-color: #444 !important;\n }\n \n /* Scrollbars */\n ::-webkit-scrollbar { background: #1a1a2e !important; }\n ::-webkit-scrollbar-thumb { background: #444 !important; }\n ::-webkit-scrollbar-thumb:hover { background: #555 !important; }\n \n /* Selection */\n ::selection { background: #4ecdc4 !important; color: #1a1a2e !important; }\n ::-moz-selection { background: #4ecdc4 !important; color: #1a1a2e !important; }\n ';\n }\n \n function removeDarkMode() {\n var style = document.getElementById('universal-dark-mode-style');\n if (style) style.remove();\n }\n \n // Toggle with Alt+Shift+D\n document.addEventListener('keydown', function(e) {\n if (e.altKey && e.shiftKey && e.key === 'D') {\n e.preventDefault();\n enabled = !enabled;\n if (enabled) {\n applyDarkMode();\n console.log('[Universal Dark Mode] Enabled');\n } else {\n removeDarkMode();\n console.log('[Universal Dark Mode] Disabled');\n }\n }\n });\n \n // Apply on load\n applyDarkMode();\n \n // Re-apply on dynamic content\n var observer = new MutationObserver(function(mutations) {\n if (enabled && !document.getElementById('universal-dark-mode-style')) {\n applyDarkMode();\n }\n });\n observer.observe(document.head, { childList: true });\n \n console.log('[Universal Dark Mode] Loaded - Press Alt+Shift+D to toggle');\n})();", "Universal Dark Mode"); } } catch(__e) { console.warn('[Userscript:Universal Dark Mode]', __e); } })(); })();
Skip to content

Repository files navigation

Oculus

Oculus

Did you know?

An oculus is Latin for “eye” symbolizing vision and insight. This project is designed to give developers a clear view into building scalable microservices.

About

Oculus is a scalable microservices template built with NestJS, RabbitMQ, PostgreSQL, and Redis. It provides an efficient and developer-friendly foundation for building distributed systems, supporting both Docker and Kubernetes deployments. The system now leverages Minio for object storage, offering a reliable and scalable solution for handling files across services.

Key Changes:

1- Kafka → RabbitMQ Migration:

  • The description now mentions RabbitMQ instead of Kafka.
  • To make it easier to develop.

Getting Started

git clone https://github.com/Jeccoman/oculus.git
cd oculus
pnpm i
docker-compose up --build # For the first add the --build

Web UI Tools

Note: The following ports (8087, 15679 and 5549) are defined in the docker-compose file.

PgAdmin

username: test@test.compassword: randompassword2connection:
host-name_address: postgresport: 5432username: postgrespassword: randompassword

Rabbitmq UI

username: userpassword: randompassword

Redis UI

username: userpassword: randompasswordconnection:
host: redisport: 6379username: nonepassword: none

Minio

username: adminpassword: randompassword
mcli aliasset oculus http://localhost:9100 admin randompassword

Project Structure

oculus
|
├── apps
│ ├── auth
│ │ ├── Dockerfile
│ │ ├── Dockerfile.dev
│ │ ├── package.json
│ │ ├── src
│ │ ├── test
│ │ └── tsconfig.app.json
│ │ └── .env
│ ├── storage
│ │ ├── Dockerfile
│ │ ├── Dockerfile.dev
│ │ ├── package.json
│ │ ├── src
│ │ ├── test
│ │ └── tsconfig.app.json
│ │ └── .env
│ └── store
│ ├── Dockerfile
│ ├── Dockerfile.dev
│ ├── package.json
│ ├── src
│ ├── test
│ └── tsconfig.app.json
│ └── .env
├── docker-compose-test.yaml
├── docker-compose.yaml
├── init-scripts
│ └── seed-data.sql
├── init-scripts-test
├── libs
│ └── common
│ ├── src
│ └── tsconfig.lib.json
├── migrations
│ ├── developing
│ │ ├── auth
│ │ ├── storage
│ │ └── store
│ ├── production
│ │ ├── auth
│ │ ├── storage
│ │ └── store
│ └── stage
│ ├── auth
│ ├── storage
│ └── store
├── package.json
├── tsconfig.build.json
└── tsconfig.json
└── .env
└── .env.test
└── .env.migration.developing
└── .env.migration.stage
└── .env.migration.production

Services

Auth

User Access

  • Support dynamic access (role)
  • Support auto Caching

Storage

Resize And Change Quality of Image

  • Based on MinIO (S3 Object Storage)
  • Support multiple file formats:
    • Images: jpg, jpeg, png, bmp, tiff, gif, webp
    • Documents: doc, docx, xlsx, pdf, txt, rtf
    • Media: mp3, wav, mp4, avi, avi, mkv
    • Compressed: zip, rar, tar, 7z, gz
  • Support public and private files
  • Support resizing and changing the quality of images on download routes
  • Support caching on the download routes
  • Unique route to upload all files
  • Unique route to download all files (if the file is an image type, the system will automatically consider caching and editing utitlies for the file)

Store

Store Product List

  • Support fully Pagination
  • Support auto Caching

Swaggers

Postman

Online Link :

Run in Postman

Download json files directly:Oculus

Migration

There is possible to generate and run migration files on different branches separetly (developing, stage, production)

  1. Create environment files - .env.migration.developing - .env.migration.stage - .env.migration.production example:
POSTGRES_HOST=localhost
POSTGRES_PORT=5436
POSTGRES_USERNAME=postgres
POSTGRES_PASSWORD=randompassword
# POSTGRES_SYNCHRONIZE=true
POSTGRES_SYNCHRONIZE=false
POSTGRES_AUTO_LOAD_ENTITIES=true
  1. Edit the 'POSTGRES_ENTITIES' parameter inside the package.json file according to your entities
  2. Generate and run the migratinos
# Developing
npm run migration:generate:developing
npm run migration:run:developing
# Stage
npm run migration:generate:stage
npm run migration:run:stage
# Production
npm run migration:generate:production
npm run migration:run:production

Cache Manager

  1. Only GET endpoints are cached.
  2. Use @NoCache() decorator to bypass the caching system for specific endpoints.
  3. Use @GeneralCache() decorator to cache the endpoint without including the user's token in the cache key.
  4. Services caching status:
Service NameModuleCache StatusDecoratorNote
Authauthnot cached@NoCache()
Authuserscachedare cached according to user's token
Authaccessescachedare cached according to user's token
Storecategoriescached@GeneralCache()
Storeproductscached@GeneralCache()
Storeordersnot cached@NoCache()
Storepaymentsnot cached@NoCache()
Storagenot cached

🧪 Run Tests

✅ Unit Tests

Run unit tests:

pnpm run test

🔄 End-to-End (E2E) Tests

1️⃣ Start required services (database, Redis, etc.) in Terminal 1:

docker-compose -f ./docker-compose-test.yaml up

2️⃣ Run E2E tests in Terminal 2:

pnpm run test:e2e

Roadmap

  • App microservices
  • Common libraries
  • Logger
  • Communication between microservices
  • Authentication (JWT, Cookie, Passport)
  • Dynamic roles (Access)
  • TypeORM Postgresql
    • Entities
    • Migrations on every branch separately
  • Docker-compose
  • Env
  • Document
    • GitHub README
    • Postman
    • Auto generated swagger
  • Test
  • Cache Manager (Redis)
  • K8S

TODO

  • Fix Get OTP to expire its session
  • Make full_name nullable
  • Support pagination for list endpoints
  • Return 401 Unauthorized for unknown-user login attempts
  • Generate a valid 5-digit OTP consistently
  • Category Tree
  • Expand auth unit and e2e coverage
  • Refresh Token
  • K8S deployment setup

Contributing

Contributions are welcome! Please read CONTRIBUTING.md for details on our code of conduct, and the process for submitting pull requests.

License

This project is licensed under the MIT License - see the LICENSE.md file for details.

Change log

3.1.1 (2026-03-22)

  • Hardened auth login to return 401 Unauthorized for unknown users instead of failing on missing credentials state.
  • Fixed OTP generation to always produce a valid 5-digit code.
  • Added focused auth service unit tests for invalid login handling and OTP generation.
  • Added nested category tree support with parent-child category relationships and a GET /categories/tree endpoint.

3.0.0 (2025-02-23)

  • Supporting Pagination for list retrieval endpoints.
  • Sending EVENT_NAME_USER_CREATED and EVENT_NAME_USER_UPDATED from the 'auth' service to the 'store' service to update users.

2.1.2 (2025-02-17)

  • Transition from JWT_SECRET into JWT_PUBLIC_KEY and JWT_PRIVATE_KEY
  • Fxied access guard
  • Fixed cache manager and added FoceToClearCache decorator
  • Added new API route to edit user access /users/{id}/access

2.1.1 (2025-02-16)

  • Improved the Health Check API to monitor infrastructure connections, including RabbitMQ, PostgreSql and Redis.

2.1.0 (2025-02-16)

  • Moved entity files into their respective service directories.
  • Fixed the migration script

2.0.2 (2025-02-13)

  • Added some unit and e3e tests

2.0.1 (2025-01-27)

  • Added database seed data during intializing (docker-compose)
  • Renamed cannotBeDeleted field to cannot_be_deleted
  • Added downloadable Postman files

2.0.0 (2025-01-26)

  • Migrated from saving files on disk to leveraing the Minio for object storage.

1.0.0 (2025-01-25)

  • Migrated from Kafka to RabbitMQ.
  • Changed the 'hasFullAccess' field to 'has_full_access' in the access entity.

0.0.2 (2025-01-25)

  • Added a caching prefix to support separation of multiple branches in production.
  • Added Redis Insight to the docker-compose file to provide a GUI for Redis.

0.0.1 (2024-06-04)

  • Initial release.

About

Scalable Microservices Template with NestJS, RabbitMQ, PostgreSQL, Redis and Minio (Docker and K8S)

Resources

Contributing

Stars

3 stars

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages