go-full-stack/README.md

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
![project statistics](./project-files/11092024-ptpp-stats.png)
## 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)