#!/bin/bash # # Oracle XE 21c Complete Setup Script for Docker LXC on Proxmox # This script creates a Docker LXC container and installs Oracle XE with custom PDBs (ROA and ROA2) # # Prerequisites: # - Proxmox VE server with IP 10.0.20.201 # - SSH access to Proxmox as root # - At least 20GB storage and 4GB RAM available # # Usage: # ./oracle-xe-complete-setup.sh # set -e # Configuration PROXMOX_IP="10.0.20.201" CONTAINER_ID="108" CONTAINER_NAME="central-oracle" CONTAINER_IP="" # Will be obtained after creation ORACLE_PASSWORD="OraclePass123" PDB_ADMIN_PASSWORD="AdminPass123" ROA_USER_PASSWORD="RoaPass123" ROA2_USER_PASSWORD="Roa2Pass123" echo "==========================================" echo "Oracle XE 21c Complete Setup Script" echo "==========================================" echo "" # Step 1: Create Docker LXC Container using community script echo "📦 Step 1: Creating Docker LXC Container..." echo "This will open an interactive menu. Please select:" echo " - Operating System: debian" echo " - Version: 12" echo " - Container Type: Unprivileged" echo " - Container ID: $CONTAINER_ID" echo " - Hostname: $CONTAINER_NAME" echo " - Disk Size: 50 GB" echo " - CPU Cores: 2" echo " - RAM: 4096 MB" echo " - Install Docker Compose: Yes" echo " - Install Portainer: Yes (optional)" echo "" read -p "Press Enter to continue with container creation..." ssh root@$PROXMOX_IP << 'EOF' bash -c "$(curl -fsSL https://raw.githubusercontent.com/community-scripts/ProxmoxVE/main/ct/docker.sh)" EOF echo "✅ Docker LXC container created" echo "" # Wait for container to be ready echo "⏳ Waiting for container to be ready..." sleep 10 # Get container IP CONTAINER_IP=$(ssh root@$PROXMOX_IP "pct exec $CONTAINER_ID -- hostname -I | awk '{print \$1}'") echo "✅ Container IP: $CONTAINER_IP" echo "" # Step 2: Create Oracle XE deployment script echo "📝 Step 2: Creating Oracle XE deployment script..." cat > /tmp/deploy-oracle-xe.sh << 'DEPLOY_SCRIPT' #!/bin/bash set -e # Oracle Configuration ORACLE_PASSWORD="OraclePass123" ORACLE_PORT="1521" ORACLE_EM_PORT="5500" CONTAINER_NAME="oracle-xe" echo "🚀 Starting Oracle XE 21c Deployment..." # Create directories for persistence echo "📁 Creating directories for persistence..." mkdir -p /opt/oracle/oradata mkdir -p /opt/oracle/scripts/setup mkdir -p /opt/oracle/scripts/startup chmod -R 777 /opt/oracle echo "✅ Directories created" # Download Oracle XE image echo "📥 Downloading Oracle XE 21c image (this may take several minutes)..." docker pull container-registry.oracle.com/database/express:21.3.0-xe echo "✅ Image downloaded" # Run Oracle XE container echo "🚀 Starting Oracle XE container..." 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 started" # Wait for database to be ready echo "⏳ Waiting for database initialization (5-10 minutes)..." until docker logs $CONTAINER_NAME 2>&1 | grep -q "DATABASE IS READY TO USE!"; do sleep 10 echo -n "." done echo "" echo "✅ Database is ready!" # Extra wait for stabilization sleep 10 echo "✅ Oracle XE deployment completed!" DEPLOY_SCRIPT # Copy and execute deployment script echo "🚀 Deploying Oracle XE..." scp /tmp/deploy-oracle-xe.sh root@$PROXMOX_IP:/tmp/ ssh root@$PROXMOX_IP "sed -i 's/\r$//' /tmp/deploy-oracle-xe.sh" ssh root@$PROXMOX_IP "pct push $CONTAINER_ID /tmp/deploy-oracle-xe.sh /root/deploy-oracle-xe.sh" ssh root@$PROXMOX_IP "pct exec $CONTAINER_ID -- chmod +x /root/deploy-oracle-xe.sh" ssh root@$PROXMOX_IP "pct exec $CONTAINER_ID -- bash /root/deploy-oracle-xe.sh" echo "✅ Oracle XE deployed successfully" echo "" # Step 3: Configure PDBs (Remove XEPDB1, Create ROA and ROA2) echo "🔧 Step 3: Configuring Pluggable Databases..." cat > /tmp/configure_pdbs.sql << EOF -- Close and drop default XEPDB1 ALTER PLUGGABLE DATABASE XEPDB1 CLOSE IMMEDIATE; DROP PLUGGABLE DATABASE XEPDB1 INCLUDING DATAFILES; -- Create ROA PDB CREATE PLUGGABLE DATABASE ROA ADMIN USER pdbadmin IDENTIFIED BY $PDB_ADMIN_PASSWORD STORAGE (MAXSIZE 5G) DEFAULT TABLESPACE USERS DATAFILE '/opt/oracle/oradata/XE/ROA/users01.dbf' SIZE 250M AUTOEXTEND ON FILE_NAME_CONVERT = ('/opt/oracle/oradata/XE/pdbseed/', '/opt/oracle/oradata/XE/ROA/'); -- Create ROA2 PDB CREATE PLUGGABLE DATABASE ROA2 ADMIN USER pdbadmin IDENTIFIED BY $PDB_ADMIN_PASSWORD STORAGE (MAXSIZE 5G) DEFAULT TABLESPACE USERS DATAFILE '/opt/oracle/oradata/XE/ROA2/users01.dbf' SIZE 250M AUTOEXTEND ON FILE_NAME_CONVERT = ('/opt/oracle/oradata/XE/pdbseed/', '/opt/oracle/oradata/XE/ROA2/'); -- Open the new PDBs ALTER PLUGGABLE DATABASE ROA OPEN; ALTER PLUGGABLE DATABASE ROA2 OPEN; -- Save state for auto-open on restart ALTER PLUGGABLE DATABASE ROA SAVE STATE; ALTER PLUGGABLE DATABASE ROA2 SAVE STATE; -- Show results SELECT con_id, name, open_mode FROM v\$pdbs ORDER BY con_id; exit; EOF # Execute PDB configuration scp /tmp/configure_pdbs.sql root@$PROXMOX_IP:/tmp/ ssh root@$PROXMOX_IP "pct push $CONTAINER_ID /tmp/configure_pdbs.sql /tmp/configure_pdbs.sql" ssh root@$PROXMOX_IP "pct exec $CONTAINER_ID -- docker exec -i oracle-xe sqlplus -s sys/$ORACLE_PASSWORD@localhost:1521/XE as sysdba < /tmp/configure_pdbs.sql" echo "✅ PDBs configured (XEPDB1 removed, ROA and ROA2 created)" echo "" # Step 4: Create users in PDBs echo "👤 Step 4: Creating users in PDBs..." cat > /tmp/create_users.sql << EOF -- Create user in ROA PDB ALTER SESSION SET CONTAINER = ROA; CREATE USER app_roa IDENTIFIED BY $ROA_USER_PASSWORD; GRANT CONNECT, RESOURCE TO app_roa; GRANT CREATE SESSION TO app_roa; GRANT CREATE TABLE TO app_roa; GRANT CREATE VIEW TO app_roa; GRANT CREATE PROCEDURE TO app_roa; GRANT CREATE SEQUENCE TO app_roa; GRANT UNLIMITED TABLESPACE TO app_roa; -- Create user in ROA2 PDB ALTER SESSION SET CONTAINER = ROA2; CREATE USER app_roa2 IDENTIFIED BY $ROA2_USER_PASSWORD; GRANT CONNECT, RESOURCE TO app_roa2; GRANT CREATE SESSION TO app_roa2; GRANT CREATE TABLE TO app_roa2; GRANT CREATE VIEW TO app_roa2; GRANT CREATE PROCEDURE TO app_roa2; GRANT CREATE SEQUENCE TO app_roa2; GRANT UNLIMITED TABLESPACE TO app_roa2; -- Verify users ALTER SESSION SET CONTAINER = CDB\$ROOT; SELECT name, network_name FROM v\$active_services WHERE con_id > 1 ORDER BY con_id; exit; EOF # Execute user creation scp /tmp/create_users.sql root@$PROXMOX_IP:/tmp/ ssh root@$PROXMOX_IP "pct push $CONTAINER_ID /tmp/create_users.sql /tmp/create_users.sql" ssh root@$PROXMOX_IP "pct exec $CONTAINER_ID -- docker exec -i oracle-xe sqlplus -s sys/$ORACLE_PASSWORD@localhost:1521/XE as sysdba < /tmp/create_users.sql" echo "✅ Users created in PDBs" echo "" # Step 5: Create helper scripts echo "📝 Step 5: Creating helper scripts..." ssh root@$PROXMOX_IP "pct exec $CONTAINER_ID -- bash -c 'cat > /usr/local/bin/oracle-status << \"HELPER_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\" HELPER_EOF chmod +x /usr/local/bin/oracle-status'" ssh root@$PROXMOX_IP "pct exec $CONTAINER_ID -- bash -c 'cat > /usr/local/bin/oracle-sqlplus << \"HELPER_EOF\" #!/bin/bash docker exec -it oracle-xe sqlplus sys/$ORACLE_PASSWORD@localhost:1521/XE as sysdba HELPER_EOF chmod +x /usr/local/bin/oracle-sqlplus'" ssh root@$PROXMOX_IP "pct exec $CONTAINER_ID -- bash -c 'cat > /usr/local/bin/oracle-logs << \"HELPER_EOF\" #!/bin/bash docker logs -f oracle-xe HELPER_EOF chmod +x /usr/local/bin/oracle-logs'" echo "✅ Helper scripts created" echo "" # Step 6: Test connections echo "🔍 Step 6: Testing connections..." echo "Testing ROA connection..." ssh root@$PROXMOX_IP "pct exec $CONTAINER_ID -- docker exec oracle-xe bash -c 'echo exit | sqlplus app_roa/$ROA_USER_PASSWORD@localhost:1521/ROA'" > /dev/null 2>&1 if [ $? -eq 0 ]; then echo "✅ ROA connection successful" else echo "❌ ROA connection failed" fi echo "Testing ROA2 connection..." ssh root@$PROXMOX_IP "pct exec $CONTAINER_ID -- docker exec oracle-xe bash -c 'echo exit | sqlplus app_roa2/$ROA2_USER_PASSWORD@localhost:1521/ROA2'" > /dev/null 2>&1 if [ $? -eq 0 ]; then echo "✅ ROA2 connection successful" else echo "❌ ROA2 connection failed" fi echo "" # Final information echo "==========================================" echo "✅ ORACLE XE SETUP COMPLETE!" echo "==========================================" echo "" echo "Container Information:" echo " - Container ID: $CONTAINER_ID" echo " - Container Name: $CONTAINER_NAME" echo " - Container IP: $CONTAINER_IP" echo " - Portainer UI: https://$CONTAINER_IP:9443" echo "" echo "Oracle XE Information:" echo " - Oracle Port: 1521" echo " - Enterprise Manager: https://$CONTAINER_IP:5500/em" echo " - SYS Password: $ORACLE_PASSWORD" echo "" echo "Pluggable Databases (PDBs):" echo " 1. ROA" echo " - User: app_roa" echo " - Password: $ROA_USER_PASSWORD" echo " - Connection: sqlplus app_roa/$ROA_USER_PASSWORD@$CONTAINER_IP:1521/ROA" echo " - JDBC: jdbc:oracle:thin:@$CONTAINER_IP:1521/ROA" echo "" echo " 2. ROA2" echo " - User: app_roa2" echo " - Password: $ROA2_USER_PASSWORD" echo " - Connection: sqlplus app_roa2/$ROA2_USER_PASSWORD@$CONTAINER_IP:1521/ROA2" echo " - JDBC: jdbc:oracle:thin:@$CONTAINER_IP:1521/ROA2" echo "" echo " PDB Admin (both): pdbadmin / $PDB_ADMIN_PASSWORD" echo "" echo "Helper Commands (run inside container):" echo " - oracle-status : Check Oracle status" echo " - oracle-sqlplus : Connect as SYS" echo " - oracle-logs : View Oracle logs" echo "" echo "To enter the container:" echo " ssh root@$PROXMOX_IP" echo " pct enter $CONTAINER_ID" echo "" echo "==========================================" # Cleanup temporary files rm -f /tmp/deploy-oracle-xe.sh rm -f /tmp/configure_pdbs.sql rm -f /tmp/create_users.sql echo "🎉 Setup completed successfully!"