Deployment
Deploy MikroMeet to various platforms and environments.
Pre-Deployment Checklist
Section titled “Pre-Deployment Checklist”Before deploying to production:
- Configure HTTPS/WSS
- Set up TURN server
- Update
config.jsonwith production URLs - Set strong TURN credentials
- Configure firewall rules
- Test from different networks
Deployment Methods
Section titled “Deployment Methods”Release Archives
Section titled “Release Archives”Download and extract the app and API archives:
curl -sSL -o mikromeet_app.zip https://releases.mikrosuite.com/mikromeet_app_latest.zipcurl -sSL -o mikromeet_api.zip https://releases.mikrosuite.com/mikromeet_api_latest.zipunzip mikromeet_app.zip -d mikromeet_appunzip mikromeet_api.zip -d mikromeet_apiDocker
Section titled “Docker”Create a Dockerfile beside the extracted API files:
FROM node:24-slimWORKDIR /appCOPY . .EXPOSE 3000CMD ["node", "mikromeet.mjs"]docker build -t mikromeet .
docker run -d \ -p 3000:3000 \ --name mikromeet \ -e TURN_SERVER_URL=turn:turn.yourdomain.com:3478 \ -e TURN_SERVER_USERNAME=mikromeet \ -e TURN_SERVER_CREDENTIAL=your-password \ mikromeetLinux Server (Systemd)
Section titled “Linux Server (Systemd)”Copy and edit the systemd service:
# Copy example service filesudo cp mikromeet.service.example /etc/systemd/system/mikromeet.service
# Edit paths and environmentsudo nano /etc/systemd/system/mikromeet.service
# Enable and startsudo systemctl daemon-reloadsudo systemctl enable mikromeetsudo systemctl start mikromeetsudo systemctl status mikromeetExample service file for a release archive deployment:
[Unit]Description=MikroMeet ServerAfter=network.target
[Service]Type=simpleUser=mikromeetWorkingDirectory=/opt/mikromeetEnvironment="NODE_ENV=production"Environment="MIKROMEET_PORT=3000"Environment="TURN_SERVER_URL=turn:turn.yourdomain.com:3478"ExecStart=/usr/bin/node /opt/mikromeet/mikromeet.mjsRestart=on-failure
[Install]WantedBy=multi-user.targetCloud Platforms
Section titled “Cloud Platforms”Heroku
Section titled “Heroku”Upload the extracted API archive with a Node start command of node mikromeet.mjs, then set TURN_SERVER_URL, TURN_SERVER_USERNAME, and TURN_SERVER_CREDENTIAL as environment variables.
Fly.io
Section titled “Fly.io”Use the extracted API archive as the app directory, set node mikromeet.mjs as the start command, and add TURN settings as Fly secrets.
DigitalOcean App Platform
Section titled “DigitalOcean App Platform”- Upload the extracted API archive or configure your platform to use it.
- Configure run command:
node mikromeet.mjs. - Add environment variables in the dashboard
- Deploy.
Static Frontend Hosting
Section titled “Static Frontend Hosting”For separate frontend/backend deployment:
Cloudflare Pages
Section titled “Cloudflare Pages”Upload the extracted app archive to Cloudflare Pages.
Netlify
Section titled “Netlify”Upload the extracted app archive to Netlify.
Vercel
Section titled “Vercel”Upload the extracted app archive to Vercel.
AWS S3 + CloudFront
Section titled “AWS S3 + CloudFront”# Upload to S3aws s3 sync mikromeet_app/*/ s3://your-bucket-name/ --delete
# Invalidate CloudFront cacheaws cloudfront create-invalidation --distribution-id YOUR_ID --paths "/*"Reverse Proxy Setup
Section titled “Reverse Proxy Setup”Caddy auto-handles HTTPS:
yourdomain.com { # Serve static files root * /var/www/mikromeet file_server
# WebSocket proxy @websocket { path /ws } reverse_proxy @websocket 127.0.0.1:3000
# API proxy reverse_proxy /api/* 127.0.0.1:3000}Reload:
sudo systemctl reload caddyFull example with HTTPS:
# HTTP -> HTTPS redirectserver { listen 80; server_name yourdomain.com; return 301 https://$server_name$request_uri;}
# HTTPS serverserver { listen 443 ssl http2; server_name yourdomain.com;
# SSL certificates ssl_certificate /etc/letsencrypt/live/yourdomain.com/fullchain.pem; ssl_certificate_key /etc/letsencrypt/live/yourdomain.com/privkey.pem; ssl_protocols TLSv1.2 TLSv1.3;
# WebSocket upgrade location /ws { proxy_pass http://127.0.0.1:3000; proxy_http_version 1.1; proxy_set_header Upgrade $http_upgrade; proxy_set_header Connection "upgrade"; proxy_set_header Host $host; proxy_set_header X-Real-IP $remote_addr; }
# API endpoints location /api/ { proxy_pass http://127.0.0.1:3000; proxy_set_header Host $host; proxy_set_header X-Real-IP $remote_addr; }
# Static files (if serving frontend from Nginx) location / { root /var/www/mikromeet; try_files $uri $uri/ /index.html; }}Enable and reload:
sudo ln -s /etc/nginx/sites-available/mikromeet /etc/nginx/sites-enabled/sudo nginx -tsudo systemctl reload nginxMonitoring & Logs
Section titled “Monitoring & Logs”Health Checks
Section titled “Health Checks”MikroMeet exposes a health endpoint:
curl https://yourdomain.com/healthReturns:
{ "status": "ok", "totalRooms": 5, "totalParticipants": 12, "peakParticipants": 24, "uptime": 3600000, "version": "1.0.0"}Logging
Section titled “Logging”Systemd Logs
Section titled “Systemd Logs”# Follow logssudo journalctl -u mikromeet -f
# Last 100 linessudo journalctl -u mikromeet -n 100
# Logs since bootsudo journalctl -u mikromeet -bDocker Logs
Section titled “Docker Logs”# Follow logsdocker logs -f mikromeet
# Last 100 linesdocker logs --tail 100 mikromeetSecurity Hardening
Section titled “Security Hardening”Firewall Configuration
Section titled “Firewall Configuration”# Allow SSHsudo ufw allow 22/tcp
# Allow HTTP/HTTPSsudo ufw allow 80/tcpsudo ufw allow 443/tcp
# Allow TURN (if running Coturn)sudo ufw allow 3478/tcpsudo ufw allow 3478/udpsudo ufw allow 49152:65535/udp
# Enable firewallsudo ufw enableRate Limiting
Section titled “Rate Limiting”MikroMeet includes built-in rate limiting:
- 10 WebSocket connections per minute per IP
- 10 room creation requests per minute per IP
For additional protection, use Nginx rate limiting or Cloudflare.
Troubleshooting
Section titled “Troubleshooting”WebSocket Connection Fails
Section titled “WebSocket Connection Fails”- Verify
apiUrlmatches deployment protocol (ws/wss) - Check reverse proxy WebSocket headers
- Ensure firewall allows WebSocket traffic
Camera/Microphone Blocked
Section titled “Camera/Microphone Blocked”- HTTPS is required for camera/microphone access
- Check browser permissions
- Verify SSL certificate is valid
Users Can’t Connect
Section titled “Users Can’t Connect”- Add TURN server configuration
- Test TURN with Trickle ICE
- Verify firewall allows TURN ports
Next Steps
Section titled “Next Steps”- Server Options - Full configuration reference
- API Reference - HTTP and WebSocket API