Readme und Setup scriplt

This commit is contained in:
Daniel Nagel 2026-04-16 09:15:35 +00:00
parent a589de8431
commit 93fea0aecd
3 changed files with 237 additions and 3 deletions

33
README.md Normal file
View File

@ -0,0 +1,33 @@
# Atemschutz Geräteträger Dokumentation
Das Projekt ermöglicht es einfach zu dokumentieren WANN, WER im Einsatz (oder Übung) mit welchem Gerät war. Die SQLite DB im Hintergrund speichert die Daten ab und kann sie bei Bedarf abrufen.
### Hosting
Das Projekt kann auf jedem Linux Server per Systemd oder ähnlichem gehostet werden. Standard Einstellung ist Port 9000.
##### Hardware:
Linux Container mit 4GB RAM.
Deployment:
mit dem setup.sh script kann das Projekt und alle Notwendigkeiten schnell installiert werden.
```
chmod +x setup.sh
sudo ./setup.sh
```
| | setup.sh Funktion |
| --- | ---------------------------------------------------------------- |
| 1 | Python 3.12+ Version prüfen |
| 2 | Systemabhängigkeiten (`pip3`, `sqlite3`) prüfen/installieren |
| 3 | Virtuelle Umgebung (`.venv`) erstellen |
| 4 | "ats" Benutzer erstellen. |
| 5 | `requirements.txt` oder NiceGUI direkt installieren |
| 6 | `data/`-Verzeichnis und DB-Datei prüfen |
| 7 | UFW-Firewall Port 9000 freigeben (falls vorhanden) |
| 8 | Optionaler`systemd`-Service für Autostart<br /><br /> |

View File

@ -1,3 +0,0 @@
Projektbeschreibung:
Das Projekt läuft über ein Webserver auf einem Rechner. Über die GUI kann man ATS Nutzer nach einer Übung eintragen, Plus ein paar Datensätze die wichtig sind.
Über eine extra Seite kann man die Datensätze betrachten und Auslesen. Über eine Admin Seite kann man die Namen der ATS Träger bearbeiten.

204
setup.sh Normal file
View File

@ -0,0 +1,204 @@
#!/bin/bash
# ============================================================
# setup.sh - Automated Deployment Script for ATS-Doku
# Compatible with Linux environments
# ============================================================
set -e # Exit on error
# --- Colors ---
RED='\033[0;31m'
GREEN='\033[0;32m'
YELLOW='\033[1;33m'
NC='\033[0m'
log() { echo -e "${GREEN}[INFO]${NC} $1"; }
warn() { echo -e "${YELLOW}[WARN]${NC} $1"; }
error() { echo -e "${RED}[ERROR]${NC} $1"; exit 1; }
# --- Configuration ---
APP_NAME="ats-doku"
APP_USER="ats"
APP_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
VENV_DIR="$APP_DIR/.venv"
PYTHON_MIN="3.12"
PORT=9000
SERVICE_FILE="/etc/systemd/system/${APP_NAME}.service"
# ============================================================
# 1. Root check for system-level operations
# ============================================================
if [ "$EUID" -ne 0 ]; then
error "Please run as root or with sudo: sudo ./setup.sh"
fi
# ============================================================
# 2. Check Python version
# ============================================================
log "Checking Python version..."
if ! command -v python3 &>/dev/null; then
error "Python3 not found. Please install Python $PYTHON_MIN or higher."
fi
PYTHON_VERSION=$(python3 -c 'import sys; print(f"{sys.version_info.major}.{sys.version_info.minor}")')
ACTUAL_MAJOR=$(echo "$PYTHON_VERSION" | cut -d. -f1)
ACTUAL_MINOR=$(echo "$PYTHON_VERSION" | cut -d. -f2)
if [ "$ACTUAL_MAJOR" -lt 3 ] || ([ "$ACTUAL_MAJOR" -eq 3 ] && [ "$ACTUAL_MINOR" -lt 12 ]); then
error "Python $PYTHON_MIN or higher required. Found: $PYTHON_VERSION"
fi
log "Python $PYTHON_VERSION found ✓"
# ============================================================
# 3. Check system dependencies
# ============================================================
log "Checking system dependencies..."
for cmd in pip3 sqlite3; do
if ! command -v "$cmd" &>/dev/null; then
warn "$cmd not found. Attempting installation..."
if command -v apt-get &>/dev/null; then
apt-get install -y python3-pip sqlite3
elif command -v dnf &>/dev/null; then
dnf install -y python3-pip sqlite
elif command -v pacman &>/dev/null; then
pacman -S --noconfirm python-pip sqlite
else
error "Package manager not recognized. Please install $cmd manually."
fi
fi
done
log "System dependencies OK ✓"
# ============================================================
# 4. Create 'ats' system user if not exists
# ============================================================
log "Checking for system user '$APP_USER'..."
if id "$APP_USER" &>/dev/null; then
warn "User '$APP_USER' already exists. Skipping creation."
else
log "Creating system user '$APP_USER'..."
useradd \
--system \
--no-create-home \
--shell /usr/sbin/nologin \
--comment "ATS Doku Service User" \
"$APP_USER"
log "User '$APP_USER' created ✓"
fi
# ============================================================
# 5. Set directory ownership
# ============================================================
log "Setting ownership of $APP_DIR to '$APP_USER'..."
chown -R "$APP_USER":"$APP_USER" "$APP_DIR"
log "Ownership set ✓"
# ============================================================
# 6. Create virtual environment
# ============================================================
log "Creating virtual environment in $VENV_DIR..."
if [ -d "$VENV_DIR" ]; then
warn "Virtual environment already exists. Skipping creation."
else
python3 -m venv "$VENV_DIR"
chown -R "$APP_USER":"$APP_USER" "$VENV_DIR"
log "Virtual environment created ✓"
fi
# ============================================================
# 7. Install Python dependencies
# ============================================================
log "Installing Python dependencies..."
sudo -u "$APP_USER" "$VENV_DIR/bin/pip" install --upgrade pip --quiet
if [ -f "$APP_DIR/requirements.txt" ]; then
sudo -u "$APP_USER" "$VENV_DIR/bin/pip" install -r "$APP_DIR/requirements.txt" --quiet
log "requirements.txt installed ✓"
else
warn "No requirements.txt found. Installing NiceGUI directly..."
sudo -u "$APP_USER" "$VENV_DIR/bin/pip" install nicegui --quiet
log "NiceGUI installed ✓"
fi
# ============================================================
# 8. Ensure data directory exists
# ============================================================
log "Checking data directory..."
DATA_DIR="$APP_DIR/data"
if [ ! -d "$DATA_DIR" ]; then
mkdir -p "$DATA_DIR"
chown "$APP_USER":"$APP_USER" "$DATA_DIR"
log "Directory 'data' created ✓"
fi
DB_FILE="$APP_DIR/ats_doku.db"
if [ ! -f "$DB_FILE" ]; then
warn "Database file not found. It will be created automatically on first start."
else
chown "$APP_USER":"$APP_USER" "$DB_FILE"
fi
# ============================================================
# 9. Open firewall port (optional)
# ============================================================
if command -v ufw &>/dev/null; then
log "Opening port $PORT in UFW firewall..."
ufw allow "$PORT"/tcp &>/dev/null || warn "Could not set UFW rule."
fi
# ============================================================
# 10. Create and enable systemd service
# ============================================================
log "Creating systemd service: $SERVICE_FILE"
cat > "$SERVICE_FILE" <<EOF
[Unit]
Description=ATS Traeger Dokumentation (NiceGUI)
After=network.target
[Service]
Type=simple
User=$APP_USER
Group=$APP_USER
WorkingDirectory=$APP_DIR
ExecStart=$VENV_DIR/bin/python $APP_DIR/main.py
Restart=on-failure
RestartSec=5
Environment=PYTHONUNBUFFERED=1
# Security hardening
NoNewPrivileges=true
PrivateTmp=true
ProtectSystem=strict
ReadWritePaths=$APP_DIR
[Install]
WantedBy=multi-user.target
EOF
systemctl daemon-reload
systemctl enable "$APP_NAME"
systemctl restart "$APP_NAME"
log "Service '$APP_NAME' started and enabled ✓"
# ============================================================
# Done
# ============================================================
echo ""
echo -e "${GREEN}============================================${NC}"
echo -e "${GREEN} Setup complete!${NC}"
echo -e "${GREEN} App available at: http://localhost:$PORT${NC}"
echo -e "${GREEN} Service status: sudo systemctl status $APP_NAME${NC}"
echo -e "${GREEN} Live logs: sudo journalctl -u $APP_NAME -f${NC}"
echo -e "${GREEN}============================================${NC}"