percher 0.5.23 → 1.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (107) hide show
  1. package/LICENSE +132 -0
  2. package/THIRD-PARTY-NOTICES.txt +1228 -0
  3. package/dist/bin/percher.js +55525 -63649
  4. package/dist/package.json +10 -8
  5. package/dist/src/cli-utils.d.ts.map +1 -1
  6. package/dist/src/cli-utils.js.map +1 -1
  7. package/dist/src/commands/account.js +5 -5
  8. package/dist/src/commands/account.js.map +1 -1
  9. package/dist/src/commands/admin.d.ts.map +1 -1
  10. package/dist/src/commands/admin.js +180 -15
  11. package/dist/src/commands/admin.js.map +1 -1
  12. package/dist/src/commands/analytics.js +1 -1
  13. package/dist/src/commands/apps.js +2 -2
  14. package/dist/src/commands/apps.js.map +1 -1
  15. package/dist/src/commands/auth.js +1 -1
  16. package/dist/src/commands/data.js +1 -1
  17. package/dist/src/commands/deploys.d.ts.map +1 -1
  18. package/dist/src/commands/deploys.js +24 -2
  19. package/dist/src/commands/deploys.js.map +1 -1
  20. package/dist/src/commands/env.js +3 -3
  21. package/dist/src/commands/export.js +1 -1
  22. package/dist/src/commands/github.js +1 -1
  23. package/dist/src/commands/hooks.js +1 -1
  24. package/dist/src/commands/migrate.js +1 -1
  25. package/dist/src/commands/sharing.js +1 -1
  26. package/dist/src/commands/status.js +1 -1
  27. package/dist/src/commands/token.js +1 -1
  28. package/dist/src/commands/transfers.js +1 -1
  29. package/dist/src/context.d.ts.map +1 -1
  30. package/dist/src/context.js +4 -3
  31. package/dist/src/context.js.map +1 -1
  32. package/dist/src/env-set-input.d.ts.map +1 -1
  33. package/dist/src/index.js +21 -21
  34. package/dist/src/version-check.d.ts +2 -0
  35. package/dist/src/version-check.d.ts.map +1 -1
  36. package/dist/src/version-check.js +23 -2
  37. package/dist/src/version-check.js.map +1 -1
  38. package/dist/templates/LICENSE +14 -0
  39. package/dist/templates/astro/Dockerfile +51 -35
  40. package/dist/templates/astro/PERCHER-TEMPLATE-LICENSE.txt +14 -0
  41. package/dist/templates/bun/PERCHER-TEMPLATE-LICENSE.txt +14 -0
  42. package/dist/templates/capsule/Dockerfile +30 -12
  43. package/dist/templates/capsule/PERCHER-TEMPLATE-LICENSE.txt +14 -0
  44. package/dist/templates/django/PERCHER-TEMPLATE-LICENSE.txt +14 -0
  45. package/dist/templates/django/percher.toml +1 -0
  46. package/dist/templates/dotnet/PERCHER-TEMPLATE-LICENSE.txt +14 -0
  47. package/dist/templates/eleventy/Dockerfile +51 -35
  48. package/dist/templates/eleventy/PERCHER-TEMPLATE-LICENSE.txt +14 -0
  49. package/dist/templates/elysia/PERCHER-TEMPLATE-LICENSE.txt +14 -0
  50. package/dist/templates/express/PERCHER-TEMPLATE-LICENSE.txt +14 -0
  51. package/dist/templates/express/package.json +2 -1
  52. package/dist/templates/fastify/PERCHER-TEMPLATE-LICENSE.txt +14 -0
  53. package/dist/templates/fastify/package.json +2 -1
  54. package/dist/templates/flask/PERCHER-TEMPLATE-LICENSE.txt +14 -0
  55. package/dist/templates/flask/percher.toml +1 -0
  56. package/dist/templates/flask/requirements.txt +1 -0
  57. package/dist/templates/go/PERCHER-TEMPLATE-LICENSE.txt +14 -0
  58. package/dist/templates/hono/PERCHER-TEMPLATE-LICENSE.txt +14 -0
  59. package/dist/templates/hono/index.ts +4 -2
  60. package/dist/templates/hono/package.json +3 -1
  61. package/dist/templates/htmx/PERCHER-TEMPLATE-LICENSE.txt +14 -0
  62. package/dist/templates/htmx/package.json +1 -1
  63. package/dist/templates/hugo/Dockerfile +49 -33
  64. package/dist/templates/hugo/PERCHER-TEMPLATE-LICENSE.txt +14 -0
  65. package/dist/templates/java/PERCHER-TEMPLATE-LICENSE.txt +14 -0
  66. package/dist/templates/laravel/PERCHER-TEMPLATE-LICENSE.txt +14 -0
  67. package/dist/templates/nextjs/PERCHER-TEMPLATE-LICENSE.txt +14 -0
  68. package/dist/templates/node/PERCHER-TEMPLATE-LICENSE.txt +14 -0
  69. package/dist/templates/nuxt/PERCHER-TEMPLATE-LICENSE.txt +14 -0
  70. package/dist/templates/phoenix/PERCHER-TEMPLATE-LICENSE.txt +14 -0
  71. package/dist/templates/preact/Dockerfile +51 -35
  72. package/dist/templates/preact/PERCHER-TEMPLATE-LICENSE.txt +14 -0
  73. package/dist/templates/python/PERCHER-TEMPLATE-LICENSE.txt +14 -0
  74. package/dist/templates/rails/PERCHER-TEMPLATE-LICENSE.txt +14 -0
  75. package/dist/templates/remix/PERCHER-TEMPLATE-LICENSE.txt +14 -0
  76. package/dist/templates/remix/app/routes/health.tsx +3 -1
  77. package/dist/templates/rust/PERCHER-TEMPLATE-LICENSE.txt +14 -0
  78. package/dist/templates/solid/Dockerfile +51 -35
  79. package/dist/templates/solid/PERCHER-TEMPLATE-LICENSE.txt +14 -0
  80. package/dist/templates/static/PERCHER-TEMPLATE-LICENSE.txt +14 -0
  81. package/dist/templates/sveltekit/PERCHER-TEMPLATE-LICENSE.txt +14 -0
  82. package/dist/templates/sveltekit/package.json +1 -1
  83. package/dist/templates/vite-react/Dockerfile +51 -35
  84. package/dist/templates/vite-react/PERCHER-TEMPLATE-LICENSE.txt +14 -0
  85. package/dist/templates/vite-vue/Dockerfile +51 -35
  86. package/dist/templates/vite-vue/PERCHER-TEMPLATE-LICENSE.txt +14 -0
  87. package/package.json +10 -8
  88. package/dist/context.d.ts +0 -3
  89. package/dist/context.d.ts.map +0 -1
  90. package/dist/context.js +0 -31
  91. package/dist/context.js.map +0 -1
  92. package/dist/index.d.ts +0 -3
  93. package/dist/index.d.ts.map +0 -1
  94. package/dist/index.js +0 -385
  95. package/dist/index.js.map +0 -1
  96. package/dist/open.d.ts +0 -2
  97. package/dist/open.d.ts.map +0 -1
  98. package/dist/open.js +0 -16
  99. package/dist/open.js.map +0 -1
  100. package/dist/output.d.ts +0 -2
  101. package/dist/output.d.ts.map +0 -1
  102. package/dist/output.js +0 -44
  103. package/dist/output.js.map +0 -1
  104. package/dist/prompt.d.ts +0 -4
  105. package/dist/prompt.d.ts.map +0 -1
  106. package/dist/prompt.js +0 -14
  107. package/dist/prompt.js.map +0 -1
@@ -0,0 +1,14 @@
1
+ BSD Zero Clause License (0BSD)
2
+
3
+ Copyright (c) 2026 Mattias Malmborg
4
+
5
+ Permission to use, copy, modify, and/or distribute this software for any
6
+ purpose with or without fee is hereby granted.
7
+
8
+ THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH
9
+ REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY
10
+ AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT,
11
+ INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM
12
+ LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR
13
+ OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
14
+ PERFORMANCE OF THIS SOFTWARE.
@@ -0,0 +1,14 @@
1
+ BSD Zero Clause License (0BSD)
2
+
3
+ Copyright (c) 2026 Mattias Malmborg
4
+
5
+ Permission to use, copy, modify, and/or distribute this software for any
6
+ purpose with or without fee is hereby granted.
7
+
8
+ THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH
9
+ REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY
10
+ AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT,
11
+ INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM
12
+ LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR
13
+ OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
14
+ PERFORMANCE OF THIS SOFTWARE.
@@ -0,0 +1,14 @@
1
+ BSD Zero Clause License (0BSD)
2
+
3
+ Copyright (c) 2026 Mattias Malmborg
4
+
5
+ Permission to use, copy, modify, and/or distribute this software for any
6
+ purpose with or without fee is hereby granted.
7
+
8
+ THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH
9
+ REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY
10
+ AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT,
11
+ INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM
12
+ LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR
13
+ OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
14
+ PERFORMANCE OF THIS SOFTWARE.
@@ -0,0 +1,14 @@
1
+ BSD Zero Clause License (0BSD)
2
+
3
+ Copyright (c) 2026 Mattias Malmborg
4
+
5
+ Permission to use, copy, modify, and/or distribute this software for any
6
+ purpose with or without fee is hereby granted.
7
+
8
+ THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH
9
+ REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY
10
+ AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT,
11
+ INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM
12
+ LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR
13
+ OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
14
+ PERFORMANCE OF THIS SOFTWARE.
@@ -0,0 +1,14 @@
1
+ BSD Zero Clause License (0BSD)
2
+
3
+ Copyright (c) 2026 Mattias Malmborg
4
+
5
+ Permission to use, copy, modify, and/or distribute this software for any
6
+ purpose with or without fee is hereby granted.
7
+
8
+ THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH
9
+ REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY
10
+ AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT,
11
+ INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM
12
+ LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR
13
+ OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
14
+ PERFORMANCE OF THIS SOFTWARE.
@@ -0,0 +1,14 @@
1
+ BSD Zero Clause License (0BSD)
2
+
3
+ Copyright (c) 2026 Mattias Malmborg
4
+
5
+ Permission to use, copy, modify, and/or distribute this software for any
6
+ purpose with or without fee is hereby granted.
7
+
8
+ THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH
9
+ REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY
10
+ AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT,
11
+ INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM
12
+ LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR
13
+ OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
14
+ PERFORMANCE OF THIS SOFTWARE.
@@ -0,0 +1,14 @@
1
+ BSD Zero Clause License (0BSD)
2
+
3
+ Copyright (c) 2026 Mattias Malmborg
4
+
5
+ Permission to use, copy, modify, and/or distribute this software for any
6
+ purpose with or without fee is hereby granted.
7
+
8
+ THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH
9
+ REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY
10
+ AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT,
11
+ INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM
12
+ LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR
13
+ OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
14
+ PERFORMANCE OF THIS SOFTWARE.
@@ -1,35 +1,51 @@
1
- # Multi-stage build: a Bun stage compiles the static bundle, then a
2
- # minimal Caddy image serves it. This project uses runtime = "docker"
3
- # (not "static") because Percher's static runtime serves pre-built
4
- # files only — it does not run a build command. Generated by Percher;
5
- # safe to edit and own.
6
-
7
- # --- Build stage: install deps and build the static bundle -----------
8
- FROM oven/bun:1-alpine AS build
9
- WORKDIR /app
10
- COPY . .
11
- RUN bun install && bun run build
12
-
13
- # --- Serve stage: minimal Caddy image --------------------------------
14
- # caddy:2-alpine ships /usr/bin/caddy with cap_net_bind_service file
15
- # caps. Percher runs every container with --security-opt
16
- # no-new-privileges, which makes execve refuse a cap-bearing binary
17
- # (an "operation not permitted" crash-loop). Copy Caddy onto a plain
18
- # alpine base and strip the caps with setcap -r — Caddy never needs
19
- # the cap here, it listens on :8080 (>= 1024).
20
- FROM caddy:2-alpine AS caddy-source
21
- FROM alpine:3.21
22
- COPY --from=caddy-source /usr/bin/caddy /usr/bin/caddy
23
- RUN apk add --no-cache libcap \
24
- && (setcap -r /usr/bin/caddy 2>/dev/null || true) \
25
- && test -z "$(getcap /usr/bin/caddy)" \
26
- && apk del libcap \
27
- && rm -rf /var/cache/apk/*
28
- COPY Caddyfile /etc/caddy/Caddyfile
29
- COPY --from=build /app/dist /srv
30
- # HOME points at the writable tmpfs so non-root Caddy can persist its
31
- # XDG state (storage-clean lock, config autosave) under Percher's
32
- # read-only root filesystem.
33
- ENV HOME=/tmp
34
- EXPOSE 8080
35
- CMD ["caddy", "run", "--config", "/etc/caddy/Caddyfile", "--adapter", "caddyfile"]
1
+ # Multi-stage build: a Bun stage compiles the static bundle, then a
2
+ # minimal Caddy image serves it. This project uses runtime = "docker"
3
+ # (not "static") because Percher's static runtime serves pre-built
4
+ # files only — it does not run a build command. Generated by Percher;
5
+ # safe to edit and own.
6
+
7
+ # --- Build stage: install deps and build the static bundle -----------
8
+ FROM oven/bun:1-alpine AS build
9
+ WORKDIR /app
10
+ COPY . .
11
+ RUN bun install && bun run build
12
+
13
+ # --- Serve stage: minimal Caddy image --------------------------------
14
+ # Build pinned Caddy source with refreshed security modules. The scratch
15
+ # runtime carries no shell, package manager, or file capabilities and listens
16
+ # on the unprivileged port :8080.
17
+ FROM golang:1.26.7-alpine3.23@sha256:b17af760035fc2f338eed92d448a6c67f2d45438844fc6c60678fa5f99e44b57 AS caddy-source
18
+ ADD --checksum=sha256:78e660d838e45c0b8c89338b325946238f153641aa9925df9ef2ad5e8eced31b \
19
+ https://github.com/caddyserver/caddy/commit/b2693fb63a30e6d7be0972c3645e9a2c0a500e93.patch /tmp/caddy-cel-go.patch
20
+ RUN go mod download github.com/caddyserver/caddy/v2@v2.11.4 \
21
+ && cp -R /go/pkg/mod/github.com/caddyserver/caddy/v2@v2.11.4 /src \
22
+ && chmod -R u+w /src
23
+ WORKDIR /src
24
+ RUN apk add --no-cache patch \
25
+ && patch -p1 < /tmp/caddy-cel-go.patch \
26
+ && go get github.com/go-chi/chi/v5@v5.3.0 github.com/google/cel-go@v0.29.2 \
27
+ github.com/klauspost/compress@v1.18.7 go.opentelemetry.io/otel@v1.44.0 \
28
+ golang.org/x/crypto@v0.55.0 golang.org/x/net@v0.58.0 \
29
+ golang.org/x/text@v0.41.0 google.golang.org/grpc@v1.83.2 \
30
+ && go mod tidy \
31
+ && CGO_ENABLED=0 go build -trimpath -ldflags "-s -w" -o /out/caddy ./cmd/caddy \
32
+ && printf '%s\n' \
33
+ 'package main' \
34
+ 'import ("net/http"; "os"; "time")' \
35
+ 'func main(){ if len(os.Args)!=2 { os.Exit(2) }; c:=http.Client{Timeout:2500*time.Millisecond,Transport:&http.Transport{Proxy:nil},CheckRedirect:func(_ *http.Request,_ []*http.Request) error{return http.ErrUseLastResponse}}; r,e:=c.Get(os.Args[1]); if e!=nil { os.Exit(1) }; defer r.Body.Close(); if r.StatusCode!=http.StatusOK { os.Exit(1) } }' \
36
+ > /tmp/percher-healthcheck.go \
37
+ && CGO_ENABLED=0 go build -trimpath -ldflags "-s -w" -o /out/percher-healthcheck /tmp/percher-healthcheck.go
38
+ FROM scratch
39
+ COPY --from=caddy-source /etc/ssl/certs/ca-certificates.crt /etc/ssl/certs/ca-certificates.crt
40
+ COPY --from=caddy-source /out/caddy /usr/bin/caddy
41
+ COPY --from=caddy-source /out/percher-healthcheck /usr/bin/percher-healthcheck
42
+ COPY Caddyfile /etc/caddy/Caddyfile
43
+ COPY --from=build /app/dist /srv
44
+ LABEL dev.percher.health-client="static-http-v1"
45
+ # HOME points at the writable tmpfs so non-root Caddy can persist its
46
+ # XDG state (storage-clean lock, config autosave) under Percher's
47
+ # read-only root filesystem.
48
+ ENV HOME=/tmp
49
+ USER 10001:10001
50
+ EXPOSE 8080
51
+ CMD ["caddy", "run", "--config", "/etc/caddy/Caddyfile", "--adapter", "caddyfile"]
@@ -0,0 +1,14 @@
1
+ BSD Zero Clause License (0BSD)
2
+
3
+ Copyright (c) 2026 Mattias Malmborg
4
+
5
+ Permission to use, copy, modify, and/or distribute this software for any
6
+ purpose with or without fee is hereby granted.
7
+
8
+ THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH
9
+ REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY
10
+ AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT,
11
+ INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM
12
+ LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR
13
+ OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
14
+ PERFORMANCE OF THIS SOFTWARE.
@@ -0,0 +1,14 @@
1
+ BSD Zero Clause License (0BSD)
2
+
3
+ Copyright (c) 2026 Mattias Malmborg
4
+
5
+ Permission to use, copy, modify, and/or distribute this software for any
6
+ purpose with or without fee is hereby granted.
7
+
8
+ THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH
9
+ REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY
10
+ AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT,
11
+ INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM
12
+ LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR
13
+ OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
14
+ PERFORMANCE OF THIS SOFTWARE.
@@ -0,0 +1,14 @@
1
+ BSD Zero Clause License (0BSD)
2
+
3
+ Copyright (c) 2026 Mattias Malmborg
4
+
5
+ Permission to use, copy, modify, and/or distribute this software for any
6
+ purpose with or without fee is hereby granted.
7
+
8
+ THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH
9
+ REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY
10
+ AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT,
11
+ INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM
12
+ LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR
13
+ OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
14
+ PERFORMANCE OF THIS SOFTWARE.
@@ -0,0 +1,14 @@
1
+ BSD Zero Clause License (0BSD)
2
+
3
+ Copyright (c) 2026 Mattias Malmborg
4
+
5
+ Permission to use, copy, modify, and/or distribute this software for any
6
+ purpose with or without fee is hereby granted.
7
+
8
+ THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH
9
+ REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY
10
+ AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT,
11
+ INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM
12
+ LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR
13
+ OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
14
+ PERFORMANCE OF THIS SOFTWARE.
@@ -1,3 +1,5 @@
1
+ import { json } from "@remix-run/node";
2
+
1
3
  export function loader() {
2
- return Response.json({ status: "ok" });
4
+ return json({ status: "ok" });
3
5
  }
@@ -0,0 +1,14 @@
1
+ BSD Zero Clause License (0BSD)
2
+
3
+ Copyright (c) 2026 Mattias Malmborg
4
+
5
+ Permission to use, copy, modify, and/or distribute this software for any
6
+ purpose with or without fee is hereby granted.
7
+
8
+ THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH
9
+ REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY
10
+ AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT,
11
+ INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM
12
+ LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR
13
+ OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
14
+ PERFORMANCE OF THIS SOFTWARE.
@@ -1,35 +1,51 @@
1
- # Multi-stage build: a Bun stage compiles the static bundle, then a
2
- # minimal Caddy image serves it. This project uses runtime = "docker"
3
- # (not "static") because Percher's static runtime serves pre-built
4
- # files only — it does not run a build command. Generated by Percher;
5
- # safe to edit and own.
6
-
7
- # --- Build stage: install deps and build the static bundle -----------
8
- FROM oven/bun:1-alpine AS build
9
- WORKDIR /app
10
- COPY . .
11
- RUN bun install && bun run build
12
-
13
- # --- Serve stage: minimal Caddy image --------------------------------
14
- # caddy:2-alpine ships /usr/bin/caddy with cap_net_bind_service file
15
- # caps. Percher runs every container with --security-opt
16
- # no-new-privileges, which makes execve refuse a cap-bearing binary
17
- # (an "operation not permitted" crash-loop). Copy Caddy onto a plain
18
- # alpine base and strip the caps with setcap -r — Caddy never needs
19
- # the cap here, it listens on :8080 (>= 1024).
20
- FROM caddy:2-alpine AS caddy-source
21
- FROM alpine:3.21
22
- COPY --from=caddy-source /usr/bin/caddy /usr/bin/caddy
23
- RUN apk add --no-cache libcap \
24
- && (setcap -r /usr/bin/caddy 2>/dev/null || true) \
25
- && test -z "$(getcap /usr/bin/caddy)" \
26
- && apk del libcap \
27
- && rm -rf /var/cache/apk/*
28
- COPY Caddyfile /etc/caddy/Caddyfile
29
- COPY --from=build /app/dist /srv
30
- # HOME points at the writable tmpfs so non-root Caddy can persist its
31
- # XDG state (storage-clean lock, config autosave) under Percher's
32
- # read-only root filesystem.
33
- ENV HOME=/tmp
34
- EXPOSE 8080
35
- CMD ["caddy", "run", "--config", "/etc/caddy/Caddyfile", "--adapter", "caddyfile"]
1
+ # Multi-stage build: a Bun stage compiles the static bundle, then a
2
+ # minimal Caddy image serves it. This project uses runtime = "docker"
3
+ # (not "static") because Percher's static runtime serves pre-built
4
+ # files only — it does not run a build command. Generated by Percher;
5
+ # safe to edit and own.
6
+
7
+ # --- Build stage: install deps and build the static bundle -----------
8
+ FROM oven/bun:1-alpine AS build
9
+ WORKDIR /app
10
+ COPY . .
11
+ RUN bun install && bun run build
12
+
13
+ # --- Serve stage: minimal Caddy image --------------------------------
14
+ # Build pinned Caddy source with refreshed security modules. The scratch
15
+ # runtime carries no shell, package manager, or file capabilities and listens
16
+ # on the unprivileged port :8080.
17
+ FROM golang:1.26.7-alpine3.23@sha256:b17af760035fc2f338eed92d448a6c67f2d45438844fc6c60678fa5f99e44b57 AS caddy-source
18
+ ADD --checksum=sha256:78e660d838e45c0b8c89338b325946238f153641aa9925df9ef2ad5e8eced31b \
19
+ https://github.com/caddyserver/caddy/commit/b2693fb63a30e6d7be0972c3645e9a2c0a500e93.patch /tmp/caddy-cel-go.patch
20
+ RUN go mod download github.com/caddyserver/caddy/v2@v2.11.4 \
21
+ && cp -R /go/pkg/mod/github.com/caddyserver/caddy/v2@v2.11.4 /src \
22
+ && chmod -R u+w /src
23
+ WORKDIR /src
24
+ RUN apk add --no-cache patch \
25
+ && patch -p1 < /tmp/caddy-cel-go.patch \
26
+ && go get github.com/go-chi/chi/v5@v5.3.0 github.com/google/cel-go@v0.29.2 \
27
+ github.com/klauspost/compress@v1.18.7 go.opentelemetry.io/otel@v1.44.0 \
28
+ golang.org/x/crypto@v0.55.0 golang.org/x/net@v0.58.0 \
29
+ golang.org/x/text@v0.41.0 google.golang.org/grpc@v1.83.2 \
30
+ && go mod tidy \
31
+ && CGO_ENABLED=0 go build -trimpath -ldflags "-s -w" -o /out/caddy ./cmd/caddy \
32
+ && printf '%s\n' \
33
+ 'package main' \
34
+ 'import ("net/http"; "os"; "time")' \
35
+ 'func main(){ if len(os.Args)!=2 { os.Exit(2) }; c:=http.Client{Timeout:2500*time.Millisecond,Transport:&http.Transport{Proxy:nil},CheckRedirect:func(_ *http.Request,_ []*http.Request) error{return http.ErrUseLastResponse}}; r,e:=c.Get(os.Args[1]); if e!=nil { os.Exit(1) }; defer r.Body.Close(); if r.StatusCode!=http.StatusOK { os.Exit(1) } }' \
36
+ > /tmp/percher-healthcheck.go \
37
+ && CGO_ENABLED=0 go build -trimpath -ldflags "-s -w" -o /out/percher-healthcheck /tmp/percher-healthcheck.go
38
+ FROM scratch
39
+ COPY --from=caddy-source /etc/ssl/certs/ca-certificates.crt /etc/ssl/certs/ca-certificates.crt
40
+ COPY --from=caddy-source /out/caddy /usr/bin/caddy
41
+ COPY --from=caddy-source /out/percher-healthcheck /usr/bin/percher-healthcheck
42
+ COPY Caddyfile /etc/caddy/Caddyfile
43
+ COPY --from=build /app/dist /srv
44
+ LABEL dev.percher.health-client="static-http-v1"
45
+ # HOME points at the writable tmpfs so non-root Caddy can persist its
46
+ # XDG state (storage-clean lock, config autosave) under Percher's
47
+ # read-only root filesystem.
48
+ ENV HOME=/tmp
49
+ USER 10001:10001
50
+ EXPOSE 8080
51
+ CMD ["caddy", "run", "--config", "/etc/caddy/Caddyfile", "--adapter", "caddyfile"]
@@ -0,0 +1,14 @@
1
+ BSD Zero Clause License (0BSD)
2
+
3
+ Copyright (c) 2026 Mattias Malmborg
4
+
5
+ Permission to use, copy, modify, and/or distribute this software for any
6
+ purpose with or without fee is hereby granted.
7
+
8
+ THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH
9
+ REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY
10
+ AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT,
11
+ INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM
12
+ LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR
13
+ OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
14
+ PERFORMANCE OF THIS SOFTWARE.
@@ -0,0 +1,14 @@
1
+ BSD Zero Clause License (0BSD)
2
+
3
+ Copyright (c) 2026 Mattias Malmborg
4
+
5
+ Permission to use, copy, modify, and/or distribute this software for any
6
+ purpose with or without fee is hereby granted.
7
+
8
+ THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH
9
+ REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY
10
+ AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT,
11
+ INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM
12
+ LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR
13
+ OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
14
+ PERFORMANCE OF THIS SOFTWARE.
@@ -0,0 +1,14 @@
1
+ BSD Zero Clause License (0BSD)
2
+
3
+ Copyright (c) 2026 Mattias Malmborg
4
+
5
+ Permission to use, copy, modify, and/or distribute this software for any
6
+ purpose with or without fee is hereby granted.
7
+
8
+ THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH
9
+ REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY
10
+ AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT,
11
+ INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM
12
+ LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR
13
+ OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
14
+ PERFORMANCE OF THIS SOFTWARE.
@@ -14,6 +14,6 @@
14
14
  "@sveltejs/kit": "^2.5.0",
15
15
  "@sveltejs/vite-plugin-svelte": "^5.0.0",
16
16
  "svelte": "^5.0.0",
17
- "vite": "^5.4.0"
17
+ "vite": "^6.0.0"
18
18
  }
19
19
  }
@@ -1,35 +1,51 @@
1
- # Multi-stage build: a Bun stage compiles the static bundle, then a
2
- # minimal Caddy image serves it. This project uses runtime = "docker"
3
- # (not "static") because Percher's static runtime serves pre-built
4
- # files only — it does not run a build command. Generated by Percher;
5
- # safe to edit and own.
6
-
7
- # --- Build stage: install deps and build the static bundle -----------
8
- FROM oven/bun:1-alpine AS build
9
- WORKDIR /app
10
- COPY . .
11
- RUN bun install && bun run build
12
-
13
- # --- Serve stage: minimal Caddy image --------------------------------
14
- # caddy:2-alpine ships /usr/bin/caddy with cap_net_bind_service file
15
- # caps. Percher runs every container with --security-opt
16
- # no-new-privileges, which makes execve refuse a cap-bearing binary
17
- # (an "operation not permitted" crash-loop). Copy Caddy onto a plain
18
- # alpine base and strip the caps with setcap -r — Caddy never needs
19
- # the cap here, it listens on :8080 (>= 1024).
20
- FROM caddy:2-alpine AS caddy-source
21
- FROM alpine:3.21
22
- COPY --from=caddy-source /usr/bin/caddy /usr/bin/caddy
23
- RUN apk add --no-cache libcap \
24
- && (setcap -r /usr/bin/caddy 2>/dev/null || true) \
25
- && test -z "$(getcap /usr/bin/caddy)" \
26
- && apk del libcap \
27
- && rm -rf /var/cache/apk/*
28
- COPY Caddyfile /etc/caddy/Caddyfile
29
- COPY --from=build /app/dist /srv
30
- # HOME points at the writable tmpfs so non-root Caddy can persist its
31
- # XDG state (storage-clean lock, config autosave) under Percher's
32
- # read-only root filesystem.
33
- ENV HOME=/tmp
34
- EXPOSE 8080
35
- CMD ["caddy", "run", "--config", "/etc/caddy/Caddyfile", "--adapter", "caddyfile"]
1
+ # Multi-stage build: a Bun stage compiles the static bundle, then a
2
+ # minimal Caddy image serves it. This project uses runtime = "docker"
3
+ # (not "static") because Percher's static runtime serves pre-built
4
+ # files only — it does not run a build command. Generated by Percher;
5
+ # safe to edit and own.
6
+
7
+ # --- Build stage: install deps and build the static bundle -----------
8
+ FROM oven/bun:1-alpine AS build
9
+ WORKDIR /app
10
+ COPY . .
11
+ RUN bun install && bun run build
12
+
13
+ # --- Serve stage: minimal Caddy image --------------------------------
14
+ # Build pinned Caddy source with refreshed security modules. The scratch
15
+ # runtime carries no shell, package manager, or file capabilities and listens
16
+ # on the unprivileged port :8080.
17
+ FROM golang:1.26.7-alpine3.23@sha256:b17af760035fc2f338eed92d448a6c67f2d45438844fc6c60678fa5f99e44b57 AS caddy-source
18
+ ADD --checksum=sha256:78e660d838e45c0b8c89338b325946238f153641aa9925df9ef2ad5e8eced31b \
19
+ https://github.com/caddyserver/caddy/commit/b2693fb63a30e6d7be0972c3645e9a2c0a500e93.patch /tmp/caddy-cel-go.patch
20
+ RUN go mod download github.com/caddyserver/caddy/v2@v2.11.4 \
21
+ && cp -R /go/pkg/mod/github.com/caddyserver/caddy/v2@v2.11.4 /src \
22
+ && chmod -R u+w /src
23
+ WORKDIR /src
24
+ RUN apk add --no-cache patch \
25
+ && patch -p1 < /tmp/caddy-cel-go.patch \
26
+ && go get github.com/go-chi/chi/v5@v5.3.0 github.com/google/cel-go@v0.29.2 \
27
+ github.com/klauspost/compress@v1.18.7 go.opentelemetry.io/otel@v1.44.0 \
28
+ golang.org/x/crypto@v0.55.0 golang.org/x/net@v0.58.0 \
29
+ golang.org/x/text@v0.41.0 google.golang.org/grpc@v1.83.2 \
30
+ && go mod tidy \
31
+ && CGO_ENABLED=0 go build -trimpath -ldflags "-s -w" -o /out/caddy ./cmd/caddy \
32
+ && printf '%s\n' \
33
+ 'package main' \
34
+ 'import ("net/http"; "os"; "time")' \
35
+ 'func main(){ if len(os.Args)!=2 { os.Exit(2) }; c:=http.Client{Timeout:2500*time.Millisecond,Transport:&http.Transport{Proxy:nil},CheckRedirect:func(_ *http.Request,_ []*http.Request) error{return http.ErrUseLastResponse}}; r,e:=c.Get(os.Args[1]); if e!=nil { os.Exit(1) }; defer r.Body.Close(); if r.StatusCode!=http.StatusOK { os.Exit(1) } }' \
36
+ > /tmp/percher-healthcheck.go \
37
+ && CGO_ENABLED=0 go build -trimpath -ldflags "-s -w" -o /out/percher-healthcheck /tmp/percher-healthcheck.go
38
+ FROM scratch
39
+ COPY --from=caddy-source /etc/ssl/certs/ca-certificates.crt /etc/ssl/certs/ca-certificates.crt
40
+ COPY --from=caddy-source /out/caddy /usr/bin/caddy
41
+ COPY --from=caddy-source /out/percher-healthcheck /usr/bin/percher-healthcheck
42
+ COPY Caddyfile /etc/caddy/Caddyfile
43
+ COPY --from=build /app/dist /srv
44
+ LABEL dev.percher.health-client="static-http-v1"
45
+ # HOME points at the writable tmpfs so non-root Caddy can persist its
46
+ # XDG state (storage-clean lock, config autosave) under Percher's
47
+ # read-only root filesystem.
48
+ ENV HOME=/tmp
49
+ USER 10001:10001
50
+ EXPOSE 8080
51
+ CMD ["caddy", "run", "--config", "/etc/caddy/Caddyfile", "--adapter", "caddyfile"]
@@ -0,0 +1,14 @@
1
+ BSD Zero Clause License (0BSD)
2
+
3
+ Copyright (c) 2026 Mattias Malmborg
4
+
5
+ Permission to use, copy, modify, and/or distribute this software for any
6
+ purpose with or without fee is hereby granted.
7
+
8
+ THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH
9
+ REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY
10
+ AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT,
11
+ INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM
12
+ LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR
13
+ OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
14
+ PERFORMANCE OF THIS SOFTWARE.