261 lines
8.0 KiB
Bash
261 lines
8.0 KiB
Bash
#!/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 <<EOF
|
|
-- Creare user pentru aplicații
|
|
ALTER SESSION SET "_ORACLE_SCRIPT"=true;
|
|
|
|
-- Drop user dacă există
|
|
BEGIN
|
|
EXECUTE IMMEDIATE 'DROP USER ${APP_USER} CASCADE';
|
|
EXCEPTION
|
|
WHEN OTHERS THEN
|
|
NULL;
|
|
END;
|
|
/
|
|
|
|
-- Creare user nou
|
|
CREATE USER ${APP_USER} IDENTIFIED BY "${APP_PASSWORD}";
|
|
GRANT CONNECT, RESOURCE TO ${APP_USER};
|
|
GRANT CREATE SESSION TO ${APP_USER};
|
|
GRANT CREATE TABLE TO ${APP_USER};
|
|
GRANT CREATE VIEW TO ${APP_USER};
|
|
GRANT CREATE PROCEDURE TO ${APP_USER};
|
|
GRANT CREATE SEQUENCE TO ${APP_USER};
|
|
GRANT UNLIMITED TABLESPACE TO ${APP_USER};
|
|
GRANT SELECT ANY DICTIONARY TO ${APP_USER};
|
|
|
|
-- Afișare confirmare
|
|
SELECT 'User ${APP_USER} created successfully' AS status FROM dual;
|
|
EXIT;
|
|
EOF
|
|
|
|
echo "✅ Script de inițializare creat"
|
|
|
|
# Rulare container Oracle XE
|
|
echo ""
|
|
echo "🚀 Pornire container Oracle XE..."
|
|
docker run -d \
|
|
--name $CONTAINER_NAME \
|
|
-p $ORACLE_PORT:1521 \
|
|
-p $ORACLE_EM_PORT:5500 \
|
|
-e ORACLE_PWD=$ORACLE_PASSWORD \
|
|
-e ORACLE_CHARACTERSET=AL32UTF8 \
|
|
-v /opt/oracle/oradata:/opt/oracle/oradata \
|
|
-v /opt/oracle/scripts/setup:/opt/oracle/scripts/setup \
|
|
-v /opt/oracle/scripts/startup:/opt/oracle/scripts/startup \
|
|
--restart unless-stopped \
|
|
--shm-size=1g \
|
|
container-registry.oracle.com/database/express:21.3.0-xe
|
|
|
|
echo "✅ Container pornit"
|
|
|
|
# Așteptare până DB este ready
|
|
echo ""
|
|
echo "⏳ Așteptare inițializare bază de date (poate dura 5-10 minute)..."
|
|
echo " Monitorizare logs în timp real..."
|
|
echo ""
|
|
|
|
# Funcție pentru verificare status
|
|
check_db_ready() {
|
|
docker logs $CONTAINER_NAME 2>&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 <<EOF
|
|
#!/bin/bash
|
|
docker exec -it oracle-xe sqlplus sys/$ORACLE_PASSWORD@localhost:1521/XE as sysdba
|
|
EOF
|
|
chmod +x /usr/local/bin/oracle-sqlplus
|
|
|
|
# Script logs
|
|
cat > /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 "" |