Shebakaشبكة

The sovereign cloud. Deploy apps and AI on ethically screened infrastructure.

Check your email — the sign-in link works once and expires in 15 minutes.

Continue with SSO

First sign-in creates your workspace automatically.

Shebaka
?
…
Projects AI CloudComing soon
Infrastructure Usage People Docs Settings
Code hosting ↗
?
…

Projects

Lowercase letters, digits and dashes. Nothing is deployed — you get an empty canvas.

Deploy your first service

Point Shebaka at a Git repository — we build it (Dockerfile, Nixpacks, or a static site), run it on screened infrastructure, and hand you an HTTPS URL.

  1. 1

    Connect your code host

    Checking connections…

  2. 2

    Pick a repository and branch

    Your repos and branches appear as dropdowns — nothing to paste, no branch name to typo.

  3. 3

    Watch it go live

    We build it, stream the log while it happens, and hand you a live HTTPS URL at the end.

Prefer the terminal?

curl -fsSL get.shebaka.com | sh    # installs the shebaka CLI
shebaka login
shebaka deploy            # deploys the current directory
shebaka deploy --git https://code.shebaka.com/you/app.git

The installer serves checksummed binaries for macOS and Linux. Everything the console does, the CLI does.

Projects/ production

Move every service and database in to another cluster behind one fence point — one plan, one verify barrier, one route flip.


      

This destroys every service and database in , backups included. Type the project name to confirm.

AI Cloud

Shebaka AI is not available yet. An OpenAI-compatible inference API on the same sovereign infrastructure — no GPU is under contract, so there is no catalogue and no rate card, and nothing here is being sold.

We order capacity against real demand rather than speculatively. If you would use this, say so and it counts — we will come back to you with a date and a price before anything is bought.

Email us instead

Noted — thank you. Email salaam@shebaka.com with what you would run and roughly how much, and it moves up the list.

Models

ModelAPI

Playground

Responses stream token-by-token — the same API customers integrate against.

Use it from code


          

Infrastructure

Loading…

Usage

–
month to date
–
est. month run rate
–
credit balance
–
payment method

Current statement

LineQtyUSD
Loading…

Compared with AWS

The same estate priced at AWS list rates (us-east-1, on-demand): each service as Fargate, each managed database as the smallest RDS class that fits it, each dedicated cluster as EKS plus EC2 nodes. Rates whose page could not be checked on the date shown are marked.

–
Shebaka / month
–
AWS equivalent / month
–
difference
Line by line
ItemShapeShebakaAWS basisAWS

Payment

Usage is charged to the card at each monthly statement close. Bank-transfer credits are applied first — salaam@shebaka.com.

Credit ledger

WhenNoteUSD
No credit movements.

Closed statements

PeriodSubtotalCredits ChargedStatus
No closed months yet — the first statement closes at month end.

People

NameEmailRoleStatusLast seen
Loading…

Teammates sign in with the email you add here. Members deploy and manage services; admins also manage people, plan & billing, and DR.

Docs

Deploying

A service comes from a Git repository, a directory, or a prebuilt image. Connect a code host in Settings, or paste any public Git URL.

How the build is chosen

Left on Auto, the builder picks the first of these that fits:

  1. a Dockerfile at the path you named under Advanced;
  2. a Dockerfile at the repository root;
  3. the repository's only Dockerfile, wherever it sits (up to four directories down) — the build log names the one it picked. More than one and the build stops and asks which, rather than guessing;
  4. an index.html at the root — served as a static site;
  5. otherwise nixpacks, which detects the language and builds an image.

The build context is always the repository root, whichever Dockerfile is used — so a monorepo Dockerfile can COPY the workspace manifests it needs from above its own directory.

You can pin it instead: Dockerfile, Nixpacks or Static. A pinned choice sticks to the service and is reused by webhook and rollback rebuilds, so a redeploy cannot silently switch strategy.

Config as code

A shebaka.toml at the repository root sets what the Advanced panel sets — shebaka.yaml, shebaka.yml and shebaka.json work too. The file wins over the console for the fields it names, and the build log says so each time it does. Unknown keys and anything that looks like a secret fail the build rather than being ignored.

Rebuilding and rolling back

Pushing to the branch you chose redeploys it. Redeploy without cache in the drawer rebuilds from scratch when a cached layer has gone stale — it affects only your build. Rollback returns the service to its previous image.

When a build fails

The log is above the form, with Copy log next to it. Where the failure is one we recognise, the drawer names the field that caused it and opens the section it lives in. Where it is not, you get the log and no invented explanation.

Environment variables

Set them under Advanced when you create a service, or in the service drawer afterwards. Changing one redeploys the service.

Variables a database gives you

While a database is attached, these six names are set for you and are reserved — your own values for them are ignored:

  • DATABASE_URL — the whole connection string
  • DB_HOST, DB_PORT, DB_NAME, DB_USER, DB_PASSWORD

They are rendered before your own variables, so you can build on them with Kubernetes' $(VAR) expansion. That is how an image expecting its own names works without a wrapper script:

WORDPRESS_DB_HOST = "$(DB_HOST):$(DB_PORT)"
WORDPRESS_DB_USER = "$(DB_USER)"
WORDPRESS_DB_PASSWORD = "$(DB_PASSWORD)"

Secrets

Values are stored with the service and are not printed in build logs. A secret committed to shebaka.toml fails the build on purpose — put it here, not in the repository.

Build-time secrets (credentials a Dockerfile needs while building, rather than at run time) are not supported yet.

Databases

Managed PostgreSQL 18 and MySQL 8.4. Create one from the New dialog's Database tab, or alongside a service on its Data step.

Attaching

A service attaches a database from its own project. That boundary is deliberate: a connection string that crosses projects outlives whatever reason it was made for. Move a database between projects if you need it elsewhere — the move is metadata, nothing redeploys.

Sizes

Small is 0.5 vCPU / 1 GiB; medium is 2 vCPU / 4 GiB. Storage is billed on what is provisioned, not what is used. Trial accounts are pinned to small.

Backups

Every managed database gets a nightly dump. Where off-node backups are configured, a base backup plus continuous log shipping goes to object storage, which is what makes a restore into another region possible. A restore lands in a new database beside the original — nothing is overwritten, and you decide what to keep.

Deleting a database destroys its data and its backups. There is no undo and no retention window.

Domains & TLS

Every service answers at

https://<service>-<workspace>.apps.shebaka.com

as soon as it is running. The certificate is issued on the first request to that hostname, so the very first load can take a second longer than the rest.

Your own domain

  1. Add the domain in the service drawer.
  2. Point it at the platform with the record shown there.
  3. Load it once. The certificate is issued on that request.

If your DNS provider offers a proxy in front of the record (Cloudflare's orange cloud, for instance), leave it off. A proxied record breaks certificate issuance, and the failure looks like a certificate problem rather than a DNS one.

Disaster recovery

Recovery is per service, and what you get depends on whether the service keeps data.

Stateless services — warm standby

A copy runs in a second region. If the primary stops answering, the edge fails over to it per request, automatically. You can also fail over deliberately from the DR tab.

Services with a database — cutover

These move by restoring from backup into the other region, so the recovery point is the last backup shipped, not the last write. It is never automatic: moving a database on a false alarm is worse than the outage.

  • Planned — the primary is reachable. Everything is quiesced, a fresh backup is taken, and the loss window is effectively nil.
  • Unplanned — the primary is gone. The last shipped log is what arrives, and the API refuses until you acknowledge the data loss explicitly.

Whole projects

Cut over project… on the project canvas moves every member together: one quiesce, all fences before any restore, and a verification barrier before any record moves. If it fails partway, everything stays fenced and it says so loudly rather than half-moving your project.

Un-fencing

A fenced service is one that was scaled to zero with its database paused, ready to be moved. If a cutover failed after that point, the service drawer shows a fenced banner with an Un-fence button that resumes the database and scales the service back up where it already was.

Measured recovery times vary by workload and are published per drill rather than as a single marketing number — ask if you need the figures for a workload like yours.

CLI

curl -fsSL https://get.shebaka.com | sh
shebaka login          # paste the API key from Settings

The CLI has no dependencies and talks to the same API the console does.

shebaka deploy --git https://github.com/you/app.git
shebaka deploy ./site               # a directory
shebaka logs <app> -f
shebaka apps list
shebaka apps rollback <app>

shebaka db create <name> --engine postgres|mysql --size small|medium
shebaka db dsn <name>
shebaka db list

shebaka dr status <app>
shebaka dr cutover <app> --to <cluster> --planned
shebaka dr unfence <app>

shebaka usage

shebaka db delete destroys data and backups. It asks first.

API reference

The console is a client of this API and uses nothing private. Authenticate with your account's API key from Settings:

curl -H "Authorization: Bearer $SHEBAKA_API_KEY" \
     https://console.shebaka.com/v1/apps

An API key is bound to one workspace. It cannot switch workspaces, accept an invitation, or create one — those belong to a signed-in person.

The endpoints you are most likely to want

Method & pathWhat it does
GET /v1/appsServices, with their URLs and status
POST /v1/apps/deployDeploy or redeploy a service
GET /v1/apps/{name}/logsRuntime logs
POST /v1/apps/{name}/rollbackBack to the previous image
GET /v1/databasesManaged databases
GET /v1/databases/{name}/dsnConnection string
GET /v1/usageMonth-to-date usage and the open statement
GET /v1/tenants/{id}/statementsClosed monthly statements
POST /v1/apps/{name}/dr/failoverFail a stateless service to its standby
POST /v1/apps/{name}/dr/unfenceReverse a fence left by a failed cutover

There is no versioned public API contract or SDK yet: these paths are what the console and CLI use, and they can change. If you are building against them, say so — that is the signal that turns them into a contract.

Settings

Account

Git providers

Connect a code host once; then pick a repository when you deploy, and pushes deploy themselves with no webhook to paste. You can connect more than one account — a personal repo and a team org are two connections. Each row is checked against the host, so a connection you removed there says so here.

Already installed the Shebaka app on GitHub? Connect an existing installation — it stays connected wherever else it is in use.

Installations your GitHub account can see:

Container registry

Right-click the project canvas and search for an image — this is where we look. Docker Hub unless you point it somewhere else. Searching is all this does: the pull still happens from wherever the image reference names.

Plan

Each plan is a monthly amount plus what you use, itemized line by line on your statement. Changing plan applies at your next month-close, not retroactively.

Appearance

Text size across the console. This is remembered in this browser only — it is a reading preference, not an account setting, so a bigger phone and a big monitor can differ.

Workspace

The name your teammates see, and the name on the invitations this workspace sends.

Its address — — — is fixed. It is the back half of every hostname this workspace serves, so changing it would take every live URL and certificate off the air.

Delete this workspace

Destroys every service and database in it, backups included, and its API key stops working. Its projects, teammates and billing history go with it. This cannot be undone.

Type — the workspace address — to confirm.

Spend cap

A monthly ceiling on what this account can spend. We email a heads-up at 80%, and at 100% your services are scaled to zero and deploys are blocked until you raise it. Nothing is deleted, and databases keep running.

USD / month

Leave it empty for no cap — nothing will stop this account from spending.

API key

Authenticates the CLI and the inference API. Only the last four characters are shown — enough to tell two keys apart, and nothing more. Rotating invalidates the old key immediately and signs other sessions on this account out.

–
Shown once, when you make it.
New key (shown once — copy it now):

Actions

Remedies proposed by an agent or by the platform's playbooks, waiting for a person. Approving runs the action through the same audited route you would use yourself, as the agent that proposed it. Nothing here has run until it says so.

WhenByActionTargetStatus

Platform (operator)

Sign-up trial

Loading…

Applies to accounts created from now on — existing trials are untouched. When a trial runs out (spent or expired) that account's services scale to zero and the URL says so; nothing is deleted, and a card or credit brings it back. Switching this off stops new grants only.

Plan pricing

Loading…

What each plan is quoted and billed at: this monthly amount, prorated from the day an account joined, plus their metered usage. 0 publishes no price — the picker shows “Talk to us”. Changes apply to the next statement close, never retroactively.

Abuse limits

Loading…

Takes effect immediately — no restart. 0 uses the platform default, -1 disables a limit. Sign-ups/hour/IP also caps magic-link sign-in requests, so raise it before a group signs in from one office network.

Adopt a pre-existing database

Registers a hand-deployed CNPG cluster so it appears on the canvas, reports status, and bills — used for migrations. Creates nothing.

Grant credit

Loading…

Real money, not trial credit: it never expires, it draws down after any trial balance, and it puts the account on its plan's resource tier the same as a card would. A negative amount posts a correction instead. Give a reference for anything with an external record (a bank transfer id) — the same reference can only be applied once, so a double-click or a retried request cannot double-credit. Every grant lands in the account's ledger and the audit log, and a top-up restores an account that had been scaled to zero for running out.

Clusters

NameProviderNodesStatusDedicated toProfile

Agents

Scoped keys for an automation that reads incidents and proposes or runs remedies. An agent is refused on every route its scopes do not name — the money, tenancy and cluster routes are on no list. Every scope proposes by default; name a scope under auto to let its actions run without approval. docs/runbook/agent.md.

AgentWorkspaceScopes (auto marked *)Created

New agent key (shown once — copy it now):

Playbooks

What the platform proposes on its own when an alert names a condition with a known remedy. Each proposes by default; switch one to auto only after it has been watched on real alerts.

ActionWhenMode

Accounts

AccountPlanUsersMTD USDCreditTrialAvailable

    You operate this one. Shebaka does not back it up, cannot restore it, and will not fail it over — that is what managed Postgres and MySQL are for.

    Import a compose file

    Services with a build: are built from this repository — which is what compose itself would do, and the only thing that works when the file's image: is a private package.

    A pasted file can only pull images — there is no source to build from. Import from the repository for anything with a build:.

    
        

    Build log

    
          

    Deploy timeline

      Loading…

      One KEY=VALUE per line. Prefix a line with ! to make it a secret: sent once over TLS, delivered to your app via a Kubernetes Secret, and masked everywhere afterwards — it never appears in build logs. Saving triggers a rebuild & redeploy.

      Disaster recovery

      Loading…

      Configuration

      Service

      Port is the one your container listens on — change it here if the URL returns 502. Replicas are identical pods behind the one address; the health check (an HTTP path or tcp) makes a rollout wait until the process answers and restarts one that stops. Applying uses the current image with the new settings; no rebuild. Billing changes from the moment the change lands.

      Image

      Auto-deploy webhook

      
              

      Add it as a push webhook in your repo (Forgejo/GitHub → Settings → Webhooks). Rotating kills the old URL immediately.

      Connections & domains

      Database

      Attaching injects DATABASE_URL as a secret and redeploys the current image — no rebuild, and your other variables are kept. Picking “— none —” detaches and removes it.

      Custom domains

        Point an A/CNAME record at the platform edge; the TLS certificate issues on the first request after the domain is added.

        Project

        Groups this service with others on one canvas. Applies the current image — no rebuild.

        Danger zone

        This deletes the service, its namespace, and its URL — there is no undo. Type to confirm.

        postgres

        Database

        Patches the engine in place; one restart. Billed at the new size from the next statement window.

        Databases on this instance

        Several small databases on one instance, the way nineteen microservice databases sit on one RDS — one price, one backup stream, one restore unit. Attach a service with attach_db "<instance>/<name>"; it gets its own DB_NAME and DATABASE_URL.

        DatabaseOwnerAttach asAttached by

        Connection string

        Reachable from your apps on the same cluster; never exposed publicly.

        
            

        Attach to a service

        Redeploy a service with this database attached and DATABASE_URL is injected automatically:

        
            

        Backups

        Nightly logical dump at 03:00 UTC, 7-day weekday rotation, stored on a separate in-cluster volume. Protects against bad migrations and deletes — not yet off-node disaster recovery.

        DumpSizeTaken (UTC)

        Restoring overwrites this database's current data with the dump. Type the database name to confirm:

        
            

        Project

        Services attach databases from their own project only.

        Danger zone

        This destroys the database including its backups. Type to confirm.

        New project

          Advanced

          Private base registry (only if your Dockerfile's FROM line needs a login)

          Database

          Persistent disk (a volume this service keeps across deploys)

          or from your terminal: shebaka deploy
          A payment method (or credit balance) is needed before the first deploy — add a card under Usage.

          You operate this one. It runs as a private service on your cluster with a disk attached, reachable from your other services and from nowhere else. Shebaka does not back it up, cannot restore it, and will not fail it over — that is what managed Postgres and MySQL are for.

          Managed Postgres 18 (single instance) with nightly logical backups kept in-cluster. Honest limits: not yet replicated across nodes — protects against bad migrations and deletes, not hardware loss.

          or: shebaka db create <name> [--engine mysql]
          A payment method (or credit balance) is needed first — add a card under Usage.

          The name is also the project; the database is named after it.

          A payment method (or credit balance) is needed first — add a card under Usage.
          starting…

          Build log
          
                
          Open app See why — runtime logs