{"id":20731077,"url":"https://github.com/greg-md/node-skeleton","last_synced_at":"2025-04-23T22:04:55.682Z","repository":{"id":40955459,"uuid":"338566819","full_name":"greg-md/node-skeleton","owner":"greg-md","description":"Skeleton of a NodeJS backend, using NestJS + GraphQL + NATS + Microservices + Docker + CI/CD + automated deployments with GitHub Actions using Kubernetes, Helm and AWS EKS.","archived":false,"fork":false,"pushed_at":"2025-04-18T07:30:43.000Z","size":2836,"stargazers_count":13,"open_issues_count":34,"forks_count":4,"subscribers_count":1,"default_branch":"main","last_synced_at":"2025-04-23T22:04:47.323Z","etag":null,"topics":[],"latest_commit_sha":null,"homepage":"","language":"TypeScript","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":null,"status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/greg-md.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":null,"code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":".github/CODEOWNERS","security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null,"zenodo":null}},"created_at":"2021-02-13T12:11:50.000Z","updated_at":"2024-05-29T17:25:50.000Z","dependencies_parsed_at":"2023-01-21T16:04:04.370Z","dependency_job_id":"6330e451-4a48-4be7-98f0-70b82f983826","html_url":"https://github.com/greg-md/node-skeleton","commit_stats":null,"previous_names":[],"tags_count":0,"template":false,"template_full_name":null,"repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/greg-md%2Fnode-skeleton","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/greg-md%2Fnode-skeleton/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/greg-md%2Fnode-skeleton/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/greg-md%2Fnode-skeleton/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/greg-md","download_url":"https://codeload.github.com/greg-md/node-skeleton/tar.gz/refs/heads/main","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":250522300,"owners_count":21444511,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":[],"created_at":"2024-11-17T05:13:38.514Z","updated_at":"2025-04-23T22:04:55.102Z","avatar_url":"https://github.com/greg-md.png","language":"TypeScript","funding_links":[],"categories":[],"sub_categories":[],"readme":"# Node Skeleton\n\n[![Maintainability](https://api.codeclimate.com/v1/badges/501d3320c5b7215676e3/maintainability)](https://codeclimate.com/github/greg-md/node-skeleton/maintainability)\n[![Test Coverage](https://api.codeclimate.com/v1/badges/501d3320c5b7215676e3/test_coverage)](https://codeclimate.com/github/greg-md/node-skeleton/test_coverage)\n[![Known Vulnerabilities](https://snyk.io/test/github/greg-md/node-skeleton/badge.svg?targetFile=package.json)](https://snyk.io/test/github/greg-md/node-skeleton?targetFile=package.json)\n[![Quality Gate Status](https://sonarcloud.io/api/project_badges/measure?project=greg-md_node-skeleton\u0026metric=alert_status)](https://sonarcloud.io/dashboard?id=greg-md_node-skeleton)\n\nSkeleton of a NodeJS backend, using\n[NestJS](https://nestjs.com/) +\n[GraphQL](https://docs.nestjs.com/graphql/quick-start) +\n[NATS](https://docs.nestjs.com/microservices/nats) +\n[Microservices](https://docs.nestjs.com/microservices/basics) +\n[Docker](https://www.docker.com/) +\nCI/CD +\nautomated deployments with GitHub Actions using\n[Kubernetes](https://kubernetes.io/),\n[Helm](https://helm.sh/) and\n[AWS EKS](https://aws.amazon.com/eks/).\n\nThe code is following [Domain-Driven Design (DDD)](https://thedomaindrivendesign.io/).\n\nUseful Documentation:\n- [Kubernetes Tutorial](https://youtu.be/X48VuDVv0do)\n- [AWS EKS - Create Kubernetes cluster on Amazon EKS](https://youtu.be/p6xDCz00TxU)\n- [Concept, Pros \u0026 Cons of Domain Driven Design](https://www.optimistikinfo.com/blogs/domain-driven-design)\n\nWhat has been done to the default app:\n- `npm i -g @nestjs/cli`\n- `nest new node-skeleton`\n- `cd node-skeleton`\n- `nest generate app micro`\n- `npm i nestjs/platform-fastify`\n- `npm remove @nestjs/platform-express @types/express supertest @types/supertest`\n- `npm i @nestjs/microservices`\n- `npm i nats`\n- `npm i sinon`\n- `npm i @nestjs/config`\n- `npm i @nestjs/graphql graphql-tools graphql apollo-server-fastify @moonwalker/graphql-nats-subscriptions`\n- `npm i winston colors`\n\n### GitHub Repository Secrets\n\n```sh\nCC_TEST_REPORTER_ID # CodeClimate Code Coverage Reporter ID\nAWS_ACCESS_KEY_ID # AWS Access Key ID\nAWS_SECRET_ACCESS_KEY # AWS Access Key Secret\nKUBE_CONFIG_DATA # cat $HOME/.kube/eksctl/clusters/skeleton | base64\n```\n\n### Table of Contents\n\n- [Local Run](#local-run)\n- [Build \u0026 Deploy](#build--deploy)\n    - [Pre Requirements](#pre-requirements)\n    - [Build](#build)\n    - [Deploy](#deploy)\n    - [Rollback](#rollback)\n    - [Destroy](#destroy)\n- [Cheatsheet](#cheatsheet)\n    - [Make Commands](#make-commands)\n    - [Debug](#debug)\n\n# Local Run\n\nUsing Docker:\n```sh\ndocker-compose up\n```\n\n# Build \u0026 Deploy\n\nYou can build \u0026 deploy out of the box to local minikube or to AWS EKS using Kubernetes.\n\n## Pre Requirements\n\nInstall [kubectl](https://kubernetes.io/docs/tasks/tools/install-kubectl/);\n\nInstall [Helm](https://helm.sh/);\n\n### Minikube\n\nInstall [minikube](https://minikube.sigs.k8s.io/docs/start/);\n\nStart minikube:\n```sh\nminikube start\n```\n\n### AWS ECR\n\nInstall and configure [AWS CLI](https://aws.amazon.com/cli/);\n\nInstall [eksctl](https://eksctl.io/);\n\nCreate AWS Cluster:\n```sh\neksctl create cluster -f ./build-deploy/cluster/skeleton.yaml --auto-kubeconfig\n```\n\nScale Cluster if needed:\n```sh\neksctl scale nodegroup --cluster=skeleton --nodes=4 --name=skeleton-nodes\n```\n\nTip:\n\u003e Use `--kubeconfig ~/.kube/eksctl/clusters/skeleton` flag to use AWS EKS with `kubectl` or `helm`.\n\n## Build\n\n### Minikube\n\nUse the minikube docker deamon to build the image:\n```bash\neval $(minikube docker-env)\n```\n\nBuild images:\n- `docker build -t skeleton/api --target production-api .`\n- `docker build -t skeleton/micro --target production-micro .`\n\n\n### AWS ECR\n\n- Run GitHub Action: [Build Api](.github/workflows/build-api.yml);\n- Run GitHub Action: [Build Micro](.github/workflows/build-micro.yml).\n\n## Deploy\n\n### Minikube\n\n```sh\nhelm upgrade nats ./build-deploy/helm/nats --install --wait\nhelm upgrade micro ./build-deploy/helm/micro --install --wait\nhelm upgrade api ./build-deploy/helm/api --install --wait\n```\n\nExplose API:\n```sh\nminikube service api-service\n```\n\n### AWS ECR\n\n- Run GitHub Action [Deploy NATS](.github/workflows/deploy-nats.yml);\n- Run GitHub Action [Deploy Micro](.github/workflows/deploy-micro.yml);\n- Run GitHub Action [Deploy Api](.github/workflows/deploy-api.yml).\n\n## Rollback\n\n### Minikube\n\n```sh\nhelm rollback nats --wait\nhelm rollback micro --wait\nhelm rollback api --wait\n```\n\n### AWS ECR\n\n- Run GitHub Action [Rollback NATS](.github/workflows/rollback-nats.yml);\n- Run GitHub Action [Rollback Micro](.github/workflows/rollback-micro.yml);\n- Run GitHub Action [Rollback Api](.github/workflows/rollback-api.yml).\n\n## Destroy\n\n### Minikube\n\n```sh\nhelm uninstall api\nhelm uninstall micro\nhelm uninstall nats\n```\n\n### AWS ECR\n\n```sh\nhelm uninstall api --kubeconfig ~/.kube/eksctl/clusters/skeleton\nhelm uninstall micro --kubeconfig ~/.kube/eksctl/clusters/skeleton\nhelm uninstall nats --kubeconfig ~/.kube/eksctl/clusters/skeleton\n```\n\nDestroy AWS EKS Cluster:\n```sh\neksctl delete cluster --name skeleton\n```\n\n# Cheatsheet\n\nhttps://kubernetes.io/docs/reference/kubectl/cheatsheet/\n\n## Make commands\n\nTo check the command list:\n```sh\nmake help\n```\n\nOutput:\n```\nUsage: make \u003ccommand\u003e\n\ncommand              description\n------               -----------\nhelp                 Help dialog.\npull                 Pull docker images.\nbuild                Build docker images based on docker-compose.yml file.\nup                   Start docker containers.\nupd                  Start docker containers in daemon mode.\nupp                  Rebuild and start docker containers.\nmain                 Enter the 'main' docker container.\nstop                 Stop docker containers.\ndown                 Destroy docker containers and volumes.\nclean                Destroy docker containers, local images and volumes.\nci                   Run tests in CI mode.\n```\n\n## Debug\n\nListen for logs:\n```bash\nkubectl logs -f -l app=api --all-containers [ --kubeconfig ~/.kube/eksctl/clusters/skeleton ]\nkubectl logs -f -l app=micro --all-containers [ --kubeconfig ~/.kube/eksctl/clusters/skeleton ]\n```\n\nEnter pods:\n```\nkubectl exec --stdin --tty \u003cpod-name\u003e -- /bin/sh\n```\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fgreg-md%2Fnode-skeleton","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fgreg-md%2Fnode-skeleton","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fgreg-md%2Fnode-skeleton/lists"}