Skip to main content

Neue Seite

Inventar App Installation - Debian 12 Server

Phase 1: System vorbereiten
sudo apt update && sudo apt upgrade -y
sudo apt install nginx mariadb-server python3 python3-pip python3-venv certbot python3-certbot-nginx -y
sudo mysql_secure_installation
Phase 2: Datenbank einrichten

MySQL als root-Benutzer anmelden und Datenbank erstellen:

sudo mysql -u root -p
Datenbank, Benutzer und alle Tabellen erstellen:

(Ersetzen Sie 'IhrStarkesDbPasswort' durch ein sicheres Passwort, das Sie sich notieren).

CREATE DATABASE inventar;
CREATE USER 'inventar_user'@'localhost' IDENTIFIED BY 'IhrStarkesDbPasswort';
GRANT ALL PRIVILEGES ON inventar.* TO 'inventar_user'@'localhost';
FLUSH PRIVILEGES;
USE inventar;

CREATE TABLE items ( id INT AUTO_INCREMENT PRIMARY KEY, item_uid VARCHAR(50) NOT NULL UNIQUE, name VARCHAR(255) NOT NULL, location VARCHAR(255), quantity INT NOT NULL DEFAULT 0, notes TEXT, created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP, brand VARCHAR(255), size VARCHAR(255), `condition` VARCHAR(100), color VARCHAR(100), price DECIMAL(10, 2), shipping_size VARCHAR(100), image_file VARCHAR(255) );
CREATE TABLE users ( id INT AUTO_INCREMENT PRIMARY KEY, username VARCHAR(100) NOT NULL UNIQUE, password_hash VARCHAR(255) NOT NULL, role VARCHAR(50) NOT NULL DEFAULT 'user' );
CREATE TABLE categories ( id INT AUTO_INCREMENT PRIMARY KEY, name VARCHAR(255) NOT NULL UNIQUE, prefix VARCHAR(3) NOT NULL UNIQUE, parent_id INT NULL, FOREIGN KEY (parent_id) REFERENCES categories(id) ON DELETE CASCADE );
CREATE TABLE item_categories ( item_id INT NOT NULL, category_id INT NOT NULL, PRIMARY KEY (item_id, category_id), FOREIGN KEY (item_id) REFERENCES items(id) ON DELETE CASCADE, FOREIGN KEY (category_id) REFERENCES categories(id) ON DELETE CASCADE );
CREATE TABLE logs ( id INT AUTO_INCREMENT PRIMARY KEY, timestamp TIMESTAMP DEFAULT CURRENT_TIMESTAMP, user_id INT NOT NULL, item_id INT NOT NULL, action VARCHAR(255) NOT NULL, details TEXT, FOREIGN KEY (user_id) REFERENCES users(id), FOREIGN KEY (item_id) REFERENCES items(id) ON DELETE CASCADE );

EXIT;
Phase 3: Projektverzeichnis und Flask-App erstellen

Vollständige Ordnerstruktur erstellen:

mkdir -p ~/inventar-app/templates
mkdir -p ~/inventar-app/static/css
mkdir -p ~/inventar-app/static/js
mkdir -p ~/inventar-app/static/uploads
cd ~/inventar-app

# Python-Umgebung erstellen
python3 -m venv venv
source venv/bin/activate
pip install Flask PyMySQL flask-login flask-bcrypt qrcode Pillow
Phase 4: Externe Bibliotheken herunterladen
# Bootstrap CSS und JS
wget https://cdn.jsdelivr.net/npm/bootstrap@5.3.3/dist/css/bootstrap.min.css -P static/css/
wget https://cdn.jsdelivr.net/npm/bootstrap@5.3.3/dist/js/bootstrap.bundle.min.js -P static/js/

# QR-Code Scanner
wget https://unpkg.com/html5-qrcode@2.3.8/html5-qrcode.min.js -P static/js/
Phase 5: Anwendungsdateien erstellen
5.1 Hauptanwendung (app.py)

Erstellen Sie nano app.py und fügen Sie den vollständigen Flask-Code ein (im Download).

Wichtig: Passen Sie das Datenbank-Passwort in der DB_CONFIG an Ihr gewähltes Passwort an.

5.2 HTML-Vorlagen erstellen

Erstellen Sie alle HTML-Dateien im templates/ Ordner:

  • base.html - Basis-Template
  • index.html - Hauptseite
  • login.html - Login-Seite
  • add_item.html - Artikel hinzufügen
  • edit_item.html - Artikel bearbeiten
  • item_detail.html - Artikel-Details
  • item_history.html - Artikel-Historie
  • manage_categories.html - Kategorien verwalten
  • manage_users.html - Benutzer verwalten
  • print_datasheet.html - Datenblatt drucken
  • print_flyer.html - Flyer drucken
  • print_label.html - Label drucken
  • sell_form.html - Verkaufsformular
5.3 Zusätzliche statische Dateien

Erstellen Sie im static/ Ordner:

  • static/css/styles.css - Eigene CSS-Styles
  • static/js/index.js - JavaScript für Hauptfunktionen
  • static/js/theme.js - Theme-Verwaltung

Füllen Sie alle Dateien mit den Inhalt der Dateien des Downloads!

5.4 Admin-Benutzer erstellen

Erstellen Sie nano create_user.py:

import pymysql
from flask_bcrypt import Bcrypt

# --- Datenbank Konfiguration (aus Ihrer app.py kopiert) ---
DB_CONFIG = {
    'host': 'localhost',
    'user': 'inventar_user',
    'password': 'IhrStarkesDbPasswort', # HIER IHR DB-PASSWORT EINTRAGEN
    'db': 'inventar',
    'cursorclass': pymysql.cursors.DictCursor
}

bcrypt = Bcrypt()

# --- HIER IHRE GEWÜNSCHTEN LOGIN-DATEN EINTRAGEN ---
username = 'admin'
password = 'IhrAdminPasswort'  # Ändern Sie das Passwort!

# Passwort verschlüsseln
password_hash = bcrypt.generate_password_hash(password).decode('utf-8')

# Mit der Datenbank verbinden und Benutzer speichern
try:
    conn = pymysql.connect(**DB_CONFIG)
    with conn.cursor() as cursor:
        cursor.execute("INSERT INTO users (username, password_hash, role) VALUES (%s, %s, %s)", 
                      (username, password_hash, 'admin'))
        conn.commit()
    conn.close()
    print(f"Benutzer '{username}' wurde erfolgreich erstellt!")
except Exception as e:
    print(f"Ein Fehler ist aufgetreten: {e}")
Admin-Benutzer erstellen und Script löschen:

create_user.py ausführen und löschen

# Virtuelle Umgebung aktivieren
source venv/bin/activate

# Script ausführen
python create_user.py

# Script aus Sicherheitsgründen löschen
rm create_user.py
Phase 6: Nginx-Konfiguration (temporär ohne SSL)

Erstellen Sie eine temporäre Nginx-Konfiguration für Let's Encrypt:

sudo nano /etc/nginx/sites-available/inventar
server {
    listen 80;
    server_name xmpp.handwerker.jetzt;
    
    # Let's Encrypt Challenge Location
    location /.well-known/acme-challenge/ {
        root /var/www/html;
    }
    
    # Temporär für Flask-App (wird später entfernt)
    location / {
        proxy_pass http://127.0.0.1:5000;
        proxy_set_header Host $host;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header X-Forwarded-Proto $scheme;
    }
}

Upload-Limit erhöhen in /etc/nginx/nginx.conf:

http {
    ...
    client_max_body_size 20M;
    ...
}

Site aktivieren:

sudo ln -s /etc/nginx/sites-available/inventar /etc/nginx/sites-enabled/
sudo rm /etc/nginx/sites-enabled/default
sudo nginx -t
sudo systemctl restart nginx
Phase 7: Let's Encrypt SSL-Zertifikat erstellen
# Certbot ausführen für automatische SSL-Konfiguration
sudo certbot --nginx -d xmpp.handwerker.jetzt

# Automatische Erneuerung einrichten
sudo systemctl enable certbot.timer
sudo systemctl start certbot.timer

# Test der automatischen Erneuerung
sudo certbot renew --dry-run
Nach erfolgreichem Certbot-Lauf wird Ihre Nginx-Konfiguration automatisch auf folgende Struktur aktualisiert:
server {
    listen 80;
    server_name xmpp.handwerker.jetzt;
    return 301 https://$server_name$request_uri; # Automatische HTTP zu HTTPS Umleitung
}

server {
    listen 443 ssl;
    server_name xmpp.handwerker.jetzt;
    
    # Let's Encrypt SSL-Konfiguration (automatisch hinzugefügt)
    ssl_certificate /etc/letsencrypt/live/xmpp.handwerker.jetzt/fullchain.pem;
    ssl_certificate_key /etc/letsencrypt/live/xmpp.handwerker.jetzt/privkey.pem;
    include /etc/letsencrypt/options-ssl-nginx.conf;
    ssl_dhparam /etc/letsencrypt/ssl-dhparams.pem;
    
    location / {
        proxy_pass http://127.0.0.1:5000;
        proxy_set_header Host $host;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header X-Forwarded-Proto $scheme;
    }
}
Phase 8: Systemd Service einrichten
sudo nano /etc/systemd/system/inventar-app.service
[Unit]
Description=Inventar Flask App
After=network.target

[Service]
User=IhrBenutzername
Group=www-data
WorkingDirectory=/home/IhrBenutzername/inventar-app
ExecStart=/home/IhrBenutzername/inventar-app/venv/bin/python app.py
Restart=always

[Install]
WantedBy=multi-user.target

Service aktivieren:

sudo systemctl daemon-reload
sudo systemctl enable inventar-app.service
sudo systemctl start inventar-app.service
Phase 9: Finale Schritte
# Service-Status überprüfen
sudo systemctl status inventar-app.service
sudo systemctl status nginx

# Nginx-Konfiguration testen
sudo nginx -t
sudo systemctl reload nginx
Wichtige Hinweise:
  • Domain: Stellen Sie sicher, dass IhreDomian.xyz auf die IP-Adresse Ihres Servers zeigt
  • Firewall: Öffnen Sie die Ports 80 und 443
  • Zertifikat-Erneuerung: Let's Encrypt-Zertifikate werden automatisch alle 60 Tage erneuert
  • Backup: Sichern Sie regelmäßig Ihre Datenbank und Upload-Dateien
Troubleshooting:
# Logs anzeigen
sudo journalctl -u inventar-app.service -f
sudo tail -f /var/log/nginx/error.log

# SSL-Status prüfen
sudo certbot certificates