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