DFS_Portfolio_Manager / setup-supervisor-all-instances.ps1
James McCool
Add in config file.
ef5050a
# Fixed script for Amazon Linux 2023
$setupScript = @'
#!/bin/bash
cd /home/ec2-user/AWS_Portfolio_Manager
# Install supervisor via pip
sudo pip3 install supervisor --break-system-packages
# Create supervisor directories
sudo mkdir -p /etc/supervisor/conf.d
sudo mkdir -p /var/log/supervisor
# Create main supervisor config
sudo tee /etc/supervisord.conf > /dev/null <<'MAINEOF'
[unix_http_server]
file=/tmp/supervisor.sock
[supervisord]
logfile=/var/log/supervisor/supervisord.log
logfile_maxbytes=50MB
logfile_backups=10
loglevel=info
pidfile=/tmp/supervisord.pid
nodaemon=false
minfds=1024
minprocs=200
[rpcinterface:supervisor]
supervisor.rpcinterface_factory = supervisor.rpcinterface:make_main_rpcinterface
[supervisorctl]
serverurl=unix:///tmp/supervisor.sock
[include]
files = /etc/supervisor/conf.d/*.conf
MAINEOF
# Create systemd service for supervisor
sudo tee /etc/systemd/system/supervisord.service > /dev/null <<'SYSEOF'
[Unit]
Description=Supervisor process control system
After=network.target
[Service]
Type=forking
ExecStart=/usr/local/bin/supervisord -c /etc/supervisord.conf
ExecReload=/usr/local/bin/supervisorctl reload
ExecStop=/usr/local/bin/supervisorctl shutdown
Restart=on-failure
[Install]
WantedBy=multi-user.target
SYSEOF
# Enable and start supervisord
sudo systemctl daemon-reload
sudo systemctl enable supervisord
sudo systemctl start supervisord
# Kill any running streamlit
pkill -f 'streamlit run' || true
# Create supervisor config for streamlit
sudo tee /etc/supervisor/conf.d/streamlit.conf > /dev/null <<'EOF'
[program:streamlit]
directory=/home/ec2-user/AWS_Portfolio_Manager
command=/home/ec2-user/AWS_Portfolio_Manager/venv/bin/streamlit run application.py --server.port 5000 --server.address 0.0.0.0
user=ec2-user
autostart=true
autorestart=true
stderr_logfile=/var/log/streamlit.err.log
stdout_logfile=/var/log/streamlit.out.log
environment=HOME="/home/ec2-user",USER="ec2-user"
EOF
# Reload and start
sudo supervisorctl reread
sudo supervisorctl update
sudo supervisorctl start streamlit
'@
# Write with Unix line endings
[System.IO.File]::WriteAllText("$PWD\setup_supervisor.sh", $setupScript.Replace("`r`n", "`n"), [System.Text.Encoding]::ASCII)
# Now run on all instances
. .\get-ips.ps1
$instanceIds = aws autoscaling describe-auto-scaling-groups --auto-scaling-group-names portfolio-manager-asg --query 'AutoScalingGroups[0].Instances[?HealthStatus==`Healthy`].InstanceId' --output text
$instanceIdArray = $instanceIds -split "`t"
ssh-keygen -t rsa -f temp_supervisor_key -N '""' -q
for ($i = 0; $i -lt $global:instances.Count; $i++) {
$ip = $global:instances[$i]
$instanceId = $instanceIdArray[$i]
Write-Host "Setting up supervisor on $ip..." -ForegroundColor Yellow
aws ec2-instance-connect send-ssh-public-key --instance-id $instanceId --instance-os-user ec2-user --ssh-public-key file://temp_supervisor_key.pub | Out-Null
# Copy script and execute
scp -i temp_supervisor_key -o StrictHostKeyChecking=no setup_supervisor.sh ec2-user@${ip}:/tmp/
ssh -i temp_supervisor_key -o StrictHostKeyChecking=no ec2-user@$ip "bash /tmp/setup_supervisor.sh"
if ($LASTEXITCODE -eq 0) {
Write-Host "Supervisor configured on $ip" -ForegroundColor Green
} else {
Write-Host "Check errors on $ip" -ForegroundColor Yellow
}
}
Remove-Item temp_supervisor_key, temp_supervisor_key.pub, setup_supervisor.sh -ErrorAction SilentlyContinue
Write-Host "`nSetup complete! Verifying..." -ForegroundColor Green
# Verify
foreach ($ip in $global:instances) {
Write-Host "`nChecking $ip..." -ForegroundColor Cyan
ssh -i "C:\Users\mccoo\.ssh\aws-eb" ec2-user@$ip "sudo supervisorctl status" 2>$null
}