Poznote
Deploy Poznote on Kubernetes as a self-hosted note-taking and documentation platform.
Overview
The HelmForge Poznote chart uses the official ghcr.io/timothepoznanski/poznote:6.121.0 image. The container serves the web frontend and API on port 80 by default, and stores SQLite, notes, attachments and configuration under /var/www/html/data.
Poznote is designed for personal and small-team use. Data persistence relies on a single PVC. Scaling beyond one replica is not supported because SQLite does not handle concurrent writes from multiple instances.
Configuration Reference
Core runtime:
image.repository,image.tag,image.pullPolicy: official pinned Poznote image and pull behavior.replicaCount: pod count. The chart rejects values greater than1because Poznote uses SQLite.app.timezone,app.debug.containerPorts.http: Nginx listener inside the application container.commonLabels,nameOverride,fullnameOverride.
Secrets:
secrets.existingSecret: existing Secret for Poznote OIDC credentials.secrets.oidcClientIdKey,secrets.oidcClientId: OIDC client ID source.secrets.oidcClientSecretKey,secrets.oidcClientSecret: OIDC client secret source.
OIDC:
poznote.oidc.disableNormalLogin: force SSO-only mode, hiding the local login form.
Sharing:
poznote.sharing.hideRestrictUsers: hide the “Restrict to specific users” controls in note, folder, and workspace sharing dialogs. Existing restrictions continue to work.
Persistence:
persistence.data: SQLite database, notes, attachments, and configuration. Single PVC, 5Gi default.
Exposure and operations:
service.type,service.port,service.annotations,service.ipFamilyPolicy,service.ipFamilies. The Service port is independent from the application listener.ingress.enabled,ingress.ingressClassName,ingress.annotations,ingress.hosts,ingress.tls.gatewayAPI.enabled,gatewayAPI.httpRoutes.externalSecrets.enabled,externalSecrets.items.networkPolicy.enabled,networkPolicy.ingressFrom,networkPolicy.egress.probes.startup,probes.liveness,probes.readiness.resources,podSecurityContext,securityContext.serviceAccount,pdb,nodeSelector,tolerations,affinity,topologySpreadConstraints.priorityClassName,terminationGracePeriodSeconds,podLabels,podAnnotations,extraVolumes,extraVolumeMounts,extraManifests.
Installation
helm repo add helmforge https://repo.helmforge.dev
helm repo update
helm install poznote helmforge/poznote
OCI install:
helm install poznote oci://ghcr.io/helmforgedev/helm/poznote
Production Example
secrets:
existingSecret: poznote-oidc
persistence:
data:
size: 10Gi
ingress:
enabled: true
ingressClassName: traefik
hosts:
- host: notes.example.com
paths:
- path: /
pathType: Prefix
tls:
- secretName: notes-tls
hosts:
- notes.example.com
networkPolicy:
enabled: true
Listener and Service Ports
The Service targets the named http container port. To move the real Nginx
listener while keeping port 80 for clients:
containerPorts:
http: 8080
service:
port: 80
The chart passes containerPorts.http to the official image through
POZNOTE_LISTEN_PORT. Changing service.port alone does not change Nginx.
Create the OIDC Secret before enabling SSO:
apiVersion: v1
kind: Secret
metadata:
name: poznote-oidc
type: Opaque
stringData:
oidc-client-id: your-oidc-client-id
oidc-client-secret: your-oidc-client-secret
Default login credentials are admin_change_me / admin. Change them immediately after first login.
Gateway API
gatewayAPI:
enabled: true
httpRoutes:
- parentRefs:
- name: public
namespace: gateway-system
hostnames:
- notes.example.com
External Secrets
secrets:
existingSecret: poznote-oidc
externalSecrets:
enabled: true
items:
- fullnameOverride: poznote-oidc
spec:
secretStoreRef:
kind: ClusterSecretStore
name: production
target:
name: poznote-oidc
creationPolicy: Owner
data:
- secretKey: oidc-client-id
remoteRef:
key: poznote/oidc
property: client-id
- secretKey: oidc-client-secret
remoteRef:
key: poznote/oidc
property: client-secret
Backup
Back up the data PVC regularly. It contains the SQLite database, all notes, attachments, and application configuration. Use your storage provider’s snapshot mechanism or a tool like Velero. Poznote also supports data export from the web interface (Settings > Export).
Upgrade Notes
Poznote 6.121.0 includes bug fixes, stability, and performance improvements. Review the official 6.121.0 release, back up the complete data PVC, and verify restoration in a separate instance before upgrading production.
The upgrade range from Poznote 6.100.0 through 6.115.0 adds scheduled local
backup archives, revisions, richer Markdown editing and repeating tasks. The
6.115.0 release adds dash lists and an optional login-screen bypass. Only
enable “Open without login” when network access is restricted to the account
owner or a trusted reverse proxy provides authentication; the API continues to
require credentials. This upgrade range also includes upstream security
hardening and Alpine package updates. Review the
official release.
Since 6.80.0, upstream fixes stored XSS and backup streaming with custom themes,
adds app passwords, and changes REST errors from HTTP 200 to actual error status
codes. Integrations must handle HTTP 404 for inaccessible or missing IDs and
409/423 for conflicting writes. The PHP worker default increases from 5 to 10;
set POZNOTE_PHP_FPM_MAX_CHILDREN through app.env when sizing a smaller pod.
POZNOTE_PHP_MEMORY_LIMIT is also configurable through app.env (upstream
default: 512 MB). Dictation requires an operator-configured speech service;
this chart does not deploy one.
Keep the pod running until a backup or restore job completes; verify its final
status before downloading or relying on the archive. Back up the complete data
PVC and test restoration in a separate instance before upgrading production.
For existing S3 integrations, confirm attachment access during export and restore.
Shared links default to read-only. API integrations should retain the returned
note version and pass if_version or If-Match when saving to detect concurrent
edits. MCP user selection and optional POZNOTE_MCP_AUTH_TOKEN configure the
separate MCP server, which this chart does not deploy or expose. Review the
upstream releases
before upgrading integrations.
The upstream rootless image is not the chart default because it requires the mounted data directory itself to be owned by UID/GID 1000. This is not guaranteed for new PVCs or upgrades from the standard image without a recursive ownership migration. Follow the Backup section above before upgrading production workloads.