From 43281f7c2c985e9bb52bd3ee39e23c9b3fa35f5a Mon Sep 17 00:00:00 2001 From: CodeShell <122738806+CodeShellDev@users.noreply.github.com> Date: Wed, 18 Mar 2026 17:56:57 +0100 Subject: [PATCH 01/25] add cors --- internals/config/structure/structure.go | 14 +++++ internals/proxy/middlewares/cors.go | 69 +++++++++++++++++++++++++ 2 files changed, 83 insertions(+) create mode 100644 internals/proxy/middlewares/cors.go diff --git a/internals/config/structure/structure.go b/internals/config/structure/structure.go index d705b651..629e7a2d 100644 --- a/internals/config/structure/structure.go +++ b/internals/config/structure/structure.go @@ -97,6 +97,7 @@ type Templating struct { } type Scheduling struct { + // Enabled is needed because this isn't a data-driven setting, but rather a toggle Enabled bool `koanf:"enabled"` MaxHorizon t.Opt[g.TimeDuration] `koanf:"maxhorizon"` } @@ -113,6 +114,19 @@ type ACCESS struct { IP_FILTER t.Opt[IPFilter] `koanf:"ipfilter"` TRUSTED_IPS t.Opt[[]g.IPOrNet] `koanf:"trustedips"` TRUSTED_PROXIES t.Opt[[]g.IPOrNet] `koanf:"trustedproxies"` + CORS t.Opt[Cors] `koanf:"cors"` +} + +type Cors struct { + Origins []Origin `koanf:"origins"` + Methods t.Opt[[]string] `koanf:"methods"` + Headers t.Opt[[]string] `koanf:"headers"` +} + +type Origin struct { + URL g.URL `koanf:"url"` + Methods t.Opt[[]string] `koanf:"methods"` + Headers t.Opt[[]string] `koanf:"headers"` } type FieldPolicies = *t.Comp[c.RFieldPolicies, c.FieldPolicies] diff --git a/internals/proxy/middlewares/cors.go b/internals/proxy/middlewares/cors.go new file mode 100644 index 00000000..577a167c --- /dev/null +++ b/internals/proxy/middlewares/cors.go @@ -0,0 +1,69 @@ +package middlewares + +import ( + "net/http" + "net/url" + "strings" + + "github.com/codeshelldev/secured-signal-api/internals/config" + "github.com/codeshelldev/secured-signal-api/internals/config/structure" + . "github.com/codeshelldev/secured-signal-api/internals/proxy/common" + "github.com/codeshelldev/secured-signal-api/utils/urlutils" +) + +var CORS Middleware = Middleware{ + Name: "CORS", + Use: corsHandler, +} + +func corsHandler(next http.Handler) http.Handler { + return http.HandlerFunc(func(w http.ResponseWriter, req *http.Request) { + conf := GetConfigByReq(req) + + cors := conf.SETTINGS.ACCESS.CORS.OptOrEmpty(config.DEFAULT.SETTINGS.ACCESS.CORS) + + defaultMethods := cors.Methods.OptOrEmpty(config.DEFAULT.SETTINGS.ACCESS.CORS.Value.Methods) + defaultHeaders := cors.Headers.OptOrEmpty(config.DEFAULT.SETTINGS.ACCESS.CORS.Value.Headers) + + if len(cors.Origins) == 0 { + next.ServeHTTP(w, req) + return + } + + origin := req.Header.Get("Origin") + originURL, err := url.Parse(origin) + + var matchingOrigin *structure.Origin + + if err == nil { + for _, o := range cors.Origins { + if urlutils.NormalizeURL(originURL) == urlutils.NormalizeURL((*url.URL)(&o.URL)) { + matchingOrigin = &o + } + } + } + + if matchingOrigin == nil { + http.Error(w, "Forbidden", http.StatusForbidden) + return + } + + w.Header().Set("Access-Control-Allow-Origin", origin) + + w.Header().Set("Access-Control-Allow-Credentials", "true") + + if req.Method == "OPTIONS" { + methods := matchingOrigin.Methods.ValueOrFallback(defaultMethods) + headers := matchingOrigin.Headers.ValueOrFallback(defaultHeaders) + + w.Header().Set("Access-Control-Allow-Methods", strings.Join(methods, ",")) + w.Header().Set("Access-Control-Allow-Headers", strings.Join(headers, ",")) + + w.WriteHeader(http.StatusNoContent) + + return + } + + next.ServeHTTP(w, req) + }) +} \ No newline at end of file From 08c64c3438980803167748f80f2972f86517c877 Mon Sep 17 00:00:00 2001 From: CodeShell <122738806+CodeShellDev@users.noreply.github.com> Date: Wed, 18 Mar 2026 17:57:02 +0100 Subject: [PATCH 02/25] add to chain --- internals/proxy/proxy.go | 9 ++++++--- 1 file changed, 6 insertions(+), 3 deletions(-) diff --git a/internals/proxy/proxy.go b/internals/proxy/proxy.go index a2eae453..fa8ca92f 100644 --- a/internals/proxy/proxy.go +++ b/internals/proxy/proxy.go @@ -7,6 +7,7 @@ import ( "github.com/codeshelldev/gotl/pkg/logger" m "github.com/codeshelldev/secured-signal-api/internals/proxy/middlewares" + rm "github.com/codeshelldev/secured-signal-api/internals/proxy/middlewares/response" ) type Proxy struct { @@ -19,8 +20,9 @@ func Create(targetUrl *url.URL) Proxy { return Proxy{Use: func() *httputil.ReverseProxy {return nil}} } - modifyResponse := m.NewResponseChain(). - Use(m.InternalResponseHeaders). + modifyResponse := rm.NewResponseChain(). + Use(rm.InternalResponseHooks). + Use(rm.InternalResponseHeaders). Then() proxy := &httputil.ReverseProxy{ @@ -43,7 +45,8 @@ func (proxy Proxy) Init() http.Handler { Use(m.InternalInsecureAPI). Use(m.Auth). Use(m.InternalMiddlewareLogger). - Use(m.InternalProxy). + Use(m.InternalProxiesHandler). + Use(m.CORS). Use(m.InternalClientIP). Use(m.RequestLogger). Use(m.InternalAuthRequirement). From 31f60c56daf9263fc502b1374f498d78d7f1bd33 Mon Sep 17 00:00:00 2001 From: CodeShell <122738806+CodeShellDev@users.noreply.github.com> Date: Wed, 18 Mar 2026 17:57:09 +0100 Subject: [PATCH 03/25] add default cors headers and methods --- data/defaults.yml | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/data/defaults.yml b/data/defaults.yml index 042b55b3..0e2226ca 100644 --- a/data/defaults.yml +++ b/data/defaults.yml @@ -59,3 +59,8 @@ settings: matchType: prefix - pattern: /v1/contacts matchType: prefix + + cors: + methods: [GET, POST, PUT, PATCH, DELETE, OPTIONS] + headers: + ["Content-Type", "Authorization", "Accept", "Accept-Language", "Origin"] From ca468b7053afb0684a5f0ca9c677477a87ebb5e1 Mon Sep 17 00:00:00 2001 From: CodeShell <122738806+CodeShellDev@users.noreply.github.com> Date: Wed, 18 Mar 2026 17:57:23 +0100 Subject: [PATCH 04/25] add urlutils for url normalization --- utils/urlutils/urlutils.go | 16 ++++++++++++++++ 1 file changed, 16 insertions(+) create mode 100644 utils/urlutils/urlutils.go diff --git a/utils/urlutils/urlutils.go b/utils/urlutils/urlutils.go new file mode 100644 index 00000000..525fc685 --- /dev/null +++ b/utils/urlutils/urlutils.go @@ -0,0 +1,16 @@ +package urlutils + +import "net/url" + +func NormalizeURL(url *url.URL) string { + host := url.Hostname() + port := url.Port() + + if (url.Scheme == "https" && port == "443") || + (url.Scheme == "http" && port == "80") || + port == "" { + return url.Scheme + "://" + host + } + + return url.Scheme + "://" + host + ":" + port +} \ No newline at end of file From 4fc9aa3f5a8deef2cde9505e7deb81b966233a11 Mon Sep 17 00:00:00 2001 From: CodeShell <122738806+CodeShellDev@users.noreply.github.com> Date: Wed, 18 Mar 2026 17:58:31 +0100 Subject: [PATCH 05/25] offtopic: Add Response Hooks for postprocessing --- internals/proxy/common/common.go | 12 +++++ internals/proxy/common/context.go | 4 +- internals/proxy/middlewares/middleware.go | 39 --------------- internals/proxy/middlewares/response/hooks.go | 26 ++++++++++ .../proxy/middlewares/response/middleware.go | 47 +++++++++++++++++++ 5 files changed, 88 insertions(+), 40 deletions(-) create mode 100644 internals/proxy/middlewares/response/hooks.go create mode 100644 internals/proxy/middlewares/response/middleware.go diff --git a/internals/proxy/common/common.go b/internals/proxy/common/common.go index 3500afff..51adc3a7 100644 --- a/internals/proxy/common/common.go +++ b/internals/proxy/common/common.go @@ -85,4 +85,16 @@ func WriteError(w http.ResponseWriter, status int, msg string) { w.WriteHeader(status) res.Write(w) +} + +func AddResponseHook(req *http.Request, hook func(res *http.Response) error) *http.Request { + hooks := GetResponseHooks(req) + + hooks = append(hooks, hook) + + return SetContext(req, ResponseHooksKey, hooks) +} + +func GetResponseHooks(req *http.Request) []func(*http.Response) error { + return GetContext[[]func(*http.Response) error](req, ResponseHooksKey) } \ No newline at end of file diff --git a/internals/proxy/common/context.go b/internals/proxy/common/context.go index 3e7811cc..45b6ac0c 100644 --- a/internals/proxy/common/context.go +++ b/internals/proxy/common/context.go @@ -11,4 +11,6 @@ const TrustedClientKey contextKey = "isClientTrusted" const TrustedProxyKey contextKey = "isProxyTrusted" const ClientIPKey contextKey = "clientIP" -const OriginURLKey contextKey = "originURL" \ No newline at end of file +const OriginURLKey contextKey = "originURL" + +const ResponseHooksKey contextKey = "responseHooks" \ No newline at end of file diff --git a/internals/proxy/middlewares/middleware.go b/internals/proxy/middlewares/middleware.go index a9c3e319..c2401c77 100644 --- a/internals/proxy/middlewares/middleware.go +++ b/internals/proxy/middlewares/middleware.go @@ -41,43 +41,4 @@ func (chain *Chain) Then(final http.Handler) http.Handler { } return handler -} - -type ResponseMiddleware struct { - Name string - Use func(res *http.Response) error -} - -type ResponseChain struct { - middlewares []ResponseMiddleware -} - -func NewResponseChain() *ResponseChain { - return &ResponseChain{} -} - -func (chain *ResponseChain) Use(middleware ResponseMiddleware) *ResponseChain { - chain.middlewares = append(chain.middlewares, middleware) - - if strings.HasPrefix(middleware.Name, "_") { - logger.Dev("Registered ", middleware.Name, " response middleware") - } else { - logger.Debug("Registered ", middleware.Name, " response middleware") - } - - return chain -} - -func (chain *ResponseChain) Then() func(*http.Response) error { - return func(resp *http.Response) error { - for _, middleware := range chain.middlewares { - err := middleware.Use(resp) - - if err != nil { - return err - } - } - - return nil - } } \ No newline at end of file diff --git a/internals/proxy/middlewares/response/hooks.go b/internals/proxy/middlewares/response/hooks.go new file mode 100644 index 00000000..36174e97 --- /dev/null +++ b/internals/proxy/middlewares/response/hooks.go @@ -0,0 +1,26 @@ +package middleware + +import ( + "net/http" + + . "github.com/codeshelldev/secured-signal-api/internals/proxy/common" +) + +var InternalResponseHooks = ResponseMiddleware{ + Name: "_Response_Hooks", + Use: hooksHandler, +} + +func hooksHandler(res *http.Response) error { + hooks := GetResponseHooks(res.Request) + + for _, h := range hooks { + err := h(res) + + if err != nil { + return err + } + } + + return nil +} \ No newline at end of file diff --git a/internals/proxy/middlewares/response/middleware.go b/internals/proxy/middlewares/response/middleware.go new file mode 100644 index 00000000..92ad2921 --- /dev/null +++ b/internals/proxy/middlewares/response/middleware.go @@ -0,0 +1,47 @@ +package middleware + +import ( + "net/http" + "strings" + + "github.com/codeshelldev/gotl/pkg/logger" +) + +type ResponseMiddleware struct { + Name string + Use func(res *http.Response) error +} + +type ResponseChain struct { + middlewares []ResponseMiddleware +} + +func NewResponseChain() *ResponseChain { + return &ResponseChain{} +} + +func (chain *ResponseChain) Use(middleware ResponseMiddleware) *ResponseChain { + chain.middlewares = append(chain.middlewares, middleware) + + if strings.HasPrefix(middleware.Name, "_") { + logger.Dev("Registered ", middleware.Name, " response middleware") + } else { + logger.Debug("Registered ", middleware.Name, " response middleware") + } + + return chain +} + +func (chain *ResponseChain) Then() func(*http.Response) error { + return func(resp *http.Response) error { + for _, middleware := range chain.middlewares { + err := middleware.Use(resp) + + if err != nil { + return err + } + } + + return nil + } +} \ No newline at end of file From 253609722fc951bb769412487405e0a8318fd274 Mon Sep 17 00:00:00 2001 From: CodeShell <122738806+CodeShellDev@users.noreply.github.com> Date: Wed, 18 Mar 2026 17:58:43 +0100 Subject: [PATCH 06/25] simplify auth map into just bool --- internals/proxy/middlewares/auth.go | 32 ++++++++++------------------- 1 file changed, 11 insertions(+), 21 deletions(-) diff --git a/internals/proxy/middlewares/auth.go b/internals/proxy/middlewares/auth.go index 94879c78..04b8bf95 100644 --- a/internals/proxy/middlewares/auth.go +++ b/internals/proxy/middlewares/auth.go @@ -263,7 +263,7 @@ func authHandler(next http.Handler) http.Handler { allowedMethods := conf.API.AUTH.METHODS.OptOrEmpty(config.DEFAULT.API.AUTH.METHODS) - if isAuthMethodAllowed(method, token, conf.API.TOKENS, allowedMethods, conf.API.AUTH.TOKENS) { + if isAuthMethodAllowed(method, token, allowedMethods, conf.API.AUTH.TOKENS) { req = SetContext(req, IsAuthKey, true) req = SetContext(req, TokenKey, token) } else { @@ -311,31 +311,21 @@ type AuthToken struct { Methods []string } -func getTokenMethodMap(rawTokens []string, defaultMethods []string, tokenMethodSet []structure.Token) map[string][]string { - tokenMethodMap := map[string][]string{} - - for _, token := range rawTokens { - tokenMethodMap[token] = defaultMethods - } - - for _, set := range tokenMethodSet { - for _, token := range set.Set { - tokenMethodMap[token] = set.Methods - } - } - - return tokenMethodMap -} - -func isAuthMethodAllowed(method AuthMethod, token string, rawTokens []string, defaultMethods []string, tokenMethodSet []structure.Token) bool { - if (len(defaultMethods) == 0 || defaultMethods == nil) && (len(tokenMethodSet) == 0 || tokenMethodSet == nil) { +func isAuthMethodAllowed(method AuthMethod, token string, defaultMethods []string, tokenOverwrites []structure.Token) bool { + if len(defaultMethods) == 0 && len(tokenOverwrites) == 0 { // default: allow all return true } - tokenMethodMap := getTokenMethodMap(rawTokens, defaultMethods, tokenMethodSet) + for _, t := range tokenOverwrites { + if slices.Contains(t.Set, token) { + return slices.ContainsFunc(t.Methods, func(try string) bool { + return strings.EqualFold(try, method.Name) + }) + } + } - return slices.ContainsFunc(tokenMethodMap[token], func(try string) bool { + return slices.ContainsFunc(defaultMethods, func(try string) bool { return strings.EqualFold(try, method.Name) }) } \ No newline at end of file From 822146475a7c3c15c06ca62b3235137f5081fac8 Mon Sep 17 00:00:00 2001 From: CodeShell <122738806+CodeShellDev@users.noreply.github.com> Date: Wed, 18 Mar 2026 17:59:20 +0100 Subject: [PATCH 07/25] rename proxy.go into proxies.go due to name collisions --- internals/proxy/middlewares/{proxy.go => proxies.go} | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) rename internals/proxy/middlewares/{proxy.go => proxies.go} (96%) diff --git a/internals/proxy/middlewares/proxy.go b/internals/proxy/middlewares/proxies.go similarity index 96% rename from internals/proxy/middlewares/proxy.go rename to internals/proxy/middlewares/proxies.go index 0d48b07a..56b6de71 100644 --- a/internals/proxy/middlewares/proxy.go +++ b/internals/proxy/middlewares/proxies.go @@ -11,9 +11,9 @@ import ( "github.com/codeshelldev/secured-signal-api/utils/netutils" ) -var InternalProxy Middleware = Middleware{ - Name: "_Proxy", - Use: proxyHandler, +var InternalProxiesHandler Middleware = Middleware{ + Name: "_Proxies_Handler", + Use: proxiesHandler, } type ForwardedEntry struct { @@ -28,7 +28,7 @@ type OriginInfo struct { Proto string } -func proxyHandler(next http.Handler) http.Handler { +func proxiesHandler(next http.Handler) http.Handler { return http.HandlerFunc(func(w http.ResponseWriter, req *http.Request) { logger := GetLogger(req) From 74363189692b6163238b956cbb39bdb1edf84fa1 Mon Sep 17 00:00:00 2001 From: CodeShell <122738806+CodeShellDev@users.noreply.github.com> Date: Wed, 18 Mar 2026 17:59:35 +0100 Subject: [PATCH 08/25] move custom headers res middleware into own folder --- .../middlewares/{responseheaders.go => response/headers.go} | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) rename internals/proxy/middlewares/{responseheaders.go => response/headers.go} (89%) diff --git a/internals/proxy/middlewares/responseheaders.go b/internals/proxy/middlewares/response/headers.go similarity index 89% rename from internals/proxy/middlewares/responseheaders.go rename to internals/proxy/middlewares/response/headers.go index 740a2618..d4bf1b84 100644 --- a/internals/proxy/middlewares/responseheaders.go +++ b/internals/proxy/middlewares/response/headers.go @@ -1,4 +1,4 @@ -package middlewares +package middleware import ( "net/http" @@ -9,10 +9,10 @@ import ( var InternalResponseHeaders = ResponseMiddleware{ Name: "_Response_Headers", - Use: responseHandler, + Use: headersHandler, } -func responseHandler(res *http.Response) error { +func headersHandler(res *http.Response) error { conf := GetConfigByReq(res.Request) resHeaders := conf.SETTINGS.HTTP.RESPONSE_HEADERS.OptOrEmpty(config.DEFAULT.SETTINGS.HTTP.RESPONSE_HEADERS) From f92ac77773b64212560bd9ba23298d42daeef416 Mon Sep 17 00:00:00 2001 From: CodeShell <122738806+CodeShellDev@users.noreply.github.com> Date: Wed, 18 Mar 2026 18:06:51 +0100 Subject: [PATCH 09/25] . --- .github/workflows/docker-image-dev.yml | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/.github/workflows/docker-image-dev.yml b/.github/workflows/docker-image-dev.yml index b1a44ae6..fed39ffc 100644 --- a/.github/workflows/docker-image-dev.yml +++ b/.github/workflows/docker-image-dev.yml @@ -21,9 +21,10 @@ on: - beta - alpha - dev + - feat env: - TYPES: "rc,beta,alpha,dev" + TYPES: "rc,beta,alpha,dev,feat" TYPE: ${{ inputs.type }} BASE_TAG: ${{ inputs.base-tag }} From e00b94e64d537e99166c569d136605b17465f0a6 Mon Sep 17 00:00:00 2001 From: CodeShell <122738806+CodeShellDev@users.noreply.github.com> Date: Thu, 19 Mar 2026 17:23:58 +0100 Subject: [PATCH 10/25] . --- .github/workflows/docker-image-dev.yml | 1 + 1 file changed, 1 insertion(+) diff --git a/.github/workflows/docker-image-dev.yml b/.github/workflows/docker-image-dev.yml index fed39ffc..d0aa4421 100644 --- a/.github/workflows/docker-image-dev.yml +++ b/.github/workflows/docker-image-dev.yml @@ -190,5 +190,6 @@ jobs: latest=false tags: | type=raw,value=${{ needs.resolve-tag.outputs.image_tag }} + cgo-enabled: true secrets: GH_PCKG_TOKEN: ${{ secrets.GH_PCKG_TOKEN }} From ff06437fc90abd8514c3acf03ad80a16c0668e52 Mon Sep 17 00:00:00 2001 From: CodeShell <122738806+CodeShellDev@users.noreply.github.com> Date: Thu, 19 Mar 2026 17:25:39 +0100 Subject: [PATCH 11/25] . --- .github/workflows/docker-image-dev.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/docker-image-dev.yml b/.github/workflows/docker-image-dev.yml index d0aa4421..7a528df8 100644 --- a/.github/workflows/docker-image-dev.yml +++ b/.github/workflows/docker-image-dev.yml @@ -190,6 +190,6 @@ jobs: latest=false tags: | type=raw,value=${{ needs.resolve-tag.outputs.image_tag }} - cgo-enabled: true + cgo-enable: true secrets: GH_PCKG_TOKEN: ${{ secrets.GH_PCKG_TOKEN }} From 17bb1b772c8a8a2b8e8b2fafa48831079feee8e6 Mon Sep 17 00:00:00 2001 From: CodeShell <122738806+CodeShellDev@users.noreply.github.com> Date: Thu, 19 Mar 2026 17:42:11 +0100 Subject: [PATCH 12/25] . --- Dockerfile | 18 +++++++++--------- go.mod | 2 +- 2 files changed, 10 insertions(+), 10 deletions(-) diff --git a/Dockerfile b/Dockerfile index d1992aab..03295450 100644 --- a/Dockerfile +++ b/Dockerfile @@ -1,3 +1,10 @@ +FROM golang:1.26-alpine AS builder + +WORKDIR /app +COPY . . + +RUN CGO_ENABLED=0 go build -ldflags="-w -s" -o app . + FROM alpine:3.22 RUN apk --no-cache add ca-certificates @@ -15,19 +22,12 @@ ENV TOKENS_DIR=/config/tokens ENV DB_PATH=/db/db.sqlite3 -ENV CGO_ENABLED=1 - ENV REDACT_TOKENS=true -ARG TARGETOS -ARG TARGETARCH - WORKDIR /app -COPY . . - -COPY dist/${TARGETOS}/${TARGETARCH}/app . +COPY --from=builder /app/app . -RUN rm dist/ -r +COPY data/ /app/data/ CMD ["./app"] diff --git a/go.mod b/go.mod index f3c944cd..2b6c5245 100644 --- a/go.mod +++ b/go.mod @@ -1,6 +1,6 @@ module github.com/codeshelldev/secured-signal-api -go 1.26.0 +go 1.26.1 require ( github.com/codeshelldev/gotl/pkg/configutils v0.0.22 From 5c44b057fdb00060c15b18008df3e907492b568a Mon Sep 17 00:00:00 2001 From: CodeShell <122738806+CodeShellDev@users.noreply.github.com> Date: Thu, 19 Mar 2026 17:44:56 +0100 Subject: [PATCH 13/25] . --- .github/workflows/docker-image-dev.yml | 3 +-- .github/workflows/docker-image.yml | 2 +- 2 files changed, 2 insertions(+), 3 deletions(-) diff --git a/.github/workflows/docker-image-dev.yml b/.github/workflows/docker-image-dev.yml index 7a528df8..cbeb1642 100644 --- a/.github/workflows/docker-image-dev.yml +++ b/.github/workflows/docker-image-dev.yml @@ -182,7 +182,7 @@ jobs: update: needs: resolve-tag - uses: codeshelldev/gh-actions/.github/workflows/docker-image-go.yml@main + uses: codeshelldev/gh-actions/.github/workflows/docker-image.yml@main name: Development Image with: registry: ghcr.io @@ -190,6 +190,5 @@ jobs: latest=false tags: | type=raw,value=${{ needs.resolve-tag.outputs.image_tag }} - cgo-enable: true secrets: GH_PCKG_TOKEN: ${{ secrets.GH_PCKG_TOKEN }} diff --git a/.github/workflows/docker-image.yml b/.github/workflows/docker-image.yml index 116e3baa..e846b071 100644 --- a/.github/workflows/docker-image.yml +++ b/.github/workflows/docker-image.yml @@ -39,7 +39,7 @@ jobs: update: needs: check if: needs.check.outputs.continue == 'true' - uses: codeshelldev/gh-actions/.github/workflows/docker-image-go.yml@main + uses: codeshelldev/gh-actions/.github/workflows/docker-image.yml@main name: Stable Image with: registry: ghcr.io From bc88a23f1d6264a13ef2a0ef21c63dd44b21290f Mon Sep 17 00:00:00 2001 From: CodeShell <122738806+CodeShellDev@users.noreply.github.com> Date: Thu, 19 Mar 2026 17:50:31 +0100 Subject: [PATCH 14/25] switch to cgo-free port of sqlite --- dev-env.sh | 2 -- go.mod | 14 ++++++++++-- go.sum | 53 ++++++++++++++++++++++++++++++++++++++++++---- internals/db/db.go | 4 ++-- 4 files changed, 63 insertions(+), 10 deletions(-) diff --git a/dev-env.sh b/dev-env.sh index 54192048..4a672d36 100644 --- a/dev-env.sh +++ b/dev-env.sh @@ -43,8 +43,6 @@ export CONFIG_PATH=$DIR/.dev/config.yml export TOKENS_DIR=$DIR/.dev/tokens export DB_PATH=$DIR/.dev/db/db.sqlite3 -export CGO_ENABLED=1 - export API_URL=http://127.0.0.1:8881 export LOG_LEVEL=dev diff --git a/go.mod b/go.mod index 2b6c5245..bee006ad 100644 --- a/go.mod +++ b/go.mod @@ -20,6 +20,17 @@ require ( github.com/go-viper/mapstructure/v2 v2.5.0 github.com/knadh/koanf/parsers/yaml v1.1.0 golang.org/x/time v0.14.0 + modernc.org/sqlite v1.47.0 +) + +require ( + github.com/dustin/go-humanize v1.0.1 // indirect + github.com/mattn/go-isatty v0.0.20 // indirect + github.com/ncruces/go-strftime v1.0.0 // indirect + github.com/remyoudompheng/bigfft v0.0.0-20230129092748-24d4a6f8daec // indirect + modernc.org/libc v1.70.0 // indirect + modernc.org/mathutil v1.7.1 // indirect + modernc.org/memory v1.11.0 // indirect ) require ( @@ -32,11 +43,10 @@ require ( github.com/knadh/koanf/providers/file v1.2.1 // indirect github.com/knadh/koanf/v2 v2.3.3 // indirect github.com/mattn/go-runewidth v0.0.20 // indirect - github.com/mattn/go-sqlite3 v1.14.34 github.com/mitchellh/copystructure v1.2.0 // indirect github.com/mitchellh/reflectwalk v1.0.2 // indirect go.uber.org/multierr v1.11.0 // indirect go.uber.org/zap v1.27.1 // indirect go.yaml.in/yaml/v3 v3.0.4 // indirect - golang.org/x/sys v0.41.0 // indirect + golang.org/x/sys v0.42.0 // indirect ) diff --git a/go.sum b/go.sum index ae1f0156..8ee69ed7 100644 --- a/go.sum +++ b/go.sum @@ -24,12 +24,18 @@ github.com/codeshelldev/gotl/pkg/templating v0.0.16 h1:0dl/NEApCtlm4kyEscQPknx4D github.com/codeshelldev/gotl/pkg/templating v0.0.16/go.mod h1:MHM4ouEsLNKXRYO+fS9qqpS1SFlL4Z6Q/0kxtS+auLk= github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c= github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= +github.com/dustin/go-humanize v1.0.1 h1:GzkhY7T5VNhEkwH0PVJgjz+fX1rhBrR7pRT3mDkpeCY= +github.com/dustin/go-humanize v1.0.1/go.mod h1:Mu1zIs6XwVuF/gI1OepvI0qD18qycQx+mFykh5fBlto= github.com/fsnotify/fsnotify v1.9.0 h1:2Ml+OJNzbYCTzsxtv8vKSFD9PbJjmhYF14k/jKC7S9k= github.com/fsnotify/fsnotify v1.9.0/go.mod h1:8jBTzvmWwFyi3Pb8djgCCO5IBqzKJ/Jwo8TRcHyHii0= github.com/go-viper/mapstructure/v2 v2.5.0 h1:vM5IJoUAy3d7zRSVtIwQgBj7BiWtMPfmPEgAXnvj1Ro= github.com/go-viper/mapstructure/v2 v2.5.0/go.mod h1:oJDH3BJKyqBA2TXFhDsKDGDTlndYOZ6rGS0BRZIxGhM= +github.com/google/pprof v0.0.0-20250317173921-a4b03ec1a45e h1:ijClszYn+mADRFY17kjQEVQ1XRhq2/JR1M3sGqeJoxs= +github.com/google/pprof v0.0.0-20250317173921-a4b03ec1a45e/go.mod h1:boTsfXsheKC2y+lKOCMpSfarhxDeIzfZG1jqGcPl3cA= github.com/google/uuid v1.6.0 h1:NIvaJDMOsjHA8n1jAhLSgzrAzy1Hgr+hNrb57e+94F0= github.com/google/uuid v1.6.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= +github.com/hashicorp/golang-lru/v2 v2.0.7 h1:a+bsQ5rvGLjzHuww6tVxozPZFVghXaHOwFs4luLUK2k= +github.com/hashicorp/golang-lru/v2 v2.0.7/go.mod h1:QeFd9opnmA6QUJc5vARoKUSoFhyfM2/ZepoAG6RGpeM= github.com/knadh/koanf/maps v0.1.2 h1:RBfmAW5CnZT+PJ1CVc1QSJKf4Xu9kxfQgYVQSu8hpbo= github.com/knadh/koanf/maps v0.1.2/go.mod h1:npD/QZY3V6ghQDdcQzl1W4ICNVTkohC8E73eI2xW4yI= github.com/knadh/koanf/parsers/yaml v1.1.0 h1:3ltfm9ljprAHt4jxgeYLlFPmUaunuCgu1yILuTXRdM4= @@ -46,16 +52,20 @@ github.com/kr/pretty v0.2.1 h1:Fmg33tUaq4/8ym9TJN1x7sLJnHVwhP33CNkpYV/7rwI= github.com/kr/pretty v0.2.1/go.mod h1:ipq/a2n7PKx3OHsz4KJII5eveXtPO4qwEXGdVfWzfnI= github.com/kr/text v0.2.0 h1:5Nx0Ya0ZqY2ygV366QzturHI13Jq95ApcVaJBhpS+AY= github.com/kr/text v0.2.0/go.mod h1:eLer722TekiGuMkidMxC/pM04lWEeraHUUmBw8l2grE= +github.com/mattn/go-isatty v0.0.20 h1:xfD0iDuEKnDkl03q4limB+vH+GxLEtL/jb4xVJSWWEY= +github.com/mattn/go-isatty v0.0.20/go.mod h1:W+V8PltTTMOvKvAeJH7IuucS94S2C6jfK/D7dTCTo3Y= github.com/mattn/go-runewidth v0.0.20 h1:WcT52H91ZUAwy8+HUkdM3THM6gXqXuLJi9O3rjcQQaQ= github.com/mattn/go-runewidth v0.0.20/go.mod h1:XBkDxAl56ILZc9knddidhrOlY5R/pDhgLpndooCuJAs= -github.com/mattn/go-sqlite3 v1.14.34 h1:3NtcvcUnFBPsuRcno8pUtupspG/GM+9nZ88zgJcp6Zk= -github.com/mattn/go-sqlite3 v1.14.34/go.mod h1:Uh1q+B4BYcTPb+yiD3kU8Ct7aC0hY9fxUwlHK0RXw+Y= github.com/mitchellh/copystructure v1.2.0 h1:vpKXTN4ewci03Vljg/q9QvCGUDttBOGBIa15WveJJGw= github.com/mitchellh/copystructure v1.2.0/go.mod h1:qLl+cE2AmVv+CoeAwDPye/v+N2HKCj9FbZEVFJRxO9s= github.com/mitchellh/reflectwalk v1.0.2 h1:G2LzWKi524PWgd3mLHV8Y5k7s6XUvT0Gef6zxSIeXaQ= github.com/mitchellh/reflectwalk v1.0.2/go.mod h1:mSTlrgnPZtwu0c4WaC2kGObEpuNDbx0jmZXqmk4esnw= +github.com/ncruces/go-strftime v1.0.0 h1:HMFp8mLCTPp341M/ZnA4qaf7ZlsbTc+miZjCLOFAw7w= +github.com/ncruces/go-strftime v1.0.0/go.mod h1:Fwc5htZGVVkseilnfgOVb9mKy6w1naJmn9CehxcKcls= github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM= github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= +github.com/remyoudompheng/bigfft v0.0.0-20230129092748-24d4a6f8daec h1:W09IVJc94icq4NjY3clb7Lk8O1qJ8BdBEF8z0ibU0rE= +github.com/remyoudompheng/bigfft v0.0.0-20230129092748-24d4a6f8daec/go.mod h1:qqbHyh8v60DhA7CoWK5oRCqLrMHRGoxYCSS9EjAz6Eo= github.com/stretchr/testify v1.8.4 h1:CcVxjf3Q8PM0mHUKJCdn+eZZtm5yQwehR5yeSVQQcUk= github.com/stretchr/testify v1.8.4/go.mod h1:sz/lmYIOXD/1dqDmKjjqLyZ2RngseejIcXlSw2iwfAo= go.uber.org/goleak v1.3.0 h1:2K3zAYmnTNqV73imy9J1T3WC+gmCePx2hEGkimedGto= @@ -66,12 +76,47 @@ go.uber.org/zap v1.27.1 h1:08RqriUEv8+ArZRYSTXy1LeBScaMpVSTBhCeaZYfMYc= go.uber.org/zap v1.27.1/go.mod h1:GB2qFLM7cTU87MWRP2mPIjqfIDnGu+VIO4V/SdhGo2E= go.yaml.in/yaml/v3 v3.0.4 h1:tfq32ie2Jv2UxXFdLJdh3jXuOzWiL1fo0bu/FbuKpbc= go.yaml.in/yaml/v3 v3.0.4/go.mod h1:DhzuOOF2ATzADvBadXxruRBLzYTpT36CKvDb3+aBEFg= -golang.org/x/sys v0.41.0 h1:Ivj+2Cp/ylzLiEU89QhWblYnOE9zerudt9Ftecq2C6k= -golang.org/x/sys v0.41.0/go.mod h1:OgkHotnGiDImocRcuBABYBEXf8A9a87e/uXjp9XT3ks= +golang.org/x/mod v0.33.0 h1:tHFzIWbBifEmbwtGz65eaWyGiGZatSrT9prnU8DbVL8= +golang.org/x/mod v0.33.0/go.mod h1:swjeQEj+6r7fODbD2cqrnje9PnziFuw4bmLbBZFrQ5w= +golang.org/x/sync v0.19.0 h1:vV+1eWNmZ5geRlYjzm2adRgW2/mcpevXNg50YZtPCE4= +golang.org/x/sync v0.19.0/go.mod h1:9KTHXmSnoGruLpwFjVSX0lNNA75CykiMECbovNTZqGI= +golang.org/x/sys v0.6.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.42.0 h1:omrd2nAlyT5ESRdCLYdm3+fMfNFE/+Rf4bDIQImRJeo= +golang.org/x/sys v0.42.0/go.mod h1:4GL1E5IUh+htKOUEOaiffhrAeqysfVGipDYzABqnCmw= golang.org/x/time v0.14.0 h1:MRx4UaLrDotUKUdCIqzPC48t1Y9hANFKIRpNx+Te8PI= golang.org/x/time v0.14.0/go.mod h1:eL/Oa2bBBK0TkX57Fyni+NgnyQQN4LitPmob2Hjnqw4= +golang.org/x/tools v0.42.0 h1:uNgphsn75Tdz5Ji2q36v/nsFSfR/9BRFvqhGBaJGd5k= +golang.org/x/tools v0.42.0/go.mod h1:Ma6lCIwGZvHK6XtgbswSoWroEkhugApmsXyrUmBhfr0= gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= gopkg.in/check.v1 v1.0.0-20190902080502-41f04d3bba15 h1:YR8cESwS4TdDjEe65xsg0ogRM/Nc3DYOhEAlW+xobZo= gopkg.in/check.v1 v1.0.0-20190902080502-41f04d3bba15/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= gopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA= gopkg.in/yaml.v3 v3.0.1/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= +modernc.org/cc/v4 v4.27.1 h1:9W30zRlYrefrDV2JE2O8VDtJ1yPGownxciz5rrbQZis= +modernc.org/cc/v4 v4.27.1/go.mod h1:uVtb5OGqUKpoLWhqwNQo/8LwvoiEBLvZXIQ/SmO6mL0= +modernc.org/ccgo/v4 v4.32.0 h1:hjG66bI/kqIPX1b2yT6fr/jt+QedtP2fqojG2VrFuVw= +modernc.org/ccgo/v4 v4.32.0/go.mod h1:6F08EBCx5uQc38kMGl+0Nm0oWczoo1c7cgpzEry7Uc0= +modernc.org/fileutil v1.4.0 h1:j6ZzNTftVS054gi281TyLjHPp6CPHr2KCxEXjEbD6SM= +modernc.org/fileutil v1.4.0/go.mod h1:EqdKFDxiByqxLk8ozOxObDSfcVOv/54xDs/DUHdvCUU= +modernc.org/gc/v2 v2.6.5 h1:nyqdV8q46KvTpZlsw66kWqwXRHdjIlJOhG6kxiV/9xI= +modernc.org/gc/v2 v2.6.5/go.mod h1:YgIahr1ypgfe7chRuJi2gD7DBQiKSLMPgBQe9oIiito= +modernc.org/gc/v3 v3.1.2 h1:ZtDCnhonXSZexk/AYsegNRV1lJGgaNZJuKjJSWKyEqo= +modernc.org/gc/v3 v3.1.2/go.mod h1:HFK/6AGESC7Ex+EZJhJ2Gni6cTaYpSMmU/cT9RmlfYY= +modernc.org/goabi0 v0.2.0 h1:HvEowk7LxcPd0eq6mVOAEMai46V+i7Jrj13t4AzuNks= +modernc.org/goabi0 v0.2.0/go.mod h1:CEFRnnJhKvWT1c1JTI3Avm+tgOWbkOu5oPA8eH8LnMI= +modernc.org/libc v1.70.0 h1:U58NawXqXbgpZ/dcdS9kMshu08aiA6b7gusEusqzNkw= +modernc.org/libc v1.70.0/go.mod h1:OVmxFGP1CI/Z4L3E0Q3Mf1PDE0BucwMkcXjjLntvHJo= +modernc.org/mathutil v1.7.1 h1:GCZVGXdaN8gTqB1Mf/usp1Y/hSqgI2vAGGP4jZMCxOU= +modernc.org/mathutil v1.7.1/go.mod h1:4p5IwJITfppl0G4sUEDtCr4DthTaT47/N3aT6MhfgJg= +modernc.org/memory v1.11.0 h1:o4QC8aMQzmcwCK3t3Ux/ZHmwFPzE6hf2Y5LbkRs+hbI= +modernc.org/memory v1.11.0/go.mod h1:/JP4VbVC+K5sU2wZi9bHoq2MAkCnrt2r98UGeSK7Mjw= +modernc.org/opt v0.1.4 h1:2kNGMRiUjrp4LcaPuLY2PzUfqM/w9N23quVwhKt5Qm8= +modernc.org/opt v0.1.4/go.mod h1:03fq9lsNfvkYSfxrfUhZCWPk1lm4cq4N+Bh//bEtgns= +modernc.org/sortutil v1.2.1 h1:+xyoGf15mM3NMlPDnFqrteY07klSFxLElE2PVuWIJ7w= +modernc.org/sortutil v1.2.1/go.mod h1:7ZI3a3REbai7gzCLcotuw9AC4VZVpYMjDzETGsSMqJE= +modernc.org/sqlite v1.47.0 h1:R1XyaNpoW4Et9yly+I2EeX7pBza/w+pmYee/0HJDyKk= +modernc.org/sqlite v1.47.0/go.mod h1:hWjRO6Tj/5Ik8ieqxQybiEOUXy0NJFNp2tpvVpKlvig= +modernc.org/strutil v1.2.1 h1:UneZBkQA+DX2Rp35KcM69cSsNES9ly8mQWD71HKlOA0= +modernc.org/strutil v1.2.1/go.mod h1:EHkiggD70koQxjVdSBM3JKM7k6L0FbGE5eymy9i3B9A= +modernc.org/token v1.1.0 h1:Xl7Ap9dKaEs5kLoOQeQmPWevfnk/DM5qcLcYlA8ys6Y= +modernc.org/token v1.1.0/go.mod h1:UGzOrNV1mAFSEB63lOFHIpNRUVMvYTc6yu1SMY/XTDM= diff --git a/internals/db/db.go b/internals/db/db.go index 783ed359..c102d1cd 100644 --- a/internals/db/db.go +++ b/internals/db/db.go @@ -9,7 +9,7 @@ import ( "github.com/codeshelldev/gotl/pkg/logger" "github.com/codeshelldev/secured-signal-api/internals/config" - _ "github.com/mattn/go-sqlite3" + _ "modernc.org/sqlite" ) var db *sql.DB @@ -20,7 +20,7 @@ var schema string func Init() { var err error - db, err = sql.Open("sqlite3", config.ENV.DB_PATH) + db, err = sql.Open("sqlite", config.ENV.DB_PATH) if err != nil { logger.Fatal("Error opening database: ", err.Error()) From 421434a812a65984417d9aa244e48dcbb63845c0 Mon Sep 17 00:00:00 2001 From: CodeShell <122738806+CodeShellDev@users.noreply.github.com> Date: Thu, 19 Mar 2026 17:56:49 +0100 Subject: [PATCH 15/25] . --- Dockerfile | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/Dockerfile b/Dockerfile index 03295450..59f0c967 100644 --- a/Dockerfile +++ b/Dockerfile @@ -1,11 +1,16 @@ FROM golang:1.26-alpine AS builder WORKDIR /app + +COPY go.mod go.sum ./ +RUN go mod download + COPY . . -RUN CGO_ENABLED=0 go build -ldflags="-w -s" -o app . +RUN go build -ldflags="-w -s" -o app . FROM alpine:3.22 + RUN apk --no-cache add ca-certificates ARG IMAGE_TAG From 90fa0a008354dc419524c8944314b80b27138192 Mon Sep 17 00:00:00 2001 From: CodeShell <122738806+CodeShellDev@users.noreply.github.com> Date: Thu, 19 Mar 2026 18:02:06 +0100 Subject: [PATCH 16/25] . --- .github/workflows/docker-image-dev.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/docker-image-dev.yml b/.github/workflows/docker-image-dev.yml index cbeb1642..c7a3cedb 100644 --- a/.github/workflows/docker-image-dev.yml +++ b/.github/workflows/docker-image-dev.yml @@ -114,7 +114,7 @@ jobs: echo "COUNT=$COUNT" >> "$GITHUB_ENV" - name: Login to Registry - uses: docker/login-action@v3 + uses: docker/login-action@v4 with: registry: ghcr.io username: ${{ github.repository_owner }} From a2a11a9f70afe136d0d3be076b7000fd3b3b1ac7 Mon Sep 17 00:00:00 2001 From: CodeShell <122738806+CodeShellDev@users.noreply.github.com> Date: Thu, 19 Mar 2026 18:04:49 +0100 Subject: [PATCH 17/25] . --- Dockerfile | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/Dockerfile b/Dockerfile index 59f0c967..ed087a9f 100644 --- a/Dockerfile +++ b/Dockerfile @@ -1,10 +1,12 @@ FROM golang:1.26-alpine AS builder -WORKDIR /app +RUN ls -ls COPY go.mod go.sum ./ RUN go mod download +WORKDIR /app + COPY . . RUN go build -ldflags="-w -s" -o app . From 5e3bb962829c59c95af85b054484783e43b0f82c Mon Sep 17 00:00:00 2001 From: CodeShell <122738806+CodeShellDev@users.noreply.github.com> Date: Thu, 19 Mar 2026 18:09:33 +0100 Subject: [PATCH 18/25] . --- .dockerignore | 2 -- Dockerfile | 4 +--- 2 files changed, 1 insertion(+), 5 deletions(-) diff --git a/.dockerignore b/.dockerignore index d65b70ba..b97a6ae6 100644 --- a/.dockerignore +++ b/.dockerignore @@ -24,8 +24,6 @@ # Ignore source files *.go -go.mod -go.sum # Include build !app diff --git a/Dockerfile b/Dockerfile index ed087a9f..59f0c967 100644 --- a/Dockerfile +++ b/Dockerfile @@ -1,12 +1,10 @@ FROM golang:1.26-alpine AS builder -RUN ls -ls +WORKDIR /app COPY go.mod go.sum ./ RUN go mod download -WORKDIR /app - COPY . . RUN go build -ldflags="-w -s" -o app . From 9501bf1ad91a67cd9379a70edb4762327e6433d1 Mon Sep 17 00:00:00 2001 From: CodeShell <122738806+CodeShellDev@users.noreply.github.com> Date: Thu, 19 Mar 2026 18:37:09 +0100 Subject: [PATCH 19/25] . --- .dockerignore | 32 +++++++++++++++++--------------- .gitignore | 27 ++------------------------- 2 files changed, 19 insertions(+), 40 deletions(-) diff --git a/.dockerignore b/.dockerignore index b97a6ae6..5026bb1d 100644 --- a/.dockerignore +++ b/.dockerignore @@ -1,30 +1,32 @@ -# Ignore all -* +# Env files +**/*.env -# env file -*.env +# Editor/IDE +# .idea/ +.vscode/ # Git folders .git* -.github +!.github + +# Docusaurus +.docusaurus +node_modules # Dev folders .dev *.local.* -# Ignore yml files -*.yaml -*.yml +# Editor config +.editorconfig # Markdown files -*.md +**/*.md + +!LICENSE # Include data/ !data/* -# Ignore source files -*.go - -# Include build -!app -!dist/* \ No newline at end of file +# Include source files +!*.go \ No newline at end of file diff --git a/.gitignore b/.gitignore index 37dd0660..4fd453c0 100644 --- a/.gitignore +++ b/.gitignore @@ -1,28 +1,5 @@ -# Binaries for programs and plugins -*.exe -*.exe~ -*.dll -*.so -*.dylib - -# Test binary, built with `go test -c` -*.test - -# Code coverage profiles and other test artifacts -*.out -coverage.* -*.coverprofile -profile.cov - -# Dependency directories (remove the comment below to include it) -# vendor/ - -# Go workspace file -go.work -go.work.sum - -# env file -*.env +# Env files +**/*.env # Editor/IDE # .idea/ From 611e75e3d1855c45ec58c68c49d66e09e4f67879 Mon Sep 17 00:00:00 2001 From: CodeShell <122738806+CodeShellDev@users.noreply.github.com> Date: Thu, 19 Mar 2026 18:40:00 +0100 Subject: [PATCH 20/25] . --- .dockerignore | 1 + 1 file changed, 1 insertion(+) diff --git a/.dockerignore b/.dockerignore index 5026bb1d..92127676 100644 --- a/.dockerignore +++ b/.dockerignore @@ -15,6 +15,7 @@ node_modules # Dev folders .dev +dev-env.sh *.local.* # Editor config From b6696da231e783a46c35665c48d673f837428ffa Mon Sep 17 00:00:00 2001 From: CodeShell <122738806+CodeShellDev@users.noreply.github.com> Date: Thu, 19 Mar 2026 18:48:41 +0100 Subject: [PATCH 21/25] . --- Dockerfile | 10 +++++++--- 1 file changed, 7 insertions(+), 3 deletions(-) diff --git a/Dockerfile b/Dockerfile index 59f0c967..3ecf12b0 100644 --- a/Dockerfile +++ b/Dockerfile @@ -1,4 +1,7 @@ -FROM golang:1.26-alpine AS builder +FROM --platform=${BUILDPLATFORM:-linux/amd64} golang:1.26-alpine AS builder + +ARG TARGETOS +ARG TARGETARCH WORKDIR /app @@ -7,8 +10,9 @@ RUN go mod download COPY . . -RUN go build -ldflags="-w -s" -o app . - +RUN GOOS=${TARGETOS} GOARCH=${TARGETARCH} \ + go build -ldflags="-s -w" -o /app . + FROM alpine:3.22 RUN apk --no-cache add ca-certificates From 11021d09a0cb4faf9c149f62e54ddef1c9388ea0 Mon Sep 17 00:00:00 2001 From: CodeShell <122738806+CodeShellDev@users.noreply.github.com> Date: Thu, 19 Mar 2026 18:52:01 +0100 Subject: [PATCH 22/25] . --- Dockerfile | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/Dockerfile b/Dockerfile index 3ecf12b0..4c7ce758 100644 --- a/Dockerfile +++ b/Dockerfile @@ -11,8 +11,8 @@ RUN go mod download COPY . . RUN GOOS=${TARGETOS} GOARCH=${TARGETARCH} \ - go build -ldflags="-s -w" -o /app . - + go build -ldflags="-s -w" -o /app/app . + FROM alpine:3.22 RUN apk --no-cache add ca-certificates From 7cb07db725b67aed9a33d2ddb4048c948ea2e597 Mon Sep 17 00:00:00 2001 From: CodeShell <122738806+CodeShellDev@users.noreply.github.com> Date: Thu, 19 Mar 2026 18:59:06 +0100 Subject: [PATCH 23/25] mkdir dirs --- Dockerfile | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/Dockerfile b/Dockerfile index 4c7ce758..77768076 100644 --- a/Dockerfile +++ b/Dockerfile @@ -21,8 +21,6 @@ ARG IMAGE_TAG ENV IMAGE_TAG=$IMAGE_TAG LABEL org.opencontainers.image.version=$IMAGE_TAG -ENV SERVICE__PORT=8880 - ENV DEFAULTS_PATH=/app/data/defaults.yml ENV FAVICON_PATH=/app/data/favicon.ico @@ -35,6 +33,10 @@ ENV REDACT_TOKENS=true WORKDIR /app +RUN mkdir -p $(dirname ${CONFIG_PATH}) \ + $(dirname ${TOKENS_DIR}) \ + $(dirname ${DB_PATH}) + COPY --from=builder /app/app . COPY data/ /app/data/ From fc4cbe1fdc730a94f410487832934699fa9bd3c4 Mon Sep 17 00:00:00 2001 From: CodeShell <122738806+CodeShellDev@users.noreply.github.com> Date: Thu, 19 Mar 2026 19:05:54 +0100 Subject: [PATCH 24/25] . --- Dockerfile | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/Dockerfile b/Dockerfile index 77768076..199586e6 100644 --- a/Dockerfile +++ b/Dockerfile @@ -34,8 +34,8 @@ ENV REDACT_TOKENS=true WORKDIR /app RUN mkdir -p $(dirname ${CONFIG_PATH}) \ - $(dirname ${TOKENS_DIR}) \ - $(dirname ${DB_PATH}) + $(dirname ${TOKENS_DIR}) \ + $(dirname ${DB_PATH}) COPY --from=builder /app/app . From c17b6f6fb78318093ef6f39e5263a20c7d52ec3c Mon Sep 17 00:00:00 2001 From: CodeShell <122738806+CodeShellDev@users.noreply.github.com> Date: Thu, 19 Mar 2026 19:11:23 +0100 Subject: [PATCH 25/25] create folder dynamically --- Dockerfile | 4 ---- internals/db/db.go | 4 ++++ 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/Dockerfile b/Dockerfile index 199586e6..6a695d42 100644 --- a/Dockerfile +++ b/Dockerfile @@ -33,10 +33,6 @@ ENV REDACT_TOKENS=true WORKDIR /app -RUN mkdir -p $(dirname ${CONFIG_PATH}) \ - $(dirname ${TOKENS_DIR}) \ - $(dirname ${DB_PATH}) - COPY --from=builder /app/app . COPY data/ /app/data/ diff --git a/internals/db/db.go b/internals/db/db.go index c102d1cd..86e57306 100644 --- a/internals/db/db.go +++ b/internals/db/db.go @@ -4,6 +4,8 @@ import ( "bytes" "database/sql" "encoding/gob" + "os" + "path/filepath" _ "embed" @@ -20,6 +22,8 @@ var schema string func Init() { var err error + os.MkdirAll(filepath.Dir(config.ENV.DB_PATH), 0755) + db, err = sql.Open("sqlite", config.ENV.DB_PATH) if err != nil {