68 Commits
Author SHA1 Message Date
zeekayandHanzo Dev fd0483569b Build the image on the Go its module requires
go.mod asks for go 1.27.1 and the builder stage was golang:1.26.8-alpine,
whose GOTOOLCHAIN=local fails that build; the publish gate refuses it
before it starts. The stage now uses golang:1.27.1-alpine and sets
GOTOOLCHAIN=auto, so a later go.mod bump fetches its Go instead of
failing.

Co-authored-by: Hanzo Dev <[email protected]>
2026-10-03 12:30:13 -07:00
zeekayandHanzo Dev 6b231e7f05 go 1.26.8
One toolchain across the estate. The tree carried 1.26.0, .1, .3, .4 and .5
at once, so which compiler built a binary depended on which repo it came
from.

Co-authored-by: Hanzo Dev <[email protected]>
2026-09-08 23:55:44 -07:00
zeekay 9a286ccfa2 Ship the image as the binary alone
An empty image holding the static binary, the CA bundle and zoneinfo,
and the directories it writes. Nothing else is present to run.
2026-09-03 17:43:46 -07:00
zeekayandHanzo Dev 679ae61163 feat(transport): address the engine and the SDK, so both can use a socket
The engine took a PORT and the SDK an Options.HostPort, so neither end
could use a unix socket for traffic that never leaves the host. The
field name was not the only obstacle: luxfi/zap bound net.Listen("tcp",
":port") and reached a peer with net.DialTimeout("tcp", addr), so a path
was refused at the dialer with "missing port in address" and could not
be bound at all. That is fixed upstream (luxfi/zap Address + Network);
this pins the commit until it is tagged.

EmbedConfig.Address, Embedded.Address, ServeGated(addr) and
client.Options.Address each take ONE address, because a port is a detail
of one transport rather than a thing every listener has. A path binds or
dials a unix socket; anything else is host:port.

TestDialRequiresHostPort became TestDialRequiresAddress: Dial needs an
address, and asserts a socket path is refused for being absent rather
than for being portless. TestE2E_UnixSocket runs a real workflow over a
socket end to end, and TestE2E_UnixSocketRebind proves the socket is
unlinked on stop so a restart binds cleanly.

Co-authored-by: Hanzo Dev <[email protected]>
2026-07-28 16:27:19 -07:00
zeekayandHanzo Dev 186ecae3fb fix(docker): golang 1.26.4 -> 1.26.5, the version go.mod already requires
go.mod declares `go 1.26.5` while the builder pinned golang:1.26.4. The golang
images set GOTOOLCHAIN=local, so the base can never fetch a newer toolchain to
satisfy the directive and the build dies immediately:

    go: go.mod requires go >= 1.26.5 (running go 1.26.4; GOTOOLCHAIN=local)

A release build that fails in under a second did not fail to compile — it
failed to acquire a toolchain.

Found by sweeping every hanzoai repo with a go.mod against its Dockerfile base:
25 declare go >= 1.26.5, and 16 pin an explicit 1.26.4 that cannot satisfy it.
Repos on a floating `1.26` / `1.26-alpine` are already fine — both now resolve
to 1.26.5 (verified by digest: golang:1.26-alpine and golang:1.26.5-alpine are
the same sha256:0178a641).

Patch bump only, image variant preserved, and the target tag verified to exist
before the change.

Co-authored-by: Hanzo Dev <[email protected]>
2026-07-27 19:12:34 -07:00
24787131fb fix(docker): git + buildkit-secret auth for the private hanzoai/sqlite module (#15)
The canonical CI image build failed at go mod download: the alpine build
stage has no git and no auth for the private module. Same dual-mount
(gh_token / GIT_AUTH_TOKEN) pattern as hanzoai/iam's Dockerfile; public
modules stay on proxy+sumdb (retag-proof).


Co-authored-by: hanzo-dev <[email protected]>
2026-07-11 23:17:22 -07:00
zeekay 8473a2c8ca deps: bump Go to 1.26.4 across go.mod, Dockerfiles, GH Actions
Workspace-wide sync. luxfi/node already shipped on 1.26.4 in v1.30.6
(commit 121aca1fa9); this is the cross-repo catch-up.
2026-06-07 12:12:47 -07:00
zeekay fd23c50704 build(tasks): GOEXPERIMENT=jsonv2 in Dockerfile per SCALE_STANDARD
Per SCALE_STANDARD.md §2 — every Go production Dockerfile that emits
JSON to a client builds with GOEXPERIMENT=jsonv2. Verified on
hanzoai/zip's json_bench_test.go:
- Edge POST roundtrip: -12% time, -23% allocs
- Marshal-only: -22% time
- Unmarshal-only: -19% time, -25% allocs

The conn-memory regression test is deferred to a follow-up that
migrates tasksd's net/http listener to zip per §9 step-1; net/http
has a fixed 3-goroutine-per-request overhead that violates §3's 1:1
goroutine-to-conn invariant.
2026-05-19 12:32:36 -07:00
zeekay 1a46fdf123 feat(ui): v3.0.0 — Tamagui IS the production UI, kill v1 React/shadcn
The embedded UI in tasksd is now the @hanzo/gui Tamagui build from
~/work/hanzo/gui/code/admin-tasks/. v1 React/shadcn deleted.

What's still here:
  ui/embed.go        — Go //go:embed wrapper (handler unchanged)
  ui/dist/           — synced from admin-tasks build output
  ui/README.md       — explains the bundle is built externally
  scripts/sync-admin-ui.sh — copies admin-tasks/dist → ui/dist + stamp
  Makefile           — `ui` target now calls the sync script
  Dockerfile         — drops the node ui-build stage; expects pre-built
                       dist/ in the repo or built upstream via CI

What's deleted (62 files):
  ui/{src,public,node_modules}/         entire trees
  ui/{package.json, vite.config.ts, tailwind.config.js, postcss.config.js,
      tsconfig.json, index.html, PERF.md, .gitignore, pnpm-lock.yaml,
      vite.perf2.config.ts, tsconfig.tsbuildinfo}
  UI-TAMAGUI-MOVED.md (no longer accurate)

Live bundle (verified curl http://127.0.0.1:7243/):
  /_/tasks/                       → 200
  /_/tasks/assets/index-BKuZ1al1.js → 200, 674,748 bytes
  /_/tasks/assets/index-DTXHKKx4.css → 200, 9,104 bytes
  /v1/tasks/namespaces            → 200

Bundle: 339 KB → 675 KB raw / 104 KB → 199 KB gzip. Larger because
Tamagui ships react-native-web + Tamagui core + theme primitives
that shadcn doesn't. Trade: design-system consistency across all
Hanzo admin UIs (kms, commerce, console, etc.) vs 95 KB gzip.

CI note: .github/workflows/build.yml's docker build needs a pre-step
that checks out hanzo/gui and builds admin-tasks, OR commits ui/dist/
to this repo. Dockerfile fails fast with a clear message until then.

Tag v3.0.0 because this is a meaningful UI architecture change.
2026-04-27 08:15:19 -07:00
zeekay 8f279a783a chore: drop dead config + ship-shape Dockerfile/Makefile/k8s
- rm config/ (cassandra/mysql/postgres/dual-cluster fork yamls)
- rm develop/ (fork docker-compose / grafana / temporalio-dashboards submodule)
- rm docs/{admin,architecture,development,_assets,ui-screenshots,Makefile,README.md,worker-versioning.md}
  (kept docs/red-review-zap-sdk.md — pkg/sdk port review)
- rm k8s/{configmap.yaml,init-db.yaml,kms-secrets.yaml} (dynamic config + Postgres init for fork)
- rm .gitmodules (was: temporalio-dashboards Grafana, gone)
- Dockerfile: 27 lines, no CGO, no SQLite driver, exposes :9999 (ZAP) + :7243 (HTTP)
- Makefile: 30 lines, just build/ui/run/vet/test/tidy/clean
- k8s/deployment.yaml: single Deployment, single Service, single Ingress, /healthz probes
- k8s/kustomization.yaml: 2 resources (deployment + ingress)

Binary: 6.65 MB (-trimpath -ldflags="-s -w"), RSS 13 MB, boots <1s, all probes 200.
2026-04-26 14:57:25 -07:00
zeekay dc3a3d3712 feat(ui): Vite 8 + React SPA embedded into tasksd (ui/)
Self-contained admin UI for hanzoai/tasks. Lives in ui/, builds to
ui/dist/ via Vite 8, gets embedded into the tasksd binary with
go:embed, and is served at / on the HTTP API port (default :7234).

Stack:
  - Vite 8
  - React 18 + TypeScript strict
  - react-router (client-side routing, deep-link safe)
  - SWR (zero-config fetch + revalidation)
  - Tailwind 3 (dark-first palette; no webfont)
  - @hanzogui/lucide-icons-2 (shared Hanzo icon set)

v1 pages:
  - /namespaces              — list all namespaces + retention
  - /namespaces/:ns/workflows       — running + recent executions
  - /namespaces/:ns/workflows/:id   — describe single execution
  - /namespaces/:ns/schedules       — schedule list + spec

The UI talks to the existing Temporal HTTP gateway at /api/v1/*
(auto-generated from the workflowservice + operatorservice protos),
so no new backend routes were added. mux.Router registers /api/*
first, then falls through to ui.Handler() for everything else; the
SPA's client-side router takes over for unknown paths.

Build integration:
  - ui/embed.go exposes Handler() over an embed.FS rooted at dist/
  - Dockerfile adds a node:22-alpine UI build stage that produces
    ui/dist, then the Go build stage overlays that onto the
    placeholder dist/index.html already committed (so `go build`
    works on a developer laptop without running pnpm first).
  - service/frontend/http_api_server.go imports tasksui and mounts
    at /. The existing catch-all was split:
      1. PathPrefix("/api/") → Temporal gRPC-Gateway
      2. PathPrefix("/")     → embedded SPA
  - Anything that isn't a registered /api/... handler renders the
    SPA shell, which lets react-router resolve the path.

Dev workflow:
  pnpm --prefix ui install
  pnpm --prefix ui dev          # Vite on :5173, proxies /api to :7234
  go run ./cmd/tasksd embedded-sqlite  # :7234 backs the API

Next: ZAP port for the internal gRPC services (task #41).
2026-04-23 07:28:51 -07:00
zeekay a10bde2005 fix(embedded-sqlite): bootstrap schema + expose HTTP API on first boot
The plain `start` command on tasksd does not run sqlite/v1 schema migrations,
so a fresh /data PVC crashes with "no such table: cluster_metadata_info".
Add a new `embedded-sqlite` command that wraps temporaltest/embedded.LiteServer,
which calls sqlite.SetupSchema() before binding the frontend.

Also expose the HTTP API by default on port 7234 (gRPC stays on 7233). Without
HTTPPort the frontend is gRPC-only and clients that POST workflows/schedules
over HTTP get connection refused.

Image v2.0.2.
2026-04-22 13:08:23 -07:00
zeekay b695fbbfb2 feat: native multi-arch CI build + embedded SQLite deployment
- GitHub Actions: parallel amd64 + arm64 on self-hosted runners
  (lqd-build-amd64/arm64), multi-arch manifest, push to GAR
- Dockerfile: CGO-enabled Go build with sqlite support
- embedded-sqlite.yaml: file-based WAL persistence at /data/
- Build tags on test utility files to fix production builds
- Removed luxfi/zap local replace, using published v0.2.1
2026-04-17 11:22:28 -07:00
8de8c1a1c5 Remove docker files (#2456)
* Remove docker files

* Update docker/README.md

Co-authored-by: Alex Shtin <[email protected]>

* address comments

* update docker readme

* Update develop/buildkite/pipeline.yml

Co-authored-by: Alex Shtin <[email protected]>

* Update README.md

Co-authored-by: Alex Shtin <[email protected]>

Co-authored-by: Alex Shtin <[email protected]>
Co-authored-by: Alex Shtin <[email protected]>
2022-03-21 14:22:36 -07:00
Alex ShtinandGitHub e8f9b4824d Upgrade base images (#2467) 2022-02-04 18:23:00 -08:00
Alex ShtinandGitHub 952acbf48f Use base-server:1.5.0 after recent update (#2402) 2022-01-21 09:25:32 -08:00
Alex ShtinandGitHub 87c5e9873a Enable cgo by default and disable it explicitly for docker image build (#2396) 2022-01-20 17:06:23 -08:00
David ReissandGitHub c2e9271f1a Use --target for docker builds (#2273) 2021-12-20 22:55:10 -08:00
Yimin ChenandGitHub 1e2433703f Upgrade golang to 1.17.3 (#2240)
* Upgrade golang to 1.17.3
* Update base image version
2021-11-30 14:49:16 -08:00
Joe GreenandGitHub 69b9bbeea7 Specify the entrypoint absolutely (#2118) 2021-11-01 11:20:00 -07:00
Alex ShtinandGitHub df44f99613 Remove openssl from base server image (#1901) 2021-09-08 17:02:00 -07:00
sagardeo2105andGitHub 835ec13618 Add non-root user to run temporal server (#1814) 2021-08-31 19:07:02 -07:00
Alex ShtinandGitHub 11e3331aa8 Update dependencies (#1874) 2021-08-31 17:53:56 -07:00
Andreas Storesund MadsenandGitHub fec930aec4 Add tctl-authorization-plugin to docker images (#1832) (#1833) 2021-08-18 09:36:26 -07:00
Paul QuernaandGitHub f63bbc499b Refactor Dockerfiles to better support ARM (#1575) 2021-06-14 10:58:18 -07:00
Alex ShtinandGitHub e5f0adde89 Use shellcheck in ci-build target (#1565) 2021-05-22 18:50:55 -07:00
Alex ShtinandGitHub 19378da8e0 Use ONBUILD in Dockerfile for develop image (#1564) 2021-05-22 15:42:46 -07:00
Alex ShtinandGitHub bdac0e20fb Refactor Dockerfile and scripts (#1501) 2021-05-19 13:47:11 -07:00
VitalyandGitHub 50da36ca28 Adding image for debugging and traffic shaping (#1394) 2021-03-22 19:09:53 -07:00
a2b104ca29 Feature/extract base docker image (#1341)
* Extract base docker image

* Move base docker images to separate files

Separate deployment and configuration steps that don't change often to base images to save time and resources.

* Cleanup, moving images from temporaliotest to temporalio

* Minor fixes

Added openssl, fixed syntax

* cleanup

Co-authored-by: Alex Shtin <[email protected]>
2021-03-08 23:05:14 -08:00
Alex ShtinandGitHub 8860eb0af1 Fix pip installer download path (#1361) 2021-03-08 12:37:35 -08:00
wxing1292andGitHub f9843d7853 Use go 1.16 (#1325) 2021-02-24 10:45:30 -08:00
wxing1292andGitHub 0c5c98a815 Update pip install script (#1221) 2021-01-25 10:31:08 -08:00
Alex ShtinandGitHub 92b2901896 Clean up main Dockerfile (#1177) 2021-01-12 11:59:00 -08:00
wxing1292andGitHub 1b18aec278 Use alpine 3.12 (#963) 2020-11-09 13:12:00 -08:00
Alex ShtinandGitHub d13256bd35 Fix SERVICES environment variable format (#884) 2020-10-22 23:24:27 -07:00
Alex ShtinandGitHub 8a32663521 Hotfix SERVICES env (#886) 2020-10-21 12:41:46 -07:00
wxing1292andGitHub d2cf757dbc Use go 1.15 (#867) 2020-10-15 17:50:21 -07:00
Alex ShtinandGitHub 7ccbf60951 Fix --services flag format (#841) 2020-10-13 12:53:04 -07:00
Mark MarkaryanandGitHub 307b43f43d No longer use AUTO_SETUP env var in temporalio/server docker image (#752) 2020-09-22 22:55:40 -07:00
Mark MarkaryanandGitHub de192dbbe6 Add jq to admin-tools image (#694) 2020-08-26 19:57:00 -07:00
VitalyandGitHub 642db21a9a Allow dynamic config editting outside of container when running docker-compose (#681)
* Allow dynamic config editting from outside of container for
docker-compose configurations

* Stop copying dynamic config in the Dockerfile

* Make dynamic config dir configurable via DYNAMIC_CONFIG_DIR env var
2020-08-20 10:57:39 -07:00
Shawn HathawayandGitHub ae7169568a Fix development_*.yml PublicClient/ClusterRpcAddress Ports (#650) 2020-08-06 15:02:49 -07:00
Mark MarkaryanandGitHub 6ed688d122 Remove unused dependency (bzr) from Dockerfile (#428) 2020-06-03 11:53:36 -07:00
Mark MarkaryanandGitHub 3236274af2 ElasticSearch-related docker compose and docker image updates (#311)
* Merge `temporal-auto-setup` functionality into `temporal-server` docker image
* Add 'docker-images' target to Makefile
* Switch `docker-compose-es.yml` to `temporalio/server`, and add `admin-tools`
* Upgrade docker-compose-es cassandra to 6.8.1, cap elasticsearch memory
2020-04-17 21:07:50 -07:00
Alex ShtinandGitHub a5738e5105 Fix Dockerfile (#254) 2020-03-27 11:14:10 -07:00
Samar AbbasandGitHub 92782e13fd Register default domain on container start up (#227)
Docker container can be configured to automatically register a
default domain when container starts up.  Use the flag
'SKIP_DEFAULT_DOMAIN_CREATION' to skip creation of default domain.

Removed tcheck layer from Dockerfile as all tchannel rpc is now
removed.  Also cleaned up unnecessary ports from docker-compose
definition.
2020-03-18 12:17:40 -07:00
Samar AbbasandGitHub 0649f09dda Update cadence references to temporal (#209)
Change all cadence references to temporal references throughout
source code and documentation.

Change docker entry point to tctl as we renamed it from temporal
to tctl.

Update mysql user login info.
2020-03-11 21:45:49 -07:00
Samar AbbasandGitHub 1034addd13 Add Buildkite pipeline step to publish docker images (#204) 2020-03-10 18:56:38 -07:00
Samar AbbasandGitHub 9dbf85aecb Rename temporal-cli to tctl (#199) 2020-03-10 12:42:27 -07:00