refactor: move stack assets and wire in mailhog

This commit is contained in:
2025-10-29 05:56:27 -05:00
parent 8f37c46310
commit 7061fbb2a9
41 changed files with 217 additions and 251 deletions

View File

@@ -0,0 +1,452 @@
#!/bin/bash
# TSYSDevStack SupportStack Demo - Control Script
# Provides start/stop/uninstall/update/test functionality for the MVP stack
set -e # Exit on any error
# Load environment settings
SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
ROOT_DIR="$(dirname "$SCRIPT_DIR")"
CONFIG_DIR="${ROOT_DIR}/config"
COMPOSE_DIR="${ROOT_DIR}/docker-compose"
ROOT_ENV_FILE="${ROOT_DIR}/TSYSDevStack-SupportStack-Demo-Settings"
CONFIG_ENV_FILE="${CONFIG_DIR}/TSYSDevStack-SupportStack-Demo-Settings"
if [ -f "$ROOT_ENV_FILE" ]; then
ENV_FILE="$ROOT_ENV_FILE"
elif [ -f "$CONFIG_ENV_FILE" ]; then
ENV_FILE="$CONFIG_ENV_FILE"
else
echo "Error: Environment settings file not found. Expected at $ROOT_ENV_FILE or $CONFIG_ENV_FILE"
exit 1
fi
# Set UID/GID defaults prior to sourcing environment file so runtime values override placeholders
export TSYSDEVSTACK_UID="$(id -u)"
export TSYSDEVSTACK_GID="$(id -g)"
export TSYSDEVSTACK_DOCKER_GID="$(getent group docker >/dev/null 2>&1 && getent group docker | cut -d: -f3 || echo "996")"
# Source the environment file to get all variables
source "$ENV_FILE"
# Explicitly export all environment variables for docker compose
export TSYSDEVSTACK_ENVIRONMENT
export TSYSDEVSTACK_PROJECT_NAME
export TSYSDEVSTACK_NETWORK_NAME
export DOCKER_SOCKET_PROXY_NAME
export DOCKER_SOCKET_PROXY_IMAGE
export DOCKER_SOCKET_PROXY_SOCKET_PATH
export DOCKER_SOCKET_PROXY_NETWORK
export DOCKER_SOCKET_PROXY_CONTAINERS
export DOCKER_SOCKET_PROXY_IMAGES
export DOCKER_SOCKET_PROXY_NETWORKS
export DOCKER_SOCKET_PROXY_VOLUMES
export DOCKER_SOCKET_PROXY_BUILD
export DOCKER_SOCKET_PROXY_MANIFEST
export DOCKER_SOCKET_PROXY_PLUGINS
export DOCKER_SOCKET_PROXY_VERSION
export HOMEPAGE_NAME
export HOMEPAGE_IMAGE
export HOMEPAGE_PORT
export HOMEPAGE_NETWORK
export HOMEPAGE_CONFIG_PATH
export WAKAAPI_NAME
export WAKAAPI_IMAGE
export WAKAAPI_PORT
export WAKAAPI_NETWORK
export WAKAAPI_CONFIG_PATH
export WAKAAPI_WAKATIME_API_KEY
export WAKAAPI_DATABASE_PATH
export MAILHOG_NAME
export MAILHOG_IMAGE
export MAILHOG_SMTP_PORT
export MAILHOG_UI_PORT
export MAILHOG_NETWORK
export DOCKER_SOCKET_PROXY_MEM_LIMIT
export DOCKER_SOCKET_PROXY_CPU_LIMIT
export HOMEPAGE_MEM_LIMIT
export HOMEPAGE_CPU_LIMIT
export WAKAAPI_MEM_LIMIT
export WAKAAPI_CPU_LIMIT
export MAILHOG_MEM_LIMIT
export MAILHOG_CPU_LIMIT
export HEALTH_CHECK_INTERVAL
export HEALTH_CHECK_TIMEOUT
export HEALTH_CHECK_START_PERIOD
export HEALTH_CHECK_RETRIES
export DOCKER_SOCKET_PROXY_CONNECTION_TIMEOUT
export HOMEPAGE_STARTUP_TIMEOUT
export WAKAAPI_INITIALIZATION_TIMEOUT
export DOCKER_COMPOSE_STARTUP_TIMEOUT
export BIND_ADDRESS
export TSYSDEVSTACK_UID
export TSYSDEVSTACK_GID
export TSYSDEVSTACK_DOCKER_GID
# Colors for output
RED='\033[0;31m'
GREEN='\033[0;32m'
YELLOW='\033[1;33m'
BLUE='\033[0;34m'
NC='\033[0m' # No Color
# Logging function
log() {
echo -e "${BLUE}[$(date +'%Y-%m-%d %H:%M:%S')]${NC} $1"
}
log_success() {
echo -e "${GREEN}[SUCCESS]${NC} $1"
}
log_error() {
echo -e "${RED}[ERROR]${NC} $1"
}
log_warning() {
echo -e "${YELLOW}[WARNING]${NC} $1"
}
compose() {
docker compose -p "$TSYSDEVSTACK_PROJECT_NAME" "$@"
}
# Function to check if docker is available
check_docker() {
if ! command -v docker &> /dev/null; then
log_error "Docker is not installed or not in PATH"
exit 1
fi
if ! docker info &> /dev/null; then
log_error "Docker is not running or not accessible"
exit 1
fi
}
# Function to create the shared network
create_network() {
log "Creating shared network: $TSYSDEVSTACK_NETWORK_NAME"
if ! docker network inspect "$TSYSDEVSTACK_NETWORK_NAME" >/dev/null 2>&1; then
docker network create \
--driver bridge \
--label tsysdevstack.component="supportstack-demo" \
--label tsysdevstack.environment="$TSYSDEVSTACK_ENVIRONMENT" \
"$TSYSDEVSTACK_NETWORK_NAME"
log_success "Network created: $TSYSDEVSTACK_NETWORK_NAME"
else
log "Network already exists: $TSYSDEVSTACK_NETWORK_NAME"
fi
}
# Function to remove the shared network
remove_network() {
log "Removing shared network: $TSYSDEVSTACK_NETWORK_NAME"
if docker network inspect "$TSYSDEVSTACK_NETWORK_NAME" >/dev/null 2>&1; then
docker network rm "$TSYSDEVSTACK_NETWORK_NAME"
log_success "Network removed: $TSYSDEVSTACK_NETWORK_NAME"
else
log "Network does not exist: $TSYSDEVSTACK_NETWORK_NAME"
fi
}
# Function to start the MVP stack
start() {
log "Starting TSYSDevStack SupportStack Demo MVP"
check_docker
log "Using environment file: $ENV_FILE"
create_network
# Start docker-socket-proxy first (dependency for homepage)
log "Starting docker-socket-proxy..."
if [ -f "${COMPOSE_DIR}/tsysdevstack-supportstack-demo-DockerCompose-docker-socket-proxy.yml" ]; then
compose -f "${COMPOSE_DIR}/tsysdevstack-supportstack-demo-DockerCompose-docker-socket-proxy.yml" up -d
log_success "docker-socket-proxy started"
else
log_warning "docker-socket-proxy compose file not found, skipping..."
fi
# Wait for docker socket proxy to be ready
log "Waiting for docker-socket-proxy to be ready..."
sleep 10
# Start homepage
log "Starting homepage..."
if [ -f "${COMPOSE_DIR}/tsysdevstack-supportstack-demo-DockerCompose-homepage.yml" ]; then
compose -f "${COMPOSE_DIR}/tsysdevstack-supportstack-demo-DockerCompose-homepage.yml" up -d
log_success "homepage started"
else
log_warning "homepage compose file not found, skipping..."
fi
# Wait for homepage to be ready
log "Waiting for homepage to be ready..."
sleep 15
# Start wakaapi
log "Starting wakaapi..."
if [ -f "${COMPOSE_DIR}/tsysdevstack-supportstack-demo-DockerCompose-wakaapi.yml" ]; then
compose -f "${COMPOSE_DIR}/tsysdevstack-supportstack-demo-DockerCompose-wakaapi.yml" up -d
log_success "wakaapi started"
else
log_warning "wakaapi compose file not found, skipping..."
fi
# Start mailhog
log "Starting mailhog..."
if [ -f "${COMPOSE_DIR}/tsysdevstack-supportstack-demo-DockerCompose-mailhog.yml" ]; then
compose -f "${COMPOSE_DIR}/tsysdevstack-supportstack-demo-DockerCompose-mailhog.yml" up -d
log_success "mailhog started"
else
log_warning "mailhog compose file not found, skipping..."
fi
# Wait for services to be ready
log "Waiting for all services to be ready..."
sleep 20
log_success "MVP stack started successfully"
echo "Homepage available at: http://$BIND_ADDRESS:$HOMEPAGE_PORT"
echo "WakaAPI available at: http://$BIND_ADDRESS:$WAKAAPI_PORT"
echo "Mailhog available at: http://$BIND_ADDRESS:$MAILHOG_UI_PORT (SMTP on $MAILHOG_SMTP_PORT)"
}
# Function to stop the MVP stack
stop() {
log "Stopping TSYSDevStack SupportStack Demo MVP"
check_docker
# Stop mailhog
log "Stopping mailhog..."
if [ -f "${COMPOSE_DIR}/tsysdevstack-supportstack-demo-DockerCompose-mailhog.yml" ]; then
compose -f "${COMPOSE_DIR}/tsysdevstack-supportstack-demo-DockerCompose-mailhog.yml" down
log_success "mailhog stopped"
else
log_warning "mailhog compose file not found, skipping..."
fi
# Stop wakaapi
log "Stopping wakaapi..."
if [ -f "${COMPOSE_DIR}/tsysdevstack-supportstack-demo-DockerCompose-wakaapi.yml" ]; then
compose -f "${COMPOSE_DIR}/tsysdevstack-supportstack-demo-DockerCompose-wakaapi.yml" down
log_success "wakaapi stopped"
else
log_warning "wakaapi compose file not found, skipping..."
fi
# Stop homepage
log "Stopping homepage..."
if [ -f "${COMPOSE_DIR}/tsysdevstack-supportstack-demo-DockerCompose-homepage.yml" ]; then
compose -f "${COMPOSE_DIR}/tsysdevstack-supportstack-demo-DockerCompose-homepage.yml" down
log_success "homepage stopped"
else
log_warning "homepage compose file not found, skipping..."
fi
# Stop docker-socket-proxy last
log "Stopping docker-socket-proxy..."
if [ -f "${COMPOSE_DIR}/tsysdevstack-supportstack-demo-DockerCompose-docker-socket-proxy.yml" ]; then
compose -f "${COMPOSE_DIR}/tsysdevstack-supportstack-demo-DockerCompose-docker-socket-proxy.yml" down
log_success "docker-socket-proxy stopped"
else
log_warning "docker-socket-proxy compose file not found, skipping..."
fi
log_success "MVP stack stopped successfully"
}
# Function to uninstall the MVP stack
uninstall() {
log "Uninstalling TSYSDevStack SupportStack Demo MVP"
check_docker
# Stop all services first
stop
# Remove containers, volumes, and networks
log "Removing containers and volumes..."
if [ -f "${COMPOSE_DIR}/tsysdevstack-supportstack-demo-DockerCompose-docker-socket-proxy.yml" ]; then
compose -f "${COMPOSE_DIR}/tsysdevstack-supportstack-demo-DockerCompose-docker-socket-proxy.yml" down -v
fi
if [ -f "${COMPOSE_DIR}/tsysdevstack-supportstack-demo-DockerCompose-homepage.yml" ]; then
compose -f "${COMPOSE_DIR}/tsysdevstack-supportstack-demo-DockerCompose-homepage.yml" down -v
fi
if [ -f "${COMPOSE_DIR}/tsysdevstack-supportstack-demo-DockerCompose-wakaapi.yml" ]; then
compose -f "${COMPOSE_DIR}/tsysdevstack-supportstack-demo-DockerCompose-wakaapi.yml" down -v
fi
if [ -f "${COMPOSE_DIR}/tsysdevstack-supportstack-demo-DockerCompose-mailhog.yml" ]; then
compose -f "${COMPOSE_DIR}/tsysdevstack-supportstack-demo-DockerCompose-mailhog.yml" down -v
fi
# Remove the shared network
remove_network
log_success "MVP stack uninstalled successfully"
}
# Function to update the MVP stack
update() {
log "Updating TSYSDevStack SupportStack Demo MVP"
check_docker
# Pull the latest images
log "Pulling latest images..."
if [ -f "${COMPOSE_DIR}/tsysdevstack-supportstack-demo-DockerCompose-docker-socket-proxy.yml" ]; then
compose -f "${COMPOSE_DIR}/tsysdevstack-supportstack-demo-DockerCompose-docker-socket-proxy.yml" pull
log_success "docker-socket-proxy images updated"
fi
if [ -f "${COMPOSE_DIR}/tsysdevstack-supportstack-demo-DockerCompose-homepage.yml" ]; then
compose -f "${COMPOSE_DIR}/tsysdevstack-supportstack-demo-DockerCompose-homepage.yml" pull
log_success "homepage images updated"
fi
if [ -f "${COMPOSE_DIR}/tsysdevstack-supportstack-demo-DockerCompose-wakaapi.yml" ]; then
compose -f "${COMPOSE_DIR}/tsysdevstack-supportstack-demo-DockerCompose-wakaapi.yml" pull
log_success "wakaapi images updated"
fi
if [ -f "${COMPOSE_DIR}/tsysdevstack-supportstack-demo-DockerCompose-mailhog.yml" ]; then
compose -f "${COMPOSE_DIR}/tsysdevstack-supportstack-demo-DockerCompose-mailhog.yml" pull
log_success "mailhog images updated"
fi
log "Restarting services with updated images..."
stop
start
log_success "MVP stack updated successfully"
}
# Function to run tests
test() {
log "Running tests for TSYSDevStack SupportStack Demo MVP"
check_docker
# Add test functions here
log "Checking if services are running..."
# Check docker-socket-proxy
if [ -f "${COMPOSE_DIR}/tsysdevstack-supportstack-demo-DockerCompose-docker-socket-proxy.yml" ]; then
if compose -f "${COMPOSE_DIR}/tsysdevstack-supportstack-demo-DockerCompose-docker-socket-proxy.yml" ps | grep -q "Up"; then
log_success "docker-socket-proxy is running"
else
log_error "docker-socket-proxy is not running"
fi
fi
# Check homepage
if [ -f "${COMPOSE_DIR}/tsysdevstack-supportstack-demo-DockerCompose-homepage.yml" ]; then
if compose -f "${COMPOSE_DIR}/tsysdevstack-supportstack-demo-DockerCompose-homepage.yml" ps | grep -q "Up"; then
log_success "homepage is running"
else
log_error "homepage is not running"
fi
fi
# Check wakaapi
if [ -f "${COMPOSE_DIR}/tsysdevstack-supportstack-demo-DockerCompose-wakaapi.yml" ]; then
if compose -f "${COMPOSE_DIR}/tsysdevstack-supportstack-demo-DockerCompose-wakaapi.yml" ps | grep -q "Up"; then
log_success "wakaapi is running"
else
log_error "wakaapi is not running"
fi
fi
# Check mailhog
if [ -f "${COMPOSE_DIR}/tsysdevstack-supportstack-demo-DockerCompose-mailhog.yml" ]; then
if compose -f "${COMPOSE_DIR}/tsysdevstack-supportstack-demo-DockerCompose-mailhog.yml" ps | grep -q "Up"; then
log_success "mailhog is running"
else
log_error "mailhog is not running"
fi
fi
# Run any unit/integration tests if available
TESTS_DIR="$(dirname "$SCRIPT_DIR")/tests"
if [ -d "$TESTS_DIR" ]; then
log "Running specific tests from $TESTS_DIR..."
# Run individual test scripts
for test_script in "$TESTS_DIR"/*.sh; do
if [ -f "$test_script" ] && [ -r "$test_script" ] && [ -x "$test_script" ]; then
log "Running test: $test_script"
"$test_script"
if [ $? -eq 0 ]; then
log_success "Test completed: $(basename "$test_script")"
else
log_error "Test failed: $(basename "$test_script")"
fi
fi
done
log_success "Tests completed"
else
log_warning "No tests directory found at $TESTS_DIR"
fi
log_success "Test execution completed"
}
# Function to display help
show_help() {
cat << EOF
TSYSDevStack SupportStack Demo - Control Script
Usage: $0 {start|stop|uninstall|update|test|help}
Commands:
start Start the MVP stack (docker-socket-proxy, homepage, wakaapi)
stop Stop the MVP stack
uninstall Uninstall the MVP stack (stop and remove all containers, volumes, and networks)
update Update the MVP stack to latest images and restart
test Run tests to verify the stack functionality
help Show this help message
Examples:
$0 start
$0 stop
$0 uninstall
$0 update
$0 test
EOF
}
# Main script logic
case "$1" in
start)
start
;;
stop)
stop
;;
uninstall)
uninstall
;;
update)
update
;;
test)
test
;;
help|--help|-h)
show_help
;;
*)
if [ -z "$1" ]; then
log_error "No command provided. Use $0 help for usage information."
else
log_error "Unknown command: $1. Use $0 help for usage information."
fi
show_help
exit 1
;;
esac