Install Folio on Render
You use Render and want the whole stack from one file: the app from the published image, a PostgreSQL database, a Key Value (Redis-compatible) instance and a persistent disk.
What you need
- A Render account with a paid plan. A persistent disk exists only on paid web service plans.
- The image ghcr.io/evergreen-it-dev/folio, published and public, and render.yaml in the root of the public repository.
Before you start
What it costs, and why not free
Folio keeps the Git repositories of your spaces on disk, and Render offers a persistent disk only on paid web service plans. So the Blueprint uses a paid plan, and there is no free-tier variant that keeps your pages. See Render's pricing for the current prices.
| Resource | Plan in the Blueprint | Why |
|---|---|---|
| Web service | standard (2 GB RAM) | The app idles near 450 MB; starter (512 MB) is too tight. Edit the plan to starter only for a trial. |
| Disk | 10 GB at /app/data | Git repositories and uploads. Can grow, never shrink. |
| PostgreSQL | basic-256mb, 5 GB | The database holds the index and access rights, not your only copy of the pages. |
| Key Value | free | Transient data only. |
Steps
Step 1: Click Deploy to Render (or New > Blueprint and choose the repository).
Step 2: Render asks for PUBLIC_URL. Type the address the service will have, for example https://folio.onrender.com. The service name is folio; if the name is taken, Render adds a suffix, so check the real address on the service page and correct PUBLIC_URL under Environment afterwards. With a custom domain, use that.
Step 3: Leave the Google and Cursor values empty unless you use them. Click Deploy Blueprint.
Step 4: When the service is Live, open it. The first account is the administrator.
Files
The button reads render.yaml from the root of the repository. This is the file in full.
Show render.yaml (64 lines) and copy it
# Render Blueprint for Folio: the app (published image), PostgreSQL, Key Value
# (Redis-compatible) and a persistent disk for the Git repositories.
#
# A persistent disk exists only on paid web service plans, so this blueprint
# cannot run on the free plan.
services:
- type: web
name: folio
runtime: image
image:
url: ghcr.io/evergreen-it-dev/folio:latest
plan: standard # 2 GB RAM. The smallest plan that is comfortable; `starter` (512 MB) is tight.
healthCheckPath: /api/health
disk:
name: folio-data
mountPath: /app/data
sizeGB: 10
envVars:
- key: NODE_ENV
value: production
- key: PORT
value: '4870'
- key: ASSET_BACKEND
value: local
# Encrypts saved git tokens and personal AI keys. Generated once; never
# change it afterwards.
- key: FOLIO_SECRET
generateValue: true
- key: DATABASE_URL
fromDatabase:
name: folio-db
property: connectionString
- key: REDIS_URL
fromService:
type: keyvalue
name: folio-cache
property: connectionString
# Render asks for this when the Blueprint is created. Type the address
# the service will have, e.g. https://folio.onrender.com (the name of the
# service plus .onrender.com, or your custom domain). Links in
# invitations and shared pages are built from it.
- key: PUBLIC_URL
sync: false
- key: GOOGLE_CLIENT_ID
sync: false
- key: GOOGLE_CLIENT_SECRET
sync: false
- key: GOOGLE_ALLOWED_DOMAINS
sync: false
- key: CURSOR_API_KEY
sync: false
# Transient data only (presence, rate limits); no persistence needed.
- type: keyvalue
name: folio-cache
plan: free
maxmemoryPolicy: allkeys-lru
ipAllowList: [] # internal connections only
databases:
- name: folio-db
plan: basic-256mb
postgresMajorVersion: '17'
diskSizeGB: 5Settings
FOLIO_SECRET is generated by Render and kept. The database and Key Value connection strings are wired in automatically over Render's private network.
| Variable | Default | What it does |
|---|---|---|
NODE_ENV | production | Runs the app in production mode. |
PORT | 4870 | The port the app listens on. |
ASSET_BACKEND | local | Uploads go to the disk. |
FOLIO_SECRET | generated by Render | Encrypts saved Git tokens and AI keys. Never change it. |
DATABASE_URL | from the folio-db database | Wired in by the Blueprint. |
REDIS_URL | from the folio-cache Key Value | Wired in by the Blueprint. |
PUBLIC_URL | asked when the Blueprint is created | Links in invitations and shared pages are built from it. |
GOOGLE_CLIENT_ID, GOOGLE_CLIENT_SECRET | empty | Turn on "Sign in with Google". Register <your address>/api/auth/google/callback with Google. |
GOOGLE_ALLOWED_DOMAINS | empty | Email domains allowed to sign in with Google. Empty means nobody. |
CURSOR_API_KEY | empty | Shared key for the AI assistant. Without it each person adds their own. |
Update
The Blueprint uses the latest image. Press Manual Deploy > Deploy latest reference, or change the image tag in the service's settings (pin v0.1.0 to update on your terms). A service with a disk stops the old instance before it starts the new one, so an update means a short downtime: zero-downtime deploys are off with a disk.
Back up
Database: Render Postgres has its own backups (paid plans). Or run pg_dump "<external connection string>" > folio-db.sql from your machine.
Disk: Render takes daily disk snapshots you can restore from the dashboard. For a copy of your own, open a shell on the service (the Shell tab) and run the command below into a file you download.
tar czf - -C /app/data .Limits and honest notes
- One instance only: a service with a disk cannot be scaled to several.
- WebSocket (real-time editing) is supported by Render's web services.
Platform documentation
Check the installation
From a clone of the repository, run the smoke test against a fresh instance. It needs Node 18 or newer. It creates the first account, a space and a page, and opens a WebSocket connection to the page. Delete the instance, or that space, afterwards.
node deploy/smoke.mjs https://wiki.example.comOther ways to install
Compare all platformsNot ready to install?
Try the public demo: https://demo.foliowiki.online. Pick Sam on the sign-in screen. The login is shared and the data resets every 24 hours, so don't enter personal data or API keys.