zmiana obslugi haseł, docker/podman
This commit is contained in:
parent
e4b33cb0d3
commit
1d41d303f3
11
Dockerfile
Normal file
11
Dockerfile
Normal 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
106
README.md
@ -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
10
app.py
@ -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
15
docker-compose.yml
Normal 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
21
start.sh
Executable 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!"
|
Loading…
x
Reference in New Issue
Block a user