feat: awsm

This commit is contained in:
2025-10-26 17:05:56 +01:00
parent d6b38fab8c
commit a1d3c33dca
4 changed files with 73 additions and 117 deletions

View File

@@ -29,6 +29,10 @@ envs:
TRACK_DOCKER_IMAGE: ghcr.io/umami-software/umami:postgresql-latest
TRACK_TRAEFIK_HOST: umami.pivoine.art
TRACK_DB_NAME: umami
# AWSM
AWESOME_TRAEFIK_ENABLED: true
AWESOME_COMPOSE_PROJECT_NAME: awesome
AWESOME_TRAEFIK_HOST: awesome.pivoine.art
# Sexy
SEXY_TRAEFIK_ENABLED: true
SEXY_COMPOSE_PROJECT_NAME: sexy

68
awsm/compose.yml Normal file
View File

@@ -0,0 +1,68 @@
services:
# Awesome App - Next.js application for exploring awesome lists
awesome-app:
image: ${AWESOME_IMAGE:-ghcr.io/valknarness/awesome-app:latest}
container_name: ${AWESOME_COMPOSE_PROJECT_NAME:-awesome}_app
restart: unless-stopped
networks:
- compose_network
environment:
# Node
NODE_ENV: production
PORT: 3000
HOSTNAME: 0.0.0.0
# Next.js
NEXT_TELEMETRY_DISABLED: ${NEXT_TELEMETRY_DISABLED:-1}
# Database path
AWESOME_DB_PATH: ${AWESOME_DB_PATH:-/app/awesome.db}
# Optional: Webhook secret for database updates
WEBHOOK_SECRET: ${AWESOME_WEBHOOK_SECRET:-}
# Optional: GitHub token for rate limits
GITHUB_TOKEN: ${AWESOME_GITHUB_TOKEN:-}
# Timezone
TZ: ${TIMEZONE:-UTC}
volumes:
# Mount database directory for persistence
- ${AWESOME_DB_VOLUME:-awesome_data}:/app/data
# Optional: Mount a pre-existing database
# - ./awesome.db:/app/awesome.db:ro
labels:
# Traefik labels for reverse proxy
- 'traefik.enable=${AWESOME_TRAEFIK_ENABLED:-true}'
# HTTP to HTTPS redirect
- 'traefik.http.middlewares.${AWESOME_COMPOSE_PROJECT_NAME:-awesome}-redirect-web-secure.redirectscheme.scheme=https'
- 'traefik.http.routers.${AWESOME_COMPOSE_PROJECT_NAME:-awesome}-web.middlewares=${AWESOME_COMPOSE_PROJECT_NAME:-awesome}-redirect-web-secure'
- 'traefik.http.routers.${AWESOME_COMPOSE_PROJECT_NAME:-awesome}-web.rule=Host(`${AWESOME_TRAEFIK_HOST}`)'
- 'traefik.http.routers.${AWESOME_COMPOSE_PROJECT_NAME:-awesome}-web.entrypoints=web'
# HTTPS configuration
- 'traefik.http.routers.${AWESOME_COMPOSE_PROJECT_NAME:-awesome}-web-secure.rule=Host(`${AWESOME_TRAEFIK_HOST}`)'
- 'traefik.http.routers.${AWESOME_COMPOSE_PROJECT_NAME:-awesome}-web-secure.tls.certresolver=resolver'
- 'traefik.http.routers.${AWESOME_COMPOSE_PROJECT_NAME:-awesome}-web-secure.entrypoints=web-secure'
# Compression middleware
- 'traefik.http.middlewares.${AWESOME_COMPOSE_PROJECT_NAME:-awesome}-compress.compress=true'
- 'traefik.http.routers.${AWESOME_COMPOSE_PROJECT_NAME:-awesome}-web-secure.middlewares=${AWESOME_COMPOSE_PROJECT_NAME:-awesome}-compress'
# Load balancer configuration
- 'traefik.http.services.${AWESOME_COMPOSE_PROJECT_NAME:-awesome}-web-secure.loadbalancer.server.port=3000'
- 'traefik.docker.network=compose_network'
healthcheck:
test: ["CMD", "wget", "--no-verbose", "--tries=1", "--spider", "http://localhost:3000/api/stats"]
interval: 30s
timeout: 10s
retries: 3
start_period: 40s
volumes:
awesome_data:
name: ${AWESOME_COMPOSE_PROJECT_NAME:-awesome}_data

View File

@@ -1,6 +1,7 @@
name: falcon
include:
- core/compose.yaml
- awsm/compose.yaml
- sexy/compose.yaml
- gotify/compose.yaml
- track/compose.yaml

View File

@@ -1,117 +0,0 @@
# ============================================================================
# Production Environment Variables for sexy.pivoine.art
# ============================================================================
# Copy this file to .env and fill in your values
# Usage: docker compose -f compose.yaml up -d
# ============================================================================
# Project Configuration
# ============================================================================
SEXY_COMPOSE_PROJECT_NAME=sexy
CORE_COMPOSE_PROJECT_NAME=core
NETWORK_NAME=compose_network
TIMEZONE=Europe/Amsterdam
# ============================================================================
# External Database Configuration (from compose_network)
# ============================================================================
CORE_DB_HOST=postgres
CORE_DB_PORT=5432
SEXY_DB_NAME=sexy
DB_USER=sexy
DB_PASSWORD=your-database-password-here
# ============================================================================
# External Redis Configuration (from compose_network)
# ============================================================================
CORE_REDIS_HOST=redis
CORE_REDIS_PORT=6379
# ============================================================================
# Directus Configuration
# ============================================================================
SEXY_DIRECTUS_IMAGE=directus/directus:11
SEXY_DIRECTUS_SECRET=your-32-char-random-secret-here-min-32-characters
ADMIN_EMAIL=admin@sexy.pivoine.art
ADMIN_PASSWORD=your-admin-password-here
# Directus public URL (accessible via Traefik)
SEXY_PUBLIC_URL=https://sexy.pivoine.art
# Uploads and bundle paths (use named volumes or host paths)
SEXY_DIRECTUS_UPLOADS=directus_uploads
SEXY_DIRECTUS_BUNDLE=directus_bundle
# ============================================================================
# Cache Configuration
# ============================================================================
SEXY_CACHE_ENABLED=true
SEXY_CACHE_AUTO_PURGE=true
# ============================================================================
# CORS Configuration
# ============================================================================
SEXY_CORS_ENABLED=true
SEXY_CORS_ORIGIN=https://sexy.pivoine.art
# ============================================================================
# Security (Production)
# ============================================================================
SEXY_SESSION_COOKIE_SECURE=true
SEXY_SESSION_COOKIE_SAME_SITE=strict
SEXY_SESSION_COOKIE_DOMAIN=.pivoine.art
# ============================================================================
# Extensions
# ============================================================================
SEXY_EXTENSIONS_PATH=/directus/extensions
SEXY_EXTENSIONS_AUTO_RELOAD=false
# ============================================================================
# WebSockets
# ============================================================================
SEXY_WEBSOCKETS_ENABLED=true
# ============================================================================
# Email Configuration (Production SMTP)
# ============================================================================
EMAIL_TRANSPORT=smtp
EMAIL_FROM=noreply@sexy.pivoine.art
EMAIL_SMTP_HOST=smtp.example.com
EMAIL_SMTP_PORT=587
EMAIL_SMTP_USER=your-email@example.com
EMAIL_SMTP_PASSWORD=your-smtp-password
# ============================================================================
# User URLs
# ============================================================================
SEXY_USER_REGISTER_URL_ALLOW_LIST=https://sexy.pivoine.art/signup/verify
SEXY_PASSWORD_RESET_URL_ALLOW_LIST=https://sexy.pivoine.art/password/reset
# ============================================================================
# Content Security Policy
# ============================================================================
SEXY_CONTENT_SECURITY_POLICY_DIRECTIVES__FRAME_SRC=
# ============================================================================
# Frontend Configuration
# ============================================================================
SEXY_FRONTEND_IMAGE=ghcr.io/valknarxxx/sexy:latest
# IMPORTANT: These PUBLIC_* variables are BAKED INTO THE BUILD
# They cannot be changed at runtime! If you need different values,
# you must rebuild the image with the correct values.
SEXY_FRONTEND_PUBLIC_API_URL=https://sexy.pivoine.art/api
SEXY_FRONTEND_PUBLIC_URL=https://sexy.pivoine.art
SEXY_FRONTEND_PUBLIC_UMAMI_ID=
# Optional: Letterspace integration (also baked into build)
SEXY_FRONTEND_LETTERSPACE_API_URL=
SEXY_FRONTEND_LETTERSPACE_API_KEY=
SEXY_FRONTEND_LETTERSPACE_LIST_ID=
# ============================================================================
# Traefik Configuration
# ============================================================================
SEXY_TRAEFIK_ENABLED=true
SEXY_TRAEFIK_HOST=sexy.pivoine.art