3d99940658
Sandbox Deployment Platform — Go control plane + agents, NextJS dashboard, nginx reverse proxy. Cross-compile via Docker; deploy via sshpass to 172.18.136.92 (micro) and 172.18.139.186 (gateway). - control-plane: HTTP API, WS hub, SQLite (modernc.org/sqlite) for progress, .log files for log persistence - agent-micro / agent-gateway: alpine:3.20 + bind-mounted repo, binary exec'd in container, no Dockerfile build step - dashboard: NextJS static export + shadcn/ui components, single WebSocket hook - docker-compose.yml: three services on alpine:latest with docker socket bind for agents - scripts/: build.sh (golang:1.23-alpine cross-compile), deploy.sh, patch-nginx.sh (idempotent nginx splice), ssh wrappers Runtime model: pass-through Bitbucket creds per deploy, never logged or persisted on the agent. Control plane never touches git or docker directly — agents do all the work locally.
36 lines
1.6 KiB
Go
36 lines
1.6 KiB
Go
// Package protocol defines the wire format shared between the control plane
|
|
// and agents. Keep this small — anything that goes over HTTP or WebSocket
|
|
// between us and an agent lives here.
|
|
package protocol
|
|
|
|
// Event is what an agent streams back to the control plane over its outbound
|
|
// WebSocket. The control plane fans these out to dashboard clients and
|
|
// persists them (log lines to .log, progress snapshots to SQLite).
|
|
type Event struct {
|
|
DeploymentID string `json:"deploymentId"`
|
|
Kind string `json:"kind"` // progress | log | status
|
|
State string `json:"state,omitempty"` // QUEUED, FETCHING, ... RUNNING, FAILED, STOPPED
|
|
Stage string `json:"stage,omitempty"` // human label, e.g. "git fetch"
|
|
Line string `json:"line,omitempty"` // log line (for kind=log)
|
|
ContainerID string `json:"containerId,omitempty"`
|
|
At int64 `json:"at"` // unix millis
|
|
}
|
|
|
|
// DeployRequest is what the control plane POSTs to an agent to start work.
|
|
// Credentials are passed per-operation; agents MUST NOT log or persist them.
|
|
type DeployRequest struct {
|
|
DeploymentID string `json:"deploymentId"`
|
|
Repository string `json:"repository"` // name from agent's repo config
|
|
Branch string `json:"branch"`
|
|
Env map[string]string `json:"env,omitempty"` // injected into container
|
|
Username string `json:"username"`
|
|
Password string `json:"password"`
|
|
}
|
|
|
|
// DeployResponse is the agent's immediate ack to a DeployRequest.
|
|
// Actual progress streams over the WS.
|
|
type DeployResponse struct {
|
|
OK bool `json:"ok"`
|
|
Error string `json:"error,omitempty"`
|
|
}
|