316 lines
10 KiB
Bash
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!" |