diff --git a/CHANGELOG.md b/CHANGELOG.md index 07664ec..3b21e3c 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,3 +1,16 @@ +## docmost converts PostgreSQL 16 → 18 (2026-09-25, `09` §3 decisions 35, 37, 39) + +The first PostgreSQL major the catalog moves — ALONE in its commit, through `upgrade-test.py --write-ladder`, which +wrote `engine_conversion {docmost-postgres, postgres, 16, 18}` because BOTH venues converted it: the bench (throwaway +LXC 9401, harness v4 — converted in 11.0 s, check equal over 48 tables, seed read back, 10-minute memory watch, 0 +kills; negative control C3 → `failed`) and scratch box 9202 through the product's own conversion (controller +`0.273.0-rc1`: done in 42 s; load failure, unhealthy app and a SIGKILL mid-conversion each undone to 16 with the seed +read back). The data mount moves to `/var/lib/postgresql` (18 refuses the old one). **docmost's own limit 384M → +512M** (decision 39): its memory reached 91 % of 384M under the watch's light load and 80.4 % of 512M — Node sizes its +heap from the limit; 0 kills, 0 restarts in both watches. The superseded 16 step keeps its definition in `steps/`. +Needs controller ≥ 0.273.0 (both demo boxes run 0.274.0); an older box refuses nothing here — it has no conversion and +would HOLD, which is why the floor went first. Evidence: `felhom.eu/documentation/audits/night-2026-09-26/C/`, `…/D/`. + ## nextcloud: `after_load:` — its own rescan after a load of kept data (2026-09-25, Part E) `09` §3 decision 36. **No image moved.** `templates/nextcloud/.felhom.yml` gains `after_load:` (`php occ files:scan diff --git a/scripts/copy_freeze/hu.json b/scripts/copy_freeze/hu.json index 394fb7f..42f4a67 100644 --- a/scripts/copy_freeze/hu.json +++ b/scripts/copy_freeze/hu.json @@ -220,7 +220,7 @@ "app_info.first_steps[2]": "Hozd létre az első teret (Space) a dokumentumoknak", "app_info.first_steps[3]": "Kezdj el írni a Notion-szerű szerkesztőben", "app_info.prerequisites[0]": "x86 processzor szükséges", - "app_info.prerequisites[1]": "Legalább 768 MB szabad RAM (Docmost + PostgreSQL + Redis)", + "app_info.prerequisites[1]": "Legalább 896 MB szabad RAM (Docmost + PostgreSQL + Redis)", "app_info.tagline": "Modern wiki és dokumentáció platform Notion-szerű szerkesztővel", "app_info.use_cases[0]": "Csapat tudásbázis és belső dokumentáció", "app_info.use_cases[1]": "Notion-szerű blokk szerkesztő valós idejű együttműködéssel", diff --git a/templates/docmost/.felhom.yml b/templates/docmost/.felhom.yml index 49c54ba..1f9ae05 100644 --- a/templates/docmost/.felhom.yml +++ b/templates/docmost/.felhom.yml @@ -15,12 +15,12 @@ subdomain: "docs" slug: "docmost" # catalog_since: the date THIS repo last changed this app's pinned images. Any commit that # changes an image: line must set this to the same day (see CLAUDE.md). -catalog_since: "2026-09-22" +catalog_since: "2026-09-25" # --- Resource hints (displayed on deploy screen) --- resources: mem_request: "200M" - mem_limit: "768M" + mem_limit: "896M" pi_compatible: false needs_hdd: false @@ -72,7 +72,7 @@ app_info: prerequisites: - 'x86 processzor szükséges' - - 'Legalább 768 MB szabad RAM (Docmost + PostgreSQL + Redis)' + - 'Legalább 896 MB szabad RAM (Docmost + PostgreSQL + Redis)' # --- Controller-side health probe --- healthcheck: @@ -101,7 +101,7 @@ i18n: - 'Start writing in the Notion-like editor' prerequisites: - 'An x86 processor is needed' - - 'At least 768 MB of free RAM (Docmost + PostgreSQL + Redis)' + - 'At least 896 MB of free RAM (Docmost + PostgreSQL + Redis)' deploy_fields: - env_var: DOMAIN label: 'Domain' @@ -119,3 +119,4 @@ i18n: # gated by scripts/check-test-record.py. An image: move without a proven entry here is refused. update_ladder: - {"from": {"docmost": "docmost/docmost:0.95.0", "docmost-postgres": "postgres:16-alpine", "docmost-redis": "redis:7-alpine"}, "to": {"docmost": "docmost/docmost:0.96.0", "docmost-postgres": "postgres:16-alpine", "docmost-redis": "redis:7-alpine"}, "digest": {"docmost": "sha256:b56947fcfd08aab8fae12a377e1792784786adbf8b96e4281f14ef4fc072685a", "docmost-postgres": "sha256:721873c34ceb9f8d8fc265984940dc982404c105f19ad51be9fdc5970a6080ea", "docmost-redis": "sha256:858f009f9709ce576febc734aa78b8f6d624b82571f9ddb6bda4377c833b3499"}, "verdict": "proven", "tested_at": "2026-09-21T18:21:18.018992+00:00", "harness_version": 1, "evidence": "felhom.eu/documentation/audits/update-night-2026-09-21/apps/docmost/verdict.json", "memory_peak_pct": null, "marks": {"files_may_change": false, "needs_person": null, "memory_tight": false}, "backfilled": "2026-09-23", "note": "backfilled from catalog commit 6d8cd87; box walk only (harness v1, no memory watch); digest = what the registry served on 2026-09-23, not a measurement of the tested image"} + - {"from": {"docmost": "docmost/docmost:0.96.0", "docmost-postgres": "postgres:16-alpine", "docmost-redis": "redis:7-alpine"}, "to": {"docmost": "docmost/docmost:0.96.0", "docmost-postgres": "postgres:18-alpine", "docmost-redis": "redis:7-alpine"}, "digest": {"docmost": "sha256:b56947fcfd08aab8fae12a377e1792784786adbf8b96e4281f14ef4fc072685a", "docmost-postgres": "sha256:77f585114c32fbca283dc835b0596f4e52b51b4c6662d7810b2f4084f60a1873", "docmost-redis": "sha256:858f009f9709ce576febc734aa78b8f6d624b82571f9ddb6bda4377c833b3499"}, "verdict": "proven", "tested_at": "2026-09-25T12:01:05Z", "harness_version": 4, "evidence": "felhom.eu/documentation/audits/night-2026-09-26/C/bench-run2/evidence/MV-docmost/verdict.json", "box_evidence": "felhom.eu/documentation/audits/night-2026-09-26/D/box-verdict-docmost.json", "memory_peak_pct": 80.4, "marks": {"files_may_change": false, "needs_person": null, "memory_tight": true}, "memory_basis": "anon", "memory_cgroup_peak_pct": 89.9, "engine_conversion": {"service": "docmost-postgres", "engine": "postgres", "from": 16, "to": 18}} diff --git a/templates/docmost/docker-compose.yml b/templates/docmost/docker-compose.yml index 2982e7b..ab3f3af 100644 --- a/templates/docmost/docker-compose.yml +++ b/templates/docmost/docker-compose.yml @@ -1,7 +1,9 @@ # Docmost - Modern Wiki / Documentation (Notion-like) # Domain: ${SUBDOMAIN}.${DOMAIN} # Database: PostgreSQL + Redis -# RAM: ~200MB (mem_limit: 768M total — docmost 384M + postgres 256M + redis 128M) | Pi-compatible: No (heavy) +# RAM: ~200MB (mem_limit: 896M total — docmost 512M + postgres 256M + redis 128M) | Pi-compatible: No (heavy) +# docmost 384M -> 512M (2026-09-25, `09` §3 decision 39): its own memory reached 91% of 384M under the harness's +# light load; Node sizes its heap from the limit (431 MB at 512M), 0 kills / 0 restarts in both 10-minute watches. # # Environment variables: # DOMAIN - Your domain (e.g., demo-felhom.eu) @@ -37,7 +39,7 @@ services: deploy: resources: limits: - memory: 384M + memory: 512M healthcheck: test: ["CMD", "node", "-e", "const http = require('http'); http.get('http://127.0.0.1:3000/', (r) => { process.exit(r.statusCode === 200 ? 0 : 1) }).on('error', () => process.exit(1))"] interval: 30s @@ -53,7 +55,7 @@ services: - "traefik.http.services.docmost.loadbalancer.server.port=3000" docmost-postgres: - image: postgres:16-alpine + image: postgres:18-alpine container_name: docmost-postgres restart: unless-stopped environment: @@ -62,7 +64,7 @@ services: - POSTGRES_DB=docmost - TZ=Europe/Budapest volumes: - - docmost_postgres_data:/var/lib/postgresql/data + - docmost_postgres_data:/var/lib/postgresql networks: - docmost-internal deploy: diff --git a/templates/docmost/steps/199d324c8069782c.felhom.yml b/templates/docmost/steps/199d324c8069782c.felhom.yml new file mode 100644 index 0000000..68d73e7 --- /dev/null +++ b/templates/docmost/steps/199d324c8069782c.felhom.yml @@ -0,0 +1,115 @@ +# ============================================================================= +# .felhom.yml — App metadata for felhom-controller +# ============================================================================= +# Place alongside docker-compose.yml in each stack directory: +# /opt/docker/stacks/docmost/.felhom.yml +# ============================================================================= + +# --- Display info (shown on dashboard) --- +display_name: "Docmost" +description: "Modern wiki és dokumentáció platform (Notion-szerű)" +category: "productivity" +subdomain: "docs" + +# --- Asset slug --- +slug: "docmost" +# catalog_since: the date THIS repo last changed this app's pinned images. Any commit that +# changes an image: line must set this to the same day (see CLAUDE.md). +catalog_since: "2026-09-22" + +# --- Resource hints (displayed on deploy screen) --- +resources: + mem_request: "200M" + mem_limit: "768M" + pi_compatible: false + needs_hdd: false + +# --- Deploy fields --- +deploy_fields: + - env_var: DOMAIN + label: "Domain" + type: domain + description: "A szerver domain neve" + locked_after_deploy: true + + - env_var: SUBDOMAIN + label: "Aldomain" + type: subdomain + default: "docs" + required: true + locked_after_deploy: true + description: "Az alkalmazás aldomainje" + + - env_var: APP_SECRET + label: "Alkalmazás titkosítási kulcs" + type: secret + generate: "hex:32" + locked_after_deploy: true + + - env_var: DB_PASSWORD + label: "Adatbázis jelszó" + type: secret + generate: "password:24" + locked_after_deploy: true + +# --- App info (info page content) --- +app_info: + tagline: 'Modern wiki és dokumentáció platform Notion-szerű szerkesztővel' + docs_url: 'https://docmost.com/docs/' + + use_cases: + - 'Csapat tudásbázis és belső dokumentáció' + - 'Notion-szerű blokk szerkesztő valós idejű együttműködéssel' + - 'Terek és oldalak hierarchikus szervezése' + - 'Képek, táblázatok és kód blokkok beágyazása' + - 'Keresés a teljes dokumentációban' + + first_steps: + - 'Nyisd meg a docs.DOMAIN címet a böngészőben' + - 'Az első regisztrált felhasználó automatikusan admin lesz' + - 'Hozd létre az első teret (Space) a dokumentumoknak' + - 'Kezdj el írni a Notion-szerű szerkesztőben' + + prerequisites: + - 'x86 processzor szükséges' + - 'Legalább 768 MB szabad RAM (Docmost + PostgreSQL + Redis)' + +# --- Controller-side health probe --- +healthcheck: + checks: + - type: http + port: 3000 + +# --- English copy (localisation slice 5, R-560) -------------------------------------------- +# The Hungarian above is UNCHANGED. A box on English reads this block field by field; a missing +# field shows the Hungarian one; a controller older than 0.257.0 ignores the block entirely. +i18n: + en: + description: 'A modern wiki and documentation platform (Notion-like)' + app_info: + tagline: 'A modern wiki and documentation platform with a Notion-like editor' + use_cases: + - 'A knowledge base and internal documentation for a team' + - 'A Notion-like block editor several people can use at once' + - 'Spaces and pages, arranged in a tree' + - 'Embed images, tables and code blocks' + - 'Search across all of it' + first_steps: + - 'Open docs.DOMAIN in your browser' + - 'The first person to sign up becomes the admin' + - 'Create your first Space for the documents' + - 'Start writing in the Notion-like editor' + prerequisites: + - 'An x86 processor is needed' + - 'At least 768 MB of free RAM (Docmost + PostgreSQL + Redis)' + deploy_fields: + - env_var: DOMAIN + label: 'Domain' + description: 'The server domain name' + - env_var: SUBDOMAIN + label: 'Subdomain' + description: 'The subdomain this app answers on' + - env_var: DB_PASSWORD + label: 'Database password' + - env_var: APP_SECRET + label: 'Application encryption key' diff --git a/templates/docmost/steps/199d324c8069782c.yml b/templates/docmost/steps/199d324c8069782c.yml new file mode 100644 index 0000000..2982e7b --- /dev/null +++ b/templates/docmost/steps/199d324c8069782c.yml @@ -0,0 +1,108 @@ +# Docmost - Modern Wiki / Documentation (Notion-like) +# Domain: ${SUBDOMAIN}.${DOMAIN} +# Database: PostgreSQL + Redis +# RAM: ~200MB (mem_limit: 768M total — docmost 384M + postgres 256M + redis 128M) | Pi-compatible: No (heavy) +# +# Environment variables: +# DOMAIN - Your domain (e.g., demo-felhom.eu) +# APP_SECRET - Random secret for session signing (auto-generated) +# DB_PASSWORD - PostgreSQL password (auto-generated) +# +# First-time setup: +# First registered user becomes admin. + +services: + docmost: + image: docmost/docmost:0.96.0 + container_name: docmost + restart: unless-stopped + depends_on: + docmost-postgres: + condition: service_healthy + docmost-redis: + condition: service_healthy + environment: + - APP_SECRET=${APP_SECRET} + - DATABASE_URL=postgresql://docmost:${DB_PASSWORD}@docmost-postgres:5432/docmost + - REDIS_URL=redis://docmost-redis:6379 + - APP_URL=https://${SUBDOMAIN}.${DOMAIN} + - STORAGE_DRIVER=local + - FILE_UPLOAD_SIZE_LIMIT=50mb + - TZ=Europe/Budapest + volumes: + - docmost_storage:/app/data/storage + networks: + - traefik-public + - docmost-internal + deploy: + resources: + limits: + memory: 384M + healthcheck: + test: ["CMD", "node", "-e", "const http = require('http'); http.get('http://127.0.0.1:3000/', (r) => { process.exit(r.statusCode === 200 ? 0 : 1) }).on('error', () => process.exit(1))"] + interval: 30s + timeout: 5s + retries: 3 + start_period: 30s + labels: + - "traefik.enable=true" + - "traefik.http.routers.docmost.rule=Host(`${SUBDOMAIN}.${DOMAIN}`)" + - "traefik.http.routers.docmost.entrypoints=websecure" + - "traefik.http.routers.docmost.tls=true" + - "traefik.http.routers.docmost.tls.certresolver=letsencrypt" + - "traefik.http.services.docmost.loadbalancer.server.port=3000" + + docmost-postgres: + image: postgres:16-alpine + container_name: docmost-postgres + restart: unless-stopped + environment: + - POSTGRES_USER=docmost + - POSTGRES_PASSWORD=${DB_PASSWORD} + - POSTGRES_DB=docmost + - TZ=Europe/Budapest + volumes: + - docmost_postgres_data:/var/lib/postgresql/data + networks: + - docmost-internal + deploy: + resources: + limits: + memory: 256M + healthcheck: + test: ["CMD-SHELL", "pg_isready -U docmost -d docmost"] + interval: 10s + timeout: 5s + retries: 5 + start_period: 20s + + docmost-redis: + image: redis:7-alpine + container_name: docmost-redis + restart: unless-stopped + command: redis-server --appendonly yes + environment: + - TZ=Europe/Budapest + volumes: + - docmost_redis_data:/data + networks: + - docmost-internal + deploy: + resources: + limits: + memory: 128M + healthcheck: + test: ["CMD", "redis-cli", "ping"] + interval: 10s + timeout: 5s + retries: 3 + +volumes: + docmost_storage: + docmost_postgres_data: + docmost_redis_data: + +networks: + traefik-public: + external: true + docmost-internal: