#!/bin/bash # # Script pentru instalare Oracle XE 21c în Docker LXC (Proxmox) # Rulează DUPĂ crearea containerului Docker LXC cu scriptul comunității # # Utilizare: # 1. Creează mai întâi Docker LXC cu: bash -c "$(curl -fsSL https://raw.githubusercontent.com/community-scripts/ProxmoxVE/main/ct/docker.sh)" # - Alege: Privileged (Yes) # - RAM: minim 4096 MB (recomandat 6144 MB) # - Disk: minim 20 GB # - Cores: minim 2 # 2. Copiază acest script în container și rulează-l # set -e # Configurări ORACLE_PASSWORD="${ORACLE_PASSWORD:-OraclePass123}" ORACLE_PORT="${ORACLE_PORT:-1521}" ORACLE_EM_PORT="${ORACLE_EM_PORT:-5500}" CONTAINER_NAME="oracle-xe" APP_USER="appuser" APP_PASSWORD="${APP_PASSWORD:-AppPass123}" echo "==========================================" echo "Oracle XE 21c Docker Deployment Script" echo "==========================================" echo "" echo "Configurări:" echo " - Container Name: $CONTAINER_NAME" echo " - Oracle SYS Password: $ORACLE_PASSWORD" echo " - Oracle Port: $ORACLE_PORT" echo " - Enterprise Manager Port: $ORACLE_EM_PORT" echo " - App User: $APP_USER" echo " - App Password: $APP_PASSWORD" echo "" # Verificare Docker if ! command -v docker &> /dev/null; then echo "❌ Docker nu este instalat! Asigură-te că ai creat containerul cu scriptul Docker LXC." exit 1 fi echo "✅ Docker este instalat: $(docker --version)" # Verificare dacă containerul Oracle XE există deja if docker ps -a --format '{{.Names}}' | grep -q "^${CONTAINER_NAME}$"; then echo "⚠️ Containerul $CONTAINER_NAME există deja." read -p "Dorești să-l ștergi și să creezi unul nou? (y/n): " -n 1 -r echo if [[ $REPLY =~ ^[Yy]$ ]]; then echo "Ștergere container existent..." docker stop $CONTAINER_NAME 2>/dev/null || true docker rm $CONTAINER_NAME 2>/dev/null || true echo "✅ Container șters" else echo "Script anulat." exit 0 fi fi # Creare directoare pentru persistență echo "" echo "📁 Creare directoare pentru persistență..." mkdir -p /opt/oracle/oradata mkdir -p /opt/oracle/scripts/setup mkdir -p /opt/oracle/scripts/startup chmod -R 777 /opt/oracle echo "✅ Directoare create" # Download imagine Oracle XE echo "" echo "📥 Download imagine Oracle XE 21c (poate dura câteva minute)..." if docker pull container-registry.oracle.com/database/express:21.3.0-xe; then echo "✅ Imagine descărcată cu succes" else echo "❌ Eroare la descărcare imagine. Verifică conexiunea la internet." exit 1 fi # Creare script de inițializare pentru user-ul aplicației echo "" echo "📝 Creare script de inițializare..." cat > /opt/oracle/scripts/startup/01_create_app_user.sql <&1 | grep -q "DATABASE IS READY TO USE!" && return 0 || return 1 } # Monitorizare logs cu timeout TIMEOUT=600 # 10 minute ELAPSED=0 INTERVAL=10 while [ $ELAPSED -lt $TIMEOUT ]; do if check_db_ready; then echo "" echo "✅ Baza de date este gata!" break fi echo -ne "\r⏳ Așteptare... ${ELAPSED}s / ${TIMEOUT}s" sleep $INTERVAL ELAPSED=$((ELAPSED + INTERVAL)) done if [ $ELAPSED -ge $TIMEOUT ]; then echo "" echo "❌ Timeout la inițializare. Verifică logs cu: docker logs $CONTAINER_NAME" exit 1 fi # Test conexiune echo "" echo "🔍 Verificare conexiune la baza de date..." sleep 5 # Extra timp pentru stabilizare # Test conexiune SYS if docker exec $CONTAINER_NAME sqlplus -s sys/$ORACLE_PASSWORD@localhost:1521/XE as sysdba <<< "SELECT 'Connected' FROM dual;" | grep -q "Connected"; then echo "✅ Conexiune SYS funcțională" else echo "❌ Nu se poate conecta ca SYS" exit 1 fi # Test conexiune APP USER if docker exec $CONTAINER_NAME sqlplus -s $APP_USER/$APP_PASSWORD@localhost:1521/XE <<< "SELECT 'Connected' FROM dual;" 2>/dev/null | grep -q "Connected"; then echo "✅ User $APP_USER funcțional" else echo "⚠️ User $APP_USER nu există încă (normal la prima rulare)" fi # Obținere IP container echo "" echo "📊 Informații de conexiune:" echo "==========================================" IP_ADDRESS=$(hostname -I | awk '{print $1}') echo "IP Container LXC: $IP_ADDRESS" echo "Port Oracle: $ORACLE_PORT" echo "Port Enterprise Manager: $ORACLE_EM_PORT" echo "" echo "String-uri de conexiune:" echo " SQL*Plus (SYS): sqlplus sys/$ORACLE_PASSWORD@$IP_ADDRESS:$ORACLE_PORT/XE as sysdba" echo " SQL*Plus (App): sqlplus $APP_USER/$APP_PASSWORD@$IP_ADDRESS:$ORACLE_PORT/XE" echo " JDBC URL: jdbc:oracle:thin:@$IP_ADDRESS:$ORACLE_PORT:XE" echo " Enterprise Manager: http://$IP_ADDRESS:$ORACLE_EM_PORT/em" echo " User/Pass EM: sys/$ORACLE_PASSWORD (connect as SYSDBA)" echo "" echo "Conexiune din WSL/Windows:" echo " Folosește IP-ul: $IP_ADDRESS în loc de localhost" echo "==========================================" # Creare script helper pentru management echo "" echo "📝 Creare scripturi helper..." # Script status cat > /usr/local/bin/oracle-status <<'EOF' #!/bin/bash echo "=== Oracle XE Status ===" docker ps --filter "name=oracle-xe" --format "table {{.Names}}\t{{.Status}}\t{{.Ports}}" echo "" echo "=== Database Status ===" docker exec oracle-xe lsnrctl status 2>/dev/null | grep -E "Instance|Service|Listening" || echo "Listener not ready" EOF chmod +x /usr/local/bin/oracle-status # Script SQL*Plus cat > /usr/local/bin/oracle-sqlplus < /usr/local/bin/oracle-logs <<'EOF' #!/bin/bash docker logs -f oracle-xe EOF chmod +x /usr/local/bin/oracle-logs # Script restart cat > /usr/local/bin/oracle-restart <<'EOF' #!/bin/bash echo "Restarting Oracle XE..." docker restart oracle-xe echo "Done. Check status with: oracle-status" EOF chmod +x /usr/local/bin/oracle-restart echo "✅ Scripturi helper create:" echo " - oracle-status : Verifică status-ul Oracle XE" echo " - oracle-sqlplus : Conectare rapidă SQL*Plus ca SYS" echo " - oracle-logs : Vizualizare logs în timp real" echo " - oracle-restart : Restart container Oracle XE" echo "" echo "==========================================" echo "✅ INSTALARE COMPLETĂ!" echo "==========================================" echo "" echo "Pentru a verifica status-ul: oracle-status" echo "Pentru SQL*Plus rapid: oracle-sqlplus" echo "" echo "IMPORTANT: Salvează parolele în siguranță!" echo " - SYS Password: $ORACLE_PASSWORD" echo " - App Password: $APP_PASSWORD" echo ""