go-notify
An email automation solution written in Golang. It facilitate users to register, send & schedule custom HTML mails for their clients.
Built using rich tech-stack:
- Api-server built using Go-fiber.
- Apache Kafka as a message broker.
- Postgres as database.
- Redis as cache.
- Client CLI built using Cobra.
- Mailgun as Email service.
- K6 for load testing.
- Prometheus & Grafana for Api-server monitoring.
Architecture diagram:
DB Schema:
Features Included:
- Authentication & authorization using JWT.
- Swagger included, built using Swago
- Full proof auth features - signup, login, update password, forgot password, logout.
- Cors, Helmet, Api-rate limiter included as middleware from security perspective.
- Users can register their clients & custom HTML templates.
- Mail scheduling (daily, weekly, monthly) using cron jobs.
- Subscription & Payment (payment has been stubbed for now and can be replaced with any suitable payment gateway).
- Api-server can be consumed by any client-side API, however for easy interaction - CLI (built using Cobra) has been included.
Installation & setup :-
- Go,Docker,Docker compose & Make should be pre-installed.
- Clone the repository:
git clone https://github.com/Harry-027/go-notify.git
. - Run the command
make download
(this will install go modules). - Create a new file .env under root directory & copy the env variables from .sample-env. (Note that mailgun env variables should be replaced with original credentials. Rest may remain untouched)
- Run the command
make setup
(this will start the required docker containers - postgres, redis, apache kafka & zoo-keeper). - Run the command
docker ps
to ensure all the four containers are up & running. - Open a new terminal & run the command
make server
to spin up the api server. - Open a new terminal & run the command
make consumer
to spin up the kafka consumer. - Open a new terminal & run the command
make cronjob
to start the cron processes. - Open a new terminal & run the command
cli-go
. This will install the go-notify cli on your machine. - Cli is now ready to operate. Run the command
go-notify --help
to explore various commands.
Swagger :-
- Once the server starts listening on port 3001, visit http://localhost:3001/swagger/ on browser for swagger definition.
Monitoring (using Prometheus & Grafana):-
- Before spinning up Prometheus & Grafana for monitoring, replace the HOST_IP variable (under monitoring/prometheus/config.yml) with your machine IP.
- Run the command
make monitor
to start Api-server monitoring. - Once the containers - Prometheus & Grafana are up, visit http://localhost:3000 on browser for Grafana dashboard.
- Default credentials for Grafana: username - 'admin' , password - 'admin'
- Once logged into Grafana, visit settings to select prometheus data source as target to view the dashboard.
Load Testing :-
- Before running load tests, replace the hostip variable value with your machine ip, under loadtesting/tests/loadtests.js
- Run the command
make load-testing
to run the load tests.
Sample for a custom HTML received mail :-
Contributing 🍻
- Performance improvements, bug fixes, better design approaches are welcome. Please discuss any changes by raising an issue, beforehand.
Maintainer 😎
Harish Bhawnani Linkedin Email
License
MIT © Harish Bhawnani