Files
mono/blog
giles f42042ccb7 Monorepo: consolidate 7 repos into one
Combines shared, blog, market, cart, events, federation, and account
into a single repository. Eliminates submodule sync, sibling model
copying at build time, and per-app CI orchestration.

Changes:
- Remove per-app .git, .gitmodules, .gitea, submodule shared/ dirs
- Remove stale sibling model copies from each app
- Update all 6 Dockerfiles for monorepo build context (root = .)
- Add build directives to docker-compose.yml
- Add single .gitea/workflows/ci.yml with change detection
- Add .dockerignore for monorepo build context
- Create __init__.py for federation and account (cross-app imports)
2026-02-24 19:44:17 +00:00
..
2026-02-24 19:44:17 +00:00
2026-02-24 19:44:17 +00:00

Blog App (Coop)

Blog, authentication, and content management service for the Rose Ash cooperative platform. Handles Ghost CMS integration, user auth, and admin settings.

Architecture

One of five Quart microservices sharing a single PostgreSQL database:

App Port Domain
blog (coop) 8000 Auth, blog, admin, menus, snippets
market 8001 Product browsing, Suma scraping
cart 8002 Shopping cart, checkout, orders
events 8003 Calendars, bookings, tickets
federation 8004 ActivityPub, fediverse social

Structure

app.py                  # Application factory (create_base_app + blueprints)
path_setup.py           # Adds project root + app dir to sys.path
config/app-config.yaml  # App URLs, feature flags, SumUp config
models/                 # Blog-domain models (+ re-export stubs for shared models)
bp/                     # Blueprints
  auth/                 #   Magic link login, account, newsletters
  blog/                 #   Post listing, Ghost CMS sync
  post/                 #   Single post view and admin
  admin/                #   Settings admin interface
  menu_items/           #   Navigation menu management
  snippets/             #   Reusable content snippets
templates/              # Jinja2 templates
services/               # register_domain_services() — wires blog + calendar + market + cart
shared/                 # Submodule -> git.rose-ash.com/coop/shared.git

Cross-Domain Communication

All inter-app communication uses typed service contracts (no HTTP APIs):

  • services.calendar.* — calendar/entry queries via CalendarService protocol
  • services.market.* — marketplace queries via MarketService protocol
  • services.cart.* — cart summary via CartService protocol
  • services.federation.* — AP publishing via FederationService protocol
  • shared.services.navigation — site navigation tree

Domain Events

  • auth/routes.py emits user.logged_in via shared.events.emit_event
  • Ghost sync emits post.published / post.updated for federation

Running

export DATABASE_URL_ASYNC=postgresql+asyncpg://user:pass@localhost/coop
export REDIS_URL=redis://localhost:6379/0
export SECRET_KEY=your-secret-key

alembic -c shared/alembic.ini upgrade head
hypercorn app:app --bind 0.0.0.0:8000