website/src/content/docs/self-hosting/render.mdx
**render.yaml**
```yaml
databases:
- name: rivet-db
plan: basic-256mb
databaseName: rivet
user: rivet
services:
- type: web
name: rivet-engine
runtime: docker
dockerfilePath: ./Dockerfile.render
plan: starter
healthCheckPath: /health
envVars:
- key: DATABASE_URL
fromDatabase:
name: rivet-db
property: connectionString
- key: RIVET__AUTH__ADMIN_TOKEN
generateValue: true
```
**Dockerfile.render**
```dockerfile
FROM rivetdev/engine:latest
COPY entrypoint.render.sh /entrypoint.render.sh
RUN chmod +x /entrypoint.render.sh
ENTRYPOINT ["/entrypoint.render.sh"]
```
**entrypoint.render.sh**
```bash
#!/bin/sh
if [ -n "$DATABASE_URL" ]; then
export RIVET__POSTGRES__URL="${DATABASE_URL}?sslmode=disable"
fi
exec /usr/bin/rivet-engine start
```
Commit and push these files to your repository.
Render will automatically create the PostgreSQL database and deploy the Rivet Engine.
```
https://rivet-engine-xxxx.onrender.com/ui/
```
Replace `rivet-engine-xxxx` with your actual service name from the Render Dashboard.
Enter the admin token from the previous step to log in.
Rivet uses long-lived WebSocket connections for both client traffic (browsers, SDKs) and envoy traffic (actor hosts connecting back to the engine). Render's HTTP proxy supports WebSockets, but its default idle timeout will close connections that have no traffic for too long.
If you front the engine with your own reverse proxy (NGINX, Caddy, etc.) on Render, raise its idle / read timeout to at least 1 hour (3600 seconds). The same guidance applies to the Render service hosting your RivetKit app, since envoys connect to it over WebSocket.
To connect a RivetKit application to your self-hosted engine, set these environment variables in your app:
RIVET_ENDPOINT=https://<namespace>:<admin-token>@rivet-engine-xxxx.onrender.com
RIVET_PUBLIC_ENDPOINT=https://<namespace>@rivet-engine-xxxx.onrender.com
See the Connect guide for more details on connecting your application.