deploying-apps
Vercel
Here is an example of how to deploy express with vercel: https://github.com/vercel/examples/tree/main/solutions/express
How to use vercel
-
Install Vercel CLI globally if you haven't already:
npm install -g vercel -
Login to vercel with
vercel logincommand. -
Create a new project with
vercel devcommand. This will create a.verceldirectory in your project root.
Here's a quick summary of the core commands:
vercel dev: used to set up your vercel project, configure deployment settings, and start a local development server.vercel: used to deploy your project to the Vercel platform. It will automatically detect your project settings and deploy it to the cloud.vercel login: login to your vercel account usingvercel loginvercel switch: switch vercel team accountsvercel list: list all vercel projectsvercel link: Link existing vercel projects to your local codebase withvercel link
vercel command
Anytime you want to deploy your app, use the vercel --prod command.
{
"scripts": {
"deploy": "vercel --prod"
}
}
Then you can imply run npm run deploy to deploy your app.
Deploying different frameworks
Deploying React apps to vercel
When doing client side routing, you MUST have a vercel.json in the root of your project that specifies to redirect all requests to the index HTML:
{
"rewrites": [
{
"source": "/:path*",
"destination": "/index.html"
}
]
}
Express with vercel complete steup guide
Express with vercel adapts express routes to be serverless functions, which means on each request the server is instantly fired up from a cold start.
This is could lead to millions of requests easily, so build express apps for vercel keeping in mind techniques like pooling, and avoid global state in a server.
-
Create this
vercel.jsonpointing to the entrypoint of your express app.{
"version": 2,
"builds": [{ "src": "api/server.js", "use": "@vercel/node" }],
"routes": [
{
"src": "/(.*)",
"dest": "api/server.js"
}
]
} -
Create a basic express app in your entrypoint and make it a default export.
// api/server.js
import express from "express";
const app = express();
app.get("/", (req, res) => {
res.send("Hello World!");
});
export default app; -
Create a
package.jsonfile with a start script that begins your express server.{
"scripts": {
"start": "node api/server.js"
}
}
fly.io
You can easily deploy apps to fly.io with docker.
The first step is to add a fly.toml in the root of your project, adding any configuration and environment variables like so:
# fly.toml app configuration file generated for youtube-download-trimmer on 2025-04-05T09:42:26Z
#
# See https://fly.io/docs/reference/configuration/ for information about how to use this file.
#
app = 'youtube-download-trimmer'
primary_region = 'mad'
[build]
[http_service]
internal_port = 8080
force_https = true
auto_stop_machines = 'stop'
auto_start_machines = true
min_machines_running = 0
processes = ['app']
[env]
SERVER_MODE = "production"
PORT = "8080"
VITE_API_URL_DEV = "http://localhost:8080"
VITE_API_URL_PRODUCTION = "https://youtube-download-trimmer.fly.dev"
[[vm]]
memory = '1gb'
cpu_kind = 'shared'
cpus = 1
memory_mb = 1024
IMPORTANT
Make sure your app runs on port 8080 otherwise it will not work.
Here is an example of the docker file used:
FROM node:20-alpine
# 1. essential downloads
RUN apk update
RUN apk add bash
RUN apk add curl
RUN apk --no-cache add ca-certificates wget
RUN wget -q -O /etc/apk/keys/sgerrand.rsa.pub https://alpine-pkgs.sgerrand.com/sgerrand.rsa.pub
RUN wget https://github.com/sgerrand/alpine-pkg-glibc/releases/download/2.28-r0/glibc-2.28-r0.apk
RUN apk add --no-cache --force-overwrite glibc-2.28-r0.apk
# 2. install bun
RUN npm install -g bun
# 3. install python, ffmpeg, and yt-dlp
RUN apk add --no-cache python3 py3-pip
RUN apk add --no-cache ffmpeg
RUN apk -U add yt-dlp
# 4. install dependencies
WORKDIR /usr/src/app
COPY package*.json ./
COPY bun.lock ./
RUN bun install
# 5. copy app code, install frontend dependencies.
COPY . .
RUN npm install --prefix frontend
# 6. run app
EXPOSE 8080
CMD ["bun", "start"]