DinD HostingManual
Overview/Manual/Start here
CHAPTER 02

Quick start

A login, a project and an archive are all you need. Pick the path that suits you; all three end at the same live site.

Before you begin#

You need three things from whoever runs the platform:

  • the address of the console (for example https://hosting.example.com, or http://10.10.10.10:8900 on the host network);
  • an account — an email and a password (admins create accounts; there is no sign-up page);
  • the base domain your projects should live under (your sites become <slug>.<alias>.<base_domain>).

And something to deploy. The smallest possible site is one file:

index.html
<!doctype html>
<meta charset="utf-8">
<title>Hello from DinD Hosting</title>
<h1>It works.</h1>

No platform.yaml needed

The runtime is detected from your files: package.json → node, requirements.txt / pyproject.toml → python, composer.json or public/index.php → php, index.html → static.

Choose your path#

  1. Sign in. Open the console address and enter your email and password. The top bar shows projects and tokens (admins also see users, metrics and platform). The language selector in the top bar — and on the login page — switches the console between English and Ukrainian; your choice is remembered, and until you make one the browser's language is used.
    hosting.example.com/login
    sign in
    The sign-in page. The language selector sits at the top right — here and in the top bar of every other page.
  2. Create a project. On Projects click + new project. Give it a slug (hello), a display name and the base domain — the hint under the field says it: sites become slug.alias.domain.
  3. Pack your source. Zip or tar the folder (not the folder's parent): tar czf site.tgz index.html or zip -r site.zip .
  4. Deploy. Open the project, stay on the Deploy tab, choose archive upload, pick the file and press deploy. The new deployment appears in the list — open its build log to follow the pipeline live.
  5. Open the site. When the deployment turns running the app is up. Check Domains: the pre-check should be passed, then the certificate issued.
hosting.example.com/projects/7
Deploy
The Deploy tab: (1) pick the source type, (2) press deploy, (3) watch the status move from queued through building to running.
bash
BASE=https://hosting.example.com        # your console address

# 1 · log in — the response contains a JWT valid for 8 hours
TOKEN=$(curl -fsS -X POST "$BASE/api/v1/auth/login" \
  -H 'Content-Type: application/json' \
  -d '{"email":"you@example.com","password":"…"}' | python3 -c 'import json,sys;print(json.load(sys.stdin)["token"])')

# 2 · create the project (returns its numeric id)
PID=$(curl -fsS -X POST "$BASE/api/v1/projects" \
  -H "Authorization: Bearer $TOKEN" -H 'Content-Type: application/json' \
  -d '{"slug":"hello","display_name":"Hello","base_domain":"example.com"}' \
  | python3 -c 'import json,sys;print(json.load(sys.stdin)["id"])')

# 3 · upload the archive (multipart field name: file)
UPLOAD=$(curl -fsS -X POST "$BASE/api/v1/projects/$PID/uploads" \
  -H "Authorization: Bearer $TOKEN" -F file=@site.tgz \
  | python3 -c 'import json,sys;print(json.load(sys.stdin)["upload_id"])')

# 4 · start the deployment (202 Accepted) and follow its log
curl -fsS -X POST "$BASE/api/v1/projects/$PID/deployments" \
  -H "Authorization: Bearer $TOKEN" -H 'Content-Type: application/json' \
  -d "{\"source\":{\"type\":\"archive\",\"upload_id\":\"$UPLOAD\"}}"

Deployments run in the background. Poll GET /api/v1/projects/$PID/deployments until the newest one is running, or stream the log from GET /api/v1/deployments/{id}/logs?stream=1.

Create a token on the tokens page, then connect your agent once:

bash
claude mcp add --transport http dind-platform https://hosting.example.com/mcp/ \
  --header "Authorization: Bearer dt_…"

Now describe the outcome and let the agent call the tools:

YouCreate a project “hello” on example.com and deploy the folder ./site.
create_project(slug="hello", display_name="Hello", base_domain="example.com") → id 7 · hello.alex.example.com
upload_archive(project=7, filename="site.tgz", content_base64="…") → upload_id 3f0c…e1.tgz
deploy_app(project=7, source_type="archive", upload_id="3f0c…e1.tgz") → deployment #1 queued
list_deployments(project=7) → #1 running · domain_status(project=7) → pre-check passed · certificate issued
AgentDone — deployment #1 is running and the certificate is issued. Your site is live at https://hello.alex.example.com.

The tools involved are create_project, upload_archive (or create_upload_url for big archives), deploy_app, list_deployments and get_logs. See API tokens, REST & MCP.

What just happened#

Browserhttps://blog.alex…1DNSA record → LB IP2Host ingressproxy / nftables3dind-hosting10.10.10.10 :4434Traefikmatch Host(…)5Child DinD172.28.0.64:100006Appapp-blog7The visitor asks forblog.alex.example.comThe name resolves to theaddress of your ingressYou decide: forward:80/:443 to 10.10.10.10The only host-facingaddress; nothing publishedTerminates TLS, picks theroute file for that HostNetwork-host: the app is onthe daemon’s own IP + portListens on 0.0.0.0:$PORTinside that daemon
From a visitor's browser to your app container. Steps 1–3 are DNS and your ingress, 4–7 happen inside dind-hosting.

When you pressed deploy the platform (1) unpacked your archive, (2) read platform.yaml or detected the runtime, (3) rendered a Dockerfile for that runtime, (4) built the image inside your daemon, (5) started the container on a free port, (6) wrote a Traefik route for hello.<alias>.<base_domain> and (7) checked DNS and routing before requesting a certificate.

Next steps#