feat: initial architecture setup with Docker, SQLite persistence and PDF tracking

This commit is contained in:
Silas Brito
2026-07-13 18:58:05 -03:00
commit 27652716d7
10 changed files with 1365 additions and 0 deletions
+84
View File
@@ -0,0 +1,84 @@
import os
import sys
import subprocess
def run_build():
"""
Automates compiling the Streamlit application into a single-file executable using PyInstaller.
Ensures that PyInstaller points to the isolated library dependencies within the .venv environment.
"""
print("==============================================================")
print("NetBackup Log Insights - Portable Compilation (PyInstaller)")
print("==============================================================")
# 1. Resolve workspace paths
base_dir = os.path.dirname(os.path.abspath(__file__))
venv_dir = os.path.join(base_dir, ".venv")
if not os.path.exists(venv_dir):
print(f"Erro: O ambiente virtual '.venv' nao foi encontrado em: {venv_dir}")
print("Certifique-se de ter criado o ambiente virtual (.venv) e instalado as dependencias.")
sys.exit(1)
# Resolve binaries and site-packages locations based on OS
if sys.platform.startswith("win"):
venv_python = os.path.join(venv_dir, "Scripts", "python.exe")
venv_pyinstaller = os.path.join(venv_dir, "Scripts", "pyinstaller.exe")
site_packages = os.path.join(venv_dir, "Lib", "site-packages")
data_sep = ";"
else:
venv_python = os.path.join(venv_dir, "bin", "python")
venv_pyinstaller = os.path.join(venv_dir, "bin", "pyinstaller")
# Find Python version folder
py_ver = f"python{sys.version_info.major}.{sys.version_info.minor}"
site_packages = os.path.join(venv_dir, "lib", py_ver, "site-packages")
data_sep = ":"
if not os.path.exists(venv_pyinstaller):
print(f"Erro: PyInstaller nao foi encontrado no .venv em: {venv_pyinstaller}")
print("Instalando pyinstaller no ambiente virtual...")
subprocess.run([venv_python, "-m", "pip", "install", "pyinstaller"], check=True)
print(f"-> Root: {base_dir}")
# Normalize paths to use double backslashes on Windows for PyInstaller argument safety
site_packages = os.path.abspath(site_packages)
print(f"-> Usando site-packages do .venv: {site_packages}")
print(f"-> Executavel PyInstaller: {venv_pyinstaller}")
# 2. Build the PyInstaller command arguments
# - --onefile: Bundles everything into a single portable executable
# - --paths: Forces PyInstaller to search for modules inside our virtual env
# - --add-data: Bundles app.py, parser.py, and database.py into the root structure
# - --collect-all: Gathers all python submodules, metadata, and static assets for streamlit, pandas, and plotly
cmd = [
venv_pyinstaller,
"--onefile",
"--name=NetBackup_Log_Insights",
"--paths", site_packages,
"--add-data", f"app.py{data_sep}.",
"--add-data", f"parser.py{data_sep}.",
"--add-data", f"database.py{data_sep}.",
"--collect-all", "streamlit",
"--collect-all", "pandas",
"--collect-all", "plotly",
"app.py"
]
print(f"\nComando executado:\n{' '.join(cmd)}\n")
try:
# Run PyInstaller compilation process
result = subprocess.run(cmd, check=True, cwd=base_dir)
if result.returncode == 0:
print("\n==============================================================")
print("SUCESSO: Executavel portable compilado com sucesso!")
exe_ext = ".exe" if sys.platform.startswith("win") else ""
output_path = os.path.join(base_dir, "dist", f"NetBackup_Log_Insights{exe_ext}")
print(f"Caminho do arquivo gerado: {output_path}")
print("==============================================================")
except subprocess.CalledProcessError as e:
print(f"\nErro ocorrido durante a compilacao via PyInstaller: {e}")
sys.exit(1)
if __name__ == "__main__":
run_build()