Render Deployment
Deploy ProjectAchilles to Render using the included Blueprint (render.yaml) or manual setup.
Architecture
| Service | Root Directory | Plan | Public Domain |
|---|---|---|---|
| achilles-backend | backend/ | Starter ($7/mo) | Yes |
| achilles-frontend | frontend/ | Starter ($7/mo) | Yes |
The frontend calls the backend directly via CORS (using VITE_API_URL).
Render's private network DNS is only available on Standard plan and above. On Starter plan, services cannot resolve each other by name, so the frontend uses VITE_API_URL to call the backend's public URL directly.
Option A: Blueprint Deploy (Recommended)
-
Go to render.com/deploy and connect your GitHub repo
-
Render detects
render.yamland shows the Blueprint preview -
Click Apply
-
Set the
sync: falsevariables on each service:Backend:
CLERK_PUBLISHABLE_KEY=pk_live_...
CLERK_SECRET_KEY=sk_live_...
CORS_ORIGIN=https://<frontend>.onrender.com
AGENT_SERVER_URL=https://<backend>.onrender.com
TESTS_REPO_URL=https://github.com/your-org/f0_library.git
GITHUB_TOKEN=ghp_...
ELASTICSEARCH_CLOUD_ID=...
ELASTICSEARCH_API_KEY=...Frontend:
CLERK_PUBLISHABLE_KEY=pk_live_...
VITE_API_URL=https://<backend>.onrender.com
SESSION_SECRET and ENCRYPTION_SECRET are auto-generated by the Blueprint.
Option B: Manual Setup
Backend Service
- New → Web Service → connect GitHub repo
- Root Directory:
backend, Runtime: Docker, Plan: Starter - Add a Disk: mount at
/root/.projectachilles, 1 GB - Set environment variables (see Environment Variables)
Frontend Service
- New → Web Service → same repo
- Root Directory:
frontend, Runtime: Docker, Plan: Starter - Set
CLERK_PUBLISHABLE_KEYandVITE_API_URL
Persistent Disk
The backend uses a 1 GB persistent disk at /root/.projectachilles:
| Path | Purpose |
|---|---|
agents.db | SQLite database |
analytics.json | Encrypted ES credentials |
certs/ | Code signing certificates |
binaries/ | Built agent binaries |
go-cache/ | Go module and build cache |
Persistent disks disable Render's zero-downtime deploys. There will be brief downtime during deploys while the new container starts.
Agent Build from Source
The backend Docker image includes Go 1.24.3. Set AGENT_REPO_URL to enable agent cross-compilation:
AGENT_REPO_URL=https://github.com/your-org/ProjectAchilles.git
AGENT_REPO_BRANCH=main
GITHUB_TOKEN=ghp_... # if repo is private
Custom Domains
Add CNAME records in your DNS provider:
| Record | Type | Target |
|---|---|---|
<prefix>.yourdomain.com | CNAME | <frontend>.onrender.com |
<prefix>.agent.yourdomain.com | CNAME | <backend>.onrender.com |
Then update CORS_ORIGIN, AGENT_SERVER_URL, and VITE_API_URL to use the custom domains.
Cost Estimate
| Service | Est. Monthly Cost |
|---|---|
| Backend (Starter plan) | ~$7 |
| Frontend (Starter plan) | ~$7 |
| Persistent disk (1 GB) | ~$0.25 |
| Total | ~$14 |
Troubleshooting
Frontend shows CORS errors
Verify CORS_ORIGIN is set to the frontend's full URL with https:// prefix.
GitHub/Google login returns 404
You're using a Clerk production instance without custom OAuth credentials. Follow the Prerequisites Clerk OAuth setup.
Agent builds fail with "Agent source not found"
AGENT_REPO_URL is not set, or the Git clone failed at startup. Check container logs for errors.