translations of setup.sh
This commit is contained in:
parent
2ea3a8059c
commit
c886d5f28e
52
setup.sh
52
setup.sh
|
@ -75,12 +75,12 @@ else
|
||||||
fi
|
fi
|
||||||
|
|
||||||
|
|
||||||
# Konfiguration
|
# Configuration
|
||||||
PROJECT_DIR="steam-gift-manager"
|
PROJECT_DIR="steam-gift-manager"
|
||||||
TRANSLATIONS_DIR="../translations"
|
TRANSLATIONS_DIR="../translations"
|
||||||
DATA_DIR="../data"
|
DATA_DIR="../data"
|
||||||
|
|
||||||
# 1. Projektordner & Übersetzungsordner erstellen
|
# 1. Create project folder & translations folder
|
||||||
mkdir -p "$PROJECT_DIR"/{templates,static}
|
mkdir -p "$PROJECT_DIR"/{templates,static}
|
||||||
mkdir -p "$TRANSLATIONS_DIR"/de/LC_MESSAGES
|
mkdir -p "$TRANSLATIONS_DIR"/de/LC_MESSAGES
|
||||||
mkdir -p "$TRANSLATIONS_DIR"/en/LC_MESSAGES
|
mkdir -p "$TRANSLATIONS_DIR"/en/LC_MESSAGES
|
||||||
|
@ -111,7 +111,7 @@ pillow
|
||||||
gunicorn
|
gunicorn
|
||||||
EOL
|
EOL
|
||||||
|
|
||||||
# 3. .env-Datei im übergeordneten Verzeichnis erstellen
|
# 3. Create .env file in parent directory
|
||||||
cd ..
|
cd ..
|
||||||
SECRET_KEY=$(python3 -c 'import secrets; print(secrets.token_hex(24))')
|
SECRET_KEY=$(python3 -c 'import secrets; print(secrets.token_hex(24))')
|
||||||
REDEEM_SECRET=$(python3 -c 'import secrets; print(secrets.token_hex(16))')
|
REDEEM_SECRET=$(python3 -c 'import secrets; print(secrets.token_hex(16))')
|
||||||
|
@ -154,10 +154,10 @@ MATRIX_ACCESS_TOKEN=""
|
||||||
MATRIX_ROOM_ID=""
|
MATRIX_ROOM_ID=""
|
||||||
EOL
|
EOL
|
||||||
|
|
||||||
# Zurück ins Projektverzeichnis
|
# Back to project directory
|
||||||
cd $PROJECT_DIR
|
cd $PROJECT_DIR
|
||||||
|
|
||||||
# 4. app.py (vollständige korrigierte Version)
|
# 4. app.py (the main app)
|
||||||
cat <<'PYTHON_END' > app.py
|
cat <<'PYTHON_END' > app.py
|
||||||
import os
|
import os
|
||||||
import logging
|
import logging
|
||||||
|
@ -220,7 +220,7 @@ load_dotenv(override=True)
|
||||||
# Lade Umgebungsvariablen aus .env mit override
|
# Lade Umgebungsvariablen aus .env mit override
|
||||||
load_dotenv(override=True)
|
load_dotenv(override=True)
|
||||||
|
|
||||||
# Konfiguration
|
# App-Configuration
|
||||||
app.config.update(
|
app.config.update(
|
||||||
SECRET_KEY=os.getenv('SECRET_KEY'),
|
SECRET_KEY=os.getenv('SECRET_KEY'),
|
||||||
SQLALCHEMY_DATABASE_URI=('sqlite:////app/data/games.db'),
|
SQLALCHEMY_DATABASE_URI=('sqlite:////app/data/games.db'),
|
||||||
|
@ -235,7 +235,7 @@ app.config.update(
|
||||||
|
|
||||||
interval_hours = int(os.getenv('CHECK_EXPIRING_KEYS_INTERVAL_HOURS', 12))
|
interval_hours = int(os.getenv('CHECK_EXPIRING_KEYS_INTERVAL_HOURS', 12))
|
||||||
|
|
||||||
# Initialisierung
|
# Initialisation
|
||||||
db = SQLAlchemy(app, metadata=metadata)
|
db = SQLAlchemy(app, metadata=metadata)
|
||||||
migrate = Migrate(app, db)
|
migrate = Migrate(app, db)
|
||||||
login_manager = LoginManager(app)
|
login_manager = LoginManager(app)
|
||||||
|
@ -259,7 +259,7 @@ def inject_template_vars():
|
||||||
theme='dark' if request.cookies.get('dark_mode') == 'true' else 'light'
|
theme='dark' if request.cookies.get('dark_mode') == 'true' else 'light'
|
||||||
)
|
)
|
||||||
|
|
||||||
# Datenbankmodelle
|
# DB Models
|
||||||
class User(db.Model, UserMixin):
|
class User(db.Model, UserMixin):
|
||||||
__tablename__ = 'users'
|
__tablename__ = 'users'
|
||||||
id = db.Column(db.Integer, primary_key=True)
|
id = db.Column(db.Integer, primary_key=True)
|
||||||
|
@ -590,7 +590,7 @@ def export_pdf():
|
||||||
game.redeem_date.strftime('%d.%m.%y') if game.redeem_date else ''
|
game.redeem_date.strftime('%d.%m.%y') if game.redeem_date else ''
|
||||||
])
|
])
|
||||||
|
|
||||||
# Tabelle formatieren
|
# Table format
|
||||||
table = Table(data, colWidths=col_widths, repeatRows=1)
|
table = Table(data, colWidths=col_widths, repeatRows=1)
|
||||||
table.setStyle(TableStyle([
|
table.setStyle(TableStyle([
|
||||||
('FONTNAME', (0,0), (-1,0), 'Helvetica-Bold'),
|
('FONTNAME', (0,0), (-1,0), 'Helvetica-Bold'),
|
||||||
|
@ -814,7 +814,7 @@ def check_expiring_keys():
|
||||||
send_notification(user, game)
|
send_notification(user, game)
|
||||||
|
|
||||||
|
|
||||||
# Optional: Cleanup-Funktion für regelmäßiges Löschen abgelaufener Tokens
|
# Optional: cleaning up old tokens
|
||||||
def cleanup_expired_tokens():
|
def cleanup_expired_tokens():
|
||||||
now = datetime.utcnow()
|
now = datetime.utcnow()
|
||||||
expired = RedeemToken.query.filter(RedeemToken.expires < now).all()
|
expired = RedeemToken.query.filter(RedeemToken.expires < now).all()
|
||||||
|
@ -823,13 +823,13 @@ def cleanup_expired_tokens():
|
||||||
db.session.commit()
|
db.session.commit()
|
||||||
|
|
||||||
|
|
||||||
# Scheduler initialisieren und starten
|
# Scheduler start
|
||||||
scheduler = BackgroundScheduler()
|
scheduler = BackgroundScheduler()
|
||||||
scheduler.add_job(func=check_expiring_keys, trigger="interval", hours=interval_hours)
|
scheduler.add_job(func=check_expiring_keys, trigger="interval", hours=interval_hours)
|
||||||
scheduler.add_job(func=cleanup_expired_tokens, trigger="interval", hours=1)
|
scheduler.add_job(func=cleanup_expired_tokens, trigger="interval", hours=1)
|
||||||
scheduler.start()
|
scheduler.start()
|
||||||
|
|
||||||
# Shutdown des Schedulers bei Beendigung der App
|
# Shutdown of the Schedulers when stopping the app
|
||||||
atexit.register(lambda: scheduler.shutdown())
|
atexit.register(lambda: scheduler.shutdown())
|
||||||
|
|
||||||
if __name__ == '__main__':
|
if __name__ == '__main__':
|
||||||
|
@ -839,7 +839,7 @@ if __name__ == '__main__':
|
||||||
|
|
||||||
PYTHON_END
|
PYTHON_END
|
||||||
|
|
||||||
# Babel Konfiguration erstellen
|
# Create Babel configuration
|
||||||
cat <<EOL > babel.cfg
|
cat <<EOL > babel.cfg
|
||||||
[python: **.py]
|
[python: **.py]
|
||||||
[jinja2: **/templates/**.html]
|
[jinja2: **/templates/**.html]
|
||||||
|
@ -903,11 +903,11 @@ services:
|
||||||
restart: unless-stopped
|
restart: unless-stopped
|
||||||
COMPOSE_END
|
COMPOSE_END
|
||||||
|
|
||||||
# 7. Verzeichnisse und Berechtigungen
|
# 7. Directories and permissions
|
||||||
mkdir -p ../data ../translations
|
mkdir -p ../data ../translations
|
||||||
chmod -R a+rwX ../data ../translations
|
chmod -R a+rwX ../data ../translations
|
||||||
|
|
||||||
# 8. Übersetzungs- und Upgrade-Scripte
|
# 8. Translation and upgrade scripts
|
||||||
cat <<'SCRIPT_END' > ../translate.sh
|
cat <<'SCRIPT_END' > ../translate.sh
|
||||||
#!/bin/bash
|
#!/bin/bash
|
||||||
set -e
|
set -e
|
||||||
|
@ -919,10 +919,10 @@ declare -A locales=(
|
||||||
["en"]="en"
|
["en"]="en"
|
||||||
)
|
)
|
||||||
|
|
||||||
# POT-Datei erstellen
|
# create POT-file
|
||||||
docker-compose exec steam-manager pybabel extract -F babel.cfg -o translations/messages.pot .
|
docker-compose exec steam-manager pybabel extract -F babel.cfg -o translations/messages.pot .
|
||||||
|
|
||||||
# Für jede Sprache prüfen und ggf. initialisieren
|
# Check for each language and initialize if necessary
|
||||||
for lang in "${!locales[@]}"; do
|
for lang in "${!locales[@]}"; do
|
||||||
if [ ! -f "translations/${locales[$lang]}/LC_MESSAGES/messages.po" ]; then
|
if [ ! -f "translations/${locales[$lang]}/LC_MESSAGES/messages.po" ]; then
|
||||||
docker-compose exec steam-manager pybabel init \
|
docker-compose exec steam-manager pybabel init \
|
||||||
|
@ -932,11 +932,11 @@ for lang in "${!locales[@]}"; do
|
||||||
fi
|
fi
|
||||||
done
|
done
|
||||||
|
|
||||||
# Übersetzungen aktualisieren und kompilieren
|
# Update and compile translations
|
||||||
docker-compose exec steam-manager pybabel update -i translations/messages.pot -d translations
|
docker-compose exec steam-manager pybabel update -i translations/messages.pot -d translations
|
||||||
docker-compose exec steam-manager pybabel compile -d translations
|
docker-compose exec steam-manager pybabel compile -d translations
|
||||||
|
|
||||||
echo "✅ Übersetzungen aktualisiert!"
|
echo "✅ Translations updated!"
|
||||||
SCRIPT_END
|
SCRIPT_END
|
||||||
chmod +x ../translate.sh
|
chmod +x ../translate.sh
|
||||||
|
|
||||||
|
@ -944,25 +944,25 @@ cat <<'SCRIPT_END' > ../upgrade.sh
|
||||||
#!/bin/bash
|
#!/bin/bash
|
||||||
set -e
|
set -e
|
||||||
|
|
||||||
# Setze das Arbeitsverzeichnis auf das Projektverzeichnis
|
# Set the working directory to the project directory
|
||||||
cd "$(dirname "$0")/steam-gift-manager"
|
cd "$(dirname "$0")/steam-gift-manager"
|
||||||
|
|
||||||
# Setze FLASK_APP, falls nötig
|
# Setze FLASK_APP, falls nötig
|
||||||
export FLASK_APP=app.py
|
export FLASK_APP=app.py
|
||||||
|
|
||||||
# Initialisiere migrations, falls noch nicht vorhanden
|
# Initialize migrations, if not yet available
|
||||||
if [ ! -d migrations ]; then
|
if [ ! -d migrations ]; then
|
||||||
echo "Starting Flask-Migrate..."
|
echo "Starting Flask-Migrate..."
|
||||||
docker-compose exec steam-manager flask db init
|
docker-compose exec steam-manager flask db init
|
||||||
fi
|
fi
|
||||||
|
|
||||||
# Erzeuge Migration (nur wenn sich Modelle geändert haben)
|
# Create migration (only if models have changed)
|
||||||
docker-compose exec steam-manager flask db migrate -m "Automatic Migration"
|
docker-compose exec steam-manager flask db migrate -m "Automatic Migration"
|
||||||
|
|
||||||
# Wende Migration an
|
# Apply migration
|
||||||
docker-compose exec steam-manager flask db upgrade
|
docker-compose exec steam-manager flask db upgrade
|
||||||
|
|
||||||
echo "✅ Database-Migration abgeschlossen!"
|
echo "✅ Database migration completed!"
|
||||||
SCRIPT_END
|
SCRIPT_END
|
||||||
chmod +x ../upgrade.sh
|
chmod +x ../upgrade.sh
|
||||||
|
|
||||||
|
@ -1482,7 +1482,7 @@ function updateCountdown() {
|
||||||
updateProgressBar(percent);
|
updateProgressBar(percent);
|
||||||
}
|
}
|
||||||
|
|
||||||
// Initialisierung
|
// run countdown
|
||||||
updateCountdown();
|
updateCountdown();
|
||||||
const timer = setInterval(updateCountdown, 1000);
|
const timer = setInterval(updateCountdown, 1000);
|
||||||
</script>
|
</script>
|
||||||
|
@ -1558,7 +1558,7 @@ body {
|
||||||
color: #ff6b6b;
|
color: #ff6b6b;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Progressbar-Animationen */
|
/* Progressbar-Animations */
|
||||||
#expiry-bar {
|
#expiry-bar {
|
||||||
transition: width 1s linear, background-color 0.5s ease;
|
transition: width 1s linear, background-color 0.5s ease;
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue