# Two-Repository Architecture

**Purpose:** Separate tech stack infrastructure from custom application code for easy server migration and deployment.

---

## Overview

Instead of one monolithic repository, split into two:

| Repository | Contains | Changes | Deployment |
|------------|----------|---------|------------|
| `igny8-stack` | Docker, configs, dependencies | Rarely | Clone once per server |
| `igny8-app` | Your custom business logic | Frequently | Copy to deploy |

---

## Why This Architecture?

### Current Problem
- Everything mixed together (Dockerfiles, configs, your code)
- To deploy to new server, must copy everything
- Hard to distinguish "what's mine" vs "what's framework"

### Solution Benefits
- **Clean separation**: Stack vs App code
- **Easy migration**: Just copy app folder after stack is installed
- **Version independence**: Update stack without touching app
- **Reusable stack**: Same stack can run different apps on different servers

---

## How It Works

### Server Structure After Setup

```
/data/
├── stack/
│   └── igny8-stack/          # Cloned from stack repo (read-only)
│
├── app/
│   └── igny8/                # Your app code + symlinks to stack
│       ├── backend/
│       │   ├── Dockerfile        → symlink to stack
│       │   ├── requirements.txt  → symlink to stack
│       │   ├── manage.py         → symlink to stack
│       │   └── igny8_core/       # YOUR CODE
│       │
│       └── frontend/
│           ├── package.json      → symlink to stack
│           ├── vite.config.ts    → symlink to stack
│           └── src/              # YOUR CODE
│
└── logs/
```

### Symlinks Explained

The `install.sh` script creates symbolic links from your app folder to the stack folder. This means:
- Stack files (Dockerfile, package.json, etc.) live in one place
- Your app folder references them via symlinks
- Docker sees a complete project structure
- You only manage your custom code

---

## Migration Workflow

### On New Server

```
Step 1: Install Stack (one-time)
────────────────────────────────
cd /data/stack
git clone https://your-repo/igny8-stack.git
cd igny8-stack
./install.sh

Step 2: Deploy Your App
────────────────────────────────
cd /data/app
git clone https://your-repo/igny8-app.git igny8
# OR: rsync/scp from old server

Step 3: Configure
────────────────────────────────
cp .env.example .env
nano .env  # Set secrets, domains

Step 4: Start
────────────────────────────────
docker compose -f docker-compose.app.yml up -d
```

### Updating Existing Server

**Update app code only:**
```
cd /data/app/igny8
git pull
docker compose restart
```

**Update stack (rare):**
```
cd /data/stack/igny8-stack
git pull
./scripts/build-images.sh
docker compose -f /data/app/igny8/docker-compose.app.yml up -d
```

---

## What Goes Where?

### Stack Repo (igny8-stack)

Things that are **same for any Django+React app**:
- Dockerfiles
- Base requirements.txt / package.json
- Vite config, TypeScript config
- Docker compose templates
- Caddy config templates
- Utility scripts

### App Repo (igny8-app)

Things that are **specific to your application**:
- Django app code (models, views, serializers, business logic)
- React components, pages, stores
- App-specific static assets
- Documentation
- Environment config templates

---

## Key Principle

> If you deleted your app code and replaced it with a different Django+React app,
> would this file still make sense?
> - YES → Stack repo
> - NO → App repo

---

## Related Documentation

- [INFRASTRUCTURE-STACK.md](INFRASTRUCTURE-STACK.md) - Complete stack repo structure
- [IGNY8-APP-STRUCTURE.md](IGNY8-APP-STRUCTURE.md) - App repo structure
