New package secubox-app-streamlit-launcher: - Lazy loading: apps start only when accessed - Idle shutdown: stop apps after configurable timeout (default 30min) - Memory management: force-stop low-priority apps when memory low - Priority system: higher priority = keep running longer - Always-on mode for critical apps - Procd daemon with respawn CLI: streamlit-launcherctl - daemon: run background manager - status/list: show app states and idle times - start/stop: manual app control - priority: set app priority (1-100) - check/check-memory: manual checks Updated slforge with launcher integration: - slforge launcher status/priority/always-on commands - Access tracking on app start - README documentation Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
5.2 KiB
5.2 KiB
SecuBox Streamlit Launcher
On-demand Streamlit app launcher with idle shutdown and memory management.
Overview
The Streamlit Launcher optimizes resource usage on constrained devices by:
- Starting apps on-demand when first accessed (lazy loading)
- Stopping idle apps after configurable timeout (default: 30 min)
- Managing memory pressure by stopping low-priority apps when memory is low
- Priority system to keep critical apps running longer
Architecture
┌─────────────┐ ┌──────────────┐ ┌─────────────────┐
│ HAProxy │────▶│ mitmproxy │────▶│ Streamlit │
│ (vhost) │ │ (WAF+track) │ │ Launcher Daemon │
└─────────────┘ └──────────────┘ └────────┬────────┘
│ │
Track access Start/Stop
│ │
┌──────▼──────┐ ┌─────▼─────┐
│ /tmp/access │ │ slforge │
│ (touch) │ │ start/ │
└─────────────┘ │ stop │
└───────────┘
Installation
opkg install secubox-app-streamlit-launcher
CLI Reference
# Show status
streamlit-launcherctl status
# List all apps with details
streamlit-launcherctl list
# Manually start/stop an app
streamlit-launcherctl start <app>
streamlit-launcherctl stop <app>
# Set app priority (higher = keep running longer)
streamlit-launcherctl priority <app> <value>
# Set always-on (never auto-stop)
streamlit-launcherctl priority <app> 100 1
# Run idle check manually
streamlit-launcherctl check
# Run memory pressure check
streamlit-launcherctl check-memory
Configuration
Edit /etc/config/streamlit-launcher:
config global 'global'
# Enable the launcher daemon
option enabled '1'
# Enable on-demand startup (vs always-running)
option on_demand '1'
# Minutes of inactivity before stopping an app
option idle_timeout '30'
# Seconds between idle checks
option check_interval '60'
# Minimum free memory (MB) before force-stopping apps
option memory_threshold '100'
# Max seconds to wait for app startup
option startup_timeout '30'
# App priorities (higher = keep running longer)
config priority 'control'
option app 'control'
option value '100'
option always_on '1'
config priority 'ytdownload'
option app 'ytdownload'
option value '30'
Priority System
| Priority | Behavior |
|---|---|
| 100 + always_on | Never auto-stopped |
| 80-99 | Stopped last during memory pressure |
| 50 (default) | Normal priority |
| 1-49 | Stopped first during memory pressure |
Integration with slforge
The launcher works alongside slforge (Streamlit Forge):
slforgemanages app configuration, creation, and basic start/stopstreamlit-launcherctladds on-demand and idle management
When on-demand is enabled:
- User accesses
https://app.example.com - HAProxy routes to mitmproxy
- If app is down, mitmproxy can trigger startup via hook
- Launcher starts app and waits for ready
- Request is served
- Access is tracked
- After idle timeout, app is stopped
Access Tracking
The launcher tracks app access via touch files in /tmp/streamlit-access/:
# Track access (reset idle timer)
streamlit-launcherctl track <app>
# Or directly
touch /tmp/streamlit-access/<app>
This can be triggered by:
- mitmproxy request hook
- HAProxy health check script
- Cron job parsing access logs
Memory Management
When free memory drops below threshold:
- Apps are sorted by priority (lowest first)
- Low-priority apps are stopped one by one
- Stops when memory recovers above threshold
- Always-on apps are never stopped
Service Control
# Enable/start the daemon
/etc/init.d/streamlit-launcher enable
/etc/init.d/streamlit-launcher start
# Check daemon status
/etc/init.d/streamlit-launcher status
# View logs
logread -e streamlit-launcher
Files
| Path | Description |
|---|---|
/usr/sbin/streamlit-launcherctl |
CLI tool |
/etc/config/streamlit-launcher |
UCI configuration |
/etc/init.d/streamlit-launcher |
Procd init script |
/tmp/streamlit-access/ |
Access tracking files |
/usr/share/streamlit-launcher/loading.html |
Loading page template |
Example: Optimize for Low Memory
# Set aggressive timeout (10 min)
uci set streamlit-launcher.global.idle_timeout='10'
# Lower memory threshold (trigger cleanup at 150MB free)
uci set streamlit-launcher.global.memory_threshold='150'
# Make dashboard always-on
streamlit-launcherctl priority dashboard 100 1
# Lower priority for heavy apps
streamlit-launcherctl priority jupyter 20
streamlit-launcherctl priority analytics 30
uci commit streamlit-launcher
/etc/init.d/streamlit-launcher restart