diff --git a/docker/build_and_push_eveai.sh b/docker/build_and_push_eveai.sh index b67f238..6434757 100755 --- a/docker/build_and_push_eveai.sh +++ b/docker/build_and_push_eveai.sh @@ -3,19 +3,29 @@ # Exit on any error set -e -source ./docker_env_switch.sh dev +source ./podman_env_switch.sh dev # Load environment variables source .env -# Docker registry -REGISTRY="josakola" +# Check if podman is available +if ! command -v podman &> /dev/null; then + echo "Error: podman not found" + exit 1 +fi + +echo "Using container runtime: podman" + +# Local registry +REGISTRY="registry.ask-eve-ai-local.com" +# Account prefix voor consistency met Docker Hub +ACCOUNT="josakola" # Tag (you might want to use a version or git commit hash) TAG="latest" -# Platforms to build for -PLATFORMS="linux/amd64,linux/arm64" +# Single platform - AMD64 only for simplicity +PLATFORM="linux/amd64" # Default action ACTION="both" @@ -28,13 +38,14 @@ DEBUG="" # Function to display usage information usage() { echo "Usage: $0 [-b|-p] [--no-cache] [--progress=plain] [--debug] [service1 service2 ...]" - echo " -b: Build only (for current platform)" - echo " -p: Push only (multi-platform)" + echo " -b: Build only" + echo " -p: Push only" echo " --no-cache: Perform a clean build without using cache" echo " --progress=plain: Show detailed progress of the build" echo " --debug: Enable debug mode for the build" echo " If no option is provided, both build and push will be performed." echo " If no services are specified, all eveai_ services and nginx will be processed." + echo " All images are built for AMD64 platform (compatible with both x86_64 and Apple Silicon via emulation)." } # Parse command-line options @@ -92,47 +103,57 @@ process_service() { return 1 fi + # Construct image names + LOCAL_IMAGE_NAME="$ACCOUNT/$SERVICE:$TAG" + REGISTRY_IMAGE_NAME="$REGISTRY/$ACCOUNT/$SERVICE:$TAG" + + echo "Building for platform: $PLATFORM" + echo "Local tag: $LOCAL_IMAGE_NAME" + echo "Registry tag: $REGISTRY_IMAGE_NAME" + # Build and/or push based on ACTION if [ "$ACTION" = "build" ]; then - echo "Building $SERVICE for current platform..." - docker build \ + echo "Building $SERVICE for $PLATFORM..." + podman build \ + --platform "$PLATFORM" \ $NO_CACHE \ $PROGRESS \ $DEBUG \ - -t "$REGISTRY/$SERVICE:$TAG" \ - -f "$CONTEXT/$DOCKERFILE" \ - "$CONTEXT" - elif [ "$ACTION" = "push" ]; then - echo "Building and pushing $SERVICE for multiple platforms..." - docker buildx build \ - $NO_CACHE \ - $PROGRESS \ - $DEBUG \ - --platform "$PLATFORMS" \ - -t "$REGISTRY/$SERVICE:$TAG" \ - -f "$CONTEXT/$DOCKERFILE" \ - "$CONTEXT" \ - --push - else - echo "Building $SERVICE for current platform..." - docker build \ - $NO_CACHE \ - $PROGRESS \ - $DEBUG \ - -t "$REGISTRY/$SERVICE:$TAG" \ + -t "$LOCAL_IMAGE_NAME" \ + -t "$REGISTRY_IMAGE_NAME" \ -f "$CONTEXT/$DOCKERFILE" \ "$CONTEXT" - echo "Building and pushing $SERVICE for multiple platforms..." - docker buildx build \ + elif [ "$ACTION" = "push" ]; then + echo "Building and pushing $SERVICE for $PLATFORM..." + podman build \ + --platform "$PLATFORM" \ $NO_CACHE \ $PROGRESS \ $DEBUG \ - --platform "$PLATFORMS" \ - -t "$REGISTRY/$SERVICE:$TAG" \ + -t "$LOCAL_IMAGE_NAME" \ + -t "$REGISTRY_IMAGE_NAME" \ -f "$CONTEXT/$DOCKERFILE" \ - "$CONTEXT" \ - --push + "$CONTEXT" + + echo "Pushing $SERVICE to registry..." + podman push "$REGISTRY_IMAGE_NAME" + + else + # Both build and push + echo "Building $SERVICE for $PLATFORM..." + podman build \ + --platform "$PLATFORM" \ + $NO_CACHE \ + $PROGRESS \ + $DEBUG \ + -t "$LOCAL_IMAGE_NAME" \ + -t "$REGISTRY_IMAGE_NAME" \ + -f "$CONTEXT/$DOCKERFILE" \ + "$CONTEXT" + + echo "Pushing $SERVICE to registry..." + podman push "$REGISTRY_IMAGE_NAME" fi } @@ -146,31 +167,25 @@ else SERVICES=("$@") fi -# Check if eveai_builder exists, if not create it -if ! docker buildx inspect eveai_builder > /dev/null 2>&1; then - echo "Creating eveai_builder..." - docker buildx create --name eveai_builder -fi - -# Use eveai_builder -echo "Using eveai_builder..." -docker buildx use eveai_builder +echo "Using simplified AMD64-only approach for maximum compatibility..." +echo "Images will be tagged as: $REGISTRY/$ACCOUNT/[service]:$TAG" # Loop through services for SERVICE in "${SERVICES[@]}"; do if [[ "$SERVICE" == "nginx" ]]; then - ./copy_specialist_svgs.sh ../config ../nginx/static/assets + ./copy_specialist_svgs.sh ../config ../nginx/static/assets 2>/dev/null || echo "Warning: copy_specialist_svgs.sh not found or failed" fi if [[ "$SERVICE" == "nginx" || "$SERVICE" == eveai_* || "$SERVICE" == "flower" || "$SERVICE" == "prometheus" || "$SERVICE" == "grafana" ]]; then if process_service "$SERVICE"; then - echo "Successfully processed $SERVICE" + echo "✅ Successfully processed $SERVICE" else - echo "Failed to process $SERVICE" + echo "❌ Failed to process $SERVICE" fi else - echo "Skipping $SERVICE as it's not nginx, flower, prometheus, grafana or doesn't start with eveai_" + echo "⏭️ Skipping $SERVICE as it's not nginx, flower, prometheus, grafana or doesn't start with eveai_" fi done -echo -e "\033[35mAll specified services processed.\033[0m" -echo -e "\033[35mFinished at $(date +"%d/%m/%Y %H:%M:%S")\033[0m" +echo -e "\033[32m✅ All specified services processed successfully!\033[0m" +echo -e "\033[32m📦 Images are available locally and in registry\033[0m" +echo -e "\033[32m🕐 Finished at $(date +"%d/%m/%Y %H:%M:%S")\033[0m" \ No newline at end of file diff --git a/docker/compose_dev.yaml b/docker/compose_dev.yaml index 68a436d..0e8e45f 100644 --- a/docker/compose_dev.yaml +++ b/docker/compose_dev.yaml @@ -1,13 +1,4 @@ -# Comments are provided throughout this file to help you get started. -# If you need more help, visit the Docker Compose reference guide at -# https://docs.docker.com/go/compose-spec-reference/ - -# Here the instructions define your application as a service called "server". -# This service is built from the Dockerfile in the current directory. -# You can add other services your application may depend on here, such as a -# database or a cache. For examples, see the Awesome Compose repository: -# https://github.com/docker/awesome-compose - +# Podman Compose compatible versie met port schema compliance x-common-variables: &common-variables DB_HOST: db DB_USER: luke @@ -45,16 +36,13 @@ x-common-variables: &common-variables services: nginx: + container_name: nginx image: josakola/nginx:latest build: context: .. dockerfile: ./docker/nginx/Dockerfile - platforms: - - linux/amd64 - - linux/arm64 ports: - - 80:80 - - 8080:8080 + - 3002:80 # Dev nginx proxy volgens port schema environment: <<: *common-variables volumes: @@ -72,18 +60,16 @@ services: - eveai_api - eveai_chat_client networks: - - eveai-network + - eveai-dev-network eveai_app: + container_name: eveai_app image: josakola/eveai_app:latest build: context: .. dockerfile: ./docker/eveai_app/Dockerfile - platforms: - - linux/amd64 - - linux/arm64 ports: - - 5001:5001 + - 3000:5001 # Dev app volgens port schema expose: - 8000 environment: @@ -108,20 +94,18 @@ services: healthcheck: test: ["CMD", "curl", "-f", "http://localhost:5001/healthz/ready"] interval: 30s - timeout: 1s + timeout: 10s retries: 3 - start_period: 30s + start_period: 60s networks: - - eveai-network + - eveai-dev-network eveai_workers: + container_name: eveai_workers image: josakola/eveai_workers:latest build: context: .. dockerfile: ./docker/eveai_workers/Dockerfile - platforms: - - linux/amd64 - - linux/arm64 expose: - 8000 environment: @@ -142,18 +126,16 @@ services: minio: condition: service_healthy networks: - - eveai-network + - eveai-dev-network eveai_chat_client: + container_name: eveai_chat_client image: josakola/eveai_chat_client:latest build: context: .. dockerfile: ./docker/eveai_chat_client/Dockerfile - platforms: - - linux/amd64 - - linux/arm64 ports: - - 5004:5004 + - 3004:5004 # Dev chat client volgens port schema expose: - 8000 environment: @@ -176,20 +158,18 @@ services: healthcheck: test: ["CMD", "curl", "-f", "http://localhost:5004/healthz/ready"] interval: 30s - timeout: 1s + timeout: 10s retries: 3 - start_period: 30s + start_period: 60s networks: - - eveai-network + - eveai-dev-network eveai_chat_workers: + container_name: eveai_chat_workers image: josakola/eveai_chat_workers:latest build: context: .. dockerfile: ./docker/eveai_chat_workers/Dockerfile - platforms: - - linux/amd64 - - linux/arm64 expose: - 8000 environment: @@ -208,26 +188,21 @@ services: redis: condition: service_healthy networks: - - eveai-network + - eveai-dev-network eveai_api: + container_name: eveai_api image: josakola/eveai_api:latest build: context: .. dockerfile: ./docker/eveai_api/Dockerfile - platforms: - - linux/amd64 - - linux/arm64 ports: - - 5003:5003 + - 3001:5003 # Dev API volgens port schema expose: - 8000 environment: <<: *common-variables COMPONENT_NAME: eveai_api - WORDPRESS_HOST: host.docker.internal - WORDPRESS_PORT: 10003 - WORDPRESS_PROTOCOL: http volumes: - ../eveai_api:/app/eveai_api - ../common:/app/common @@ -245,20 +220,18 @@ services: healthcheck: test: [ "CMD", "curl", "-f", "http://localhost:5003/healthz/ready" ] interval: 30s - timeout: 1s + timeout: 10s retries: 3 - start_period: 30s + start_period: 60s networks: - - eveai-network + - eveai-dev-network eveai_beat: + container_name: eveai_beat image: josakola/eveai_beat:latest build: context: .. dockerfile: ./docker/eveai_beat/Dockerfile - platforms: - - linux/amd64 - - linux/arm64 environment: <<: *common-variables COMPONENT_NAME: eveai_beat @@ -273,16 +246,14 @@ services: redis: condition: service_healthy networks: - - eveai-network + - eveai-dev-network eveai_entitlements: + container_name: eveai_entitlements image: josakola/eveai_entitlements:latest build: context: .. dockerfile: ./docker/eveai_entitlements/Dockerfile - platforms: - - linux/amd64 - - linux/arm64 expose: - 8000 environment: @@ -303,13 +274,14 @@ services: minio: condition: service_healthy networks: - - eveai-network + - eveai-dev-network db: + container_name: db hostname: db image: ankane/pgvector ports: - - 5432:5432 + - 3005:5432 # Dev database volgens port schema (vermijd standaard 5432) restart: always environment: - POSTGRES_DB=eveai @@ -324,13 +296,14 @@ services: timeout: 5s retries: 5 networks: - - eveai-network + - eveai-dev-network redis: + container_name: redis image: redis:7.2.5 restart: always ports: - - "6379:6379" + - "3006:6379" # Dev Redis volgens port schema (vermijd standaard 6379) volumes: - ./db/redis:/data healthcheck: @@ -339,9 +312,10 @@ services: timeout: 5s retries: 5 networks: - - eveai-network + - eveai-dev-network flower: + container_name: flower image: josakola/flower:latest build: context: .. @@ -351,17 +325,18 @@ services: volumes: - ../scripts:/app/scripts ports: - - "5555:5555" + - "3007:5555" # Dev Flower volgens port schema depends_on: - redis networks: - - eveai-network + - eveai-dev-network minio: + container_name: minio image: minio/minio ports: - - "9000:9000" - - "9001:9001" + - "3008:9000" # Dev MinIO volgens port schema + - "3009:9001" # Dev MinIO console expose: - 9000 volumes: @@ -376,18 +351,18 @@ services: interval: 30s timeout: 20s retries: 3 - start_period: 30s + start_period: 60s networks: - - eveai-network + - eveai-dev-network prometheus: - image: prom/prometheus:latest + container_name: prometheus + image: josakola/prometheus:latest build: context: ./prometheus dockerfile: Dockerfile - container_name: prometheus ports: - - "9090:9090" + - "3010:9090" # Dev Prometheus volgens port schema volumes: - ./prometheus/prometheus.yml:/etc/prometheus/prometheus.yml - ./prometheus/data:/prometheus @@ -399,24 +374,25 @@ services: - '--web.enable-lifecycle' restart: unless-stopped networks: - - eveai-network + - eveai-dev-network pushgateway: + container_name: pushgateway image: prom/pushgateway:latest restart: unless-stopped ports: - - "9091:9091" + - "3011:9091" # Dev Pushgateway volgens port schema networks: - - eveai-network + - eveai-dev-network grafana: - image: grafana/grafana:latest + container_name: grafana + image: josakola/grafana:latest build: context: ./grafana dockerfile: Dockerfile - container_name: grafana ports: - - "3000:3000" + - "3012:3000" # Dev Grafana volgens port schema volumes: - ./grafana/provisioning:/etc/grafana/provisioning - ./grafana/data:/var/lib/grafana @@ -428,21 +404,12 @@ services: depends_on: - prometheus networks: - - eveai-network + - eveai-dev-network networks: - eveai-network: + eveai-dev-network: driver: bridge - # This enables the containers to access the host network - driver_opts: - com.docker.network.bridge.host_ipc: "true" volumes: minio_data: - eveai_logs: -# db-data: -# redis-data: -# tenant-files: -#secrets: -# db-password: -# file: ./db/password.txt + eveai_logs: \ No newline at end of file diff --git a/docker/compose_test.yaml b/docker/compose_test.yaml index 7aedc10..b7ace9d 100644 --- a/docker/compose_test.yaml +++ b/docker/compose_test.yaml @@ -43,36 +43,36 @@ x-common-variables: &common-variables SW_EMAIL_NAME: "Evie Admin (test)" SW_PROJECT: "f282f55a-ea52-4538-a979-5bcb890717ab" +name: eveai_test + services: nginx: - image: josakola/nginx:${EVEAI_VERSION:-latest} + image: josakola/nginx:latest ports: - - 80:80 - - 8080:8080 + - 4080:80 environment: <<: *common-variables volumes: - - eveai_logs:/var/log/nginx + - test_eveai_logs:/var/log/nginx depends_on: - eveai_app - eveai_api - eveai_chat_client networks: - - eveai-network + - eveai-test-network restart: "no" eveai_app: - image: josakola/eveai_app:${EVEAI_VERSION:-latest} + image: josakola/eveai_app:latest ports: - - 5001:5001 + - 4001:5001 expose: - 8000 environment: <<: *common-variables COMPONENT_NAME: eveai_app volumes: - - eveai_logs:/app/logs - - crewai_storage:/app/crewai_storage + - test_eveai_logs:/app/logs depends_on: redis: condition: service_healthy @@ -85,40 +85,38 @@ services: retries: 3 start_period: 30s networks: - - eveai-network + - eveai-test-network restart: "no" eveai_workers: - image: josakola/eveai_workers:${EVEAI_VERSION:-latest} + image: josakola/eveai_workers:latest expose: - 8000 environment: <<: *common-variables COMPONENT_NAME: eveai_workers volumes: - - eveai_logs:/app/logs - - crewai_storage:/app/crewai_storage + - test_eveai_logs:/app/logs depends_on: redis: condition: service_healthy minio: condition: service_healthy networks: - - eveai-network + - eveai-test-network restart: "no" eveai_chat_client: - image: josakola/eveai_chat_client:${EVEAI_VERSION:-latest} + image: josakola/eveai_chat_client:latest ports: - - 5004:5004 + - 4004:5004 expose: - 8000 environment: <<: *common-variables COMPONENT_NAME: eveai_chat_client volumes: - - eveai_logs:/app/logs - - crewai_storage:/app/crewai_storage + - test_eveai_logs:/app/logs depends_on: redis: condition: service_healthy @@ -131,38 +129,36 @@ services: retries: 3 start_period: 30s networks: - - eveai-network + - eveai-test-network restart: "no" eveai_chat_workers: - image: josakola/eveai_chat_workers:${EVEAI_VERSION:-latest} + image: josakola/eveai_chat_workers:latest expose: - 8000 environment: <<: *common-variables COMPONENT_NAME: eveai_chat_workers volumes: - - eveai_logs:/app/logs - - crewai_storage:/app/crewai_storage + - test_eveai_logs:/app/logs depends_on: redis: condition: service_healthy networks: - - eveai-network + - eveai-test-network restart: "no" eveai_api: - image: josakola/eveai_api:${EVEAI_VERSION:-latest} + image: josakola/eveai_api:latest ports: - - 5003:5003 + - 4003:5003 expose: - 8000 environment: <<: *common-variables COMPONENT_NAME: eveai_api volumes: - - eveai_logs:/app/logs - - crewai_storage:/app/crewai_storage + - test_eveai_logs:/app/logs depends_on: redis: condition: service_healthy @@ -175,80 +171,78 @@ services: retries: 3 start_period: 30s networks: - - eveai-network + - eveai-test-network restart: "no" eveai_beat: - image: josakola/eveai_beat:${EVEAI_VERSION:-latest} + image: josakola/eveai_beat:latest environment: <<: *common-variables COMPONENT_NAME: eveai_beat volumes: - - eveai_logs:/app/logs - - crewai_storage:/app/crewai_storage + - test_eveai_logs:/app/logs depends_on: redis: condition: service_healthy networks: - - eveai-network + - eveai-test-network restart: "no" eveai_entitlements: - image: josakola/eveai_entitlements:${EVEAI_VERSION:-latest} + image: josakola/eveai_entitlements:latest expose: - 8000 environment: <<: *common-variables COMPONENT_NAME: eveai_entitlements volumes: - - eveai_logs:/app/logs - - crewai_storage:/app/crewai_storage + - test_eveai_logs:/app/logs depends_on: redis: condition: service_healthy minio: condition: service_healthy networks: - - eveai-network + - eveai-test-network restart: "no" redis: image: redis:7.2.5 restart: no ports: - - "6379:6379" + - "4006:6379" volumes: - - redisdata:/data + - test_redisdata:/data healthcheck: test: [ "CMD", "redis-cli", "ping" ] interval: 10s timeout: 5s retries: 5 networks: - - eveai-network + - eveai-test-network flower: - image: josakola/flower:${EVEAI_VERSION:-latest} + image: josakola/flower:latest environment: <<: *common-variables ports: - - "5555:5555" + - "4007:5555" depends_on: - redis networks: - - eveai-network + - eveai-test-network restart: "no" minio: image: minio/minio ports: - - "9000:9000" - - "9001:9001" + - "4008:9000" + - "4009:9001" expose: - 9000 volumes: - - miniodata:/data - - minioconfig:/root/.minio + - test_miniodata:/data + - test_minioconfig:/root/.minio environment: MINIO_ROOT_USER: ${MINIO_ROOT_USER:-minioadmin} MINIO_ROOT_PASSWORD: ${MINIO_ROOT_PASSWORD:-minioadmin} @@ -260,16 +254,16 @@ services: retries: 3 start_period: 30s networks: - - eveai-network + - eveai-test-network restart: "no" prometheus: image: josakola/prometheus:${EVEAI_VERSION:-latest} container_name: prometheus ports: - - "9090:9090" + - "4010:9090" volumes: - - prometheusdata:/prometheus + - test_prometheusdata:/prometheus command: - '--config.file=/etc/prometheus/prometheus.yml' - '--storage.tsdb.path=/prometheus' @@ -278,23 +272,23 @@ services: - '--web.enable-lifecycle' restart: no networks: - - eveai-network + - eveai-test-network pushgateway: image: prom/pushgateway:latest restart: unless-stopped ports: - - "9091:9091" + - "4011:9091" networks: - - eveai-network + - eveai-test-network grafana: image: josakola/grafana:${EVEAI_VERSION:-latest} container_name: grafana ports: - - "3000:3000" + - "4012:3000" volumes: - - grafanadata:/var/lib/grafana + - test_grafanadata:/var/lib/grafana environment: - GF_SECURITY_ADMIN_USER=admin - GF_SECURITY_ADMIN_PASSWORD=admin @@ -303,21 +297,16 @@ services: depends_on: - prometheus networks: - - eveai-network + - eveai-test-network networks: - eveai-network: + eveai-test-network: driver: bridge - # This enables the containers to access the host network - driver_opts: - com.docker.network.bridge.host_ipc: "true" volumes: - eveai_logs: - pgdata: - redisdata: - miniodata: - minioconfig: - prometheusdata: - grafanadata: - crewai_storage: + test_eveai_logs: + test_redisdata: + test_miniodata: + test_minioconfig: + test_prometheusdata: + test_grafanadata: diff --git a/docker/docker_env_switch.sh b/docker/docker_env_switch.sh deleted file mode 100755 index 1cfa407..0000000 --- a/docker/docker_env_switch.sh +++ /dev/null @@ -1,155 +0,0 @@ -#!/bin/zsh -# or use #!/usr/bin/env zsh - -# Function to display usage information -usage() { - echo "Usage: source $0 [version]" - echo " environment: The environment to use (dev, prod, test, integration, bugfix)" - echo " version : (Optional) Specific release version to deploy" - echo " If not specified, uses 'latest' (except for dev environment)" -} - -# Replace the existing check at the beginning of docker_env_switch.sh -# Check if the script is sourced -if [[ "${BASH_SOURCE[0]}" == "${0}" ]]; then - # Script is being executed directly from terminal - echo "Error: This script must be sourced, not executed directly." - echo "Please run: source $0 [version]" - exit 1 -fi -# If we reach here, script is being sourced (either by terminal or another script) - -# Check if an environment is provided -if [ $# -eq 0 ]; then - usage - return 1 -fi - -ENVIRONMENT=$1 -VERSION=${2:-latest} # Default to latest if not specified - -# Set variables based on the environment -case $ENVIRONMENT in - dev) - DOCKER_CONTEXT="default" - COMPOSE_FILE="compose_dev.yaml" - VERSION="latest" # Always use latest for dev - ;; - prod) - DOCKER_CONTEXT="mxz536.stackhero-network.com" - COMPOSE_FILE="compose_stackhero.yaml" - ;; - test) - DOCKER_CONTEXT="test-environment" # Change to your actual test Docker context - COMPOSE_FILE="compose_test.yaml" - ;; - integration) - DOCKER_CONTEXT="integration-environment" # Change to your actual integration Docker context - COMPOSE_FILE="compose_integration.yaml" - ;; - bugfix) - DOCKER_CONTEXT="bugfix-environment" # Change to your actual bugfix Docker context - COMPOSE_FILE="compose_bugfix.yaml" - ;; - *) - echo "Invalid environment: $ENVIRONMENT" - usage - return 1 - ;; -esac - -# Set Docker account -DOCKER_ACCOUNT="josakola" - -# Check if Docker context exists -if ! docker context ls --format '{{.Name}}' | grep -q "^$DOCKER_CONTEXT$"; then - echo "Warning: Docker context '$DOCKER_CONTEXT' does not exist." - - # Prompt user if they want to create the context - if [[ "$DOCKER_CONTEXT" != "default" ]]; then - echo "Do you want to set up this context now? (y/n): " - read CREATE_CONTEXT - if [[ "$CREATE_CONTEXT" == "y" || "$CREATE_CONTEXT" == "Y" ]]; then - # You would add here the specific code to create each context type - # For example, for remote contexts you might need SSH settings - echo "Please specify the Docker host URL (e.g., ssh://user@remote_host or tcp://remote_host:2375):" - read DOCKER_HOST - - docker context create "$DOCKER_CONTEXT" --docker "host=$DOCKER_HOST" - if [ $? -ne 0 ]; then - echo "Failed to create Docker context. Please create it manually." - return 1 - fi - else - echo "Using default context instead." - DOCKER_CONTEXT="default" - fi - fi -fi - -# Check if compose file exists -if [ ! -f "$COMPOSE_FILE" ]; then - echo "Warning: Compose file '$COMPOSE_FILE' does not exist." - echo "Do you want to create it based on compose_dev.yaml? (y/n): " - read CREATE_FILE - if [[ "$CREATE_FILE" == "y" || "$CREATE_FILE" == "Y" ]]; then - # Create new compose file based on compose_dev.yaml with version variables - sed 's/\(image: josakola\/[^:]*\):latest/\1:${EVEAI_VERSION:-latest}/g' compose_dev.yaml > "$COMPOSE_FILE" - echo "Created $COMPOSE_FILE with version placeholders." - else - echo "Cannot proceed without a valid compose file." - return 1 - fi -fi - -# Switch Docker context -echo "Switching to Docker context: $DOCKER_CONTEXT" -docker context use $DOCKER_CONTEXT - -# Set environment variables -export COMPOSE_FILE=$COMPOSE_FILE -export EVEAI_VERSION=$VERSION -export DOCKER_ACCOUNT=$DOCKER_ACCOUNT - -echo "Set COMPOSE_FILE to $COMPOSE_FILE" -echo "Set EVEAI_VERSION to $VERSION" -echo "Set DOCKER_ACCOUNT to $DOCKER_ACCOUNT" - -docker-compose() { - docker compose -f $COMPOSE_FILE "$@" -} - -dc() { - docker compose -f $COMPOSE_FILE "$@" -} - -dcup() { - docker compose -f $COMPOSE_FILE up -d --remove-orphans "$@" -} - -dcdown() { - docker compose -f $COMPOSE_FILE down "$@" -} - -dcps() { - docker compose -f $COMPOSE_FILE ps "$@" -} - -dclogs() { - docker compose -f $COMPOSE_FILE logs "$@" -} - -dcpull() { - docker compose -f $COMPOSE_FILE pull "$@" -} - -dcrefresh() { - docker compose -f $COMPOSE_FILE pull && docker compose -f $COMPOSE_FILE up -d --remove-orphans "$@" -} - -# Exporteer de functies zodat ze beschikbaar zijn in andere scripts -export -f docker-compose dc dcup dcdown dcps dclogs dcpull dcrefresh - - -echo "Docker environment switched to $ENVIRONMENT with version $VERSION" -echo "You can now use 'docker-compose', 'dc', 'dcup', 'dcdown', 'dcps', 'dclogs', 'dcpull' or 'dcrefresh' commands" \ No newline at end of file diff --git a/docker/podman_env_switch.sh b/docker/podman_env_switch.sh new file mode 100644 index 0000000..623aa18 --- /dev/null +++ b/docker/podman_env_switch.sh @@ -0,0 +1,250 @@ +#!/usr/bin/env zsh + +# Function to display usage information +usage() { + echo "Usage: source $0 [version]" + echo " environment: The environment to use (dev, prod, test, integration, bugfix)" + echo " version : (Optional) Specific release version to deploy" + echo " If not specified, uses 'latest' (except for dev environment)" +} + +# Check if the script is sourced - improved for both bash and zsh +is_sourced() { + if [[ -n "$ZSH_VERSION" ]]; then + # In zsh, check if we're in a sourced context + [[ "$ZSH_EVAL_CONTEXT" =~ "(:file|:cmdsubst)" ]] || [[ "$0" != "$ZSH_ARGZERO" ]] + else + # In bash, compare BASH_SOURCE with $0 + [[ "${BASH_SOURCE[0]}" != "${0}" ]] + fi +} + +if ! is_sourced; then + echo "Error: This script must be sourced, not executed directly." + echo "Please run: source $0 [version]" + if [[ -n "$ZSH_VERSION" ]]; then + return 1 2>/dev/null || exit 1 + else + exit 1 + fi +fi + +# Check if an environment is provided +if [ $# -eq 0 ]; then + usage + return 1 +fi + +ENVIRONMENT=$1 +VERSION=${2:-latest} # Default to latest if not specified + +# Check if podman and podman-compose are available +if ! command -v podman &> /dev/null; then + echo "Error: podman is not installed or not in PATH" + echo "Please install podman first" + return 1 +fi + +if ! command -v podman-compose &> /dev/null; then + echo "Error: podman-compose is not installed or not in PATH" + echo "Please install podman-compose first" + return 1 +fi + +CONTAINER_CMD="podman" +# Store the actual path to podman-compose to avoid recursion +COMPOSE_CMD_PATH=$(command -v podman-compose) + +echo "Using container runtime: $CONTAINER_CMD" +echo "Using compose command: $COMPOSE_CMD_PATH" + +# Set default platform to AMD64 for consistency +export BUILDAH_PLATFORM=linux/amd64 +export PODMAN_PLATFORM=linux/amd64 + +# Set variables based on the environment +case $ENVIRONMENT in + dev) + PODMAN_CONNECTION="default" + COMPOSE_FILE="compose_dev.yaml" + VERSION="latest" # Always use latest for dev + ;; + prod) + PODMAN_CONNECTION="mxz536.stackhero-network.com" + COMPOSE_FILE="compose_stackhero.yaml" + ;; + test) + PODMAN_CONNECTION="test-environment" + COMPOSE_FILE="compose_test.yaml" + ;; + integration) + PODMAN_CONNECTION="integration-environment" + COMPOSE_FILE="compose_integration.yaml" + ;; + bugfix) + PODMAN_CONNECTION="bugfix-environment" + COMPOSE_FILE="compose_bugfix.yaml" + ;; + *) + echo "Invalid environment: $ENVIRONMENT" + usage + return 1 + ;; +esac + +# Set container registry account +CONTAINER_ACCOUNT="josakola" + +# Handle remote connections for podman +if [[ "$PODMAN_CONNECTION" != "default" ]]; then + echo "Setting up remote podman connection: $PODMAN_CONNECTION" + + # Check if podman connection exists + if ! podman system connection list --format '{{.Name}}' 2>/dev/null | grep -q "^$PODMAN_CONNECTION$"; then + echo "Warning: Podman connection '$PODMAN_CONNECTION' does not exist." + echo -n "Do you want to set up this connection now? (y/n): " + read -r CREATE_CONNECTION + if [[ "$CREATE_CONNECTION" == "y" || "$CREATE_CONNECTION" == "Y" ]]; then + echo -n "Please specify the SSH connection string (e.g., user@remote_host): " + read -r SSH_CONNECTION + + if [[ -n "$SSH_CONNECTION" ]]; then + podman system connection add "$PODMAN_CONNECTION" --identity ~/.ssh/id_rsa "ssh://$SSH_CONNECTION/run/user/1000/podman/podman.sock" + if [[ $? -ne 0 ]]; then + echo "Failed to create podman connection. Please create it manually." + return 1 + fi + else + echo "No SSH connection string provided." + return 1 + fi + else + echo "Using local podman setup instead." + PODMAN_CONNECTION="default" + fi + fi + + # Set the connection + if [[ "$PODMAN_CONNECTION" != "default" ]]; then + # Use podman context instead of manually setting CONTAINER_HOST + podman system connection default "$PODMAN_CONNECTION" 2>/dev/null + if [[ $? -eq 0 ]]; then + echo "Switched to remote podman connection: $PODMAN_CONNECTION" + else + echo "Warning: Failed to switch to connection $PODMAN_CONNECTION, using local setup" + PODMAN_CONNECTION="default" + fi + fi +else + echo "Using local podman setup with AMD64 platform" + # Ensure we're using the default local connection + podman system connection default "" 2>/dev/null || true +fi + +# Check if compose file exists +if [[ ! -f "$COMPOSE_FILE" ]]; then + echo "Warning: Compose file '$COMPOSE_FILE' does not exist." + if [[ -f "compose_dev.yaml" ]]; then + echo -n "Do you want to create it based on compose_dev.yaml? (y/n): " + read -r CREATE_FILE + if [[ "$CREATE_FILE" == "y" || "$CREATE_FILE" == "Y" ]]; then + # Create new compose file based on compose_dev.yaml with version variables + if sed 's/\(image: josakola\/[^:]*\):latest/\1:${EVEAI_VERSION:-latest}/g' compose_dev.yaml > "$COMPOSE_FILE" 2>/dev/null; then + echo "Created $COMPOSE_FILE with version placeholders." + else + echo "Failed to create $COMPOSE_FILE" + return 1 + fi + else + echo "Cannot proceed without a valid compose file." + return 1 + fi + else + echo "Cannot create $COMPOSE_FILE: compose_dev.yaml not found." + return 1 + fi +fi + +# Set environment variables +export COMPOSE_FILE=$COMPOSE_FILE +export EVEAI_VERSION=$VERSION +export CONTAINER_ACCOUNT=$CONTAINER_ACCOUNT +export CONTAINER_CMD=$CONTAINER_CMD +export COMPOSE_CMD_PATH=$COMPOSE_CMD_PATH + +echo "Set COMPOSE_FILE to $COMPOSE_FILE" +echo "Set EVEAI_VERSION to $VERSION" +echo "Set CONTAINER_ACCOUNT to $CONTAINER_ACCOUNT" +echo "Set platform to AMD64 (linux/amd64)" + +# Define compose wrapper functions using the full path to avoid recursion +pc() { + $COMPOSE_CMD_PATH -f $COMPOSE_FILE "$@" +} + +pcup() { + $COMPOSE_CMD_PATH -f $COMPOSE_FILE up -d --remove-orphans "$@" +} + +pcdown() { + $COMPOSE_CMD_PATH -f $COMPOSE_FILE down "$@" +} + +pcps() { + $COMPOSE_CMD_PATH -f $COMPOSE_FILE ps "$@" +} + +pclogs() { + $COMPOSE_CMD_PATH -f $COMPOSE_FILE logs "$@" +} + +# Simplified pull - no platform tricks needed +pcpull() { + echo "Pulling AMD64 images..." + $COMPOSE_CMD_PATH -f $COMPOSE_FILE pull "$@" +} + +pcrefresh() { + $COMPOSE_CMD_PATH -f $COMPOSE_FILE pull && $COMPOSE_CMD_PATH -f $COMPOSE_FILE up -d --remove-orphans "$@" +} + +pcbuild() { + $COMPOSE_CMD_PATH -f $COMPOSE_FILE build "$@" +} + +pcrestart() { + $COMPOSE_CMD_PATH -f $COMPOSE_FILE restart "$@" +} + +pcstop() { + $COMPOSE_CMD_PATH -f $COMPOSE_FILE stop "$@" +} + +pcstart() { + $COMPOSE_CMD_PATH -f $COMPOSE_FILE start "$@" +} + +# Export functions - handle both bash and zsh +if [[ -n "$ZSH_VERSION" ]]; then + # In zsh, functions are automatically available in subshells + # But we can make them available globally with typeset + typeset -f pc pcup pcdown pcps pclogs pcpull pcrefresh pcbuild pcrestart pcstop pcstart > /dev/null +else + # Bash style export + export -f pc pcup pcdown pcps pclogs pcpull pcrefresh pcbuild pcrestart pcstop pcstart +fi + +echo "✅ Podman environment switched to $ENVIRONMENT with version $VERSION" +echo "🖥️ Platform: AMD64 (compatible with both Intel and Apple Silicon)" +echo "Available commands:" +echo " pc - podman-compose shorthand" +echo " pcup - start services in background" +echo " pcdown - stop and remove services" +echo " pcps - list running services" +echo " pclogs - view service logs" +echo " pcpull - pull latest images" +echo " pcrefresh - pull and restart services" +echo " pcbuild - build services" +echo " pcrestart - restart services" +echo " pcstop - stop services" +echo " pcstart - start stopped services" \ No newline at end of file