Skip to content

Deploy Local Projects

Deploy any local project to your server with a single click.

Quick Deploy

  1. Open the Projects tab
  2. Find your project
  3. Click Deploy to Cloud
  4. Configure the deployment
  5. Click Deploy

Deployment Configuration

Subdomain

Choose a subdomain for your deployment:

  • Must be unique among your deployments
  • Same rules as tunnel subdomains
  • Example: myappmyapp.hosted.yourdomain.com

Dockerfile

Expose can:

Use Existing Dockerfile If your project has a Dockerfile, Expose uses it as-is.

Generate Dockerfile If no Dockerfile exists, Expose generates one based on your framework:

# Generated for FastAPI
FROM python:3.12-slim
WORKDIR /app
COPY requirements.txt .
RUN pip install --no-cache-dir -r requirements.txt
COPY . .
EXPOSE 8000
CMD ["uvicorn", "main:app", "--host", "0.0.0.0", "--port", "8000"]

You can edit the generated Dockerfile before deploying.

Environment Variables

Add configuration:

VariableValue
DATABASE_URLpostgres://...
SECRET_KEYyour-secret

Variables are:

  • Encrypted in the database
  • Available during build (ARG)
  • Available at runtime (ENV)

Supported Frameworks

Node.js

FrameworkDockerfile Strategy
Next.jsMulti-stage build, standalone output
NuxtMulti-stage build
Vite/React/VueBuild to static, nginx serve
ExpressNode runtime, npm start
NestJSMulti-stage, dist output

Python

FrameworkDockerfile Strategy
FastAPIPython slim, uvicorn
DjangoPython, gunicorn, collectstatic
FlaskPython, gunicorn
StreamlitPython, streamlit run

Go

All Go frameworks use multi-stage builds:

  1. Build with golang:1.22
  2. Run on scratch or alpine

Rust

Multi-stage build:

  1. Build with rust:1.77
  2. Run on debian:bookworm-slim

Source Packaging

When you deploy, Expose:

  1. Creates a tar.gz of your project
  2. Respects .dockerignore (or uses sensible defaults)
  3. Uploads to the server
  4. Extracts and builds

Default Ignores

If no .dockerignore exists:

Node.js
node_modules/
.next/
dist/
.env*
# Python
__pycache__/
.venv/
venv/
.env*
# General
.git/
.DS_Store
*.swp

Custom .dockerignore

Create a .dockerignore for fine-grained control:

# Ignore test files
tests/
*.test.js
# Ignore dev configs
.eslintrc
.prettierrc
# Keep .env.example
!.env.example

Deployment Progress

Watch the deployment process:

  1. Packaging — Creating archive
  2. Uploading — Sending to server
  3. Building — Docker build running
  4. Pushing — Storing image in registry
  5. Starting — Running container
  6. Running — Deployment complete

After Deployment

Once deployed:

  • View at https://subdomain.hosted.yourdomain.com
  • Check logs in the macOS app
  • Monitor in the dashboard

Updating

To deploy changes:

  1. Make changes locally
  2. Go to the deployment
  3. Click Redeploy
  4. New build starts

Or use Git deployment with webhooks for automatic updates.

Tips

Test Locally First

Terminal window
# Build the Dockerfile locally
docker build -t myapp .
# Run and test
docker run -p 3000:3000 myapp

Use .dockerignore

Smaller archives = faster uploads and builds.

Set PORT Environment Variable

Many frameworks read PORT. Expose sets it automatically, but you can override it in environment variables.