Files
ROMFASTSQL/system_instructions/oracle/oracle-xe-complete-setup.sh
2025-09-30 01:27:33 +03:00

316 lines
10 KiB
Bash

#!/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!"