Why self-host Outline on a VPS
Outline often stores what a company holds most strategic: internal procedures, runbooks, architecture decisions, onboarding. On the SaaS version, you pay per seat and your content lives on third-party infrastructure. By installing it on your own VPS, you set the rules yourself: SSO authentication via your provider, PostgreSQL database backups according to your policy, unlimited retention and an unbilled number of users. Outline stays lightweight for reading but relies on a precise stack (PostgreSQL for documents, Redis for sessions and real-time websockets, S3-compatible storage for attachments). A dedicated VPS lets you size each of these components and deploy the whole stack with a single docker-compose.yml file.
What you gain concretely
- Unlimited users with no per-seat billing, unlike SaaS offerings.
- SSO integrated with your enterprise identity (Google Workspace, OIDC, Azure AD) under your control.
- High-performance full-text search served directly by your PostgreSQL, with no external dependency.
- Attachments and exports stored on your own S3 bucket or self-hosted MinIO.
- Real-time collaborative editing thanks to Redis, with no data passing through a third party.
- Controlled backups and restoration: a single
pg_dumpis enough to archive the entire documentation database.
Hardware and software prerequisites
Outline is comfortable with 2 vCPU and 4 GB of RAM for a team of 20 to 50 people: PostgreSQL and Redis consume little at idle, but real-time editing and search scale up occasionally. Count on 20 GB of disk for the database and logs, more if you store attachments locally rather than on S3. On the software side: Docker Engine and the docker compose v2 plugin, a domain name pointed to the VPS IP (for example wiki.yourcompany.com), and an SMTP account for invitation emails. Outline mandatorily requires an authentication provider: prepare the OAuth credentials (Google, Slack or an OIDC server) before starting, because there is no login with a simple password.
Deploy Outline step by step
Prepare the VPS and Docker
Update the system with apt update && apt upgrade -y, install Docker via the official script, then verify with docker compose version. Create an /opt/outline folder that will host your configuration.
Generate the secrets and the environment file
Outline requires two keys: generate them with openssl rand -hex 32 for SECRET_KEY and UTILS_SECRET. In the .env, fill in the DATABASE_URL, REDIS_URL, URL=https://wiki.yourcompany.com variables and the OAuth credentials of your provider.
Define the PostgreSQL, Redis and Outline stack
In docker-compose.yml, declare three services: postgres (image postgres:15 with a persistent volume), redis (image redis:7) and outline (image outlinewiki/outline:latest). Link Outline to both backends via the environment variables and expose port 3000 internally only.
Initialize the database
Run the migrations before the first startup with docker compose run --rm outline yarn db:migrate --env=production-ssl-disabled. This command creates the documentation schema in PostgreSQL; without it, Outline will refuse to start.
Place a reverse proxy with SSL
Put Caddy or Traefik in front of the outline service. With Caddy, a line wiki.yourcompany.com { reverse_proxy outline:3000 } automatically generates and renews the Let's Encrypt certificate. Be sure to forward the WebSocket headers for real-time editing.
Start and create the first workspace
Launch the stack with docker compose up -d, then open https://wiki.yourcompany.com. Log in via your OAuth provider: the first authenticated account becomes administrator of the workspace.
Enable S3 storage rather than local for attachments: point AWS_S3_UPLOAD_BUCKET_URL to a self-hosted MinIO on the same VPS. You thus decouple the file volume from the PostgreSQL database, which makes pg_dump fast and lightweight, and lets you scale without bloating the application container.