#!/bin/bash # ============================================================================== # INSTALADOR DO SERVIÇO PROXY-SINC (VERSÃO AVANÇADA) # # Autor: A sua IA Assistente & Equipa de Infraestrutura iT Guys # Descrição: Instala e configura o serviço de versionamento automático, com # autenticação por Token, gestão de SSL e identidade de commit automática. # ============================================================================== set -e # --- Variáveis de Configuração --- 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. Configuração das Credenciais e do Repositório --- info "Configurando a autenticação para o Gitea..." # Pede as informações ao utilizador read -p "Por favor, insira a URL HTTP ou HTTPS do seu repositório Gitea: " GIT_URL read -p "Por favor, insira o seu NOME DE UTILIZADOR do Gitea: " GITEA_USERNAME read -s -p "Por favor, insira o seu TOKEN DE ACESSO do Gitea (ficará oculto): " GITEA_TOKEN echo "" read -p "O seu servidor Gitea usa um certificado SSL auto-assinado ou inválido? (s/n): " SSL_VERIFY_CHOICE # Verifica se os campos foram preenchidos if [ -z "$GIT_URL" ] || [ -z "$GITEA_USERNAME" ] || [ -z "$GITEA_TOKEN" ]; then error "Todos os campos (URL, Utilizador, Token) são obrigatórios." fi # Extrai o protocolo e o caminho da URL para construir a nova URL com autenticação GIT_PROTOCOL=$(echo "$GIT_URL" | grep -o '^https\?://') GIT_DOMAIN_PATH=$(echo "$GIT_URL" | sed -e 's|https\?://||') AUTH_GIT_URL="${GIT_PROTOCOL}${GITEA_USERNAME}:${GITEA_TOKEN}@${GIT_DOMAIN_PATH}" # Gera a identidade para os commits automaticamente SERVER_HOSTNAME=$(hostname -f) GIT_COMMIT_NAME="$SERVER_HOSTNAME" GIT_COMMIT_EMAIL="${SERVER_HOSTNAME}@itguys.com.br" info "O autor dos commits será definido como: $GIT_COMMIT_NAME <$GIT_COMMIT_EMAIL>" # --- 3. Clonar o Repositório e Configurar --- if [ -d "$REPO_DIR" ]; then warn "O diretório do repositório $REPO_DIR já existe. A reconfigurar..." cd "$REPO_DIR" git remote set-url origin "$AUTH_GIT_URL" info "URL do remoto 'origin' atualizada com as novas credenciais." else info "A clonar o repositório para $REPO_DIR..." git clone "$GIT_URL" "$REPO_DIR" cd "$REPO_DIR" info "A configurar a URL do remoto com as credenciais..." git remote set-url origin "$AUTH_GIT_URL" fi # Configura o nome, email e verificação SSL DENTRO deste repositório git config user.name "$GIT_COMMIT_NAME" git config user.email "$GIT_COMMIT_EMAIL" if [[ "$SSL_VERIFY_CHOICE" == "s" || "$SSL_VERIFY_CHOICE" == "S" ]]; then info "A desativar a verificação de certificado SSL para este repositório." git config http.sslVerify false else git config http.sslVerify true fi info "Repositório configurado com sucesso." # --- 4. Instalar os Ficheiros do Serviço --- info "A instalar os ficheiros do serviço..." # (O script commit_configs.sh é gerado aqui. Ele não precisa de alterações, # pois o git irá ler a configuração local que acabámos de definir.) 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 -aR "$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 em $(hostname -f) - $(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 # ... (o resto do script que gera proxy-sinc.service, proxy-sinc.timer e proxy-sinc.8 continua aqui, exatamente como antes) ... 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 A autenticação com o Gitea é feita através de um Token de Acesso, e a identidade do committer é definida automaticamente com o hostname do servidor. A verificação de certificados SSL pode ser desativada durante a instalação para uso com servidores Gitea internos. .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 e instalar --- 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/" mkdir -p "$MAN_DIR" mv ./proxy-sinc.8 "$MAN_DIR/" gzip -f "$MAN_DIR/proxy-sinc.8" info "Ficheiros instalados com sucesso." # --- 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 ""