From c5546cf7fcc1aad614fe2eba66402c898586c325 Mon Sep 17 00:00:00 2001 From: buenosairesam Date: Mon, 29 Dec 2025 14:17:53 -0300 Subject: [PATCH] 1.1 changes --- CLAUDE.md | 126 +++++------ README.md | 50 +++-- build.py | 127 ++++++++--- cfg/amar/.env.example | 117 ++++++++++ cfg/amar/docker-compose.yml | 202 ++++++++++++++++++ {mainroom => cfg/amar}/link/Dockerfile | 0 {mainroom => cfg/amar}/link/README.md | 20 +- .../amar}/link/adapters/__init__.py | 0 .../amar}/link/adapters/django.py | 0 .../amar}/link/docker-compose.yml | 0 {mainroom => cfg/amar}/link/main.py | 6 +- {mainroom => cfg/amar}/link/requirements.txt | 0 {config => cfg}/soleprint.config.json | 0 mainroom/CLAUDE.md | 2 +- mainroom/ctrl/.env.sync | 10 +- mainroom/ctrl/README.md | 26 +-- mainroom/ctrl/build.sh | 4 +- mainroom/ctrl/deploy.sh | 50 ++--- mainroom/ctrl/logs.sh | 18 +- mainroom/ctrl/server/.env | 28 +-- mainroom/ctrl/server/README.md | 52 ++--- mainroom/ctrl/server/audit.sh | 42 ++-- mainroom/ctrl/server/cleanup.sh | 32 +-- mainroom/ctrl/server/configure.sh | 54 ++--- mainroom/ctrl/server/install-nginx.sh | 10 +- .../nginx/{core_nest.conf => core_room.conf} | 34 +-- ....conf.template => core_room.conf.template} | 20 +- mainroom/ctrl/server/nginx/docker-local.conf | 18 +- mainroom/ctrl/server/nginx/docker.conf | 14 +- mainroom/ctrl/server/nginx/generate-config.sh | 2 +- mainroom/ctrl/server/setup-symlinks.sh | 18 +- mainroom/ctrl/server/setup.sh | 16 +- mainroom/ctrl/setup.sh | 4 +- mainroom/ctrl/start.sh | 12 +- mainroom/ctrl/status.sh | 16 +- mainroom/ctrl/stop.sh | 4 +- mainroom/ctrl/sync-tests.sh | 4 +- mainroom/sbwrapper/README.md | 22 +- mainroom/sbwrapper/config.json | 2 +- mainroom/sbwrapper/index.html | 14 +- mainroom/sbwrapper/sidebar.css | 20 +- mainroom/sbwrapper/sidebar.js | 40 ++-- mainroom/soleprint/README.nginx.md | 14 +- mainroom/soleprint/ctrl/README.md | 36 ++-- mainroom/soleprint/ctrl/local/commit.sh | 8 +- mainroom/soleprint/ctrl/local/init.sh | 18 +- mainroom/soleprint/ctrl/local/status.sh | 8 +- .../soleprint/ctrl/server/install-deps.sh | 12 +- mainroom/soleprint/ctrl/server/restart.sh | 6 +- mainroom/soleprint/ctrl/server/setup-cert.sh | 2 +- .../soleprint/ctrl/server/setup-service.sh | 10 +- mainroom/soleprint/ctrl/sync-tests.sh | 6 +- mainroom/soleprint/docker-compose.nginx.yml | 8 +- {hub => soleprint}/dataloader/__init__.py | 0 {hub => soleprint}/index.html | 0 {hub => soleprint}/main.py | 15 +- {hub => soleprint}/requirements.txt | 1 + soleprint/run.py | 164 ++++++++++++++ 58 files changed, 1048 insertions(+), 496 deletions(-) create mode 100644 cfg/amar/.env.example create mode 100644 cfg/amar/docker-compose.yml rename {mainroom => cfg/amar}/link/Dockerfile (100%) rename {mainroom => cfg/amar}/link/README.md (89%) rename {mainroom => cfg/amar}/link/adapters/__init__.py (100%) rename {mainroom => cfg/amar}/link/adapters/django.py (100%) rename {mainroom => cfg/amar}/link/docker-compose.yml (100%) rename {mainroom => cfg/amar}/link/main.py (94%) rename {mainroom => cfg/amar}/link/requirements.txt (100%) rename {config => cfg}/soleprint.config.json (100%) rename mainroom/ctrl/server/nginx/{core_nest.conf => core_room.conf} (91%) rename mainroom/ctrl/server/nginx/{core_nest.conf.template => core_room.conf.template} (88%) rename {hub => soleprint}/dataloader/__init__.py (100%) rename {hub => soleprint}/index.html (100%) rename {hub => soleprint}/main.py (86%) rename {hub => soleprint}/requirements.txt (83%) create mode 100644 soleprint/run.py diff --git a/CLAUDE.md b/CLAUDE.md index ca7836a..3b30dbf 100644 --- a/CLAUDE.md +++ b/CLAUDE.md @@ -15,8 +15,12 @@ spr/ ├── CLAUDE.md # You are here ├── README.md # User-facing docs ├── schema.json # Source of truth for models -├── config/ # Framework configurations -│ └── soleprint.config.json +├── cfg/ # Framework configurations +│ ├── soleprint.config.json # Model definitions +│ └── amar/ # Room-specific configs (absolute paths to Dockerfiles) +│ ├── .env.example +│ ├── docker-compose.yml +│ └── link/ # Databrowse adapter for amar │ ├── ctrl/ # Soleprint room's own ctrl │ @@ -33,7 +37,7 @@ spr/ │ ├── station/ # VERSIONED - Tools & execution │ ├── tools/ # Utilities, generators, runners -│ │ ├── generator/ # Model/framework generator +│ │ ├── modelgen/ # Model generation from config/codebases │ │ ├── datagen/ # Test data generation │ │ ├── tester/ # Test runner (BDD/playwright) │ │ └── ... @@ -43,38 +47,41 @@ spr/ │ ├── data/ # JSON content files (versioned) │ -├── hub/ # VERSIONED base files -│ ├── main.py # Hub entry point +├── soleprint/ # VERSIONED - Core coordinator +│ ├── main.py # Multi-port entry point (production) +│ ├── run.py # Single-port bare-metal dev server │ ├── index.html # Landing page │ ├── requirements.txt # Dependencies │ └── dataloader/ # Data loading module │ ├── gen/ # RUNNABLE instance (gitignored, symlinks) -│ ├── main.py # → ../hub/main.py -│ ├── index.html # → ../hub/index.html -│ ├── requirements.txt # → ../hub/requirements.txt -│ ├── dataloader/ # → ../hub/dataloader/ +│ ├── main.py # → ../soleprint/main.py +│ ├── run.py # → ../soleprint/run.py +│ ├── index.html # → ../soleprint/index.html +│ ├── requirements.txt # → ../soleprint/requirements.txt +│ ├── dataloader/ # → ../soleprint/dataloader/ │ ├── artery/ # → ../artery/ │ ├── atlas/ # → ../atlas/ │ ├── station/ # → ../station/ │ ├── data/ # → ../data/ +│ ├── cfg/ # Copied config │ └── models/ # GENERATED (one-time per client) │ └── pydantic/ │ └── mainroom/ # Orchestration: soleprint ↔ managed room - ├── ctrl/ # Orchestration commands + ├── ctrl/ # Orchestration commands (acts on mainroom) ├── sbwrapper/ # Sidebar wrapper UI - ├── link/ # Adapters (connect without modifying either side) - │ └── adapters/ # Framework-specific adapters (django, etc.) └── soleprint/ # Docker configs for soleprint services ├── docker-compose.yml + ├── docker-compose.nginx.yml # Path-based routing └── Dockerfile.fastapi ``` -## The Three Systems +## The Four Systems | System | Purpose | Tagline | |--------|---------|---------| +| **Soleprint** | Core coordinator | Cada paso deja huella | | **Artery** | Connectors to external services | Todo lo vital | | **Atlas** | Actionable documentation | Mapeando el recorrido | | **Station** | Tools, environments, execution | Centro de control | @@ -103,32 +110,34 @@ A **Room** is an environment with soleprint context, features, and conventions: ### Mainroom The **mainroom** orchestrates interaction between soleprint and managed rooms: - `sbwrapper/` - Sidebar UI overlay for any managed app (quick login, Jira info, etc.) -- `link/` - Adapters to connect soleprint to managed app data WITHOUT modifying either - `soleprint/` - Docker configs + ctrl scripts for running soleprint services - `ctrl/local/` - Local deployment scripts (push.sh, deploy.sh) - `ctrl/server/` - Server setup scripts - `ctrl/` - Mainroom-level orchestration commands -Soleprint can run without a managed room (for testing veins, etc.) but is always initiated from mainroom. +Soleprint can run without a managed room (for testing veins, etc.). -### Hub vs Gen -- `hub/` = Versioned base files (main.py, dataloader, index.html) -- `gen/` = Gitignored runnable instance with symlinks to hub/ + systems +### cfg/ - Configuration +- `cfg/soleprint.config.json` - Framework model definitions +- `cfg//` - Room-specific configs (e.g., `cfg/amar/`) + - Uses absolute paths to external Dockerfiles + - Room-specific tools/adapters (e.g., databrowse link adapter) + +### soleprint/ vs gen/ +- `soleprint/` = Versioned core files (main.py, run.py, dataloader, index.html) +- `gen/` = Gitignored runnable instance with symlinks to soleprint/ + systems - `gen/models/` = Generated models (one-time per client, like an install) -**Development:** Edit in hub/, artery/, atlas/, station/, data/ → run from gen/ +**Development:** Edit in soleprint/, artery/, atlas/, station/, data/ → run from gen/ **Production:** Copy everything (resolve symlinks) -### The Generator -Lives in `station/tools/generator/`. It: -1. Reads `schema.json` (source of truth) +### Modelgen (Generic Tool) +Lives in `station/tools/modelgen/`. It: +1. Reads `cfg/soleprint.config.json` (source of truth) 2. Generates Pydantic models to `gen/models/` 3. Generation is **one-time per client** (like install) 4. Runs standalone (no model dependencies) for bootstrap -### Naming Flexibility -Code inside soleprint should NOT have imports too tied to system names. Display names are configurable. Future: swap entire naming domains without breaking functionality. - ## Development Workflow ### Build Tool @@ -138,23 +147,12 @@ The build script at spr root handles both development and deployment builds: ```bash # From spr/ python build.py --help -python build.py dev # Build with symlinks +python build.py dev # Build with symlinks (soleprint only) +python build.py dev --cfg amar # Include amar room config python build.py deploy --output /path/ # Build for production python build.py models # Only regenerate models ``` -### Modelgen (Generic Tool) - -Modelgen is a generic model generation tool in `station/tools/modelgen/`: - -```bash -# Generate models from config -python -m station.tools.modelgen from-config --config config/soleprint.config.json --output gen/models/ - -# Future: extract models from codebases (for databrowse) -python -m station.tools.modelgen extract --source /path/to/django/project --output models/ -``` - ### Setting Up Dev Environment ```bash cd spr/ @@ -163,50 +161,48 @@ python build.py dev # Creates gen/ with symlinks cd gen/ python3 -m venv .venv .venv/bin/pip install -r requirements.txt -.venv/bin/python main.py # Hub on :12000 +.venv/bin/python run.py # Single-port bare-metal dev server +# or +.venv/bin/python main.py # Multi-port (production-like) ``` +### Bare-metal vs Docker +- **Bare-metal:** `python run.py` - Single port, all routes internal, for soleprint dev +- **Docker:** Use mainroom for managed rooms - separate containers, nginx routing + ### Building for Deployment ```bash cd spr/ -python build.py deploy --output ../deploy/soleprint/ +python build.py deploy --output ../deploy/soleprint/ --cfg amar # Then deploy: rsync -av ../deploy/soleprint/ server:/app/soleprint/ -ssh server 'cd /app/soleprint && ./run.sh' +ssh server 'cd /app/soleprint && ./start.sh' # Or use mainroom ctrl scripts: cd mainroom/soleprint/ctrl/local ./deploy.sh ``` -### Regenerating Models Only (rare) -```bash -cd spr/ -python build.py models -``` - ### Orchestrating with Managed Room ```bash cd spr/mainroom/ctrl -./start.sh # Sets env vars, starts soleprint + link services +./start.sh # Sets env vars, starts soleprint + managed room services ``` ### Worktrees Feature development in: `/home/mariano/wdir/wts/spr/` Planned: -- `databrowse` - Data browser tool (separate CLAUDE.md) +- `databrowse` - Data browser tool (uses modelgen extract) - `sbwrapper` - Sidebar wrapper development ## External References | What | Location | Notes | |------|----------|-------| -| Core Nest (legacy) | `core_nest/` | Original orchestration, being replaced by mainroom | | Amar Backend | `ama/amar_django_back` | Example managed room | | Amar Frontend | `ama/amar_frontend` | Example managed room | -| Pawprint (legacy) | `ama/pawprint` | Original pet-themed naming, deprecated | ## Tools Status @@ -215,7 +211,6 @@ Planned: | modelgen | station/tools/modelgen | Working | Generic model generation (used by build.py, databrowse) | | datagen | station/tools/datagen | Working | Test data generation | | tester | station/tools/tester | Advanced | Full BDD/playwright | -| hub | station/tools/hub | Idea | Port management | | infra | station/tools/infra | Idea | Cloud deploy scripts | | graphgen | station/tools/graphgen | Idea | Graph generation | @@ -223,7 +218,7 @@ Planned: | Service | Port | |---------|------| -| Hub (soleprint) | 12000 | +| Soleprint | 12000 | | Artery | 12001 | | Atlas | 12002 | | Station | 12003 | @@ -233,13 +228,14 @@ Planned: **Done:** - [x] Project structure finalized - [x] Schema.json in place -- [x] Generator moved to station/tools/ -- [x] Hub/gen separation with symlinks -- [x] Mainroom structure from core_nest -- [x] Docker configs updated to soleprint naming -- [x] Tools consolidated from pawprint -- [x] Build tool with dev/deploy modes -- [x] gen/ runs correctly +- [x] Modelgen in station/tools/ +- [x] soleprint/gen separation with symlinks +- [x] Mainroom structure +- [x] Docker configs with nginx path-based routing +- [x] Build tool with dev/deploy modes and --cfg argument +- [x] Bare-metal run.py for single-port dev +- [x] cfg/amar/ with absolute paths pattern +- [x] Renamed: hub→soleprint, config→cfg, nest→room, pawprint→soleprint **Next:** 1. [ ] Test mainroom/soleprint/ctrl scripts @@ -260,15 +256,19 @@ Planned: ```bash # Build for dev (from spr/) python build.py dev +python build.py dev --cfg amar # With amar room config -# Start dev server +# Start dev server (bare-metal, single-port) +cd gen && .venv/bin/python run.py + +# Start production-like (multi-port) cd gen && .venv/bin/python main.py # Health check curl localhost:12000/health # Build for deployment -python build.py deploy --output /path/to/deploy/ +python build.py deploy --output /path/to/deploy/ --cfg amar # Deploy via ctrl scripts cd mainroom/soleprint/ctrl/local && ./deploy.sh @@ -277,5 +277,5 @@ cd mainroom/soleprint/ctrl/local && ./deploy.sh cd mainroom/soleprint && docker compose up -d # Modelgen (generic tool) -python -m station.tools.modelgen from-config -c config/soleprint.config.json -o gen/models/ +python -m station.tools.modelgen from-config -c cfg/soleprint.config.json -o gen/models/ ``` diff --git a/README.md b/README.md index 7238837..23e6db6 100644 --- a/README.md +++ b/README.md @@ -7,9 +7,14 @@ Development workflow and documentation platform. Run, test, and document everyth ## Quick Start ```bash +# Build dev environment +python build.py dev + +# Run cd gen -pip install -r requirements.txt -python main.py +python3 -m venv .venv +.venv/bin/pip install -r requirements.txt +.venv/bin/python run.py # Single-port bare-metal dev # Visit http://localhost:12000 ``` @@ -17,6 +22,7 @@ python main.py | | System | What it does | |---|--------|--------------| +| 👣 | **Soleprint** | Core coordinator, routing, landing page | | 💉 | **Artery** | Connectors to external services (Jira, Slack, APIs) | | 🗺️ | **Atlas** | Actionable documentation (BDD, Gherkin, specs) | | 🎛️ | **Station** | Tools, environments, test runners | @@ -26,25 +32,29 @@ python main.py ``` spr/ ├── schema.json # Model definitions (source of truth) -├── config/ # Framework configuration -├── ctrl/ # Soleprint room ctrl +├── cfg/ # Framework configuration +│ ├── soleprint.config.json +│ └── amar/ # Room-specific configs +│ +├── soleprint/ # Core coordinator (versioned) +│ ├── main.py # Multi-port entry point +│ ├── run.py # Single-port bare-metal dev +│ └── dataloader/ │ ├── artery/ # Connectors (versioned) ├── atlas/ # Documentation (versioned) ├── station/ # Tools (versioned) │ └── tools/ -│ ├── generator/ # Generates models from schema +│ ├── modelgen/ # Generates models from config │ ├── datagen/ # Test data generation │ └── tester/ # BDD/contract test runner │ ├── data/ # JSON content -├── hub/ # Base files (main.py, dataloader, etc.) -├── gen/ # Runnable instance (symlinks + generated models) +├── gen/ # Runnable instance (symlinks + generated) │ └── mainroom/ # Orchestration: soleprint ↔ managed room ├── ctrl/ # Orchestration commands ├── sbwrapper/ # Sidebar wrapper UI - ├── link/ # Adapters for managed apps └── soleprint/ # Docker configs ``` @@ -66,16 +76,14 @@ spr/ ## Development -### Run locally +### Build and run ```bash -cd gen -python main.py -``` +python build.py dev # Soleprint only +python build.py dev --cfg amar # With amar room config -### Regenerate models (one-time / rare) -```bash -cd station/tools/generator -python -m generators.orchestrator --output ../../../gen +cd gen +.venv/bin/python run.py # Bare-metal single-port +.venv/bin/python main.py # Multi-port (production-like) ``` ### Run with Docker (via mainroom) @@ -88,7 +96,7 @@ docker compose up -d | Service | Port | |---------|------| -| Hub (soleprint) | 12000 | +| Soleprint | 12000 | | Artery | 12001 | | Atlas | 12002 | | Station | 12003 | @@ -96,13 +104,13 @@ docker compose up -d ## Architecture ``` -hub/ → Versioned base files (main.py, dataloader) -gen/ → Runnable instance (symlinks to hub/ + systems) +soleprint/ → Versioned core files (main.py, run.py, dataloader) +gen/ → Runnable instance (symlinks to soleprint/ + systems) gen/models/ → Generated once per client (like install) +cfg/ → Configuration (copied to gen/cfg/) mainroom/ → Orchestration layer ├── sbwrapper → UI overlay for managed apps -├── link → Data adapters (no modification to either side) └── soleprint → Docker for soleprint services ``` @@ -122,4 +130,4 @@ TBD --- -*Built for small teams who need to move fast without breaking things.* \ No newline at end of file +*Built for small teams who need to move fast without breaking things.* diff --git a/build.py b/build.py index 363017f..7aa90cb 100644 --- a/build.py +++ b/build.py @@ -10,13 +10,17 @@ Modes: Usage: python build.py dev + python build.py dev --cfg amar python build.py deploy --output /path/to/deploy/ python build.py models Examples: - # Set up dev environment + # Set up dev environment (soleprint only) python build.py dev + # Set up dev environment with amar room config + python build.py dev --cfg amar + # Build for deployment python build.py deploy --output ../deploy/soleprint/ @@ -83,7 +87,7 @@ def generate_models(output_dir: Path): Args: output_dir: Directory where models/pydantic/__init__.py will be created """ - config_path = SPR_ROOT / "config" / "soleprint.config.json" + config_path = SPR_ROOT / "cfg" / "soleprint.config.json" if not config_path.exists(): print(f"Warning: Config not found at {config_path}") @@ -111,35 +115,74 @@ def generate_models(output_dir: Path): return result.returncode == 0 -def build_dev(output_dir: Path): +def copy_cfg(output_dir: Path, cfg_name: str | None): + """Copy configuration files to output directory. + + Args: + output_dir: Target directory + cfg_name: Name of room config (e.g., 'amar'), or None for base only + """ + cfg_dir = output_dir / "cfg" + ensure_dir(cfg_dir) + + # Always copy base config + base_config = SPR_ROOT / "cfg" / "soleprint.config.json" + if base_config.exists(): + copy_path(base_config, cfg_dir / "soleprint.config.json") + + # Copy room-specific config if specified + if cfg_name: + room_cfg = SPR_ROOT / "cfg" / cfg_name + if room_cfg.exists() and room_cfg.is_dir(): + print(f"\nCopying {cfg_name} room config...") + for item in room_cfg.iterdir(): + if item.name == ".env.example": + # Copy .env.example to output root as template + copy_path(item, output_dir / ".env.example") + elif item.is_dir(): + copy_path(item, cfg_dir / cfg_name / item.name) + else: + ensure_dir(cfg_dir / cfg_name) + copy_path(item, cfg_dir / cfg_name / item.name) + else: + print(f"Warning: Room config '{cfg_name}' not found at {room_cfg}") + + +def build_dev(output_dir: Path, cfg_name: str | None = None): """ Build for development using symlinks. Structure: gen/ - ├── main.py -> ../hub/main.py - ├── index.html -> ../hub/index.html - ├── requirements.txt -> ../hub/requirements.txt - ├── dataloader/ -> ../hub/dataloader/ + ├── main.py -> ../soleprint/main.py + ├── run.py -> ../soleprint/run.py + ├── index.html -> ../soleprint/index.html + ├── requirements.txt -> ../soleprint/requirements.txt + ├── dataloader/ -> ../soleprint/dataloader/ ├── artery/ -> ../artery/ ├── atlas/ -> ../atlas/ ├── station/ -> ../station/ ├── data/ -> ../data/ + ├── cfg/ # Copied config + ├── .env.example # From cfg//.env.example └── models/ # Generated """ print(f"\n=== Building DEV environment ===") print(f"SPR root: {SPR_ROOT}") print(f"Output: {output_dir}") + if cfg_name: + print(f"Room cfg: {cfg_name}") ensure_dir(output_dir) - # Hub files (symlinks) - print("\nLinking hub files...") - hub = SPR_ROOT / "hub" - create_symlink(hub / "main.py", output_dir / "main.py") - create_symlink(hub / "index.html", output_dir / "index.html") - create_symlink(hub / "requirements.txt", output_dir / "requirements.txt") - create_symlink(hub / "dataloader", output_dir / "dataloader") + # Soleprint core files (symlinks) + print("\nLinking soleprint files...") + soleprint = SPR_ROOT / "soleprint" + create_symlink(soleprint / "main.py", output_dir / "main.py") + create_symlink(soleprint / "run.py", output_dir / "run.py") + create_symlink(soleprint / "index.html", output_dir / "index.html") + create_symlink(soleprint / "requirements.txt", output_dir / "requirements.txt") + create_symlink(soleprint / "dataloader", output_dir / "dataloader") # System directories (symlinks) print("\nLinking systems...") @@ -152,6 +195,10 @@ def build_dev(output_dir: Path): print("\nLinking data...") create_symlink(SPR_ROOT / "data", output_dir / "data") + # Config (copy, not symlink - may be customized) + print("\nCopying config...") + copy_cfg(output_dir, cfg_name) + # Models (generated) - pass output_dir, modelgen adds models/pydantic print("\nGenerating models...") if not generate_models(output_dir): @@ -162,16 +209,19 @@ def build_dev(output_dir: Path): print(f" cd {output_dir}") print(f" python3 -m venv .venv") print(f" .venv/bin/pip install -r requirements.txt") - print(f" .venv/bin/python main.py") + print(f" .venv/bin/python main.py # Multi-port (production-like)") + print(f" .venv/bin/python run.py # Single-port (bare-metal dev)") -def build_deploy(output_dir: Path): +def build_deploy(output_dir: Path, cfg_name: str | None = None): """ Build for deployment by copying all files (no symlinks). """ print(f"\n=== Building DEPLOY package ===") print(f"SPR root: {SPR_ROOT}") print(f"Output: {output_dir}") + if cfg_name: + print(f"Room cfg: {cfg_name}") if output_dir.exists(): response = input(f"\nOutput directory exists. Overwrite? [y/N] ") @@ -182,13 +232,14 @@ def build_deploy(output_dir: Path): ensure_dir(output_dir) - # Hub files (copy) - print("\nCopying hub files...") - hub = SPR_ROOT / "hub" - copy_path(hub / "main.py", output_dir / "main.py") - copy_path(hub / "index.html", output_dir / "index.html") - copy_path(hub / "requirements.txt", output_dir / "requirements.txt") - copy_path(hub / "dataloader", output_dir / "dataloader") + # Soleprint core files (copy) + print("\nCopying soleprint files...") + soleprint = SPR_ROOT / "soleprint" + copy_path(soleprint / "main.py", output_dir / "main.py") + copy_path(soleprint / "run.py", output_dir / "run.py") + copy_path(soleprint / "index.html", output_dir / "index.html") + copy_path(soleprint / "requirements.txt", output_dir / "requirements.txt") + copy_path(soleprint / "dataloader", output_dir / "dataloader") # System directories (copy) print("\nCopying systems...") @@ -201,6 +252,10 @@ def build_deploy(output_dir: Path): print("\nCopying data...") copy_path(SPR_ROOT / "data", output_dir / "data") + # Config (copy) + print("\nCopying config...") + copy_cfg(output_dir, cfg_name) + # Models (generate fresh) - pass output_dir, modelgen adds models/pydantic print("\nGenerating models...") if not generate_models(output_dir): @@ -215,7 +270,7 @@ def build_deploy(output_dir: Path): copy_path(SPR_ROOT / "schema.json", output_dir / "schema.json") # Create run script - run_script = output_dir / "run.sh" + run_script = output_dir / "start.sh" run_script.write_text("""#!/bin/bash # Soleprint runner cd "$(dirname "$0")" @@ -230,16 +285,16 @@ echo "Starting soleprint on http://localhost:12000" .venv/bin/python main.py """) run_script.chmod(0o755) - print(" Created: run.sh") + print(" Created: start.sh") total_files = count_files(output_dir) print(f"\n✓ Deploy build complete! ({total_files} files)") print(f"\nTo run:") print(f" cd {output_dir}") - print(f" ./run.sh") + print(f" ./start.sh") print(f"\nOr deploy to server:") print(f" rsync -av {output_dir}/ server:/app/soleprint/") - print(f" ssh server 'cd /app/soleprint && ./run.sh'") + print(f" ssh server 'cd /app/soleprint && ./start.sh'") def build_models(): @@ -274,6 +329,13 @@ def main(): default=SPR_ROOT / "gen", help="Output directory (default: gen/)", ) + dev_parser.add_argument( + "--cfg", + "-c", + type=str, + default=None, + help="Room config to include (e.g., 'amar')", + ) # deploy command deploy_parser = subparsers.add_parser( @@ -286,6 +348,13 @@ def main(): required=True, help="Output directory for deployment package", ) + deploy_parser.add_argument( + "--cfg", + "-c", + type=str, + default=None, + help="Room config to include (e.g., 'amar')", + ) # models command subparsers.add_parser("models", help="Only regenerate models") @@ -293,9 +362,9 @@ def main(): args = parser.parse_args() if args.command == "dev": - build_dev(args.output.resolve()) + build_dev(args.output.resolve(), args.cfg) elif args.command == "deploy": - build_deploy(args.output.resolve()) + build_deploy(args.output.resolve(), args.cfg) elif args.command == "models": build_models() diff --git a/cfg/amar/.env.example b/cfg/amar/.env.example new file mode 100644 index 0000000..2a1c049 --- /dev/null +++ b/cfg/amar/.env.example @@ -0,0 +1,117 @@ +# ============================================================================= +# AMAR Room - Configuration Template +# ============================================================================= +# Copy this to .env and fill in values for your environment. +# Uses absolute paths to plug soleprint to existing Dockerfiles. +# ============================================================================= + +# ============================================================================= +# DEPLOYMENT +# ============================================================================= +# Container name prefix (e.g., amar_backend, amar_db) +DEPLOYMENT_NAME=amar + +# ============================================================================= +# NETWORK +# ============================================================================= +NETWORK_NAME=amar_network + +# ============================================================================= +# PATHS (absolute paths to external code/dockerfiles - REQUIRED) +# ============================================================================= +BACKEND_PATH=/abs/path/to/amar_django_back +FRONTEND_PATH=/abs/path/to/amar_frontend +DOCKERFILE_BACKEND=/abs/path/to/Dockerfile.backend +DOCKERFILE_FRONTEND=/abs/path/to/Dockerfile.frontend + +# ============================================================================= +# DATABASE +# ============================================================================= +# Database dump file (relative to dumps/ directory) +DB_DUMP=test.sql + +# ============================================================================= +# PORTS +# ============================================================================= +BACKEND_PORT=8000 +FRONTEND_PORT=3000 + +# Soleprint ports +SOLEPRINT_PORT=12000 +ARTERY_PORT=12001 +ATLAS_PORT=12002 +STATION_PORT=12003 + +# ============================================================================= +# BACKEND SERVER (Uvicorn) +# ============================================================================= +# Dev: 1 worker with hot reload +# Prod: 4 workers without reload +BACKEND_WORKERS=1 +BACKEND_RELOAD=--reload + +# Database connection +POSTGRES_DB=amarback +POSTGRES_USER=postgres +POSTGRES_PASSWORD=your_secure_password_here + +# ============================================================================= +# DJANGO +# ============================================================================= +SECRET_KEY=your_django_secret_key_here +DEBUG=False +ALLOWED_HOSTS=amar.room.mcrn.ar,localhost +DJANGO_ENV=production + +# ============================================================================= +# CORS +# ============================================================================= +CORS_ALLOW_ALL=false +CORS_ALLOWED_ORIGINS= + +# ============================================================================= +# GOOGLE SERVICES +# ============================================================================= +SUBJECT_CALENDAR= +SHEET_ID= +RANGE_NAME= +GOOGLE_MAPS_API_KEY= + +# ============================================================================= +# ANALYTICS +# ============================================================================= +GA4_MEASUREMENT_ID= +AMPLITUDE_API_KEY= +HOTJAR_API_KEY= + +# ============================================================================= +# MERCADO PAGO +# ============================================================================= +ACCESS_TOKEN_MERCADO_PAGO= +MP_PLATFORM_ACCESS_TOKEN= +USER_ID= + +# ============================================================================= +# WEB PUSH +# ============================================================================= +WEBPUSH_VAPID_PUBLIC_KEY= +WEBPUSH_VAPID_PRIVATE_KEY= +WEBPUSH_VAPID_ADMIN_EMAIL= + +# ============================================================================= +# INIT +# ============================================================================= +USER_PASSWORD=initial_admin_password + +# ============================================================================= +# FRONTEND +# ============================================================================= +NEXT_PUBLIC_APP_API_URL_BACKOFFICE= +NEXT_PUBLIC_APP_API_URL_STAGE= +NEXT_PUBLIC_IS_STAGE=false +NEXT_PUBLIC_FB_PIXEL_ID= +NEXT_PUBLIC_TAG_MANAGER= +NEXT_PUBLIC_WHATSAPP_CONTACT= +NEXT_PUBLIC_API_KEY= +NEXT_PUBLIC_AMPLITUDE_API_KEY= +NEXT_PUBLIC_GMAPS_API_KEY= diff --git a/cfg/amar/docker-compose.yml b/cfg/amar/docker-compose.yml new file mode 100644 index 0000000..47a6816 --- /dev/null +++ b/cfg/amar/docker-compose.yml @@ -0,0 +1,202 @@ +# Amar Room - Docker Compose +# +# Creates: db, redis, backend, celery, celery-beat, frontend +# Network: Joins external network defined by NETWORK_NAME +# +# Usage: +# cd cfg/amar && docker compose up -d +# +# Required Environment Variables (from .env): +# - DEPLOYMENT_NAME: Prefix for container names +# - NETWORK_NAME: Network to join +# - BACKEND_PATH, FRONTEND_PATH: Source code paths (absolute) +# - DOCKERFILE_BACKEND, DOCKERFILE_FRONTEND: Dockerfile paths (absolute) +# - DB_DUMP: Database dump file (relative to dumps/) +# - Plus all app-specific vars (POSTGRES_*, etc.) + +services: + db: + image: postgis/postgis:15-3.4 + container_name: ${DEPLOYMENT_NAME}_db + environment: + POSTGRES_DB: ${POSTGRES_DB} + POSTGRES_USER: ${POSTGRES_USER} + POSTGRES_PASSWORD: ${POSTGRES_PASSWORD} + volumes: + - pgdata:/var/lib/postgresql/data + # Database dump loaded on init (if volume is empty) + - ./dumps/${DB_DUMP}:/docker-entrypoint-initdb.d/dump.sql:ro + healthcheck: + test: ["CMD-SHELL", "pg_isready -U ${POSTGRES_USER} -d ${POSTGRES_DB}"] + interval: 10s + timeout: 5s + retries: 5 + networks: + - default + + redis: + image: redis:7-alpine + container_name: ${DEPLOYMENT_NAME}_redis + volumes: + - redisdata:/data + healthcheck: + test: ["CMD", "redis-cli", "ping"] + interval: 10s + timeout: 5s + retries: 5 + networks: + - default + + backend: + build: + context: ${BACKEND_PATH} + dockerfile: ${DOCKERFILE_BACKEND} + target: runtime + container_name: ${DEPLOYMENT_NAME}_backend + environment: + - SECRET_KEY + - DEBUG + - ALLOWED_HOSTS + - DJANGO_ENV + - DB_NAME=${POSTGRES_DB} + - DB_USER=${POSTGRES_USER} + - DB_PASSWORD=${POSTGRES_PASSWORD} + - DB_HOST=db + - DB_PORT=5432 + - CELERY_BROKER_URL=redis://redis:6379/0 + - CELERY_RESULT_BACKEND=redis://redis:6379/0 + - CORS_ALLOW_ALL + - CORS_ALLOWED_ORIGINS + # Uvicorn config (dev: 1 worker + reload, prod: 4 workers) + - WORKERS=${BACKEND_WORKERS:-1} + - RELOAD=${BACKEND_RELOAD:---reload} + # Google + - SUBJECT_CALENDAR + - SHEET_ID + - RANGE_NAME + - GOOGLE_MAPS_API_KEY + # Analytics + - GA4_MEASUREMENT_ID + - AMPLITUDE_API_KEY + - HOTJAR_API_KEY + # Payments + - ACCESS_TOKEN_MERCADO_PAGO + - MP_PLATFORM_ACCESS_TOKEN + - USER_ID + # Push + - WEBPUSH_VAPID_PUBLIC_KEY + - WEBPUSH_VAPID_PRIVATE_KEY + - WEBPUSH_VAPID_ADMIN_EMAIL + # Init + - USER_PASSWORD + volumes: + - ${BACKEND_PATH}:/app + - backend_static:/var/etc/static + - backend_media:/app/media + ports: + - "${BACKEND_PORT}:8000" + depends_on: + db: + condition: service_healthy + redis: + condition: service_healthy + networks: + - default + command: > + sh -c "python manage.py migrate --noinput && + uvicorn amar_django_back.asgi:application --host 0.0.0.0 --port 8000 --workers $${WORKERS:-1} $${RELOAD}" + + celery: + build: + context: ${BACKEND_PATH} + dockerfile: ${DOCKERFILE_BACKEND} + target: runtime + container_name: ${DEPLOYMENT_NAME}_celery + environment: + - SECRET_KEY + - DEBUG + - DJANGO_ENV + - DB_NAME=${POSTGRES_DB} + - DB_USER=${POSTGRES_USER} + - DB_PASSWORD=${POSTGRES_PASSWORD} + - DB_HOST=db + - DB_PORT=5432 + - CELERY_BROKER_URL=redis://redis:6379/0 + - CELERY_RESULT_BACKEND=redis://redis:6379/0 + volumes: + - ${BACKEND_PATH}:/app + - backend_media:/app/media + depends_on: + db: + condition: service_healthy + redis: + condition: service_healthy + networks: + - default + command: celery -A amar_django_back worker -l INFO + + celery-beat: + build: + context: ${BACKEND_PATH} + dockerfile: ${DOCKERFILE_BACKEND} + target: runtime + container_name: ${DEPLOYMENT_NAME}_celery_beat + environment: + - SECRET_KEY + - DEBUG + - DJANGO_ENV + - DB_NAME=${POSTGRES_DB} + - DB_USER=${POSTGRES_USER} + - DB_PASSWORD=${POSTGRES_PASSWORD} + - DB_HOST=db + - DB_PORT=5432 + - CELERY_BROKER_URL=redis://redis:6379/0 + - CELERY_RESULT_BACKEND=redis://redis:6379/0 + volumes: + - ${BACKEND_PATH}:/app + depends_on: + db: + condition: service_healthy + redis: + condition: service_healthy + networks: + - default + command: celery -A amar_django_back beat -l INFO + + frontend: + build: + context: ${FRONTEND_PATH} + dockerfile: ${DOCKERFILE_FRONTEND} + target: development + container_name: ${DEPLOYMENT_NAME}_frontend + environment: + - NEXT_PUBLIC_APP_API_URL_BACKOFFICE + - NEXT_PUBLIC_APP_API_URL_STAGE + - NEXT_PUBLIC_IS_STAGE + - NEXT_PUBLIC_FB_PIXEL_ID + - NEXT_PUBLIC_TAG_MANAGER + - NEXT_PUBLIC_WHATSAPP_CONTACT + - NEXT_PUBLIC_API_KEY + - NEXT_PUBLIC_AMPLITUDE_API_KEY + - NEXT_PUBLIC_GMAPS_API_KEY + volumes: + - ${FRONTEND_PATH}/src:/app/src + - ${FRONTEND_PATH}/public:/app/public + ports: + - "${FRONTEND_PORT}:3000" + depends_on: + - backend + networks: + - default + # CMD from Dockerfile.frontend development stage: npm run dev + +volumes: + pgdata: + redisdata: + backend_static: + backend_media: + +networks: + default: + external: true + name: ${NETWORK_NAME} diff --git a/mainroom/link/Dockerfile b/cfg/amar/link/Dockerfile similarity index 100% rename from mainroom/link/Dockerfile rename to cfg/amar/link/Dockerfile diff --git a/mainroom/link/README.md b/cfg/amar/link/README.md similarity index 89% rename from mainroom/link/README.md rename to cfg/amar/link/README.md index 625588f..ba700e7 100644 --- a/mainroom/link/README.md +++ b/cfg/amar/link/README.md @@ -1,6 +1,6 @@ -# Link Nest - Adapter Layer +# Link Room - Adapter Layer -Provides framework-agnostic data navigation between managed apps (AMAR) and pawprint. +Provides framework-agnostic data navigation between managed apps (AMAR) and soleprint. ## Status: Initial Implementation ✅ @@ -20,7 +20,7 @@ Provides framework-agnostic data navigation between managed apps (AMAR) and pawp ## Architecture ``` -Managed App (AMAR) ←─── link_nest ───→ Pawprint (Ward) +Managed App (AMAR) ←─── link_room ───→ Soleprint (Ward) ↓ ↓ ↓ Database Adapter Layer Graph Renderer (SQL → JSON) (JSON → SVG) @@ -58,8 +58,8 @@ Managed App (AMAR) ←─── link_nest ───→ Pawprint (Ward) ## Usage ```bash -# Start (from core_nest/ctrl) -./start.sh link_nest -d --build +# Start (from core_room/ctrl) +./start.sh link_room -d --build # Test curl http://localhost:8100/health @@ -67,12 +67,12 @@ curl http://localhost:8100/api/queries curl "http://localhost:8100/api/navigate?query=user_with_pets" # Logs -docker logs core_nest_link_nest +docker logs core_room_link_room ``` ## Environment Variables -From `core_nest/.env`: +From `core_room/.env`: - `NEST_NAME` - Container naming - `NETWORK_NAME` - Docker network - `DB_HOST` - Database host (needs fix: should point to db container) @@ -84,7 +84,7 @@ From `core_nest/.env`: ## Next Steps -1. **Fix DB connection** - Set correct DB_HOST in core_nest/.env +1. **Fix DB connection** - Set correct DB_HOST in core_room/.env 2. **Complete queries** - Add remaining entity types 3. **Ward integration** - Create ward consumer for JSON 4. **Add graphviz rendering** - Move from data_browse reference @@ -93,7 +93,7 @@ From `core_nest/.env`: ## Files ``` -link_nest/ +link_room/ ├── README.md # This file ├── main.py # FastAPI app with endpoints ├── requirements.txt # Python dependencies @@ -107,7 +107,7 @@ link_nest/ ## Design Goals ✅ **Framework-agnostic** - Works with Django, Rails, Express, etc. -✅ **Decoupled** - Managed app owns data, link_nest translates +✅ **Decoupled** - Managed app owns data, link_room translates ✅ **Pluggable** - Adapters for different frameworks ✅ **Authenticated** - Ready for remote deployment ✅ **Incremental** - Build and test each piece diff --git a/mainroom/link/adapters/__init__.py b/cfg/amar/link/adapters/__init__.py similarity index 100% rename from mainroom/link/adapters/__init__.py rename to cfg/amar/link/adapters/__init__.py diff --git a/mainroom/link/adapters/django.py b/cfg/amar/link/adapters/django.py similarity index 100% rename from mainroom/link/adapters/django.py rename to cfg/amar/link/adapters/django.py diff --git a/mainroom/link/docker-compose.yml b/cfg/amar/link/docker-compose.yml similarity index 100% rename from mainroom/link/docker-compose.yml rename to cfg/amar/link/docker-compose.yml diff --git a/mainroom/link/main.py b/cfg/amar/link/main.py similarity index 94% rename from mainroom/link/main.py rename to cfg/amar/link/main.py index 44d48ae..790e584 100644 --- a/mainroom/link/main.py +++ b/cfg/amar/link/main.py @@ -1,5 +1,5 @@ """ -Link Nest - Adapter layer between managed apps and pawprint. +Link Room - Adapter layer between managed apps and soleprint. Exposes standardized JSON endpoints for data navigation. Framework-agnostic via pluggable adapters. @@ -9,7 +9,7 @@ import os from typing import Optional from fastapi import FastAPI, HTTPException -app = FastAPI(title="Link Nest", version="0.1.0") +app = FastAPI(title="Link Room", version="0.1.0") # Lazy-loaded adapter instance _adapter = None @@ -54,7 +54,7 @@ def health(): return { "status": "ok" if adapter_ok else "degraded", - "service": "link-nest", + "service": "link-room", "adapter": adapter_type, "adapter_loaded": adapter_ok, } diff --git a/mainroom/link/requirements.txt b/cfg/amar/link/requirements.txt similarity index 100% rename from mainroom/link/requirements.txt rename to cfg/amar/link/requirements.txt diff --git a/config/soleprint.config.json b/cfg/soleprint.config.json similarity index 100% rename from config/soleprint.config.json rename to cfg/soleprint.config.json diff --git a/mainroom/CLAUDE.md b/mainroom/CLAUDE.md index 8b91ae6..e7ae5af 100644 --- a/mainroom/CLAUDE.md +++ b/mainroom/CLAUDE.md @@ -136,4 +136,4 @@ Feature development: | Soleprint source | `../` (parent directory) | | Amar backend | `/home/mariano/wdir/ama/amar_django_back` | | Amar frontend | `/home/mariano/wdir/ama/amar_frontend` | -| Core nest (legacy) | `/home/mariano/wdir/ama/core_nest` | \ No newline at end of file +| Core room (legacy) | `/home/mariano/wdir/ama/core_room` | \ No newline at end of file diff --git a/mainroom/ctrl/.env.sync b/mainroom/ctrl/.env.sync index e3c8bd0..d43f45f 100644 --- a/mainroom/ctrl/.env.sync +++ b/mainroom/ctrl/.env.sync @@ -1,19 +1,19 @@ -# Configuration for core_nest deployment +# Configuration for core_room deployment # Server configuration DEPLOY_SERVER=mariano@mcrn.ar # Docker deployment (default) -DEPLOY_REMOTE_PATH=~/core_nest +DEPLOY_REMOTE_PATH=~/core_room # Bare metal deployment (--bare-metal flag) -DEPLOY_BARE_METAL_PATH=~/pawprint +DEPLOY_BARE_METAL_PATH=~/soleprint # Local source code paths # (Defaults are set in deploy.sh if not specified here) LOCAL_AMAR_BACKEND=/home/mariano/wdir/ama/amar_django_back LOCAL_AMAR_FRONTEND=/home/mariano/wdir/ama/amar_frontend -LOCAL_PAWPRINT=/home/mariano/wdir/ama/pawprint +LOCAL_SOLEPRINT=/home/mariano/wdir/ama/soleprint # ============================================================================= # TEST SYNC PATHS (decoupled, standalone) @@ -22,4 +22,4 @@ LOCAL_PAWPRINT=/home/mariano/wdir/ama/pawprint TEST_SOURCE_PATH=/home/mariano/wdir/ama/amar_django_back/tests/contracts # Target: Where ward tester expects tests (volume mount, no restart needed) -WARD_TESTS_PATH=/home/mariano/wdir/ama/pawprint/ward/tools/tester/tests +WARD_TESTS_PATH=/home/mariano/wdir/ama/soleprint/ward/tools/tester/tests diff --git a/mainroom/ctrl/README.md b/mainroom/ctrl/README.md index 5b8bf9b..5bd5735 100644 --- a/mainroom/ctrl/README.md +++ b/mainroom/ctrl/README.md @@ -1,6 +1,6 @@ -# Core Nest Control Scripts +# Core Room Control Scripts -Control scripts for managing the core_nest deployment (amar + pawprint). +Control scripts for managing the core_room deployment (amar + soleprint). ## Structure @@ -17,7 +17,7 @@ ctrl/ ├── stop.sh # Stop Docker services └── manual_sync/ # Source code sync scripts ├── sync_ama.sh # Sync amar source code - └── sync_pawprint.sh # Sync pawprint source code + └── sync_soleprint.sh # Sync soleprint source code ``` ## Configuration @@ -27,15 +27,15 @@ Edit `.env.sync` to configure deployment: ```bash # Server DEPLOY_SERVER=mariano@mcrn.ar -DEPLOY_REMOTE_PATH=~/core_nest +DEPLOY_REMOTE_PATH=~/core_room # Local paths -LOCAL_PAWPRINT_PATH=/home/mariano/wdir/ama/pawprint +LOCAL_SOLEPRINT_PATH=/home/mariano/wdir/ama/soleprint LOCAL_AMAR_BASE=/home/mariano/wdir/ama # Remote paths -REMOTE_PAWPRINT_PATH=/home/mariano/pawprint -REMOTE_AMAR_PATH=/home/mariano/core_nest/amar/src +REMOTE_SOLEPRINT_PATH=/home/mariano/soleprint +REMOTE_AMAR_PATH=/home/mariano/core_room/amar/src ``` ## Usage @@ -47,7 +47,7 @@ cd ctrl ./deploy.sh --dry-run # Preview what would be synced # Then on server: -ssh server 'cd ~/core_nest/ctrl && ./build.sh && ./start.sh -d' +ssh server 'cd ~/core_room/ctrl && ./build.sh && ./start.sh -d' ``` ### Local Development @@ -83,10 +83,10 @@ ssh server 'cd ~/core_nest/ctrl && ./build.sh && ./start.sh -d' ./status.sh # Show container status ``` -## Nest vs Pawprint Control +## Room vs Soleprint Control -- **core_nest/ctrl/** - Manages the full nest (amar + pawprint) via Docker -- **pawprint/ctrl/** - Manages pawprint services via systemd (alternative deployment) +- **core_room/ctrl/** - Manages the full room (amar + soleprint) via Docker +- **soleprint/ctrl/** - Manages soleprint services via systemd (alternative deployment) -Use core_nest/ctrl for orchestrating the full nest with Docker Compose. -Use pawprint/ctrl for direct systemd deployment of pawprint services only. +Use core_room/ctrl for orchestrating the full room with Docker Compose. +Use soleprint/ctrl for direct systemd deployment of soleprint services only. diff --git a/mainroom/ctrl/build.sh b/mainroom/ctrl/build.sh index ff1f819..bdc074e 100755 --- a/mainroom/ctrl/build.sh +++ b/mainroom/ctrl/build.sh @@ -1,5 +1,5 @@ #!/bin/bash -# Build core_nest Docker images +# Build core_room Docker images # # Usage: # ./build.sh # Build all @@ -11,7 +11,7 @@ set -e # Change to parent directory (services are in ../service_name) cd "$(dirname "$0")/.." -# Export core_nest/.env vars so child docker-compose files can use them +# Export core_room/.env vars so child docker-compose files can use them if [ -f ".env" ]; then export $(grep -v '^#' .env | grep -v '^$' | xargs) fi diff --git a/mainroom/ctrl/deploy.sh b/mainroom/ctrl/deploy.sh index b79efb5..aa444ed 100755 --- a/mainroom/ctrl/deploy.sh +++ b/mainroom/ctrl/deploy.sh @@ -1,13 +1,13 @@ #!/bin/bash -# Deploy core_nest to server +# Deploy core_room to server # # Two deployment modes: -# 1. Docker (default): Full core_nest structure + source code -# 2. Bare metal (--bare-metal): Only pawprint source to systemd services +# 1. Docker (default): Full core_room structure + source code +# 2. Bare metal (--bare-metal): Only soleprint source to systemd services # # Usage: # ./deploy.sh # Deploy Docker setup (default) -# ./deploy.sh --bare-metal # Deploy bare metal pawprint only +# ./deploy.sh --bare-metal # Deploy bare metal soleprint only # ./deploy.sh --dry-run # Preview what would be synced # ./deploy.sh --bare-metal --dry-run # Preview bare metal sync @@ -18,13 +18,13 @@ SCRIPT_DIR="$(cd "$(dirname "$0")" && pwd)" source "$SCRIPT_DIR/.env.sync" 2>/dev/null || true SERVER="${DEPLOY_SERVER:-mariano@mcrn.ar}" -REMOTE_PATH="${DEPLOY_REMOTE_PATH:-~/core_nest}" -BARE_METAL_PATH="${DEPLOY_BARE_METAL_PATH:-~/pawprint}" +REMOTE_PATH="${DEPLOY_REMOTE_PATH:-~/core_room}" +BARE_METAL_PATH="${DEPLOY_BARE_METAL_PATH:-~/soleprint}" # Source code paths (defaults if not in .env.sync) LOCAL_AMAR_BACKEND="${LOCAL_AMAR_BACKEND:-$HOME/wdir/ama/amar_django_back}" LOCAL_AMAR_FRONTEND="${LOCAL_AMAR_FRONTEND:-$HOME/wdir/ama/amar_frontend}" -LOCAL_PAWPRINT="${LOCAL_PAWPRINT:-$HOME/wdir/ama/pawprint}" +LOCAL_SOLEPRINT="${LOCAL_SOLEPRINT:-$HOME/wdir/ama/soleprint}" DRY_RUN="" BARE_METAL="" @@ -48,15 +48,15 @@ if [ -n "$BARE_METAL" ]; then echo "=== Deploying to Bare Metal (Systemd Services) ===" echo "" - # Only sync pawprint source - if [ -d "$LOCAL_PAWPRINT" ] && [ -f "$LOCAL_PAWPRINT/main.py" ]; then - echo "Syncing pawprint source to bare metal..." + # Only sync soleprint source + if [ -d "$LOCAL_SOLEPRINT" ] && [ -f "$LOCAL_SOLEPRINT/main.py" ]; then + echo "Syncing soleprint source to bare metal..." $RSYNC_CMD $DRY_RUN \ - "$LOCAL_PAWPRINT/" \ + "$LOCAL_SOLEPRINT/" \ "$SERVER:$BARE_METAL_PATH/" - echo " ✓ Pawprint synced to $BARE_METAL_PATH" + echo " ✓ Soleprint synced to $BARE_METAL_PATH" else - echo "⚠ Pawprint not found at: $LOCAL_PAWPRINT" + echo "⚠ Soleprint not found at: $LOCAL_SOLEPRINT" exit 1 fi echo "" @@ -70,10 +70,10 @@ if [ -n "$BARE_METAL" ]; then echo "" echo "Next steps on server (as mariano user):" echo " Restart systemd services:" - echo " sudo systemctl restart pawprint artery album ward" + echo " sudo systemctl restart soleprint artery album ward" echo "" echo " Check status:" - echo " sudo systemctl status pawprint artery album ward" + echo " sudo systemctl status soleprint artery album ward" echo "" exit 0 fi @@ -84,13 +84,13 @@ fi echo "=== Deploying to Docker ===" echo "" -# 1. Sync core_nest structure (excluding src directories - they're synced separately) -echo "1. Syncing core_nest structure..." +# 1. Sync core_room structure (excluding src directories - they're synced separately) +echo "1. Syncing core_room structure..." $RSYNC_CMD $DRY_RUN \ --exclude='*/src/' \ ./ \ "$SERVER:$REMOTE_PATH/" -echo " [OK] Core nest structure synced" +echo " [OK] Core room structure synced" echo "" # 2. Sync amar backend source @@ -117,15 +117,15 @@ else fi echo "" -# 4. Sync pawprint source -if [ -d "$LOCAL_PAWPRINT" ] && [ -f "$LOCAL_PAWPRINT/main.py" ]; then - echo "4. Syncing pawprint source..." +# 4. Sync soleprint source +if [ -d "$LOCAL_SOLEPRINT" ] && [ -f "$LOCAL_SOLEPRINT/main.py" ]; then + echo "4. Syncing soleprint source..." $RSYNC_CMD $DRY_RUN \ - "$LOCAL_PAWPRINT/" \ - "$SERVER:$REMOTE_PATH/pawprint/src/" - echo " [OK] Pawprint synced" + "$LOCAL_SOLEPRINT/" \ + "$SERVER:$REMOTE_PATH/soleprint/src/" + echo " [OK] Soleprint synced" else - echo "4. [INFO] Pawprint not found at: $LOCAL_PAWPRINT" + echo "4. [INFO] Soleprint not found at: $LOCAL_SOLEPRINT" fi echo "" diff --git a/mainroom/ctrl/logs.sh b/mainroom/ctrl/logs.sh index f3bcc3e..00a193a 100755 --- a/mainroom/ctrl/logs.sh +++ b/mainroom/ctrl/logs.sh @@ -1,9 +1,9 @@ #!/bin/bash -# View core_nest logs +# View core_room logs # # Usage: # ./logs.sh # All logs -# ./logs.sh # Service compose logs (e.g., amar, pawprint) +# ./logs.sh # Service compose logs (e.g., amar, soleprint) # ./logs.sh # Specific container name (e.g., backend, db) set -e @@ -11,7 +11,7 @@ set -e # Change to parent directory (services are in ../service_name) cd "$(dirname "$0")/.." -# Export core_nest/.env vars +# Export core_room/.env vars if [ -f ".env" ]; then export $(grep -v '^#' .env | grep -v '^$' | xargs) fi @@ -27,19 +27,19 @@ for dir in */; do fi done -# NEST_NAME comes from core_nest/.env -NEST_NAME=${NEST_NAME:-core_nest} +# ROOM_NAME comes from core_room/.env +ROOM_NAME=${ROOM_NAME:-core_room} if [[ " ${SERVICE_DIRS[@]} " =~ " ${TARGET} " ]]; then # Service directory logs cd "$TARGET" && docker compose logs -f elif [ "$TARGET" = "all" ]; then - # All containers matching NEST_NAME - docker logs -f $(docker ps -q --filter "name=${NEST_NAME}") 2>/dev/null || \ - echo "No ${NEST_NAME} containers running" + # All containers matching ROOM_NAME + docker logs -f $(docker ps -q --filter "name=${ROOM_NAME}") 2>/dev/null || \ + echo "No ${ROOM_NAME} containers running" else # Specific container name - docker logs -f "${NEST_NAME}_$TARGET" 2>/dev/null || \ + docker logs -f "${ROOM_NAME}_$TARGET" 2>/dev/null || \ docker logs -f "$TARGET" 2>/dev/null || \ echo "Container not found: $TARGET" fi diff --git a/mainroom/ctrl/server/.env b/mainroom/ctrl/server/.env index 1cad382..152cef4 100644 --- a/mainroom/ctrl/server/.env +++ b/mainroom/ctrl/server/.env @@ -1,17 +1,17 @@ -# Core Nest - Environment Configuration -# This configuration is shared across all services in the nest +# Core Room - Environment Configuration +# This configuration is shared across all services in the room # ============================================================================= # DEPLOYMENT CONFIG # ============================================================================= # Unique identifier for this deployment (used for container/network names) -DEPLOYMENT_NAME=core_nest +DEPLOYMENT_NAME=core_room -# Nest identifier (logical grouping of services) -NEST_NAME=core_nest +# Room identifier (logical grouping of services) +ROOM_NAME=core_room # Network name for Docker services -NETWORK_NAME=core_nest_network +NETWORK_NAME=core_room_network # ============================================================================= # DOMAINS (Local Development) @@ -19,8 +19,8 @@ NETWORK_NAME=core_nest_network # Domain for the managed application (e.g., amar) MANAGED_DOMAIN=amar.local.com -# Domain for pawprint management interface -PAWPRINT_DOMAIN=pawprint.local.com +# Domain for soleprint management interface +SOLEPRINT_DOMAIN=soleprint.local.com # ============================================================================= # PORTS (Local Development) @@ -29,8 +29,8 @@ PAWPRINT_DOMAIN=pawprint.local.com BACKEND_PORT=8000 FRONTEND_PORT=3000 -# Pawprint ecosystem ports -PAWPRINT_PORT=13000 +# Soleprint ecosystem ports +SOLEPRINT_PORT=13000 ARTERY_PORT=13001 ALBUM_PORT=13002 WARD_PORT=13003 @@ -63,7 +63,7 @@ MANAGED_BACKEND_LOCATIONS=' ' # ============================================================================= -# MANAGED DOMAIN CONFIG (AMAR-specific - core_nest context) +# MANAGED DOMAIN CONFIG (AMAR-specific - core_room context) # ============================================================================= # Complete nginx location blocks for amar MANAGED_LOCATIONS=' @@ -99,12 +99,12 @@ MANAGED_LOCATIONS=' ' # ============================================================================= -# AMAR PATHS (core_nest specific - managed app) +# AMAR PATHS (core_room specific - managed app) # ============================================================================= BACKEND_PATH=../../amar_django_back FRONTEND_PATH=../../amar_frontend -DOCKERFILE_BACKEND=../def/core_nest/amar/Dockerfile.backend -DOCKERFILE_FRONTEND=../def/core_nest/amar/Dockerfile.frontend +DOCKERFILE_BACKEND=../def/core_room/amar/Dockerfile.backend +DOCKERFILE_FRONTEND=../def/core_room/amar/Dockerfile.frontend # Database seed data INIT_DB_SEED=test diff --git a/mainroom/ctrl/server/README.md b/mainroom/ctrl/server/README.md index aad8788..093c87a 100644 --- a/mainroom/ctrl/server/README.md +++ b/mainroom/ctrl/server/README.md @@ -13,7 +13,7 @@ Separate from `ctrl/` which contains **local** orchestration scripts. server/ ├── setup.sh # Idempotent server setup (run on AWS) ├── nginx/ -│ └── core_nest.conf # Single nginx config for all services +│ └── core_room.conf # Single nginx config for all services └── scripts/ # Any other server-side scripts ``` @@ -22,7 +22,7 @@ server/ When deployed, the AWS instance should look like: ``` -~/core_nest/ # This repo (deployed via deploy.sh) +~/core_room/ # This repo (deployed via deploy.sh) ├── server/ # Server-side scripts │ ├── setup.sh # Run this first │ └── nginx/ @@ -37,7 +37,7 @@ When deployed, the AWS instance should look like: │ └── src/ # Synced from local via manual_sync/ │ ├── back/ # Django source │ └── front/ # Next.js source -└── pawprint/ +└── soleprint/ ├── docker-compose.yml ├── .env # Production values └── (bare metal or src/ depending on deployment) @@ -49,14 +49,14 @@ When deployed, the AWS instance should look like: ```bash # 1. From local machine: Deploy files -cd ~/wdir/ama/core_nest/ctrl +cd ~/wdir/ama/core_room/ctrl ./deploy.sh # 2. SSH to server ssh mariano@mcrn.ar # 3. Run server setup (idempotent - safe to re-run) -cd ~/core_nest/server +cd ~/core_room/server ./setup.sh ``` @@ -70,19 +70,19 @@ This will: ### Updates/Changes ```bash -# From local: edit server/nginx/core_nest.conf or server/setup.sh +# From local: edit server/nginx/core_room.conf or server/setup.sh # Then deploy: ./deploy.sh # On server: re-run setup to apply changes -ssh mariano@mcrn.ar 'cd ~/core_nest/server && ./setup.sh' +ssh mariano@mcrn.ar 'cd ~/core_room/server && ./setup.sh' ``` ### Build and Start Services ```bash # On server (or via SSH): -cd ~/core_nest/ctrl +cd ~/core_room/ctrl ./build.sh # Build all images ./start.sh -d # Start detached ./status.sh # Check status @@ -100,11 +100,11 @@ Idempotent setup script that runs on AWS: **Safe to run multiple times** - won't break existing setup. -### server/nginx/core_nest.conf +### server/nginx/core_room.conf Single nginx config file for all services: -- amar.nest.mcrn.ar (frontend + backend) -- pawprint.mcrn.ar +- amar.room.mcrn.ar (frontend + backend) +- soleprint.mcrn.ar - artery.mcrn.ar - album.mcrn.ar - ward.mcrn.ar @@ -117,8 +117,8 @@ Create production `.env` files: ```bash # On server: -nano ~/core_nest/amar/.env # Set INIT_DB_SEED=test or prod -nano ~/core_nest/pawprint/.env # Set NEST_NAME, ports, etc. +nano ~/core_room/amar/.env # Set INIT_DB_SEED=test or prod +nano ~/core_room/soleprint/.env # Set ROOM_NAME, ports, etc. ``` ## SSL Certificates @@ -126,10 +126,10 @@ nano ~/core_nest/pawprint/.env # Set NEST_NAME, ports, etc. Certificates are managed via Let's Encrypt: ```bash -# Wildcard for *.nest.mcrn.ar (for amar) -sudo certbot certonly --manual --preferred-challenges dns -d '*.nest.mcrn.ar' +# Wildcard for *.room.mcrn.ar (for amar) +sudo certbot certonly --manual --preferred-challenges dns -d '*.room.mcrn.ar' -# Wildcard for *.mcrn.ar (for pawprint services) +# Wildcard for *.mcrn.ar (for soleprint services) sudo certbot certonly --manual --preferred-challenges dns -d '*.mcrn.ar' ``` @@ -140,12 +140,12 @@ Auto-renewal is handled by certbot systemd timer. ### Nginx config test fails ```bash sudo nginx -t -# Fix errors in server/nginx/core_nest.conf +# Fix errors in server/nginx/core_room.conf ``` ### Services won't start ```bash -cd ~/core_nest/ctrl +cd ~/core_room/ctrl ./logs.sh # Check all logs ./logs.sh amar # Check specific service docker ps -a # See all containers @@ -154,10 +154,10 @@ docker ps -a # See all containers ### Database issues ```bash # Check which seed data is configured -grep INIT_DB_SEED ~/core_nest/amar/.env +grep INIT_DB_SEED ~/core_room/amar/.env # Rebuild database (WARNING: deletes data) -cd ~/core_nest +cd ~/core_room docker compose -f amar/docker-compose.yml down -v ./ctrl/start.sh amar -d ``` @@ -172,14 +172,14 @@ This allows ward/tester to access tests from amar_django_back_contracts without ```bash # Preview changes -ssh mariano@mcrn.ar 'cd ~/core_nest/ctrl/server && ./setup-symlinks.sh --dry-run' +ssh mariano@mcrn.ar 'cd ~/core_room/ctrl/server && ./setup-symlinks.sh --dry-run' # Apply changes -ssh mariano@mcrn.ar 'cd ~/core_nest/ctrl/server && ./setup-symlinks.sh' +ssh mariano@mcrn.ar 'cd ~/core_room/ctrl/server && ./setup-symlinks.sh' ``` **What it does:** -- Creates symlinks from `pawprint/src/ward/tools/tester/tests/` to `amar/src/back/tests/contracts/` +- Creates symlinks from `soleprint/src/ward/tools/tester/tests/` to `amar/src/back/tests/contracts/` - Symlinks each domain directory (mascotas, productos, solicitudes, workflows) - Symlinks shared utilities (endpoints.py, helpers.py, base.py, conftest.py) @@ -214,10 +214,10 @@ After setup, verify symlinks are working: ```bash # Check symlinks exist -ssh mariano@mcrn.ar 'ls -lah ~/core_nest/pawprint/src/ward/tools/tester/tests' +ssh mariano@mcrn.ar 'ls -lah ~/core_room/soleprint/src/ward/tools/tester/tests' # Verify they point to correct location -ssh mariano@mcrn.ar 'readlink ~/core_nest/pawprint/src/ward/tools/tester/tests/mascotas' +ssh mariano@mcrn.ar 'readlink ~/core_room/soleprint/src/ward/tools/tester/tests/mascotas' # Test in browser open https://ward.mcrn.ar/tools/tester/ @@ -230,5 +230,5 @@ open https://ward.mcrn.ar/tools/tester/ - Database volumes persist in Docker volumes - Backup database regularly: ```bash - docker exec core_nest_db pg_dump -U postgres amarback > backup.sql + docker exec core_room_db pg_dump -U postgres amarback > backup.sql ``` diff --git a/mainroom/ctrl/server/audit.sh b/mainroom/ctrl/server/audit.sh index 00c314a..f3660f1 100755 --- a/mainroom/ctrl/server/audit.sh +++ b/mainroom/ctrl/server/audit.sh @@ -17,20 +17,20 @@ echo "Home directory contents:" ls -lah ~/ echo "" -echo "core_nest structure (if exists):" -if [ -d ~/core_nest ]; then - tree ~/core_nest -L 2 -I ".git" 2>/dev/null || find ~/core_nest -maxdepth 2 -type d | sort +echo "core_room structure (if exists):" +if [ -d ~/core_room ]; then + tree ~/core_room -L 2 -I ".git" 2>/dev/null || find ~/core_room -maxdepth 2 -type d | sort else - echo " ~/core_nest does NOT exist" + echo " ~/core_room does NOT exist" fi echo "" -echo "pawprint location:" -if [ -d ~/pawprint ]; then - ls -lah ~/pawprint/ | head -10 +echo "soleprint location:" +if [ -d ~/soleprint ]; then + ls -lah ~/soleprint/ | head -10 echo " ..." else - echo " ~/pawprint does NOT exist" + echo " ~/soleprint does NOT exist" fi echo "" @@ -60,7 +60,7 @@ docker network ls 2>/dev/null || echo " None" echo "" echo "Docker volumes:" -docker volume ls 2>/dev/null | grep -E "core_nest|amar|pawprint|DRIVER" || echo " No core_nest/amar/pawprint volumes" +docker volume ls 2>/dev/null | grep -E "core_room|amar|soleprint|DRIVER" || echo " No core_room/amar/soleprint volumes" echo "" # ============================================================================= @@ -80,8 +80,8 @@ echo "Sites enabled:" ls -lah /etc/nginx/sites-enabled/ 2>/dev/null || echo " Directory does not exist" echo "" -echo "Sites available (core_nest related):" -ls -lah /etc/nginx/sites-available/ 2>/dev/null | grep -E "nest|amar|pawprint|artery|album|ward" || echo " None found" +echo "Sites available (core_room related):" +ls -lah /etc/nginx/sites-available/ 2>/dev/null | grep -E "room|amar|soleprint|artery|album|ward" || echo " None found" echo "" # ============================================================================= @@ -106,13 +106,13 @@ echo "" # ============================================================================= echo "=== ENVIRONMENT FILES ===" echo "" -for location in ~/core_nest/amar ~/core_nest/pawprint ~/pawprint; do +for location in ~/core_room/amar ~/core_room/soleprint ~/soleprint; do if [ -d "$location" ]; then echo "$location/.env:" if [ -f "$location/.env" ]; then echo " EXISTS" echo " Size: $(stat -c%s "$location/.env" 2>/dev/null || stat -f%z "$location/.env" 2>/dev/null) bytes" - echo " NEST_NAME: $(grep "^NEST_NAME=" "$location/.env" 2>/dev/null || echo "not set")" + echo " ROOM_NAME: $(grep "^ROOM_NAME=" "$location/.env" 2>/dev/null || echo "not set")" echo " NETWORK_NAME: $(grep "^NETWORK_NAME=" "$location/.env" 2>/dev/null || echo "not set")" else echo " does NOT exist" @@ -138,8 +138,8 @@ echo "" # ============================================================================= echo "=== SYSTEMD SERVICES ===" echo "" -echo "Pawprint-related services:" -systemctl list-units --type=service --all 2>/dev/null | grep -E "pawprint|artery|album|ward" || echo " None found" +echo "Soleprint-related services:" +systemctl list-units --type=service --all 2>/dev/null | grep -E "soleprint|artery|album|ward" || echo " None found" echo "" # ============================================================================= @@ -162,24 +162,24 @@ echo "=== SUMMARY ===" echo "" echo "Key Questions:" echo "" -echo "1. Is there an existing core_nest deployment?" -[ -d ~/core_nest ] && echo " YES - ~/core_nest exists" || echo " NO" +echo "1. Is there an existing core_room deployment?" +[ -d ~/core_room ] && echo " YES - ~/core_room exists" || echo " NO" echo "" echo "2. Are Docker containers running?" docker ps -q 2>/dev/null | wc -l | xargs -I {} echo " {} containers running" echo "" -echo "3. Is nginx configured for core_nest?" -[ -f /etc/nginx/sites-enabled/core_nest.conf ] && echo " YES - core_nest.conf installed" || echo " NO" +echo "3. Is nginx configured for core_room?" +[ -f /etc/nginx/sites-enabled/core_room.conf ] && echo " YES - core_room.conf installed" || echo " NO" echo "" echo "4. Are there old individual nginx configs?" -ls /etc/nginx/sites-enabled/ 2>/dev/null | grep -E "amar|pawprint|artery|album|ward" | wc -l | xargs -I {} echo " {} old configs found" +ls /etc/nginx/sites-enabled/ 2>/dev/null | grep -E "amar|soleprint|artery|album|ward" | wc -l | xargs -I {} echo " {} old configs found" echo "" echo "5. SSL certificates present?" -[ -d /etc/letsencrypt/live/nest.mcrn.ar ] && echo " *.nest.mcrn.ar: YES" || echo " *.nest.mcrn.ar: NO" +[ -d /etc/letsencrypt/live/room.mcrn.ar ] && echo " *.room.mcrn.ar: YES" || echo " *.room.mcrn.ar: NO" [ -d /etc/letsencrypt/live/mcrn.ar ] && echo " *.mcrn.ar: YES" || echo " *.mcrn.ar: NO" echo "" diff --git a/mainroom/ctrl/server/cleanup.sh b/mainroom/ctrl/server/cleanup.sh index f3fd748..4df5c6b 100755 --- a/mainroom/ctrl/server/cleanup.sh +++ b/mainroom/ctrl/server/cleanup.sh @@ -2,7 +2,7 @@ # Server Cleanup - Run on AWS to prepare for fresh deployment # This script safely cleans up old deployments # -# Usage: ssh server 'cd ~/core_nest/ctrl/server && ./cleanup.sh' +# Usage: ssh server 'cd ~/core_room/ctrl/server && ./cleanup.sh' set -e @@ -29,8 +29,8 @@ echo "Step 1: Stopping Docker containers..." # Stop containers if Docker is available if command -v docker &> /dev/null; then - # Stop all core_nest/amar/pawprint containers - CONTAINERS=$(docker ps -q --filter "name=core_nest" --filter "name=amar" --filter "name=pawprint" 2>/dev/null || true) + # Stop all core_room/amar/soleprint containers + CONTAINERS=$(docker ps -q --filter "name=core_room" --filter "name=amar" --filter "name=soleprint" 2>/dev/null || true) if [ -n "$CONTAINERS" ]; then echo " Stopping containers..." @@ -49,7 +49,7 @@ fi echo "" echo "Step 2: Stopping systemd services..." -SERVICES=$(systemctl list-units --type=service --all --no-pager 2>/dev/null | grep -E "pawprint|artery|album|ward" | awk '{print $1}' || true) +SERVICES=$(systemctl list-units --type=service --all --no-pager 2>/dev/null | grep -E "soleprint|artery|album|ward" | awk '{print $1}' || true) if [ -n "$SERVICES" ]; then echo " Found services: $SERVICES" @@ -72,12 +72,12 @@ echo "Step 3: Cleaning up old nginx configs..." if [ -d /etc/nginx/sites-enabled ]; then # Remove old individual configs OLD_CONFIGS=( - "amar.nest.mcrn.ar" - "amar.nest.mcrn.ar.conf" - "api.amar.nest.mcrn.ar" - "api.amar.nest.mcrn.ar.conf" - "pawprint.mcrn.ar" - "pawprint.mcrn.ar.conf" + "amar.room.mcrn.ar" + "amar.room.mcrn.ar.conf" + "api.amar.room.mcrn.ar" + "api.amar.room.mcrn.ar.conf" + "soleprint.mcrn.ar" + "soleprint.mcrn.ar.conf" "artery.mcrn.ar" "artery.mcrn.ar.conf" "album.mcrn.ar" @@ -118,24 +118,24 @@ echo "Step 4: Verifying preserved data..." # Check Docker volumes if command -v docker &> /dev/null; then - VOLUMES=$(docker volume ls -q | grep -E "core_nest|amar|pawprint" 2>/dev/null || true) + VOLUMES=$(docker volume ls -q | grep -E "core_room|amar|soleprint" 2>/dev/null || true) if [ -n "$VOLUMES" ]; then echo " ✓ Docker volumes preserved:" - docker volume ls | grep -E "core_nest|amar|pawprint|DRIVER" || true + docker volume ls | grep -E "core_room|amar|soleprint|DRIVER" || true fi fi # Check .env files echo "" echo " .env files preserved:" -for envfile in ~/core_nest/amar/.env ~/core_nest/pawprint/.env ~/pawprint/.env; do +for envfile in ~/core_room/amar/.env ~/core_room/soleprint/.env ~/soleprint/.env; do [ -f "$envfile" ] && echo " ✓ $envfile" || true done # Check SSL certs echo "" echo " SSL certificates preserved:" -[ -d /etc/letsencrypt/live/nest.mcrn.ar ] && echo " ✓ *.nest.mcrn.ar" || echo " ✗ *.nest.mcrn.ar (missing)" +[ -d /etc/letsencrypt/live/room.mcrn.ar ] && echo " ✓ *.room.mcrn.ar" || echo " ✗ *.room.mcrn.ar (missing)" [ -d /etc/letsencrypt/live/mcrn.ar ] && echo " ✓ *.mcrn.ar" || echo " ✗ *.mcrn.ar (missing)" # ============================================================================= @@ -149,8 +149,8 @@ echo " 1. Deploy from local:" echo " ./ctrl/deploy.sh" echo "" echo " 2. Run server setup:" -echo " cd ~/core_nest/ctrl/server && ./setup.sh" +echo " cd ~/core_room/ctrl/server && ./setup.sh" echo "" echo " 3. Build and start:" -echo " cd ~/core_nest/ctrl && ./build.sh && ./start.sh -d" +echo " cd ~/core_room/ctrl && ./build.sh && ./start.sh -d" echo "" diff --git a/mainroom/ctrl/server/configure.sh b/mainroom/ctrl/server/configure.sh index 18a52bf..544605f 100755 --- a/mainroom/ctrl/server/configure.sh +++ b/mainroom/ctrl/server/configure.sh @@ -6,7 +6,7 @@ # ./configure.sh # # Generates: -# - Nginx configs for core_nest +# - Nginx configs for core_room # - Validates .env files # - Outputs to .generated/ directory # @@ -16,9 +16,9 @@ set -e SCRIPT_DIR="$(cd "$(dirname "$0")" && pwd)" GEN_DIR="$SCRIPT_DIR/.generated" -CORE_NEST_ROOT="$(cd "$SCRIPT_DIR/../.." && pwd)" +CORE_ROOM_ROOT="$(cd "$SCRIPT_DIR/../.." && pwd)" -echo "=== Core Nest Configure ===" +echo "=== Core Room Configure ===" echo "" echo "This script generates configuration files for deployment." echo "Run as appuser (no sudo required)." @@ -44,19 +44,19 @@ echo " Output directory: $GEN_DIR" echo "" echo "Step 2: Loading environment..." -# Load core_nest/.env -if [ -f "$CORE_NEST_ROOT/.env" ]; then +# Load core_room/.env +if [ -f "$CORE_ROOM_ROOT/.env" ]; then set -a - source "$CORE_NEST_ROOT/.env" + source "$CORE_ROOM_ROOT/.env" set +a - echo " Loaded: core_nest/.env" + echo " Loaded: core_room/.env" else - echo " ERROR: core_nest/.env not found" + echo " ERROR: core_room/.env not found" exit 1 fi # Validate required vars -REQUIRED_VARS="NEST_NAME DEPLOYMENT_NAME NETWORK_NAME MANAGED_DOMAIN PAWPRINT_DOMAIN" +REQUIRED_VARS="ROOM_NAME DEPLOYMENT_NAME NETWORK_NAME MANAGED_DOMAIN SOLEPRINT_DOMAIN" MISSING="" for var in $REQUIRED_VARS; do if [ -z "${!var}" ]; then @@ -65,14 +65,14 @@ for var in $REQUIRED_VARS; do done if [ -n "$MISSING" ]; then - echo " ERROR: Missing required vars in core_nest/.env:$MISSING" + echo " ERROR: Missing required vars in core_room/.env:$MISSING" exit 1 fi -echo " NEST_NAME: $NEST_NAME" +echo " ROOM_NAME: $ROOM_NAME" echo " DEPLOYMENT_NAME: $DEPLOYMENT_NAME" echo " MANAGED_DOMAIN: $MANAGED_DOMAIN" -echo " PAWPRINT_DOMAIN: $PAWPRINT_DOMAIN" +echo " SOLEPRINT_DOMAIN: $SOLEPRINT_DOMAIN" # ============================================================================= # 3. Check .env files for services @@ -80,8 +80,8 @@ echo " PAWPRINT_DOMAIN: $PAWPRINT_DOMAIN" echo "" echo "Step 3: Checking service .env files..." -for service in amar pawprint; do - SERVICE_DIR="$CORE_NEST_ROOT/$service" +for service in amar soleprint; do + SERVICE_DIR="$CORE_ROOM_ROOT/$service" if [ ! -f "$SERVICE_DIR/.env" ]; then if [ -f "$SERVICE_DIR/.env.example" ]; then echo " Creating $service/.env from example..." @@ -102,8 +102,8 @@ done echo "" echo "Step 4: Generating nginx configuration..." -TEMPLATE="$SCRIPT_DIR/nginx/core_nest.conf.template" -OUTPUT="$GEN_DIR/core_nest.nginx.conf" +TEMPLATE="$SCRIPT_DIR/nginx/core_room.conf.template" +OUTPUT="$GEN_DIR/core_room.nginx.conf" if [ ! -f "$TEMPLATE" ]; then echo " ERROR: Template not found: $TEMPLATE" @@ -111,13 +111,13 @@ if [ ! -f "$TEMPLATE" ]; then fi # Check for SSL certificates (just warn, don't fail) -SSL_CERT_AMAR="/etc/letsencrypt/live/nest.mcrn.ar/fullchain.pem" -SSL_KEY_AMAR="/etc/letsencrypt/live/nest.mcrn.ar/privkey.pem" -SSL_CERT_PAWPRINT="/etc/letsencrypt/live/mcrn.ar/fullchain.pem" -SSL_KEY_PAWPRINT="/etc/letsencrypt/live/mcrn.ar/privkey.pem" +SSL_CERT_AMAR="/etc/letsencrypt/live/room.mcrn.ar/fullchain.pem" +SSL_KEY_AMAR="/etc/letsencrypt/live/room.mcrn.ar/privkey.pem" +SSL_CERT_SOLEPRINT="/etc/letsencrypt/live/mcrn.ar/fullchain.pem" +SSL_KEY_SOLEPRINT="/etc/letsencrypt/live/mcrn.ar/privkey.pem" echo " Checking SSL certificates..." -for cert in "$SSL_CERT_AMAR" "$SSL_KEY_AMAR" "$SSL_CERT_PAWPRINT" "$SSL_KEY_PAWPRINT"; do +for cert in "$SSL_CERT_AMAR" "$SSL_KEY_AMAR" "$SSL_CERT_SOLEPRINT" "$SSL_KEY_SOLEPRINT"; do if [ -f "$cert" ]; then echo " ✓ $(basename $cert)" else @@ -127,8 +127,8 @@ for cert in "$SSL_CERT_AMAR" "$SSL_KEY_AMAR" "$SSL_CERT_PAWPRINT" "$SSL_KEY_PAWP done # Generate nginx config from template -export NEST_NAME DEPLOYMENT_NAME MANAGED_DOMAIN PAWPRINT_DOMAIN -export SSL_CERT_AMAR SSL_KEY_AMAR SSL_CERT_PAWPRINT SSL_KEY_PAWPRINT +export ROOM_NAME DEPLOYMENT_NAME MANAGED_DOMAIN SOLEPRINT_DOMAIN +export SSL_CERT_AMAR SSL_KEY_AMAR SSL_CERT_SOLEPRINT SSL_KEY_SOLEPRINT envsubst < "$TEMPLATE" > "$OUTPUT" @@ -143,20 +143,20 @@ echo "Step 5: Generating deployment summary..." SUMMARY="$GEN_DIR/DEPLOYMENT.txt" cat > "$SUMMARY" < /tmp/nginx.conf +envsubst '${DEPLOYMENT_NAME} ${ROOM_NAME} ${MANAGED_DOMAIN} ${SOLEPRINT_DOMAIN}' < "$OUTPUT" > /tmp/nginx.conf mv /tmp/nginx.conf "$OUTPUT" echo "Nginx config generated (ENABLE_WRAPPER=$ENABLE_WRAPPER)" diff --git a/mainroom/ctrl/server/setup-symlinks.sh b/mainroom/ctrl/server/setup-symlinks.sh index 06b5f4a..aa100de 100755 --- a/mainroom/ctrl/server/setup-symlinks.sh +++ b/mainroom/ctrl/server/setup-symlinks.sh @@ -19,13 +19,13 @@ echo "=== Setting up Test Directory Symlinks ===" echo "" # Check if we're on the server -if [ ! -d "$HOME/core_nest" ]; then - echo "Error: ~/core_nest directory not found" +if [ ! -d "$HOME/core_room" ]; then + echo "Error: ~/core_room directory not found" echo "This script should run on the AWS server after deployment" exit 1 fi -cd "$HOME/core_nest" +cd "$HOME/core_room" # ============================================================================= # Test Directory Symlinks @@ -34,7 +34,7 @@ echo "Step 1: Creating symlinks for test directories..." echo "" # Ward tester tests directory -WARD_TESTS_DIR="pawprint/src/ward/tools/tester/tests" +WARD_TESTS_DIR="soleprint/src/ward/tools/tester/tests" CONTRACTS_SOURCE="amar/src/back/tests/contracts" # Create ward tests directory if it doesn't exist @@ -71,7 +71,7 @@ else fi # Create relative symlink - # From: pawprint/src/ward/tools/tester/tests/ + # From: soleprint/src/ward/tools/tester/tests/ # To: amar/src/back/tests/contracts/ # Relative path: ../../../../../amar/src/back/tests/contracts/ $DRY_RUN ln -s "../../../../../$CONTRACTS_SOURCE/$domain_name" "$target_link" @@ -102,11 +102,11 @@ echo "" # ============================================================================= # Bare Metal Symlinks (if bare metal path exists) # ============================================================================= -if [ -d "$HOME/pawprint" ]; then +if [ -d "$HOME/soleprint" ]; then echo "Step 2: Creating bare metal symlinks..." echo "" - BARE_WARD_TESTS="$HOME/pawprint/ward/tools/tester/tests" + BARE_WARD_TESTS="$HOME/soleprint/ward/tools/tester/tests" if [ ! -d "$BARE_WARD_TESTS" ]; then $DRY_RUN mkdir -p "$BARE_WARD_TESTS" @@ -116,7 +116,7 @@ if [ -d "$HOME/pawprint" ]; then # For bare metal, we can symlink to the docker contract source if it's synced # Or we can sync tests separately (handled by sync-tests.sh) echo " ℹ Bare metal tests managed by sync-tests.sh" - echo " Run: $HOME/core_nest/ctrl/sync-tests.sh" + echo " Run: $HOME/core_room/ctrl/sync-tests.sh" else echo "Step 2: Bare metal path not found, skipping" fi @@ -153,7 +153,7 @@ echo " 1. Verify symlinks are working:" echo " ls -lah $WARD_TESTS_DIR" echo "" echo " 2. Restart ward container to pick up changes:" -echo " cd ~/core_nest/ctrl && docker compose restart ward" +echo " cd ~/core_room/ctrl && docker compose restart ward" echo "" echo " 3. Test in browser:" echo " https://ward.mcrn.ar/tools/tester/" diff --git a/mainroom/ctrl/server/setup.sh b/mainroom/ctrl/server/setup.sh index d25a8b5..bba4f56 100755 --- a/mainroom/ctrl/server/setup.sh +++ b/mainroom/ctrl/server/setup.sh @@ -18,7 +18,7 @@ set -e SCRIPT_DIR="$(cd "$(dirname "$0")" && pwd)" GEN_DIR="$SCRIPT_DIR/.generated" -echo "=== Core Nest Setup (System Configuration) ===" +echo "=== Core Room Setup (System Configuration) ===" echo "" # Must run as root @@ -44,7 +44,7 @@ echo "User home: $ACTUAL_HOME" echo "" # Check that configure was run first -if [ ! -d "$GEN_DIR" ] || [ ! -f "$GEN_DIR/core_nest.nginx.conf" ]; then +if [ ! -d "$GEN_DIR" ] || [ ! -f "$GEN_DIR/core_room.nginx.conf" ]; then echo "ERROR: Configuration files not found" echo "" echo "Run ./configure.sh first (as $ACTUAL_USER):" @@ -120,9 +120,9 @@ fi echo "" echo "Step 2: Installing nginx configuration..." -NGINX_AVAILABLE="/etc/nginx/sites-available/core_nest.conf" -NGINX_ENABLED="/etc/nginx/sites-enabled/core_nest.conf" -SOURCE_CONFIG="$GEN_DIR/core_nest.nginx.conf" +NGINX_AVAILABLE="/etc/nginx/sites-available/core_room.conf" +NGINX_ENABLED="/etc/nginx/sites-enabled/core_room.conf" +SOURCE_CONFIG="$GEN_DIR/core_room.nginx.conf" # Copy generated config cp "$SOURCE_CONFIG" "$NGINX_AVAILABLE" @@ -171,7 +171,7 @@ echo "" echo "Step 4: SSL certificates..." SSL_CERTS=( - "/etc/letsencrypt/live/nest.mcrn.ar" + "/etc/letsencrypt/live/room.mcrn.ar" "/etc/letsencrypt/live/mcrn.ar" ) @@ -188,7 +188,7 @@ done if [ "$ALL_EXIST" = false ]; then echo "" echo " To generate missing certificates:" - echo " certbot certonly --manual --preferred-challenges dns -d '*.nest.mcrn.ar'" + echo " certbot certonly --manual --preferred-challenges dns -d '*.room.mcrn.ar'" echo " certbot certonly --manual --preferred-challenges dns -d '*.mcrn.ar'" echo "" echo " After generating, reload nginx:" @@ -212,6 +212,6 @@ echo " 2. Generate SSL certificates if missing (see above)" echo "" echo " 3. Deploy application:" echo " su - $ACTUAL_USER" -echo " cd $ACTUAL_HOME/core_nest/ctrl" +echo " cd $ACTUAL_HOME/core_room/ctrl" echo " ./deploy.sh" echo "" diff --git a/mainroom/ctrl/setup.sh b/mainroom/ctrl/setup.sh index 6af4916..c382b21 100755 --- a/mainroom/ctrl/setup.sh +++ b/mainroom/ctrl/setup.sh @@ -2,7 +2,7 @@ # Local setup - prepare .env files # # This script runs LOCALLY to create .env files from examples. -# For server setup, use: ssh server 'cd ~/core_nest/server && ./setup.sh' +# For server setup, use: ssh server 'cd ~/core_room/server && ./setup.sh' # # Usage: # ./setup.sh @@ -45,4 +45,4 @@ echo " - Run: ./start.sh" echo "" echo "Server deployment:" echo " 1. Deploy: ./deploy.sh" -echo " 2. On server: ssh server 'cd ~/core_nest/server && ./setup.sh'" +echo " 2. On server: ssh server 'cd ~/core_room/server && ./setup.sh'" diff --git a/mainroom/ctrl/start.sh b/mainroom/ctrl/start.sh index 30c29da..ed4583b 100755 --- a/mainroom/ctrl/start.sh +++ b/mainroom/ctrl/start.sh @@ -1,9 +1,9 @@ #!/bin/bash -# Start core_nest services +# Start core_room services # # Usage: # ./start.sh # Start all (foreground, see logs) -# ./start.sh # Start specific service (e.g., amar, pawprint) +# ./start.sh # Start specific service (e.g., amar, soleprint) # ./start.sh -d # Start all (detached) # ./start.sh --build # Start with rebuild # ./start.sh -d --build # Start detached with rebuild @@ -14,7 +14,7 @@ set -e # Change to parent directory (services are in ../service_name) cd "$(dirname "$0")/.." -# Export core_nest/.env vars so child docker-compose files can use them +# Export core_room/.env vars so child docker-compose files can use them if [ -f ".env" ]; then set -a source .env @@ -55,8 +55,8 @@ start_service() { echo "Starting $service..." cd "$service" - # If --with-nginx and service is pawprint, include nginx compose - if [ "$WITH_NGINX" = "true" ] && [ "$service" = "pawprint" ]; then + # If --with-nginx and service is soleprint, include nginx compose + if [ "$WITH_NGINX" = "true" ] && [ "$service" = "soleprint" ]; then echo " Including nginx container..." DOCKER_BUILDKIT=0 COMPOSE_DOCKER_CLI_BUILD=0 docker compose -f docker-compose.yml -f docker-compose.nginx.yml up $DETACH $BUILD else @@ -98,5 +98,5 @@ if [ -n "$DETACH" ]; then echo "" echo "=== Services Started ===" echo "" - docker ps --format "table {{.Names}}\t{{.Status}}\t{{.Ports}}" | grep -E "(core_nest|NAMES)" + docker ps --format "table {{.Names}}\t{{.Status}}\t{{.Ports}}" | grep -E "(core_room|NAMES)" fi diff --git a/mainroom/ctrl/status.sh b/mainroom/ctrl/status.sh index 306b135..4ad90cb 100755 --- a/mainroom/ctrl/status.sh +++ b/mainroom/ctrl/status.sh @@ -1,5 +1,5 @@ #!/bin/bash -# Show core_nest status +# Show core_room status # # Usage: # ./status.sh @@ -7,7 +7,7 @@ # Change to parent directory (services are in ../service_name) cd "$(dirname "$0")/.." -# Export core_nest/.env vars +# Export core_room/.env vars if [ -f ".env" ]; then export $(grep -v '^#' .env | grep -v '^$' | xargs) fi @@ -22,21 +22,21 @@ for dir in */; do fi done -# NEST_NAME comes from core_nest/.env -NEST_NAME=${NEST_NAME:-core_nest} +# ROOM_NAME comes from core_room/.env +ROOM_NAME=${ROOM_NAME:-core_room} -echo "=== Nest Status: $NEST_NAME ===" +echo "=== Room Status: $ROOM_NAME ===" echo "" echo "Containers:" -docker ps --format "table {{.Names}}\t{{.Status}}\t{{.Ports}}" | grep -E "(${NEST_NAME}|NAMES)" || echo " No containers running" +docker ps --format "table {{.Names}}\t{{.Status}}\t{{.Ports}}" | grep -E "(${ROOM_NAME}|NAMES)" || echo " No containers running" echo "" echo "Networks:" -docker network ls | grep -E "(${NEST_NAME}|NETWORK)" || echo " No networks" +docker network ls | grep -E "(${ROOM_NAME}|NETWORK)" || echo " No networks" echo "" echo "Volumes:" -docker volume ls | grep -E "(${NEST_NAME}|VOLUME)" || echo " No volumes" +docker volume ls | grep -E "(${ROOM_NAME}|VOLUME)" || echo " No volumes" echo "" diff --git a/mainroom/ctrl/stop.sh b/mainroom/ctrl/stop.sh index c07399e..b3f426a 100755 --- a/mainroom/ctrl/stop.sh +++ b/mainroom/ctrl/stop.sh @@ -1,5 +1,5 @@ #!/bin/bash -# Stop core_nest services +# Stop core_room services # # Usage: # ./stop.sh # Stop all @@ -10,7 +10,7 @@ set -e # Change to parent directory (services are in ../service_name) cd "$(dirname "$0")/.." -# Export core_nest/.env vars so child docker-compose files can use them +# Export core_room/.env vars so child docker-compose files can use them if [ -f ".env" ]; then export $(grep -v '^#' .env | grep -v '^$' | xargs) fi diff --git a/mainroom/ctrl/sync-tests.sh b/mainroom/ctrl/sync-tests.sh index 7ecff84..d2883aa 100755 --- a/mainroom/ctrl/sync-tests.sh +++ b/mainroom/ctrl/sync-tests.sh @@ -5,7 +5,7 @@ # Usage: # # Set env vars # export TEST_SOURCE_PATH=~/wdir/ama/amar_django_back/tests/contracts -# export WARD_TESTS_PATH=~/wdir/ama/pawprint/ward/tools/tester/tests +# export WARD_TESTS_PATH=~/wdir/ama/soleprint/ward/tools/tester/tests # # # Run sync # ./sync-tests-local.sh @@ -29,7 +29,7 @@ if [ -z "$TEST_SOURCE_PATH" ]; then echo "" echo "Set environment variables:" echo " export TEST_SOURCE_PATH=~/wdir/ama/amar_django_back/tests/contracts" - echo " export WARD_TESTS_PATH=~/wdir/ama/pawprint/ward/tools/tester/tests" + echo " export WARD_TESTS_PATH=~/wdir/ama/soleprint/ward/tools/tester/tests" echo "" echo "Or create ctrl/.env.sync with these variables" exit 1 diff --git a/mainroom/sbwrapper/README.md b/mainroom/sbwrapper/README.md index ac9cd59..3634854 100755 --- a/mainroom/sbwrapper/README.md +++ b/mainroom/sbwrapper/README.md @@ -1,6 +1,6 @@ -# Pawprint Wrapper - Development Tools Sidebar +# Soleprint Wrapper - Development Tools Sidebar -A collapsible sidebar that provides development and testing tools for any pawprint-managed nest (like amar) without interfering with the managed application. +A collapsible sidebar that provides development and testing tools for any soleprint-managed room (like amar) without interfering with the managed application. ## Features @@ -12,7 +12,7 @@ A collapsible sidebar that provides development and testing tools for any pawpri ### 🌍 Environment Info - Display backend and frontend URLs -- Nest name and deployment info +- Room name and deployment info - Quick reference during development ### ⌨️ Keyboard Shortcuts @@ -40,7 +40,7 @@ wrapper/ Open `index.html` in your browser to see the sidebar in action: ```bash -cd core_nest/wrapper +cd core_room/wrapper python3 -m http.server 8080 # Open http://localhost:8080 ``` @@ -68,7 +68,7 @@ Edit `config.json` to customize: ```json { - "nest_name": "amar", + "room_name": "amar", "wrapper": { "enabled": true, "environment": { @@ -208,10 +208,10 @@ getSidebarHTML() { ### Add New Features -Extend the `PawprintSidebar` class in `sidebar.js`: +Extend the `SoleprintSidebar` class in `sidebar.js`: ```javascript -class PawprintSidebar { +class SoleprintSidebar { async fetchJiraInfo() { const response = await fetch('https://artery.mcrn.ar/jira/VET-123'); const data = await response.json(); @@ -294,8 +294,8 @@ Planned features (see `../WRAPPER_DESIGN.md`): ## Related Documentation - `../WRAPPER_DESIGN.md` - Complete architecture design -- `../../../pawprint/CLAUDE.md` - Pawprint framework overview -- `../../README.md` - Core nest documentation +- `../../../soleprint/CLAUDE.md` - Soleprint framework overview +- `../../README.md` - Core room documentation ## Contributing @@ -303,9 +303,9 @@ To add a new panel or feature: 1. Add HTML in `getSidebarHTML()` 2. Add styling in `sidebar.css` -3. Add logic as methods on `PawprintSidebar` class +3. Add logic as methods on `SoleprintSidebar` class 4. Update this README with usage instructions ## License -Part of the Pawprint development tools ecosystem. +Part of the Soleprint development tools ecosystem. diff --git a/mainroom/sbwrapper/config.json b/mainroom/sbwrapper/config.json index f996b64..1250aa8 100755 --- a/mainroom/sbwrapper/config.json +++ b/mainroom/sbwrapper/config.json @@ -1,5 +1,5 @@ { - "nest_name": "amar", + "room_name": "amar", "wrapper": { "enabled": true, "environment": { diff --git a/mainroom/sbwrapper/index.html b/mainroom/sbwrapper/index.html index 55f1e54..dfa6aad 100755 --- a/mainroom/sbwrapper/index.html +++ b/mainroom/sbwrapper/index.html @@ -3,7 +3,7 @@ - Pawprint Wrapper - Demo + Soleprint Wrapper - Demo