diff --git a/Dockerfile b/Dockerfile index 78bab71..970c6c2 100644 --- a/Dockerfile +++ b/Dockerfile @@ -16,12 +16,15 @@ RUN CGO_ENABLED=0 GOOS=linux go build \ FROM alpine:3.22 +ARG APP_VERSION=dev + RUN apk add --no-cache ca-certificates ffmpeg wget ENV WARPBOX_ADDR=:8080 \ WARPBOX_DATA_DIR=/data \ WARPBOX_STATIC_DIR=/app/static \ - WARPBOX_TEMPLATE_DIR=/app/templates + WARPBOX_TEMPLATE_DIR=/app/templates \ + APP_VERSION=${APP_VERSION} WORKDIR /app diff --git a/backend/libs/config/config.go b/backend/libs/config/config.go index 3b5c6fb..7bc8465 100644 --- a/backend/libs/config/config.go +++ b/backend/libs/config/config.go @@ -12,6 +12,7 @@ import ( type Config struct { AppName string + AppVersion string Environment string Addr string BaseURL string @@ -54,6 +55,7 @@ type SettingsDefaults struct { func Load() (Config, error) { cfg := Config{ AppName: envString("WARPBOX_APP_NAME", "warpbox.dev"), + AppVersion: envString("APP_VERSION", "dev"), Environment: envString("WARPBOX_ENV", "development"), Addr: envString("WARPBOX_ADDR", ":8080"), BaseURL: strings.TrimRight(envString("WARPBOX_BASE_URL", "http://localhost:8080"), "/"), diff --git a/backend/libs/handlers/accounts_test.go b/backend/libs/handlers/accounts_test.go index b4b3f9c..36be9f3 100644 --- a/backend/libs/handlers/accounts_test.go +++ b/backend/libs/handlers/accounts_test.go @@ -569,6 +569,9 @@ func TestHomeReflectsUploadPolicySettings(t *testing.T) { if !strings.Contains(body, "Max file size: 123 MB") || !strings.Contains(body, "456 MB") { t.Fatalf("home did not reflect policy settings: %s", body) } + if !strings.Contains(body, "warpbox.dev · test ·") { + t.Fatalf("home footer did not include app version: %s", body) + } } func TestAPIDocsHeaderReflectsLoggedInUser(t *testing.T) { diff --git a/backend/libs/handlers/upload_stage3_test.go b/backend/libs/handlers/upload_stage3_test.go index 3f8dd87..77f0654 100644 --- a/backend/libs/handlers/upload_stage3_test.go +++ b/backend/libs/handlers/upload_stage3_test.go @@ -179,6 +179,7 @@ func newTestApp(t *testing.T) (*App, func()) { logger := slog.New(slog.NewTextHandler(io.Discard, nil)) cfg := config.Config{ AppName: "warpbox.dev", + AppVersion: "test", BaseURL: "http://example.test", DataDir: filepath.Join(root, "data"), StaticDir: staticDir, @@ -197,7 +198,7 @@ func newTestApp(t *testing.T) (*App, func()) { if err != nil { t.Fatalf("NewUploadService returned error: %v", err) } - renderer, err := web.NewRenderer(cfg.TemplateDir, cfg.AppName, cfg.BaseURL) + renderer, err := web.NewRenderer(cfg.TemplateDir, cfg.AppName, cfg.AppVersion, cfg.BaseURL) if err != nil { service.Close() t.Fatalf("NewRenderer returned error: %v", err) diff --git a/backend/libs/httpserver/server.go b/backend/libs/httpserver/server.go index 3982a1a..befc23b 100644 --- a/backend/libs/httpserver/server.go +++ b/backend/libs/httpserver/server.go @@ -13,7 +13,7 @@ import ( ) func New(cfg config.Config, logger *slog.Logger) (*http.Server, error) { - renderer, err := web.NewRenderer(cfg.TemplateDir, cfg.AppName, cfg.BaseURL) + renderer, err := web.NewRenderer(cfg.TemplateDir, cfg.AppName, cfg.AppVersion, cfg.BaseURL) if err != nil { return nil, err } diff --git a/backend/libs/web/renderer.go b/backend/libs/web/renderer.go index d5e6351..960248b 100644 --- a/backend/libs/web/renderer.go +++ b/backend/libs/web/renderer.go @@ -8,13 +8,15 @@ import ( ) type Renderer struct { - templates map[string]*template.Template - appName string - baseURL string + templates map[string]*template.Template + appName string + appVersion string + baseURL string } type PageData struct { AppName string + AppVersion string BaseURL string Title string Description string @@ -25,7 +27,7 @@ type PageData struct { Data any } -func NewRenderer(templateDir, appName, baseURL string) (*Renderer, error) { +func NewRenderer(templateDir, appName, appVersion, baseURL string) (*Renderer, error) { layouts, err := filepath.Glob(filepath.Join(templateDir, "layouts", "*.html")) if err != nil { return nil, err @@ -56,14 +58,16 @@ func NewRenderer(templateDir, appName, baseURL string) (*Renderer, error) { } return &Renderer{ - templates: templates, - appName: appName, - baseURL: baseURL, + templates: templates, + appName: appName, + appVersion: appVersion, + baseURL: baseURL, }, nil } func (r *Renderer) Render(w http.ResponseWriter, status int, page string, data PageData) { data.AppName = r.appName + data.AppVersion = r.appVersion data.BaseURL = r.baseURL data.CurrentYear = time.Now().Year() diff --git a/backend/templates/layouts/base.html b/backend/templates/layouts/base.html index a9e5d11..a50b357 100644 --- a/backend/templates/layouts/base.html +++ b/backend/templates/layouts/base.html @@ -60,7 +60,7 @@