🎉 feat: update Dockerfile and scripts for improved functionality
This commit is contained in:
12
Dockerfile
12
Dockerfile
@@ -4,7 +4,7 @@ FROM python:3.11-slim
|
|||||||
# Arbeitsverzeichnis in Container
|
# Arbeitsverzeichnis in Container
|
||||||
WORKDIR /app
|
WORKDIR /app
|
||||||
|
|
||||||
# Systemabhängigkeiten (falls erforderlich)
|
# Systemabhängigkeiten installieren und Verzeichnisse anlegen
|
||||||
RUN apt-get update && \
|
RUN apt-get update && \
|
||||||
apt-get install -y --no-install-recommends gcc && \
|
apt-get install -y --no-install-recommends gcc && \
|
||||||
rm -rf /var/lib/apt/lists/* && \
|
rm -rf /var/lib/apt/lists/* && \
|
||||||
@@ -18,14 +18,16 @@ RUN pip install --upgrade pip && \
|
|||||||
# Anwendungscode kopieren
|
# Anwendungscode kopieren
|
||||||
COPY . .
|
COPY . .
|
||||||
|
|
||||||
|
# Berechtigungen für database-Ordner
|
||||||
|
RUN chmod -R 777 /app/database
|
||||||
|
|
||||||
# Exponiere Port 5000 für Flask
|
# Exponiere Port 5000 für Flask
|
||||||
EXPOSE 5000
|
EXPOSE 5000
|
||||||
|
|
||||||
# Setze Umgebungsvariablen
|
# Setze Umgebungsvariablen
|
||||||
ENV FLASK_APP=app.py
|
ENV FLASK_APP=app.py
|
||||||
ENV FLASK_ENV=production
|
ENV PYTHONUNBUFFERED=1
|
||||||
|
ENV PYTHONDONTWRITEBYTECODE=1
|
||||||
|
|
||||||
# Wenn eine .env im Arbeitsverzeichnis vorhanden ist, wird sie automatisch von Flask geladen
|
# Startkommando mit spezifischen Flags für Produktion
|
||||||
|
|
||||||
# Startkommando
|
|
||||||
CMD ["python", "app.py"]
|
CMD ["python", "app.py"]
|
||||||
19
start.sh
19
start.sh
@@ -3,20 +3,31 @@ set -e
|
|||||||
|
|
||||||
# Alte Container stoppen und entfernen
|
# Alte Container stoppen und entfernen
|
||||||
if [ $(docker ps -aq --filter "name=systades_app" | wc -l) -gt 0 ]; then
|
if [ $(docker ps -aq --filter "name=systades_app" | wc -l) -gt 0 ]; then
|
||||||
|
echo "Stoppe und entferne alten Container..."
|
||||||
docker rm -f systades_app || true
|
docker rm -f systades_app || true
|
||||||
fi
|
fi
|
||||||
if [ $(docker ps -aq --filter "name=systades_db" | wc -l) -gt 0 ]; then
|
|
||||||
docker rm -f systades_db || true
|
|
||||||
fi
|
|
||||||
|
|
||||||
# Alte Images löschen
|
# Alte Images löschen
|
||||||
|
echo "Entferne altes Image..."
|
||||||
docker rmi -f systades_app:latest || true
|
docker rmi -f systades_app:latest || true
|
||||||
|
|
||||||
|
# Stelle sicher, dass das Datenbankverzeichnis existiert
|
||||||
|
mkdir -p database
|
||||||
|
chmod 777 database
|
||||||
|
|
||||||
# Docker-Compose Setup neu bauen
|
# Docker-Compose Setup neu bauen
|
||||||
|
echo "Baue Container neu..."
|
||||||
docker-compose build --no-cache
|
docker-compose build --no-cache
|
||||||
|
|
||||||
# Docker-Compose neu starten
|
# Docker-Compose neu starten
|
||||||
|
echo "Starte Container..."
|
||||||
docker-compose up -d --force-recreate
|
docker-compose up -d --force-recreate
|
||||||
|
|
||||||
|
# Warte kurz und prüfe, ob der Container läuft
|
||||||
|
echo "Prüfe Container-Status..."
|
||||||
|
sleep 3
|
||||||
|
docker ps | grep systades_app
|
||||||
|
|
||||||
# Ausgabe
|
# Ausgabe
|
||||||
echo "Systades-Anwendung ist jetzt unter http://localhost:5000 erreichbar."
|
echo "Systades-Anwendung ist jetzt unter http://localhost:5000 erreichbar."
|
||||||
|
echo "Container-Logs können mit 'docker logs -f systades_app' angezeigt werden."
|
||||||
@@ -191,6 +191,17 @@
|
|||||||
showSettingsModal: false,
|
showSettingsModal: false,
|
||||||
|
|
||||||
init() {
|
init() {
|
||||||
|
this.initDarkMode();
|
||||||
|
},
|
||||||
|
|
||||||
|
initDarkMode() {
|
||||||
|
// Lade zuerst den Wert aus dem localStorage (client-seitig)
|
||||||
|
const storedMode = localStorage.getItem('colorMode');
|
||||||
|
if (storedMode) {
|
||||||
|
this.darkMode = storedMode === 'dark';
|
||||||
|
}
|
||||||
|
|
||||||
|
// Dann hole die Server-Einstellung, die Vorrang hat
|
||||||
this.fetchDarkModeFromSession();
|
this.fetchDarkModeFromSession();
|
||||||
},
|
},
|
||||||
|
|
||||||
@@ -200,8 +211,7 @@
|
|||||||
.then(data => {
|
.then(data => {
|
||||||
if (data.success) {
|
if (data.success) {
|
||||||
this.darkMode = data.darkMode === 'true';
|
this.darkMode = data.darkMode === 'true';
|
||||||
document.querySelector('html').classList.toggle('dark', this.darkMode);
|
this.applyDarkMode();
|
||||||
document.querySelector('body').classList.toggle('dark', this.darkMode);
|
|
||||||
}
|
}
|
||||||
})
|
})
|
||||||
.catch(error => {
|
.catch(error => {
|
||||||
@@ -209,10 +219,15 @@
|
|||||||
});
|
});
|
||||||
},
|
},
|
||||||
|
|
||||||
toggleDarkMode() {
|
applyDarkMode() {
|
||||||
this.darkMode = !this.darkMode;
|
|
||||||
document.querySelector('html').classList.toggle('dark', this.darkMode);
|
document.querySelector('html').classList.toggle('dark', this.darkMode);
|
||||||
document.querySelector('body').classList.toggle('dark', this.darkMode);
|
document.querySelector('body').classList.toggle('dark', this.darkMode);
|
||||||
|
localStorage.setItem('colorMode', this.darkMode ? 'dark' : 'light');
|
||||||
|
},
|
||||||
|
|
||||||
|
toggleDarkMode() {
|
||||||
|
this.darkMode = !this.darkMode;
|
||||||
|
this.applyDarkMode();
|
||||||
|
|
||||||
fetch('/api/set_dark_mode', {
|
fetch('/api/set_dark_mode', {
|
||||||
method: 'POST',
|
method: 'POST',
|
||||||
@@ -224,7 +239,6 @@
|
|||||||
.then(response => response.json())
|
.then(response => response.json())
|
||||||
.then(data => {
|
.then(data => {
|
||||||
if (data.success) {
|
if (data.success) {
|
||||||
localStorage.setItem('darkMode', this.darkMode ? 'dark' : 'light');
|
|
||||||
document.dispatchEvent(new CustomEvent('darkModeToggled', {
|
document.dispatchEvent(new CustomEvent('darkModeToggled', {
|
||||||
detail: { isDark: this.darkMode }
|
detail: { isDark: this.darkMode }
|
||||||
}));
|
}));
|
||||||
|
|||||||
Reference in New Issue
Block a user