Bereinige und vereinfache Installations-Skripte

- Entferne alle überflüssigen Installations- und Konfigurationsskripte
- Erstelle zwei vereinfachte Docker-Installationsskripte:
  - install-frontend.sh für Frontend-Installation
  - install-backend.sh für Backend-Installation
- Verbessere Frontend Dockerfile mit besserer Unterstützung für native Dependencies
- Aktualisiere Backend Dockerfile für automatische DB-Initialisierung
- Korrigiere TypeScript-Fehler in personalized-cards.tsx
- Erstelle env.ts für Umgebungsvariablen-Verwaltung
- Füge ausführliche Installationsanleitung in INSTALL.md hinzu
- Konfiguriere Docker-Compose für Host-Netzwerkmodus
- Erweitere Dockerfiles mit Healthchecks für bessere Zuverlässigkeit

🤖 Generated with [Claude Code](https://claude.ai/code)

Co-Authored-By: Claude <noreply@anthropic.com>
This commit is contained in:
2025-03-31 14:22:07 +02:00
parent fc62086a50
commit f1541478ad
198 changed files with 1903 additions and 17934 deletions

View File

@ -1,31 +0,0 @@
#!/bin/bash
# Define image name
MYP_RP_IMAGE_NAME="myp-rp"
# Function to build Docker image
build_image() {
local image_name=$1
local dockerfile=$2
local platform=$3
echo "Building $image_name Docker image for $platform..."
docker buildx build --platform $platform -t ${image_name}:latest -f $dockerfile --load .
if [ $? -eq 0 ]; then
echo "$image_name Docker image built successfully"
else
echo "Error occurred while building $image_name Docker image"
exit 1
fi
}
# Create and use a builder instance (if not already created)
BUILDER_NAME="myp-rp-arm64-builder"
docker buildx create --name $BUILDER_NAME --use || docker buildx use $BUILDER_NAME
# Build myp-rp image
build_image "$MYP_RP_IMAGE_NAME" "$PWD/Dockerfile" "linux/arm64"
# Remove the builder instance
docker buildx rm $BUILDER_NAME

View File

@ -1,8 +0,0 @@
{
debug
}
m040tbaraspi001.de040.corpintra.net, m040tbaraspi001.de040.corpinter.net, localhost {
reverse_proxy myp-rp:3000
tls internal
}

View File

@ -1 +0,0 @@
{"apps":{"http":{"servers":{"srv0":{"listen":[":443"],"routes":[{"handle":[{"handler":"subroute","routes":[{"handle":[{"handler":"reverse_proxy","upstreams":[{"dial":"myp-rp:3000"}]}]}]}],"match":[{"host":["m040tbaraspi001.de040.corpintra.net","m040tbaraspi001.de040.corpinter.net","localhost"]}],"terminal":true}]}}},"tls":{"automation":{"policies":[{"issuers":[{"module":"internal"}],"subjects":["localhost","m040tbaraspi001.de040.corpinter.net","m040tbaraspi001.de040.corpintra.net"]}]}}},"logging":{"logs":{"default":{"level":"DEBUG"}}}}

View File

@ -1,24 +0,0 @@
-----BEGIN CERTIFICATE-----
MIIBvTCCAWSgAwIBAgIRAPU9l/UbzcL7IMHIB3R4jREwCgYIKoZIzj0EAwIwMzEx
MC8GA1UEAxMoQ2FkZHkgTG9jYWwgQXV0aG9yaXR5IC0gRUNDIEludGVybWVkaWF0
ZTAeFw0yNTAzMjYxMjQ4NDRaFw0yNTAzMjcwMDQ4NDRaMAAwWTATBgcqhkjOPQIB
BggqhkjOPQMBBwNCAAS6t64LWdLKVIEIlg/9X+ob/4evs4EGUxK8TrBqQcjpJvxr
JjPK9YpPa1Dmuko2JFo4hB2zgSf4esb9Ew2eiGzzo4GLMIGIMA4GA1UdDwEB/wQE
AwIHgDAdBgNVHSUEFjAUBggrBgEFBQcDAQYIKwYBBQUHAwIwHQYDVR0OBBYEFDpn
k4oFx8oHjltlaD8RBYv7JoJIMB8GA1UdIwQYMBaAFNtT2XbJADGNGXiDvCHh7UGq
nU0UMBcGA1UdEQEB/wQNMAuCCWxvY2FsaG9zdDAKBggqhkjOPQQDAgNHADBEAiB4
UFAFZMQLnMjmmOAfWQeJU7QQN7Wn0BaD4LAON8KdewIgCUOQA0sqsxnKDijW3hds
p94i7WbY6PwRLuI7HpMA6YM=
-----END CERTIFICATE-----
-----BEGIN CERTIFICATE-----
MIIBxzCCAW2gAwIBAgIQBxtri0u0IUbQucD648jSujAKBggqhkjOPQQDAjAwMS4w
LAYDVQQDEyVDYWRkeSBMb2NhbCBBdXRob3JpdHkgLSAyMDI1IEVDQyBSb290MB4X
DTI1MDMyNjEyNDIzOFoXDTI1MDQwMjEyNDIzOFowMzExMC8GA1UEAxMoQ2FkZHkg
TG9jYWwgQXV0aG9yaXR5IC0gRUNDIEludGVybWVkaWF0ZTBZMBMGByqGSM49AgEG
CCqGSM49AwEHA0IABABjG5Mz+vTRqVKwIduy5DU7JV/RqAYhca7lJ0Mvm07qaDzE
fCJrJ9NfwoH6DWO5nKvEG1GrqUjoZGeAZKV6i0mjZjBkMA4GA1UdDwEB/wQEAwIB
BjASBgNVHRMBAf8ECDAGAQH/AgEAMB0GA1UdDgQWBBTbU9l2yQAxjRl4g7wh4e1B
qp1NFDAfBgNVHSMEGDAWgBQj0TqTz+i+mgniWIorz1LMFKeXPDAKBggqhkjOPQQD
AgNIADBFAiEA5beidpDU9mWSjsa55zdyuLI1UK/Fj6DxIuv5WtDnnb4CIFU1saeM
dQ8SoCntwSJJhWhwglyhhKN9hxQfnZ0E9MDF
-----END CERTIFICATE-----

View File

@ -1,6 +0,0 @@
{
"sans": [
"localhost"
],
"issuer_data": null
}

View File

@ -1,5 +0,0 @@
-----BEGIN EC PRIVATE KEY-----
MHcCAQEEICa958r36l062opbnc8sNTtdpMo+sBFkl3NjXYBEA+1ooAoGCCqGSM49
AwEHoUQDQgAEureuC1nSylSBCJYP/V/qG/+Hr7OBBlMSvE6wakHI6Sb8ayYzyvWK
T2tQ5rpKNiRaOIQds4En+HrG/RMNnohs8w==
-----END EC PRIVATE KEY-----

View File

@ -1,24 +0,0 @@
-----BEGIN CERTIFICATE-----
MIIB2DCCAX6gAwIBAgIRAPVXFTo6d7jESLMLxMZKplgwCgYIKoZIzj0EAwIwMzEx
MC8GA1UEAxMoQ2FkZHkgTG9jYWwgQXV0aG9yaXR5IC0gRUNDIEludGVybWVkaWF0
ZTAeFw0yNTAzMjYxMjQyMzhaFw0yNTAzMjcwMDQyMzhaMAAwWTATBgcqhkjOPQIB
BggqhkjOPQMBBwNCAARx/pRcXBw+x3+m3SQSaYXPGV+NCBq1zgeMcC6G/xTTpDny
w8OTejy817yfEKex8B2FuwRvC+mH2Bd9BPvnRakHo4GlMIGiMA4GA1UdDwEB/wQE
AwIHgDAdBgNVHSUEFjAUBggrBgEFBQcDAQYIKwYBBQUHAwIwHQYDVR0OBBYEFMBP
yCSwbLaKF/HYd4RLcMPKM/HPMB8GA1UdIwQYMBaAFNtT2XbJADGNGXiDvCHh7UGq
nU0UMDEGA1UdEQEB/wQnMCWCI20wNDB0YmFyYXNwaTAwMS5kZTA0MC5jb3JwaW50
ZXIubmV0MAoGCCqGSM49BAMCA0gAMEUCIQCO+fh6TpZDHg3b44SmtspcmIfc2jkd
CMdWW32ByhRffAIgDxUBsifWaNgUMHhFpVEGm4K0XEvBR8iAHrGkMluEQ54=
-----END CERTIFICATE-----
-----BEGIN CERTIFICATE-----
MIIBxzCCAW2gAwIBAgIQBxtri0u0IUbQucD648jSujAKBggqhkjOPQQDAjAwMS4w
LAYDVQQDEyVDYWRkeSBMb2NhbCBBdXRob3JpdHkgLSAyMDI1IEVDQyBSb290MB4X
DTI1MDMyNjEyNDIzOFoXDTI1MDQwMjEyNDIzOFowMzExMC8GA1UEAxMoQ2FkZHkg
TG9jYWwgQXV0aG9yaXR5IC0gRUNDIEludGVybWVkaWF0ZTBZMBMGByqGSM49AgEG
CCqGSM49AwEHA0IABABjG5Mz+vTRqVKwIduy5DU7JV/RqAYhca7lJ0Mvm07qaDzE
fCJrJ9NfwoH6DWO5nKvEG1GrqUjoZGeAZKV6i0mjZjBkMA4GA1UdDwEB/wQEAwIB
BjASBgNVHRMBAf8ECDAGAQH/AgEAMB0GA1UdDgQWBBTbU9l2yQAxjRl4g7wh4e1B
qp1NFDAfBgNVHSMEGDAWgBQj0TqTz+i+mgniWIorz1LMFKeXPDAKBggqhkjOPQQD
AgNIADBFAiEA5beidpDU9mWSjsa55zdyuLI1UK/Fj6DxIuv5WtDnnb4CIFU1saeM
dQ8SoCntwSJJhWhwglyhhKN9hxQfnZ0E9MDF
-----END CERTIFICATE-----

View File

@ -1,6 +0,0 @@
{
"sans": [
"m040tbaraspi001.de040.corpinter.net"
],
"issuer_data": null
}

View File

@ -1,5 +0,0 @@
-----BEGIN EC PRIVATE KEY-----
MHcCAQEEIKKTHxhW36UGnXNu76awScVKin+p/jOIQgk8PiMzJBEpoAoGCCqGSM49
AwEHoUQDQgAEcf6UXFwcPsd/pt0kEmmFzxlfjQgatc4HjHAuhv8U06Q58sPDk3o8
vNe8nxCnsfAdhbsEbwvph9gXfQT750WpBw==
-----END EC PRIVATE KEY-----

View File

@ -1,24 +0,0 @@
-----BEGIN CERTIFICATE-----
MIIB2DCCAX2gAwIBAgIQWtKcUuqi4m7Il54RGR2BezAKBggqhkjOPQQDAjAzMTEw
LwYDVQQDEyhDYWRkeSBMb2NhbCBBdXRob3JpdHkgLSBFQ0MgSW50ZXJtZWRpYXRl
MB4XDTI1MDMyNjEyNDIzOFoXDTI1MDMyNzAwNDIzOFowADBZMBMGByqGSM49AgEG
CCqGSM49AwEHA0IABDe6dkJkIlyLsbuphvIifPbRI1k42pG0Ec3NqDsdi1MfFCFS
OBCj7oOIEtSUfYcV5AVeerBW1I6s+t8cMvAhYMSjgaUwgaIwDgYDVR0PAQH/BAQD
AgeAMB0GA1UdJQQWMBQGCCsGAQUFBwMBBggrBgEFBQcDAjAdBgNVHQ4EFgQUOmn0
iGuTKiGBlFFThWjQTsg3sA4wHwYDVR0jBBgwFoAU21PZdskAMY0ZeIO8IeHtQaqd
TRQwMQYDVR0RAQH/BCcwJYIjbTA0MHRiYXJhc3BpMDAxLmRlMDQwLmNvcnBpbnRy
YS5uZXQwCgYIKoZIzj0EAwIDSQAwRgIhANZAovSh7bSGW39f1K9E5COVm6YbWGdU
tTw9zoUf34ahAiEAjPuVRxKE6cb57SYmHFXiMn+LfN9Dbxr/jVaFIWbRiUo=
-----END CERTIFICATE-----
-----BEGIN CERTIFICATE-----
MIIBxzCCAW2gAwIBAgIQBxtri0u0IUbQucD648jSujAKBggqhkjOPQQDAjAwMS4w
LAYDVQQDEyVDYWRkeSBMb2NhbCBBdXRob3JpdHkgLSAyMDI1IEVDQyBSb290MB4X
DTI1MDMyNjEyNDIzOFoXDTI1MDQwMjEyNDIzOFowMzExMC8GA1UEAxMoQ2FkZHkg
TG9jYWwgQXV0aG9yaXR5IC0gRUNDIEludGVybWVkaWF0ZTBZMBMGByqGSM49AgEG
CCqGSM49AwEHA0IABABjG5Mz+vTRqVKwIduy5DU7JV/RqAYhca7lJ0Mvm07qaDzE
fCJrJ9NfwoH6DWO5nKvEG1GrqUjoZGeAZKV6i0mjZjBkMA4GA1UdDwEB/wQEAwIB
BjASBgNVHRMBAf8ECDAGAQH/AgEAMB0GA1UdDgQWBBTbU9l2yQAxjRl4g7wh4e1B
qp1NFDAfBgNVHSMEGDAWgBQj0TqTz+i+mgniWIorz1LMFKeXPDAKBggqhkjOPQQD
AgNIADBFAiEA5beidpDU9mWSjsa55zdyuLI1UK/Fj6DxIuv5WtDnnb4CIFU1saeM
dQ8SoCntwSJJhWhwglyhhKN9hxQfnZ0E9MDF
-----END CERTIFICATE-----

View File

@ -1,6 +0,0 @@
{
"sans": [
"m040tbaraspi001.de040.corpintra.net"
],
"issuer_data": null
}

View File

@ -1,5 +0,0 @@
-----BEGIN EC PRIVATE KEY-----
MHcCAQEEIA3vXldJ16IzTZetwcSYa08RyRxst+Lpjm9TKt7yYU6+oAoGCCqGSM49
AwEHoUQDQgAEN7p2QmQiXIuxu6mG8iJ89tEjWTjakbQRzc2oOx2LUx8UIVI4EKPu
g4gS1JR9hxXkBV56sFbUjqz63xwy8CFgxA==
-----END EC PRIVATE KEY-----

View File

@ -1 +0,0 @@
e9f99540-c0cf-4046-a79f-148307ff52a5

View File

@ -1 +0,0 @@
{"tls":{"timestamp":"2025-03-26T12:42:38.600855506Z","instance_id":"e9f99540-c0cf-4046-a79f-148307ff52a5"}}

View File

@ -1,12 +0,0 @@
-----BEGIN CERTIFICATE-----
MIIBxzCCAW2gAwIBAgIQBxtri0u0IUbQucD648jSujAKBggqhkjOPQQDAjAwMS4w
LAYDVQQDEyVDYWRkeSBMb2NhbCBBdXRob3JpdHkgLSAyMDI1IEVDQyBSb290MB4X
DTI1MDMyNjEyNDIzOFoXDTI1MDQwMjEyNDIzOFowMzExMC8GA1UEAxMoQ2FkZHkg
TG9jYWwgQXV0aG9yaXR5IC0gRUNDIEludGVybWVkaWF0ZTBZMBMGByqGSM49AgEG
CCqGSM49AwEHA0IABABjG5Mz+vTRqVKwIduy5DU7JV/RqAYhca7lJ0Mvm07qaDzE
fCJrJ9NfwoH6DWO5nKvEG1GrqUjoZGeAZKV6i0mjZjBkMA4GA1UdDwEB/wQEAwIB
BjASBgNVHRMBAf8ECDAGAQH/AgEAMB0GA1UdDgQWBBTbU9l2yQAxjRl4g7wh4e1B
qp1NFDAfBgNVHSMEGDAWgBQj0TqTz+i+mgniWIorz1LMFKeXPDAKBggqhkjOPQQD
AgNIADBFAiEA5beidpDU9mWSjsa55zdyuLI1UK/Fj6DxIuv5WtDnnb4CIFU1saeM
dQ8SoCntwSJJhWhwglyhhKN9hxQfnZ0E9MDF
-----END CERTIFICATE-----

View File

@ -1,5 +0,0 @@
-----BEGIN EC PRIVATE KEY-----
MHcCAQEEIDwz5wb9hKt0oBQLfNfh4udQdbomFlQwANjEbLFlAWoLoAoGCCqGSM49
AwEHoUQDQgAEAGMbkzP69NGpUrAh27LkNTslX9GoBiFxruUnQy+bTupoPMR8Imsn
01/CgfoNY7mcq8QbUaupSOhkZ4BkpXqLSQ==
-----END EC PRIVATE KEY-----

View File

@ -1,11 +0,0 @@
-----BEGIN CERTIFICATE-----
MIIBpDCCAUqgAwIBAgIRANtNnPgy0RsYy8s8jEXTF70wCgYIKoZIzj0EAwIwMDEu
MCwGA1UEAxMlQ2FkZHkgTG9jYWwgQXV0aG9yaXR5IC0gMjAyNSBFQ0MgUm9vdDAe
Fw0yNTAzMjYxMjQyMzhaFw0zNTAyMDIxMjQyMzhaMDAxLjAsBgNVBAMTJUNhZGR5
IExvY2FsIEF1dGhvcml0eSAtIDIwMjUgRUNDIFJvb3QwWTATBgcqhkjOPQIBBggq
hkjOPQMBBwNCAARwisVH8Fpc6IyEsTJ52Ie+G57YAaG946BWcg12RVz+0K2PAk8k
S2zQ7F0Q9ACgmIi714mTDwRYqPI98YgUSH3vo0UwQzAOBgNVHQ8BAf8EBAMCAQYw
EgYDVR0TAQH/BAgwBgEB/wIBATAdBgNVHQ4EFgQUI9E6k8/ovpoJ4liKK89SzBSn
lzwwCgYIKoZIzj0EAwIDSAAwRQIhAPNALa1ZYm+zv0M+lgka9i/lEtv1nXECXkB3
LDSxq3uOAiBLTXBuZZEGmv1eIOSUCFUdAqf+T2xTK7tWorwSyzh/EQ==
-----END CERTIFICATE-----

View File

@ -1,5 +0,0 @@
-----BEGIN EC PRIVATE KEY-----
MHcCAQEEIEFRxdeKjH1vPMMq+p5SBmN+5OFBuWwHyDXvvmEKOIatoAoGCCqGSM49
AwEHoUQDQgAEcIrFR/BaXOiMhLEyediHvhue2AGhveOgVnINdkVc/tCtjwJPJEts
0OxdEPQAoJiIu9eJkw8EWKjyPfGIFEh97w==
-----END EC PRIVATE KEY-----

View File

@ -1,19 +0,0 @@
services:
caddy:
image: caddy:2.8
container_name: caddy
restart: unless-stopped
ports:
- 80:80
- 443:443
volumes:
- ./caddy/data:/data
- ./caddy/config:/config
- ./caddy/Caddyfile:/etc/caddy/Caddyfile:ro
myp-rp:
image: myp-rp:latest
container_name: myp-rp
env_file: "/srv/myp-env/github.env"
volumes:
- /srv/MYP-DB:/usr/src/app/db
restart: unless-stopped

View File

@ -1,36 +0,0 @@
#!/bin/bash
# Directory containing the Docker images
IMAGE_DIR="docker/images"
# Load all Docker images from the tar.xz files in the IMAGE_DIR
echo "Loading Docker images from $IMAGE_DIR..."
for image_file in "$IMAGE_DIR"/*.tar.xz; do
if [ -f "$image_file" ]; then
echo "Loading Docker image from $image_file..."
docker load -i "$image_file"
# Check if the image loading was successful
if [ $? -ne 0 ]; then
echo "Error occurred while loading Docker image from $image_file"
exit 1
fi
else
echo "No Docker image tar.xz files found in $IMAGE_DIR."
fi
done
# Execute docker compose
echo "Running docker compose..."
docker compose -f "docker/compose.yml" up -d
# Check if the operation was successful
if [ $? -eq 0 ]; then
echo "Docker compose executed successfully"
else
echo "Error occurred while executing docker compose"
exit 1
fi
echo "Deployment completed successfully"

View File

@ -1,2 +0,0 @@
caddy_2.8.tar.xz filter=lfs diff=lfs merge=lfs -text
myp-rp_latest.tar.xz filter=lfs diff=lfs merge=lfs -text

Binary file not shown.

Binary file not shown.

View File

@ -1,68 +0,0 @@
#!/bin/bash
# Get image name as argument
IMAGE_NAME=$1
PLATFORM="linux/arm64"
# Define paths
IMAGE_DIR="docker/images"
IMAGE_FILE="${IMAGE_DIR}/${IMAGE_NAME//[:\/]/_}.tar"
COMPRESSED_FILE="${IMAGE_FILE}.xz"
# Function to pull the image
pull_image() {
local image=$1
if [[ $image == arm64v8/* ]]; then
echo "Pulling image $image without platform specification..."
docker pull $image
else
echo "Pulling image $image for platform $PLATFORM..."
docker pull --platform $PLATFORM $image
fi
return $?
}
# Pull the image if it is not available locally
if ! docker image inspect ${IMAGE_NAME} &>/dev/null; then
if pull_image ${IMAGE_NAME}; then
echo "Image $IMAGE_NAME pulled successfully."
else
echo "Error occurred while pulling $IMAGE_NAME for platform $PLATFORM"
echo "Trying to pull $IMAGE_NAME without platform specification..."
# Attempt to pull again without platform
if pull_image ${IMAGE_NAME}; then
echo "Image $IMAGE_NAME pulled successfully without platform."
else
echo "Error occurred while pulling $IMAGE_NAME without platform."
echo "Trying to pull arm64v8/${IMAGE_NAME} instead..."
# Construct new image name
NEW_IMAGE_NAME="arm64v8/${IMAGE_NAME}"
if pull_image ${NEW_IMAGE_NAME}; then
echo "Image $NEW_IMAGE_NAME pulled successfully."
IMAGE_NAME=${NEW_IMAGE_NAME} # Update IMAGE_NAME to use the new one
else
echo "Error occurred while pulling $NEW_IMAGE_NAME"
exit 1
fi
fi
fi
else
echo "Image $IMAGE_NAME found locally. Skipping pull."
fi
# Save the Docker image
echo "Saving $IMAGE_NAME Docker image..."
docker save ${IMAGE_NAME} > $IMAGE_FILE
# Compress the Docker image (overwriting if file exists)
echo "Compressing $IMAGE_FILE..."
xz -z --force $IMAGE_FILE
if [ $? -eq 0 ]; then
echo "$IMAGE_NAME Docker image saved and compressed successfully as $COMPRESSED_FILE"
else
echo "Error occurred while compressing $IMAGE_NAME Docker image"
exit 1
fi

View File

@ -1,17 +0,0 @@
version: '3.8'
services:
# Frontend for testing - using external backend
frontend-test:
build:
context: ..
dockerfile: Dockerfile
container_name: myp-frontend-test
environment:
- NODE_ENV=development
- AUTH_TRUST_HOST=true
- AUTH_SECRET=test-secret-key-for-testing-only-do-not-use-in-production
- NEXT_PUBLIC_BACKEND_URL=http://192.168.0.105:5000
ports:
- "127.0.0.1:3000:3000"
network_mode: "host"

View File

@ -1,9 +0,0 @@
Starting MYP integration test environment...
Test directory: /home/user/Projektarbeit-MYP/packages/reservation-platform/docker
Parent directory: /home/user/Projektarbeit-MYP/packages/reservation-platform
Log file: /home/user/Projektarbeit-MYP/packages/reservation-platform/docker/test-integration.log
Cleaning up any existing test environment...
Starting test environment with docker-compose...
unable to prepare context: path "/home/user/Projektarbeit-MYP/packages/backend" not found
Failed to start test environment.
Check the log file for details: /home/user/Projektarbeit-MYP/packages/reservation-platform/docker/test-integration.log

View File

@ -1,161 +0,0 @@
#!/bin/bash
# Test integration script - validates if the frontend and backend work together
# Specifically designed to test if the production environment setup will work
# Get the directory containing this script
SCRIPT_DIR="$( cd "$( dirname "${BASH_SOURCE[0]}" )" && pwd )"
PARENT_DIR="$(dirname "$SCRIPT_DIR")"
TEST_LOG="$SCRIPT_DIR/test-integration.log"
# Colors for output
GREEN='\033[0;32m'
YELLOW='\033[0;33m'
RED='\033[0;31m'
NC='\033[0m' # No Color
# Create or clear log file
> "$TEST_LOG"
echo -e "${YELLOW}Starting MYP integration test environment...${NC}" | tee -a "$TEST_LOG"
echo "Test directory: $SCRIPT_DIR" | tee -a "$TEST_LOG"
echo "Parent directory: $PARENT_DIR" | tee -a "$TEST_LOG"
echo "Log file: $TEST_LOG" | tee -a "$TEST_LOG"
# Function to run docker compose (handles both docker-compose and docker compose syntax)
run_docker_compose() {
if command -v docker-compose &> /dev/null; then
docker-compose "$@"
elif command -v docker &> /dev/null && docker compose version &> /dev/null; then
docker compose "$@"
else
echo -e "${RED}Error: Neither docker-compose nor docker compose is available${NC}" | tee -a "$TEST_LOG"
exit 1
fi
}
# Stop any existing test environment (cleanup)
echo -e "${YELLOW}Cleaning up any existing test environment...${NC}" | tee -a "$TEST_LOG"
run_docker_compose -f "$SCRIPT_DIR/test-env.yml" down >> "$TEST_LOG" 2>&1
# Start the test environment
echo -e "${YELLOW}Starting test environment with docker-compose...${NC}" | tee -a "$TEST_LOG"
run_docker_compose -f "$SCRIPT_DIR/test-env.yml" up -d >> "$TEST_LOG" 2>&1
if [ $? -ne 0 ]; then
echo -e "${RED}Failed to start test environment.${NC}" | tee -a "$TEST_LOG"
echo "Check the log file for details: $TEST_LOG" | tee -a "$TEST_LOG"
exit 1
fi
# Check if external backend is available
echo -e "${YELLOW}Checking if external backend is available...${NC}" | tee -a "$TEST_LOG"
max_attempts=10
attempt=1
backend_ready=false
while [ $attempt -le $max_attempts ] && [ "$backend_ready" = "false" ]; do
echo "Checking backend readiness (attempt $attempt/$max_attempts)..." | tee -a "$TEST_LOG"
if curl -s http://192.168.0.105:5000/api/health &> /dev/null; then
backend_ready=true
echo -e "${GREEN}External backend is available!${NC}" | tee -a "$TEST_LOG"
else
echo "External backend not available yet, waiting..." | tee -a "$TEST_LOG"
sleep 2
attempt=$((attempt+1))
fi
done
if [ "$backend_ready" = "false" ]; then
echo -e "${RED}External backend at 192.168.0.105:5000 is not available after $max_attempts attempts${NC}" | tee -a "$TEST_LOG"
echo -e "${RED}Please make sure the backend is running on the separate Raspberry Pi${NC}" | tee -a "$TEST_LOG"
# Cleanup
run_docker_compose -f "$SCRIPT_DIR/test-env.yml" down >> "$TEST_LOG" 2>&1
exit 1
fi
# Wait for frontend to be ready
echo -e "${YELLOW}Waiting for frontend to be ready...${NC}" | tee -a "$TEST_LOG"
max_attempts=30
attempt=1
frontend_ready=false
while [ $attempt -le $max_attempts ] && [ "$frontend_ready" = "false" ]; do
echo "Checking frontend readiness (attempt $attempt/$max_attempts)..." | tee -a "$TEST_LOG"
if curl -s http://127.0.0.1:3000 &> /dev/null; then
frontend_ready=true
echo -e "${GREEN}Frontend is ready!${NC}" | tee -a "$TEST_LOG"
else
echo "Frontend not ready yet, waiting..." | tee -a "$TEST_LOG"
sleep 2
attempt=$((attempt+1))
fi
done
if [ "$frontend_ready" = "false" ]; then
echo -e "${RED}Frontend failed to start properly after $max_attempts attempts${NC}" | tee -a "$TEST_LOG"
echo "Logs from frontend container:" | tee -a "$TEST_LOG"
run_docker_compose -f "$SCRIPT_DIR/test-env.yml" logs frontend-test >> "$TEST_LOG" 2>&1
# Cleanup
run_docker_compose -f "$SCRIPT_DIR/test-env.yml" down >> "$TEST_LOG" 2>&1
exit 1
fi
# Perform basic integration tests
echo -e "${YELLOW}Performing basic integration tests...${NC}" | tee -a "$TEST_LOG"
# Test 1: Frontend can fetch API data (printers endpoint)
echo "Test 1: Frontend can fetch data from backend API..." | tee -a "$TEST_LOG"
frontend_container_id=$(docker ps -qf "name=myp-frontend-test")
if [ -z "$frontend_container_id" ]; then
echo -e "${RED}Failed to find frontend container${NC}" | tee -a "$TEST_LOG"
run_docker_compose -f "$SCRIPT_DIR/test-env.yml" down >> "$TEST_LOG" 2>&1
exit 1
fi
# Run a simple test inside the frontend container to check API connectivity
api_test_result=$(docker exec $frontend_container_id curl -s http://192.168.0.105:5000/api/health)
if [[ "$api_test_result" == *"healthy"* ]]; then
echo -e "${GREEN}Test 1 PASSED: Frontend can connect to backend API${NC}" | tee -a "$TEST_LOG"
else
echo -e "${RED}Test 1 FAILED: Frontend cannot connect to backend API${NC}" | tee -a "$TEST_LOG"
echo "API response: $api_test_result" | tee -a "$TEST_LOG"
# Don't exit, continue with other tests
fi
# Test 2: Frontend serves HTML content
echo "Test 2: Frontend serves valid HTML content..." | tee -a "$TEST_LOG"
frontend_html=$(curl -s http://127.0.0.1:3000)
if [[ "$frontend_html" == *"<!DOCTYPE html>"* ]]; then
echo -e "${GREEN}Test 2 PASSED: Frontend serves valid HTML${NC}" | tee -a "$TEST_LOG"
else
echo -e "${RED}Test 2 FAILED: Frontend does not serve valid HTML${NC}" | tee -a "$TEST_LOG"
# Don't exit, continue with other tests
fi
# All tests completed
echo -e "${GREEN}Integration tests completed${NC}" | tee -a "$TEST_LOG"
# Ask if the environment should be kept running or shutdown
echo -e "${YELLOW}Test environment is running at:${NC}" | tee -a "$TEST_LOG"
echo "Frontend: http://127.0.0.1:3000" | tee -a "$TEST_LOG"
echo "Backend: http://192.168.0.105:5000 (external Raspberry Pi)" | tee -a "$TEST_LOG"
echo "" | tee -a "$TEST_LOG"
read -p "Do you want to keep the test environment running? (y/n): " keep_running
if [[ "$keep_running" != "y" && "$keep_running" != "Y" ]]; then
echo -e "${YELLOW}Shutting down test environment...${NC}" | tee -a "$TEST_LOG"
run_docker_compose -f "$SCRIPT_DIR/test-env.yml" down >> "$TEST_LOG" 2>&1
echo -e "${GREEN}Test environment has been shut down${NC}" | tee -a "$TEST_LOG"
else
echo -e "${GREEN}Test environment is still running${NC}" | tee -a "$TEST_LOG"
echo "To stop it later, run: docker-compose -f $SCRIPT_DIR/test-env.yml down" | tee -a "$TEST_LOG"
fi
echo -e "${GREEN}Integration testing completed. See log for details: $TEST_LOG${NC}"