Skip to content

Quickstart

This walkthrough creates a source project, builds linux/amd64 and linux/arm64 images in the cloud, deploys it through 1ctl, and verifies application readiness.

Confirm the target before creating resources:

Terminal window
1ctl profile current
1ctl auth status
1ctl org current
Terminal window
mkdir satusky-quickstart
cd satusky-quickstart
cat > go.mod <<'MOD'
module quickstart
go 1.24
MOD
cat > main.go <<'GO'
package main
import (
"fmt"
"log"
"net/http"
)
func main() {
http.HandleFunc("/", func(w http.ResponseWriter, _ *http.Request) {
_, _ = fmt.Fprintln(w, "Hello from SatuSky")
})
http.HandleFunc("/health", func(w http.ResponseWriter, _ *http.Request) {
w.WriteHeader(http.StatusOK)
})
log.Fatal(http.ListenAndServe(":8080", nil))
}
GO
cat > Dockerfile <<'DOCKERFILE'
FROM golang:1.24-alpine AS build
WORKDIR /src
COPY go.mod main.go ./
RUN CGO_ENABLED=0 go build -trimpath -ldflags='-s -w' -o /server .
FROM scratch
COPY --from=build /server /server
USER 65532:65532
EXPOSE 8080
ENTRYPOINT ["/server"]
DOCKERFILE

Choose an application name that is unique in your organization namespace:

Terminal window
export APP="quickstart-$(date +%m%d%H%M)"
cat > satusky.toml <<EOF
[app]
name = "$APP"
port = 8080
cpu_request = "10m"
cpu_limit = "50m"
memory = "32Mi"
[build]
dockerfile = "Dockerfile"
fast_build = true
[checks]
health_path = "/health"
[checks.readiness]
period_seconds = 5
[checks.readiness.http_get]
path = "/health"
port = 8080
[deploy]
strategy = "rolling"
rolling_max_surge = "25%"
rolling_max_unavailable = "0"
EOF

The current schema keeps port and resources under [app]. Health and Kubernetes probe declarations belong under [checks].

Terminal window
1ctl deploy --wait

The fast cloud builder publishes both supported architectures. The atomic deployment intent then creates the workload, Service, environment projection, and managed HTTPS route.

By default, --wait requires verified application readiness. The explicit [checks].health_path lets the CLI use a successful /health response as verification after the route is available. --wait-mode workload is available for compatibility, but it proves only reconciliation and workload availability, not that the application serves traffic.

Inspect the application and capture its deployment ID and URL:

Terminal window
APP_JSON="$(1ctl -o json app get "$APP")"
DEPLOYMENT_ID="$(printf '%s' "$APP_JSON" | jq -r '.deployment_id')"
APP_URL="$(printf '%s' "$APP_JSON" | jq -r '.domain')"
1ctl app status "$APP"
printf 'URL: %s\n' "$APP_URL"

Route and DNS publication can finish shortly after the workload becomes healthy. Poll the public endpoint:

Terminal window
for attempt in $(seq 1 60); do
curl --max-time 5 --fail --silent "$APP_URL/health" >/dev/null && break
sleep 2
done
curl --fail --silent "$APP_URL/"

Expected response:

Hello from SatuSky

Use the deployment ID so 1ctl can resolve the namespace and application unambiguously:

Terminal window
1ctl logs stream --deployment-id "$DEPLOYMENT_ID"

Stop streaming with Ctrl+C.

Terminal window
1ctl app delete "$APP" --yes

Terminal deletion removes the application and its managed runtime projections. Persistent resources are retained only when a product or marketplace package explicitly declares a retention policy.