Quickstart
This guide walks through the full deployment loop: write a Dockerfile, configure the app, push, and get a live URL. The whole thing takes about 5 minutes.
Prerequisites
Section titled “Prerequisites”1ctlinstalled — see Installation- A Satusky account and API token — see Authentication
- No Docker, no kubectl, nothing else
Step 1: Authenticate
Section titled “Step 1: Authenticate”1ctl auth login --token sat_xxxxxxxxxxxxxxxxxxxxxxxxExpected output:
Authenticated as [email protected] (org: my-org)Context saved to ~/.satusky/context.jsonStep 2: Create a project
Section titled “Step 2: Create a project”Make a directory and add a simple application. Here’s a minimal Go HTTP server:
mkdir my-app && cd my-appmain.go:
package main
import ( "fmt" "net/http" "os")
func main() { port := os.Getenv("PORT") if port == "" { port = "8080" }
http.HandleFunc("/", func(w http.ResponseWriter, r *http.Request) { fmt.Fprintln(w, "Hello from Satusky") })
http.ListenAndServe(":"+port, nil)}Dockerfile:
FROM golang:1.24-alpine AS buildWORKDIR /appCOPY . .RUN go build -o server .
FROM alpine:3.19WORKDIR /appCOPY --from=build /app/server .EXPOSE 8080CMD ["./server"]Step 3: Initialize the project
Section titled “Step 3: Initialize the project”1ctl init1ctl init asks a few questions — project name, namespace, resource limits — then writes satusky.toml to the project root.
Expected output:
? Project name: my-app? Namespace: production? CPU limit [0.5]: 0.5? Memory limit [256Mi]: 256Mi? Port [8080]: 8080
Created satusky.tomlThe generated satusky.toml looks like this:
[app]name = "my-app"namespace = "production"
[build]dockerfile = "Dockerfile"
[resources]cpu = "0.5"memory = "256Mi"
[network]port = 8080You can edit this file directly before deploying. See the configuration reference for all available fields.
Step 4: Deploy
Section titled “Step 4: Deploy”1ctl deployExpected output:
Building image... Uploading source context [================] 100% Step 1/6: FROM golang:1.24-alpine AS build Step 2/6: WORKDIR /app Step 3/6: COPY . . Step 4/6: RUN go build -o server . Step 5/6: FROM alpine:3.19 Step 6/6: COPY --from=build /app/server . Image built and pushed: registry.satusky.com/my-org/my-app:a3f8c21
Deploying... Deployment created: my-app Waiting for rollout... [====] ready (2s)
URL: https://my-app.my-org.satusky.appYour app is live at the printed URL.
Step 5: Check deployment status
Section titled “Step 5: Check deployment status”1ctl deploy statusExpected output:
Deployment: my-appNamespace: productionStatus: runningReplicas: 1/1 readyImage: registry.satusky.com/my-org/my-app:a3f8c21CPU: 0.5Memory: 256MiURL: https://my-app.my-org.satusky.appCreated: 2026-04-27T10:00:00ZStep 6: View logs
Section titled “Step 6: View logs”1ctl logsStream live logs from the running container:
2026-04-27T10:00:05Z [my-app] server listening on :80802026-04-27T10:00:12Z [my-app] GET / 200 142µsPass -f to follow (tail -f style) or --since 1h to limit the time window.
What just happened
Section titled “What just happened”-
Cloud build —
1ctl deployuploaded your project source to Satusky’s build service. Kaniko built the Docker image inside the cluster. No local Docker daemon was involved. -
Image push — The built image was pushed to Satusky’s internal registry (
registry.satusky.com). -
Kubernetes deployment — Satusky created a Kubernetes Deployment in the
productionnamespace with the resource limits fromsatusky.toml. A service and public route were created automatically. -
Public route and TLS — Satusky provisioned a subdomain (
my-app.my-org.satusky.app) and a TLS certificate. HTTPS is on by default.
Next steps
Section titled “Next steps”- Authentication — manage API tokens and profiles for multiple environments
- Environment variables — set runtime config and secrets
- Custom domains — attach your own domain
- CI/CD — automate deploys from GitHub Actions or any CI system