Ad interactions (reactions/comments/reposts on ads): - Schema: AdReaction, AdComment, AdRepost models with RLS enabled - tRPC: new ads router (getFeedData, toggleReaction, addComment, listComments, toggleRepost) - AdCard: fully interactive card with paw, comment sheet, repost — mirrors PostCard style - getActiveAds includes _count for advertiser engagement metrics Invite system enforcement: - proxy.ts: /sign-up blocked without pf_invite cookie - INVITE_REQUIRED=false env var disables gate for post-beta live launch - Full invite flow: /join → cookie → /sign-up → consume-invite → 3 codes issued to new user - Admin: listInviteCodes, createRootInvite, revokeInvite procedures Sidebar mini-footer: - Impressum + Datenschutz links always visible at sidebar bottom - PawFeed Alpha-Test copyright line Docker self-hosting: - docker/Dockerfile: 3-stage build using Next.js standalone output - docker/docker-compose.yml: env_file + build-args for NEXT_PUBLIC_ vars - .dockerignore at project root - next.config.ts: output standalone for minimal image - .env.example: documented INVITE_REQUIRED
37 lines
2.4 KiB
Bash
37 lines
2.4 KiB
Bash
# ============================================================
|
|
# OnlyPets — Environment Variables
|
|
# Copy this file to .env.local and fill in your values.
|
|
# NEVER commit .env.local to version control.
|
|
# ============================================================
|
|
|
|
# ── Supabase (PostgreSQL) ────────────────────────────────────
|
|
# Supabase Dashboard -> Project Settings -> Database -> Connection string
|
|
# Use the POOLED connection string for DATABASE_URL (port 6543, ?pgbouncer=true)
|
|
# Use the DIRECT connection string for DIRECT_URL (port 5432)
|
|
DATABASE_URL="postgresql://postgres.xxxxxxxxxxxx:password@aws-0-eu-central-1.pooler.supabase.com:6543/postgres?pgbouncer=true"
|
|
DIRECT_URL="postgresql://postgres.xxxxxxxxxxxx:password@aws-0-eu-central-1.pooler.supabase.com:5432/postgres"
|
|
|
|
# ── Clerk (Authentication) ───────────────────────────────────
|
|
# Clerk Dashboard -> API Keys
|
|
NEXT_PUBLIC_CLERK_PUBLISHABLE_KEY="pk_test_xxxxxxxxxxxxxxxxxxxx"
|
|
CLERK_SECRET_KEY="sk_test_xxxxxxxxxxxxxxxxxxxx"
|
|
|
|
# ── Supabase Storage (Media) ─────────────────────────────────
|
|
# Supabase Dashboard -> Project Settings -> API -> Project URL
|
|
NEXT_PUBLIC_SUPABASE_URL="https://xxxxxxxxxxxxxxxxxxxx.supabase.co"
|
|
# Supabase Dashboard -> Project Settings -> API -> service_role (secret!)
|
|
SUPABASE_SERVICE_ROLE_KEY="eyJxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx"
|
|
|
|
# ── Admin Panel ───────────────────────────────────────────────
|
|
# NEVER use NEXT_PUBLIC_ prefix — these MUST stay server-only!
|
|
# ADMIN_SECRET: random UUID path segment (/p/[secret]/) — generate with:
|
|
# node -e "console.log(require('crypto').randomUUID())"
|
|
ADMIN_SECRET="your-random-uuid-here"
|
|
# ADMIN_OWNER_ID: Your Clerk user ID (Clerk dashboard). Bootstraps the super-admin.
|
|
ADMIN_OWNER_ID="user_xxxxxxxxxxxxxxxxxxxx"
|
|
|
|
# ── Invite Gate ───────────────────────────────────────────────
|
|
# Set to "false" to disable the invite requirement after the Alpha/Beta phase.
|
|
# Default: "true" (invite required — enforced in proxy.ts)
|
|
INVITE_REQUIRED="true"
|