Files
timemaster/setup_server.sh
T
sysops 1fedd683e0 Initial commit – TimeMaster Zeiterfassung & HR-Tool
Stand: agent-06 (Audit-Log), agent-05 (Krankmeldung), agent-07 Phase 1 (Personalnummer),
Busylight-Pull-Integration, TOTP/2FA, Abwesenheiten, Zeiterfassung, Kiosk-Grundgerüst.
Migrations 0001–0023 deployed auf 192.168.1.137 + .164.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-05-23 20:03:27 +02:00

119 lines
4.0 KiB
Bash
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
#!/bin/bash
# ============================================================
# TimeMaster Nativer Server-Setup (Ubuntu 22.04 / 24.04)
# Führe dieses Script als root oder mit sudo aus
# ============================================================
set -e
echo "==> [1/6] System-Pakete aktualisieren"
apt-get update && apt-get upgrade -y
echo "==> [2/6] Abhängigkeiten installieren"
apt-get install -y \
python3 python3-venv python3-dev python3-pip \
postgresql postgresql-contrib \
redis-server \
nginx \
git curl build-essential libpq-dev
echo "==> [3/6] PostgreSQL einrichten"
systemctl enable postgresql && systemctl start postgresql
# Datenbank + User anlegen (Produktiv-DB + Test-DB)
sudo -u postgres psql <<SQL
DO \$\$
BEGIN
IF NOT EXISTS (SELECT FROM pg_roles WHERE rolname = 'timemaster') THEN
CREATE ROLE timemaster LOGIN PASSWORD 'timemaster_secret_change_me';
END IF;
END
\$\$;
SELECT 'CREATE DATABASE timemaster_db OWNER timemaster'
WHERE NOT EXISTS (SELECT FROM pg_database WHERE datname = 'timemaster_db')\gexec
SELECT 'CREATE DATABASE timemaster_test OWNER timemaster'
WHERE NOT EXISTS (SELECT FROM pg_database WHERE datname = 'timemaster_test')\gexec
GRANT ALL PRIVILEGES ON DATABASE timemaster_db TO timemaster;
GRANT ALL PRIVILEGES ON DATABASE timemaster_test TO timemaster;
SQL
echo "==> [4/6] Redis einrichten"
systemctl enable redis-server && systemctl start redis-server
echo "==> [5/7] Python venv + Abhängigkeiten"
cd /opt/timemaster/backend
python3 -m venv venv
source venv/bin/activate
pip install --upgrade pip
pip install -r requirements.txt
echo "==> [6/7] Alembic Migrations ausführen"
alembic upgrade head
echo "==> [7/7] nginx für Frontend konfigurieren"
mkdir -p /opt/timemaster/frontend/dist
cat > /etc/nginx/sites-available/timemaster << 'NGINX'
server {
listen 80;
server_name _;
root /opt/timemaster/frontend/dist;
index index.html;
# SPA fallback
location / {
try_files $uri $uri/ /index.html;
}
# API proxy
location /api/ {
proxy_pass http://127.0.0.1:8000;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
}
# FastAPI docs (dev)
location /docs {
proxy_pass http://127.0.0.1:8000/docs;
proxy_set_header Host $host;
}
location /openapi.json {
proxy_pass http://127.0.0.1:8000/openapi.json;
}
}
NGINX
ln -sf /etc/nginx/sites-available/timemaster /etc/nginx/sites-enabled/timemaster
rm -f /etc/nginx/sites-enabled/default
nginx -t && systemctl enable nginx && systemctl reload nginx
echo ""
echo "==> [Optional] Tests ausführen"
echo " python -m pytest tests/ -q"
echo ""
echo "✓ Setup abgeschlossen!"
echo " Backend: sudo systemctl start timemaster"
echo " Frontend: http://$(hostname -I | awk '{print $1}')/"
echo " API-Docs: http://$(hostname -I | awk '{print $1}')/docs"
echo ""
echo ""
echo "Frontend deployen (nach lokalem Build):"
echo " npm run build (im frontend/ Verzeichnis)"
echo " rsync -avz dist/ root@SERVER:/opt/timemaster/frontend/dist/"
echo ""
echo "Hinweise:"
echo " - passlib wurde durch direktes bcrypt ersetzt (kompatibel mit bcrypt >= 4.0)"
echo " - pytest nutzt PostgreSQL test-DB (timemaster_test) kein SQLite"
echo " - pytest.ini: asyncio_mode=auto, loop_scope=session für alle Fixtures"
echo " - openpyxl >= 3.1 für XLSX-Export (Dashboard/Reports)"
echo ""
echo "Verfügbare API-Endpunkte:"
echo " GET /api/v1/dashboard/me Mitarbeiter-Dashboard"
echo " GET /api/v1/dashboard/team Team-Dashboard (Manager+)"
echo " GET /api/v1/dashboard/company Unternehmens-Dashboard (Admin)"
echo " GET /api/v1/reports/time Zeiterfassungsbericht"
echo " GET /api/v1/reports/absences Abwesenheitsbericht"
echo " GET /api/v1/reports/overtime Überstundenbericht"
echo " GET /api/v1/reports/time/export?format=csv|xlsx"
echo " GET /api/v1/reports/absences/export?format=csv|xlsx"
echo " GET /api/v1/reports/overtime/export?format=csv|xlsx"