Skip to content

Weavestream Weavestream

Description / nameInput element
Container Registry
Timezone
User ID
Group ID

Build Status Last Commit sysvipc Required

Open-source, self-hosted IT documentation and asset management platform built around a relational knowledge model.

Daemonless daemonless/weavestream
Source Weavestream/Weavestream
Website weavestream.io

Parts

Service Image Role
postgres ghcr.io/daemonless/postgres:16 docs
redis ghcr.io/daemonless/redis:latest docs
api ghcr.io/daemonless/weavestream-api:latest docs
worker ghcr.io/daemonless/weavestream-worker:latest docs
web ghcr.io/daemonless/weavestream-web:latest docs

Before deploying, ensure your host environment is ready. See the Quick Start Guide for host setup instructions, including the security model for host vs. container privileges.

Deployment

1. Save as .env and fill in what is empty:

# Weavestream environment variables
# Copy to .env and adjust as needed

POSTGRES_USER=weavestream
POSTGRES_PASSWORD=weavestream
POSTGRES_DB=weavestream

DATA_DIR=./data
WEB_HOST_PORT=3000
APP_URL=http://localhost:3000
API_URL=http://localhost:3000/api

PUID=1000
PGID=1000
TZ=UTC

# Reverse proxy hops in front of the web UI; 0 when it is exposed directly
TRUST_PROXY_HOPS=1

# Secrets: no defaults on purpose, a shipped value would be shared by every
# install. Generate each with `openssl rand -base64 32`. Losing one after data
# is written under it is unrecoverable.
JWT_SIGNING_KEY=
MFA_ENCRYPTION_KEY=
COOKIE_SIGNING_KEY=
CSRF_SIGNING_KEY=
PASSWORD_ENCRYPTION_KEY=
INTEGRATION_SECRET_KEY=
SMTP_SECRET_KEY=

2. Save as compose.yaml:

name: weavestream

services:
  postgres:
    image: ghcr.io/daemonless/postgres:16
    container_name: weavestream-postgres
    restart: always
    annotations:
      org.freebsd.jail.allow.sysvipc: "true"
    environment:
      POSTGRES_USER: ${POSTGRES_USER:-weavestream}
      POSTGRES_PASSWORD: ${POSTGRES_PASSWORD:-weavestream}
      POSTGRES_DB: ${POSTGRES_DB:-weavestream}
      PUID: ${PUID:-1000}
      PGID: ${PGID:-1000}
      TZ: ${TZ:-UTC}
    volumes:
      - ${DATA_DIR}/postgres:/var/lib/postgresql/data

  redis:
    image: ghcr.io/daemonless/redis:latest
    container_name: weavestream-redis
    restart: always
    environment:
      PUID: ${PUID:-1000}
      PGID: ${PGID:-1000}
      TZ: ${TZ:-UTC}
    volumes:
      - ${DATA_DIR}/redis:/config

  api:
    image: ghcr.io/daemonless/weavestream-api:latest
    container_name: weavestream-api
    restart: always
    depends_on:
      - postgres
      - redis
    environment:
      PUID: ${PUID:-1000}
      PGID: ${PGID:-1000}
      TZ: ${TZ:-UTC}
      DATABASE_URL: postgresql://${POSTGRES_USER:-weavestream}:${POSTGRES_PASSWORD:-weavestream}@postgres:5432/${POSTGRES_DB:-weavestream}
      REDIS_URL: redis://redis:6379/0
      APP_URL: ${APP_URL:-http://localhost:3000}
      API_URL: ${API_URL:-http://localhost:3000/api}
      FILE_STORAGE_DIR: /var/lib/weavestream/files
      BACKUP_STORAGE_DIR: /var/lib/weavestream/backup
      JWT_SIGNING_KEY: ${JWT_SIGNING_KEY}
      MFA_ENCRYPTION_KEY: ${MFA_ENCRYPTION_KEY}
      PASSWORD_ENCRYPTION_KEY: ${PASSWORD_ENCRYPTION_KEY}
      INTEGRATION_SECRET_KEY: ${INTEGRATION_SECRET_KEY}
      SMTP_SECRET_KEY: ${SMTP_SECRET_KEY}
      COOKIE_SIGNING_KEY: ${COOKIE_SIGNING_KEY}
      CSRF_SIGNING_KEY: ${CSRF_SIGNING_KEY}
    volumes:
      - ${DATA_DIR}/files:/var/lib/weavestream/files
      - ${DATA_DIR}/backup:/var/lib/weavestream/backup:ro

  worker:
    image: ghcr.io/daemonless/weavestream-worker:latest
    container_name: weavestream-worker
    restart: always
    depends_on:
      - redis
      - api
    environment:
      PUID: ${PUID:-1000}
      PGID: ${PGID:-1000}
      TZ: ${TZ:-UTC}
      DATABASE_URL: postgresql://${POSTGRES_USER:-weavestream}:${POSTGRES_PASSWORD:-weavestream}@postgres:5432/${POSTGRES_DB:-weavestream}
      REDIS_URL: redis://redis:6379/0
      APP_URL: ${APP_URL:-http://localhost:3000}
      API_URL: ${API_URL:-http://localhost:3000/api}
      FILE_STORAGE_DIR: /var/lib/weavestream/files
      BACKUP_STORAGE_DIR: /var/lib/weavestream/backup
      JWT_SIGNING_KEY: ${JWT_SIGNING_KEY}
      MFA_ENCRYPTION_KEY: ${MFA_ENCRYPTION_KEY}
      PASSWORD_ENCRYPTION_KEY: ${PASSWORD_ENCRYPTION_KEY}
      INTEGRATION_SECRET_KEY: ${INTEGRATION_SECRET_KEY}
      SMTP_SECRET_KEY: ${SMTP_SECRET_KEY}
      COOKIE_SIGNING_KEY: ${COOKIE_SIGNING_KEY}
      CSRF_SIGNING_KEY: ${CSRF_SIGNING_KEY}
    volumes:
      - ${DATA_DIR}/files:/var/lib/weavestream/files
      - ${DATA_DIR}/backup:/var/lib/weavestream/backup

  web:
    image: ghcr.io/daemonless/weavestream-web:latest
    container_name: weavestream-web
    restart: always
    depends_on:
      - api
    environment:
      PUID: ${PUID:-1000}
      PGID: ${PGID:-1000}
      TZ: ${TZ:-UTC}
      API_INTERNAL_URL: http://api:4000
      COOKIE_SIGNING_KEY: ${COOKIE_SIGNING_KEY}
      TRUST_PROXY_HOPS: ${TRUST_PROXY_HOPS:-1}
    ports:
      - "${WEB_HOST_PORT:-3000}:3000"

Then run podman-compose up -d.

Interactive Configuration

Parameters

Environment Variables

Variable Default Description
POSTGRES_USER weavestream PostgreSQL database user (default: weavestream)
POSTGRES_PASSWORD weavestream Password for the PostgreSQL database
POSTGRES_DB weavestream PostgreSQL database name (default: weavestream)
PUID 1000 User ID for the container processes
PGID 1000 Group ID for the container processes
TZ UTC Timezone for the containers
APP_URL http://localhost:3000 Public URL where users access Weavestream (default: http://localhost:3000)
API_URL http://localhost:3000/api Public URL of the API (default: http://localhost:3000/api)
DATA_DIR ./data Host path for persistent data (files, backups, database, redis)
WEB_HOST_PORT 3000 Published host port for the web UI (default: 3000)
TRUST_PROXY_HOPS 1 Reverse proxy hops in front of the web UI, 0 when exposed directly (default: 1)
JWT_SIGNING_KEY <JWT_SIGNING_KEY> 32-byte base64 secret shared by api and worker
MFA_ENCRYPTION_KEY <MFA_ENCRYPTION_KEY> 32-byte base64 secret shared by api and worker
PASSWORD_ENCRYPTION_KEY <PASSWORD_ENCRYPTION_KEY> 32-byte base64 secret shared by api and worker
INTEGRATION_SECRET_KEY <INTEGRATION_SECRET_KEY> 32-byte base64 secret shared by api and worker
SMTP_SECRET_KEY <SMTP_SECRET_KEY> 32-byte base64 secret shared by api and worker
COOKIE_SIGNING_KEY <COOKIE_SIGNING_KEY> 32-byte base64 secret shared by api and worker, and web
CSRF_SIGNING_KEY <CSRF_SIGNING_KEY> 32-byte base64 secret shared by api and worker

Volumes

Path Description
/var/lib/postgresql/data PostgreSQL database storage

Implementation Details

  • Architectures: amd64
  • User: bsd (UID/GID set via PUID/PGID). Defaults to 1000:1000.
  • Base: Built on ghcr.io/daemonless/base (FreeBSD 15.1).
  • sysvipc: Requires --annotation 'org.freebsd.jail.allow.sysvipc=true' (ocijail 0.5.0+)

Need help? Join our Discord community.