Dynamic site engine: Flask per-CT, live API, per-vertical identities, seed content generator
This commit is contained in:
115
core/deploy_engine.py
Normal file
115
core/deploy_engine.py
Normal file
@@ -0,0 +1,115 @@
|
||||
# Deploy the dynamic site engine to all 8 CTs and start them as services
|
||||
import subprocess
|
||||
import sys
|
||||
import time
|
||||
|
||||
SITES = {
|
||||
"ai": (135, "10.30.20.240"),
|
||||
"tech": (136, "10.30.20.241"),
|
||||
"science": (137, "10.30.20.242"),
|
||||
"crypto": (138, "10.30.20.243"),
|
||||
"linux": (139, "10.30.20.244"),
|
||||
"gaming": (140, "10.30.20.246"),
|
||||
"diy": (141, "10.30.20.247"),
|
||||
"guides": (142, "10.30.20.248"),
|
||||
}
|
||||
|
||||
PROXMOX = "root@10.30.20.85"
|
||||
|
||||
|
||||
def ssh(cmd, timeout=30):
|
||||
return subprocess.run(
|
||||
["ssh", "-o", "ConnectTimeout=5", PROXMOX, cmd],
|
||||
capture_output=True, text=True, timeout=timeout
|
||||
).stdout.strip()
|
||||
|
||||
|
||||
def deploy_all():
|
||||
print("=" * 60)
|
||||
print("DEPLOYING DYNAMIC SITE ENGINE TO ALL 8 CTs")
|
||||
print("=" * 60)
|
||||
|
||||
# Create systemd service file content
|
||||
service_unit = """[Unit]
|
||||
Description=Auto Publisher Site ({vertical})
|
||||
After=network.target
|
||||
|
||||
[Service]
|
||||
Type=simple
|
||||
User=root
|
||||
WorkingDirectory=/opt/publisher
|
||||
Environment=PUBLISHER_VERTICAL={vertical}
|
||||
Environment=PUBLISHER_SECRET=auto-publish-2026
|
||||
ExecStart=/usr/bin/python3 /opt/publisher/app.py --port 5000 --host 0.0.0.0
|
||||
Restart=always
|
||||
RestartSec=5
|
||||
|
||||
[Install]
|
||||
WantedBy=multi-user.target
|
||||
"""
|
||||
|
||||
nginx_conf = """server {{
|
||||
listen 80;
|
||||
server_name {vertical}.thetempleofdoom.com;
|
||||
|
||||
location / {{
|
||||
proxy_pass http://127.0.0.1:5000;
|
||||
proxy_set_header Host $host;
|
||||
proxy_set_header X-Real-IP $remote_addr;
|
||||
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
|
||||
proxy_set_header X-Forwarded-Proto $scheme;
|
||||
}}
|
||||
|
||||
location /a/ping {{
|
||||
proxy_pass http://127.0.0.1:5000;
|
||||
proxy_set_header Host $host;
|
||||
proxy_set_header X-Real-IP $remote_addr;
|
||||
}}
|
||||
}}
|
||||
"""
|
||||
|
||||
for vertical, (vmid, ip) in SITES.items():
|
||||
print(f"\n{'─'*40}")
|
||||
print(f"📡 {vertical}.thetempleofdoom.com (CT {vmid}, {ip})")
|
||||
|
||||
# Write systemd unit via base64
|
||||
import base64
|
||||
unit_b64 = base64.b64encode(
|
||||
service_unit.format(vertical=vertical).encode()
|
||||
).decode()
|
||||
|
||||
ssh(f"pct exec {vmid} -- bash -c 'echo {unit_b64} | base64 -d > /etc/systemd/system/publisher.service'")
|
||||
ssh(f"pct exec {vmid} -- systemctl daemon-reload")
|
||||
ssh(f"pct exec {vmid} -- systemctl enable publisher")
|
||||
ssh(f"pct exec {vmid} -- systemctl restart publisher")
|
||||
time.sleep(2)
|
||||
|
||||
# Check if running
|
||||
status = ssh(f"pct exec {vmid} -- systemctl is-active publisher")
|
||||
print(f" Service: {status}")
|
||||
|
||||
# Update nginx to proxy to Flask
|
||||
nginx_b64 = base64.b64encode(
|
||||
nginx_conf.format(vertical=vertical).encode()
|
||||
).decode()
|
||||
ssh(f"pct exec {vmid} -- bash -c 'echo {nginx_b64} | base64 -d > /etc/nginx/sites-available/default'")
|
||||
ssh(f"pct exec {vmid} -- nginx -t 2>&1")
|
||||
ssh(f"pct exec {vmid} -- systemctl restart nginx")
|
||||
|
||||
# Verify
|
||||
time.sleep(1)
|
||||
print(f" Testing http://{ip}:80/ ...")
|
||||
result = subprocess.run(
|
||||
["curl", "-s", "-o", "/dev/null", "-w", "%{http_code}",
|
||||
f"http://{ip}:80/", "--connect-timeout", "5"],
|
||||
capture_output=True, text=True, timeout=10
|
||||
)
|
||||
print(f" HTTP {result.stdout.strip()}")
|
||||
|
||||
print(f"\n{'='*60}")
|
||||
print("ALL 8 SITES DEPLOYED AS DYNAMIC SERVICES")
|
||||
print(f"{'='*60}")
|
||||
|
||||
|
||||
if __name__ == "__main__":
|
||||
deploy_all()
|
||||
Reference in New Issue
Block a user