Merge branch 'main' of ssh://gitea.gynther.se:2222/nilsjohan/recipe-app
This commit is contained in:
@@ -16,3 +16,6 @@ ADMIN_NADMIN_PASSWORD=Extra-Bra-Konto1
|
|||||||
ADMIN_PADMIN_PASSWORD=Extra-Bra-Konto2
|
ADMIN_PADMIN_PASSWORD=Extra-Bra-Konto2
|
||||||
SEED_USER1_PASSWORD=Test-Anv1-Fbg
|
SEED_USER1_PASSWORD=Test-Anv1-Fbg
|
||||||
SEED_USER2_PASSWORD=Test-Anv2-FBG
|
SEED_USER2_PASSWORD=Test-Anv2-FBG
|
||||||
|
AUTH_SECRET=WheqAss4F/al9yRZRqepJEBs6TzPsN3brX0iBiF4Oww=
|
||||||
|
JWT_SECRET=uK9yRQpyyWOcHYcYbpAdsJ7NJcEsyCYZcgF82OnBz2k=
|
||||||
|
MISTRAL_API_KEY=eUHYYzQZMsKmanFn3ubVjOmdvTHQSsjB
|
||||||
|
|||||||
@@ -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=
|
||||||
@@ -4,3 +4,4 @@ node_modules/
|
|||||||
*.lock
|
*.lock
|
||||||
package-lock.json
|
package-lock.json
|
||||||
|
|
||||||
|
.env.*
|
||||||
|
|||||||
@@ -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.
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
|
||||||
@@ -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"
|
|
||||||
Reference in New Issue
Block a user