File size: 3,720 Bytes
ef5050a
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
# 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
}