Install Folio
Folio needs four things from a host: a long-running process, PostgreSQL, Redis and a persistent disk for the Git repositories of your spaces. Real-time editing also needs WebSocket connections. Pick the platform you already use, or run one command on a Linux server.
One command on a Linux server
The script checks Docker, generates the secrets, starts Folio with PostgreSQL and Redis, and waits until it answers. It can set up automatic HTTPS if you give it a domain.
curl -fsSL https://raw.githubusercontent.com/evergreen-it-dev/folio/main/deploy/vps/install.sh | bashDetails, options, updates and backups are on the Linux server page.
Not 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.
What Folio needs from a host
A long-running process
Folio is a server that stays up. It is not a function that runs per request.
PostgreSQL
The index, access rights and live-editing state.
Redis
Transient data only: presence and rate limits. It is not persisted.
A persistent disk
The Git repositories of your spaces and uploaded files.
WebSocket
Real-time editing needs connections that stay open.
Pick a platform
Every page has the steps, the settings, how to update and how to back up.
Linux server (VPS)
Any Linux server with Docker
- Effort:
- One command
- Minimum:
- 2 GB RAM, 1 vCPU, 10 GB disk
- Persistent disk:
- Yes
- Cost:
- The price of the server
Coolify
Self-hosted PaaS you run on your own server
- Effort:
- Paste a Compose file
- Minimum:
- A server with 2 GB RAM or more
- Persistent disk:
- Yes (Docker volume)
- Cost:
- The price of your server
Railway
Hosted platform with managed Postgres and Redis
- Effort:
- About five minutes by hand; template not created yet
- Minimum:
- Hobby plan or higher
- Persistent disk:
- Yes (volume)
- Cost:
- Billed by use; the volume is billed per GB
Render
Hosted platform; Blueprint from a repository file
- Effort:
- One Blueprint
- Minimum:
- Standard web service plan (2 GB RAM), 10 GB disk
- Persistent disk:
- Paid plans only
- Cost:
- Paid plans: standard web service, basic-256mb PostgreSQL, disk
DigitalOcean
Cloud servers (Droplets)
- Effort:
- A Droplet with a cloud-init script
- Minimum:
- Basic 2 GB / 1 vCPU Droplet
- Persistent disk:
- Yes (Droplet disk)
- Cost:
- The price of the Droplet; 4 GB is comfortable for a team
Dokploy
Self-hosted PaaS
- Effort:
- Compose file and three variables
- Minimum:
- A server with 2 GB RAM or more
- Persistent disk:
- Yes (Docker volume)
- Cost:
- The price of your server
CapRover
Self-hosted PaaS on Docker Swarm
- Effort:
- One-Click App YAML
- Minimum:
- A server with 2 GB RAM or more
- Persistent disk:
- Yes (volumes)
- Cost:
- The price of your server
Easypanel
Server control panel with app templates
- Effort:
- Three services by hand, about 3 minutes
- Minimum:
- A server with 2 GB RAM or more
- Persistent disk:
- Yes (volume)
- Cost:
- The price of your server
Portainer
Web UI for Docker hosts
- Effort:
- Paste a stack
- Minimum:
- A Docker host with 2 GB RAM or more
- Persistent disk:
- Yes (Docker volume)
- Cost:
- The price of your Docker host
Fly.io
Hosted platform; a volume attaches to one machine
- Effort:
- Manual recipe
- Minimum:
- One shared-cpu-1x machine with 2 GB RAM, 10 GB volume
- Persistent disk:
- Yes (volume, one machine)
- Cost:
- Managed Postgres from about $38 a month, plus the machine and the volume
Sizing
Measured on a running instance: the app idles at about 450 MB of RAM, PostgreSQL uses 30 to 120 MB and Redis about 10 MB. PDF export starts a headless Chromium on demand and adds a few hundred MB while it runs.
| Resource | Minimum | Comfortable (a team of about 20) |
|---|---|---|
| RAM | 2 GB for the whole stack | 4 GB |
| CPU | 1 vCPU | 2 vCPU |
| Disk | 10 GB (the image alone is about 1.7 GB unpacked) | 20 GB, growing with your content |
What every install does the same way
- Secrets are generated, never shipped as defaults: the database password and FOLIO_SECRET. FOLIO_SECRET encrypts saved Git tokens and personal AI keys. Never change it afterwards.
- PUBLIC_URL is the address people open. Invitation and share links are built from it, and it decides whether cookies are HTTPS-only. It must match the address in the browser.
- PostgreSQL and Redis are reachable only from inside the stack.
- A backup is always two things: the database dump and the data volume (/app/data).
Where Folio cannot run
- Vercel, Netlify and Cloudflare Pages cannot run Folio. They have no disk and no process that stays alive. AWS Lambda has the same problem.
- DigitalOcean App Platform cannot run Folio either. It has no persistent volumes, and a service's filesystem is wiped on every deploy, so an instance there would lose its pages at the next deploy. Use a Droplet instead.
Verify your install
On a fresh instance, from a clone of the repository, run the smoke test. It needs Node 18 or newer. It creates the first account, a space and a page, and opens a real-time WebSocket connection to the page. Delete the instance, or that space, afterwards.
node deploy/smoke.mjs https://wiki.example.com