Wiki.js replaces Confluence with a self-hosted team wiki featuring Git storage sync, multiple editor engines, and full database control on your servers.
A growing operations team running internal infrastructure runbooks and client documentation faces steep per-seat license invoices from hosted platforms like Confluence. Consolidating standard operating procedures, architectural schematics, and incident playbooks behind single sign-on requires a dedicated documentation system that can run entirely on existing internal servers. Wiki.js provides that dedicated knowledge platform as a self-hosted Node.js service backed by a standard relational database.
The core operational divide between Wiki.js and Confluence centers on resource footprint and data sovereignty. Confluence Data Center requires a heavyweight Java runtime with substantial memory reservations, while Atlassian Cloud locks documentation into a remote multi-tenant environment billed per seat monthly. Wiki.js takes a leaner operational approach: a single Node.js daemon that boots in seconds, connects directly to an existing PostgreSQL, MySQL, or MariaDB database, and runs inside a container using minimal memory and CPU resources.
From an infrastructure perspective, Wiki.js also eliminates the database lock-in common to enterprise knowledge bases. Instead of vendor-specific database schemas, Wiki.js writes pages natively in Markdown or HTML with automated bidirectional Git synchronization. Every page change syncs directly to a private Git repository, turning documentation into version-controlled text that survives server failure. Confluence retains an advantage in real-time collaborative editing and native Jira integration; Wiki.js lacks live concurrent cursor editing, making simultaneous drafts prone to edit conflicts.
Wiki.js vs Confluence — which should an operations team choose? Choose Wiki.js for self-hosted data ownership, low hardware overhead, and zero per-seat fees; choose Confluence for live multi-user co-authoring and managed Atlassian hosting.
Is Wiki.js free for commercial use? Yes, Wiki.js is open-source software and can be used internally for commercial business operations without license fees.
Can Wiki.js run on a single server or Docker? Yes, official Docker images are available, and the application runs on Linux, macOS, and Windows with PostgreSQL, MySQL, MariaDB, or SQLite.
Wiki.js is a dependable choice for teams that want complete control over their internal documentation stack without recurring user fees, provided they do not require live multi-user document drafting. Its active codebase maintenance, regular dependency updates, and AGPL-3.0 license—which requires sharing source modifications if you distribute a modified hosted service—make it an operationally light alternative to proprietary enterprise documentation platforms.
We started this exact setup from scratch in a clean Linux machine on Nov 1, 2026 and checked it through Wiki.js's own API: every check passed. Recipes are re-checked regularly and removed if they stop working.
mkdir -p wiki-js && cd wiki-js
curl -fsSL https://open-source.store/tools/wiki-js/compose.yml -o compose.ymlcat > .env <<EOF
DB_PASS=$(openssl rand -hex 12)
[email protected]
ADMIN_PASSWORD=$(openssl rand -hex 12)
EOFDB_PASS — Password of the bundled PostgreSQL database. Generated above; keep it secret.ADMIN_EMAIL — Email address of the initial administrator account created at startup.ADMIN_PASSWORD — Password of the initial administrator account created at startup. Generated above; keep it secret.docker compose up -dservices:
db:
image: postgres:17-alpine
environment:
POSTGRES_DB: wiki
POSTGRES_USER: wikijs
POSTGRES_PASSWORD: ${DB_PASS}
restart: unless-stopped
volumes:
- db-data:/var/lib/postgresql/data
healthcheck:
test: ["CMD-SHELL", "pg_isready -U $${POSTGRES_USER} -d $${POSTGRES_DB}"]
interval: 5s
timeout: 5s
retries: 5
wiki:
image: ghcr.io/requarks/wiki:3.0.1
depends_on:
db:
condition: service_healthy
environment:
ADMIN_EMAIL: ${ADMIN_EMAIL}
ADMIN_PASS: ${ADMIN_PASSWORD}
DB_HOST: db
DB_PORT: 5432
DB_USER: wikijs
DB_PASS: ${DB_PASS}
DB_NAME: wiki
restart: unless-stopped
ports:
- "80:3000"
healthcheck:
test: ["CMD-SHELL", "curl -f http://localhost:3000/_ready || exit 1"]
interval: 10s
timeout: 5s
retries: 10
volumes:
db-data:
Lint, codegen, breaking-change checks and dependency management in one Git-native CLI. Open source, no registry lock-in.
Show that Wiki.js is listed as an open-source alternative. Paste into your README:
Ubuntu 24.04 · Apple container, Docker 29.1.3, Compose 2.40.3+ds1-0ubuntu1~24.04.1. Images pulled in 101 s: postgres:17-alpine, ghcr.io/requarks/wiki:3.0.1.
Based on the upstream setup. Official Docker Compose from the 3.0 installation docs. Wiki image pinned to 3.0.1 with PostgreSQL 17; database and administrator credentials moved to .env.
db-1 | 2026-11-01T23:41:38.244137462Z 2026-11-01 23:41:38.244 UTC [43] LOG: database system was shut down at 2026-11-01 23:41:38 UTC
db-1 | 2026-11-01T23:41:38.246702879Z 2026-11-01 23:41:38.246 UTC [40] LOG: database system is ready to accept connections
db-1 | 2026-11-01T23:41:38.332167462Z done
db-1 | 2026-11-01T23:41:38.332172421Z server started
db-1 | 2026-11-01T23:41:38.364469754Z CREATE DATABASE
db-1 | 2026-11-01T23:41:38.366160754Z
db-1 | 2026-11-01T23:41:38.366226879Z
db-1 | 2026-11-01T23:41:38.366236087Z /usr/local/bin/docker-entrypoint.sh: ignoring /docker-entrypoint-initdb.d/*
db-1 | 2026-11-01T23:41:38.366267962Z
db-1 | 2026-11-01T23:41:38.366710254Z waiting for server to shut down....2026-11-01 23:41:38.366 UTC [40] LOG: received fast shutdown request
db-1 | 2026-11-01T23:41:38.368649921Z 2026-11-01 23:41:38.367 UTC [40] LOG: aborting any active transactions
db-1 | 2026-11-01T23:41:38.370276879Z 2026-11-01 23:41:38.370 UTC [40] LOG: background worker "logical replication launcher" (PID 46) exited with exit code 1
db-1 | 2026-11-01T23:41:38.370280254Z 2026-11-01 23:41:38.370 UTC [41] LOG: shutting down
db-1 | 2026-11-01T23:41:38.370798837Z 2026-11-01 23:41:38.370 UTC [41] LOG: checkpoint starting: shutdown immediate
db-1 | 2026-11-01T23:41:38.393834837Z 2026-11-01 23:41:38.393 UTC [41] LOG: checkpoint complete: wrote 926 buffers (5.7%); 0 WAL file(s) added, 0 removed, 0 recycled; write=0.007 s, sync=0.016 s, total=0.024 s; sync files=301, longest=0.006 s, average=0.001 s; distance=4266 kB, estimate=4266 kB; lsn=0/191E7F8, redo lsn=0/191E7F8
db-1 | 2026-11-01T23:41:38.396572879Z 2026-11-01 23:41:38.396 UTC [40] LOG: database system is shut down
db-1 | 2026-11-01T23:41:38.470349129Z done
db-1 | 2026-11-01T23:41:38.470353254Z server stopped
db-1 | 2026-11-01T23:41:38.470764129Z
db-1 | 2026-11-01T23:41:38.470766962Z PostgreSQL init process complete; ready for start up.
db-1 | 2026-11-01T23:41:38.470767962Z
db-1 | 2026-11-01T23:41:38.483365962Z 2026-11-01 23:41:38.483 UTC [1] LOG: starting PostgreSQL 17.11 on aarch64-unknown-linux-musl, compiled by gcc (Alpine 15.2.0) 15.2.0, 64-bit
db-1 | 2026-11-01T23:41:38.483408087Z 2026-11-01 23:41:38.483 UTC [1] LOG: listening on IPv4 address "0.0.0.0", port 5432
db-1 | 2026-11-01T23:41:38.483415254Z 2026-11-01 23:41:38.483 UTC [1] LOG: listening on IPv6 address "::", port 5432
db-1 | 2026-11-01T23:41:38.485528046Z 2026-11-01 23:41:38.485 UTC [1] LOG: listening on Unix socket "/var/run/postgresql/.s.PGSQL.5432"
db-1 | 2026-11-01T23:41:38.487908087Z 2026-11-01 23:41:38.487 UTC [56] LOG: database system was shut down at 2026-11-01 23:41:38 UTC
db-1 | 2026-11-01T23:41:38.490444087Z 2026-11-01 23:41:38.490 UTC [1] LOG: database system is ready to accept connections
db-1 | 2026-11-01T23:42:04.339510959Z 2026-11-01 23:42:04.338 UTC [74] ERROR: invalid byte sequence for encoding "UTF8": 0x00
db-1 | 2026-11-01T23:42:04.339546084Z 2026-11-01 23:42:04.338 UTC [74] CONTEXT: unnamed portal parameter $5
db-1 | 2026-11-01T23:42:04.339548459Z 2026-11-01 23:42:04.338 UTC [74] STATEMENT: select ("pages"."publishState" = 'published' OR ("pages"."publishState" = 'scheduled'
db-1 | 2026-11-01T23:42:04.339549918Z AND ("pages"."publishStartDate" IS NULL OR "pages"."publishStartDate" <= $1::timestamp)
db-1 | 2026-11-01T23:42:04.339551668Z AND ("pages"."publishEndDate" IS NULL OR "pages"."publishEndDate" > $2::timestamp))), "locale", "path", "title", "description", "render", "updatedAt", "tags", "editor", "isSearchable", "password", "localeGroupId" from "pages" where (("pages"."siteId" = $3) and ("pages"."locale" = $4) and ("pages"."path" = $5) and (("pages"."publishState" = 'published' OR ("pages"."publishState" = 'scheduled'
db-1 | 2026-11-01T23:42:04.339560834Z AND ("pages"."publishStartDate" IS NULL OR "pages"."publishStartDate" <= $6::timestamp)
db-1 | 2026-11-01T23:42:04.339561918Z AND ("pages"."publishEndDate" IS NULL OR "pages"."publishEndDate" > $7::timestamp))))) limit $8
db-1 | 2026-11-01T23:42:04.339563043Z 2026-11-01 23:42:04.339 UTC [71] ERROR: invalid byte sequence for encoding "UTF8": 0x00
db-1 | 2026-11-01T23:42:04.339564001Z 2026-11-01 23:42:04.339 UTC [71] CONTEXT: unnamed portal parameter $5
db-1 | 2026-11-01T23:42:04.339564876Z 2026-11-01 23:42:04.339 UTC [71] STATEMENT: select ("pages"."publishState" = 'published' OR ("pages"."publishState" = 'scheduled'
db-1 | 2026-11-01T23:42:04.339565834Z AND ("pages"."publishStartDate" IS NULL OR "pages"."publishStartDate" <= $1::timestamp)
db-1 | 2026-11-01T23:42:04.339566793Z AND ("pages"."publishEndDate" IS NULL OR "pages"."publishEndDate" > $2::timestamp))), "locale", "path", "title", "description", "render", "updatedAt", "tags", "editor", "isSearchable", "password", "localeGroupId" from "pages" where (("pages"."siteId" = $3) and ("pages"."locale" = $4) and ("pages"."path" = $5) and (("pages"."publishState" = 'published' OR ("pages"."publishState" = 'scheduled'
db-1 | 2026-11-01T23:42:04.339568584Z AND ("pages"."publishStartDate" IS NULL OR "pages"."publishStartDate" <= $6::timestamp)
db-1 | 2026-11-01T23:42:04.339569459Z AND ("pages"."publishEndDate" IS NULL OR "pages"."publishEndDate" > $7::timestamp))))) limit $8
db-1 | 2026-11-01T23:42:57.335457636Z 2026-11-01 23:42:57.335 UTC [84] ERROR: invalid byte sequence for encoding "UTF8": 0x00
db-1 | 2026-11-01T23:42:57.335495720Z 2026-11-01 23:42:57.335 UTC [84] CONTEXT: unnamed portal parameter $5
db-1 | 2026-11-01T23:42:57.335498303Z 2026-11-01 23:42:57.335 UTC [84] STATEMENT: select ("pages"."publishState" = 'published' OR ("pages"."publishState" = 'scheduled'
db-1 | 2026-11-01T23:42:57.335499886Z AND ("pages"."publishStartDate" IS NULL OR "pages"."publishStartDate" <= $1::timestamp)
db-1 | 2026-11-01T23:42:57.335501595Z AND ("pages"."publishEndDate" IS NULL OR "pages"."publishEndDate" > $2::timestamp))), "locale", "path", "title", "description", "render", "updatedAt", "tags", "editor", "isSearchable", "password", "localeGroupId" from "pages" where (("pages"."siteId" = $3) and ("pages"."locale" = $4) and ("pages"."path" = $5) and (("pages"."publishState" = 'published' OR ("pages"."publishState" = 'scheduled'
db-1 | 2026-11-01T23:42:57.335504553Z AND ("pages"."publishStartDate" IS NULL OR "pages"."publishStartDate" <= $6::timestamp)
db-1 | 2026-11-01T23:42:57.335505678Z AND ("pages"."publishEndDate" IS NULL OR "pages"."publishEndDate" > $7::timestamp))))) limit $8
db-1 | 2026-11-01T23:42:57.342892386Z 2026-11-01 23:42:57.338 UTC [73] ERROR: invalid byte sequence for encoding "UTF8": 0x00
db-1 | 2026-11-01T23:42:57.342900928Z 2026-11-01 23:42:57.338 UTC [73] CONTEXT: unnamed portal parameter $5
db-1 | 2026-11-01T23:42:57.342907303Z 2026-11-01 23:42:57.338 UTC [73] STATEMENT: select ("pages"."publishState" = 'published' OR ("pages"."publishState" = 'scheduled'
db-1 | 2026-11-01T23:42:57.342908428Z AND ("pages"."publishStartDate" IS NULL OR "pages"."publishStartDate" <= $1::timestamp)
db-1 | 2026-11-01T23:42:57.342909595Z AND ("pages"."publishEndDate" IS NULL OR "pages"."publishEndDate" > $2::timestamp))), "locale", "path", "title", "description", "render", "updatedAt", "tags", "editor", "isSearchable", "password", "localeGroupId" from "pages" where (("pages"."siteId" = $3) and ("pages"."locale" = $4) and ("pages"."path" = $5) and (("pages"."publishState" = 'published' OR ("pages"."publishState" = 'scheduled'
db-1 | 2026-11-01T23:42:57.342911345Z AND ("pages"."publishStartDate" IS NULL OR "pages"."publishStartDate" <= $6::timestamp)
db-1 | 2026-11-01T23:42:57.342912220Z AND ("pages"."publishEndDate" IS NULL OR "pages"."publishEndDate" > $7::timestamp))))) limit $8
db-1 | 2026-11-01T23:43:18.312006923Z 2026-11-01 23:43:18.310 UTC [70] ERROR: invalid byte sequence for encoding "UTF8": 0x00
db-1 | 2026-11-01T23:43:18.312029631Z 2026-11-01 23:43:18.310 UTC [70] CONTEXT: unnamed portal parameter $5
db-1 | 2026-11-01T23:43:18.312031839Z 2026-11-01 23:43:18.310 UTC [70] STATEMENT: select ("pages"."publishState" = 'published' OR ("pages"."publishState" = 'scheduled'
db-1 | 2026-11-01T23:43:18.312033464Z AND ("pages"."publishStartDate" IS NULL OR "pages"."publishStartDate" <= $1::timestamp)
db-1 | 2026-11-01T23:43:18.312035089Z AND ("pages"."publishEndDate" IS NULL OR "pages"."publishEndDate" > $2::timestamp))), "locale", "path", "title", "description", "render", "updatedAt", "tags", "editor", "isSearchable", "password", "localeGroupId" from "pages" where (("pages"."siteId" = $3) and ("pages"."locale" = $4) and ("pages"."path" = $5) and (("pages"."publishState" = 'published' OR ("pages"."publishState" = 'scheduled'
db-1 | 2026-11-01T23:43:18.312037881Z AND ("pages"."publishStartDate" IS NULL OR "pages"."publishStartDate" <= $6::timestamp)
db-1 | 2026-11-01T23:43:18.312039089Z AND ("pages"."publishEndDate" IS NULL OR "pages"."publishEndDate" > $7::timestamp))))) limit $8
db-1 | 2026-11-01T23:43:18.328211923Z 2026-11-01 23:43:18.328 UTC [72] ERROR: invalid byte sequence for encoding "UTF8": 0x00
db-1 | 2026-11-01T23:43:18.328223298Z 2026-11-01 23:43:18.328 UTC [72] CONTEXT: unnamed portal parameter $5
db-1 | 2026-11-01T23:43:18.328224464Z 2026-11-01 23:43:18.328 UTC [72] STATEMENT: select ("pages"."publishState" = 'published' OR ("pages"."publishState" = 'scheduled'
db-1 | 2026-11-01T23:43:18.328225506Z AND ("pages"."publishStartDate" IS NULL OR "pages"."publishStartDate" <= $1::timestamp)
db-1 | 2026-11-01T23:43:18.328226839Z AND ("pages"."publishEndDate" IS NULL OR "pages"."publishEndDate" > $2::timestamp))), "locale", "path", "title", "description", "render", "updatedAt", "tags", "editor", "isSearchable", "password", "localeGroupId" from "pages" where (("pages"."siteId" = $3) and ("pages"."locale" = $4) and ("pages"."path" = $5) and (("pages"."publishState" = 'published' OR ("pages"."publishState" = 'scheduled'
db-1 | 2026-11-01T23:43:18.328235006Z AND ("pages"."publishStartDate" IS NULL OR "pages"."publishStartDate" <= $6::timestamp)
db-1 | 2026-11-01T23:43:18.328236048Z AND ("pages"."publishEndDate" IS NULL OR "pages"."publishEndDate" > $7::timestamp))))) limit $8
db-1 | 2026-11-01T23:43:30.306333887Z 2026-11-01 23:43:30.305 UTC [185] ERROR: invalid byte sequence for encoding "UTF8": 0x00
db-1 | 2026-11-01T23:43:30.306391553Z 2026-11-01 23:43:30.305 UTC [185] CONTEXT: unnamed portal parameter $5
db-1 | 2026-11-01T23:43:30.306395345Z 2026-11-01 23:43:30.305 UTC [185] STATEMENT: select ("pages"."publishState" = 'published' OR ("pages"."publishState" = 'scheduled'
db-1 | 2026-11-01T23:43:30.306397512Z AND ("pages"."publishStartDate" IS NULL OR "pages"."publishStartDate" <= $1::timestamp)
db-1 | 2026-11-01T23:43:30.306400553Z AND ("pages"."publishEndDate" IS NULL OR "pages"."publishEndDate" > $2::timestamp))), "locale", "path", "title", "description", "render", "updatedAt", "tags", "editor", "isSearchable", "password", "localeGroupId" from "pages" where (("pages"."siteId" = $3) and ("pages"."locale" = $4) and ("pages"."path" = $5) and (("pages"."publishState" = 'published' OR ("pages"."publishState" = 'scheduled'
db-1 | 2026-11-01T23:43:30.306403970Z AND ("pages"."publishStartDate" IS NULL OR "pages"."publishStartDate" <= $6::timestamp)
db-1 | 2026-11-01T23:43:30.306405637Z AND ("pages"."publishEndDate" IS NULL OR "pages"."publishEndDate" > $7::timestamp))))) limit $8
db-1 | 2026-11-01T23:43:30.331835470Z 2026-11-01 23:43:30.331 UTC [83] ERROR: invalid byte sequence for encoding "UTF8": 0x00
db-1 | 2026-11-01T23:43:30.331848220Z 2026-11-01 23:43:30.331 UTC [83] CONTEXT: unnamed portal parameter $5
db-1 | 2026-11-01T23:43:30.331850053Z 2026-11-01 23:43:30.331 UTC [83] STATEMENT: select ("pages"."publishState" = 'published' OR ("pages"."publishState" = 'scheduled'
db-1 | 2026-11-01T23:43:30.331851678Z AND ("pages"."publishStartDate" IS NULL OR "pages"."publishStartDate" <= $1::timestamp)
db-1 | 2026-11-01T23:43:30.331853678Z AND ("pages"."publishEndDate" IS NULL OR "pages"."publishEndDate" > $2::timestamp))), "locale", "path", "title", "description", "render", "updatedAt", "tags", "editor", "isSearchable", "password", "localeGroupId" from "pages" where (("pages"."siteId" = $3) and ("pages"."locale" = $4) and ("pages"."path" = $5) and (("pages"."publishState" = 'published' OR ("pages"."publishState" = 'scheduled'
db-1 | 2026-11-01T23:43:30.331856220Z AND ("pages"."publishStartDate" IS NULL OR "pages"."publishStartDate" <= $6::timestamp)
db-1 | 2026-11-01T23:43:30.331857428Z AND ("pages"."publishEndDate" IS NULL OR "pages"."publishEndDate" > $7::timestamp))))) limit $8
db-1 | 2026-11-01T23:43:40.341521751Z 2026-11-01 23:43:40.341 UTC [243] ERROR: invalid byte sequence for encoding "UTF8": 0x00
db-1 | 2026-11-01T23:43:40.341540918Z 2026-11-01 23:43:40.341 UTC [243] CONTEXT: unnamed portal parameter $5
db-1 | 2026-11-01T23:43:40.341542543Z 2026-11-01 23:43:40.341 UTC [243] STATEMENT: select ("pages"."publishState" = 'published' OR ("pages"."publishState" = 'scheduled'
db-1 | 2026-11-01T23:43:40.341546460Z AND ("pages"."publishStartDate" IS NULL OR "pages"."publishStartDate" <= $1::timestamp)
db-1 | 2026-11-01T23:43:40.341547918Z AND ("pages"."publishEndDate" IS NULL OR "pages"."publishEndDate" > $2::timestamp))), "locale", "path", "title", "description", "render", "updatedAt", "tags", "editor", "isSearchable", "password", "localeGroupId" from "pages" where (("pages"."siteId" = $3) and ("pages"."locale" = $4) and ("pages"."path" = $5) and (("pages"."publishState" = 'published' OR ("pages"."publishState" = 'scheduled'
db-1 | 2026-11-01T23:43:40.341550251Z AND ("pages"."publishStartDate" IS NULL OR "pages"."publishStartDate" <= $6::timestamp)
db-1 | 2026-11-01T23:43:40.341551210Z AND ("pages"."publishEndDate" IS NULL OR "pages"."publishEndDate" > $7::timestamp))))) limit $8
db-1 | 2026-11-01T23:43:40.346995543Z 2026-11-01 23:43:40.346 UTC [106] ERROR: invalid byte sequence for encoding "UTF8": 0x00
db-1 | 2026-11-01T23:43:40.347008335Z 2026-11-01 23:43:40.346 UTC [106] CONTEXT: unnamed portal parameter $5
db-1 | 2026-11-01T23:43:40.347009835Z 2026-11-01 23:43:40.346 UTC [106] STATEMENT: select ("pages"."publishState" = 'published' OR ("pages"."publishState" = 'scheduled'
db-1 | 2026-11-01T23:43:40.347011251Z AND ("pages"."publishStartDate" IS NULL OR "pages"."publishStartDate" <= $1::timestamp)
db-1 | 2026-11-01T23:43:40.347012585Z AND ("pages"."publishEndDate" IS NULL OR "pages"."publishEndDate" > $2::timestamp))), "locale", "path", "title", "description", "render", "updatedAt", "tags", "editor", "isSearchable", "password", "localeGroupId" from "pages" where (("pages"."siteId" = $3) and ("pages"."locale" = $4) and ("pages"."path" = $5) and (("pages"."publishState" = 'published' OR ("pages"."publishState" = 'scheduled'
db-1 | 2026-11-01T23:43:40.347014793Z AND ("pages"."publishStartDate" IS NULL OR "pages"."publishStartDate" <= $6::timestamp)
db-1 | 2026-11-01T23:43:40.347015751Z AND ("pages"."publishEndDate" IS NULL OR "pages"."publishEndDate" > $7::timestamp))))) limit $8
db-1 | 2026-11-01T23:43:54.335770008Z 2026-11-01 23:43:54.335 UTC [260] ERROR: invalid byte sequence for encoding "UTF8": 0x00
db-1 | 2026-11-01T23:43:54.335784675Z 2026-11-01 23:43:54.335 UTC [260] CONTEXT: unnamed portal parameter $5
db-1 | 2026-11-01T23:43:54.335786133Z 2026-11-01 23:43:54.335 UTC [260] STATEMENT: select ("pages"."publishState" = 'published' OR ("pages"."publishState" = 'scheduled'
db-1 | 2026-11-01T23:43:54.335787425Z AND ("pages"."publishStartDate" IS NULL OR "pages"."publishStartDate" <= $1::timestamp)
db-1 | 2026-11-01T23:43:54.335788883Z AND ("pages"."publishEndDate" IS NULL OR "pages"."publishEndDate" > $2::timestamp))), "locale", "path", "title", "description", "render", "updatedAt", "tags", "editor", "isSearchable", "password", "localeGroupId" from "pages" where (("pages"."siteId" = $3) and ("pages"."locale" = $4) and ("pages"."path" = $5) and (("pages"."publishState" = 'published' OR ("pages"."publishState" = 'scheduled'
db-1 | 2026-11-01T23:43:54.335791258Z AND ("pages"."publishStartDate" IS NULL OR "pages"."publishStartDate" <= $6::timestamp)
db-1 | 2026-11-01T23:43:54.335797300Z AND ("pages"."publishEndDate" IS NULL OR "pages"."publishEndDate" > $7::timestamp))))) limit $8
db-1 | 2026-11-01T23:43:54.336072966Z 2026-11-01 23:43:54.335 UTC [186] ERROR: invalid byte sequence for encoding "UTF8": 0x00
db-1 | 2026-11-01T23:43:54.336076675Z 2026-11-01 23:43:54.335 UTC [186] CONTEXT: unnamed portal parameter $5
db-1 | 2026-11-01T23:43:54.336077591Z 2026-11-01 23:43:54.335 UTC [186] STATEMENT: select ("pages"."publishState" = 'published' OR ("pages"."publishState" = 'scheduled'
db-1 | 2026-11-01T23:43:54.336078591Z AND ("pages"."publishStartDate" IS NULL OR "pages"."publishStartDate" <= $1::timestamp)
db-1 | 2026-11-01T23:43:54.336079591Z AND ("pages"."publishEndDate" IS NULL OR "pages"."publishEndDate" > $2::timestamp))), "locale", "path", "title", "description", "render", "updatedAt", "tags", "editor", "isSearchable", "password", "localeGroupId" from "pages" where (("pages"."siteId" = $3) and ("pages"."locale" = $4) and ("pages"."path" = $5) and (("pages"."publishState" = 'published' OR ("pages"."publishState" = 'scheduled'
db-1 | 2026-11-01T23:43:54.336081341Z AND ("pages"."publishStartDate" IS NULL OR "pages"."publishStartDate" <= $6::timestamp)
db-1 | 2026-11-01T23:43:54.336082216Z AND ("pages"."publishEndDate" IS NULL OR "pages"."publishEndDate" > $7::timestamp))))) limit $8
wiki-1 | 2026-11-01T23:43:54.339746175Z AND ("pages"."publishStartDate" IS NULL OR "pages"."publishStartDate" <= $6::timestamp)
wiki-1 | 2026-11-01T23:43:54.339747341Z AND ("pages"."publishEndDate" IS NULL OR "pages"."publishEndDate" > $7::timestamp))))) limit $8
wiki-1 | 2026-11-01T23:43:54.339748383Z params: 2026-11-01T23:43:54.334Z,2026-11-01T23:43:54.334Z,4bd21aef-c36e-4b4f-aec4-4fabc18de293,en,../../etc/passwd,2026-11-01T23:43:54.334Z,2026-11-01T23:43:54.334Z,1
wiki-1 | 2026-11-01T23:43:54.339749591Z 2026-11-01T23:43:54.337Z [524e211957] warn: Cannot describe /.%00./.%00./etc/passwd for a client that will not render it: Failed query: select ("pages"."publishState" = 'published' OR ("pages"."publishState" = 'scheduled'
wiki-1 | 2026-11-01T23:43:54.339750800Z AND ("pages"."publishStartDate" IS NULL OR "pages"."publishStartDate" <= $1::timestamp)
wiki-1 | 2026-11-01T23:43:54.339751800Z AND ("pages"."publishEndDate" IS NULL OR "pages"."publishEndDate" > $2::timestamp))), "locale", "path", "title", "description", "render", "updatedAt", "tags", "editor", "isSearchable", "password", "localeGroupId" from "pages" where (("pages"."siteId" = $3) and ("pages"."locale" = $4) and ("pages"."path" = $5) and (("pages"."publishState" = 'published' OR ("pages"."publishState" = 'scheduled'
wiki-1 | 2026-11-01T23:43:54.339753508Z AND ("pages"."publishStartDate" IS NULL OR "pages"."publishStartDate" <= $6::timestamp)
wiki-1 | 2026-11-01T23:43:54.339754425Z AND ("pages"."publishEndDate" IS NULL OR "pages"."publishEndDate" > $7::timestamp))))) limit $8
wiki-1 | 2026-11-01T23:43:54.339755591Z params: 2026-11-01T23:43:54.333Z,2026-11-01T23:43:54.333Z,4bd21aef-c36e-4b4f-aec4-4fabc18de293,en,../../etc/passwd,2026-11-01T23:43:54.333Z,2026-11-01T23:43:54.333Z,1