From d57920afa67d6c17a3c9a16f94f9855149697b88 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jo=C3=A3o=20Pedro=20Toledo=20Goncalves?= Date: Tue, 16 Sep 2025 21:34:14 +0000 Subject: [PATCH] Update / Agora Esta mais Serio --- Instal-Proxy-Sinc.sh | 232 +++++++++++++++++++++++++++++-------------- 1 file changed, 159 insertions(+), 73 deletions(-) diff --git a/Instal-Proxy-Sinc.sh b/Instal-Proxy-Sinc.sh index c875af9..51086f1 100644 --- a/Instal-Proxy-Sinc.sh +++ b/Instal-Proxy-Sinc.sh @@ -1,11 +1,11 @@ #!/bin/bash # ============================================================================== -# INSTALADOR DO SERVIÇO PROXY-SINC (VERSÃO AVANÇADA) +# INSTALADOR DO SERVIÇO PROXY-SINC (VERSÃO PROFISSIONAL) # # 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. +# Descrição: Instala e configura um serviço de versionamento robusto e +# auto-documentado para configurações de servidor. # ============================================================================== set -e @@ -15,6 +15,9 @@ REPO_DIR="/opt/config_repo" SCRIPT_INSTALL_DIR="/usr/local/sbin" SYSTEMD_DIR="/etc/systemd/system" MAN_DIR="/usr/share/man/man8" +CONFIG_DIR="/etc/proxy-sinc" +PATHS_FILE="${CONFIG_DIR}/paths.conf" +UPDATE_REPO_URL="https://git.itguys.com.br/joao.goncalves/NgixProxy_Pathfinder.git" # URL para o script de atualização # --- Funções de Ajuda --- info() { echo -e "\e[32m[INFO]\e[0m $1"; } @@ -22,7 +25,7 @@ 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..." +info "Iniciando a instalação/atualização do serviço Proxy-Sinc..." if [ "$EUID" -ne 0 ]; then error "Este script precisa de ser executado como root." @@ -37,35 +40,45 @@ 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" +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 +# --- 3. Teste de Conexão SSL e Configuração do Git --- +info "A testar a conexão com o Gitea..." +SSL_VERIFY="true" +if ! git -c http.sslVerify=true ls-remote "$GIT_URL" &> /dev/null; then + warn "A conexão com verificação SSL falhou. A tentar novamente sem verificação..." + if ! git -c http.sslVerify=false ls-remote "$GIT_URL" &> /dev/null; then + error "Não foi possível conectar ao repositório Git. Verifique a URL, o token e a conectividade de rede." + else + warn "Conexão bem-sucedida sem verificação SSL. O repositório será configurado para ignorar os erros de certificado." + SSL_VERIFY="false" + fi +else + info "Conexão com verificação SSL bem-sucedida." +fi + +# --- 4. Clonar/Atualizar o Repositório --- +if [ -d "$REPO_DIR/.git" ]; 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." + info "URL do remoto 'origin' atualizada." else info "A clonar o repositório para $REPO_DIR..." git clone "$GIT_URL" "$REPO_DIR" @@ -74,69 +87,129 @@ else 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 +git config http.sslVerify "$SSL_VERIFY" info "Repositório configurado com sucesso." +# --- 5. Gerar Ficheiro de Deploy (se for a primeira vez) --- +DEPLOY_LOG_DIR="$REPO_DIR/_deployment_logs" +DEPLOY_LOG_FILE="${DEPLOY_LOG_DIR}/${SERVER_HOSTNAME}.md" +if [ ! -f "$DEPLOY_LOG_FILE" ]; then + info "A criar o registo de deploy inicial..." + mkdir -p "$DEPLOY_LOG_DIR" + echo "# Registo de Deploy do Proxy-Sinc" > "$DEPLOY_LOG_FILE" + echo "" >> "$DEPLOY_LOG_FILE" + echo "**Servidor:** ${SERVER_HOSTNAME}" >> "$DEPLOY_LOG_FILE" + echo "**Instalado por:** ${GITEA_USERNAME}" >> "$DEPLOY_LOG_FILE" + echo "**Data de Instalação:** $(date)" >> "$DEPLOY_LOG_FILE" + + git add "$DEPLOY_LOG_FILE" + git commit -m "[Deploy] Instalação inicial do serviço de sincronização em ${SERVER_HOSTNAME}" + git push origin main + info "Registo de deploy enviado para o Gitea." +fi -# --- 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' +# --- 6. Instalar os Ficheiros do Serviço --- +info "A instalar/atualizar os ficheiros do serviço..." + +# Cria o diretório de configuração e o ficheiro de caminhos, se não existirem +mkdir -p "$CONFIG_DIR" +if [ ! -f "$PATHS_FILE" ]; then + info "A criar o ficheiro de caminhos padrão em $PATHS_FILE" + echo "/etc/nginx" > "$PATHS_FILE" + echo "/etc/fail2ban" >> "$PATHS_FILE" +fi + +# Gera o script principal de commit +cat > "$SCRIPT_INSTALL_DIR/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") +CONFIG_DIR="/etc/proxy-sinc" +PATHS_FILE="${CONFIG_DIR}/paths.conf" +AUTOMATION_FILES_SOURCE=("/usr/local/sbin/commit_configs.sh" "/usr/local/sbin/proxy-sinc-update" "/etc/systemd/system/proxy-sinc.service" "/etc/systemd/system/proxy-sinc.timer" "/usr/share/man/man8/proxy-sinc.8.gz" "${PATHS_FILE}") 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..." + +log_info() { echo "[INFO] $1"; } + +log_info "--- Iniciando a verificação de sincronização [$(date)] ---" +if [ "$EUID" -ne 0 ]; then echo "[ERRO] O script deve ser executado como root." >&2; exit 1; fi +if [ ! -d "$REPO_PATH" ]; then echo "[ERRO] O diretório do repositório $REPO_PATH não foi encontrado." >&2; exit 1; fi + +log_info "Sincronizando ficheiros de configuração definidos em $PATHS_FILE..." +if [ ! -f "$PATHS_FILE" ]; then + echo "[AVISO] O ficheiro de caminhos $PATHS_FILE não foi encontrado. Nenhum ficheiro de configuração foi sincronizado." +else + while IFS= read -r path_to_sync || [ -n "$path_to_sync" ]; do + if [ -z "$path_to_sync" ] || [[ "$path_to_sync" =~ ^# ]]; then + continue + fi + + if [ -e "$path_to_sync" ]; then + dest_name=$(basename "$path_to_sync") + log_info "A sincronizar '$path_to_sync' para '$REPO_PATH/$dest_name/'..." + rsync -avz --delete --exclude='*.swp' --exclude='*.bak' --exclude='sites-enabled/' --exclude='modules-enabled/' --exclude='/var/log/' --exclude='/var/run/' --exclude='/var/cache/' "$path_to_sync/" "$REPO_PATH/$dest_name/" + else + echo "[AVISO] O caminho '$path_to_sync' definido em $PATHS_FILE não existe. A ignorar." + fi + done < "$PATHS_FILE" +fi + +log_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..." +log_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..." + log_info "Alterações detetadas. A preparar o commit." + log_info "A puxar alterações do repositório remoto para evitar conflitos..." git pull --ff-only - echo "[INFO] A adicionar alterações ao stage..." + log_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" + log_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)..." + log_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." + log_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)] ---" +log_info "--- Verificação de sincronização concluída [$(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' +# Gera o script de atualização +cat > "$SCRIPT_INSTALL_DIR/proxy-sinc-update" << EOF +#!/bin/bash +set -e +echo "A procurar por atualizações para o serviço Proxy-Sinc..." +UPDATE_SCRIPT_URL="https://git.itguys.com.br/joao.goncalves/NgixProxy_Pathfinder/raw/branch/main/setup.sh" +TEMP_SCRIPT="/tmp/setup_latest.sh" +echo "A baixar a versão mais recente do instalador de: \$UPDATE_SCRIPT_URL" +if curl -k -L "\$UPDATE_SCRIPT_URL" -o "\$TEMP_SCRIPT"; then + chmod +x "\$TEMP_SCRIPT" + echo "Instalador baixado com sucesso. A executar a atualização..." + sudo "\$TEMP_SCRIPT" + rm "\$TEMP_SCRIPT" + echo "Atualização concluída!" +else + echo "ERRO: Falha ao baixar o script de atualização." >&2 + exit 1 +fi +exit 0 +EOF + +# Gera os ficheiros de serviço do systemd +cat > "$SYSTEMD_DIR/proxy-sinc.service" << 'EOF' [Unit] Description=Serviço de Sincronização de Configurações do Nginx para o Git After=network.target @@ -144,7 +217,8 @@ After=network.target Type=oneshot ExecStart=/usr/local/sbin/commit_configs.sh EOF -cat > ./proxy-sinc.timer << 'EOF' + +cat > "$SYSTEMD_DIR/proxy-sinc.timer" << 'EOF' [Unit] Description=Executa o serviço de sincronização de configurações a cada minuto [Timer] @@ -154,61 +228,69 @@ Unit=proxy-sinc.service [Install] WantedBy=timers.target EOF -cat > ./proxy-sinc.8 << 'EOF' + +# Gera a nova man page +cat > "/tmp/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. +.B systemctl status proxy-sinc.timer .br -Para verificar o status: \fBsystemctl status proxy-sinc.timer\fR +.B journalctl -u proxy-sinc.service .br -Para ver os logs: \fBjournalctl -u proxy-sinc.service\fR +.B proxy-sinc-update +.br +.B man proxy-sinc .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). +é 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 ficheiros e diretórios definidos em \fI/etc/proxy-sinc/paths.conf\fR para um repositório Git. Se forem detetadas alterações, ele cria um commit 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. +Esta abordagem garante um histórico completo de todas as alterações, facilita a recuperação de desastres e serve como um backup centralizado. .SH CONFIGURAÇÃO -Os ficheiros principais deste serviço estão localizados nos seguintes caminhos: +A gestão dos ficheiros e diretórios a serem sincronizados é feita através do ficheiro de texto: +.TP +\fB/etc/proxy-sinc/paths.conf\fR +Este ficheiro contém a lista de caminhos absolutos a serem versionados. Adicione um caminho por linha. Linhas vazias ou que começam com '#' são ignoradas. O script irá sincronizar cada caminho para um subdiretório com o mesmo nome dentro do repositório Git. +.SH ATUALIZAÇÃO +Para atualizar o serviço e os seus scripts para a versão mais recente, execute o seguinte comando como root: +.sp +\fBproxy-sinc-update\fR +.sp +Este comando irá baixar e executar a versão mais recente do script de instalação a partir do repositório Git oficial, atualizando todos os componentes necessários. +.SH FICHEIROS .TP \fB/usr/local/sbin/commit_configs.sh\fR O script principal que executa a lógica de sincronização e commit. .TP +\fB/usr/local/sbin/proxy-sinc-update\fR +O script que gere a auto-atualização do serviço. +.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). +O ficheiro de timer do systemd que define a frequência de execução. .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. +O diretório local onde o repositório Git é clonado. .SH SEE ALSO .BR git (1), .BR rsync (1), .BR systemd.service (5), -.BR systemd.timer (5), -.BR crontab (5) +.BR systemd.timer (5) EOF - -# --- Mover ficheiros para os locais corretos e instalar --- -mv ./commit_configs.sh "$SCRIPT_INSTALL_DIR/" +# --- 7. Mover ficheiros para os locais corretos e instalar --- chmod +x "$SCRIPT_INSTALL_DIR/commit_configs.sh" -mv ./proxy-sinc.service "$SYSTEMD_DIR/" -mv ./proxy-sinc.timer "$SYSTEMD_DIR/" +chmod +x "$SCRIPT_INSTALL_DIR/proxy-sinc-update" +# (os ficheiros de serviço já foram criados no sítio certo) mkdir -p "$MAN_DIR" -mv ./proxy-sinc.8 "$MAN_DIR/" +mv "/tmp/proxy-sinc.8" "$MAN_DIR/" gzip -f "$MAN_DIR/proxy-sinc.8" info "Ficheiros instalados com sucesso." -# --- Ativar o Serviço --- +# --- 8. Ativar o Serviço --- info "A recarregar o systemd e a ativar o timer..." systemctl daemon-reload systemctl enable --now proxy-sinc.timer @@ -217,7 +299,7 @@ info "Serviço ativado e a correr!" # --- Conclusão --- echo "" info "======================================================================" -info " Instalação Concluída!" +info " Instalação/Atualizaçã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." @@ -227,5 +309,9 @@ 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 " Para atualizar o serviço no futuro: proxy-sinc-update" +info "" +info "Para adicionar novos ficheiros/pastas à sincronização, edite:" +info " /etc/proxy-sinc/paths.conf" info ""