137 lines
4.3 KiB
Markdown
137 lines
4.3 KiB
Markdown
# Deploying to Freestyle
|
|
|
|
> Source: `src/content/docs/deploy/freestyle.mdx`
|
|
> Canonical URL: https://rivet.dev/docs/deploy/freestyle
|
|
> Description: Deploy RivetKit app to Freestyle.sh, a cloud platform for running AI-generated code with built-in security and scalability.
|
|
|
|
---
|
|
Freestyle provides built-in security for running untrusted AI-generated code, making it ideal for AI agent applications. Using Rivet, it is easy to deploy your vibe-coded or user-provided RivetKit backends straight to Freestyle.
|
|
|
|
- [Freestyle + Rivet](https://github.com/rivet-dev/rivet/tree/main/examples/freestyle) — Complete example of deploying RivetKit app to Freestyle.sh.
|
|
|
|
## Setup
|
|
|
|
### Install packages
|
|
|
|
Install RivetKit and Hono and create your registry:
|
|
|
|
```bash
|
|
npm install rivetkit hono
|
|
```
|
|
|
|
### Configure serverless driver
|
|
|
|
Update your server code to run the registry serverless with Deno.
|
|
|
|
```typescript index.ts @hide
|
|
import { actor, setup } from "rivetkit";
|
|
|
|
export const counter = actor({
|
|
state: { count: 0 },
|
|
actions: {
|
|
increment: (c, x: number) => {
|
|
c.state.count += x;
|
|
return c.state.count;
|
|
},
|
|
},
|
|
});
|
|
|
|
export const registry = setup({
|
|
use: { counter },
|
|
});
|
|
registry.start();
|
|
```
|
|
|
|
```typescript server.ts @nocheck
|
|
import { registry } from "./index";
|
|
|
|
// Freestyle uses Deno under the hood for web deployments
|
|
// @ts-ignore Deno is a Freestyle runtime global
|
|
Deno.serve((request: Request) => registry.handler(request));
|
|
```
|
|
|
|
The `Deno.serve` API is provided by Freestyle's runtime environment. The `@ts-ignore` comment suppresses TypeScript errors for this platform-specific API.
|
|
|
|
### Deploy to Freestyle
|
|
|
|
Deploy your application to Freestyle with the correct configuration. Create a deployment script or add this to your existing deployment process:
|
|
|
|
```typescript @nocheck
|
|
const FREESTYLE_DOMAIN = "my-domain.style.dev"; // Change to your desired Freestyle domain
|
|
|
|
declare const freestyle: any;
|
|
declare const buildDir: string;
|
|
|
|
const res = await freestyle.deployWeb(buildDir, {
|
|
envVars: {
|
|
FREESTYLE_ENDPOINT: `https://${FREESTYLE_DOMAIN}`,
|
|
RIVET_RUNNER_KIND: "serverless",
|
|
// For self-hosted instances:
|
|
// RIVET_ENDPOINT: "http://127.0.0.1:6420",
|
|
RIVET_ENDPOINT: "api.rivet.dev",
|
|
},
|
|
timeout: 60 * 5, // Increases max request lifetime on the runner
|
|
entrypoint: "server.ts", // File which starts serverless runner
|
|
domains: [FREESTYLE_DOMAIN],
|
|
build: false,
|
|
});
|
|
```
|
|
|
|
Details on `buildDir` and other settings are available on [Freestyle docs](https://docs.freestyle.sh/web/web).
|
|
|
|
Run this deployment script to push your application to Freestyle.
|
|
|
|
**Deployment Configuration:**
|
|
|
|
- `timeout: 60 * 5` - Set timeout to 5 minutes for actor operations - it's important to keep this high
|
|
- `entrypoint: "server.ts"` - Entry point file with your serverless setup
|
|
- `domains` - Your Freestyle domain(s)
|
|
- `build: false` - Disable build if you're pre-building your assets
|
|
|
|
### Configure runner
|
|
|
|
Update the runner configuration on the Rivet side to connect with your Freestyle deployment. Create a configuration script and run it after your Freestyle deployment is live:
|
|
|
|
```typescript @nocheck
|
|
import { RivetClient } from "@rivetkit/engine-api-full";
|
|
|
|
const rivet = new RivetClient({
|
|
environment: "https://api.rivet.dev",
|
|
token: process.env.RIVET_API_TOKEN,
|
|
});
|
|
|
|
const FREESTYLE_DOMAIN = "my-domain.style.dev"; // Change to your desired Freestyle domain
|
|
const RIVET_NAMESPACE = "my-rivet-namespace"; // Change to your Rivet namespace
|
|
|
|
await rivet.runnerConfigsUpsert("freestyle-runner", {
|
|
namespace: RIVET_NAMESPACE,
|
|
datacenters: {
|
|
default: {
|
|
serverless: {
|
|
url: `https://${FREESTYLE_DOMAIN}/start`,
|
|
runnersMargin: 1,
|
|
minRunners: 1,
|
|
maxRunners: 1,
|
|
slotsPerRunner: 1,
|
|
// Must be shorter than Freestyle request `timeout` config
|
|
requestLifespan: 60 * 5 - 5,
|
|
},
|
|
},
|
|
},
|
|
});
|
|
```
|
|
|
|
Execute this configuration script to register your Freestyle deployment with Rivet.
|
|
|
|
**Runner Configuration:**
|
|
|
|
- `url` - Freestyle deployment URL with `/start` endpoint
|
|
- `runnersMargin` - Buffer of runners to maintain
|
|
- `minRunners/maxRunners` - Scaling limits
|
|
- `slotsPerRunner` - Concurrent actors per runner
|
|
- `requestLifespan` - Request timeout (slightly less than Freestyle timeout)
|
|
|
|
Once executed, Rivet will be connected to your Freestyle serverless instance.
|
|
|
|
_Source doc path: /docs/deploy/freestyle_
|