Skip to content

goserve is a Go library designed to simplify the creation of backend applications or services that interact with HTTP requests. It leverages the powerful gorilla/mux router to provide flexibility, performance, and scalability while adhering to best practices in server development.

License

Notifications You must be signed in to change notification settings

softwareplace/goserve

Folders and files

NameName
Last commit message
Last commit date

Latest commit

Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 

goserve

goserve is a Go library designed to simplify the creation of backend applications or services that interact with HTTP requests. It leverages the powerful gorilla/mux router to provide flexibility, performance, and scalability while adhering to best practices in server development.


πŸ› οΈ Prerequisites

Before using goserve, make sure you have the following installed:

  1. Go Programming Language πŸ‘‰ Install Go βœ… Verify installation:

    go version
  2. Git (Version Control System) πŸ‘‰ Install Git βœ… Verify installation:

    git --version
  3. Environment Setup Add Go binaries to your PATH:

    export PATH="$HOME/go/bin:$PATH"

    Add this line to your shell configuration file (e.g., .bashrc, .zshrc) to persist it.

  4. oapi-codegen Tool (for OpenAPI/Swagger integration):

    go install github.com/deepmap/oapi-codegen/v2/cmd/oapi-codegen@v2.2.0

πŸ“¦ Installation

Install the goserve-generator CLI tool:

go install github.com/softwareplace/goserve/cmd/goserve-generator@latest

Or add the library to your Go project:

go get -u github.com/softwareplace/goserve

πŸš€ Usage

Generate a new goserve project:

goserve-generator -n <project-name> -u <github-username> [-r true|false] [-gi true|false]

Flags

Flag Description Required Default
-n Name of your project βœ… Yes
-u Your GitHub username βœ… Yes
-r Force replace existing files ❌ No false
-gi Gi project initialization ❌ No true
-cgf Template of the codegen config file ❌ No
-gsv Use a specific version of goserver ❌ No
version Check current version ❌ No
update Update to the latest released version ❌ No

Example

goserve-generator -n goserve-example -u myuser -r true -gi false

✨ Key Features

  • Backend Application Server: Kickstart a backend server with security, role-based access control, and scalable routing.
  • Enhanced Security: Built-in support for API key authentication using private.key and public.key.
  • Swagger-UI Integration: Built-in OpenAPI docs via oapi-codegen.
  • Router Flexibility: Powered by gorilla/mux for clean, RESTful routing.
  • Built-in Middleware: Support for authentication, role-checking, and structured error handling.

πŸ›‘οΈ Environment Variables

Variable Name Required? Default Description
CONTEXT_PATH No / Base path for all endpoints
PORT No 8080 Port the server listens on
API_SECRET_KEY Yes* Used in encryption/authentication
API_PRIVATE_KEY Yes* The private.key file path
B_CRYPT_COST No 10 Cost factor for bcrypt
LOG_DIR No ./.log Where log files are stored
LOG_APP_NAME No Used in the log file naming
LOG_REPORT_CALLER No false Enable method name reporting in logs
LOG_FILE_NAME_DATE_FORMAT No 2006-01-02 Date format for log filenames
JWT_ISSUER No JWT issuer name
JWT_CLAIMS_ENCRYPTION_ENABLED No true Encrypt claims inside JWT
SWAGGER_RESURCE_ENABLED No true Enable swagger resource

* Required only if using security.Service


πŸ§ͺ Example: Secure Server Setup

package main

import (
	log "github.com/sirupsen/logrus"
	"github.com/softwareplace/goserve/internal/handler"
	"github.com/softwareplace/goserve/internal/service/apiservice"
	"github.com/softwareplace/goserve/internal/service/login"
	"github.com/softwareplace/goserve/internal/service/provider"
	"github.com/softwareplace/goserve/logger"
	"github.com/softwareplace/goserve/security"
	"github.com/softwareplace/goserve/security/secret"
	"github.com/softwareplace/goserve/server"
)

func init() {
	logger.LogSetup()
}

var (
	userPrincipalService = login.NewPrincipalService()
	securityService      = security.New(
		userPrincipalService,
	)
	loginService   = login.NewLoginService(securityService)
	secretProvider = provider.NewSecretProvider()
	secretService  = secret.New(
		secretProvider,
		securityService,
	)
)

func main() {
	server.Default().
		LoginResourceEnabled(true).
		SecretKeyGeneratorResourceEnabled(true).
		LoginService(loginService).
		SecretService(secretService).
		SecurityService(securityService).
		EmbeddedServer(apiservice.Register).
		Get(apiservice.ReportCallerHandler, "/report/caller").
		SwaggerDocHandler("./internal/resource/pet-store.yaml").
		StartServer()
}

πŸ”§ Code Generation Config (oapi-codegen)

To customize code generation:

package: gen

generate:
  gorilla-server: true
  models: true

output: ./gen/api.gen.go

output-options:
  user-templates:
    imports.tmpl: https://raw.githubusercontent.com/softwareplace/goserve/refs/heads/main/resource/templates/imports.tmpl
    param-types.tmpl: https://raw.githubusercontent.com/softwareplace/goserve/refs/heads/main/resource/templates/param-types.tmpl
    request-bodies.tmpl: https://raw.githubusercontent.com/softwareplace/goserve/refs/heads/main/resource/templates/request-bodies.tmpl
    typedef.tmpl: https://raw.githubusercontent.com/softwareplace/goserve/refs/heads/main/resource/templates/typedef.tmpl
    gorilla/gorilla-register.tmpl: https://raw.githubusercontent.com/softwareplace/goserve/refs/heads/main/resource/templates/gorilla/gorilla-register.tmpl
    gorilla/gorilla-middleware.tmpl: https://raw.githubusercontent.com/softwareplace/goserve/refs/heads/main/resource/templates/gorilla/gorilla-middleware.tmpl
    gorilla/gorilla-interface.tmpl: https://raw.githubusercontent.com/softwareplace/goserve/refs/heads/main/resource/templates/gorilla/gorilla-interface.tmpl

Generate Code

oapi-codegen --config path/to/config.yaml path/to/swagger.yaml

πŸ“‹ API Testing

Start server

go run test/main.go

Open http://localhost:8080/swagger/index.html


Start in protected mode

PROTECTED_API=true go run test/main.go

Without token:

{
  "message": "You are not allowed to access this resource",
  "statusCode": 401,
  "timestamp": 1742781093916
}

With valid token:

curl -X GET 'http://localhost:8080/swagger/index.html' \
  -H 'accept: application/json' \
  -H 'X-Api-Key: <your-jwt-token>'

πŸ“š Why Choose goserve?

Whether you're building microservices or full-stack applications, goserve provides a clean, secure, and production-ready server foundation. With powerful integrations and easy configuration, goserve helps you focus on building featuresβ€”not boilerplate.


🧩 License

πŸŽ‰ Welcome to the Open Source Community!

Open source is more than just code β€” it's a collaborative effort powered by you! Contributing to goserve means you're joining a community of developers who believe in making software more accessible, secure, and scalable for everyone.

Thank you for being a part of this journey! Together, we create, innovate, and grow. πŸš€

About

goserve is a Go library designed to simplify the creation of backend applications or services that interact with HTTP requests. It leverages the powerful gorilla/mux router to provide flexibility, performance, and scalability while adhering to best practices in server development.

Topics

Resources

License

Code of conduct

Contributing

Security policy

Stars

Watchers

Forks

Packages

No packages published

Languages