From 49a912fe3373d57fa689373ccf19fea22b79cc76 Mon Sep 17 00:00:00 2001 From: nilsjohan Date: Sun, 19 Apr 2026 06:52:05 +0200 Subject: [PATCH 1/4] Added AI-FUNKTIONER.md --- AI-FUNKTIONER.md | 58 ++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 58 insertions(+) create mode 100644 AI-FUNKTIONER.md diff --git a/AI-FUNKTIONER.md b/AI-FUNKTIONER.md new file mode 100644 index 00000000..2b934cd1 --- /dev/null +++ b/AI-FUNKTIONER.md @@ -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. + +--- + + From 588c3df55af8b8fb4eecfacbd0f08f24e6383c76 Mon Sep 17 00:00:00 2001 From: nilsjohan Date: Sun, 19 Apr 2026 07:24:26 +0200 Subject: [PATCH 2/4] Lade till backup av .env --- .env.2026-04-18 | 16 ++++++++++++++++ 1 file changed, 16 insertions(+) create mode 100644 .env.2026-04-18 diff --git a/.env.2026-04-18 b/.env.2026-04-18 new file mode 100644 index 00000000..961d8565 --- /dev/null +++ b/.env.2026-04-18 @@ -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= From b9c79644cf4bafa6160a679640babe53f56272f8 Mon Sep 17 00:00:00 2001 From: nilsjohan Date: Sun, 19 Apr 2026 07:25:17 +0200 Subject: [PATCH 3/4] =?UTF-8?q?Ignorerar=20backup-filer=20f=C3=B6r=20.env?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .gitignore | 1 + 1 file changed, 1 insertion(+) diff --git a/.gitignore b/.gitignore index 7dae75c3..dfc017e9 100644 --- a/.gitignore +++ b/.gitignore @@ -4,3 +4,4 @@ node_modules/ *.lock package-lock.json +.env.* From 01f8022ab729a1490367d41e1deed785b0575baf Mon Sep 17 00:00:00 2001 From: nilsjohan Date: Sun, 19 Apr 2026 07:26:54 +0200 Subject: [PATCH 4/4] Uppdaterade .env och tog bort backup_recipe_app.sh --- .env | 3 ++ backup_recipe_app.sh | 66 -------------------------------------------- 2 files changed, 3 insertions(+), 66 deletions(-) delete mode 100755 backup_recipe_app.sh diff --git a/.env b/.env index 512652f4..fef9686a 100644 --- a/.env +++ b/.env @@ -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 diff --git a/backup_recipe_app.sh b/backup_recipe_app.sh deleted file mode 100755 index 8006cd39..00000000 --- a/backup_recipe_app.sh +++ /dev/null @@ -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"