Commit All

This commit is contained in:
2025-10-30 13:33:08 +01:00
commit 3678efed07
31 changed files with 5536 additions and 0 deletions

108
start_minimal.sh Executable file
View File

@@ -0,0 +1,108 @@
#!/bin/bash
# Minimal startup script for Turmli Calendar on Raspberry Pi Zero
# Uses minimal resources and avoids problematic dependencies
set -e
# Configuration
APP_DIR="/opt/turmli-calendar"
APP_USER="pi"
APP_PORT="8000"
VENV_PATH="$APP_DIR/venv"
# Colors for output
RED='\033[0;31m'
GREEN='\033[0;32m'
YELLOW='\033[1;33m'
BLUE='\033[0;34m'
NC='\033[0m'
print_info() {
echo -e "${BLUE}${NC} $1"
}
print_success() {
echo -e "${GREEN}${NC} $1"
}
print_error() {
echo -e "${RED}${NC} $1"
}
print_warning() {
echo -e "${YELLOW}${NC} $1"
}
# Check if running as correct user
if [ "$EUID" -eq 0 ]; then
print_error "Don't run this script as root. Use: ./start_minimal.sh"
exit 1
fi
# Check if application directory exists
if [ ! -d "$APP_DIR" ]; then
print_error "Application directory not found: $APP_DIR"
print_info "Please run the deployment script first: sudo ./deploy_rpi.sh install"
exit 1
fi
# Check if virtual environment exists
if [ ! -d "$VENV_PATH" ]; then
print_error "Virtual environment not found: $VENV_PATH"
print_info "Please run the deployment script first: sudo ./deploy_rpi.sh install"
exit 1
fi
# Change to application directory
cd "$APP_DIR"
# Show system resources before starting
print_info "System resources before startup:"
echo " Memory: $(free -m | grep Mem | awk '{printf "Used: %dMB / Total: %dMB (%.1f%%)", $3, $2, $3*100/$2}')"
echo " Swap: $(free -m | grep Swap | awk '{printf "Used: %dMB / Total: %dMB", $3, $2}')"
echo " CPU Load: $(uptime | awk -F'load average:' '{print $2}')"
echo " Disk: $(df -h / | tail -1 | awk '{printf "Used: %s / Total: %s (%s)", $3, $2, $5}')"
echo
# Set environment variables for minimal resource usage
export PYTHONUNBUFFERED=1
export PYTHONDONTWRITEBYTECODE=1
export MALLOC_ARENA_MAX=2 # Limit memory fragmentation
export MALLOC_MMAP_THRESHOLD_=131072
export MALLOC_TRIM_THRESHOLD_=131072
export MALLOC_MMAP_MAX_=65536
# Set a custom temp directory to avoid filling /tmp
export TMPDIR="$APP_DIR/tmp"
mkdir -p "$TMPDIR"
# Clear Python cache to free memory
find "$APP_DIR" -type d -name "__pycache__" -exec rm -rf {} + 2>/dev/null || true
find "$APP_DIR" -name "*.pyc" -delete 2>/dev/null || true
print_info "Starting Turmli Calendar with minimal resources..."
print_info "Access the application at: http://$(hostname -I | cut -d' ' -f1):${APP_PORT}"
print_info "Press Ctrl+C to stop"
echo
# Start uvicorn with minimal configuration
# --workers 1: Single worker process
# --loop asyncio: Standard event loop (no uvloop)
# --no-access-log: Disable access logging to save resources
# --log-level warning: Only log warnings and errors
# --limit-concurrency 10: Limit concurrent connections
# --timeout-keep-alive 5: Short keepalive timeout
# --backlog 32: Smaller connection backlog
exec "$VENV_PATH/bin/python" -m uvicorn main:app \
--host 0.0.0.0 \
--port ${APP_PORT} \
--workers 1 \
--loop asyncio \
--no-access-log \
--log-level warning \
--limit-concurrency 10 \
--timeout-keep-alive 5 \
--backlog 32 \
--no-use-colors