220 lines
7.1 KiB
Markdown
220 lines
7.1 KiB
Markdown
# Infrastructure Stack Repository
|
|
|
|
**Repository Name:** `igny8-stack`
|
|
**Purpose:** Reusable tech stack for Django + React applications
|
|
|
|
---
|
|
|
|
## Complete Folder Structure
|
|
|
|
```
|
|
igny8-stack/
|
|
│
|
|
├── README.md # Stack overview and quick start
|
|
├── install.sh # Main installation script
|
|
├── uninstall.sh # Cleanup script
|
|
│
|
|
├── config/
|
|
│ ├── .env.example # Environment variables template
|
|
│ │
|
|
│ └── caddy/
|
|
│ └── Caddyfile # Reverse proxy configuration
|
|
│
|
|
├── docker/
|
|
│ ├── docker-compose.infra.yml # Shared services (Postgres, Redis, Caddy)
|
|
│ └── docker-compose.app.yml # App services template
|
|
│
|
|
├── backend/
|
|
│ ├── Dockerfile # Python 3.11 slim + dependencies
|
|
│ ├── requirements.txt # Django, DRF, Celery, Gunicorn, etc.
|
|
│ ├── manage.py # Django CLI entry point
|
|
│ ├── container_startup.sh # Container entrypoint script
|
|
│ └── create_groups.py # Initial permission groups setup
|
|
│
|
|
├── frontend/
|
|
│ ├── Dockerfile.dev # Vite dev server with HMR
|
|
│ ├── Dockerfile.prod # Production build with Caddy
|
|
│ ├── Dockerfile.marketing.dev # Marketing site dev server
|
|
│ ├── package.json # React, Vite, Tailwind, Zustand, etc.
|
|
│ ├── package-lock.json # Locked dependency versions
|
|
│ ├── vite.config.ts # Vite configuration
|
|
│ ├── tsconfig.json # TypeScript base config
|
|
│ ├── tsconfig.app.json # App TypeScript config
|
|
│ ├── tsconfig.node.json # Node TypeScript config
|
|
│ ├── postcss.config.js # PostCSS for Tailwind
|
|
│ ├── eslint.config.js # ESLint rules
|
|
│ ├── index.html # Main app HTML template
|
|
│ └── marketing.html # Marketing site HTML template
|
|
│
|
|
└── scripts/
|
|
├── build-images.sh # Build all Docker images
|
|
├── migrate.sh # Run Django migrations
|
|
├── backup-db.sh # Database backup utility
|
|
├── restore-db.sh # Database restore utility
|
|
└── health-check.sh # System health check
|
|
```
|
|
|
|
---
|
|
|
|
## File Purposes
|
|
|
|
### Root Files
|
|
|
|
| File | Purpose |
|
|
|------|---------|
|
|
| `install.sh` | Creates directories, symlinks, builds images, sets up network |
|
|
| `uninstall.sh` | Removes symlinks and cleans up (keeps data) |
|
|
|
|
### Config Folder
|
|
|
|
| File | Purpose |
|
|
|------|---------|
|
|
| `.env.example` | Template for environment variables (DB passwords, secrets, domains) |
|
|
| `caddy/Caddyfile` | Routes domains to containers, handles SSL, WebSocket proxying |
|
|
|
|
### Docker Folder
|
|
|
|
| File | Purpose |
|
|
|------|---------|
|
|
| `docker-compose.infra.yml` | Postgres, Redis, Caddy, PgAdmin, FileBrowser, Portainer |
|
|
| `docker-compose.app.yml` | Backend, Frontend, Celery Worker, Celery Beat, Flower |
|
|
|
|
### Backend Folder
|
|
|
|
| File | Purpose |
|
|
|------|---------|
|
|
| `Dockerfile` | Python 3.11 slim, installs requirements, runs Gunicorn |
|
|
| `requirements.txt` | All Python dependencies (Django 5.x, DRF, Celery, etc.) |
|
|
| `manage.py` | Django management command entry point |
|
|
| `container_startup.sh` | Logs startup, runs migrations if needed |
|
|
| `create_groups.py` | Creates initial Django permission groups |
|
|
|
|
### Frontend Folder
|
|
|
|
| File | Purpose |
|
|
|------|---------|
|
|
| `Dockerfile.dev` | Node 18, Vite dev server with hot reload |
|
|
| `Dockerfile.prod` | Multi-stage build, Caddy serves static files |
|
|
| `Dockerfile.marketing.dev` | Marketing site dev server (port 5174) |
|
|
| `package.json` | All npm dependencies |
|
|
| `vite.config.ts` | Build config, HMR settings, code splitting |
|
|
| `tsconfig*.json` | TypeScript compiler settings |
|
|
| `postcss.config.js` | Tailwind CSS processing |
|
|
| `eslint.config.js` | Code linting rules |
|
|
| `index.html` | Main app entry HTML |
|
|
| `marketing.html` | Marketing site entry HTML |
|
|
|
|
### Scripts Folder
|
|
|
|
| Script | Purpose |
|
|
|--------|---------|
|
|
| `build-images.sh` | Builds all Docker images with proper tags |
|
|
| `migrate.sh` | Runs Django migrations inside container |
|
|
| `backup-db.sh` | Dumps PostgreSQL database to backup file |
|
|
| `restore-db.sh` | Restores database from backup file |
|
|
| `health-check.sh` | Checks all services are running |
|
|
|
|
---
|
|
|
|
## New Server Installation
|
|
|
|
### Prerequisites
|
|
- Ubuntu 22.04+ or Debian 12+
|
|
- Docker and Docker Compose installed
|
|
- Git installed
|
|
- Domain DNS pointing to server IP
|
|
|
|
### Step-by-Step Installation
|
|
|
|
```
|
|
1. Create directories
|
|
mkdir -p /data/stack /data/app /data/logs
|
|
|
|
2. Clone stack repository
|
|
cd /data/stack
|
|
git clone https://github.com/yourorg/igny8-stack.git
|
|
|
|
3. Run installation script
|
|
cd igny8-stack
|
|
chmod +x install.sh
|
|
./install.sh
|
|
|
|
4. Verify installation
|
|
docker images # Should show app-backend, app-frontend images
|
|
docker network ls # Should show igny8_net
|
|
ls -la /data/app/ # Should show prepared structure
|
|
```
|
|
|
|
### What install.sh Does
|
|
|
|
1. Creates Docker network (`igny8_net`)
|
|
2. Creates directory structure under `/data/app/`
|
|
3. Builds Docker images:
|
|
- `app-backend:latest`
|
|
- `app-frontend-dev:latest`
|
|
- `app-marketing-dev:latest`
|
|
4. Starts infrastructure services (Postgres, Redis, Caddy)
|
|
5. Creates symlinks for app folder structure
|
|
6. Prints next steps
|
|
|
|
---
|
|
|
|
## Updating Stack on Existing Server
|
|
|
|
```
|
|
1. Pull latest changes
|
|
cd /data/stack/igny8-stack
|
|
git pull
|
|
|
|
2. Rebuild images if Dockerfile changed
|
|
./scripts/build-images.sh
|
|
|
|
3. Restart containers to use new images
|
|
cd /data/app/igny8
|
|
docker compose -f docker-compose.app.yml down
|
|
docker compose -f docker-compose.app.yml up -d
|
|
|
|
4. Verify
|
|
docker ps
|
|
./scripts/health-check.sh
|
|
```
|
|
|
|
---
|
|
|
|
## Customizing for Different Apps
|
|
|
|
The stack is designed to run any Django + React application. To use it for a different app (not igny8):
|
|
|
|
1. Clone stack to new server
|
|
2. Run `install.sh`
|
|
3. Clone your app repo to `/data/app/yourapp/`
|
|
4. Update `.env` with your app's settings
|
|
5. Update Caddyfile with your domains
|
|
6. Start containers
|
|
|
|
The stack doesn't contain any igny8-specific logic - it's a generic Django+React runtime environment.
|
|
|
|
---
|
|
|
|
## Environment Variables
|
|
|
|
Key variables to set in `.env`:
|
|
|
|
| Variable | Purpose | Example |
|
|
|----------|---------|---------|
|
|
| `DB_HOST` | PostgreSQL host | `postgres` |
|
|
| `DB_NAME` | Database name | `igny8_db` |
|
|
| `DB_USER` | Database user | `igny8` |
|
|
| `DB_PASSWORD` | Database password | `secure_password` |
|
|
| `REDIS_HOST` | Redis host | `redis` |
|
|
| `SECRET_KEY` | Django secret key | `random_50_char_string` |
|
|
| `DOMAIN` | Primary domain | `igny8.com` |
|
|
| `DEBUG` | Debug mode | `False` |
|
|
|
|
---
|
|
|
|
## Related Documentation
|
|
|
|
- [TWO-REPO-ARCHITECTURE.md](TWO-REPO-ARCHITECTURE.md) - Why two repos
|
|
- [IGNY8-APP-STRUCTURE.md](IGNY8-APP-STRUCTURE.md) - App-specific code structure
|