Skip to content

Self-Service App Hosting Portal

DifficultyAdvanced
Team Size3-5 people
Time~40-50 hours
Demo-ready byStep 5
PrerequisitesNode.js, Docker, Git, CI/CD concepts
Built byVercel, Netlify, Railway, Render

Skills you'll earn: Git webhook integration, container builds, preview deployments, rollback systems, environment management

Start by deploying a static site from a git push. End with a Vercel-like platform with preview deployments, rollbacks, environment variables, and audit logging.

Step 1: Deploy a static site from a git repository (~3-4 hours)

The simplest deployment: clone and serve.

  • Accept a git repo URL via an API call
  • Clone the repo, copy the files to an Nginx serving directory
  • Assign a subdomain: <app>.hosting.local
  • Configure Nginx to serve the directory at that subdomain

You now have: Git-to-deploy for static sites.

Step 2: Build step (~4-5 hours)

Most apps need a build before they can be served.

  • Detect the project type (look for package.json, requirements.txt, etc.)
  • Run the build inside a Docker container for isolation
  • Capture build logs and stream them back to the user
  • Serve the build output, not the raw source

You now have: Build-and-deploy pipeline.

Step 3: Git webhook integration (~4-5 hours)

Manually triggering deploys is tedious.

  • Set up a webhook endpoint that GitHub or Gitea can call on push
  • On push to main, trigger a new deployment automatically
  • On push to any other branch, create a preview deployment at <branch>-<app>.hosting.local
  • Show deployment status as a commit status check

You now have: Automatic deploys on push.

Step 4: Deployment history and rollbacks (~4-5 hours)

The latest deploy broke production.

  • Store every deployment: commit hash, timestamp, build logs, status, artifact path
  • Keep previous build artifacts (at least the last 5)
  • Add a "rollback" action that re-points the serving directory to a previous artifact
  • Show deployment history in the dashboard

You now have: Instant rollbacks.

Step 5: Environment variables and secrets (~3-4 hours)

Apps need config that shouldn't live in git.

  • Store env vars per app, encrypted at rest
  • Inject them into the build container and the runtime environment
  • UI for managing env vars (add, edit, delete, mark as secret)
  • Secrets are write-only in the UI (shown as •••••• after creation)

You now have: Secure configuration management.

Step 6: Custom domains and TLS (~4-5 hours)

  • Let users add custom domains, configure DNS CNAME instructions
  • Auto-provision TLS certificates with Let's Encrypt via ACME
  • Nginx config auto-generated per domain

Step 7: Audit logging and team access (~3-4 hours)

  • Log every action: who deployed, who rolled back, who changed env vars
  • Team support: invite collaborators with role-based access (admin, deployer, viewer)
  • API key auth for CI/CD integration

Useful Resources

Where to go from here

  • Serverless function support (API routes alongside static sites)
  • Edge caching and CDN layer
  • Usage analytics per app (requests, bandwidth, errors)
  • Monorepo support (detect and deploy sub-projects)
  • Scheduled deployments (deploy at a specific time)