all repos — homestead @ 5a63e53323a84c4fe654060426fd4e803bde6903

Code for my website

serve site from filesystem rather than embedding It's cool to embed, but it requires server.go to be at the root. Also, I'd like to be able to update the built site separately in the future.

Alan Pearce
commit

5a63e53323a84c4fe654060426fd4e803bde6903

parent

74b5572c43869bdb0f653ba44170f7a91836f420

3 files changed, 53 insertions(+), 33 deletions(-)

jump to
M cmd/build/build.gocmd/build/build.go
@@ -25,6 +25,7 @@ "github.com/a-h/htmlformat"
"github.com/adrg/frontmatter" "github.com/antchfx/xmlquery" "github.com/antchfx/xpath" + "github.com/ardanlabs/conf/v3" mapset "github.com/deckarep/golang-set/v2" cp "github.com/otiai10/copy" "github.com/pkg/errors"
@@ -519,29 +520,39 @@
return nil } +type IOConfig struct { + Source string `conf:"default:.,short:s"` + Destination string `conf:"default:public,short:d"` +} + func main() { if os.Getenv("DEBUG") != "" { slog.SetLogLoggerLevel(slog.LevelDebug) } slog.Debug("starting build process") - _, err := os.Getwd() - if err != nil { - log.Panic(errors.Errorf("working directory does not exist: %v", err)) - } + + ioConfig := IOConfig{} + conf.Parse("", &ioConfig) - outDir := "public" - err = os.RemoveAll("public") + if ioConfig.Source != "." { + err := os.Chdir(ioConfig.Source) + if err != nil { + log.Panic("could not change to source directory") + } + } + err := os.RemoveAll(ioConfig.Destination) if err != nil { log.Panic(errors.Errorf("could not remove public directory: %v", err)) } - err = cp.Copy("static", outDir, cp.Options{ - PreserveTimes: true, + err = cp.Copy(path.Join(ioConfig.Source, "static"), ioConfig.Destination, cp.Options{ + PreserveTimes: true, + PermissionControl: cp.AddPermission(0755), }) if err != nil { log.Panic(errors.Errorf("could not copy static files: %v", err)) } - if err := build(outDir); err != nil { + if err := build(ioConfig.Destination); err != nil { switch cause := errors.Cause(err).(type) { case *fs.PathError: slog.Info("pathError")
M nix/default.nixnix/default.nix
@@ -2,7 +2,7 @@ { pkgs, self }:
let version = self.shortRev or self.dirtyShortRev or "unstable-${self.lastModified}"; dockerTag = self.rev or self.dirtyRev or "unstable-${self.lastModified}"; - mkDocker = type: server: + mkDocker = type: { server, public }: let PORT = 3000; in
@@ -11,6 +11,7 @@ name = "registry.fly.io/alanpearce-eu";
tag = dockerTag; contents = [ (pkgs.writeTextDir "config.toml" (builtins.readFile ./../config.toml)) + public ]; config = { Cmd = [ "${server}/bin/website" ];
@@ -18,7 +19,6 @@ Env = [
"PRODUCTION=true" "LISTEN_ADDRESS=::" "PORT=${builtins.toString PORT}" - "ROOT=public" ]; ExposedPorts = { "${builtins.toString PORT}/tcp" = { };
@@ -28,7 +28,7 @@ };
mkDockerStream = mkDocker "streamLayeredImage"; mkDockerImage = mkDocker "buildLayeredImage"; in -with pkgs; rec{ +with pkgs; rec { default = server; builder = buildGoApplication { pname = "website-builder";
@@ -46,6 +46,20 @@ };
modules = ./gomod2nix.toml; subPackages = [ "cmd/build" ]; }; + public = runCommandLocal "build" + { + src = with lib.fileset; toSource { + root = ./..; + fileset = unions [ + ./../config.toml + ./../content + ./../static + ./../templates + ]; + }; + } '' + ${builder}/bin/build -s $src -d $out/public + ''; server = buildGoApplication { pname = "website"; inherit version;
@@ -57,23 +71,23 @@ ./../go.mod
./../go.sum ./../server.go ./../internal - ./../config.toml - ./../content - ./../static - ./../templates ]; }; - nativeBuildInputs = [ builder ]; - prePatch = '' - ${builder}/bin/build - ''; modules = ./gomod2nix.toml; ldflags = [ "-s" "-w" "-X" "main.Commit=${version}" ]; }; - docker-stream = mkDockerStream server; - docker-stream-aarch64-linux = mkDockerStream (self.packages.aarch64-linux.server); - docker-stream-x86_64-linux = mkDockerStream (self.packages.x86_64-linux.server); - docker-image = mkDockerImage server; - docker-image-aarch64-linux = mkDockerImage (self.packages.aarch64-linux.server); - docker-image-x86_64-linux = mkDockerImage (self.packages.x86_64-linux.server); + docker-stream = mkDockerStream { inherit server public; }; + docker-stream-aarch64-linux = mkDockerStream { + inherit public; server = (self.packages.aarch64-linux.server); + }; + docker-stream-x86_64-linux = mkDockerStream { + inherit public; server = (self.packages.x86_64-linux.server); + }; + docker-image = mkDockerImage { inherit server public; }; + docker-image-aarch64-linux = mkDockerImage { + inherit public; server = (self.packages.aarch64-linux.server); + }; + docker-image-x86_64-linux = mkDockerImage { + inherit public; server = (self.packages.x86_64-linux.server); + }; }
M server.goserver.go
@@ -1,7 +1,6 @@
package main import ( - "embed" "errors" "fmt" "io"
@@ -44,9 +43,6 @@
type Host struct { Fiber *fiber.App } - -//go:embed all:public/* -var fs embed.FS var Commit string
@@ -130,10 +126,10 @@ }))
website.Use(recover.New(recover.Config{})) - files := http.FS(fs) + files := http.Dir("public") notFoundHandler := func(c *fiber.Ctx) error { c.Status(fiber.StatusNotFound).Type("html", "utf-8") - content, err := files.Open("public/404.html") + content, err := files.Open("404.html") if err != nil { c.Type("txt") return c.SendString("404 Not Found")
@@ -143,7 +139,6 @@ }
website.Get("/404.html", notFoundHandler) website.Use("/", filesystem.New(filesystem.Config{ Root: files, - PathPrefix: "public", ContentTypeCharset: "utf-8", MaxAge: int((24 * time.Hour).Seconds()), }))