#!/bin/bash #============================================================================== # Script: 00-install-oracle21c-xe.sh # Descriere: Instalare completă Oracle 21c XE în Docker pe LXC Proxmox # - Instalează Docker (dacă nu există) # - Instalează Oracle 21c XE # - Șterge XEPDB1 automat # - Creează PDB ROA (și opțional PDB ROA2) # Data: 30 Septembrie 2025 # Rulare: bash 00-install-oracle21c-xe.sh # Unde: Pe host Proxmox (sau în LXC prin pct exec) #============================================================================== set -e echo "==========================================" echo "INSTALARE ORACLE 21c XE PE LXC + DOCKER" echo "==========================================" echo "" # Configurare ORACLE_PWD="OraclePass123" LXC_ID="108" PROXMOX_HOST="10.0.20.201" CONTAINER_NAME="oracle-xe" ORACLE_IMAGE="container-registry.oracle.com/database/express:21.3.0-xe" # Verificare dacă rulează pe Proxmox sau trebuie SSH if [ -f "/etc/pve/.version" ]; then echo "✓ Rulează direct pe Proxmox host" PVE_CMD="" else echo "Conectare la Proxmox ${PROXMOX_HOST}..." PVE_CMD="ssh root@${PROXMOX_HOST}" fi echo "" echo "==========================================" echo "PASUL 1/7: VERIFICARE LXC ${LXC_ID}" echo "==========================================" echo "" # Verificare LXC există if ! ${PVE_CMD} pct status ${LXC_ID} &>/dev/null; then echo "ERROR: LXC ${LXC_ID} nu există!" echo "" echo "Creează LXC manual:" echo " pct create ${LXC_ID} local:vztmpl/debian-12-standard_12.2-1_amd64.tar.zst \\" echo " --hostname oracle-db \\" echo " --memory 8192 \\" echo " --cores 4 \\" echo " --rootfs local-lvm:32 \\" echo " --net0 name=eth0,bridge=vmbr0,ip=dhcp \\" echo " --features nesting=1,keyctl=1" echo " pct start ${LXC_ID}" exit 1 fi # Start LXC dacă e oprit if ! ${PVE_CMD} pct status ${LXC_ID} | grep -q "running"; then echo "Pornire LXC ${LXC_ID}..." ${PVE_CMD} pct start ${LXC_ID} sleep 5 fi echo "✓ LXC ${LXC_ID} activ" echo "" echo "==========================================" echo "PASUL 2/7: INSTALARE DOCKER" echo "==========================================" echo "" # Verificare Docker instalat if ${PVE_CMD} pct exec ${LXC_ID} -- which docker &>/dev/null; then echo "✓ Docker deja instalat" ${PVE_CMD} pct exec ${LXC_ID} -- docker --version else echo "Instalare Docker..." ${PVE_CMD} pct exec ${LXC_ID} -- bash -c ' # Update package list apt-get update # Install prerequisites apt-get install -y \ ca-certificates \ curl \ gnupg \ lsb-release # Add Docker GPG key mkdir -p /etc/apt/keyrings curl -fsSL https://download.docker.com/linux/debian/gpg | gpg --dearmor -o /etc/apt/keyrings/docker.gpg # Add Docker repository echo \ "deb [arch=$(dpkg --print-architecture) signed-by=/etc/apt/keyrings/docker.gpg] https://download.docker.com/linux/debian \ $(lsb_release -cs) stable" | tee /etc/apt/sources.list.d/docker.list > /dev/null # Install Docker apt-get update apt-get install -y docker-ce docker-ce-cli containerd.io docker-compose-plugin # Enable and start Docker systemctl enable docker systemctl start docker echo "Docker version:" docker --version ' echo "✓ Docker instalat" fi echo "" echo "==========================================" echo "PASUL 3/7: DOWNLOAD ORACLE 21c XE IMAGE" echo "==========================================" echo "" # Verificare dacă image-ul există if ${PVE_CMD} pct exec ${LXC_ID} -- docker images | grep -q "express.*21.3.0-xe"; then echo "✓ Oracle XE image deja descărcat" else echo "Download Oracle 21c XE image (~ 2-3 GB)..." echo "Durată estimată: 5-15 minute (depinde de conexiune)" ${PVE_CMD} pct exec ${LXC_ID} -- docker pull ${ORACLE_IMAGE} echo "✓ Oracle XE image descărcat" fi echo "" echo "==========================================" echo "PASUL 4/7: OPRIRE CONTAINER VECHI (dacă există)" echo "==========================================" echo "" if ${PVE_CMD} pct exec ${LXC_ID} -- docker ps -a | grep -q ${CONTAINER_NAME}; then echo "Oprire și ștergere container vechi ${CONTAINER_NAME}..." ${PVE_CMD} pct exec ${LXC_ID} -- docker stop ${CONTAINER_NAME} 2>/dev/null || true ${PVE_CMD} pct exec ${LXC_ID} -- docker rm ${CONTAINER_NAME} 2>/dev/null || true echo "✓ Container vechi șters" else echo "✓ Nu există container vechi" fi echo "" echo "==========================================" echo "PASUL 5/7: START ORACLE 21c XE CONTAINER" echo "==========================================" echo "" # Creare directoare pentru date ${PVE_CMD} pct exec ${LXC_ID} -- mkdir -p /opt/oracle/oradata echo "Pornire container Oracle XE..." ${PVE_CMD} pct exec ${LXC_ID} -- docker run -d \ --name ${CONTAINER_NAME} \ --restart=unless-stopped \ -p 1521:1521 \ -p 5500:5500 \ -e ORACLE_PWD=${ORACLE_PWD} \ -e ORACLE_CHARACTERSET=AL32UTF8 \ -v /opt/oracle/oradata:/opt/oracle/oradata \ ${ORACLE_IMAGE} echo "✓ Container pornit" echo "" echo "Așteptare inițializare Oracle (~ 5-10 minute)..." echo "Monitorizare log: docker logs -f ${CONTAINER_NAME}" echo "" # Așteptare până când Oracle este gata TIMEOUT=600 # 10 minute ELAPSED=0 INTERVAL=10 while [ $ELAPSED -lt $TIMEOUT ]; do if ${PVE_CMD} pct exec ${LXC_ID} -- docker logs ${CONTAINER_NAME} 2>&1 | grep -q "DATABASE IS READY TO USE"; then echo "" echo "✓ Oracle 21c XE READY!" break fi echo -n "." sleep $INTERVAL ELAPSED=$((ELAPSED + INTERVAL)) done if [ $ELAPSED -ge $TIMEOUT ]; then echo "" echo "ERROR: Timeout așteptând Oracle să pornească!" echo "Verifică log-urile: docker logs ${CONTAINER_NAME}" exit 1 fi echo "" echo "==========================================" echo "PASUL 6/7: ȘTERGERE XEPDB1 + CREARE PDB ROA" echo "==========================================" echo "" echo "Conectare la CDB și ștergere XEPDB1..." ${PVE_CMD} pct exec ${LXC_ID} -- docker exec ${CONTAINER_NAME} sqlplus -s sys/${ORACLE_PWD}@localhost:1521/XE as sysdba <<'EOF' SET SERVEROUTPUT ON WHENEVER SQLERROR CONTINUE -- Închide și șterge XEPDB1 ALTER PLUGGABLE DATABASE xepdb1 CLOSE IMMEDIATE; DROP PLUGGABLE DATABASE xepdb1 INCLUDING DATAFILES; -- Verificare că XEPDB1 a fost șters SELECT 'PDB după ștergere XEPDB1:' FROM DUAL; SELECT name, open_mode FROM v$pdbs; EXIT; EOF echo "✓ XEPDB1 șters" echo "" echo "Creare PDB ROA..." ${PVE_CMD} pct exec ${LXC_ID} -- docker exec ${CONTAINER_NAME} sqlplus -s sys/${ORACLE_PWD}@localhost:1521/XE as sysdba <