[{"data":1,"prerenderedAt":94},["ShallowReactive",2],{"$fjsd2m04iu7qm":3},{"site":4,"app":16,"alternatives":67,"compose":89,"log":90,"changelog":91},{"hourly_rate_usd":5,"break_even_window_mo":6,"reference_env":7,"attribution":8},20,18,"Fresh Debian 12, Docker + Compose preinstalled, 2 GB RAM \u002F 2 vCPU ($5-class VPS)",{"caniselfhostit":9},{"name":10,"url":11,"repo":12,"license":13,"author":14,"note":15},"caniselfhostit.com","https:\u002F\u002Fcaniselfhostit.com","https:\u002F\u002Fgithub.com\u002Fcaniselfhostit\u002Fcaniselfhostit","MIT","Jashanpreet Singh","Capability data (app → replacement pairings, pricing snapshots) seeded from this dataset. They answer 'can you run it, and how' — go there for guided installs.",{"id":17,"name":18,"domain":19,"category":20,"price_usd_mo":6,"price_plan":21,"price_unit":22,"price_source":23,"price_checked":24,"links":25,"jobs":27,"verdict":32,"alternatives":33,"provenance":35,"verdict_reason":38,"what_you_lose":39,"economics":42,"hardware_tier":45,"verified":46,"compose":54,"derived":59},"ghost-pro","Ghost(Pro)","ghost.org","marketing-content","Starter","flat","https:\u002F\u002Fghost.org\u002Fpricing\u002F","2026-08-05",{"caniselfhostit":26},"https:\u002F\u002Fcaniselfhostit.com\u002Fghost-pro",[28,29,30,31],"publishing\u002Fblog","newsletter sending","memberships\u002Fpaid subs","themes","YES",[34],"ghost",{"capability_seed":36,"decision_layer":37},"caniselfhostit","original","It's the same Ghost. $18\u002Fmo buys hosting, email infrastructure and zero ops — $216\u002Fyr buys a lot of newsletters, and the software is right there.",[40,41],"Ghost(Pro)'s bundled newsletter deliverability — bring Mailgun for bulk sends","Automatic upgrades from the people who wrote it (and fund it — Pro revenue pays for the software you're running)",{"vps_share_usd_mo":43,"storage_usd_mo":44,"maint_min_mo":5},1.5,0,"vps",{"by":47,"at":48,"protocol":49,"setup_min":50,"assistant":51,"evidence":52,"what_broke":55},"zernonia","2026-08-10","v1",50,"claude-code",[53,54],"logs\u002Fghost-pro-ghost.md","compose\u002Fghost-pro-ghost.yml",[56,57,58],"Where IPv6 is disabled Ghost dies with the deeply unhelpful 'Code: -97' — it's EAFNOSUPPORT; set server__host: 0.0.0.0","MySQL 8's first-boot init answers socket pings while TCP is still down, so a socket-based healthcheck releases Ghost too early into an ECONNREFUSED crash-loop — probe with --protocol=tcp","Ghost 5 requires MySQL 8 specifically — SQLite and MariaDB are not supported paths",{"hourly_rate_usd":5,"self_host_cost_usd_mo":60,"net_saving_usd_mo":61,"setup_cost_usd":62,"break_even_months":63,"break_even_date":64,"markup_index":65,"primary_abandoned":66,"verdict_stale":66},8.17,9.83,16.67,1.69,"2026-10-01",2.2,false,[68],{"id":34,"name":69,"tagline":70,"repo":71,"site":72,"license":13,"category":20,"resources":73,"provenance":78,"metrics":79},"Ghost","The same publishing platform Ghost(Pro) hosts, on your own box, with the editor, the themes and the members list intact.","TryGhost\u002FGhost","https:\u002F\u002Fghost.org",{"ram_min_mb":74,"disk_gb":75,"arm64":76,"containers":77,"external_db":76},2048,10,true,2,{"capability_seed":36,"decision_layer":37},{"id":34,"stars":80,"last_commit":81,"latest_release":82,"docker_pulls":86,"open_issues":87,"fetched_at":88},54736,"2026-08-11T03:11:00Z",{"tag":83,"published_at":84,"url":85},"v6.57.1","2026-08-10T20:39:48Z","https:\u002F\u002Fgithub.com\u002FTryGhost\u002FGhost\u002Freleases\u002Ftag\u002Fv6.57.1",null,122,"2026-08-11T03:55:21.867Z","# Ghost — the same software Ghost(Pro) hosts for $18\u002Fmo (Starter)\nservices:\n  ghost:\n    image: ghost:5-alpine\n    container_name: ghost\n    restart: unless-stopped\n    depends_on:\n      ghost-db:\n        condition: service_healthy\n    environment:\n      url: http:\u002F\u002Flocalhost:2368\n      # Ghost exits with cryptic \"Code: -97\" (EAFNOSUPPORT) where IPv6 is disabled; bind IPv4.\n      server__host: 0.0.0.0\n      database__client: mysql\n      database__connection__host: ghost-db\n      database__connection__user: ghost\n      database__connection__password: ghost\n      database__connection__database: ghost\n    ports:\n      - \"2368:2368\"\n    volumes:\n      - ghost-content:\u002Fvar\u002Flib\u002Fghost\u002Fcontent\n    healthcheck:\n      test: [\"CMD-SHELL\", \"wget -qO- http:\u002F\u002Flocalhost:2368 >\u002Fdev\u002Fnull || exit 1\"]\n      interval: 5s\n      timeout: 5s\n      retries: 36\n      start_period: 30s\n\n  ghost-db:\n    image: mysql:8\n    restart: unless-stopped\n    environment:\n      MYSQL_USER: ghost\n      MYSQL_PASSWORD: ghost\n      MYSQL_DATABASE: ghost\n      MYSQL_ROOT_PASSWORD: root-changeme # throwaway test value\n    volumes:\n      - ghost-db:\u002Fvar\u002Flib\u002Fmysql\n    healthcheck:\n      # Must probe over TCP: during first-boot initialization MySQL runs a temp server that\n      # answers the *socket* ping while port 3306 is still down — a socket-based check lets\n      # dependents start too early and crash-loop on ECONNREFUSED.\n      test: [\"CMD\", \"mysqladmin\", \"ping\", \"-h\", \"127.0.0.1\", \"--protocol=tcp\", \"-ughost\", \"-pghost\"]\n      interval: 5s\n      timeout: 5s\n      retries: 36\n      start_period: 30s\n\nvolumes:\n  ghost-content:\n  ghost-db:\n","# Timed setup log: Ghost(Pro) → ghost\n\n**Protocol:** v1 · **Verified by:** zernonia · **Date:** 2026-08-10\n**Assistant:** claude-code · **Environment:** containerized runner, 2 vCPU class, Docker 29.3 \u002F Compose v5.1\n\n## Timeline\n\n| Step | Time |\n|---|---|\n| Read upstream docs, draft compose with healthcheck | ~16 min |\n| **Boot: all services healthy in 22 s (measured, `compose up --wait`)** | — |\n| Endpoint-level workflow check (login\u002Fhealth\u002FAPI serve) + re-run from clean volumes | ~16 min |\n| **Total: ~50 min** | |\n\nBoot and endpoint checks are machine-verified; `setup_min` is the wall-clock total for this\nsession including authoring, diagnosis and re-runs. Endpoint-level ≠ full human UI workflow —\ndispute anything that doesn't reproduce (CONTRIBUTING.md).\n\n## What broke\n\n- Where IPv6 is disabled Ghost dies with the deeply unhelpful 'Code: -97' — it's EAFNOSUPPORT; set server__host: 0.0.0.0\n- MySQL 8's first-boot init answers socket pings while TCP is still down, so a socket-based healthcheck releases Ghost too early into an ECONNREFUSED crash-loop — probe with --protocol=tcp\n- Ghost 5 requires MySQL 8 specifically — SQLite and MariaDB are not supported paths\n\n## Verdict-relevant notes\n\n- Memberships + Stripe work self-hosted; bulk newsletter needs a Mailgun key.\n",[92],{"date":48,"app":17,"from":86,"to":32,"reason":93},"Initial verdict: It's the same Ghost. $18\u002Fmo buys hosting, email infrastructure and zero ops.",1786459421809]