Back to Blog
Tutorial11 min read2026-07-03

How to Deploy Outline Team Wiki

Outline is a fast, modern team knowledge base. This guide deploys it with managed PostgreSQL and Redis, configures SSO authentication, and sets up object storage for attachments.

Ajay Kumar
Ajay Kumar
Founder & DevOps, PandaStack

Outline is one of the best open-source team wikis — a fast, real-time, Notion-like knowledge base with a beautiful editor, full-text search, and deep SSO integration. It's a serious application: it requires PostgreSQL, Redis, an authentication provider, and object storage. There's no "just run one container with no config" path, because Outline mandates SSO from day one.

This guide deploys Outline properly.

Outline's requirements

ComponentWhy
PostgreSQLPrimary datastore (documents, users, permissions)
RedisReal-time collaboration, caching, websockets
Object storage (S3)File and image attachments
SSO providerRequired — no built-in email/password auth
SMTP (optional)Invitations and notifications

The SSO requirement is the biggest surprise for newcomers. Outline does not have its own username/password login — you authenticate via Google, Slack, OIDC, Azure AD, etc. Plan your identity provider before deploying.

Step 1: Provision PostgreSQL and Redis

On [PandaStack](https://dashboard.pandastack.io), create:

  • A managed PostgreSQL (16.x recommended).
  • A managed Redis.

Outline reads DATABASE_URL and REDIS_URL directly, so linking the managed PostgreSQL auto-injects the database connection.

Step 2: Generate secrets

Outline needs two random secrets:

openssl rand -hex 32   # SECRET_KEY
openssl rand -hex 32   # UTILS_SECRET

Step 3: Set up an SSO provider

Pick one (you can add more later). For OIDC (works with most IdPs):

OIDC_CLIENT_ID=<client-id>
OIDC_CLIENT_SECRET=<client-secret>
OIDC_AUTH_URI=https://idp.example.com/authorize
OIDC_TOKEN_URI=https://idp.example.com/token
OIDC_USERINFO_URI=https://idp.example.com/userinfo
OIDC_DISPLAY_NAME=Company SSO

For Google:

GOOGLE_CLIENT_ID=<id>
GOOGLE_CLIENT_SECRET=<secret>

Register your Outline URL's callback (e.g. https://wiki.example.com/auth/oidc.callback) with your IdP.

Step 4: Configure object storage

Attachments go to S3-compatible storage — local disk won't survive redeploys:

FILE_STORAGE=s3
AWS_ACCESS_KEY_ID=<key>
AWS_SECRET_ACCESS_KEY=<secret>
AWS_REGION=<region>
AWS_S3_UPLOAD_BUCKET_NAME=<bucket>
AWS_S3_UPLOAD_BUCKET_URL=<endpoint>
AWS_S3_FORCE_PATH_STYLE=true

Step 5: Assemble the full environment

URL=https://wiki.example.com
PORT=3000
NODE_ENV=production

SECRET_KEY=<generated>
UTILS_SECRET=<generated>

DATABASE_URL=${DATABASE_URL}          # injected by linking managed PostgreSQL
PGSSLMODE=require
REDIS_URL=redis://:<password>@<host>:6379

# plus SSO + S3 vars from above

URL must exactly match your public HTTPS address or SSO callbacks and websockets break.

Step 6: Run database migrations

Outline ships migrations that must run before first boot. Run as a pre-deploy/init step using the Outline image:

yarn db:migrate --env=production-ssl-disabled

(Use the SSL-appropriate variant for your managed database; the image documents both.)

Step 7: Deploy

FROM outlinewiki/outline:latest
# Serves on port 3000

Pin a version in production.

  1. 1Push the repo (or reference the image) to GitHub.
  2. 2Create a container app on PandaStack.
  3. 3Link managed PostgreSQL; set Redis, SSO, S3, and secret env vars (secrets as secrets).
  4. 4Set the migrate command as a pre-deploy hook.
  5. 5Expose port 3000.
  6. 6Add a custom domain matching URL; SSL is automatic.

Outline uses websockets for real-time collaboration — PandaStack's Kong ingress passes WebSocket upgrades through, so live editing works.

Step 8: First login and team setup

Visit your domain, authenticate via SSO — the first user to log in becomes the admin. From there:

  • Invite teammates (they sign in via the same SSO).
  • Create collections (top-level groupings of documents).
  • Set permissions per collection.
  • Optionally configure SMTP so invitations and notifications email out.

Why all these moving parts?

Outline is real-time collaborative software, so it legitimately needs Redis for pub/sub and websockets, PostgreSQL for the document graph, and object storage for media. It's heavier than a static wiki, but the editing experience and search are worth it for teams that live in their knowledge base. If you want something far simpler and are fine editing Markdown files, a static-site wiki (VitePress, Docusaurus) deployed as a static site is a lighter alternative — but you lose real-time editing, permissions, and SSO.

Operating tips

  • Back up PostgreSQL — it holds every document. Scheduled backups cover it.
  • Object storage holds attachments — back that up too.
  • Keep URL stable — changing it breaks SSO callbacks.
  • Watch Redis — collaboration features depend on it being healthy.
  • Pin image versions and run migrations on upgrades.

References

  • [Outline documentation](https://docs.getoutline.com/)
  • [Outline self-hosting guide](https://docs.getoutline.com/s/hosting/)
  • [Outline environment variables](https://github.com/outline/outline/blob/main/.env.sample)
  • [Outline Docker image](https://hub.docker.com/r/outlinewiki/outline)

---

Outline is a premium self-hosted wiki experience, and it needs the supporting cast: PostgreSQL, Redis, object storage, and SSO. PandaStack provisions the managed PostgreSQL and Redis, injects connections, and passes websockets through its ingress for real-time editing. Start your knowledge base at [dashboard.pandastack.io](https://dashboard.pandastack.io).

Ready to deploy?

Start free on PandaStack.

Start free on PandaStack

More in Tutorial

Browse all Tutorial articles →

See also