Initial commit
This commit is contained in:
19
.env.example
Normal file
19
.env.example
Normal file
@@ -0,0 +1,19 @@
|
||||
# Portfolio Infrastructure - Environment Configuration
|
||||
# Copy this to .env and fill in your values
|
||||
|
||||
# Database Configuration
|
||||
DB_USER=directus
|
||||
DB_PASSWORD=your_secure_database_password_here
|
||||
|
||||
# Directus Admin Account
|
||||
ADMIN_EMAIL=your_email@example.com
|
||||
ADMIN_PASSWORD=your_secure_admin_password_here
|
||||
|
||||
# Directus Security Keys (generate with: openssl rand -base64 32)
|
||||
DIRECTUS_KEY=your_directus_key_here
|
||||
DIRECTUS_SECRET=your_directus_secret_here
|
||||
|
||||
# Public URL
|
||||
# For local: http://localhost:8055
|
||||
# For Coolify: https://directus.yourdomain.com
|
||||
PUBLIC_URL=http://localhost:8055
|
||||
40
.gitignore
vendored
Normal file
40
.gitignore
vendored
Normal file
@@ -0,0 +1,40 @@
|
||||
# Environment files with sensitive data
|
||||
.env
|
||||
.env.local
|
||||
.env.production
|
||||
|
||||
# Database backups and dumps (contain real data)
|
||||
*.sql
|
||||
database/*.sql
|
||||
!database/schema/
|
||||
|
||||
# Uploads (user-generated content)
|
||||
uploads/*
|
||||
!uploads/.gitkeep
|
||||
|
||||
# Extensions (if they contain sensitive config)
|
||||
extensions/*
|
||||
!extensions/.gitkeep
|
||||
|
||||
# Docker volumes
|
||||
postgres_data/
|
||||
directus_uploads/
|
||||
directus_extensions/
|
||||
|
||||
# Logs
|
||||
*.log
|
||||
logs/
|
||||
|
||||
# OS files
|
||||
.DS_Store
|
||||
Thumbs.db
|
||||
|
||||
# IDE
|
||||
.vscode/
|
||||
.idea/
|
||||
*.swp
|
||||
*.swo
|
||||
|
||||
# Temporary files
|
||||
*.tmp
|
||||
.cache/
|
||||
216
README.md
Normal file
216
README.md
Normal file
@@ -0,0 +1,216 @@
|
||||
# Portfolio Infrastructure - Directus CMS
|
||||
|
||||
Shared infrastructure providing CMS and API services for all portfolio demos.
|
||||
|
||||
## Purpose
|
||||
|
||||
This repository contains the **infrastructure layer** for the portfolio platform:
|
||||
- **Directus CMS**: Content management and API
|
||||
- **PostgreSQL**: Database backend
|
||||
|
||||
This is deployed **once** and provides services to multiple demo applications.
|
||||
|
||||
## Architecture
|
||||
|
||||
```
|
||||
┌─────────────────────────────────────┐
|
||||
│ Portfolio Infrastructure │
|
||||
│ Domain: directus.b28.dev │
|
||||
├─────────────────────────────────────┤
|
||||
│ ┌──────────────┐ ┌─────────────┐ │
|
||||
│ │ Directus │──│ PostgreSQL │ │
|
||||
│ │ CMS/API │ │ Database │ │
|
||||
│ └──────────────┘ └─────────────┘ │
|
||||
└─────────────────────────────────────┘
|
||||
│
|
||||
│ (consumed by demos)
|
||||
▼
|
||||
Demo Applications
|
||||
├─ portfolio-site
|
||||
├─ hackathon-project-1
|
||||
└─ hackathon-project-2
|
||||
```
|
||||
|
||||
## Directus Collections
|
||||
|
||||
### Core Collections
|
||||
- **profile**: Personal information (name, bio, etc.)
|
||||
- **skills**: Technical skills and proficiencies
|
||||
- **social_links**: Social media and contact links
|
||||
- **posts**: Blog posts
|
||||
- **work_projects**: Portfolio work items
|
||||
|
||||
### Demo Registry
|
||||
- **demos**: Catalog of all live demos
|
||||
- name, description, tech_stack
|
||||
- repo_url, live_url
|
||||
- thumbnail, category
|
||||
- built_at, is_featured
|
||||
|
||||
## Quick Start
|
||||
|
||||
### Local Development
|
||||
|
||||
1. **Copy environment file**:
|
||||
```bash
|
||||
cp .env.example .env
|
||||
```
|
||||
|
||||
2. **Edit .env** with your values:
|
||||
```bash
|
||||
# Generate secure keys
|
||||
openssl rand -base64 32 # for DIRECTUS_KEY
|
||||
openssl rand -base64 32 # for DIRECTUS_SECRET
|
||||
```
|
||||
|
||||
3. **Start services**:
|
||||
```bash
|
||||
docker compose up -d
|
||||
```
|
||||
|
||||
4. **Access Directus**:
|
||||
- URL: http://localhost:8055
|
||||
- Email: (from ADMIN_EMAIL in .env)
|
||||
- Password: (from ADMIN_PASSWORD in .env)
|
||||
|
||||
### Coolify Deployment
|
||||
|
||||
1. **Create new resource** in Coolify
|
||||
- Type: Docker Compose
|
||||
- Source: Git repository (this repo)
|
||||
|
||||
2. **Set environment variables** in Coolify:
|
||||
- `DB_PASSWORD`: Secure database password
|
||||
- `ADMIN_EMAIL`: Your admin email
|
||||
- `ADMIN_PASSWORD`: Secure admin password
|
||||
- `DIRECTUS_KEY`: Generated key
|
||||
- `DIRECTUS_SECRET`: Generated secret
|
||||
- `PUBLIC_URL`: `https://directus.b28.dev`
|
||||
|
||||
3. **Configure domain**:
|
||||
- Domain: `directus.b28.dev`
|
||||
- Coolify handles SSL/TLS automatically
|
||||
|
||||
4. **Deploy**
|
||||
|
||||
## Database Setup
|
||||
|
||||
The database is initialized from `database/init.sql` on first run. This includes:
|
||||
- Schema definition (tables, relationships)
|
||||
- Initial collections setup
|
||||
- Sample data (optional)
|
||||
|
||||
### Backup Database
|
||||
|
||||
```bash
|
||||
docker compose exec postgres pg_dump -U directus directus > backup_$(date +%Y%m%d).sql
|
||||
```
|
||||
|
||||
### Restore Database
|
||||
|
||||
```bash
|
||||
docker compose exec -T postgres psql -U directus directus < backup.sql
|
||||
```
|
||||
|
||||
## Adding New Collections
|
||||
|
||||
1. Access Directus admin UI
|
||||
2. Navigate to Settings → Data Model
|
||||
3. Create new collection
|
||||
4. Define fields and relationships
|
||||
5. Set permissions
|
||||
|
||||
Collections are stored in PostgreSQL and persist across restarts.
|
||||
|
||||
## Connecting Demos
|
||||
|
||||
Demo applications connect to this infrastructure via environment variable:
|
||||
|
||||
```yaml
|
||||
# In demo's docker-compose.yml
|
||||
environment:
|
||||
DIRECTUS_URL: https://directus.b28.dev
|
||||
```
|
||||
|
||||
## API Access
|
||||
|
||||
Directus provides a REST API at:
|
||||
```
|
||||
https://directus.b28.dev/items/{collection}
|
||||
```
|
||||
|
||||
Example endpoints:
|
||||
- `GET /items/posts` - List all posts
|
||||
- `GET /items/demos?filter[is_featured][_eq]=true` - Featured demos
|
||||
- `GET /items/profile` - Profile data
|
||||
|
||||
See [Directus API docs](https://docs.directus.io/reference/introduction.html) for full reference.
|
||||
|
||||
## Maintenance
|
||||
|
||||
### Update Directus
|
||||
|
||||
```bash
|
||||
docker compose pull directus
|
||||
docker compose up -d directus
|
||||
```
|
||||
|
||||
### View Logs
|
||||
|
||||
```bash
|
||||
docker compose logs -f directus
|
||||
docker compose logs -f postgres
|
||||
```
|
||||
|
||||
### Restart Services
|
||||
|
||||
```bash
|
||||
docker compose restart
|
||||
```
|
||||
|
||||
## Security Notes
|
||||
|
||||
- **Never commit .env files** - they contain secrets
|
||||
- **Database backups may contain PII** - handle carefully
|
||||
- **Use strong passwords** for admin and database
|
||||
- **Rotate keys periodically** (DIRECTUS_KEY, DIRECTUS_SECRET)
|
||||
|
||||
## Troubleshooting
|
||||
|
||||
### Directus won't start
|
||||
|
||||
```bash
|
||||
# Check PostgreSQL is healthy
|
||||
docker compose ps postgres
|
||||
|
||||
# Check logs
|
||||
docker compose logs directus
|
||||
|
||||
# Verify environment variables
|
||||
docker compose exec directus env | grep DB_
|
||||
```
|
||||
|
||||
### Can't access Directus UI
|
||||
|
||||
1. Check service is running: `docker compose ps`
|
||||
2. Verify health check: `docker compose exec directus wget -O- http://localhost:8055/server/health`
|
||||
3. Check Coolify domain configuration
|
||||
|
||||
### Database connection issues
|
||||
|
||||
```bash
|
||||
# Test PostgreSQL connection
|
||||
docker compose exec postgres psql -U directus -d directus -c "SELECT 1;"
|
||||
|
||||
# Check database exists
|
||||
docker compose exec postgres psql -U directus -l
|
||||
```
|
||||
|
||||
## License
|
||||
|
||||
This infrastructure is for personal portfolio use.
|
||||
|
||||
## Related Repositories
|
||||
|
||||
- [demo-portfolio-site](../demos/portfolio-site) - Main portfolio website
|
||||
- (Other demo repositories as they're created)
|
||||
89
docker-compose.yml
Normal file
89
docker-compose.yml
Normal file
@@ -0,0 +1,89 @@
|
||||
# Portfolio Infrastructure - Directus CMS
|
||||
# Shared infrastructure for all portfolio demos
|
||||
|
||||
services:
|
||||
# PostgreSQL Database for Directus
|
||||
postgres:
|
||||
image: postgres:15-alpine
|
||||
restart: unless-stopped
|
||||
|
||||
environment:
|
||||
POSTGRES_DB: directus
|
||||
POSTGRES_USER: ${DB_USER:-directus}
|
||||
POSTGRES_PASSWORD: ${DB_PASSWORD}
|
||||
|
||||
volumes:
|
||||
- postgres_data:/var/lib/postgresql/data
|
||||
- ./database/init.sql:/docker-entrypoint-initdb.d/init.sql:ro
|
||||
|
||||
healthcheck:
|
||||
test: ["CMD-SHELL", "pg_isready -U ${DB_USER:-directus}"]
|
||||
interval: 10s
|
||||
timeout: 5s
|
||||
retries: 5
|
||||
|
||||
networks:
|
||||
- directus
|
||||
|
||||
# Directus CMS
|
||||
directus:
|
||||
image: directus/directus:latest
|
||||
restart: unless-stopped
|
||||
|
||||
depends_on:
|
||||
postgres:
|
||||
condition: service_healthy
|
||||
|
||||
environment:
|
||||
# Database
|
||||
DB_CLIENT: pg
|
||||
DB_HOST: postgres
|
||||
DB_PORT: 5432
|
||||
DB_DATABASE: directus
|
||||
DB_USER: ${DB_USER:-directus}
|
||||
DB_PASSWORD: ${DB_PASSWORD}
|
||||
|
||||
# Admin account
|
||||
ADMIN_EMAIL: ${ADMIN_EMAIL}
|
||||
ADMIN_PASSWORD: ${ADMIN_PASSWORD}
|
||||
|
||||
# Security
|
||||
KEY: ${DIRECTUS_KEY}
|
||||
SECRET: ${DIRECTUS_SECRET}
|
||||
|
||||
# Public URL - update for your deployment
|
||||
PUBLIC_URL: ${PUBLIC_URL:-http://localhost:8055}
|
||||
|
||||
# CORS - allow all origins for demo purposes
|
||||
CORS_ENABLED: "true"
|
||||
CORS_ORIGIN: "true"
|
||||
|
||||
volumes:
|
||||
- directus_uploads:/directus/uploads
|
||||
- directus_extensions:/directus/extensions
|
||||
|
||||
expose:
|
||||
- "8055"
|
||||
|
||||
healthcheck:
|
||||
test: ["CMD", "wget", "--no-verbose", "--tries=1", "--spider", "http://127.0.0.1:8055/server/health"]
|
||||
interval: 30s
|
||||
timeout: 10s
|
||||
retries: 3
|
||||
start_period: 40s
|
||||
|
||||
networks:
|
||||
- directus
|
||||
|
||||
volumes:
|
||||
postgres_data:
|
||||
name: directus_postgres_data
|
||||
directus_uploads:
|
||||
name: directus_uploads
|
||||
directus_extensions:
|
||||
name: directus_extensions
|
||||
|
||||
networks:
|
||||
directus:
|
||||
name: directus
|
||||
external: false
|
||||
0
uploads/.gitkeep
Normal file
0
uploads/.gitkeep
Normal file
Reference in New Issue
Block a user