Published

Outline

Team knowledge base and wiki: Markdown-style documents in collections, real-time co-editing, search, comments and an API. Self-hosting for your own team is allowed under its Business Source License, but sign-in always goes through an external provider (OIDC, Google, Slack, Microsoft or email links). The stack is Outline, PostgreSQL and Redis, with attachments on local disk.

Resources by load level

What the app itself needs at each level, next to what we recommend for a server that runs only this app.

LevelWhat it meansApp requirementsRecommended
LightEstimateUp to 25 members, ~2,000 documents, a few people editing at once, under 5 GB of attachments.1.75 vCPU · 2.25 GiB RAM · 13.5 GiB disk2.22 vCPU · 4.2 GiB RAM · 25.07 GiB disk
MediumEstimateUp to 150 members, ~20,000 documents, 10–20 people editing at once, up to 20 GB of attachments.2.25 vCPU · 3.25 GiB RAM · 28.5 GiB disk2.82 vCPU · 5.4 GiB RAM · 42.32 GiB disk
HeavyEstimateUp to 500 members, ~100,000 documents, dozens editing at once, up to 50 GB of attachments; beyond this, scale out with a separate collaboration service.3.75 vCPU · 7.5 GiB RAM · 103.75 GiB disk4.62 vCPU · 10.5 GiB RAM · 128.858 GiB disk

Recommended = app requirements + system baseline + safety headroom, under sizing policy 2026.10.0. Options stay at their defaults. “Estimate” means the sources give no number for that case, so it is worked out from them by the method stated under Components. How the numbers are built

Size it in the Stack Sizer

Ready-to-run files

Support level Supported

Compose template from the official sources; not yet verified by a run.

Create docker-compose

Components

What each component needs at each load level, before baseline and headroom.

vCPU / GiB RAM / GiB disk
ComponentLightMediumHeavySources
Outline (web, API, collaboration, worker) (app)0.5 / 1 / 6.51 / 2 / 21.51.5 / 3 / 51.5[3][15][21][26][31][32][36][38]
PostgreSQL (database)1 / 1 / 6.51 / 1 / 6.52 / 4 / 51.5[10][27][43][44][45][46][47][48][49]
Redis (queues, cache, rate limiter) (cache)0.25 / 0.25 / 0.50.25 / 0.25 / 0.50.25 / 0.5 / 0.75[17][21][39]
How the estimates are worked out
  • Outline (web, API, collaboration, worker) · Light: RAM: the documented recommendation of 1 GB (minimum 512 MB), GB taken as GiB. Outline runs one Node process here (collaboration without REDIS_COLLABORATION_URL), so .env.sample's 512 MB-per-process rule gives the same. vCPU: no upstream figure; a few concurrent editors keep one process well under a core. Disk: Image 303,766,972 B compressed (0.283 GiB) + 1,154,121,728 B unpacked (1.075 GiB), both kept by the containerd store = 1.358 GiB. + 5 GiB of attachments (ANAROQ assumption) = 6.358, rounded up to 6.5.
  • Outline (web, API, collaboration, worker) · Medium: RAM: twice the documented 1 GB recommendation, which grows with the number of users; Outline sets its V8 heap to ~80% of a container limit. vCPU: one full core for the single Node process that serves web, API, WebSockets, collaboration and jobs (ANAROQ estimate). Disk: Image 303,766,972 B compressed (0.283 GiB) + 1,154,121,728 B unpacked (1.075 GiB), both kept by the containerd store = 1.358 GiB. + 20 GiB of attachments (assumption) = 21.358, rounded up to 21.5.
  • Outline (web, API, collaboration, worker) · Heavy: One Node process (collaboration without REDIS_COLLABORATION_URL), which the docs say fits teams under ~1000 active users. vCPU: 1.5, one busy event loop plus GC and I/O threads; a single process can't use much more. RAM: 3 × the documented 1 GB recommendation for more open documents and WebSockets (ANAROQ estimate). Disk: Image 303,766,972 B compressed (0.283 GiB) + 1,154,121,728 B unpacked (1.075 GiB), both kept by the containerd store = 1.358 GiB. + 50 GiB of attachments (assumption) = 51.358, rounded up to 51.5.
  • PostgreSQL · Light: Embedded metadata DB with the image's default config: equals the PostgreSQL profile's light preset (≤ 5 GB data, ≤ 20 concurrent connections) at every load level. Light preset method: shared_buffers 25% of RAM, worst-case work_mem/maintenance_work_mem budget, 0.5 GiB image + 5 GiB data + 1 GiB WAL.
  • PostgreSQL · Medium: Documents, revisions and the search index live in PostgreSQL: 20,000 documents × an assumed 100 KB each with revisions ≈ 2 GB, inside the light envelope (≤ 5 GB). The pool is 5 connections per process (one process), under its 20. Light method: shared_buffers 25% of RAM, worst-case work_mem budget, 0.5 GiB image + 5 GiB data + 1 GiB WAL.
  • PostgreSQL · Heavy: 100,000 documents × an assumed 100 KB each with revisions and search vectors ≈ 10 GB, beyond the 5 GB sidecar envelope, so the PostgreSQL profile's medium preset (≤ 50 GB). Medium method: shared_buffers 1 GiB = 25%, worst-case work_mem budget for 100 connections, 0.5 GiB image + 50 GiB data + 1 GiB WAL.
  • Redis (queues, cache, rate limiter) · Light: No upstream figure: the docs ask only for a single Redis 4+ server. It holds job queues, cache and rate-limiter counters, so a quarter core and 0.25 GiB RAM (ANAROQ assumption). Disk: 43.8 MiB compressed image × 3 (131 MiB) + an RDB snapshot up to the 0.25 GiB dataset, rounded up to 0.5 GiB.
  • Redis (queues, cache, rate limiter) · Medium: As light: queues, cache and rate-limiter counters stay small; 0.25 vCPU, 0.25 GiB RAM and 0.5 GiB disk (131 MiB image + RDB snapshot). ANAROQ assumption, no upstream figure.
  • Redis (queues, cache, rate limiter) · Heavy: Twice the light RAM for more queued jobs, cached data and per-IP rate-limiter keys: 0.5 GiB. Disk: 131 MiB image (43.8 MiB compressed × 3) + an RDB snapshot up to the 0.5 GiB dataset, rounded up to 0.75 GiB. ANAROQ assumption, no upstream figure.

Ports

Public ports are meant to be reached from outside the stack, usually through a reverse proxy; internal ones stay on the stack's own network.

ComponentPortExposurePurposeSources
Outline (web, API, collaboration, worker)3000/tcpPublic, through a proxyWeb UI, API and WebSockets (collaboration); HTTP, put behind TLS[2][3][5]
PostgreSQL5432/tcpInternal onlyPostgreSQL connections from Outline[2][4]
Redis (queues, cache, rate limiter)6379/tcpInternal onlyRedis for Outline's queues, cache and rate limiter[17][20]

Every port in the catalog, with conflicts between apps

User and permissions (UID/GID)

The user each container's process runs as, and the paths it writes to. A bind mount for one of these paths must be writable by that UID:GID.

ComponentUID:GIDUserStarts as rootWrites toSources
Outline (web, API, collaboration, worker)1001:1001nodejsNo/var/lib/outline/data[5][15]
PostgreSQL999:999postgresYes, prepares its directories, then drops to this user/var/lib/postgresql/var/run/postgresql[41][42][48]
Redis (queues, cache, rate limiter)999:999redisYes, prepares its directories, then drops to this user/data[20][40]

Storage growth

How much each component's data grows per month at each load level, on top of the disk in the profile. A value marked Assumption is ANAROQ's stated assumption, not a figure from the sources; the notes say what it rests on.

GiB per month
ComponentLightMediumHeavySources
Outline (web, API, collaboration, worker)Assumption0.2513[3][15]
PostgreSQLAssumption0.050.20.5[27][35]
What the growth figures rest on
  • Outline (web, API, collaboration, worker): Attachments and imports on the local volume: nothing expires them except deleting the documents they belong to (one file can be up to 250 MB with the template's FILE_STORAGE_UPLOAD_MAX_SIZE). Outline gives no growth figure; ANAROQ assumes a modest flow of images and files per active member.
  • PostgreSQL: Documents, their revision history, comments and events accumulate; only the trash is emptied, after 30 days (by the cron service the template enables). Outline gives no growth figure; this is an ANAROQ assumption.

Upgrade and rollback

How to move to a new version safely, and how to go back if it fails.

Back up first

pg_dump of the outline database, a copy of the attachments volume (/var/lib/outline/data), and the .env with SECRET_KEY. [15][27]

Upgrade steps

  1. Back up the database (and the attachments volume) before every upgrade. [2][27]
  2. Set the new pinned tag of outlinewiki/outline in docker-compose.yml, then run docker compose pull and docker compose up -d. [2]DerivedThe docs say to point docker-compose.yml at the new version and run the container; pull and up -d is how Compose applies a new tag.
  3. Database migrations run automatically when the new container starts; watch the logs until /_health answers OK. [2][6]

Roll back

Migrations are not always backwards compatible, so going back means stopping the stack, restoring the database dump taken before the upgrade, and starting the old tag again. [27]DerivedThe backups guide warns that release migrations are not always backwards compatible; Outline documents no down-migration path for Docker, so the restore is the rollback.

Limits

  • There is no password sign-in: everyone signs in through an external provider. The template wires a generic OIDC provider (Keycloak, Authentik, Authelia, GitLab and others); Google, Slack, Microsoft or Discord need their own variables, and email magic links need SMTP (the smtp option). [3][13][24][25]
  • Licensed under the Business Source License 1.1, not an open-source license. Its Additional Use Grant allows any use, including production use for your own team, except offering a commercial "Document Service" in which third parties create their own teams and documents. Each version becomes Apache 2.0 four years after release (1.11.0 on 2030-10-12). SAML, the audit log and other features need a paid license. [22][23][29]
  • One Node process serves everything: without REDIS_COLLABORATION_URL, collaboration limits Outline to a single process, which the docs say suits teams under ~1000 active users. Scaling out needs a separate collaboration service, which this template doesn't add. [26][31]
  • Attachments are stored on the local volume (no S3), up to 250 MB per file as set in the template. Outline blocks requests to private network addresses by default, so a self-hosted OIDC provider on your LAN needs its IP in ALLOWED_PRIVATE_IP_ADDRESSES. [3][15][19]

Security

  • Serve Outline only over HTTPS, through a reverse proxy that forwards WebSockets: without them documents can't be edited. Behind the proxy the template sets URL to https://<domain> and keeps FORCE_HTTPS on. [12][16][19]
  • The first person to sign in creates the workspace and becomes its admin, and afterwards anyone your OIDC provider lets in can join as a member. Sign in right after the first start, then restrict access in Settings (allowed email domains, or require invites), or limit who may use the client in the provider. [33][34]
  • SECRET_KEY encrypts data in the database. Losing or changing it makes that data unreadable; the only recovery is a script that wipes encrypted data such as sessions, access tokens and integrations. [4][19][27]
  • A rate limiter is on by default (1000 requests per IP per minute, stricter on sensitive endpoints); keep it on when Outline faces the internet. [3][28]

Backup

  • Back up PostgreSQL daily and keep a month of backups, as the docs recommend, plus a dump before every upgrade: documents, revisions, users and settings live there. [27]
  • Back up the attachments volume (/var/lib/outline/data) together with the database: images and files are stored there, not in PostgreSQL. [2][15]
  • Keep the .env (SECRET_KEY above all) in a password manager or another encrypted store after every change; without SECRET_KEY, encrypted data in a restored database is lost. Settings → Export gives an extra copy in Markdown, HTML or JSON. [19][27]

Latest release

Newest upstream release
Outline 1.11.0 [37]
This profile was checked against

Outline 1.11.0

This profile was checked against the newest release.

Checked on
14 Oct 2026
State
Checked within the last 90 days
Where releases are published
Docker Hub tags

Latest releases of every app

Version

Profile status
Published
Checked against release
Outline 1.11.0
Profile version
1.0.0
Figures verified
14 Oct 2026
Catalog release
2026.10.10
Sizing policy
2026.10.0
Compose file
Unverified
Official site
www.getoutline.com
Alternatives
BookStackWiki.js

Sources

  1. Docker Docs: Control startup order in Compose (pg_isready healthcheck, service_healthy) (Official docs · read 11 Oct 2026)
  2. Outline hosting docs: Docker (Compose example with outline, redis, postgres:18 at /var/lib/postgresql, https-portal; migrations run on start) (Official Compose · read 14 Oct 2026)
  3. outline repository: .env.sample at v1.11.0 (URL, PORT 3000, SECRET_KEY hex 32 bytes, UTILS_SECRET, FILE_STORAGE=local, upload max 262144000, PGSSLMODE) (Official repository · read 14 Oct 2026)
  4. outline repository: server/env.ts at v1.11.0 (SECRET_KEY 64 hex chars; DATABASE_HOST/PORT/NAME/USER/PASSWORD; SERVICES default; FORCE_HTTPS; SMTP_*; upload max default 1,000,000 B) (Official repository · read 14 Oct 2026)
  5. outline repository: Dockerfile at v1.11.0 (node:26.3.0-slim, USER nodejs uid 1001, VOLUME /var/lib/outline/data, wget, HEALTHCHECK /_health every 1m, EXPOSE 3000) (Official repository · read 14 Oct 2026)
  6. outline repository: server/main.ts at v1.11.0 (GET /_health checks PostgreSQL and Redis and returns OK; registered before the HTTPS redirect) (Official repository · read 14 Oct 2026)
  7. outline repository: server/services/index.ts at v1.11.0 (services websockets, collaboration, admin, web, worker, cron) (Official repository · read 14 Oct 2026)
  8. outline repository: server/services/cron.ts at v1.11.0 (runs the daily and hourly CronTasks in-process) (Official repository · read 14 Oct 2026)
  9. outline repository: docs/SERVICES.md at v1.11.0 (services chosen with SERVICES; the Docker image runs all production services by default) (Official repository · read 14 Oct 2026)
  10. outline repository: server/storage/database.ts at v1.11.0 (SSL in production unless PGSSLMODE=disable; pool max 5 per process) (Official repository · read 14 Oct 2026)
  11. outline repository: plugins/oidc/server/env.ts at v1.11.0 (OIDC_ISSUER_URL, OIDC_CLIENT_ID with OIDC_CLIENT_SECRET, OIDC_DISPLAY_NAME) (Official repository · read 14 Oct 2026)
  12. outline repository: server/services/web.ts at v1.11.0 (FORCE_HTTPS redirect honours X-Forwarded-Proto when PROXY_HEADERS_TRUSTED) (Official repository · read 14 Oct 2026)
  13. Outline hosting docs: OIDC (automatic discovery with OIDC_ISSUER_URL, OIDC_CLIENT_ID, OIDC_CLIENT_SECRET; Keycloak, Authentik, Authelia examples) (Official docs · read 14 Oct 2026)
  14. Outline hosting docs: SMTP (needed for invite and notification emails and for email magic-link sign-in; SMTP_HOST, SMTP_PORT, SMTP_SECURE) (Official docs · read 14 Oct 2026)
  15. Outline hosting docs: File storage (FILE_STORAGE=local, a Docker volume at /var/lib/outline/data, chown 1001 for bind mounts; S3 alternative) (Official docs · read 14 Oct 2026)
  16. Outline hosting docs: SSL (always serve over HTTPS; a reverse proxy must forward WebSockets) (Official docs · read 14 Oct 2026)
  17. Outline hosting docs: Redis (a single Redis server via REDIS_URL, e.g. redis://redis:6379) (Official docs · read 14 Oct 2026)
  18. Outline hosting docs: Scheduled jobs (cleanup, reminders and trash removal need daily and hourly runs; cron.daily / cron.hourly with UTILS_SECRET) (Official docs · read 14 Oct 2026)
  19. Outline hosting docs: Troubleshooting (FORCE_HTTPS=false for plain HTTP, WebSockets required, lost SECRET_KEY, ALLOWED_PRIVATE_IP_ADDRESSES) (Official docs · read 14 Oct 2026)
  20. redis/docker-library-redis v7.4.11: debian Dockerfile (redis uid/gid 999, VOLUME /data, EXPOSE 6379, redis-cli) (Official repository · read 14 Oct 2026)
  21. Outline hosting docs: Requirements (PostgreSQL 14+, Redis 4+, at least 512 MB of memory, 1 GB or more recommended depending on users; an authentication provider) (Official docs · read 14 Oct 2026)
  22. Outline hosting docs: License restrictions (BSL community edition; selling, reselling or hosting Outline as a service ends the license) (Official docs · read 14 Oct 2026)
  23. outline repository: LICENSE at v1.11.0 (BSL 1.1; Additional Use Grant: any use except a commercial Document Service for third parties; Change Date 2030-10-12 to Apache 2.0) (Official repository · read 14 Oct 2026)
  24. Outline hosting docs: Authentication (SSO, OIDC and SAML depending on edition; no native email + password sign-in) (Official docs · read 14 Oct 2026)
  25. Outline hosting docs: Email magic link (enabled when SMTP is set up and email sign-in is allowed in Settings) (Official docs · read 14 Oct 2026)
  26. Outline hosting docs: Horizontal scaling (single collaboration process fits teams under ~1000 active users; REDIS_COLLABORATION_URL for more) (Official docs · read 14 Oct 2026)
  27. Outline hosting docs: Backups (daily Postgres backups kept a month, back up before every upgrade, keep the .env with SECRET_KEY, export from Settings) (Official docs · read 14 Oct 2026)
  28. Outline hosting docs: Rate limiter (enabled by default; 1000 requests per IP per 60 s globally) (Official docs · read 14 Oct 2026)
  29. Outline hosting docs: Business + Enterprise (paid license and outlinewiki/outline-enterprise image for SAML, audit log and more) (Official docs · read 14 Oct 2026)
  30. Outline: Pricing (hosted cloud plans and self-hosted licenses) (Official docs · read 14 Oct 2026)
  31. outline repository: server/index.ts at v1.11.0 (one process when collaboration runs without REDIS_COLLABORATION_URL) (Official repository · read 14 Oct 2026)
  32. outline repository: server/utils/startup.ts at v1.11.0 (V8 heap set to ~80% of a container memory limit, at least 256 MB) (Official repository · read 14 Oct 2026)
  33. outline repository: server/commands/accountProvisioner.ts at v1.11.0 (the user who creates a new workspace gets the Admin role) (Official repository · read 14 Oct 2026)
  34. outline repository: server/commands/userProvisioner.ts at v1.11.0 (new SSO users join unless invites are required or their domain is not allowed) (Official repository · read 14 Oct 2026)
  35. outline repository: CleanupDeletedDocumentsTask.ts at v1.11.0 (documents in the trash are destroyed after 30 days) (Official repository · read 14 Oct 2026)
  36. Docker Hub manifest of outlinewiki/outline:1.11.0 (linux/amd64): 303,766,972 B compressed; 14 layers decompressed and counted: 1,154,121,728 B (Measurement · read 14 Oct 2026)
  37. Docker Hub: outlinewiki/outline tags (newest stable 1.11.0, 2026-10-12, same digest as latest; nightly tags besides) (Official repository · read 14 Oct 2026)
  38. Docker: the containerd image store keeps image layers both compressed and uncompressed (Official docs · read 14 Oct 2026)
  39. Docker Hub: library/redis tag 7.4.11 (linux/amd64 45,896,305 B compressed) (Official repository · read 14 Oct 2026)
  40. redis/docker-library-redis v7.4.11: debian docker-entrypoint.sh (chown, then setpriv to redis) (Official repository · read 14 Oct 2026)
  41. docker-library/postgres: 18/trixie Dockerfile (postgres uid/gid 999, VOLUME /var/lib/postgresql) (Official repository · read 14 Oct 2026)
  42. docker-library/postgres: 18/trixie docker-entrypoint.sh (chown PGDATA, then gosu postgres) (Official repository · read 14 Oct 2026)
  43. PostgreSQL 18 documentation: 19.4 Resource Consumption (Official docs · read 10 Oct 2026)
  44. PostgreSQL 18 documentation: 19.3 Connections and Authentication (Official docs · read 10 Oct 2026)
  45. PostgreSQL 18 documentation: 19.10 Vacuuming (autovacuum settings) (Official docs · read 10 Oct 2026)
  46. PostgreSQL 18 documentation: 19.5 Write Ahead Log (max_wal_size) (Official docs · read 10 Oct 2026)
  47. PostgreSQL 18 documentation: 51.2 How Connections Are Established (Official docs · read 10 Oct 2026)
  48. Docker Official Image postgres: documentation (docker-library/docs) (Official docs · read 10 Oct 2026)
  49. Docker Hub: library/postgres tag 18.6 (compressed image sizes) (Official repository · read 10 Oct 2026)

All self-hosted apps