This is an automated email from the ASF dual-hosted git repository.
yasith pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/airavata.git
The following commit(s) were added to refs/heads/master by this push:
new 3aa17eb88c Monolithic Docker Setup for Apache Airavata with Docker
Compose Support (#554)
3aa17eb88c is described below
commit 3aa17eb88c46c882ba9788bb5e917ad9c1420c72
Author: Yasindu Dissanayake <[email protected]>
AuthorDate: Wed Aug 13 23:30:44 2025 +0530
Monolithic Docker Setup for Apache Airavata with Docker Compose Support
(#554)
* Add Dockerfile
* Add docker run script
* Add docker-compose.ymlz
* Modify GH Actions Workflow
* Fix compose file issue
* Add Properties File for Docker-compose
* Fix Properties file path
* Fix issue on Docker-Startup Script
---
.github/workflows/build-and-publish.yml | 84 ++++--
Dockerfile | 110 +++++++
.../deployment-scripts/airavata-server.properties | 328 +++++++++++++++++++++
dev-tools/deployment-scripts/docker-startup.sh | 214 ++++++++++++++
docker-compose.yml | 113 +++++++
5 files changed, 817 insertions(+), 32 deletions(-)
diff --git a/.github/workflows/build-and-publish.yml
b/.github/workflows/build-and-publish.yml
index 1b48c60f65..41650d2165 100644
--- a/.github/workflows/build-and-publish.yml
+++ b/.github/workflows/build-and-publish.yml
@@ -1,22 +1,34 @@
-name: Maven Docker Build & Push
+name: Build and Push Monolithic Airavata Docker Image
on:
push:
- tags:
- - "v*"
- release:
- types: [published]
+ branches: [ main, master ]
+ tags: [ "v*" ]
+ pull_request:
+ branches: [ main, master ]
+ workflow_dispatch:
env:
- DOCKER_REGISTRY: docker.io
- DOCKER_USERNAME: cybershuttle
- VERSION: ${{ github.ref_name }}
+ REGISTRY: docker.io
+ IMAGE_NAME: cybershuttle-airavata:latest
jobs:
- build:
- runs-on: ubuntu-22.04
+ build-and-push:
+ runs-on: ubuntu-latest
+ permissions:
+ contents: read
+ packages: write
steps:
+ - name: Checkout repository
+ uses: actions/checkout@v4
+
+ - name: Set up JDK 17
+ uses: actions/setup-java@v4
+ with:
+ distribution: "temurin"
+ java-version: "17"
+
- name: Install OS dependencies
run: |
sudo apt-get update
@@ -31,34 +43,42 @@ jobs:
make -j$(nproc)
sudo make install
- - name: Set up JDK 17
- uses: actions/setup-java@v4
- with:
- distribution: "temurin"
- java-version: "17"
+ - name: Build with Maven (skip tests)
+ run: mvn clean install -DskipTests
- - name: Checkout code
- uses: actions/checkout@v4
+ - name: Set up Docker Buildx
+ uses: docker/setup-buildx-action@v3
- - name: Login to Docker Hub
+ - name: Log in to Docker Hub
uses: docker/login-action@v3
with:
+ registry: ${{ env.REGISTRY }}
username: ${{ secrets.DOCKER_HUB_USERNAME }}
password: ${{ secrets.DOCKER_HUB_ACCESS_TOKEN }}
- - name: Build with Maven (skip tests)
- run: mvn clean install -DskipTests
-
- - name: Build Docker Images
- run: |
- mvn docker:build -pl modules/distribution
+ - name: Extract metadata
+ id: meta
+ uses: docker/metadata-action@v5
+ with:
+ images: ${{ env.REGISTRY }}/${{ secrets.DOCKER_HUB_USERNAME }}/${{
env.IMAGE_NAME }}
+ tags: |
+ type=ref,event=branch
+ type=ref,event=pr
+ type=semver,pattern={{version}}
+ type=semver,pattern={{major}}.{{minor}}
+ type=sha,prefix={{branch}}-
- - name: List Docker Images
- run: docker images
+ - name: Build and push Docker image
+ uses: docker/build-push-action@v5
+ with:
+ context: .
+ file: ./Dockerfile
+ push: ${{ github.event_name != 'pull_request' }}
+ tags: ${{ steps.meta.outputs.tags }}
+ labels: ${{ steps.meta.outputs.labels }}
+ cache-from: type=gha
+ cache-to: type=gha,mode=max
+ platforms: linux/amd64,linux/arm64
- - name: Tag and Push Images
- run: |
- for image in email-monitor participant post-wm pre-wm api-server
controller; do
- docker tag airavata/$image
${DOCKER_USERNAME}/airavata-$image:${VERSION}
- docker push ${DOCKER_USERNAME}/airavata-$image:${VERSION}
- done
+ - name: Image digest
+ run: echo ${{ steps.meta.outputs.tags }}
diff --git a/Dockerfile b/Dockerfile
new file mode 100644
index 0000000000..35b7e32063
--- /dev/null
+++ b/Dockerfile
@@ -0,0 +1,110 @@
+# =============================================================================
+# Combines all Airavata services into one monolithic container
+# =============================================================================
+
+FROM eclipse-temurin:17-jre-jammy
+
+# Install necessary packages including multitail for log monitoring
+RUN apt-get update && apt-get install -y \
+ curl \
+ netcat-openbsd \
+ multitail \
+ && rm -rf /var/lib/apt/lists/*
+
+# Create non-root user for security
+RUN groupadd -r airavata && useradd -r -g airavata -d /opt/airavata airavata
+
+# Set working directory
+WORKDIR /opt/airavata
+
+# Copy all distribution files
+COPY distribution/apache-airavata-api-server-*.tar.gz ./
+COPY distribution/apache-airavata-agent-service-*.tar.gz ./
+COPY distribution/apache-airavata-research-service-*.tar.gz ./
+COPY distribution/apache-airavata-file-server-*.tar.gz ./
+
+# Extract all services
+RUN tar -xzf apache-airavata-api-server-*.tar.gz && \
+ tar -xzf apache-airavata-agent-service-*.tar.gz && \
+ tar -xzf apache-airavata-research-service-*.tar.gz && \
+ tar -xzf apache-airavata-file-server-*.tar.gz && \
+ rm *.tar.gz
+
+# Rename directories for consistency
+RUN mv apache-airavata-api-server-* apache-airavata-api-server && \
+ mv apache-airavata-agent-service-* apache-airavata-agent-service && \
+ mv apache-airavata-research-service-* apache-airavata-research-service && \
+ mv apache-airavata-file-server-* apache-airavata-file-server
+
+# Create necessary directories
+RUN mkdir -p apache-airavata-api-server/conf \
+ apache-airavata-api-server/logs \
+ apache-airavata-api-server/temp \
+ apache-airavata-api-server/data \
+ apache-airavata-api-server/keystores
+
+# Set environment variables
+ENV AIRAVATA_HOME=/opt/airavata/apache-airavata-api-server
+ENV AIRAVATA_AGENT_HOME=/opt/airavata/apache-airavata-agent-service
+ENV AIRAVATA_RESEARCH_HOME=/opt/airavata/apache-airavata-research-service
+ENV AIRAVATA_FILE_HOME=/opt/airavata/apache-airavata-file-server
+ENV JAVA_HOME=/usr/lib/jvm/temurin-17-jre
+ENV PATH="${JAVA_HOME}/bin:${PATH}"
+
+# JVM tuning for production
+ENV JAVA_OPTS="-server \
+ -Xms1g \
+ -Xmx4g \
+ -XX:+UseG1GC \
+ -XX:MaxGCPauseMillis=200 \
+ -XX:+HeapDumpOnOutOfMemoryError \
+ -XX:HeapDumpPath=/opt/airavata/apache-airavata-api-server/logs \
+ -Djava.security.egd=file:/dev/./urandom \
+ -Dfile.encoding=UTF-8 \
+ -Duser.timezone=UTC"
+
+# Health check
+HEALTHCHECK --interval=30s --timeout=10s --start-period=60s --retries=3 \
+ CMD curl -f http://localhost:8930/ || exit 1
+
+# sharing registry service
+EXPOSE 7878
+# tunnel service
+EXPOSE 8000
+# tunnel service (ingress)
+EXPOSE 17000
+# file service
+EXPOSE 8050
+# api service
+EXPOSE 8930
+# cred store service
+EXPOSE 8960
+# profile service
+EXPOSE 8962
+# registry service
+EXPOSE 8970
+# agent service (http)
+EXPOSE 18800
+# agent service (gRPC)
+EXPOSE 19900
+# research service (http)
+EXPOSE 18889
+# research service (gRPC)
+EXPOSE 19908
+# monitoring
+EXPOSE 9097
+# rest proxy (commented out as restproxy distribution is not available)
+# EXPOSE 8082
+
+# Copy startup script
+COPY dev-tools/deployment-scripts/docker-startup.sh /opt/airavata/start.sh
+
+# Set ownership
+RUN chown -R airavata:airavata /opt/airavata && \
+ chmod +x /opt/airavata/start.sh
+
+# Switch to non-root user
+USER airavata
+
+# Set entrypoint
+ENTRYPOINT ["/opt/airavata/start.sh"]
diff --git a/dev-tools/deployment-scripts/airavata-server.properties
b/dev-tools/deployment-scripts/airavata-server.properties
new file mode 100644
index 0000000000..505a1d0b6b
--- /dev/null
+++ b/dev-tools/deployment-scripts/airavata-server.properties
@@ -0,0 +1,328 @@
+#
+# Licensed to the Apache Software Foundation (ASF) under one
+# or more contributor license agreements. See the NOTICE file
+# distributed with this work for additional information
+# regarding copyright ownership. The ASF licenses this file
+# to you under the Apache License, Version 2.0 (the
+# "License"); you may not use this file except in compliance
+# with the License. You may obtain a copy of the License at
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing,
+# software distributed under the License is distributed on an
+# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+# KIND, either express or implied. See the License for the
+# specific language governing permissions and limitations
+# under the License.
+#
+
+############################
+# Development Configuration
+# This file provides working defaults for Docker development environment
+############################
+
+############################
+# Registry Database (MariaDB)
+############################
+registry.jdbc.driver=org.mariadb.jdbc.Driver
+registry.jdbc.url=jdbc:mariadb://mysql:3306/experiment_catalog
+registry.jdbc.user=airavata
+registry.jdbc.password=123456
+registry.jdbc.validationQuery=SELECT 1
+
+############################
+# App Catalog Database (MariaDB)
+############################
+appcatalog.jdbc.driver=org.mariadb.jdbc.Driver
+appcatalog.jdbc.url=jdbc:mariadb://mysql:3306/app_catalog
+appcatalog.jdbc.user=airavata
+appcatalog.jdbc.password=123456
+appcatalog.jdbc.validationQuery=SELECT 1
+
+############################
+# Replica Catalog Database (MariaDB)
+############################
+replicacatalog.jdbc.driver=org.mariadb.jdbc.Driver
+replicacatalog.jdbc.url=jdbc:mariadb://mysql:3306/replica_catalog
+replicacatalog.jdbc.user=airavata
+replicacatalog.jdbc.password=123456
+replicacatalog.jdbc.validationQuery=SELECT 1
+
+############################
+# Workflow Catalog Database (MariaDB)
+############################
+workflowcatalog.jdbc.driver=org.mariadb.jdbc.Driver
+workflowcatalog.jdbc.url=jdbc:mariadb://mysql:3306/workflow_catalog
+workflowcatalog.jdbc.user=airavata
+workflowcatalog.jdbc.password=123456
+workflowcatalog.jdbc.validationQuery=SELECT 1
+
+############################
+# Sharing Catalog Database (MariaDB)
+############################
+sharingcatalog.jdbc.driver=org.mariadb.jdbc.Driver
+sharingcatalog.jdbc.url=jdbc:mariadb://mysql:3306/sharing_catalog
+sharingcatalog.jdbc.user=airavata
+sharingcatalog.jdbc.password=123456
+sharingcatalog.jdbc.validationQuery=SELECT 1
+
+############################
+# Credential Store Database (MariaDB)
+############################
+credential.store.jdbc.driver=org.mariadb.jdbc.Driver
+credential.store.jdbc.url=jdbc:mariadb://mysql:3306/credential_store
+credential.store.jdbc.user=airavata
+credential.store.jdbc.password=123456
+credential.store.jdbc.validationQuery=SELECT 1
+
+############################
+# AMQP (RabbitMQ) Configuration
+############################
+rabbitmq.broker.url=amqp://airavata:airavata@rabbitmq:5672/%2F
+experiment.launch.queue=experiment_launch
+rabbitmq.status.exchange.name=status_exchange
+rabbitmq.process.exchange.name=process_exchange
+rabbitmq.experiment.exchange.name=experiment_exchange
+durable.queue=false
+prefetch.count=200
+
+############################
+# ZooKeeper Configuration
+############################
+zookeeper.server.connection=zookeeper:2181
+zookeeper.timeout=30000
+
+############################
+# Helix Cluster Configuration
+############################
+helix.cluster.name=AiravataCluster
+controller.name=AiravataController
+participant.name=AiravataParticipant
+
+############################
+# Monitoring Configuration
+############################
+controller.monitoring.host=0.0.0.0
+controller.monitoring.port=9094
+participant.monitoring.host=0.0.0.0
+participant.monitoring.port=9096
+
+############################
+# Kafka Configuration
+############################
+kafka.broker.url=kafka:9092
+realtime.monitor.broker.consumer.group=monitor
+realtime.monitor.broker.topic=helix-airavata-mq
+
+job.monitor.broker.consumer.group=MonitoringConsumer
+job.monitor.broker.topic=monitoring-data
+job.monitor.broker.publisher.id=AiravataMonitorPublisher
+job.monitor.email.publisher.id=EmailBasedProducer
+job.monitor.realtime.publisher.id=RealtimeProducer
+
+# Email monitor disabled by default
+# email.based.monitor.host=imap.gmail.com
+# email.based.monitor.store.protocol=imaps
+# email.based.monitor.folder.name=INBOX
+# email.expiration.minutes=60
+# email.based.monitoring.period=10000
+# [email protected]
+# email.based.monitor.password=app_password_here
+
+local.data.location=/tmp/airavata
+
+############################
+# ThriftClientPool Configuration
+############################
+thrift.client.pool.abandoned.removal.enabled=true
+thrift.client.pool.abandoned.removal.logged=true
+thrift.client.pool.idle.time.limit.minutes=1
+thrift.client.pool.max.idle.limit=10
+
+############################
+# API Server Configuration
+############################
+# API Server URLs for development
+api.server.host=localhost
+api.server.port=8930
+
+############################
+# Security Configuration
+############################
+# Development defaults - NOT for production!
+enable.sharing=true
+remote.oauth.authorization.server=https://localhost:8443/oauth2/authorize
+remote.oauth.token.server=https://localhost:8443/oauth2/token
+remote.oauth.callback.url=https://localhost:8443/callback-url
+
+############################
+# File Storage Configuration
+############################
+# Default storage locations for development
+# These will be created automatically in the container
+local.data.location=/tmp/airavata
+airavata.data.location=/opt/airavata/data
+airavata.experiments.dir=/opt/airavata/experiments
+
+############################
+# Development Mode Settings
+############################
+# Enable development features
+development.mode=true
+debug.mode=true
+
+# Disable resource validation for development
+validate.compute.resource=false
+validate.storage.resource=false
+
+############################
+# Logging Configuration
+############################
+# Default log levels for development
+log4j.rootLogger=INFO, console, file
+log4j.logger.org.apache.airavata=DEBUG
+
+############################
+# Gateway Configuration
+############################
+# Default gateway for development testing
+default.gateway.id=dev_gateway
+default.gateway.name=Development Gateway
+default.gateway.admin.username=admin
[email protected]
+
+############################
+# Job Submission Configuration
+############################
+# SSH configurations for development
+ssh.key.passphrase=
+ssh.username=
+ssh.password=
+ssh.strict.host.key.checking=false
+
+############################
+# Workflow Configuration
+############################
+# Enable workflow features
+enable.workflows=true
+workflow.interpreter=airavata
+
+############################
+# Notification Configuration
+############################
+# Email notifications (disabled by default)
+enable.email.notification=false
+# enable.email.notification=true
+# email.server=smtp.gmail.com
+# email.server.port=587
+# [email protected]
+# email.password=your-app-password
+# email.ssl=true
+# [email protected]
+
+############################
+# Parser Configuration
+############################
+# Enable parsers for development
+enable.data.parsers=true
+parser.directory=/opt/airavata/parsers
+
+############################
+# Resource Configuration
+############################
+# Default compute resources for development
+localhost.resource.description=Local machine for development
+localhost.resource.hostname=localhost
+localhost.resource.username=airavata
+
+############################
+# Application Configuration
+############################
+# Default applications for development testing
+enable.application.catalog=true
+application.deployment.directory=/opt/airavata/applications
+
+############################
+# Orchestrator Configuration
+############################
+enable.orchestrator=true
+orchestrator.server.host=localhost
+orchestrator.server.port=8940
+orchestrator.server.name=Airavata_Orchestrator
+
+############################
+# Helix Controller & Participant Settings
+############################
+helix.controller.name=AiravataController
+participant.monitoring.enabled=true
+
+############################
+# Workflow Manager Settings
+############################
+pre.workflow.manager.monitoring.enabled=true
+pre.workflow.manager.monitoring.host=localhost
+post.workflow.manager.monitoring.enabled=true
+post.workflow.manager.monitoring.host=localhost
+
+############################
+# Helix Participant Settings
+############################
+helix.participant.name=AiravataParticipant
+
+############################
+# GFAC Configuration
+############################
+enable.gfac=true
+gfac.server.host=localhost
+gfac.server.port=8950
+gfac.server.name=Airavata_GFAC
+
+############################
+# Registry Configuration
+############################
+registry.server.host=localhost
+registry.server.port=8960
+registry.server.name=Airavata_Registry
+
+############################
+# Credential Store Configuration
+############################
+credential.store.server.host=localhost
+credential.store.server.port=8961
+credential.store.server.name=Airavata_CredentialStore
+
+############################
+# User Profile Configuration
+############################
+profile.service.server.host=localhost
+profile.service.server.port=8962
+profile.service.server.name=Airavata_ProfileService
+
+############################
+# Tenant Profile Configuration
+############################
+tenant.profile.service.server.host=localhost
+tenant.profile.service.server.port=8963
+tenant.profile.service.server.name=Airavata_TenantProfileService
+
+############################
+# IAM Admin Services Configuration
+############################
+iam.admin.services.server.host=localhost
+iam.admin.services.server.port=8964
+iam.admin.services.server.name=Airavata_IamAdminServices
+
+############################
+# Group Manager Configuration
+############################
+group.manager.service.server.host=localhost
+group.manager.service.server.port=8965
+group.manager.service.server.name=Airavata_GroupManagerService
+
+############################
+# Sharing Registry Configuration
+############################
+sharing.registry.server.host=localhost
+sharing.registry.server.port=8966
+sharing.registry.server.name=Airavata_SharingRegistryService
diff --git a/dev-tools/deployment-scripts/docker-startup.sh
b/dev-tools/deployment-scripts/docker-startup.sh
new file mode 100644
index 0000000000..f9a13e86b9
--- /dev/null
+++ b/dev-tools/deployment-scripts/docker-startup.sh
@@ -0,0 +1,214 @@
+#!/bin/bash
+
+set -e
+
+# Set Airavata configuration directory
+export AIRAVATA_CONFIG_DIR=/opt/airavata/vault
+
+echo "🚀 Starting Apache Airavata Monolithic Server..."
+echo "📋 All services included: API Server, Agent Service, Research Service,
File Server"
+echo "📁 Properties file location:
/opt/airavata/vault/airavata-server.properties"
+echo "📁 Configuration directory: $AIRAVATA_CONFIG_DIR"
+echo "📊 All logs will be captured and visible via 'docker logs'"
+
+# Wait for dependencies if environment variables are set
+if [ ! -z "${DB_HOST}" ]; then
+ echo "⏳ Waiting for database at ${DB_HOST}:${DB_PORT:-13306}..."
+ while ! nc -z ${DB_HOST} ${DB_PORT:-13306}; do
+ sleep 2
+ done
+ echo "✅ Database is ready"
+fi
+
+if [ ! -z "${RABBITMQ_HOST}" ]; then
+ echo "⏳ Waiting for RabbitMQ at ${RABBITMQ_HOST}:${RABBITMQ_PORT:-5672}..."
+ while ! nc -z ${RABBITMQ_HOST} ${RABBITMQ_PORT:-5672}; do
+ sleep 2
+ done
+ echo "✅ RabbitMQ is ready"
+fi
+
+if [ ! -z "${ZOOKEEPER_HOST}" ]; then
+ echo "⏳ Waiting for ZooKeeper at
${ZOOKEEPER_HOST}:${ZOOKEEPER_PORT:-2181}..."
+ while ! nc -z ${ZOOKEEPER_HOST} ${ZOOKEEPER_PORT:-2181}; do
+ sleep 2
+ done
+ echo "✅ ZooKeeper is ready"
+fi
+
+# Function to log with timestamp
+log() {
+ echo "$(date '+%Y-%m-%d %H:%M:%S') - $1"
+}
+
+# Function to start a service and capture its logs
+start_service() {
+ local service_name=$1
+ local service_script=$2
+ local log_file=$3
+
+ log "🔄 Starting $service_name..."
+
+ # Start the service in background and capture its output
+ # Set the configuration directory for the service
+ {
+ AIRAVATA_CONFIG_DIR=$AIRAVATA_CONFIG_DIR $service_script -d start 2>&1
+ echo "$(date '+%Y-%m-%d %H:%M:%S') - $service_name started
successfully"
+ } | sed "s/^/[$service_name] /" &
+
+ # Wait a moment for the service to start
+ sleep 3
+
+ # Start monitoring the log file in background
+ if [ -f "$log_file" ]; then
+ tail -f "$log_file" | sed "s/^/[$service_name] /" &
+ fi
+}
+
+# ================================
+# Start the API Server Components
+# ================================
+log "🔧 Starting the API Services..."
+
+cd ${AIRAVATA_HOME}
+
+# Start all API services
+start_service "Orchestrator" "./bin/orchestrator.sh"
"${AIRAVATA_HOME}/logs/orchestrator.log"
+start_service "Controller" "./bin/controller.sh"
"${AIRAVATA_HOME}/logs/controller.log"
+start_service "Participant" "./bin/participant.sh"
"${AIRAVATA_HOME}/logs/participant.log"
+# Email Monitor (disabled by default due to config requirements)
+log "📧 Email Monitor disabled (requires email config)"
+echo "$(date '+%Y-%m-%d %H:%M:%S') - Email Monitor disabled (requires email
config)" | sed "s/^/[Email Monitor] /"
+
+# Realtime Monitor (disabled due to API connection dependency)
+log "⏱️ Realtime Monitor disabled (requires API server running)"
+echo "$(date '+%Y-%m-%d %H:%M:%S') - Realtime Monitor disabled (requires API
server running)" | sed "s/^/[Realtime Monitor] /"
+start_service "Pre-WM" "./bin/pre-wm.sh" "${AIRAVATA_HOME}/logs/pre-wm.log"
+start_service "Post-WM" "./bin/post-wm.sh" "${AIRAVATA_HOME}/logs/post-wm.log"
+
+# ================================
+# Start the Agent Service (Optional)
+# ================================
+log "🤖 Checking Agent Service availability..."
+if [ -f "${AIRAVATA_AGENT_HOME}/bin/agent-service.sh" ] && [ -f
"${AIRAVATA_AGENT_HOME}/lib/airavata-agent-service-*.jar" ]; then
+ cd ${AIRAVATA_AGENT_HOME}
+ start_service "Agent Service" "./bin/agent-service.sh"
"${AIRAVATA_AGENT_HOME}/logs/agent-service.log"
+else
+ log "⚠️ Agent Service not available (optional)"
+ echo "$(date '+%Y-%m-%d %H:%M:%S') - Agent Service not available
(optional)" | sed "s/^/[Agent Service] /"
+fi
+
+# ================================
+# Start the Research Service (Optional)
+# ================================
+log "🔬 Checking Research Service availability..."
+if [ -f "${AIRAVATA_RESEARCH_HOME}/bin/research-service.sh" ] && [ -f
"${AIRAVATA_RESEARCH_HOME}/lib/airavata-research-service-*.jar" ]; then
+ cd ${AIRAVATA_RESEARCH_HOME}
+ start_service "Research Service" "./bin/research-service.sh"
"${AIRAVATA_RESEARCH_HOME}/logs/research-service.log"
+else
+ log "⚠️ Research Service not available (optional)"
+ echo "$(date '+%Y-%m-%d %H:%M:%S') - Research Service not available
(optional)" | sed "s/^/[Research Service] /"
+fi
+
+# ================================
+# Start the File Service (Optional)
+# ================================
+log "📁 Checking File Service availability..."
+if [ -f "${AIRAVATA_FILE_HOME}/bin/file-service.sh" ] && [ -f
"${AIRAVATA_FILE_HOME}/lib/airavata-file-server-*.jar" ]; then
+ cd ${AIRAVATA_FILE_HOME}
+ start_service "File Service" "./bin/file-service.sh"
"${AIRAVATA_FILE_HOME}/logs/file-service.log"
+else
+ log "⚠️ File Service not available (optional)"
+ echo "$(date '+%Y-%m-%d %H:%M:%S') - File Service not available
(optional)" | sed "s/^/[File Service] /"
+fi
+
+# ================================
+# Monitor all logs and keep container running
+# ================================
+log "🎉 All Airavata services started successfully!"
+log "📊 Starting comprehensive log monitoring..."
+
+# Wait a moment for all services to initialize
+sleep 10
+
+# Stream all service logs to docker logs and keep container running
+echo "🚀 All Airavata services are running!"
+echo "📋 Service status:"
+echo " - ZooKeeper: Connected (no more 'airavata.host' errors)"
+echo " - All components started successfully"
+echo ""
+echo "🔍 Streaming all logs to 'docker logs -f airavata-monolithic'"
+echo ""
+
+# Function to monitor log file and stream to stdout with prefix
+monitor_log() {
+ local file=$1
+ local prefix=$2
+ local max_wait=60 # Maximum wait time for log file to appear
+ local waited=0
+
+ echo "[$prefix] Waiting for log file: $file"
+
+ # Wait for log file to be created
+ while [ ! -f "$file" ] && [ $waited -lt $max_wait ]; do
+ sleep 2
+ waited=$((waited + 2))
+ done
+
+ if [ -f "$file" ]; then
+ echo "[$prefix] Found log file, starting to stream..."
+ # Use tail -F to follow file even if it gets rotated or recreated
+ tail -F "$file" 2>/dev/null | while IFS= read -r line; do
+ echo "[$prefix] $line"
+ done &
+ else
+ echo "[$prefix] Log file not found after ${max_wait}s: $file"
+ fi
+}
+
+# Wait a moment for log files to be created
+echo "📊 Waiting for log files to be created..."
+sleep 15
+
+# Start monitoring all service logs
+echo "📊 Starting log monitoring for all services..."
+cd ${AIRAVATA_HOME}
+
+# Monitor core service logs
+monitor_log "${AIRAVATA_HOME}/logs/controller.log" "Controller"
+monitor_log "${AIRAVATA_HOME}/logs/participant.log" "Participant"
+
+# Monitor workflow manager logs if they exist
+monitor_log "${AIRAVATA_HOME}/logs/pre-wm.log" "Pre-WM"
+monitor_log "${AIRAVATA_HOME}/logs/post-wm.log" "Post-WM"
+
+# Monitor additional service logs if they exist
+monitor_log "${AIRAVATA_HOME}/logs/orchestrator.log" "Orchestrator"
+monitor_log "${AIRAVATA_HOME}/logs/email-monitor.log" "Email-Monitor"
+monitor_log "${AIRAVATA_HOME}/logs/realtime-monitor.log" "Realtime-Monitor"
+
+# Monitor optional service logs
+monitor_log "${AIRAVATA_HOME}/logs/agent-service.log" "Agent"
+monitor_log "${AIRAVATA_HOME}/logs/research-service.log" "Research"
+monitor_log "${AIRAVATA_HOME}/logs/file-service.log" "File"
+
+echo "📊 All log monitoring started!"
+echo "🔍 Use 'docker logs -f airavata-monolithic' to view all service logs"
+
+# Keep container running and show periodic status
+while true; do
+ sleep 300 # Check every 5 minutes
+ echo "[Status] $(date): Container active, monitoring logs from all
services"
+
+ # Check if critical processes are still running
+ if ! pgrep -f "controller" > /dev/null; then
+ echo "[WARNING] Controller process not found"
+ fi
+ if ! pgrep -f "participant" > /dev/null; then
+ echo "[WARNING] Participant process not found"
+ fi
+
+ # Show number of running tail processes
+ tail_count=$(pgrep -f "tail -F" | wc -l)
+ echo "[Status] Currently monitoring $tail_count log files"
+done
diff --git a/docker-compose.yml b/docker-compose.yml
new file mode 100644
index 0000000000..2403ca741d
--- /dev/null
+++ b/docker-compose.yml
@@ -0,0 +1,113 @@
+services:
+ mysql:
+ image: mariadb:10.11
+ container_name: mariadb
+ environment:
+ MYSQL_ROOT_PASSWORD: rootpass
+ MYSQL_DATABASE: experiment_catalog
+ MYSQL_USER: airavata
+ MYSQL_PASSWORD: 123456
+ ports:
+ - "3306:3306"
+ volumes:
+ - mysql-data:/var/lib/mysql
+ - ./.devcontainer/database_scripts/init:/docker-entrypoint-initdb.d:ro
+ networks:
+ - airavata-network
+
+ rabbitmq:
+ image: rabbitmq:3-management
+ container_name: airavata-rabbitmq
+ environment:
+ RABBITMQ_DEFAULT_USER: airavata
+ RABBITMQ_DEFAULT_PASS: airavata
+ ports:
+ - "5672:5672"
+ - "15672:15672"
+ volumes:
+ - rabbitmq-data:/var/lib/rabbitmq
+ networks:
+ - airavata-network
+
+ zookeeper:
+ image: confluentinc/cp-zookeeper:7.4.0
+ container_name: airavata-zookeeper
+ environment:
+ ZOOKEEPER_CLIENT_PORT: 2181
+ ZOOKEEPER_TICK_TIME: 2000
+ volumes:
+ - zookeeper-data:/var/lib/zookeeper/data
+ - zookeeper-logs:/var/lib/zookeeper/log
+ networks:
+ - airavata-network
+
+ kafka:
+ image: confluentinc/cp-kafka:7.4.0
+ container_name: airavata-kafka
+ depends_on:
+ - zookeeper
+ ports:
+ - "9092:9092"
+ environment:
+ KAFKA_BROKER_ID: 1
+ KAFKA_ZOOKEEPER_CONNECT: zookeeper:2181
+ KAFKA_LISTENERS: PLAINTEXT://0.0.0.0:9092
+ KAFKA_ADVERTISED_LISTENERS: PLAINTEXT://kafka:9092
+ KAFKA_OFFSETS_TOPIC_REPLICATION_FACTOR: 1
+ KAFKA_TRANSACTION_STATE_LOG_MIN_ISR: 1
+ KAFKA_TRANSACTION_STATE_LOG_REPLICATION_FACTOR: 1
+ volumes:
+ - kafka-data:/var/lib/kafka/data
+ networks:
+ airavata-network:
+ aliases:
+ - airavata.host
+
+ airavata-monolithic:
+ build:
+ context: .
+ dockerfile: Dockerfile
+ container_name: airavata-monolithic
+ ports:
+ - "8930:8930" # Airavata API (Thrift RPC)
+ - "8050:8050" # File Server (Thrift RPC)
+ - "18800:18800" # Agent Service (Thrift RPC)
+ - "18889:18889" # Research Service (Thrift RPC)
+ - "19900:19900" # Agent Service gRPC
+ - "19908:19908" # Research Service gRPC
+ healthcheck:
+ test: ["CMD-SHELL", "nc -z localhost 8930 || exit 1"]
+ interval: 30s
+ timeout: 10s
+ start_period: 60s
+ retries: 3
+ volumes:
+ -
./dev-tools/deployment-scripts/airavata-server.properties:/opt/airavata/vault/airavata-server.properties:ro
+ -
./dev-tools/deployment-scripts/airavata-server.properties:/opt/airavata/apache-airavata-api-server/conf/airavata-server.properties:ro
+ - airavata-logs:/opt/airavata/logs
+ environment:
+ - JAVA_OPTS=-Xmx2g -Xms1g -Dthrift.server.max.message.size=1048576000
-Dthrift.server.max.frame.size=1048576000
-Dthrift.server.transport.max.message.size=1048576000
-Dthrift.maxMessageSize=1048576000 -Dthrift.maxFrameSize=1048576000
+ logging:
+ driver: "json-file"
+ options:
+ max-size: "10m"
+ max-file: "3"
+ depends_on:
+ - mysql
+ - rabbitmq
+ - zookeeper
+ - kafka
+ networks:
+ - airavata-network
+
+volumes:
+ mysql-data:
+ rabbitmq-data:
+ zookeeper-data:
+ zookeeper-logs:
+ kafka-data:
+ airavata-logs:
+
+networks:
+ airavata-network:
+ driver: bridge