From b0b25148a46e26a926ef47b192ab8514c30c2a34 Mon Sep 17 00:00:00 2001 From: kisfenyo Date: Wed, 30 Sep 2026 19:14:09 +0200 Subject: [PATCH] outline: 1.9.1 -> 1.10.1, within-major step, both venues proven (R-462) The app half only; PostgreSQL 18 and redis 7 do not move. Bench 9401 (harness v4, swap 0): the self-hosted workspace + a document seeded and read back before and after, 10-min watch 0 kills (anon peak 33.5 %); the abort starts and serves. Box 9202: done in 89.2 s through the setup gate, the document read back. Written by upgrade-test.py --write-ladder; the PG 18 step keeps its definition. Evidence: felhom.eu/documentation/audits/more-night-apps-2026-09-30/ Co-Authored-By: Claude Opus 5.5 (1M context) Claude-Session: https://claude.ai/code/session_0159rPz1ZhFKsS53msqPYxtS --- templates/outline/.felhom.yml | 1 + templates/outline/docker-compose.yml | 2 +- .../outline/steps/c6e5d58da2a400de.felhom.yml | 127 ++++++++++++++++++ templates/outline/steps/c6e5d58da2a400de.yml | 112 +++++++++++++++ 4 files changed, 241 insertions(+), 1 deletion(-) create mode 100644 templates/outline/steps/c6e5d58da2a400de.felhom.yml create mode 100644 templates/outline/steps/c6e5d58da2a400de.yml diff --git a/templates/outline/.felhom.yml b/templates/outline/.felhom.yml index 935956e..6c61b87 100644 --- a/templates/outline/.felhom.yml +++ b/templates/outline/.felhom.yml @@ -131,3 +131,4 @@ i18n: # gated by scripts/check-test-record.py. An image: move without a proven entry here is refused. update_ladder: - {"from": {"outline": "outlinewiki/outline:1.9.1", "outline-postgres": "postgres:16-alpine", "outline-redis": "redis:7-alpine"}, "to": {"outline": "outlinewiki/outline:1.9.1", "outline-postgres": "postgres:18-alpine", "outline-redis": "redis:7-alpine"}, "digest": {"outline": "sha256:9fe2cbdceccea0ffb82cbc8dc6f4c0d4ba1d377454e502d5d2bddececb34d4f1", "outline-postgres": "sha256:77f585114c32fbca283dc835b0596f4e52b51b4c6662d7810b2f4084f60a1873", "outline-redis": "sha256:858f009f9709ce576febc734aa78b8f6d624b82571f9ddb6bda4377c833b3499"}, "verdict": "proven", "tested_at": "2026-09-30T10:40:04Z", "harness_version": 4, "evidence": "felhom.eu/documentation/audits/pg-last-six-2026-09-30/bench/apps/outline/bench/evidence/MV-outline/verdict.json", "box_evidence": "felhom.eu/documentation/audits/pg-last-six-2026-09-30/box/outline/box-verdict-outline.json", "memory_peak_pct": 48.9, "marks": {"files_may_change": false, "needs_person": null, "memory_tight": false}, "memory_basis": "anon", "memory_cgroup_peak_pct": 65.5, "engine_conversion": {"service": "outline-postgres", "engine": "postgres", "from": 16, "to": 18}} + - {"from": {"outline": "outlinewiki/outline:1.9.1", "outline-postgres": "postgres:18-alpine", "outline-redis": "redis:7-alpine"}, "to": {"outline": "outlinewiki/outline:1.10.1", "outline-postgres": "postgres:18-alpine", "outline-redis": "redis:7-alpine"}, "digest": {"outline": "sha256:832051f039b446c87aa23929cf92c00980c66aaa2d744d118c48c016ec816ad8", "outline-postgres": "sha256:77f585114c32fbca283dc835b0596f4e52b51b4c6662d7810b2f4084f60a1873", "outline-redis": "sha256:858f009f9709ce576febc734aa78b8f6d624b82571f9ddb6bda4377c833b3499"}, "verdict": "proven", "tested_at": "2026-09-30T17:04:15Z", "harness_version": 4, "evidence": "felhom.eu/documentation/audits/more-night-apps-2026-09-30/bench/apps/outline/bench/evidence/MV-outline/verdict.json", "box_evidence": "felhom.eu/documentation/audits/more-night-apps-2026-09-30/box/outline/step.txt", "memory_peak_pct": 33.5, "marks": {"files_may_change": false, "needs_person": null, "memory_tight": false}, "memory_basis": "anon", "memory_cgroup_peak_pct": 62.1} diff --git a/templates/outline/docker-compose.yml b/templates/outline/docker-compose.yml index 6dab5a2..95072c8 100644 --- a/templates/outline/docker-compose.yml +++ b/templates/outline/docker-compose.yml @@ -11,7 +11,7 @@ services: outline: - image: outlinewiki/outline:1.9.1 + image: outlinewiki/outline:1.10.1 container_name: outline restart: unless-stopped depends_on: diff --git a/templates/outline/steps/c6e5d58da2a400de.felhom.yml b/templates/outline/steps/c6e5d58da2a400de.felhom.yml new file mode 100644 index 0000000..5c245ae --- /dev/null +++ b/templates/outline/steps/c6e5d58da2a400de.felhom.yml @@ -0,0 +1,127 @@ +# ============================================================================= +# .felhom.yml - App metadata for felhom-controller +# ============================================================================= + +# --- Display info (shown on dashboard) --- +display_name: "Outline" +description: "Modern csapat tudásbázis Markdown támogatással" +category: "productivity" +subdomain: "kb" +slug: "outline" +# 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-30" + +# --- Resource hints (displayed on deploy screen) --- +resources: + mem_request: "200M" + mem_limit: "768M" + pi_compatible: false + needs_hdd: false + +# --- Deploy fields (first deployment only) --- +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: "kb" + required: true + locked_after_deploy: true + description: "Az alkalmazás aldomainje" + + - env_var: SECRET_KEY + label: "Titkosítási kulcs" + type: secret + generate: "hex:32" + locked_after_deploy: true + + - env_var: UTILS_SECRET + label: "Segédprogram 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 + +# --- The setup gate (controller >= 0.281.0, `09` §3 decisions 46-47) --- +# The first visitor would create the admin; a fresh install is closed to everyone but the household until the first setup is done. +setup_gate: true + +# --- App info (info page content) --- +app_info: + tagline: "Modern tudásbázis - Markdown, valós idejű együttműködés, keresés" + docs_url: "https://docs.getoutline.com/" + + use_cases: + - 'Csapat tudásbázis és dokumentáció' + - 'Markdown szerkesztő valós idejű együttműködéssel' + - 'Strukturált dokumentumok fa-szerkezetben' + - 'Teljes szöveges keresés és hivatkozások' + - 'API és integrációk (Slack, webhookok)' + + first_steps: + - 'Nyisd meg a kb.DOMAIN címet a böngészőben' + - 'Hozd létre az első felhasználót' + - 'Hozz létre egy gyűjteményt (Collection) a dokumentumoknak' + - 'Kezdj el írni Markdown-ban' + - 'Hívd meg a csapattagokat' + + prerequisites: + - 'x86 processzor szükséges' + - 'Legalább 1 GB szabad RAM (Outline + PostgreSQL + Redis)' + +# --- Controller-side health probe --- +healthcheck: + checks: + - type: api + port: 3000 + path: "/_health" + expect: + status: 200 + +# --- 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 team knowledge base with Markdown' + app_info: + tagline: 'A modern knowledge base - Markdown, live collaboration and search' + use_cases: + - 'A knowledge base and documentation for a team' + - 'A Markdown editor several people can use at once' + - 'Documents in a tree you can follow' + - 'Full text search and links between documents' + - 'An API and integrations (Slack, webhooks)' + first_steps: + - 'Open kb.DOMAIN in your browser' + - 'Create the first user' + - 'Create a Collection for your documents' + - 'Start writing in Markdown' + - 'Invite the rest of the team' + prerequisites: + - 'An x86 processor is needed' + - 'At least 1 GB of free RAM (Outline + 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: SECRET_KEY + label: 'Encryption key' + - env_var: UTILS_SECRET + label: 'Utility key' diff --git a/templates/outline/steps/c6e5d58da2a400de.yml b/templates/outline/steps/c6e5d58da2a400de.yml new file mode 100644 index 0000000..6dab5a2 --- /dev/null +++ b/templates/outline/steps/c6e5d58da2a400de.yml @@ -0,0 +1,112 @@ +# Outline - Modern csapat tudásbázis Markdown támogatással +# Domain: ${SUBDOMAIN}.${DOMAIN} +# Database: postgres +# RAM: ~200M (mem_limit: 768M) | Pi-compatible: No +# +# Environment variables: +# DOMAIN - Your domain (e.g., demo-felhom.eu) +# SECRET_KEY - Titkosítási kulcs (auto-generated) +# UTILS_SECRET - Segédprogram kulcs (auto-generated) +# DB_PASSWORD - Adatbázis jelszó (auto-generated) + +services: + outline: + image: outlinewiki/outline:1.9.1 + container_name: outline + restart: unless-stopped + depends_on: + outline-postgres: + condition: service_healthy + outline-redis: + condition: service_healthy + environment: + - NODE_ENV=production + - SECRET_KEY=${SECRET_KEY} + - UTILS_SECRET=${UTILS_SECRET} + - DATABASE_URL=postgres://outline:${DB_PASSWORD}@outline-postgres:5432/outline + # Az Outline 1.x alapértelmezésben SSL-t vár a Postgrestől. A stackben futó + # sidecar Postgres nem beszél SSL-t (belső hálózat), ezért enélkül az app + # indulási hurokba kerül: "The server does not support SSL connections". + - PGSSLMODE=disable + - REDIS_URL=redis://outline-redis:6379 + - URL=https://${SUBDOMAIN}.${DOMAIN} + - PORT=3000 + - FILE_STORAGE=local + - FILE_STORAGE_LOCAL_ROOT_DIR=/var/lib/outline/data + volumes: + - outline_data:/var/lib/outline/data + networks: + - traefik-public + - outline-internal + deploy: + resources: + limits: + memory: 768M + healthcheck: + test: ["CMD", "node", "-e", "const http = require('http'); http.get('http://127.0.0.1:3000/_health', (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.outline.rule=Host(`${SUBDOMAIN}.${DOMAIN}`)" + - "traefik.http.routers.outline.entrypoints=websecure" + - "traefik.http.routers.outline.tls=true" + - "traefik.http.routers.outline.tls.certresolver=letsencrypt" + - "traefik.http.services.outline.loadbalancer.server.port=3000" + + outline-postgres: + image: postgres:18-alpine + container_name: outline-postgres + restart: unless-stopped + environment: + - POSTGRES_USER=outline + - POSTGRES_PASSWORD=${DB_PASSWORD} + - POSTGRES_DB=outline + - TZ=Europe/Budapest + volumes: + - outline_postgres_data:/var/lib/postgresql + networks: + - outline-internal + deploy: + resources: + limits: + memory: 256M + healthcheck: + test: ["CMD-SHELL", "pg_isready -U outline -d outline"] + interval: 10s + timeout: 5s + retries: 5 + start_period: 20s + + outline-redis: + image: redis:7-alpine + container_name: outline-redis + restart: unless-stopped + environment: + - TZ=Europe/Budapest + volumes: + - outline_redis_data:/data + networks: + - outline-internal + deploy: + resources: + limits: + memory: 128M + healthcheck: + test: ["CMD", "redis-cli", "ping"] + interval: 10s + timeout: 5s + retries: 5 + start_period: 20s + +volumes: + outline_data: + outline_postgres_data: + outline_redis_data: + +networks: + traefik-public: + external: true + outline-internal: