diff --git a/arty.yml b/arty.yml index 0050797..e4472a5 100644 --- a/arty.yml +++ b/arty.yml @@ -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 diff --git a/awsm/compose.yml b/awsm/compose.yml new file mode 100644 index 0000000..e4b3476 --- /dev/null +++ b/awsm/compose.yml @@ -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 diff --git a/compose.yaml b/compose.yaml index f187d07..73608b7 100644 --- a/compose.yaml +++ b/compose.yaml @@ -1,6 +1,7 @@ name: falcon include: - core/compose.yaml + - awsm/compose.yaml - sexy/compose.yaml - gotify/compose.yaml - track/compose.yaml diff --git a/sexy/.env.example b/sexy/.env.example deleted file mode 100644 index 416acb6..0000000 --- a/sexy/.env.example +++ /dev/null @@ -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