diff --git a/scripts/shell_scripts/install.sh b/scripts/shell_scripts/install.sh new file mode 100755 index 0000000..f8a00cb --- /dev/null +++ b/scripts/shell_scripts/install.sh @@ -0,0 +1,167 @@ +#!/bin/bash +# Installation script for LangChain Agent +# This script sets up and runs the entire application stack + +set -e + +# Colors for output +RED='\033[0;31m' +GREEN='\033[0;32m' +YELLOW='\033[1;33m' +NC='\033[0m' # No Color + +# Configuration +SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)" +PROJECT_ROOT="$SCRIPT_DIR" +ENV_FILE="$PROJECT_ROOT/.env" + +echo -e "${GREEN}=== LangChain Agent Installation Script ===${NC}\n" + +# Check for required tools +check_requirements() { + echo -e "${YELLOW}Checking requirements...${NC}" + + if ! command -v docker &> /dev/null; then + echo -e "${RED}Error: Docker is not installed. Please install Docker first.${NC}" + exit 1 + fi + + if ! command -v docker-compose &> /dev/null && ! docker compose version &> /dev/null; then + echo -e "${RED}Error: docker-compose is not installed. Please install docker-compose first.${NC}" + exit 1 + fi + + echo -e "${GREEN}✓ All requirements met${NC}\n" +} + +# Create .env file if it doesn't exist +create_env_file() { + if [ ! -f "$ENV_FILE" ]; then + echo -e "${YELLOW}Creating .env file...${NC}" + cat > "$ENV_FILE" < /dev/null; then + COMPOSE_CMD="docker compose" + else + COMPOSE_CMD="docker-compose" + fi + + $COMPOSE_CMD -f docker/docker-compose.prod.yml build + + echo -e "${GREEN}✓ Docker images built successfully${NC}\n" +} + +# Initialize database +init_database() { + echo -e "${YELLOW}Initializing database...${NC}" + + # Wait for PostgreSQL to be ready + echo "Waiting for PostgreSQL to start..." + sleep 5 + + # The SQL files in scripts/init_database/ will be automatically executed + # by PostgreSQL's docker-entrypoint-initdb.d mechanism + # We just need to wait a bit for it to complete + + echo -e "${GREEN}✓ Database initialization will be handled automatically by PostgreSQL container${NC}\n" +} + +# Start services +start_services() { + echo -e "${YELLOW}Starting services...${NC}" + cd "$PROJECT_ROOT" + + # Check if docker-compose or docker compose + if docker compose version &> /dev/null; then + COMPOSE_CMD="docker compose" + else + COMPOSE_CMD="docker-compose" + fi + + $COMPOSE_CMD -f docker/docker-compose.prod.yml up -d + + echo -e "${GREEN}✓ Services started${NC}\n" +} + +# Show status +show_status() { + # Load environment variables from .env if it exists + if [ -f "$ENV_FILE" ]; then + set -a + source "$ENV_FILE" + set +a + fi + + echo -e "${GREEN}=== Installation Complete ===${NC}\n" + echo -e "Services are starting up. Please wait a moment for them to be ready.\n" + echo -e "Access points:" + echo -e " - Frontend: http://localhost:${FRONTEND_PORT:-80}" + echo -e " - Backend API: http://localhost:${BACKEND_PORT:-8500}" + echo -e " - Database: localhost:${POSTGRES_PORT:-5432}\n" + echo -e "To view logs:" + echo -e " docker-compose -f docker/docker-compose.prod.yml logs -f\n" + echo -e "To stop services:" + echo -e " docker-compose -f docker/docker-compose.prod.yml down\n" + echo -e "To restart services:" + echo -e " docker-compose -f docker/docker-compose.prod.yml restart\n" +} + +# Main execution +main() { + check_requirements + create_env_file + build_images + start_services + init_database + show_status + + echo -e "${YELLOW}Waiting for services to be healthy...${NC}" + sleep 10 + + # Load environment variables for health check + if [ -f "$ENV_FILE" ]; then + set -a + source "$ENV_FILE" + set +a + fi + + # Check service health + echo -e "\n${YELLOW}Checking service health...${NC}" + sleep 5 # Give services a bit more time + if curl -f http://localhost:${BACKEND_PORT:-8500}/health &> /dev/null; then + echo -e "${GREEN}✓ Backend is healthy${NC}" + else + echo -e "${YELLOW}⚠ Backend is still starting up. Check logs with: docker-compose -f docker/docker-compose.prod.yml logs backend${NC}" + fi +} + +# Run main function +main +