Merge branch 'main' of ssh://gitea.gynther.se:2222/nilsjohan/recipe-app

This commit is contained in:
Nils-Johan Gynther
2026-04-19 09:27:07 +02:00
5 changed files with 78 additions and 66 deletions
+3
View File
@@ -16,3 +16,6 @@ ADMIN_NADMIN_PASSWORD=Extra-Bra-Konto1
ADMIN_PADMIN_PASSWORD=Extra-Bra-Konto2
SEED_USER1_PASSWORD=Test-Anv1-Fbg
SEED_USER2_PASSWORD=Test-Anv2-FBG
AUTH_SECRET=WheqAss4F/al9yRZRqepJEBs6TzPsN3brX0iBiF4Oww=
JWT_SECRET=uK9yRQpyyWOcHYcYbpAdsJ7NJcEsyCYZcgF82OnBz2k=
MISTRAL_API_KEY=eUHYYzQZMsKmanFn3ubVjOmdvTHQSsjB
+16
View File
@@ -0,0 +1,16 @@
NODE_ENV=production
NEXT_PUBLIC_APP_URL=https://recept.gynther.se
NEXT_PUBLIC_API_URL=https://api.recept.gynther.se
MARIADB_ROOT_PASSWORD=Encrust6-Deserve-Stricken-Spectacle
MARIADB_DATABASE=recipe_app
MARIADB_USER=recipe_user
MARIADB_PASSWORD=Imminent-Umpire-Undertook8-Crunchy
# Använder root för att prisma migrate deploy skall fungera
DATABASE_URL=mysql://root:Encrust6-Deserve-Stricken-Spectacle@recipe-db:3306/recipe_app
MISTRAL_API_KEY=ciPqxezMHmzkLwdqMGBI1jjpngFfqpl1
JWT_SECRET=UfRHKQ3ZTKF3TCJP7FRm+r9PRc0ANyFl52aPrQXGCE8=
AUTH_SECRET=pISXR/rkXqBBDv1FRxF3ESP1PwUspSt05PkC5/hK/y4=
+1
View File
@@ -4,3 +4,4 @@ node_modules/
*.lock
package-lock.json
.env.*
+58
View File
@@ -0,0 +1,58 @@
# AI-funktioner i Recipe-App: Premium-funktioner och rekommenderade modeller
Detta dokument beskriver de AI-funktioner som kommer att implementeras som **premium-funktioner** i **recipe-app**. Varje funktion är kopplad till en rekommenderad Mistral-modell, med fokus på att använda de enklaste och mest kostnadseffektiva alternativen.
---
## Översikt över AI-funktioner
Funktion | Beskrivning | Rekommenderad Modell |
|-----------------------------------|-------------------------------------------------------------------------------------------------|----------------------------|
| **Receptförslag utifrån hemmalager** | AI analyserar användarens inventory och föreslår recept baserat på tillgängliga ingredienser. | `mistral-small-2603` |
| **Veckoplanering med AI** | AI genererar en veckoplan baserat på inventory, recept och användarpreferenser. | `mistral-small-2603` |
| **Smart inköpslista** | AI skapar en inköpslista baserat på saknade ingredienser och historisk förbrukning. | `mistral-small-2603` |
| **Automatisk kategorisering** | AI kategoriserar nya produkter i inventory baserat på namn och beskrivning. | `mistral-small-2603` |
| **"Vad ska jag laga idag?"** | AI ger snabba receptförslag baserat på vad användaren har hemma. | `mistral-tiny-2603` |
| **Enhetskonvertering** | AI hjälper till att konvertera enheter (t.ex. gram till msk) och hanterar osäkerheter. | `labs-leanstral-2603` |
| **AI-assisterad lageravräkning** | AI hjälper till att dra av rätt mängder från inventory när ett recept lagas. | `mistral-small-2603` |
| **Personliga matlagningsråd** | AI ger personliga tips baserat på användarens matlagningshistorik och inventory. | `mistral-tiny-2603` |
| **AI-assisterad import av PDF/länkar** | AI extraherar recept och prisdata från PDF-filer och länkar för att underlätta importen. | `mistral-small-2603` |
| **Kostnadseffektiv inköpslista** | AI skapar en kostnadseffektiv inköpslista baserat på inventory och aktuella butikspriser. | `mistral-small-2603` |
---
## Bakgrund och motivering
### Varför dessa funktioner?
- **Receptförslag utifrån hemmalager** och **veckoplanering** är centrala för att hjälpa användare att minska matsvinn och spara tid.
- **Smart inköpslista** och **kostnadseffektiv inköpslista** är viktiga för att optimera användarens matbudget.
- **AI-assisterad import av PDF/länkar** underlättar för användare att lägga in recept och prisdata utan manuellt arbete.
### Varför dessa modeller?
- **`mistral-small-2603`** används för de flesta funktioner eftersom den är kostnadseffektiv och klarar av strukturerad data och logik.
- **`mistral-tiny-2603`** används för enklare, snabbare uppgifter som **"Vad ska jag laga idag?"** och **personliga matlagningsråd**.
- **`labs-leanstral-2603`** används för **enhetskonvertering** eftersom den är optimerad för kod och logik.
---
## Tekniska överväganden
### Integration med befintlig arkitektur
- **Backend**: AI-funktionerna kommer att implementeras som separata tjänster i NestJS, med egna endpoints för varje funktion.
- **Frontend**: Resultaten från AI-funktionerna kommer att visas i Next.js-gränssnittet, med tydlig feedback till användaren.
- **Databas**: Resultat och användardata lagras i MariaDB via Prisma ORM.
### Säkerhet och validering
- **Validering**: AI-output valideras alltid mot strukturerade scheman (t.ex. med Zod) för att säkerställa datakvalitet.
- **Säkerhet**: Känslig data krypteras enligt den hybridlösning med PGP och AES som vi tidigare diskuterat.
---
## Nästa steg
1. **Prioritera funktioner**: Börja med de funktioner som ger mest värde för användaren, i denna ordning **Automatiska kategorisering** och **Receptförslag utifrån hemmalager** samt **Vad ska jag laga idag?"**.
2. **Implementera validering**: Se till att AI-output alltid valideras mot strukturerade scheman.
3. **Testa och iterera**: Börja med enklare modeller och utvärdera resultatet innan du skalar upp.
---
-66
View File
@@ -1,66 +0,0 @@
#!/bin/bash
# Konfiguration
PROJECT_DIR="/opt/containers/recipe-app"
BACKUP_DIR="/media/share1/backups" # Ändra till önskad backup-plats
DATE=$(date +"%Y%m%d_%H%M%S")
BACKUP_NAME="recipe_app_backup_$DATE"
# Skapa backup-mapp om den inte finns
mkdir -p "$BACKUP_DIR/$BACKUP_NAME"
# Säkerhetskopiera compose.yml (om den finns)
if [ -f "$PROJECT_DIR/compose.yml" ]; then
echo "Säkerhetskopierar compose.yml..."
cp "$PROJECT_DIR/compose.yml" "$BACKUP_DIR/$BACKUP_NAME/compose.yml.backup"
else
echo "Varning: compose.yml hittades inte i $PROJECT_DIR"
fi
# Säkerhetskopiera projektmappen (exkludera onödiga mappar)
echo "Säkerhetskopierar projektmappen (exkluderar node_modules, .next, dist, uploads, db)..."
rsync -a \
--exclude='node_modules' \
--exclude='.next' \
--exclude='dist' \
--exclude='uploads' \
--exclude='db' \
"$PROJECT_DIR/" "$BACKUP_DIR/$BACKUP_NAME/recipe-app/"
# Säkerhetskopiera Docker-images
echo "Säkerhetskopierar Docker-images..."
docker save -o "$BACKUP_DIR/$BACKUP_NAME/recipe_frontend_backup.tar" recipe-frontend:local || echo "Kunde inte säkerhetskopiera recipe-frontend:local"
docker save -o "$BACKUP_DIR/$BACKUP_NAME/recipe_api_backup.tar" recipe-api:local || echo "Kunde inte säkerhetskopiera recipe-api:local"
# Säkerhetskopiera körande containrar
echo "Säkerhetskopierar körande containrar..."
FRONTEND_CONTAINER_ID=$(docker ps -aqf "name=recipe-app-frontend")
API_CONTAINER_ID=$(docker ps -aqf "name=recipe-app-recipe-api")
if [ ! -z "$FRONTEND_CONTAINER_ID" ]; then
docker commit "$FRONTEND_CONTAINER_ID" recipe-frontend-container-backup
docker save -o "$BACKUP_DIR/$BACKUP_NAME/recipe_frontend_container_backup.tar" recipe-frontend-container-backup
docker rmi recipe-frontend-container-backup
fi
if [ ! -z "$API_CONTAINER_ID" ]; then
docker commit "$API_CONTAINER_ID" recipe-api-container-backup
docker save -o "$BACKUP_DIR/$BACKUP_NAME/recipe_api_container_backup.tar" recipe-api-container-backup
docker rmi recipe-api-container-backup
fi
# Säkerhetskopiera Docker-volymer
echo "Säkerhetskopierar Docker-volymer..."
docker run --rm -v recipe-db-data:/volume -v "$BACKUP_DIR/$BACKUP_NAME":/backup alpine tar cvf /backup/recipe_db_data_backup.tar /volume
# Komprimera backup-mappen i delar
echo "Komprimerar backup i delar..."
cd "$BACKUP_DIR"
tar -czvf "$BACKUP_NAME-part1.tar.gz" -C "$BACKUP_NAME" compose.yml.backup recipe_db_data_backup.tar 2>/dev/null
tar -czvf "$BACKUP_NAME-part2.tar.gz" -C "$BACKUP_NAME" recipe_app 2>/dev/null
tar -czvf "$BACKUP_NAME-part3.tar.gz" -C "$BACKUP_NAME" *.tar 2>/dev/null
# Rensa temporära filer
rm -rf "$BACKUP_DIR/$BACKUP_NAME"
echo "Backup klar! Filerna sparades i $BACKUP_DIR/ som $BACKUP_NAME-part*.tar.gz"