This commit is contained in:
sergey 2025-06-17 23:38:21 +03:00
parent 2a7ce05feb
commit 0a0af01000
8 changed files with 75 additions and 22 deletions

30
.dockerignore Normal file
View File

@ -0,0 +1,30 @@
*.pyc
.vscode/
.venv/
*.log
.idea/
*.idea
.git/
.dockerignore
.gitignore
README.md
tests/
docker/
__pycache__/
app/__pycache__/
app/config/
!app/config/config-template.ini
app/backups/
!app/backups/.keep
app/logs/
!/app/logs/.keep

8
.gitignore vendored
View File

@ -6,7 +6,7 @@ __pycache__
*.log *.log
.idea/ .idea/
*.idea *.idea
/app/config/config.ini app/config/config.ini
/app/config/dev_list.txt app/config/dev_list.txt
/app/backusp/ app/backusp/
!/app/backusp/.keep !app/backups/.gitignore

View File

@ -3,7 +3,15 @@
Раз в сутки, в указанное время, подключается к сетевым устройствам. Раз в сутки, в указанное время, подключается к сетевым устройствам.
Отправляет коммит в удалённый репозиторий. Отправляет коммит в удалённый репозиторий.
Python 3.13
Используются библиотеки: Используются библиотеки:
- "gitpython>=3.1.44" - для работы с гитом - "gitpython>=3.1.44" - для работы с гитом
- "netmiko>=4.5.0" - для подключения к сетевым устройствам - "netmiko>=4.5.0" - для подключения к сетевым устройствам
- "schedule>=1.2.2" - для периодического выполнения backup - "schedule>=1.2.2" - для периодического выполнения backup
Для запуска.
Переменные окружения (см. app/config/.env-template)
app/config/config.ini
Пример конфиг файла см. app/config/config-template.ini

View File

@ -6,9 +6,7 @@ import os
def default_logging(main_logging: logging) -> None: def default_logging(main_logging: logging) -> None:
log_dir: str = os.path.join( log_dir: str = os.path.join(os.path.abspath(os.path.dirname(__file__)), "logs")
os.path.dirname(os.path.abspath(os.path.dirname(__file__))), "logs"
)
main_logging.basicConfig( main_logging.basicConfig(
level=20, level=20,
datefmt="%Y-%m-%d %H:%M:%S", datefmt="%Y-%m-%d %H:%M:%S",
@ -29,9 +27,7 @@ default_logging(logging)
def configure_loging(main_logging: logging) -> None: def configure_loging(main_logging: logging) -> None:
log_dir: str = os.path.join( log_dir: str = os.path.join(os.path.abspath(os.path.dirname(__file__)), "logs")
os.path.dirname(os.path.abspath(os.path.dirname(__file__))), "logs"
)
logging.info("configure logging") logging.info("configure logging")
main_logging.basicConfig( main_logging.basicConfig(
level=cfg.log.console_lvl, level=cfg.log.console_lvl,
@ -46,7 +42,7 @@ def configure_loging(main_logging: logging) -> None:
def load_config() -> configparser.ConfigParser: def load_config() -> configparser.ConfigParser:
cfg_dir: str = os.path.abspath(os.path.dirname(__file__)) cfg_dir: str = os.path.join(os.path.abspath(os.path.dirname(__file__)), "config")
logging.info("loading config") logging.info("loading config")
loaded_config: configparser.ConfigParser = configparser.ConfigParser( loaded_config: configparser.ConfigParser = configparser.ConfigParser(
@ -79,9 +75,7 @@ class ConfigTelegram:
@dataclass @dataclass
class ConfigBcp: class ConfigBcp:
dir: str = os.path.join( dir: str = os.path.join(os.path.abspath(os.path.dirname(__file__)), "backups")
os.path.dirname(os.path.abspath(os.path.dirname(__file__))), "backups"
)
file: str = config["bcp"].get("file") file: str = config["bcp"].get("file")
pattern: str = config["bcp"].get("pattern") pattern: str = config["bcp"].get("pattern")
start_at: str = config["bcp"].get("start_at") start_at: str = config["bcp"].get("start_at")

View File

@ -1,5 +0,0 @@
from .config import cfg
__all__ = [
"cfg",
]

View File

@ -1,5 +1,4 @@
import os from git import Repo, InvalidGitRepositoryError, Git
from git import Repo, InvalidGitRepositoryError, RemoteProgress, GitCommandError
from config import cfg from config import cfg
import logging as log import logging as log
@ -32,6 +31,7 @@ def check_remote_repo(repo: Repo):
def check_bcp_repo(path: str = cfg.bcp.dir) -> None: def check_bcp_repo(path: str = cfg.bcp.dir) -> None:
Git().config("--global", "--add", "safe.directory", path)
log.info("check local repo %r", path) log.info("check local repo %r", path)
try: try:
repo = Repo(path) repo = Repo(path)
@ -40,6 +40,7 @@ def check_bcp_repo(path: str = cfg.bcp.dir) -> None:
check_remote_repo(repo) check_remote_repo(repo)
except InvalidGitRepositoryError: except InvalidGitRepositoryError:
repo = Repo.init(path=path, initial_branch=cfg.git.branch) repo = Repo.init(path=path, initial_branch=cfg.git.branch)
log.info("init repo in %r", path) log.info("init repo in %r", path)
with repo.config_writer() as config: with repo.config_writer() as config:

View File

@ -0,0 +1,8 @@
FROM python:3.13-slim
RUN apt-get update && apt-get install -y --no-install-recommends git && rm -rf /var/lib/apt/lists/*
ADD . .
RUN pip install --upgrade pip
RUN pip install uv
RUN uv sync --no-dev
WORKDIR /app
CMD ["uv", "run", "main.py"]

View File

@ -0,0 +1,17 @@
version: '3.3'
services:
net-backup:
image: git.sm8255082.ru/osnova/net-backup:1.0.0
restart: always
volumes:
- ./logs:/app/logs
- ./config:/app/config
- ./backups:/app/backups
environment:
- NET_DEV_USER=admin
- NET_DEV_DOMAIN=local
- NET_DEV_PWD=password
- GIT_USERNAME=git_user
- GIT_TOKEN=bla-bla-lba