Files
igny8/docs/50-DEPLOYMENT/final-clean-best-deployment-plan/TWO-REPO-ARCHITECTURE.md
2026-01-03 17:28:18 +00:00

4.0 KiB

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/

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