Advanced
Deployment
Deploy your CanxJS application to production with Docker, VPS, or cloud platforms.
VPS/Bare Metal
Deploy with systemd and nginx
Docker
Containerized deployment
Cloud Platforms
Railway, Fly.io, Render
Edge Ready
Deploy to edge networks
Production Build
terminal
1# Build for production2bun build ./src/index.ts --outdir ./dist --target bun --minify34# Or use the CLI5bunx canx build
Environment Configuration
canx.config.ts
1// canx.config.ts2export default {3port: parseInt(process.env.PORT || "3000"),4hostname: process.env.HOST || "0.0.0.0",5development: process.env.NODE_ENV !== "production",67database: {8driver: "mysql",9host: process.env.DB_HOST,10port: parseInt(process.env.DB_PORT || "3306"),11database: process.env.DB_NAME,12username: process.env.DB_USER,13password: process.env.DB_PASSWORD,14},1516cors: {17origin: process.env.CORS_ORIGIN?.split(",") || false,18}19};
.env.production
1# .env.production2NODE_ENV=production3PORT=30004HOST=0.0.0.056# Database7DB_HOST=localhost8DB_PORT=33069DB_NAME=myapp10DB_USER=myapp11DB_PASSWORD=secret1213# Security14JWT_SECRET=your-super-secret-key15CORS_ORIGIN=https://example.com1617# Optional18LOG_LEVEL=info
Docker Deployment
Dockerfile
1# Dockerfile2FROM oven/bun:1 AS base3WORKDIR /app45# Install dependencies6FROM base AS deps7COPY package.json bun.lockb ./8RUN bun install --frozen-lockfile --production910# Build11FROM base AS build12COPY package.json bun.lockb ./13RUN bun install --frozen-lockfile14COPY . .15RUN bun build ./src/index.ts --outdir ./dist --target bun --minify1617# Production18FROM base AS runner19ENV NODE_ENV=production20COPY --from=deps /app/node_modules ./node_modules21COPY --from=build /app/dist ./dist22COPY --from=build /app/package.json ./2324EXPOSE 300025CMD ["bun", "run", "./dist/index.js"]
docker-compose.yml
1# docker-compose.yml2version: "3.8"34services:5app:6build: .7ports:8- "3000:3000"9environment:10- NODE_ENV=production11- DB_HOST=db12- DB_PORT=330613- DB_NAME=myapp14- DB_USER=myapp15- DB_PASSWORD=secret16depends_on:17- db1819db:20image: mysql:821environment:22- MYSQL_DATABASE=myapp23- MYSQL_USER=myapp24- MYSQL_PASSWORD=secret25- MYSQL_ROOT_PASSWORD=rootsecret26volumes:27- mysql_data:/var/lib/mysql2829volumes:30mysql_data:
VPS Deployment
canxjs.service
1# /etc/systemd/system/canxjs.service2[Unit]3Description=CanxJS Application4After=network.target56[Service]7Type=simple8User=www-data9WorkingDirectory=/var/www/myapp10ExecStart=/root/.bun/bin/bun run dist/index.js11Restart=on-failure12RestartSec=1013Environment=NODE_ENV=production1415[Install]16WantedBy=multi-user.target1718# Enable and start19# sudo systemctl enable canxjs20# sudo systemctl start canxjs
nginx.conf
1# /etc/nginx/sites-available/myapp2upstream canxjs {3server 127.0.0.1:3000;4keepalive 64;5}67server {8listen 80;9server_name example.com;10return 301 https://$server_name$request_uri;11}1213server {14listen 443 ssl http2;15server_name example.com;1617ssl_certificate /etc/letsencrypt/live/example.com/fullchain.pem;18ssl_certificate_key /etc/letsencrypt/live/example.com/privkey.pem;1920location / {21proxy_pass http://canxjs;22proxy_http_version 1.1;23proxy_set_header Upgrade $http_upgrade;24proxy_set_header Connection "upgrade";25proxy_set_header Host $host;26proxy_set_header X-Real-IP $remote_addr;27proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;28proxy_set_header X-Forwarded-Proto $scheme;29}30}
Health Checks
health.ts
1import { createApp, healthCheck } from "canxjs";23const app = createApp({ port: 3000 });45// Health check endpoint6app.get("/health", healthCheck({7checks: [8{ name: "database", check: async () => await db.ping() },9{ name: "redis", check: async () => await redis.ping() }10]11}));1213// Returns: { status: "healthy", checks: [...], uptime: 12345 }