commit 92a9cfac0c2d62482e664fea16820aeb7b49e934 Author: João Pedro Toledo Goncalves Date: Mon Sep 15 14:14:13 2025 +0000 Criado o Instalador do sistema (Instal-Proxy-Sinc.sh) diff --git a/Instal-Proxy-Sinc.sh b/Instal-Proxy-Sinc.sh new file mode 100644 index 0000000..cbcaefa --- /dev/null +++ b/Instal-Proxy-Sinc.sh @@ -0,0 +1,191 @@ +#!/bin/bash + +# ============================================================================== +# INSTALADOR DO SERVIÇO PROXY-SINC +# +# Autor: A sua IA Assistente & Equipa de Infraestrutura iT Guys +# Descrição: Este script instala e configura o serviço de versionamento +# automático para as configurações do Nginx e Fail2ban. +# ============================================================================== + +set -e + +REPO_DIR="/opt/config_repo" +SCRIPT_INSTALL_DIR="/usr/local/sbin" +SYSTEMD_DIR="/etc/systemd/system" +MAN_DIR="/usr/share/man/man8" + +# --- Funções de Ajuda --- +info() { echo -e "\e[32m[INFO]\e[0m $1"; } +error() { echo -e "\e[31m[ERRO]\e[0m $1" >&2; exit 1; } +warn() { echo -e "\e[33m[AVISO]\e[0m $1"; } + +# --- Início da Execução --- +info "Iniciando a instalação do serviço Proxy-Sinc..." + +if [ "$EUID" -ne 0 ]; then + error "Este script precisa de ser executado como root." +fi + +# --- 1. Verificação de Dependências --- +info "A verificar as dependências (git, rsync)..." +apt-get update > /dev/null +apt-get install -y git rsync > /dev/null +info "Dependências satisfeitas." + +# --- 2. Clonar o Repositório --- +if [ -d "$REPO_DIR" ]; then + warn "O diretório do repositório $REPO_DIR já existe. A saltar o clone." +else + read -p "Por favor, insira a URL SSH do seu repositório Gitea (ex: git@git.itguys.com.br:user/repo.git): " GIT_URL + if [ -z "$GIT_URL" ]; then + error "A URL do repositório não pode estar vazia." + fi + info "A clonar o repositório para $REPO_DIR..." + git clone "$GIT_URL" "$REPO_DIR" +fi + +# --- 3. Instalar os Ficheiros do Serviço --- +info "A instalar os ficheiros do serviço..." +cat > ./commit_configs.sh << 'EOF' +#!/bin/bash +set -e +REPO_PATH="/opt/config_repo" +NGINX_SOURCE="/etc/nginx" +FAIL2BAN_SOURCE="/etc/fail2ban" +AUTOMATION_FILES_SOURCE=("/usr/local/sbin/commit_configs.sh" "/etc/systemd/system/proxy-sinc.service" "/etc/systemd/system/proxy-sinc.timer" "/usr/share/man/man8/proxy-sinc.8.gz") +AUTOMATION_FILES_DEST="$REPO_PATH/_automation_scripts/" +echo "--- Iniciando a verificação de sincronização de configurações [$(date)] ---" +if [ "$EUID" -ne 0 ]; then echo "ERRO CRÍTICO: O script deve ser executado como root." >&2; exit 1; fi +if [ ! -d "$REPO_PATH" ]; then echo "ERRO CRÍTICO: O diretório do repositório $REPO_PATH não foi encontrado." >&2; exit 1; fi +echo "[INFO] Sincronizando ficheiros de configuração..." +rsync -avz --delete --exclude='*.swp' --exclude='*.bak' --exclude='sites-enabled/' --exclude='modules-enabled/' --exclude='/var/log/' --exclude='/var/run/' --exclude='/var/cache/' "$NGINX_SOURCE/" "$REPO_PATH/nginx/" +rsync -avz --delete --exclude='*.swp' --exclude='*.bak' --exclude='/var/log/' --exclude='/var/run/' "$FAIL2BAN_SOURCE/" "$REPO_PATH/fail2ban/" +echo "[INFO] Sincronizando ficheiros de automação..." +mkdir -p "$AUTOMATION_FILES_DEST" +for file in "${AUTOMATION_FILES_SOURCE[@]}"; do + if [ -f "$file" ]; then + rsync -a "$file" "$AUTOMATION_FILES_DEST" + fi +done +echo "[INFO] Sincronização de ficheiros concluída." +cd "$REPO_PATH" +echo "[INFO] A verificar o status do repositório Git..." +if [ -n "$(git status --porcelain)" ]; then + echo "[INFO] Alterações detetadas. A preparar o commit." + echo "[INFO] A puxar alterações do repositório remoto para evitar conflitos..." + git pull --ff-only + echo "[INFO] A adicionar alterações ao stage..." + git add . + COMMIT_MESSAGE="[Auto-Sync] Atualização das configurações - $(date +'%Y-%m-%d %H:%M:%S')" + echo "[INFO] A fazer o commit com a mensagem: $COMMIT_MESSAGE" + git commit -m "$COMMIT_MESSAGE" + echo "[INFO] A enviar as alterações para o Gitea (git push)..." + git push origin main + echo "[SUCESSO] As alterações foram enviadas para o repositório remoto!" +else + echo "[INFO] Nenhuma alteração de configuração detetada. O repositório está atualizado." +fi +echo "--- Verificação de sincronização concluída com sucesso [$(date)] ---" +exit 0 +EOF + +cat > ./proxy-sinc.service << 'EOF' +[Unit] +Description=Serviço de Sincronização de Configurações do Nginx para o Git +After=network.target + +[Service] +Type=oneshot +ExecStart=/usr/local/sbin/commit_configs.sh +EOF + +cat > ./proxy-sinc.timer << 'EOF' +[Unit] +Description=Executa o serviço de sincronização de configurações a cada minuto + +[Timer] +OnBootSec=1min +OnUnitActiveSec=1min +Unit=proxy-sinc.service + +[Install] +WantedBy=timers.target +EOF + +cat > ./proxy-sinc.8 << 'EOF' +.TH PROXY-SINC 8 "Setembro 2025" "iT Guys - Equipa de Infraestrutura" "Ferramentas de Sistema" +.SH NAME +proxy-sinc \- Serviço de versionamento automático de configurações de servidor +.SH SYNOPSIS +Este serviço é gerido pelo systemd e não se destina a ser executado manualmente. +.br +Para verificar o status: \fBsystemctl status proxy-sinc.timer\fR +.br +Para ver os logs: \fBjournalctl -u proxy-sinc.service\fR +.SH DESCRIPTION +.B proxy-sinc +é um serviço de sistema que automatiza o controlo de versões de ficheiros de configuração críticos. A cada minuto, ele executa um script que sincroniza os diretórios de configuração do Nginx e do Fail2ban para um repositório Git local. Se forem detetadas alterações, ele cria um commit com um timestamp e envia as alterações para um repositório Git remoto (Gitea). +.PP +Esta abordagem garante um histórico completo de todas as alterações, facilita a recuperação de desastres e serve como um backup centralizado. O script é desenhado para ser eficiente, usando \fBrsync(1)\fR para apenas transferir ficheiros alterados. +.SH CONFIGURAÇÃO +Os ficheiros principais deste serviço estão localizados nos seguintes caminhos: +.TP +\fB/usr/local/sbin/commit_configs.sh\fR +O script principal que executa a lógica de sincronização e commit. +.TP +\fB/etc/systemd/system/proxy-sinc.service\fR +O ficheiro de unidade do systemd que define como executar o script. +.TP +\fB/etc/systemd/system/proxy-sinc.timer\fR +O ficheiro de timer do systemd que define a frequência de execução (a cada minuto). +.TP +\fB/opt/config_repo\fR +O diretório local onde o repositório Git é clonado e as configurações são preparadas antes do commit. +.SH LOGGING +Toda a saída do script (tanto a standard como a de erro) é automaticamente capturada pelo \fBjournald(1)\fR. Para ver os logs em tempo real, use: +.sp +\fIjournalctl -u proxy-sinc.service -f\fR +.SH SEGURANÇA +O script usa \fBrsync(1)\fR para copiar as configurações para uma área de "staging" antes do commit. Isto é uma prática de segurança deliberada para evitar os perigos de usar um diretório de configuração do sistema (ex: /etc/nginx) diretamente como um repositório Git. Um comando \fBgit checkout\fR acidental poderia alterar a configuração em produção instantaneamente, causando paragens de serviço. +.SH SEE ALSO +.BR git (1), +.BR rsync (1), +.BR systemd.service (5), +.BR systemd.timer (5), +.BR crontab (5) +EOF + +# Mover ficheiros para os locais corretos +mv ./commit_configs.sh "$SCRIPT_INSTALL_DIR/" +chmod +x "$SCRIPT_INSTALL_DIR/commit_configs.sh" +mv ./proxy-sinc.service "$SYSTEMD_DIR/" +mv ./proxy-sinc.timer "$SYSTEMD_DIR/" + +# Instalar a man page +mkdir -p "$MAN_DIR" +mv ./proxy-sinc.8 "$MAN_DIR/" +gzip -f "$MAN_DIR/proxy-sinc.8" + +info "Ficheiros instalados com sucesso." + +# --- 4. Ativar o Serviço --- +info "A recarregar o systemd e a ativar o timer..." +systemctl daemon-reload +systemctl enable --now proxy-sinc.timer +info "Serviço ativado e a correr!" + +# --- Conclusão --- +echo "" +info "======================================================================" +info " Instalação Concluída!" +info "======================================================================" +info "O serviço 'proxy-sinc' está agora ativo e irá sincronizar as suas" +info "configurações para o Gitea a cada minuto." +info "" +info "Comandos úteis:" +info " Ver o status do timer: systemctl status proxy-sinc.timer" +info " Ver os logs da última execução: systemctl status proxy-sinc.service" +info " Ver o histórico de logs: journalctl -u proxy-sinc.service" +info " Ler o manual de ajuda: man proxy-sinc" +info ""