klasslistan
0 forks
Digital klasslista för föräldrar. Next.js, PostgreSQL, Better Auth. Self-hosted.
id: 42
125,214 Lines
  • JSON 74.9%
  • TypeScript-JSX 11.5%
  • Yaml 6.4%
  • TypeScript 5.9%
  • Markdown 0.5%
  • CSS 0.4%
  • SQL 0.3%
  • Python 0.1%
  • JavaScript 0.1%
  • Shell 0%
  • XML 0%
README.md

Klasslistan

En frivillig digital klasslista för föräldrar och vårdnadshavare i svenska förskolor och skolor.

Om projektet

Klasslistan gör det enkelt för föräldrar att hitta och kontakta andra föräldrar i samma grupp. Användare registrerar sig själva, lägger till sina barn och väljer vilka kontaktuppgifter de vill dela.

Huvudfunktioner:

  • Klasslistor med kontaktuppgifter
  • QR-kod/länk för att bjuda in andra föräldrar
  • Valfria aktiviteter (kalas, lekdejter)
  • Push-notiser (valfritt)
  • Stöd för ljust/mörkt tema

Tech Stack

  • Frontend/Backend: Next.js 15 (App Router)
  • Språk: TypeScript
  • Styling: Tailwind CSS v4, shadcn/ui
  • Databas: PostgreSQL 16
  • ORM: Drizzle
  • Auth: Better Auth
  • Deploy: Docker + Traefik

Utveckling

Förutsättningar

  • Node.js 22+
  • PostgreSQL 16 (eller Docker)

Kom igång

# Installera dependencies
npm install

# Kopiera miljövariabler
cp .env.example .env.local

# Starta PostgreSQL (om du använder Docker)
docker compose -f compose.dev.yaml up -d postgres

# Kör databasmigrationer
npm run db:migrate

# Starta utvecklingsservern
npm run dev

Öppna http://localhost:3000.

Skript

KommandoBeskrivning
npm run devStarta utvecklingsserver
npm run buildBygg för produktion
npm run startStarta produktionsserver
npm run typecheckTypkontroll
npm run db:generateGenerera migrationsfiler
npm run db:migrateKör migrationer
npm run db:studioÖppna Drizzle Studio

Miljövariabler

Obligatoriska

DATABASE_URL=postgresql://user:pass@localhost:5432/klasslistan
BETTER_AUTH_SECRET=<generera med openssl rand -base64 32>
APP_URL=http://localhost:3000

Valfria

# E-post (för verifiering, lösenordsåterställning)
SMTP_HOST=
SMTP_PORT=587
SMTP_USER=
SMTP_PASSWORD=
SMTP_FROM=

# Feature flags
NEXT_PUBLIC_FEATURE_ACTIVITIES=true    # Aktiviteter (kalas, lekdejter)
NEXT_PUBLIC_FEATURE_PUSH=true          # Push-notiser

# Autentisering
REQUIRE_EMAIL_VERIFICATION=false
ENABLE_MAGIC_LINK=true

# Push-notiser (VAPID)
VAPID_PRIVATE_KEY=
NEXT_PUBLIC_VAPID_PUBLIC_KEY=
VAPID_SUBJECT=mailto:din@email.se

# Skolverkets API
SCHOOL_DATA_API_URL=

Produktion

Docker Build

docker build \
  --build-arg NEXT_PUBLIC_APP_URL=https://klasslistan.se \
  -t klasslistan .

Deploy med Docker Compose

# På produktionsservern
cd /srv/docker-root/projects/klasslistan
cp .env.example .env
# Redigera .env med produktionsvärden

IMAGE_TAG=latest docker compose --env-file .env up -d

Se compose.prod.yaml för fullständig konfiguration inkl. Traefik-labels.

Databasmigrationer

Migrationer körs automatiskt vid containerstart via scripts/start.sh.

Backup

PostgreSQL-data lagras i Docker-volym postgres_data. Säkerhetskopiera regelbundet:

docker exec klasslistan-postgres pg_dump -U klasslistan klasslistan > backup.sql

CI/CD

Projektet använder OneDev för CI/CD. Se .onedev-buildspec.yml.

Jobb:

  • Build — lint, typecheck, security audit, docker build/push
  • Deploy — automatisk deploy till produktion vid push till main
  • Security Auto-Patch — schemalagd (söndagar 03:00) npm audit fix
  • Rollback — manuell rollback till specifik image-tag

Build Retention

Konfigurerat i OneDev UI (Project Settings → Build):

  • successful: 14
  • failed: 2
  • cancelled: 0

Projektstruktur

├── app/                    # Next.js App Router
│   ├── (auth)/            # Inloggning, registrering
│   ├── (protected)/       # Skyddade sidor (kräver inloggning)
│   ├── (public)/          # Publika sidor
│   └── api/               # API-routes
├── components/            # React-komponenter
│   └── ui/               # shadcn/ui-komponenter
├── lib/                   # Utilities och konfiguration
│   ├── auth/             # Better Auth setup
│   ├── db/               # Drizzle schema och klient
│   ├── email/            # E-postutskick
│   └── school-data/      # Skolverket-integration
├── drizzle/              # Databasmigrationer
├── public/               # Statiska filer
├── scripts/              # Deploy-skript
└── CLAUDE.md             # AI-assistentinstruktioner

Licens

Proprietär. Kontakta Rockhost för frågor.

Please wait...
Connection lost or session expired, reload to recover
Page is in error, reload to recover