-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathdeploy.sh
More file actions
executable file
·87 lines (73 loc) · 4.15 KB
/
deploy.sh
File metadata and controls
executable file
·87 lines (73 loc) · 4.15 KB
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
#!/bin/bash
set -e
# === CONFIGURATION ===
REMOTE_USER="knowone"
REMOTE_HOST="berri.local"
REMOTE_DIR="/opt/speed-monitor"
VENV_DIR="$REMOTE_DIR/venv"
PYTHON_BIN="$VENV_DIR/bin/python"
JUPYTER_BIN="$VENV_DIR/bin/jupyter"
MONITOR_DIR="$REMOTE_DIR/monitor"
ANALYSIS_DIR="$REMOTE_DIR/analysis"
MONITOR_SCRIPT_LOCAL="monitor/monitor.py"
MONITOR_SCRIPT_REMOTE="$MONITOR_DIR/monitor.py"
REQUIREMENTS_LOCAL="requirements.txt"
REQUIREMENTS_REMOTE="$REMOTE_DIR/requirements.txt"
REPORT_NOTEBOOK_LOCAL="analysis/analysis.ipynb"
REPORT_NOTEBOOK_REMOTE="$ANALYSIS_DIR/analysis.ipynb"
GENERATE_REPORT_LOCAL="analysis/generate_report.sh"
GENERATE_REPORT_REMOTE="$ANALYSIS_DIR/generate_report.sh"
SERVICE_LOCAL="analysis/speed-report.service"
SERVICE_REMOTE="$ANALYSIS_DIR/speed-report.service"
SERVICE_DEST="/etc/systemd/system/speed-report.service"
CRON_LOG_PATH="$REMOTE_DIR/cron.log"
SPEEDTEST_LOG_PATH="$REMOTE_DIR/speedtests.jsonl"
REPORT_HTML="$ANALYSIS_DIR/report.html"
HTTP_PORT=8080
echo "==> Starting deployment to $REMOTE_USER@$REMOTE_HOST..."
# === CHECK REQUIRED FILES ===
for f in "$REQUIREMENTS_LOCAL" "$MONITOR_SCRIPT_LOCAL" "$REPORT_NOTEBOOK_LOCAL" "$GENERATE_REPORT_LOCAL" "$SERVICE_LOCAL"; do
if [ ! -f "$f" ]; then
echo "ERROR: Required file $f not found. Aborting."
exit 1
fi
done
# === CREATE REMOTE DIRECTORIES ===
echo "==> Creating remote directory tree (with sudo if needed)..."
ssh ${REMOTE_USER}@${REMOTE_HOST} "sudo mkdir -p $MONITOR_DIR $ANALYSIS_DIR && sudo chown -R $REMOTE_USER:$REMOTE_USER $REMOTE_DIR"
# === COPY ONLY REQUIRED FILES ===
echo "==> Copying required files..."
scp "$REQUIREMENTS_LOCAL" ${REMOTE_USER}@${REMOTE_HOST}:"$REQUIREMENTS_REMOTE"
scp "$MONITOR_SCRIPT_LOCAL" ${REMOTE_USER}@${REMOTE_HOST}:"$MONITOR_SCRIPT_REMOTE"
scp "$REPORT_NOTEBOOK_LOCAL" ${REMOTE_USER}@${REMOTE_HOST}:"$REPORT_NOTEBOOK_REMOTE"
scp "$GENERATE_REPORT_LOCAL" ${REMOTE_USER}@${REMOTE_HOST}:"$GENERATE_REPORT_REMOTE"
scp "$SERVICE_LOCAL" ${REMOTE_USER}@${REMOTE_HOST}:"$SERVICE_REMOTE"
# === ENSURE SCRIPTS ARE EXECUTABLE ===
ssh ${REMOTE_USER}@${REMOTE_HOST} "chmod +x $GENERATE_REPORT_REMOTE"
# === PYTHON ENVIRONMENT & DEPENDENCIES ===
echo "==> Setting up Python virtual environment and installing requirements..."
ssh ${REMOTE_USER}@${REMOTE_HOST} "cd $REMOTE_DIR && python3 -m venv venv && source venv/bin/activate && pip install --upgrade pip && pip install -r requirements.txt"
echo "==> Installing Jupyter if not present..."
ssh ${REMOTE_USER}@${REMOTE_HOST} "source $VENV_DIR/bin/activate && pip install jupyter"
echo "==> Installing Ookla Speedtest CLI (if not present)..."
ssh ${REMOTE_USER}@${REMOTE_HOST} "command -v speedtest >/dev/null 2>&1 || (sudo apt-get update && sudo apt-get install -y curl && export DEBIAN_FRONTEND=noninteractive && curl -s https://packagecloud.io/install/repositories/ookla/speedtest-cli/script.deb.sh | sudo bash && sudo apt-get install -y speedtest)"
# === CRON JOBS ===
echo "==> Setting up cron jobs for monitor and report generation (single log file)..."
CRON_MONITOR="0 * * * * SPEEDTEST_LOG_PATH=$SPEEDTEST_LOG_PATH $PYTHON_BIN $MONITOR_SCRIPT_REMOTE >> $CRON_LOG_PATH 2>&1"
CRON_REPORT="10 * * * * $GENERATE_REPORT_REMOTE >> $CRON_LOG_PATH 2>&1"
ssh ${REMOTE_USER}@${REMOTE_HOST} "(crontab -l 2>/dev/null | grep -v monitor.py | grep -v generate_report.sh; echo \"$CRON_MONITOR\"; echo \"$CRON_REPORT\") | crontab -"
# === SYSTEMD SERVICE ===
echo "==> Installing and enabling HTTP server systemd service..."
ssh ${REMOTE_USER}@${REMOTE_HOST} "\
sudo cp $SERVICE_REMOTE $SERVICE_DEST && \
sudo systemctl daemon-reload && \
sudo systemctl unmask speed-report.service || true && \
sudo systemctl enable speed-report.service && \
sudo systemctl restart speed-report.service"
# === OPEN HTTP PORT ===
echo "==> Opening HTTP port $HTTP_PORT in the firewall..."
ssh ${REMOTE_USER}@${REMOTE_HOST} "sudo ufw allow $HTTP_PORT comment 'speed-report'"
echo "==> Deployment complete!"
echo "Monitor and report generation will run hourly via cron on $REMOTE_HOST and log results to $LOG_PATH"
echo "Report will be generated hourly and served at http://$REMOTE_HOST:$HTTP_PORT/report.html"
echo "You can check the cron log at $LOG_PATH for any issues."