1.1 changes

This commit is contained in:
buenosairesam
2025-12-29 14:17:53 -03:00
parent 11fde0636f
commit c5546cf7fc
58 changed files with 1048 additions and 496 deletions

View File

@@ -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` |
| Core room (legacy) | `/home/mariano/wdir/ama/core_room` |

View File

@@ -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

View File

@@ -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.

View File

@@ -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

View File

@@ -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 ""

View File

@@ -1,9 +1,9 @@
#!/bin/bash
# View core_nest logs
# View core_room logs
#
# Usage:
# ./logs.sh # All logs
# ./logs.sh <service> # Service compose logs (e.g., amar, pawprint)
# ./logs.sh <service> # Service compose logs (e.g., amar, soleprint)
# ./logs.sh <container> # 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

View File

@@ -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

View File

@@ -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
```

View File

@@ -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 ""

View File

@@ -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 ""

View File

@@ -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" <<EOF
Core Nest Deployment Configuration
Core Room Deployment Configuration
Generated: $(date)
User: $USER
Host: $(hostname)
=== Environment ===
NEST_NAME=$NEST_NAME
ROOM_NAME=$ROOM_NAME
DEPLOYMENT_NAME=$DEPLOYMENT_NAME
NETWORK_NAME=$NETWORK_NAME
MANAGED_DOMAIN=$MANAGED_DOMAIN
PAWPRINT_DOMAIN=$PAWPRINT_DOMAIN
SOLEPRINT_DOMAIN=$SOLEPRINT_DOMAIN
=== Generated Files ===
- core_nest.nginx.conf → /etc/nginx/sites-available/core_nest.conf
- core_room.nginx.conf → /etc/nginx/sites-available/core_room.conf
=== Next Steps ===
1. Review generated files in: $GEN_DIR

View File

@@ -1,5 +1,5 @@
#!/bin/bash
# Install nginx config for core_nest
# Install nginx config for core_room
# Run with: sudo ./install-nginx.sh
set -e
@@ -8,11 +8,11 @@ set -e
APP_USER="${APP_USER:-mariano}"
APP_HOME="/home/${APP_USER}"
NGINX_SOURCE="${APP_HOME}/core_nest/ctrl/server/nginx/core_nest.conf"
NGINX_AVAILABLE="/etc/nginx/sites-available/core_nest.conf"
NGINX_ENABLED="/etc/nginx/sites-enabled/core_nest.conf"
NGINX_SOURCE="${APP_HOME}/core_room/ctrl/server/nginx/core_room.conf"
NGINX_AVAILABLE="/etc/nginx/sites-available/core_room.conf"
NGINX_ENABLED="/etc/nginx/sites-enabled/core_room.conf"
echo "=== Installing nginx config for core_nest ==="
echo "=== Installing nginx config for core_room ==="
echo "App user: $APP_USER"
echo "App home: $APP_HOME"
echo ""

View File

@@ -1,15 +1,15 @@
# Core Nest - All Services Nginx Config
# Single config for entire nest deployment
# Core Room - All Services Nginx Config
# Single config for entire room deployment
#
# Docker Services (primary):
# - amar.nest.mcrn.ar (frontend:3000 + backend:8000)
# - pawprint.mcrn.ar (port 13000)
# - amar.room.mcrn.ar (frontend:3000 + backend:8000)
# - soleprint.mcrn.ar (port 13000)
# - artery.mcrn.ar (port 13001)
# - album.mcrn.ar (port 13002)
# - ward.mcrn.ar (port 13003)
#
# Bare Metal Services (fallback):
# - pawprint.bare.mcrn.ar (port 12000)
# - soleprint.bare.mcrn.ar (port 12000)
# - artery.bare.mcrn.ar (port 12001)
# - album.bare.mcrn.ar (port 12002)
# - ward.bare.mcrn.ar (port 12003)
@@ -19,16 +19,16 @@
# =============================================================================
server {
listen 80;
server_name amar.nest.mcrn.ar;
server_name amar.room.mcrn.ar;
return 301 https://$host$request_uri;
}
server {
listen 443 ssl;
server_name amar.nest.mcrn.ar;
server_name amar.room.mcrn.ar;
ssl_certificate /etc/letsencrypt/live/nest.mcrn.ar/fullchain.pem;
ssl_certificate_key /etc/letsencrypt/live/nest.mcrn.ar/privkey.pem;
ssl_certificate /etc/letsencrypt/live/room.mcrn.ar/fullchain.pem;
ssl_certificate_key /etc/letsencrypt/live/room.mcrn.ar/privkey.pem;
include /etc/letsencrypt/options-ssl-nginx.conf;
ssl_dhparam /etc/letsencrypt/ssl-dhparams.pem;
@@ -68,20 +68,20 @@ server {
}
# =============================================================================
# PAWPRINT - Main Service
# SOLEPRINT - Main Service
# =============================================================================
server {
listen 80;
server_name pawprint.mcrn.ar;
server_name soleprint.mcrn.ar;
return 301 https://$host$request_uri;
}
server {
listen 443 ssl;
server_name pawprint.mcrn.ar;
server_name soleprint.mcrn.ar;
ssl_certificate /etc/letsencrypt/live/pawprint.mcrn.ar/fullchain.pem;
ssl_certificate_key /etc/letsencrypt/live/pawprint.mcrn.ar/privkey.pem;
ssl_certificate /etc/letsencrypt/live/soleprint.mcrn.ar/fullchain.pem;
ssl_certificate_key /etc/letsencrypt/live/soleprint.mcrn.ar/privkey.pem;
include /etc/letsencrypt/options-ssl-nginx.conf;
ssl_dhparam /etc/letsencrypt/ssl-dhparams.pem;
@@ -180,17 +180,17 @@ server {
# =============================================================================
# =============================================================================
# PAWPRINT BARE - Main Service (Bare Metal)
# SOLEPRINT BARE - Main Service (Bare Metal)
# =============================================================================
server {
listen 80;
server_name pawprint.bare.mcrn.ar;
server_name soleprint.bare.mcrn.ar;
return 301 https://$host$request_uri;
}
server {
listen 443 ssl;
server_name pawprint.bare.mcrn.ar;
server_name soleprint.bare.mcrn.ar;
ssl_certificate /etc/letsencrypt/live/bare.mcrn.ar/fullchain.pem;
ssl_certificate_key /etc/letsencrypt/live/bare.mcrn.ar/privkey.pem;

View File

@@ -1,15 +1,15 @@
# Core Nest - Nginx Config Template
# Core Room - Nginx Config Template
# Generated from environment variables
#
# Environment variables:
# DOMAIN_AMAR - Amar domain (e.g., amarmascotas.local.com or amar.nest.mcrn.ar)
# DOMAIN_PAWPRINT - Pawprint domain (e.g., pawprint.local.com or pawprint.mcrn.ar)
# DOMAIN_AMAR - Amar domain (e.g., amarmascotas.local.com or amar.room.mcrn.ar)
# DOMAIN_SOLEPRINT - Soleprint domain (e.g., soleprint.local.com or soleprint.mcrn.ar)
# USE_SSL - true/false - whether to use SSL
# SSL_CERT_PATH - Path to SSL certificate (if USE_SSL=true)
# SSL_KEY_PATH - Path to SSL key (if USE_SSL=true)
# BACKEND_PORT - Backend port (default: 8000)
# FRONTEND_PORT - Frontend port (default: 3000)
# PAWPRINT_PORT - Pawprint port (default: 13000)
# SOLEPRINT_PORT - Soleprint port (default: 13000)
# =============================================================================
# AMAR - Frontend + Backend
@@ -61,12 +61,12 @@ ${SSL_REDIRECT}
${SSL_SERVER_BLOCK}
# =============================================================================
# PAWPRINT - Main Service + Ecosystem
# SOLEPRINT - Main Service + Ecosystem
# =============================================================================
server {
listen 80;
server_name ${DOMAIN_PAWPRINT};
${PAWPRINT_SSL_REDIRECT}
server_name ${DOMAIN_SOLEPRINT};
${SOLEPRINT_SSL_REDIRECT}
# Artery - API Gateway
location /artery/ {
proxy_pass http://127.0.0.1:${ARTERY_PORT}/;
@@ -94,9 +94,9 @@ ${PAWPRINT_SSL_REDIRECT}
proxy_set_header X-Forwarded-Proto \$scheme;
}
# Pawprint - Main Service (default)
# Soleprint - Main Service (default)
location / {
proxy_pass http://127.0.0.1:${PAWPRINT_PORT};
proxy_pass http://127.0.0.1:${SOLEPRINT_PORT};
proxy_set_header Host \$host;
proxy_set_header X-Real-IP \$remote_addr;
proxy_set_header X-Forwarded-For \$proxy_add_x_forwarded_for;
@@ -104,4 +104,4 @@ ${PAWPRINT_SSL_REDIRECT}
}
}
${PAWPRINT_SSL_SERVER_BLOCK}
${SOLEPRINT_SSL_SERVER_BLOCK}

View File

@@ -1,9 +1,9 @@
# Nginx Config Template for Docker Local Development
# Uses environment variables from .env files
# Variables: DEPLOYMENT_NAME, NEST_NAME, MANAGED_DOMAIN, PAWPRINT_DOMAIN
# Variables: DEPLOYMENT_NAME, ROOM_NAME, MANAGED_DOMAIN, SOLEPRINT_DOMAIN
# =============================================================================
# MANAGED APP WITH WRAPPER - amar.nest.local.com
# MANAGED APP WITH WRAPPER - amar.room.local.com
# =============================================================================
server {
listen 80;
@@ -108,15 +108,15 @@ server {
}
# =============================================================================
# PAWPRINT - Main Service + Ecosystem
# SOLEPRINT - Main Service + Ecosystem
# =============================================================================
server {
listen 80;
server_name ${PAWPRINT_DOMAIN};
server_name ${SOLEPRINT_DOMAIN};
# Artery - API Gateway
location /artery/ {
proxy_pass http://${NEST_NAME}_artery:8000/;
proxy_pass http://${ROOM_NAME}_artery:8000/;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
@@ -125,7 +125,7 @@ server {
# Album - Media Service
location /album/ {
proxy_pass http://${NEST_NAME}_album:8000/;
proxy_pass http://${ROOM_NAME}_album:8000/;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
@@ -134,16 +134,16 @@ server {
# Ward - Admin Interface
location /ward/ {
proxy_pass http://${NEST_NAME}_ward:8000/;
proxy_pass http://${ROOM_NAME}_ward:8000/;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
}
# Pawprint - Main Service (default)
# Soleprint - Main Service (default)
location / {
proxy_pass http://${NEST_NAME}_pawprint:8000;
proxy_pass http://${ROOM_NAME}_soleprint:8000;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;

View File

@@ -1,12 +1,12 @@
# Nginx Config Template for Docker
# Uses environment variables from .env files
# Variables: DEPLOYMENT_NAME, MANAGED_DOMAIN, PAWPRINT_DOMAIN, MANAGED_*
# Variables: DEPLOYMENT_NAME, MANAGED_DOMAIN, SOLEPRINT_DOMAIN, MANAGED_*
# =============================================================================
# MANAGED DOMAIN
# =============================================================================
# Completely defined by the parent deployment (e.g., core_nest)
# Pawprint doesn't know or care about the managed app's structure
# Completely defined by the parent deployment (e.g., core_room)
# Soleprint doesn't know or care about the managed app's structure
server {
listen 80;
server_name ${MANAGED_DOMAIN};
@@ -16,11 +16,11 @@ server {
}
# =============================================================================
# PAWPRINT - Main Service + Ecosystem
# SOLEPRINT - Main Service + Ecosystem
# =============================================================================
server {
listen 80;
server_name ${PAWPRINT_DOMAIN};
server_name ${SOLEPRINT_DOMAIN};
# Artery - API Gateway
location /artery/ {
@@ -49,9 +49,9 @@ server {
proxy_set_header X-Forwarded-Proto $scheme;
}
# Pawprint - Main Service (default)
# Soleprint - Main Service (default)
location / {
proxy_pass http://${DEPLOYMENT_NAME}_pawprint:8000;
proxy_pass http://${DEPLOYMENT_NAME}_soleprint:8000;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;

View File

@@ -16,7 +16,7 @@ if [ "$ENABLE_WRAPPER" != "true" ]; then
fi
# Replace env vars
envsubst '${DEPLOYMENT_NAME} ${NEST_NAME} ${MANAGED_DOMAIN} ${PAWPRINT_DOMAIN}' < "$OUTPUT" > /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)"

View File

@@ -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/"

View File

@@ -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 ""

View File

@@ -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'"

View File

@@ -1,9 +1,9 @@
#!/bin/bash
# Start core_nest services
# Start core_room services
#
# Usage:
# ./start.sh # Start all (foreground, see logs)
# ./start.sh <service> # Start specific service (e.g., amar, pawprint)
# ./start.sh <service> # 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

View File

@@ -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 ""

View File

@@ -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

View File

@@ -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

View File

@@ -1,13 +0,0 @@
FROM python:3.11-slim
WORKDIR /app
# Install dependencies
COPY requirements.txt .
RUN pip install --no-cache-dir -r requirements.txt
# Copy application
COPY . .
# Run
CMD ["python", "main.py"]

View File

@@ -1,120 +0,0 @@
# Link Nest - Adapter Layer
Provides framework-agnostic data navigation between managed apps (AMAR) and pawprint.
## Status: Initial Implementation ✅
**Working:**
- ✅ FastAPI service with adapter pattern
- ✅ BaseAdapter interface for pluggable frameworks
- ✅ DjangoAdapter with AMAR database queries
- ✅ Docker build and container starts
-`/health` endpoint (adapter loads successfully)
-`/api/queries` endpoint (lists available queries)
**Pending:**
- ⏳ Database connection (needs DB_HOST env var fix)
- ⏳ Complete all entity queries (Pet, Vet, ServiceRequest, etc.)
- ⏳ Ward integration (consume JSON and render graph)
## Architecture
```
Managed App (AMAR) ←─── link_nest ───→ Pawprint (Ward)
↓ ↓ ↓
Database Adapter Layer Graph Renderer
(SQL → JSON) (JSON → SVG)
```
**JSON Contract:**
```json
{
"nodes": [
{"id": "User_123", "type": "User", "label": "john", "data": {...}}
],
"edges": [
{"from": "User_123", "to": "PetOwner_456", "label": "has profile"}
],
"summary": {
"title": "User #123",
"credentials": "john | Password: Amar2025!",
"fields": {"Email": "john@example.com"}
}
}
```
## Endpoints
- `GET /health` - Health check with adapter status
- `GET /api/queries` - List available predefined queries
- `GET /api/navigate?query=user_with_pets` - Query mode
- `GET /api/navigate?entity=User&id=123` - Entity navigation mode
## Available Queries
1. `user_with_pets` - User with Pet ownership
2. `user_with_requests` - User with ServiceRequests
## Usage
```bash
# Start (from core_nest/ctrl)
./start.sh link_nest -d --build
# Test
curl http://localhost:8100/health
curl http://localhost:8100/api/queries
curl "http://localhost:8100/api/navigate?query=user_with_pets"
# Logs
docker logs core_nest_link_nest
```
## Environment Variables
From `core_nest/.env`:
- `NEST_NAME` - Container naming
- `NETWORK_NAME` - Docker network
- `DB_HOST` - Database host (needs fix: should point to db container)
- `DB_PORT` - Database port
- `DB_NAME` - Database name
- `DB_USER` - Database user
- `DB_PASSWORD` - Database password
- `ADAPTER_TYPE` - Adapter to use (default: django)
## Next Steps
1. **Fix DB connection** - Set correct DB_HOST in core_nest/.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
5. **Test end-to-end** - Query → JSON → SVG → Display
## Files
```
link_nest/
├── README.md # This file
├── main.py # FastAPI app with endpoints
├── requirements.txt # Python dependencies
├── Dockerfile # Container build
├── docker-compose.yml # Service definition
└── adapters/
├── __init__.py # BaseAdapter interface
└── django.py # DjangoAdapter implementation
```
## Design Goals
**Framework-agnostic** - Works with Django, Rails, Express, etc.
**Decoupled** - Managed app owns data, link_nest translates
**Pluggable** - Adapters for different frameworks
**Authenticated** - Ready for remote deployment
**Incremental** - Build and test each piece
## Reference
Previous approach (databrowse direct DB) saved in:
- Branch: `ref/databrowse-direct-db` (ward repo)
- Problem: Tight coupling, won't work remote
- Solution: This adapter pattern

View File

@@ -1,43 +0,0 @@
"""
Adapters for different managed app frameworks.
"""
from typing import Dict, List, Any, Optional
from abc import ABC, abstractmethod
class BaseAdapter(ABC):
"""Base adapter interface."""
def __init__(self, config: Dict[str, Any]):
"""
Initialize adapter with configuration.
Args:
config: Database connection or API endpoint configuration
"""
self.config = config
@abstractmethod
def navigate(
self,
query: Optional[str] = None,
entity: Optional[str] = None,
id: Optional[int] = None
) -> Dict[str, Any]:
"""
Navigate data graph.
Returns:
{
"nodes": [{"id": str, "type": str, "label": str, "data": dict}],
"edges": [{"from": str, "to": str, "label": str}],
"summary": {"title": str, "credentials": str|None, "fields": dict}
}
"""
pass
@abstractmethod
def get_queries(self) -> List[str]:
"""Return list of available query names."""
pass

View File

@@ -1,235 +0,0 @@
"""
Django adapter for AMAR.
Queries AMAR's PostgreSQL database directly.
"""
from typing import Dict, List, Any, Optional
from sqlalchemy import create_engine, text
from . import BaseAdapter
class DjangoAdapter(BaseAdapter):
"""Adapter for Django/AMAR."""
def __init__(self, config: Dict[str, Any]):
super().__init__(config)
self.engine = self._create_engine()
def _create_engine(self):
"""Create SQLAlchemy engine from config."""
db_url = (
f"postgresql://{self.config['user']}:{self.config['password']}"
f"@{self.config['host']}:{self.config['port']}/{self.config['name']}"
)
return create_engine(db_url, pool_pre_ping=True)
def _execute(self, sql: str) -> List[Dict[str, Any]]:
"""Execute SQL and return results as list of dicts."""
with self.engine.connect() as conn:
result = conn.execute(text(sql))
rows = result.fetchall()
columns = result.keys()
return [dict(zip(columns, row)) for row in rows]
def get_queries(self) -> List[str]:
"""Available predefined queries."""
return [
"user_with_pets",
"user_with_requests",
]
def navigate(
self,
query: Optional[str] = None,
entity: Optional[str] = None,
id: Optional[int] = None
) -> Dict[str, Any]:
"""Navigate data graph."""
if query:
return self._query_mode(query)
elif entity and id:
return self._entity_mode(entity, id)
else:
raise ValueError("Must provide either query or entity+id")
def _query_mode(self, query_name: str) -> Dict[str, Any]:
"""Execute predefined query."""
if query_name == "user_with_pets":
sql = """
SELECT
u.id as user_id, u.username, u.email,
po.id as petowner_id, po.first_name, po.last_name, po.phone,
p.id as pet_id, p.name as pet_name, p.pet_type, p.age
FROM auth_user u
JOIN mascotas_petowner po ON po.user_id = u.id
JOIN mascotas_pet p ON p.owner_id = po.id
WHERE p.deleted = false
LIMIT 1
"""
elif query_name == "user_with_requests":
sql = """
SELECT
u.id as user_id, u.username, u.email,
po.id as petowner_id, po.first_name, po.last_name,
sr.id as request_id, sr.state, sr.created_at
FROM auth_user u
JOIN mascotas_petowner po ON po.user_id = u.id
JOIN solicitudes_servicerequest sr ON sr.petowner_id = po.id
WHERE sr.deleted = false
ORDER BY sr.created_at DESC
LIMIT 1
"""
else:
raise ValueError(f"Unknown query: {query_name}")
rows = self._execute(sql)
if not rows:
return self._empty_response()
return self._rows_to_graph(rows[0])
def _entity_mode(self, entity: str, id: int) -> Dict[str, Any]:
"""Navigate to specific entity."""
if entity == "User":
sql = f"""
SELECT
u.id as user_id, u.username, u.email,
po.id as petowner_id, po.first_name, po.last_name, po.phone
FROM auth_user u
LEFT JOIN mascotas_petowner po ON po.user_id = u.id
WHERE u.id = {id}
"""
else:
raise ValueError(f"Unknown entity: {entity}")
rows = self._execute(sql)
if not rows:
return self._empty_response()
return self._rows_to_graph(rows[0])
def _rows_to_graph(self, row: Dict[str, Any]) -> Dict[str, Any]:
"""Convert SQL row to graph structure."""
nodes = []
edges = []
# User node
if "user_id" in row and row["user_id"]:
nodes.append({
"id": f"User_{row['user_id']}",
"type": "User",
"label": row.get("username") or row.get("email", ""),
"data": {
"id": row["user_id"],
"username": row.get("username"),
"email": row.get("email"),
}
})
# PetOwner node
if "petowner_id" in row and row["petowner_id"]:
name = f"{row.get('first_name', '')} {row.get('last_name', '')}".strip()
nodes.append({
"id": f"PetOwner_{row['petowner_id']}",
"type": "PetOwner",
"label": name or "PetOwner",
"data": {
"id": row["petowner_id"],
"first_name": row.get("first_name"),
"last_name": row.get("last_name"),
"phone": row.get("phone"),
}
})
if "user_id" in row and row["user_id"]:
edges.append({
"from": f"User_{row['user_id']}",
"to": f"PetOwner_{row['petowner_id']}",
"label": "has profile"
})
# Pet node
if "pet_id" in row and row["pet_id"]:
nodes.append({
"id": f"Pet_{row['pet_id']}",
"type": "Pet",
"label": row.get("pet_name", "Pet"),
"data": {
"id": row["pet_id"],
"name": row.get("pet_name"),
"pet_type": row.get("pet_type"),
"age": row.get("age"),
}
})
if "petowner_id" in row and row["petowner_id"]:
edges.append({
"from": f"PetOwner_{row['petowner_id']}",
"to": f"Pet_{row['pet_id']}",
"label": "owns"
})
# ServiceRequest node
if "request_id" in row and row["request_id"]:
nodes.append({
"id": f"ServiceRequest_{row['request_id']}",
"type": "ServiceRequest",
"label": f"Request #{row['request_id']}",
"data": {
"id": row["request_id"],
"state": row.get("state"),
"created_at": str(row.get("created_at", "")),
}
})
if "petowner_id" in row and row["petowner_id"]:
edges.append({
"from": f"PetOwner_{row['petowner_id']}",
"to": f"ServiceRequest_{row['request_id']}",
"label": "requested"
})
# Build summary from first User node
summary = self._build_summary(nodes)
return {
"nodes": nodes,
"edges": edges,
"summary": summary
}
def _build_summary(self, nodes: List[Dict]) -> Dict[str, Any]:
"""Build summary from nodes."""
# Find User node
user_node = next((n for n in nodes if n["type"] == "User"), None)
if user_node:
data = user_node["data"]
return {
"title": f"User #{data['id']}",
"credentials": f"{data.get('username', 'N/A')} | Password: Amar2025!",
"fields": {
"Email": data.get("email", "N/A"),
"Username": data.get("username", "N/A"),
}
}
# Fallback
return {
"title": "No data",
"credentials": None,
"fields": {}
}
def _empty_response(self) -> Dict[str, Any]:
"""Return empty response structure."""
return {
"nodes": [],
"edges": [],
"summary": {
"title": "No data found",
"credentials": None,
"fields": {}
}
}

View File

@@ -1,25 +0,0 @@
services:
link_nest:
build:
context: .
dockerfile: Dockerfile
container_name: ${NEST_NAME}_link_nest
ports:
- "8100:8000"
environment:
- PORT=8000
- ADAPTER_TYPE=${ADAPTER_TYPE:-django}
- DB_HOST=${DB_HOST}
- DB_PORT=${DB_PORT}
- DB_NAME=${DB_NAME}
- DB_USER=${DB_USER}
- DB_PASSWORD=${DB_PASSWORD}
volumes:
- ./:/app
networks:
- default
networks:
default:
external: true
name: ${NETWORK_NAME}

View File

@@ -1,105 +0,0 @@
"""
Link Nest - Adapter layer between managed apps and pawprint.
Exposes standardized JSON endpoints for data navigation.
Framework-agnostic via pluggable adapters.
"""
import os
from typing import Optional
from fastapi import FastAPI, HTTPException
app = FastAPI(title="Link Nest", version="0.1.0")
# Lazy-loaded adapter instance
_adapter = None
def get_adapter():
"""Get or create adapter instance."""
global _adapter
if _adapter is None:
adapter_type = os.getenv("ADAPTER_TYPE", "django")
# Database config from environment
db_config = {
"host": os.getenv("DB_HOST", "localhost"),
"port": int(os.getenv("DB_PORT", "5432")),
"name": os.getenv("DB_NAME", "amarback"),
"user": os.getenv("DB_USER", "postgres"),
"password": os.getenv("DB_PASSWORD", ""),
}
if adapter_type == "django":
from adapters.django import DjangoAdapter
_adapter = DjangoAdapter(db_config)
else:
raise ValueError(f"Unknown adapter type: {adapter_type}")
return _adapter
@app.get("/health")
def health():
"""Health check."""
adapter_type = os.getenv("ADAPTER_TYPE", "django")
# Test adapter connection
adapter_ok = False
try:
adapter = get_adapter()
adapter_ok = True
except Exception as e:
print(f"Adapter error: {e}")
return {
"status": "ok" if adapter_ok else "degraded",
"service": "link-nest",
"adapter": adapter_type,
"adapter_loaded": adapter_ok,
}
@app.get("/api/queries")
def list_queries():
"""List available predefined queries."""
adapter = get_adapter()
return {
"queries": adapter.get_queries()
}
@app.get("/api/navigate")
def navigate(query: Optional[str] = None, entity: Optional[str] = None, id: Optional[int] = None):
"""
Navigate data graph.
Query mode: ?query=user_with_pets
Navigation mode: ?entity=User&id=123
Returns:
{
"nodes": [...],
"edges": [...],
"summary": {...}
}
"""
try:
adapter = get_adapter()
result = adapter.navigate(query=query, entity=entity, id=id)
return result
except ValueError as e:
raise HTTPException(status_code=400, detail=str(e))
except Exception as e:
print(f"Navigate error: {e}")
raise HTTPException(status_code=500, detail=str(e))
if __name__ == "__main__":
import uvicorn
uvicorn.run(
"main:app",
host="0.0.0.0",
port=int(os.getenv("PORT", "8000")),
reload=True,
)

View File

@@ -1,4 +0,0 @@
fastapi
uvicorn[standard]
psycopg2-binary
sqlalchemy

View File

@@ -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.

View File

@@ -1,5 +1,5 @@
{
"nest_name": "amar",
"room_name": "amar",
"wrapper": {
"enabled": true,
"environment": {

View File

@@ -3,7 +3,7 @@
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Pawprint Wrapper - Demo</title>
<title>Soleprint Wrapper - Demo</title>
<link rel="stylesheet" href="sidebar.css">
<style>
/* Demo page styles */
@@ -19,7 +19,7 @@
transition: margin-right 0.3s ease;
}
#pawprint-sidebar.expanded ~ #demo-content {
#soleprint-sidebar.expanded ~ #demo-content {
margin-right: var(--sidebar-width);
}
@@ -105,14 +105,14 @@
<div id="demo-content">
<div class="demo-header">
<h1>🐾 Pawprint Wrapper</h1>
<p>Development tools sidebar for any pawprint-managed nest</p>
<h1>🐾 Soleprint Wrapper</h1>
<p>Development tools sidebar for any soleprint-managed room</p>
</div>
<div class="demo-section">
<h2>👋 Quick Start</h2>
<p>
This is a standalone demo of the Pawprint Wrapper sidebar.
This is a standalone demo of the Soleprint Wrapper sidebar.
Click the toggle button on the right edge of the screen, or press
<span class="kbd">Ctrl</span> + <span class="kbd">Shift</span> + <span class="kbd">P</span>
to open the sidebar.
@@ -156,7 +156,7 @@
<ul>
<li><code>sidebar.css</code> - Visual styling (dark theme, animations)</li>
<li><code>sidebar.js</code> - Logic (login, logout, toggle, state management)</li>
<li><code>config.json</code> - Configuration (users, URLs, nest info)</li>
<li><code>config.json</code> - Configuration (users, URLs, room info)</li>
</ul>
<p style="margin-top: 16px;">
To integrate with your app, simply include these in your HTML:
@@ -184,7 +184,7 @@
<div class="demo-section">
<h2>📚 Documentation</h2>
<p>
See <code>WRAPPER_DESIGN.md</code> in <code>core_nest/</code> for the complete
See <code>WRAPPER_DESIGN.md</code> in <code>core_room/</code> for the complete
architecture design, including Docker integration patterns and alternative approaches.
</p>
</div>

View File

@@ -1,4 +1,4 @@
/* Pawprint Wrapper - Sidebar Styles */
/* Soleprint Wrapper - Sidebar Styles */
:root {
--sidebar-width: 320px;
@@ -26,7 +26,7 @@ body {
}
/* Sidebar Container */
#pawprint-sidebar {
#soleprint-sidebar {
position: fixed;
right: 0;
top: 0;
@@ -44,7 +44,7 @@ body {
flex-direction: column;
}
#pawprint-sidebar.expanded {
#soleprint-sidebar.expanded {
transform: translateX(0);
}
@@ -76,7 +76,7 @@ body {
transition: transform 0.3s;
}
#pawprint-sidebar.expanded ~ #sidebar-toggle .icon {
#soleprint-sidebar.expanded ~ #sidebar-toggle .icon {
transform: scaleX(-1);
}
@@ -94,7 +94,7 @@ body {
color: var(--sidebar-accent);
}
.sidebar-header .nest-name {
.sidebar-header .room-name {
font-size: 12px;
opacity: 0.7;
text-transform: uppercase;
@@ -262,20 +262,20 @@ body {
}
/* Scrollbar */
#pawprint-sidebar::-webkit-scrollbar {
#soleprint-sidebar::-webkit-scrollbar {
width: 8px;
}
#pawprint-sidebar::-webkit-scrollbar-track {
#soleprint-sidebar::-webkit-scrollbar-track {
background: #1a1a1a;
}
#pawprint-sidebar::-webkit-scrollbar-thumb {
#soleprint-sidebar::-webkit-scrollbar-thumb {
background: #444;
border-radius: 4px;
}
#pawprint-sidebar::-webkit-scrollbar-thumb:hover {
#soleprint-sidebar::-webkit-scrollbar-thumb:hover {
background: #555;
}
@@ -290,7 +290,7 @@ body {
/* Responsive */
@media (max-width: 768px) {
#pawprint-sidebar {
#soleprint-sidebar {
width: 100%;
}
}

View File

@@ -1,6 +1,6 @@
// Pawprint Wrapper - Sidebar Logic
// Soleprint Wrapper - Sidebar Logic
class PawprintSidebar {
class SoleprintSidebar {
constructor() {
this.config = null;
this.currentUser = null;
@@ -30,12 +30,12 @@ class PawprintSidebar {
try {
const response = await fetch('/wrapper/config.json');
this.config = await response.json();
console.log('[Pawprint] Config loaded:', this.config.nest_name);
console.log('[Soleprint] Config loaded:', this.config.room_name);
} catch (error) {
console.error('[Pawprint] Failed to load config:', error);
console.error('[Soleprint] Failed to load config:', error);
// Use default config
this.config = {
nest_name: 'default',
room_name: 'default',
wrapper: {
environment: {
backend_url: 'http://localhost:8000',
@@ -49,7 +49,7 @@ class PawprintSidebar {
createSidebar() {
const sidebar = document.createElement('div');
sidebar.id = 'pawprint-sidebar';
sidebar.id = 'soleprint-sidebar';
sidebar.innerHTML = this.getSidebarHTML();
document.body.appendChild(sidebar);
this.sidebar = sidebar;
@@ -59,7 +59,7 @@ class PawprintSidebar {
const button = document.createElement('button');
button.id = 'sidebar-toggle';
button.innerHTML = '<span class="icon">◀</span>';
button.title = 'Toggle Pawprint Sidebar (Ctrl+Shift+P)';
button.title = 'Toggle Soleprint Sidebar (Ctrl+Shift+P)';
document.body.appendChild(button);
this.toggleBtn = button;
}
@@ -69,8 +69,8 @@ class PawprintSidebar {
return `
<div class="sidebar-header">
<h2>🐾 Pawprint</h2>
<div class="nest-name">${this.config.nest_name}</div>
<h2>🐾 Soleprint</h2>
<div class="room-name">${this.config.room_name}</div>
</div>
<div class="sidebar-content">
@@ -83,7 +83,7 @@ class PawprintSidebar {
<div id="current-user-display" style="display: none;">
<div class="current-user">
Logged in as: <strong id="current-username"></strong>
<button class="logout-btn" onclick="pawprintSidebar.logout()">
<button class="logout-btn" onclick="soleprintSidebar.logout()">
Logout
</button>
</div>
@@ -91,7 +91,7 @@ class PawprintSidebar {
<div class="user-cards">
${users.map(user => `
<div class="user-card" data-user-id="${user.id}" onclick="pawprintSidebar.loginAs('${user.id}')">
<div class="user-card" data-user-id="${user.id}" onclick="soleprintSidebar.loginAs('${user.id}')">
<div class="icon">${user.icon}</div>
<div class="info">
<span class="label">${user.label}</span>
@@ -119,7 +119,7 @@ class PawprintSidebar {
</div>
<div class="sidebar-footer">
Pawprint Dev Tools
Soleprint Dev Tools
</div>
`;
}
@@ -144,11 +144,11 @@ class PawprintSidebar {
saveSidebarState() {
const isExpanded = this.sidebar.classList.contains('expanded');
localStorage.setItem('pawprint_sidebar_expanded', isExpanded);
localStorage.setItem('soleprint_sidebar_expanded', isExpanded);
}
loadSidebarState() {
const isExpanded = localStorage.getItem('pawprint_sidebar_expanded') === 'true';
const isExpanded = localStorage.getItem('soleprint_sidebar_expanded') === 'true';
if (isExpanded) {
this.sidebar.classList.add('expanded');
}
@@ -214,7 +214,7 @@ class PawprintSidebar {
}, 1000);
} catch (error) {
console.error('[Pawprint] Login error:', error);
console.error('[Soleprint] Login error:', error);
this.showStatus(`✗ Login failed: ${error.message}`, 'error');
}
}
@@ -241,7 +241,7 @@ class PawprintSidebar {
this.currentUser = JSON.parse(userInfo);
this.updateCurrentUserDisplay();
} catch (error) {
console.error('[Pawprint] Failed to parse user info:', error);
console.error('[Soleprint] Failed to parse user info:', error);
}
}
}
@@ -275,12 +275,12 @@ class PawprintSidebar {
}
// Initialize sidebar when DOM is ready
const pawprintSidebar = new PawprintSidebar();
const soleprintSidebar = new SoleprintSidebar();
if (document.readyState === 'loading') {
document.addEventListener('DOMContentLoaded', () => pawprintSidebar.init());
document.addEventListener('DOMContentLoaded', () => soleprintSidebar.init());
} else {
pawprintSidebar.init();
soleprintSidebar.init();
}
console.log('[Pawprint] Sidebar script loaded');
console.log('[Soleprint] Sidebar script loaded');

View File

@@ -8,7 +8,7 @@ The `docker-compose.nginx.yml` file provides an **optional** nginx container for
Use nginx container when you want to access services via friendly domains locally:
- `http://amarmascotas.local.com` → amar
- `http://pawprint.local.com`pawprint + services
- `http://soleprint.local.com`soleprint + services
## Setup
@@ -19,14 +19,14 @@ cd ../ctrl/server
./setup.sh --local
```
This creates `/tmp/core_nest.conf` with your local domain routing.
This creates `/tmp/core_room.conf` with your local domain routing.
### 2. Ensure /etc/hosts is configured
```bash
# Should already be there, but verify:
grep "127.0.0.1.*amarmascotas.local.com" /etc/hosts
grep "127.0.0.1.*pawprint.local.com" /etc/hosts
grep "127.0.0.1.*soleprint.local.com" /etc/hosts
```
### 3. Stop bare metal nginx (if running)
@@ -43,7 +43,7 @@ sudo systemctl disable nginx
cd ../ctrl
./start.sh --with-nginx
# OR manually:
cd ../pawprint
cd ../soleprint
docker compose -f docker-compose.yml -f docker-compose.nginx.yml up -d
```
@@ -52,7 +52,7 @@ docker compose -f docker-compose.yml -f docker-compose.nginx.yml up -d
If you don't use nginx, services are accessed via ports:
- `http://localhost:3000` → amar frontend
- `http://localhost:8000` → amar backend
- `http://localhost:13000`pawprint
- `http://localhost:13000`soleprint
- `http://localhost:13001` → artery
- `http://localhost:13002` → album
- `http://localhost:13003` → ward
@@ -73,7 +73,7 @@ cd ../ctrl && ./stop.sh
**To go back to direct ports:**
```bash
# Stop nginx version
cd ../pawprint
cd ../soleprint
docker compose -f docker-compose.yml -f docker-compose.nginx.yml down
# Start without nginx
@@ -105,7 +105,7 @@ docker stop <container_name>
cd ../ctrl/server && ./setup.sh --local
# Verify config exists
ls -la /tmp/core_nest.conf
ls -la /tmp/core_room.conf
```
**DNS not resolving:**

View File

@@ -1,12 +1,12 @@
# Pawprint Control Scripts
# Soleprint Control Scripts
Control scripts for managing pawprint services via systemd (alternative to Docker deployment).
Control scripts for managing soleprint services via systemd (alternative to Docker deployment).
## Structure
```
ctrl/
├── .env.pawprint # Shared configuration
├── .env.soleprint # Shared configuration
├── local/ # Scripts run from developer machine
│ ├── commit.sh # Commit changes across all repos
│ ├── deploy.sh # Full deployment workflow
@@ -23,19 +23,19 @@ ctrl/
## Configuration
Edit `.env.pawprint` to configure:
Edit `.env.soleprint` to configure:
```bash
# Deployment
DEPLOY_SERVER=mariano@mcrn.ar
DEPLOY_REMOTE_PATH=~/pawprint
DEPLOY_REMOTE_PATH=~/soleprint
# Local paths
PAWPRINT_BARE_PATH=/home/mariano/pawprint
SOLEPRINT_BARE_PATH=/home/mariano/soleprint
# Server paths
SERVER_USER=mariano
SERVER_PAWPRINT_PATH=/home/mariano/pawprint
SERVER_SOLEPRINT_PATH=/home/mariano/soleprint
SERVER_VENV_BASE=/home/mariano/venvs
```
@@ -48,7 +48,7 @@ SERVER_VENV_BASE=/home/mariano/venvs
./push.sh artery # Deploy only artery (when needed)
```
See `DESIGN_PAWPRINT.md` for detailed philosophy.
See `DESIGN_SOLEPRINT.md` for detailed philosophy.
## Local Scripts
@@ -72,7 +72,7 @@ See `DESIGN_PAWPRINT.md` for detailed philosophy.
```bash
./local/deploy.sh
# Then restart on server:
# ssh mariano@mcrn.ar 'bash ~/pawprint/ctrl/server/restart.sh'
# ssh mariano@mcrn.ar 'bash ~/soleprint/ctrl/server/restart.sh'
```
### init.sh
@@ -96,7 +96,7 @@ sudo ./server/restart.sh artery # Restart only artery
### setup-service.sh
```bash
sudo ./server/setup-service.sh pawprint 12000 main:app
sudo ./server/setup-service.sh soleprint 12000 main:app
sudo ./server/setup-service.sh artery 12001 main:app
```
@@ -122,13 +122,13 @@ cd ctrl/local
Server:
```bash
cd ~/pawprint/ctrl/server
cd ~/soleprint/ctrl/server
./install-deps.sh
sudo ./setup-service.sh pawprint 12000 main:app
sudo ./setup-service.sh soleprint 12000 main:app
sudo ./setup-service.sh artery 12001 main:app
sudo ./setup-service.sh album 12002 main:app
sudo ./setup-service.sh ward 12003 main:app
sudo ./setup-nginx.sh pawprint pawprint.mcrn.ar 12000
sudo ./setup-nginx.sh soleprint soleprint.mcrn.ar 12000
sudo ./setup-nginx.sh artery artery.mcrn.ar 12001
sudo ./setup-nginx.sh album album.mcrn.ar 12002
sudo ./setup-nginx.sh ward ward.mcrn.ar 12003
@@ -145,13 +145,13 @@ cd ctrl/local
Server:
```bash
sudo ~/pawprint/ctrl/server/restart.sh
sudo ~/soleprint/ctrl/server/restart.sh
```
## Nest vs Pawprint Control
## Room vs Soleprint Control
- **core_nest/ctrl/** - Manages full nest (amar + pawprint) via Docker
- **pawprint/ctrl/** - Manages pawprint services via systemd
- **core_room/ctrl/** - Manages full room (amar + soleprint) via Docker
- **soleprint/ctrl/** - Manages soleprint services via systemd
This directory provides systemd-based deployment as an alternative to Docker.
For full nest orchestration with Docker, use `core_nest/ctrl/`.
For full room orchestration with Docker, use `core_room/ctrl/`.

View File

@@ -6,13 +6,13 @@ set -e
MSG="${1:?Usage: $0 \"commit message\"}"
# Find pawprint bare metal directory from PAWPRINT_BARE_PATH or default
PAWPRINT_DIR="${PAWPRINT_BARE_PATH:-/home/mariano/pawprint}"
REPOS=("$PAWPRINT_DIR" "$PAWPRINT_DIR/artery" "$PAWPRINT_DIR/album" "$PAWPRINT_DIR/ward")
# Find soleprint bare metal directory from SOLEPRINT_BARE_PATH or default
SOLEPRINT_DIR="${SOLEPRINT_BARE_PATH:-/home/mariano/soleprint}"
REPOS=("$SOLEPRINT_DIR" "$SOLEPRINT_DIR/artery" "$SOLEPRINT_DIR/album" "$SOLEPRINT_DIR/ward")
for repo in "${REPOS[@]}"; do
name=$(basename "$repo")
[ "$repo" = "$PAWPRINT_DIR" ] && name="pawprint"
[ "$repo" = "$SOLEPRINT_DIR" ] && name="soleprint"
if [ ! -d "$repo/.git" ]; then
echo "=== $name: not a git repo, skipping ==="

View File

@@ -1,28 +1,28 @@
#!/bin/bash
# Initial full sync of pawprint to server
# Initial full sync of soleprint to server
# Run once to setup, then use push.sh for updates
set -e
# Load configuration
CTRL_DIR="$(cd "$(dirname "$0")/../.." SCRIPT_DIR="$(cd "$(dirname "$0")" && pwd)"SCRIPT_DIR="$(cd "$(dirname "$0")" && pwd)" pwd)"
source "$CTRL_DIR/.env.pawprint" 2>/dev/null || true
source "$CTRL_DIR/.env.soleprint" 2>/dev/null || true
PAWPRINT_DIR="${PAWPRINT_BARE_PATH:-/home/mariano/pawprint}"
SOLEPRINT_DIR="${SOLEPRINT_BARE_PATH:-/home/mariano/soleprint}"
REMOTE="${DEPLOY_SERVER:-mariano@mcrn.ar}"
REMOTE_DIR="${DEPLOY_REMOTE_PATH:-~/pawprint}"
REMOTE_DIR="${DEPLOY_REMOTE_PATH:-~/soleprint}"
echo "=== Initial sync of pawprint ==="
echo "From: $PAWPRINT_DIR"
echo "=== Initial sync of soleprint ==="
echo "From: $SOLEPRINT_DIR"
echo "To: $REMOTE:$REMOTE_DIR"
rsync -avz \
--filter=':- .gitignore' \
--exclude '.git' \
--exclude '.env' \
"$PAWPRINT_DIR/" "$REMOTE:$REMOTE_DIR/"
"$SOLEPRINT_DIR/" "$REMOTE:$REMOTE_DIR/"
echo ""
echo "Done! Now on server run:"
echo " cd ~/pawprint"
echo " # Use core_nest/pawprint/tools/server/setup-*.sh scripts for initial setup"
echo " cd ~/soleprint"
echo " # Use core_room/soleprint/tools/server/setup-*.sh scripts for initial setup"

View File

@@ -2,13 +2,13 @@
# Show git status of all repos
# Usage: ./status.sh
# Find pawprint bare metal directory from PAWPRINT_BARE_PATH or default
PAWPRINT_DIR="${PAWPRINT_BARE_PATH:-/home/mariano/pawprint}"
REPOS=("$PAWPRINT_DIR" "$PAWPRINT_DIR/artery" "$PAWPRINT_DIR/album" "$PAWPRINT_DIR/ward")
# Find soleprint bare metal directory from SOLEPRINT_BARE_PATH or default
SOLEPRINT_DIR="${SOLEPRINT_BARE_PATH:-/home/mariano/soleprint}"
REPOS=("$SOLEPRINT_DIR" "$SOLEPRINT_DIR/artery" "$SOLEPRINT_DIR/album" "$SOLEPRINT_DIR/ward")
for repo in "${REPOS[@]}"; do
name=$(basename "$repo")
[ "$repo" = "$PAWPRINT_DIR" ] && name="pawprint"
[ "$repo" = "$SOLEPRINT_DIR" ] && name="soleprint"
if [ ! -d "$repo/.git" ]; then
echo "=== $name: not a git repo ==="

View File

@@ -10,16 +10,16 @@ APP_NAME="${1:-all}"
# Load configuration
CTRL_DIR="$(cd "$(dirname "$0")/../.." SCRIPT_DIR="$(cd "$(dirname "$0")" && pwd)"SCRIPT_DIR="$(cd "$(dirname "$0")" && pwd)" pwd)"
source "$CTRL_DIR/.env.pawprint" 2>/dev/null || true
source "$CTRL_DIR/.env.soleprint" 2>/dev/null || true
APP_USER="${SERVER_USER:-mariano}"
PAWPRINT_PATH="${SERVER_PAWPRINT_PATH:-/home/mariano/pawprint}"
SOLEPRINT_PATH="${SERVER_SOLEPRINT_PATH:-/home/mariano/soleprint}"
VENV_BASE="${SERVER_VENV_BASE:-/home/mariano/venvs}"
# Handle all (default)
if [ "$APP_NAME" = "all" ]; then
echo "=== Installing deps for all services ==="
for app in pawprint artery album ward; do
for app in soleprint artery album ward; do
echo ""
echo "--- $app ---"
"$0" "$app"
@@ -31,10 +31,10 @@ fi
VENV_DIR="$VENV_BASE/$APP_NAME"
if [ "$APP_NAME" = "pawprint" ]; then
REQ_FILE="$PAWPRINT_PATH/requirements.txt"
if [ "$APP_NAME" = "soleprint" ]; then
REQ_FILE="$SOLEPRINT_PATH/requirements.txt"
else
REQ_FILE="$PAWPRINT_PATH/$APP_NAME/requirements.txt"
REQ_FILE="$SOLEPRINT_PATH/$APP_NAME/requirements.txt"
fi
if [ ! -f "$REQ_FILE" ]; then

View File

@@ -1,5 +1,5 @@
#!/bin/bash
# Restart pawprint services
# Restart soleprint services
# Usage: ./restart.sh [service]
# Example: ./restart.sh (restarts all services)
# ./restart.sh artery (restarts only artery)
@@ -11,9 +11,9 @@ TARGET="${1:-all}"
# Handle all (default)
if [ "$TARGET" = "all" ]; then
echo "Restarting all services..."
systemctl restart pawprint artery album ward
systemctl restart soleprint artery album ward
echo "Status:"
systemctl status pawprint artery album ward --no-pager | grep -E "●|Active:"
systemctl status soleprint artery album ward --no-pager | grep -E "●|Active:"
exit 0
fi

View File

@@ -1,7 +1,7 @@
#!/bin/bash
# Install/update SSL certificate for a subdomain
# Usage: ./setup-cert.sh <subdomain>
# Example: ./setup-cert.sh pawprint.mcrn.ar
# Example: ./setup-cert.sh soleprint.mcrn.ar
set -e

View File

@@ -12,11 +12,11 @@ APP_MODULE="${3:-main:app}"
APP_USER="mariano"
VENV_DIR="/home/$APP_USER/venvs/$APP_NAME"
# pawprint root is special case
if [ "$APP_NAME" = "pawprint" ]; then
WORK_DIR="/home/$APP_USER/pawprint"
# soleprint root is special case
if [ "$APP_NAME" = "soleprint" ]; then
WORK_DIR="/home/$APP_USER/soleprint"
else
WORK_DIR="/home/$APP_USER/pawprint/$APP_NAME"
WORK_DIR="/home/$APP_USER/soleprint/$APP_NAME"
fi
SERVICE_FILE="/etc/systemd/system/${APP_NAME}.service"
@@ -32,7 +32,7 @@ User=$APP_USER
Group=$APP_USER
WorkingDirectory=$WORK_DIR
Environment="PATH=$VENV_DIR/bin"
EnvironmentFile=$PAWPRINT_PATH/.env
EnvironmentFile=$SOLEPRINT_PATH/.env
ExecStart=$VENV_DIR/bin/uvicorn $APP_MODULE --host 127.0.0.1 --port $PORT
Restart=always
RestartSec=5

View File

@@ -8,7 +8,7 @@ set -e
# Paths
SOURCE_REPO="/home/mariano/wdir/ama/amar_django_back_contracts"
DEST_DIR="/home/mariano/wdir/ama/pawprint/ward/tools/tester/tests"
DEST_DIR="/home/mariano/wdir/ama/soleprint/ward/tools/tester/tests"
# Colors
GREEN='\033[0;32m'
@@ -78,5 +78,5 @@ find "$DEST_DIR" -name "test_*.py" -type f | sed 's|'"$DEST_DIR"'||' | sort
echo
echo -e "${BLUE}Next steps:${NC}"
echo "1. Run tester locally: cd /home/mariano/wdir/ama/pawprint/ward && python -m tools.tester"
echo "2. Deploy to server: cd /home/mariano/wdir/ama/pawprint/deploy && ./deploy.sh"
echo "1. Run tester locally: cd /home/mariano/wdir/ama/soleprint/ward && python -m tools.tester"
echo "2. Deploy to server: cd /home/mariano/wdir/ama/soleprint/deploy && ./deploy.sh"

View File

@@ -13,7 +13,7 @@
# This nginx container will:
# - Listen on port 80
# - Route amarmascotas.local.com to amar frontend/backend
# - Route pawprint.local.com to pawprint services
# - Route soleprint.local.com to soleprint services
services:
nginx:
@@ -30,13 +30,13 @@ services:
- .env
environment:
- DEPLOYMENT_NAME=${DEPLOYMENT_NAME}
- NEST_NAME=${NEST_NAME}
- ROOM_NAME=${ROOM_NAME}
- MANAGED_DOMAIN=${MANAGED_DOMAIN}
- PAWPRINT_DOMAIN=${PAWPRINT_DOMAIN}
- SOLEPRINT_DOMAIN=${SOLEPRINT_DOMAIN}
networks:
- default
depends_on:
- pawprint
- soleprint
restart: unless-stopped
networks: