oracle install LXC docker

This commit is contained in:
Marius
2025-09-30 01:27:33 +03:00
parent 87785f703a
commit ad07606de0
3 changed files with 978 additions and 0 deletions

View File

@@ -0,0 +1,261 @@
#!/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 ""