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 Archive Usage People Docs Settings
?
…

Getting started

    Hide it any time — Getting started in the sidebar brings it back where you left off.

    Projects

    Lowercase letters, digits and dashes; Enter creates it. 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/
      Enter saves · Esc cancels
      production

      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…

        Archive

        Loading…

        Usage

        –
        month to date
        –
        projected this month
        –
        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

        Move project… on the project canvas moves every member together: one stop, every original paused before any restore, and a verification step before any record moves. If it fails partway, everything stays paused and it says so loudly rather than half-moving your project.

        When a move fails

        Before the copy on the other cloud takes writes, the original is switched off (“fenced”) so two copies can never both take writes and drift apart. If a move fails after that point and cannot start the service again on its own, the service is paused: the canvas shows it in red, and its DR tab says why it stopped, that the data is safe, and offers Resume, which starts the database and then the service again where they already were.

        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. Full pricing details ↗

        Your limits

        Used / allowedWith a card

        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.

          Move to another cloud

          Every service and database moves together: everything pauses, the data is checked on arrival, then traffic switches over once.

          Show log

          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…

            Plain settings, one KEY=VALUE per line — anyone on the account can read these. Passwords and keys go in Secrets; a line pasted here as !KEY=value is moved there when you save. Saving redeploys.

            Write-only: a secret is sent once, stored encrypted, delivered through a Kubernetes Secret and never shown again — not here, not in build logs. To change one, replace it. Saving redeploys.

              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.

                Access

                Anyone with the URL will reach this service with no sign-in, on every one of its addresses. Your service no longer receives the signed-in person’s email, and search engines may index it. The rest of the cluster stays private. Type to confirm.

                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

                Resizes in place with one short restart. The new size is billed from the next statement.

                Databases on this instance

                Give each service its own database inside this one: one price and one set of backups for all of them. Connect a service to one and it gets its own 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

                A nightly copy at 03:00 UTC, kept for 7 days on a separate disk on the same server. Protects against bad migrations and deletes — not against losing the server.

                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 on one server, with a nightly copy kept on the same server. Protects against bad migrations and deletes — not against losing the server.

                  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