fix: add dynamic config to pages and update Dockerfile for PostgreSQL

This commit is contained in:
2026-03-31 04:17:16 -07:00
parent f0073d1e23
commit 1e5f900821
11 changed files with 38 additions and 43 deletions
+6 -34
View File
@@ -1,6 +1,9 @@
# CasaOS Optimized Docker Compose Configuration # CasaOS Optimized Docker Compose Configuration
# This file is optimized for deployment on CasaOS # This file is optimized for deployment on CasaOS
# Usage: docker-compose -f docker-compose.casaos.yml up -d # Usage: docker-compose -f docker-compose.casaos.yml up -d
#
# IMPORTANT: This configuration requires an external PostgreSQL database.
# Set DATABASE_URL environment variable to your PostgreSQL connection string.
services: services:
app: app:
@@ -11,13 +14,12 @@ services:
ports: ports:
- "3000:3000" - "3000:3000"
environment: environment:
# Database Configuration # Database Configuration (REQUIRED: Set via CasaOS environment variables)
- DATABASE_PROVIDER=postgresql - DATABASE_PROVIDER=postgresql
- DATABASE_URL=postgresql://euchre_camp:euchrepassword@postgresql:5432/euchre_camp - DATABASE_URL=${DATABASE_URL:-postgresql://euchre_camp:password@your-postgres-host:5432/euchre_camp}
- DATABASE_SHADOW_URL=postgresql://euchre_camp:euchrepassword@postgresql:5432/euchre_camp_shadow - DATABASE_SHADOW_URL=${DATABASE_SHADOW_URL:-postgresql://euchre_camp:password@your-postgres-host:5432/euchre_camp_shadow}
# Better Auth Configuration # Better Auth Configuration
# IMPORTANT: Set these via CasaOS environment variables!
- BETTER_AUTH_SECRET=${BETTER_AUTH_SECRET:-change-this-secret-in-production} - BETTER_AUTH_SECRET=${BETTER_AUTH_SECRET:-change-this-secret-in-production}
- BETTER_AUTH_URL=${BETTER_AUTH_URL:-http://localhost:3000} - BETTER_AUTH_URL=${BETTER_AUTH_URL:-http://localhost:3000}
@@ -25,13 +27,8 @@ services:
- NODE_ENV=production - NODE_ENV=production
# Trusted Origins for Better Auth # Trusted Origins for Better Auth
# IMPORTANT: Update this with your CasaOS IP/hostname
- TRUSTED_ORIGINS=${TRUSTED_ORIGINS:-http://localhost:3000,http://127.0.0.1:3000} - TRUSTED_ORIGINS=${TRUSTED_ORIGINS:-http://localhost:3000,http://127.0.0.1:3000}
depends_on:
postgresql:
condition: service_healthy
volumes: volumes:
# Persist uploaded files and static content # Persist uploaded files and static content
- euchre_camp_app_data:/app/public/uploads - euchre_camp_app_data:/app/public/uploads
@@ -41,32 +38,7 @@ services:
networks: networks:
- euchre-network - euchre-network
postgresql:
image: postgres:15-alpine
container_name: euchre-camp-postgres
environment:
- POSTGRES_DB=euchre_camp
- POSTGRES_USER=euchre_camp
# IMPORTANT: Change this password in production!
- POSTGRES_PASSWORD=euchrepassword
ports:
- "5432:5432"
volumes:
- euchre_camp_postgres_data:/var/lib/postgresql/data
- ./scripts/init-postgres.sh:/docker-entrypoint-initdb.d/init-postgres.sh
healthcheck:
test: ["CMD-SHELL", "pg_isready -U euchre_camp -d euchre_camp"]
interval: 10s
timeout: 5s
retries: 5
start_period: 30s
restart: unless-stopped
networks:
- euchre-network
volumes: volumes:
euchre_camp_postgres_data:
driver: local
euchre_camp_app_data: euchre_camp_app_data:
driver: local driver: local
+22 -9
View File
@@ -31,6 +31,9 @@ POSTGRES_PASSWORD=$(openssl rand -base64 16 | tr -d '\n')
echo "✅ Generated BETTER_AUTH_SECRET: $BETTER_AUTH_SECRET" echo "✅ Generated BETTER_AUTH_SECRET: $BETTER_AUTH_SECRET"
echo "✅ Generated POSTGRES_PASSWORD: $POSTGRES_PASSWORD" echo "✅ Generated POSTGRES_PASSWORD: $POSTGRES_PASSWORD"
echo "" echo ""
echo "⚠️ NOTE: The POSTGRES_PASSWORD is for reference only."
echo " You must provide your own PostgreSQL connection string via DATABASE_URL."
echo ""
# Create .env file if it doesn't exist # Create .env file if it doesn't exist
if [ ! -f .env ]; then if [ ! -f .env ]; then
@@ -40,9 +43,10 @@ if [ ! -f .env ]; then
# Generated by setup-casaos.sh # Generated by setup-casaos.sh
# Database Configuration # Database Configuration
# IMPORTANT: Update these with your actual PostgreSQL connection details!
DATABASE_PROVIDER=postgresql DATABASE_PROVIDER=postgresql
DATABASE_URL=postgresql://euchre_camp:${POSTGRES_PASSWORD}@postgresql:5432/euchre_camp DATABASE_URL=postgresql://euchre_camp:${POSTGRES_PASSWORD}@your-postgres-host:5432/euchre_camp
DATABASE_SHADOW_URL=postgresql://euchre_camp:${POSTGRES_PASSWORD}@postgresql:5432/euchre_camp_shadow DATABASE_SHADOW_URL=postgresql://euchre_camp:${POSTGRES_PASSWORD}@your-postgres-host:5432/euchre_camp_shadow
# Better Auth Configuration # Better Auth Configuration
BETTER_AUTH_SECRET=${BETTER_AUTH_SECRET} BETTER_AUTH_SECRET=${BETTER_AUTH_SECRET}
@@ -65,17 +69,26 @@ echo "Setup Complete!"
echo "==========================================" echo "=========================================="
echo "" echo ""
echo "Next steps for CasaOS deployment:" echo "Next steps for CasaOS deployment:"
echo "1. Build the Docker image:" echo ""
echo "1. Set up your PostgreSQL database (external)"
echo " - Create database 'euchre_camp'"
echo " - Create user 'euchre_camp' with password"
echo " - Grant all privileges on euchre_camp database"
echo ""
echo "2. Configure CasaOS environment variables:"
echo " - DATABASE_URL: postgresql://user:pass@host:5432/euchre_camp"
echo " - BETTER_AUTH_SECRET: (generated above)"
echo " - BETTER_AUTH_URL: http://your-casaos-ip:3000"
echo " - TRUSTED_ORIGINS: http://your-casaos-ip:3000"
echo ""
echo "3. Build the Docker image:"
echo " docker-compose -f docker-compose.casaos.yml build" echo " docker-compose -f docker-compose.casaos.yml build"
echo "" echo ""
echo "2. Start the application:" echo "4. Start the application:"
echo " docker-compose -f docker-compose.casaos.yml up -d" echo " docker-compose -f docker-compose.casaos.yml up -d"
echo "" echo ""
echo "3. Access the application at http://localhost:3000" echo "5. Access the application at http://your-casaos-ip:3000"
echo "" echo ""
echo "4. Create admin user:" echo "6. Create admin user:"
echo " docker exec -it euchre-camp node scripts/create-admin-via-api.js" echo " docker exec -it euchre-camp node scripts/create-admin-via-api.js"
echo "" echo ""
echo "Important: Update BETTER_AUTH_URL and TRUSTED_ORIGINS in .env"
echo "with your CasaOS server's IP address or hostname!"
echo ""
+2
View File
@@ -6,6 +6,8 @@ import { getSession } from "@/lib/auth-simple"
import type { Event as EventModel } from "@prisma/client" import type { Event as EventModel } from "@prisma/client"
import { RecalculateEloButton } from "../../components/RecalculateEloButton" import { RecalculateEloButton } from "../../components/RecalculateEloButton"
export const dynamic = "force-dynamic";
export default async function AdminDashboard() { export default async function AdminDashboard() {
console.log('AdminDashboard rendering...') console.log('AdminDashboard rendering...')
const session = await getSession() const session = await getSession()
@@ -1,4 +1,5 @@
import { prisma } from "@/lib/prisma" import { prisma } from "@/lib/prisma"
export const dynamic = "force-dynamic";
import Navigation from "@/components/Navigation" import Navigation from "@/components/Navigation"
import Link from "next/link" import Link from "next/link"
import { notFound, redirect } from "next/navigation" import { notFound, redirect } from "next/navigation"
+1
View File
@@ -1,4 +1,5 @@
import { prisma } from "@/lib/prisma" import { prisma } from "@/lib/prisma"
export const dynamic = "force-dynamic";
import Navigation from "@/components/Navigation" import Navigation from "@/components/Navigation"
import Link from "next/link" import Link from "next/link"
import { notFound, redirect } from "next/navigation" import { notFound, redirect } from "next/navigation"
@@ -1,4 +1,5 @@
import { prisma } from "@/lib/prisma" import { prisma } from "@/lib/prisma"
export const dynamic = "force-dynamic";
import Navigation from "@/components/Navigation" import Navigation from "@/components/Navigation"
import Link from "next/link" import Link from "next/link"
import { notFound, redirect } from "next/navigation" import { notFound, redirect } from "next/navigation"
+1
View File
@@ -1,4 +1,5 @@
import { prisma } from "@/lib/prisma" import { prisma } from "@/lib/prisma"
export const dynamic = "force-dynamic";
import Navigation from "@/components/Navigation" import Navigation from "@/components/Navigation"
import Link from "next/link" import Link from "next/link"
import { getSession } from "@/lib/auth-simple" import { getSession } from "@/lib/auth-simple"
+1
View File
@@ -1,4 +1,5 @@
import { prisma } from "@/lib/prisma"; import { prisma } from "@/lib/prisma";
export const dynamic = "force-dynamic";
import { notFound } from "next/navigation"; import { notFound } from "next/navigation";
import Link from "next/link"; import Link from "next/link";
import Navigation from "@/components/Navigation"; import Navigation from "@/components/Navigation";
+1
View File
@@ -1,4 +1,5 @@
import { prisma } from "@/lib/prisma" import { prisma } from "@/lib/prisma"
export const dynamic = "force-dynamic";
import Navigation from "@/components/Navigation" import Navigation from "@/components/Navigation"
import Link from "next/link" import Link from "next/link"
import { notFound } from "next/navigation" import { notFound } from "next/navigation"
+1
View File
@@ -1,4 +1,5 @@
import { prisma } from "@/lib/prisma" import { prisma } from "@/lib/prisma"
export const dynamic = "force-dynamic";
import Navigation from "@/components/Navigation" import Navigation from "@/components/Navigation"
import Link from "next/link" import Link from "next/link"
import { notFound } from "next/navigation" import { notFound } from "next/navigation"
+1
View File
@@ -1,4 +1,5 @@
import { prisma } from "@/lib/prisma" import { prisma } from "@/lib/prisma"
export const dynamic = "force-dynamic";
import Navigation from "@/components/Navigation" import Navigation from "@/components/Navigation"
import RankingsClient from "./RankingsClient" import RankingsClient from "./RankingsClient"