Add booking stack, client deploys, and back-office updates
- deploy/booking: shared Easy!Appointments stack with brand-matched wizard (flatpickr recolor, single-tenant provider hide, iframe auto-fit height reporter) - deploy/clients: per-client isolated nginx compose stacks with _template scaffold, new-client.sh, and happynails live site - deploy/backup: smb-db backup script - n8n: booking-sync workflow; onboarding tweaks - playbooks: lead-to-customer lifecycle + outreach - templates: nail-studio landing previews - backoffice: app/db/init/compose updates Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
This commit is contained in:
@@ -0,0 +1,7 @@
|
||||
# One per client. Copy to .env and fill (new-client.sh does this for you).
|
||||
CLIENT_SLUG=happynails # lowercase, no spaces — used for the Compose project + container name
|
||||
CLIENT_DOMAIN=happynails.de # the domain / subdomain Caddy serves for this client
|
||||
|
||||
# --- reference only (NOT injected; the site/ HTML is static) ---
|
||||
# CLIENT_NAME=Happy Nails Nürnberg
|
||||
# BOOKING_URL=https://calendar.app.google/xxxxxxxx # bake into site/index.html during onboarding
|
||||
@@ -0,0 +1,30 @@
|
||||
# Per-client stack — ONE isolated static-site container per business client.
|
||||
#
|
||||
# Each client is its own Compose project (name: smb-client-<slug>), so they
|
||||
# start / stop / update / remove fully independently and never share state.
|
||||
# Booking is handled by the client's own Google Calendar Appointment Schedule
|
||||
# (no container), and leads/bookings flow into the shared CRM via the n8n
|
||||
# webhooks baked into the client's page — so this stack only serves the site.
|
||||
#
|
||||
# Don't edit this file per client. Copy the folder with ../new-client.sh, which
|
||||
# fills .env (CLIENT_SLUG, CLIENT_DOMAIN) and seeds site/.
|
||||
name: smb-client-${CLIENT_SLUG}
|
||||
|
||||
services:
|
||||
site:
|
||||
image: nginx:1.27-alpine
|
||||
container_name: client-${CLIENT_SLUG}
|
||||
restart: unless-stopped
|
||||
volumes:
|
||||
- ./site:/usr/share/nginx/html:ro
|
||||
networks: [proxy] # shared with Caddy; reached as client-<slug>:80
|
||||
mem_limit: 64m # static nginx idles at a few MB; cap keeps the 16 GB box safe
|
||||
logging:
|
||||
driver: json-file
|
||||
options:
|
||||
max-size: "5m"
|
||||
max-file: "3"
|
||||
|
||||
networks:
|
||||
proxy:
|
||||
external: true
|
||||
@@ -0,0 +1,22 @@
|
||||
<!DOCTYPE html>
|
||||
<html lang="de">
|
||||
<head>
|
||||
<meta charset="UTF-8" />
|
||||
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
|
||||
<title>Platzhalter — Kundenseite</title>
|
||||
<style>
|
||||
body { font-family: system-ui, sans-serif; background: #fdf6f4; color: #3b2a2e;
|
||||
display: grid; place-items: center; min-height: 100vh; margin: 0; text-align: center; }
|
||||
.box { max-width: 520px; padding: 32px; }
|
||||
code { background: #f1e1de; padding: 2px 6px; border-radius: 5px; }
|
||||
</style>
|
||||
</head>
|
||||
<body>
|
||||
<div class="box">
|
||||
<h1>Platzhalter-Kundenseite</h1>
|
||||
<p>Dieser isolierte Client-Stack läuft. Ersetzen Sie den Inhalt von <code>site/</code> mit
|
||||
der gebrandeten Seite des Kunden (z. B. geklont aus <code>templates/landing/…</code>),
|
||||
tragen Sie den Google-Terminbuchungs-Link ein und deployen Sie neu.</p>
|
||||
</div>
|
||||
</body>
|
||||
</html>
|
||||
Reference in New Issue
Block a user