From cd808570b95208251abb16300c1f22ce9f984376 Mon Sep 17 00:00:00 2001 From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com> Date: Fri, 23 Jan 2026 13:36:29 +0000 Subject: [PATCH 1/4] Initial plan From 2713eb5fd34f7b9b14fc122ecc671a570b84955f Mon Sep 17 00:00:00 2001 From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com> Date: Fri, 23 Jan 2026 13:39:40 +0000 Subject: [PATCH 2/4] Add timezone support via TZ environment variable - Install tzdata package in Docker image for timezone data - Load TZ environment variable at application startup - Set Go's time.Local to configured timezone - Log timezone configuration for debugging Co-authored-by: Dennis960 <66166638+Dennis960@users.noreply.github.com> --- Dockerfile | 2 +- server/main.go | 13 +++++++++++++ 2 files changed, 14 insertions(+), 1 deletion(-) diff --git a/Dockerfile b/Dockerfile index 278302d..a003069 100644 --- a/Dockerfile +++ b/Dockerfile @@ -29,7 +29,7 @@ RUN go build -o /app/app main.go # Runtime FROM alpine:3.19 WORKDIR /app -RUN apk add --no-cache sqlite-libs ca-certificates && \ +RUN apk add --no-cache sqlite-libs ca-certificates tzdata && \ mkdir -p /data COPY --from=builder /app/app /app/app diff --git a/server/main.go b/server/main.go index 775c725..c14fc77 100644 --- a/server/main.go +++ b/server/main.go @@ -7,6 +7,8 @@ import ( "io/fs" "log" "net/http" + "os" + "time" "backapp-server/config" "backapp-server/controller" @@ -36,6 +38,17 @@ func CORSMiddleware() gin.HandlerFunc { var embeddedStaticFiles embed.FS func main() { + // Load timezone from TZ environment variable + if tzEnv := os.Getenv("TZ"); tzEnv != "" { + loc, err := time.LoadLocation(tzEnv) + if err != nil { + log.Printf("Warning: Failed to load timezone '%s': %v. Using system default.", tzEnv, err) + } else { + time.Local = loc + log.Printf("Timezone set to: %s", tzEnv) + } + } + // Parse command line flags port := flag.Int("port", 8080, "Port to run the server on") dbPath := flag.String("db", "./app.db", "SQLite database path") From 0193b1cded072d68714ee1ac5014d78477551550 Mon Sep 17 00:00:00 2001 From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com> Date: Fri, 23 Jan 2026 13:40:36 +0000 Subject: [PATCH 3/4] Add timezone documentation to README and docker-compose - Document TZ environment variable in README - Add commented example in docker-compose.yml Co-authored-by: Dennis960 <66166638+Dennis960@users.noreply.github.com> --- README.md | 7 +++++++ docker-compose.yml | 3 +++ 2 files changed, 10 insertions(+) diff --git a/README.md b/README.md index 21fa8ce..39218bd 100644 --- a/README.md +++ b/README.md @@ -31,6 +31,10 @@ BackApp supports the following command-line flags: - `-port` - Port to run the server on (default: `8080`) - `-db` - SQLite database path (default: `/data/app.db`) +### Environment Variables + +- `TZ` - Set the timezone for the application (e.g., `Asia/Bangkok`, `America/New_York`, `Europe/London`). This affects all timestamps in logs, backup runs, and naming rules. If not set, the system default timezone (typically UTC in Docker) is used. + Examples: ```bash # Run on a different port @@ -41,6 +45,9 @@ Examples: # Combine multiple flags ./backapp -port=9090 -db=/custom/path/app.db + +# Set timezone using environment variable +TZ=Asia/Bangkok ./backapp ``` ## Quick start diff --git a/docker-compose.yml b/docker-compose.yml index 036e4c9..8aa5e21 100644 --- a/docker-compose.yml +++ b/docker-compose.yml @@ -6,6 +6,9 @@ services: - "8080:8080" command: [ "-port=8080" ] restart: unless-stopped + # Optionally set timezone using TZ environment variable + # environment: + # - TZ=Asia/Bangkok healthcheck: test: ["CMD-SHELL", "wget -qO- http://localhost:8080/health || exit 1"] interval: 30s From f6a07be6e374e72e9872786ccc4d1e301b54581b Mon Sep 17 00:00:00 2001 From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com> Date: Fri, 23 Jan 2026 13:42:52 +0000 Subject: [PATCH 4/4] Final summary - timezone support implementation complete Co-authored-by: Dennis960 <66166638+Dennis960@users.noreply.github.com> --- server/go.mod | 2 +- server/go.sum | 4 ---- 2 files changed, 1 insertion(+), 5 deletions(-) diff --git a/server/go.mod b/server/go.mod index 530f7c6..87eb690 100644 --- a/server/go.mod +++ b/server/go.mod @@ -3,6 +3,7 @@ module backapp-server go 1.24.0 require ( + github.com/SherClockHolmes/webpush-go v1.4.0 github.com/gin-gonic/gin v1.10.0 github.com/robfig/cron/v3 v3.0.1 golang.org/x/crypto v0.46.0 @@ -11,7 +12,6 @@ require ( ) require ( - github.com/SherClockHolmes/webpush-go v1.4.0 // indirect github.com/bytedance/sonic v1.12.3 // indirect github.com/bytedance/sonic/loader v0.2.0 // indirect github.com/cloudwego/base64x v0.1.4 // indirect diff --git a/server/go.sum b/server/go.sum index c18b720..0793dc7 100644 --- a/server/go.sum +++ b/server/go.sum @@ -30,8 +30,6 @@ github.com/goccy/go-json v0.10.3 h1:KZ5WoDbxAIgm2HNbYckL0se1fHD6rz5j4ywS6ebzDqA= github.com/goccy/go-json v0.10.3/go.mod h1:oq7eo15ShAhp70Anwd5lgX2pLfOS3QCiwU/PULtXL6M= github.com/golang-jwt/jwt/v5 v5.2.1 h1:OuVbFODueb089Lh128TAcimifWaLhJwVflnrgM17wHk= github.com/golang-jwt/jwt/v5 v5.2.1/go.mod h1:pqrtFR0X4osieyHYxtmOUWsAWrfe1Q5UVIyoH402zdk= -github.com/google/go-cmp v0.5.5 h1:Khx7svrCpmxxtHBq5j2mp/xVjsi8hQMfNLvJFAlrGgU= -github.com/google/go-cmp v0.5.5/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= github.com/google/go-cmp v0.6.0 h1:ofyhxvXcZhMsU5ulbFiLKl/XBFqE1GSq7atu8tAmTRI= github.com/google/go-cmp v0.6.0/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY= github.com/google/gofuzz v1.0.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg= @@ -152,8 +150,6 @@ golang.org/x/tools v0.6.0/go.mod h1:Xwgl3UAJ/d3gWutnCtw505GrjyAbvKui8lOU390QaIU= golang.org/x/tools v0.13.0/go.mod h1:HvlwmtVNQAhOuCjW7xxvovg8wbNq7LwfXh/k7wXUl58= golang.org/x/tools v0.21.1-0.20240508182429-e35e4ccd0d2d/go.mod h1:aiJjzUbINMkxbQROHiO6hDPo2LHcIPhhQsa9DLh0yGk= golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= -golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543 h1:E7g+9GITq07hpfrRu66IVDexMakfv52eLZ2CXBWiKr4= -golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= google.golang.org/protobuf v1.35.2 h1:8Ar7bF+apOIoThw1EdZl0p1oWvMqTHmpA2fRTyZO8io= google.golang.org/protobuf v1.35.2/go.mod h1:9fA7Ob0pmnwhb644+1+CVWFRbNajQ6iRojtC/QF5bRE= gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405 h1:yhCVgyC4o1eVCa2tZl7eS0r+SDo693bJlVdllGtEeKM=