117 lines
4.3 KiB
Markdown
117 lines
4.3 KiB
Markdown
# Golang Site Template
|
|
|
|
## What this project isn't
|
|
|
|
- A library
|
|
- A framework
|
|
|
|
## What is this project?
|
|
|
|
- A template, a starting point. An inspiration, maybe?
|
|
|
|
This project is a demo, of sorts, really. It is the base for my next side project,
|
|
which you can find at [markbailey.dev](https://markbailey.dev). This project is a
|
|
culmination of many, many hours poring over Go documentation, others' Go code,
|
|
and questions I wanted answers to, left over from previous experimentation with a
|
|
popular web framework for Go. This project is a full stack application.
|
|
|
|
This is a template for a full stack web application written in Golang.
|
|
It is fully-featured, and includes a number of tools to bootstrap a project on top
|
|
of what is already here. This project is a work in progress, it will be updated
|
|
and maintained for the foreseeable future. This is a labor of love, learning,
|
|
and a desire to build software that intrigues me outside of my day-to-day work.
|
|
|
|
I chose Go for this project because I wanted to explore the language, and the concepts
|
|
it lends itself well to. You will notice that this project contains a number of
|
|
features and patterns found in large scale projects. This is intentional, as in
|
|
my day-to-day work I write fullstack PHP in the Symfony framework. I wanted to
|
|
mirror the patterns I use at work in this project, and it has proven to be a
|
|
huge boost in my understanding of both Go and the patterns, tools, and paradigms
|
|
I use at work. Much of this project has been influenced by the advice of my
|
|
incredible mentor, friend, and boss Andy, and my guru level senior developer.
|
|
I have accumulated here the best practices that I have learned from them, from
|
|
my own experience, and from the tenacious push in the Go community to write
|
|
clean, idiomatic, and readable code.
|
|
|
|
It contains these features and more:
|
|
|
|
- Middleware (Fully customizable, custom)
|
|
- Routing and sub-routing
|
|
- In-memory sessions
|
|
- Templating
|
|
- Database interaction
|
|
This one is special, because the project uses an SQLite3 database for
|
|
local development, and a PostgreSQL database for production.
|
|
- Password authentication
|
|
- Project management via the `bin/app` script
|
|
|
|
This site is currently powering my personal site, which is self hosted on a VPS.
|
|
One of my favorite features of this project is the low number of dependencies. Check
|
|
out the following excerpt from `go.mod` (As of 2024-11-11).
|
|
|
|
```go
|
|
require (
|
|
github.com/a-h/templ v0.2.793
|
|
github.com/golang-jwt/jwt/v5 v5.2.1
|
|
github.com/lib/pq v1.10.9
|
|
github.com/mattn/go-sqlite3 v1.14.24
|
|
golang.org/x/crypto v0.27.0
|
|
)
|
|
```
|
|
|
|
There are only seven dependencies in this project, two of them being
|
|
just database drivers. There are also the "hidden" dependencies of sqlc, and TailwindCSS.
|
|
I like to think there are actually only five, if we don't count the obligatory
|
|
database drivers.
|
|
|
|
## Project Statistics
|
|
|
|

|
|
|
|
## Setup
|
|
|
|
1. Install Go
|
|
- Arch: `sudo pacman -S go`
|
|
- Other OS: from your package manager or visit [https://go.dev/doc/install](https://go.dev/doc/install)
|
|
2. Select a useable IDE:
|
|
- GoLand (JetBrains)
|
|
- Neovim
|
|
- Install `gopls` LSP using Mason and enable it in your `lspconfig`
|
|
- Set up formatting with `gofumpt` and `goimports`
|
|
- VSCode
|
|
- I don't use it, and I wouldn't recommend it. But you do you, boo :)
|
|
3. Clone project: `git clone https://git.markbailey.dev/cerbervs/ptpp.git`
|
|
4. Run: `make first-install`
|
|
5. Access the development site at
|
|
[http://localhost:8080](http://localhost:8080) or access the live site at
|
|
|
|
## Project Management Through `bin/app`
|
|
|
|
`bin/app` is a script that manages the project from top to bottom.
|
|
Please consult the help menu for more information: `bin/app help`
|
|
|
|
When starting from a fresh clone of the project, run
|
|
`bin/app first-install` to set up the project. This will install several
|
|
binaries, and the required node packages. You may be required to enter your
|
|
password.
|
|
|
|
## Git Conventions
|
|
|
|
### Making Branches
|
|
|
|
Branches should be prefixed with one of the following
|
|
|
|
- `feat/`
|
|
- `fix/`
|
|
- `refactor/`
|
|
- `test/`
|
|
|
|
Followed by a short description of the proposed changeset `separated-by-hyphens`
|
|
|
|
### Committing Code
|
|
|
|
This project uses
|
|
[Conventional Commits (Angular)](https://www.conventionalcommits.org/en/v1.0.0/#specification),
|
|
and in the future,
|
|
[Commitlint](https://github.com/conventional-changelog/commitlint)
|