Back to Blog
Tutorial May 5, 2026 18 min read

How to Deploy Your App to Chajio Cloud

If you have been looking for a simple way to get your web application live without worrying about servers, configurations, or SSL certificates, Chajio Cloud is built exactly for that. Whether you are shipping a Python API, a Node.js backend, or a React frontend, this guide walks you through every step from signing up to watching your app go live with real code examples you can follow along with.

What Is Chajio Cloud?

Chajio Cloud is a Platform-as-a-Service (PaaS) that takes care of the heavy lifting so you can focus entirely on writing code. You connect your GitHub repository, point it at your app, and Chajio Cloud handles the rest: cloning your code, detecting what language you are using, installing dependencies, building a container, routing traffic, and issuing SSL certificates, all automatically.

You do not touch a server. You do not write deployment scripts. You push code to GitHub and your app updates.

Plans and What Each One Gets You

Before signing up, it helps to know what plan fits your needs. Chajio Cloud currently offers three tiers:

Starter

Designed for solo developers running a single project. One application slot, up to 30 deployments per month, community support, and one custom domain. More than enough for a personal project or a side hustle in early stages.

Professional

For growing projects or small teams. Two applications simultaneously, 75 deployments per month, up to three team members and two custom domains.

Business

For teams shipping seriously. Three applications, 150 deployments per month, up to five team members, three custom domains, and priority support. Includes advanced features like rollbacks and staging environments.

All plans include automatic SSL, real-time build logs, environment variable management, and auto-deploy on git push.

Step 1 — Signing Up

Accounts on Chajio Cloud are created through the billing portal. When you purchase a plan, the system provisions your account automatically. Within a few minutes of your payment being confirmed, you will receive a welcome email containing your login credentials and the link to your dashboard.

Step 2 — Logging In and Exploring the Dashboard

Open the portal URL from your welcome email and log in. The dashboard is clean and task-focused. On the left you will see navigation for Applications, Deployments, Databases, GitHub, and Settings.

Applications

Create and manage your deployed projects.

Deployments

History of every build — successful or otherwise — along with real-time logs.

Databases

Spin up managed PostgreSQL, MySQL, Redis, or MongoDB instances alongside your apps.

GitHub

Connect your account and manage repository access.

Settings

Profile, password, and team members.

Step 3 — Connecting Your GitHub Account

Everything on Chajio Cloud deploys from a GitHub repository, so the first thing you need to do is connect your GitHub account. Click GitHub in the sidebar, then click Connect GitHub. You will be redirected to GitHub where you will be asked to authorize Chajio Cloud's application. This grants the platform read access to your repositories so it can clone your code at deployment time.

You only need to do this once. Once your account is linked, all your repositories and branches are available when creating applications.

Step 4 — Deploying Your First Application

Click Deploy New Application from the dashboard. You will see a form with the following fields:

Name

A label for your app inside the dashboard, for example my-api or portfolio-site.

GitHub Repository

Pick from a dropdown of your connected repos.

Branch

The branch you want to deploy, defaulting to main.

Build Pack

Either default (automatic language detection) or dockerfile (if you have your own Dockerfile).

Port

The port your application listens on.

Custom Domain

Optional — add it now or later.

Auto-deploy

When toggled on, every push to your selected branch triggers a new deployment automatically.

Environment Variables

Key-value pairs that get injected into your container at runtime.

Fill in the form for your app, click Create, and your first deployment starts immediately. The platform clones your repository, detects your language, installs dependencies, builds a container image, and starts routing traffic, all without you doing anything else.

Deploying a Python Application (Flask / FastAPI)

Your repository needs a requirements.txt file at the root. Auto deploy detects this file and automatically sets up a Python environment, installs your dependencies, and runs your application.

Here is a minimal Flask application:

requirements.txt

flask==3.0.0
gunicorn==21.2.0

app.py

from flask import Flask, jsonify
import os

app = Flask(__name__)

@app.route("/")
def home():
    return jsonify({"message": "Hello from Chajio Cloud!", "status": "running"})

@app.route("/health")
def health():
    return jsonify({"status": "ok"})

if __name__ == "__main__":
    port = int(os.environ.get("PORT", 8000))
    app.run(host="0.0.0.0", port=port)

Important

Notice host="0.0.0.0" — this is required. If your app binds to localhost or 127.0.0.1, the platform's traffic router cannot reach it and your deployment will show as failed even though the app started successfully.

In the dashboard, set:

Build Pack: default

Port: 8000

Environment variables:

FLASK_ENV=production
SECRET_KEY=replace-with-a-long-random-string

For FastAPI, the setup is nearly identical. Replace the requirements:

fastapi==0.110.0
uvicorn==0.27.0

Deploying a Node.js Application (Express)

Node.js applications are detected by the presence of a package.json file. Auto deploy reads it, runs npm install, and uses your start script to boot the app.

package.json

{
  "name": "my-api",
  "version": "1.0.0",
  "scripts": {
    "start": "node index.js",
    "build": "echo 'No build step required'"
  },
  "dependencies": {
    "express": "^4.18.2",
    "dotenv": "^16.3.1"
  }
}

index.js

const express = require("express");
const app = express();

const PORT = process.env.PORT || 3000;

app.use(express.json());

app.get("/", (req, res) => {
  res.json({ message: "Hello from Chajio Cloud!", status: "running" });
});

app.get("/health", (req, res) => {
  res.json({ status: "ok" });
});

app.listen(PORT, "0.0.0.0", () => {
  console.log(`Server running on port ${PORT}`);
});

In the dashboard, set:

Build Pack: default

Port: 3000

Environment variables:

NODE_ENV=production
PORT=3000
DATABASE_URL=postgresql://user:password@host:5432/mydatabase

For a TypeScript Node.js app, add a build step:

package.json (TypeScript)

{
  "scripts": {
    "build": "tsc",
    "start": "node dist/index.js"
  },
  "devDependencies": {
    "typescript": "^5.0.0",
    "@types/express": "^4.17.21",
    "@types/node": "^20.0.0"
  }
}

Auto deploy detects the build script, runs it first, then starts with your start script. No extra configuration needed.

Deploying a React Application

React is a frontend framework that compiles to static files. After the build, you need a small HTTP server to serve those files. The recommended approach is to use the serve package.

package.json

{
  "name": "my-react-app",
  "version": "1.0.0",
  "scripts": {
    "build": "vite build",
    "start": "npx serve dist -l 3000"
  },
  "dependencies": {
    "react": "^18.2.0",
    "react-dom": "^18.2.0"
  },
  "devDependencies": {
    "vite": "^5.0.0",
    "@vitejs/plugin-react": "^4.0.0",
    "serve": "^14.2.0"
  }
}

Critical note on React environment variables

Variables like API URLs need to be prefixed with VITE_ (Vite projects) or REACT_APP_ (Create React App). These values are baked into your JavaScript bundle at build time, not injected at runtime. If you update an environment variable, you must trigger a new deployment for the change to take effect.

Environment variables:

VITE_API_URL=https://api.yourapp.com
VITE_APP_NAME=My Awesome App

Using them in your code

const apiUrl = import.meta.env.VITE_API_URL;

fetch(`${apiUrl}/api/users`)
  .then(res => res.json())
  .then(data => console.log(data));

Using a Custom Dockerfile

If your app has specific system-level dependencies, uses an unusual runtime, or you simply prefer full control over the build environment, you can provide your own Dockerfile. Set the Build Pack to dockerfile in the dashboard form, and Chajio Cloud will use your file instead of Auto deploy.

Node.js multi-stage build

# Build stage
FROM node:20-alpine AS builder

WORKDIR /app
COPY package*.json ./
RUN npm ci
COPY . .
RUN npm run build

# Production stage
FROM node:20-alpine AS production

WORKDIR /app
COPY package*.json ./
RUN npm ci --production
COPY --from=builder /app/dist ./dist

EXPOSE 3000
CMD ["node", "dist/index.js"]

Python with system dependencies

FROM python:3.12-slim

RUN apt-get update && apt-get install -y \
    libpq-dev \
    gcc \
    && rm -rf /var/lib/apt/lists/*

WORKDIR /app
COPY requirements.txt .
RUN pip install --no-cache-dir -r requirements.txt
COPY . .

EXPOSE 8000
CMD ["gunicorn", "app:app", "--bind", "0.0.0.0:8000", "--workers", "2"]

Managing Environment Variables

Environment variables are secrets and configuration values your app needs at runtime — database credentials, API keys, feature flags, and so on. You never hardcode these in your source code.

On the application detail page, go to the Environment Variables tab and add each variable as a key-value pair:

DATABASE_URL      postgresql://user:pass@host:5432/mydb
REDIS_URL         redis://host:6379
API_SECRET_KEY    a-long-random-secret-string
SMTP_HOST         smtp.mailprovider.com
SMTP_PORT         587
NODE_ENV          production

These are injected into your container at startup. Your application reads them with os.environ.get("DATABASE_URL") in Python or process.env.DATABASE_URL in Node.js.

After adding or changing variables, you need to trigger a new deployment. Variables do not hot-reload into a running container.

Adding a Custom Domain and SSL

By default, your app is accessible on a Chajio Cloud subdomain immediately after deployment. To use your own domain, go to your application's detail page and enter your domain name — for example, myapp.example.com.

Then log in to your DNS provider and add a record pointing to the Chajio Cloud server. For a subdomain, use a CNAME record. For a root domain like example.com, use an A record with the server's IP address provided in your dashboard or welcome email.

SSL is completely automatic. The moment your DNS record propagates and Chajio Cloud can verify domain ownership, it requests a certificate from Let's Encrypt. The certificate is installed, HTTP traffic is redirected to HTTPS, and renewal happens in the background well before the certificate expires. You never think about certificates again.

DNS propagation can take anywhere from a few minutes to 48 hours depending on your provider and TTL settings.

Adding a Managed Database

Go to Databases in the sidebar and click Create Database. Choose from:

PostgreSQL

The most common choice for relational data.

MySQL / MariaDB

Widely used in PHP and legacy stacks.

Redis

For caching, sessions, or queues.

MongoDB

For document storage.

After creation, your connection string is shown. Copy it immediately — for security reasons it is only displayed once. Add it to your application as an environment variable. The connection is internal to the platform and does not traverse the public internet.

Auto-Deploy: Ship Without Leaving Your Editor

When you enable Auto-deploy on an application, Chajio Cloud watches the configured branch for new commits. Any push to that branch — whether it is from you, a collaborator, or a merged pull request automatically triggers a deployment.

Your full workflow

# Make your changes locally
git add .
git commit -m "feat: add user authentication"
git push origin main

# That's it. Chajio Cloud picks it up and deploys automatically.

Deployment Limits and Upgrading Your Plan

Each plan comes with a monthly deployment count: Starter allows 30, Professional allows 75, and Business allows 150. The counter resets at the start of each billing cycle. If you hit the limit before the cycle ends, new deployments are blocked and the dashboard will notify you and prompt you to upgrade. Upgrading through the billing portal instantly increases your limits. No redeployment or downtime required.

Common Issues and How to Fix Them

Deployment fails immediately after starting

Check that your app binds to 0.0.0.0 and not localhost. This is the single most common cause of failed deployments on container-based platforms.

Port mismatch

The port you enter in the dashboard must match the port your app actually listens on. If your Express server listens on port 4000 but you entered 3000, traffic will never reach your app and health checks will fail.

React environment variables not working

VITE_ or REACT_APP_ variables are compiled into the bundle. If you change them, you must trigger a new deployment. Restarting the app without rebuilding will not pick up the new values.

Build fails with dependency errors

Check that your package.json or requirements.txt includes all the packages your app needs. Dependencies that exist only on your local machine but are not in your lock file will cause build failures.

Custom domain not working yet

DNS propagation takes time. After adding your domain to the dashboard and updating your DNS records, wait at least 15–30 minutes. You can use an online DNS checker to see if your records have propagated globally.

Monthly deployment limit reached

Upgrade your plan through the billing portal or wait for your billing cycle to reset. The dashboard shows how many deployments you have used and how many remain.

Summary

Chajio Cloud removes the operational complexity from deploying web applications. You write code, push to GitHub, and your app is live with HTTPS, custom domains, environment variable management, managed databases, and real-time build logs all included.

The workflow in its simplest form is:

  1. Sign up and receive your credentials.
  2. Log in to the dashboard.
  3. Connect your GitHub account.
  4. Click Deploy New Application, fill in the form, and create.
  5. Watch the build logs as your app comes to life.
  6. Add your custom domain and environment variables.
  7. Enable auto-deploy so every git push ships your latest code.

Whether you are shipping a Python API, a Node.js backend, a React frontend, or anything else, the process is the same. Chajio Cloud handles the infrastructure so you can spend your time building features instead of managing servers.

Ready to get started?

Purchase a plan and your account will be ready within minutes.

View App Hosting Plans