#!/bin/bash set -e # Colors for logging RED='\033[0;31m' GREEN='\033[0;32m' YELLOW='\033[1;33m' BLUE='\033[0;34m' NC='\033[0m' # No Color log_info() { echo -e "${GREEN}[INFO]${NC} $(date '+%Y-%m-%d %H:%M:%S') - $1" } log_warn() { echo -e "${YELLOW}[WARN]${NC} $(date '+%Y-%m-%d %H:%M:%S') - $1" } log_error() { echo -e "${RED}[ERROR]${NC} $(date '+%Y-%m-%d %H:%M:%S') - $1" } log_debug() { echo -e "${BLUE}[DEBUG]${NC} $(date '+%Y-%m-%d %H:%M:%S') - $1" } log_info "Starting TAK Server Hybrid Container..." # Ensure proper ownership of key directories log_debug "Enforcing ownership permissions..." chown -R tak:tak /opt/tak 2>/dev/null || true chown -R postgres:postgres /var/lib/postgresql 2>/dev/null || true log_debug "Ownership permissions enforced" # Source helper scripts log_debug "Sourcing helper scripts..." source /scripts/tak-version.sh log_debug "Helper scripts loaded successfully" # Check if TAK server files are provided log_info "Checking for TAK server files..." log_debug "Looking for files in /takserver-zip directory..." if [ ! -d "/takserver-zip" ]; then log_error "Mount point /takserver-zip does not exist!" log_error "Please ensure you mount a directory containing TAK server files" log_error "Example: docker run -v /path/to/tak/files:/takserver-zip:ro ..." exit 1 fi # Check if directory is empty if [ ! "$(ls -A /takserver-zip 2>/dev/null)" ]; then log_error "Directory /takserver-zip is empty!" log_error "Please place takserver-docker-X.Y-RELEASE-Z.zip files in the mounted directory" log_debug "Directory contents:" ls -l /takserver-zip/ || log_debug "Cannot list directory contents" exit 1 fi # List all files in the directory for debugging log_debug "Contents of /takserver-zip:" ls -l /takserver-zip/ | while read line; do log_debug " $line" done # Check for zip files specifically ZIP_COUNT=$(find /takserver-zip -name "*.zip" -type f | wc -l) log_debug "Found $ZIP_COUNT zip files in /takserver-zip" if [ $ZIP_COUNT -eq 0 ]; then log_error "No zip files found in /takserver-zip!" log_error "Please ensure you have takserver-docker-X.Y-RELEASE-Z.zip files" log_debug "Available files:" find /takserver-zip -type f | while read file; do log_debug " $(basename $file)" done while true; do sleep 3600; done fi # Check for TAK server specific zip files TAK_ZIP_COUNT=$(find /takserver-zip -name "takserver-docker-*-RELEASE-*.zip" -type f | wc -l) log_debug "Found $TAK_ZIP_COUNT TAK server zip files" if [ $TAK_ZIP_COUNT -eq 0 ]; then log_error "No TAK server zip files found matching pattern 'takserver-docker-*-RELEASE-*.zip'!" log_error "Available zip files:" find /takserver-zip -name "*.zip" -type f | while read file; do log_error " $(basename $file)" done log_error "Required format: takserver-docker-X.Y-RELEASE-Z.zip" log_error "Example: takserver-docker-5.4-RELEASE-19.zip" exit 1 fi # Use the helper script to find the latest TAK release log_info "Finding latest TAK server release..." LATEST_ZIP=$(find_latest_tak_release /takserver-zip) if [ $? -ne 0 ]; then log_error "Failed to find latest TAK release: $LATEST_ZIP" log_info "Available TAK releases:" list_tak_releases /takserver-zip exit 1 fi log_info "Found latest TAK server release: $(basename $LATEST_ZIP)" log_info "Version: $(get_tak_version $LATEST_ZIP)" log_debug "Full path: $LATEST_ZIP" # Extract the zip file if not already extracted if [ ! -f /opt/tak/configureInDocker.sh ]; then log_info "TAK server files not found - extracting from ZIP..." log_debug "Using extraction script: /scripts/tak-extract.sh" # Use the extraction script if /scripts/tak-extract.sh extract "$LATEST_ZIP" /opt/tak; then log_info "TAK server extraction completed successfully" # Set proper permissions /scripts/tak-extract.sh permissions /opt/tak tak:tak # Verify installation if /scripts/tak-extract.sh verify /opt/tak; then log_info "TAK server installation verified" else log_error "TAK server installation verification failed!" exit 1 fi else log_error "Failed to extract TAK server files!" exit 1 fi else log_info "TAK server files already exist - skipping extraction" log_debug "Found existing configureInDocker.sh at /opt/tak/configureInDocker.sh" # Ensure permissions are correct on existing files log_debug "Ensuring correct permissions on existing TAK files..." /scripts/tak-extract.sh permissions /opt/tak tak:tak # Also enforce ownership at the directory level log_debug "Enforcing TAK directory ownership..." chown -R tak:tak /opt/tak fi # Start PostgreSQL log_info "Starting PostgreSQL..." # Ensure PostgreSQL directories have correct ownership log_debug "Enforcing PostgreSQL directory ownership..." chown -R postgres:postgres /var/lib/postgresql chown -R postgres:postgres /var/run/postgresql 2>/dev/null || true # Initialize PostgreSQL if not already done if [ ! -f /var/lib/postgresql/15/main/PG_VERSION ]; then log_info "Initializing PostgreSQL database cluster..." if sudo -u postgres /usr/lib/postgresql/15/bin/initdb -D /var/lib/postgresql/15/main; then log_info "PostgreSQL initialized successfully" # Configure PostgreSQL log_info "Configuring PostgreSQL..." # Create postgresql.conf log_debug "Creating postgresql.conf..." cat > /tmp/postgresql.conf < /tmp/pg_hba.conf < /tmp/postgresql.conf < /tmp/pg_hba.conf </dev/null; then log_debug "PostgreSQL process is still running" else log_error "PostgreSQL process died immediately!" log_error "Checking system logs for errors..." # Try to get any error output journalctl -u postgresql --no-pager --lines=10 2>/dev/null || log_debug "No journalctl available" exit 1 fi # Wait for PostgreSQL to start and setup database log_info "Waiting for PostgreSQL to be ready..." POSTGRES_READY=0 for i in {1..30}; do if pg_isready -h localhost -p 5432 >/dev/null 2>&1; then POSTGRES_READY=1 log_info "PostgreSQL is ready after ${i} seconds" break fi log_debug "PostgreSQL not ready yet, waiting... (attempt $i/30)" sleep 1 done if [ $POSTGRES_READY -eq 0 ]; then log_error "PostgreSQL failed to become ready after 30 seconds!" log_error "Checking PostgreSQL process status..." if kill -0 $POSTGRES_PID 2>/dev/null; then log_error "PostgreSQL process is running but not accepting connections" else log_error "PostgreSQL process has died" fi exit 1 fi # Use the database setup script log_info "Setting up database..." if /scripts/db-setup.sh setup; then log_info "Database setup completed successfully" else log_error "Database setup failed!" exit 1 fi # Run database configuration if it exists if [ -f "/opt/tak/db-utils/configureInDocker.sh" ]; then log_info "Configuring TAK database..." /opt/tak/db-utils/configureInDocker.sh & DB_CONFIG_PID=$! log_debug "TAK database configuration started with PID: $DB_CONFIG_PID" sleep 10 else log_warn "TAK database configuration script not found, skipping..." fi # Start TAK server if [ -f "/opt/tak/configureInDocker.sh" ]; then log_info "Starting TAK server..." log_debug "Executing: /opt/tak/configureInDocker.sh init" exec /opt/tak/configureInDocker.sh init else log_error "TAK server configuration script not found!" log_error "Expected file: /opt/tak/configureInDocker.sh" log_error "The extracted TAK server files may be incomplete or corrupted." log_debug "Contents of /opt/tak:" ls -la /opt/tak/ | while read line; do log_debug " $line" done exit 1 fi