The Principal Dev – Masterclass for Tech Leads

The Principal Dev – Masterclass for Tech LeadsJuly 17-18

Join

centered image

Thunder- A Minimalist Backend Framework in Go

A scalable microservices framework powered by Go, gRPC-Gateway, Prisma, and Kubernetes. It exposes REST, gRPC and Graphql

libs.tech recommends Go Version License Stars

πŸš€ Features

πŸ—οΈ Architecture Overview

Screenshot from 2025-06-28 17-32-47

πŸ“Œ Use Cases

Thunder is designed for scalable microservices and high-performance API development, particularly suited for:

1. High-Performance API Development

2. Microservices Architecture

3. Database Management with Prisma

4. Lightweight Backend Alternative

5. Kubernetes & Cloud-Native Applications


When Not to Use Thunder

πŸ“Œ Getting Started

Installation

git clone https://github.com/Raezil/Thunder.git
cd Thunder
chmod +x install.sh
./install.sh

Remember to install prerequisites, there is tutorial for this https://github.com/Raezil/Thunder/issues/99

Setup

Create a new Thunder application:

thunder init myapp
cd myapp

Install Dependencies

go mod tidy

Define Your gRPC Service

Create a .proto file (e.g., example.proto):

syntax = "proto3";

package example;

import "google/api/annotations.proto";
import "graphql.proto";

service Example {
	rpc SayHello(HelloRequest) returns (HelloResponse) {
		option (google.api.http) = {
			get: "/v1/example/sayhello"
		};
    		option (graphql.schema) = {
      			type: QUERY   // declare as Query
      			name: "sayhello" // query name
    		};
	};
}

message HelloRequest {
	string name = 1 [(graphql.field) = {required: true}];
}

message HelloResponse {
	string message = 1;
}

πŸ”¨ Generate a Service Scaffold

Use the new scaffold command to spin up a full CRUD .proto fileβ€”complete with gRPC, REST (gRPC-Gateway) and GraphQL annotations. Pass your fields as a comma-separated list of name:type pairs:

thunder scaffold   -service UserService   -entity User   -fields "id:string,name:string,email:string,age:int32"

Add your service entry in services.json:

[
    {
      "ServiceName": "Example",
      "ServiceStruct": "ExampleServiceServer",
      "ServiceRegister": "RegisterExampleServer",
      "HandlerRegister": "RegisterExampleHandler"
      "GraphqlHandlerRegister": "RegisterExampleGraphqlHandler"

    }
]

πŸ› οΈ Prisma Integration

Define your schema in schema.prisma:

datasource db {
  provider = "postgresql"
  url      = env("DATABASE_URL")
}

model User {
  id    String @default(cuid()) @id
  name  String
  email String @unique
}

Generate the service implementation:

thunder generate --proto=example.proto --graphql=true

πŸš€ Running the Server

Start the server:

go run ./cmd/app/server/main.go

Server accessible via HTTP at localhost:8080 and gRPC at localhost:50051.

πŸš€ Running the Tests

Mocking Tests

cd pkg/services/generated
mockgen -source=yourservice_grpc.pb.go -destination=./yourservice_mock.go

Run Tests

go test ./pkg/db ./pkg/middlewares/ ./pkg/services/ ./pkg/services/generated

πŸ”§ Kubernetes Deployment

PgBouncer Configuration

This setup configures PgBouncer to connect to a PostgreSQL database using Kubernetes resources.

Updating the userlist.txt Secret

To regenerate and update the userlist.txt secret, use the following command to encode the credentials:

echo '"postgres" "postgres"' | base64

Now, update pgbouncer-all.yaml under the Secret section with the new base64-encoded value:

apiVersion: v1
kind: Secret
metadata:
  name: pgbouncer-secret
type: Opaque
data:
  userlist.txt: <BASE64_ENCODED_VALUE>  # "postgres" "postgres" in base64

Generate TLS Certificates

cd cmd
mkdir certs
openssl req -x509 -newkey rsa:4096 -keyout certs/server.key -out certs/server.crt -days 365 -nodes \
  -subj "/CN=localhost" \
  -addext "subjectAltName=DNS:localhost,IP:127.0.0.1"

Generate Kubernetes Secrets

kubectl create secret generic app-secret   --from-literal=DATABASE_URL="postgres://postgres:postgres@pgbouncer-service:6432/thunder?sslmode=disable"   --from-literal=JWT_SECRET="secret"

kubectl create secret generic postgres-secret   --from-literal=POSTGRES_USER=postgres   --from-literal=POSTGRES_PASSWORD=postgres   --from-literal=POSTGRES_DB=thunder

Build & Deploy Docker Image

thunder build
thunder deploy

Check pod status:

kubectl get pods -n default
kubectl describe pod $NAME -n default

πŸ“œ Contributing

  1. Fork the repository.
  2. Create a feature branch: git checkout -b feature-new
  3. Commit changes: git commit -m "Added feature"
  4. Push to your branch: git push origin feature-new
  5. Submit a pull request.

πŸ”— References

πŸ“£ Stay Connected

⭐ Star the repository if you find it useful!
πŸ“§ For support, use GitHub Issues.

License

Thunder is released under the MIT License.

Join libs.tech

...and unlock some superpowers

GitHub

We won't share your data with anyone else.