zmiana obslugi haseł, docker/podman

This commit is contained in:
Mateusz Gruszczyński 2025-02-26 08:10:56 +01:00
parent e4b33cb0d3
commit 1d41d303f3
5 changed files with 147 additions and 16 deletions

11
Dockerfile Normal file
View File

@ -0,0 +1,11 @@
FROM python:3.13-slim
WORKDIR /app
COPY requirements.txt .
RUN pip install --upgrade pip
RUN pip install --no-cache-dir -r requirements.txt
COPY . .
CMD ["python", "run_waitress.py"]

106
README.md
View File

@ -1,21 +1,101 @@
# RouterOS Backup Manager
# RouterOS backup system RouterOS Backup Manager to aplikacja Flask umożliwiająca zarządzanie kopiami zapasowymi urządzeń Mikrotik RouterOS. Aplikacja pozwala na eksport konfiguracji, tworzenie backupów binarnych, ich przechowywanie, porównywanie oraz przywracanie.
# Instalation: ## 🔧 Instalacja
- clone (to ex. /opt/routeros_backup)
- create venv
- install requirements via pip
- copy systemd service (routeros_backup.service)
# Start ### 1. Klonowanie repozytorium
- systemctl start routeros_backup.service ```sh
- go to http://IPADDRESS:5581 git clone https://github.com/twoje-repo/routeros_backup.git
cd routeros_backup
```
# Register, Login ### 2. Tworzenie i aktywacja środowiska wirtualnego (opcjonalnie)
```sh
python3 -m venv venv
source venv/bin/activate # Linux/macOS
venv\Scripts\activate # Windows
```
# Configure devices, keys, backups, crons ### 3. Instalacja zależności
```sh
pip install -r requirements.txt
```
### 4. Uruchomienie aplikacji lokalnie
```sh
python run_waitress.py
```
Aplikacja będzie dostępna pod adresem: `http://127.0.0.1:5581/`
## Authors ---
- [@linuxiarz.pl] ## 📦 Uruchamianie w Dockerze
1. **Zbudowanie obrazu Docker**
```sh
docker-compose build
```
2. **Uruchomienie kontenera**
```sh
docker-compose up -d
```
Aplikacja uruchomi się na porcie `5581`.
---
## 📚 Funkcjonalności
- 🔐 System użytkowników (rejestracja, logowanie, zmiana hasła)
- 📡 Połączenie SSH do routerów MikroTik
- 🛠 Eksport konfiguracji i tworzenie backupów binarnych
- 🕵️‍♂️ Porównywanie backupów (`diff`)
- 📩 Powiadomienia e-mail oraz Pushover
- 📅 Harmonogram automatycznych backupów (APScheduler)
- 🧹 Automatyczne czyszczenie starych backupów i logów
- 🚀 Obsługa przez interfejs webowy
---
## ⚙️ Konfiguracja
### Zmiana ustawień
Plik `app.py` zawiera konfigurację bazy danych oraz inne ustawienia aplikacji:
```python
app.config['SECRET_KEY'] = 'super-secret-key'
app.config['SQLALCHEMY_DATABASE_URI'] = 'sqlite:///backup_routeros.db'
```
### 📬 Konfiguracja SMTP (E-mail)
Aby skonfigurować powiadomienia e-mail, wprowadź dane w sekcji ustawień:
- Serwer SMTP
- Login/hasło SMTP
- Port (587 dla TLS, 465 dla SSL)
### 📲 Powiadomienia Pushover
Aby włączyć powiadomienia Pushover, uzupełnij `pushover_token` oraz `pushover_userkey` w ustawieniach.
---
## 🔍 API & Health Check
Aplikacja zawiera endpoint `/health`, który zwraca status bazy danych:
```sh
curl http://127.0.0.1:5581/health
```
Przykładowa odpowiedź:
```json
{
"status": "ok",
"timestamp": "2024-02-26T12:34:56Z"
}
```
---
## 🚀 Autor i licencja
Projekt stworzony przez Mateusz Grusczyńśki @linuxiarz.pl - dostępny na licencji MIT.

10
app.py
View File

@ -27,7 +27,7 @@ from flask import (
url_for, session, flash, send_file url_for, session, flash, send_file
) )
from flask_sqlalchemy import SQLAlchemy from flask_sqlalchemy import SQLAlchemy
from passlib.hash import bcrypt from passlib.context import CryptContext
#from flask_wtf.csrf import CSRFProtect #from flask_wtf.csrf import CSRFProtect
from apscheduler.schedulers.background import BackgroundScheduler from apscheduler.schedulers.background import BackgroundScheduler
@ -56,14 +56,18 @@ os.makedirs(DATA_DIR, exist_ok=True)
############################################################################### ###############################################################################
# Modele bazy danych # Modele bazy danych
############################################################################### ###############################################################################
pwd_context = CryptContext(schemes=["bcrypt"], deprecated="auto")
class User(db.Model): class User(db.Model):
__tablename__ = 'users' __tablename__ = 'users'
id = db.Column(db.Integer, primary_key=True) id = db.Column(db.Integer, primary_key=True)
username = db.Column(db.String(120), unique=True, nullable=False) username = db.Column(db.String(120), unique=True, nullable=False)
password_hash = db.Column(db.String(255), nullable=False) password_hash = db.Column(db.String(255), nullable=False)
def set_password(self, password):
self.password_hash = pwd_context.hash(password)
def check_password(self, password): def check_password(self, password):
return bcrypt.verify(password, self.password_hash) return pwd_context.verify(password, self.password_hash)
class Router(db.Model): class Router(db.Model):
__tablename__ = 'routers' __tablename__ = 'routers'
@ -1345,7 +1349,7 @@ def change_password():
flash("Nowe hasło i potwierdzenie nie są zgodne.") flash("Nowe hasło i potwierdzenie nie są zgodne.")
return redirect(url_for('change_password')) return redirect(url_for('change_password'))
user.password_hash = bcrypt.hash(new_password) user.password_hash = pwd_context.hash(new_password)
db.session.commit() db.session.commit()
flash("Hasło zostało zmienione pomyślnie.") flash("Hasło zostało zmienione pomyślnie.")
return redirect(url_for('dashboard')) return redirect(url_for('dashboard'))

15
docker-compose.yml Normal file
View File

@ -0,0 +1,15 @@
version: '3.8'
services:
app:
build:
context: .
dockerfile: Dockerfile
container_name: routeros_backup
ports:
- "5581:5581"
environment:
- FLASK_ENV=production
restart: unless-stopped
volumes:
- ./data:/data

21
start.sh Executable file
View File

@ -0,0 +1,21 @@
#!/bin/bash
# Sprawdzenie, czy podman jest dostępny
if command -v podman &> /dev/null; then
COMPOSE_CMD="podman-compose"
echo "🟢 Wykryto Podman, używam podman-compose..."
else
COMPOSE_CMD="docker-compose"
echo "🔵 Podman nie znaleziony, używam docker-compose..."
fi
# Zatrzymanie i usunięcie kontenerów
$COMPOSE_CMD down
# Odbudowa obrazu
$COMPOSE_CMD build
# Uruchomienie w tle
$COMPOSE_CMD up -d
echo "✅ Aplikacja uruchomiona!"