NgixProxy_Pathfinder/Instal-Proxy-Sinc.sh

349 lines
14 KiB
Bash

#!/bin/bash
# ==============================================================================
# INSTALADOR DO SERVIÇO PROXY-SINC (VERSÃO PROFISSIONAL)
#
# Autor: A sua IA Assistente & Equipa de Infraestrutura iT Guys
# Descrição: Instala e configura um serviço de versionamento robusto e
# auto-documentado para configurações de servidor.
# ==============================================================================
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"
CONFIG_DIR="/etc/proxy-sinc"
PATHS_FILE="${CONFIG_DIR}/paths.conf"
# A URL para o script de atualização deve apontar para o ficheiro RAW.
UPDATE_SCRIPT_URL="https://git.itguys.com.br/joao.goncalves/NgixProxy_Pathfinder/raw/branch/main/Instal-Proxy-Sinc.sh"
# --- 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/atualizaçã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..."
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 ""
if [ -z "$GIT_URL" ] || [ -z "$GITEA_USERNAME" ] || [ -z "$GITEA_TOKEN" ]; then
error "Todos os campos (URL, Utilizador, Token) são obrigatórios."
fi
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}"
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. 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
warn "Conexão bem-sucedida sem verificação SSL. O repositório será configurado para ignorar os erros de certificado."
SSL_VERIFY="false"
else
error "Não foi possível conectar ao repositório Git. Verifique a URL, o token e a conectividade de rede."
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."
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
git config user.name "$GIT_COMMIT_NAME"
git config user.email "$GIT_COMMIT_EMAIL"
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
# --- 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 "# Adicione aqui os caminhos completos para os ficheiros e diretórios que deseja versionar, um por linha." > "$PATHS_FILE"
echo "# Linhas que começam com '#' são ignoradas." >> "$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"
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/"
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/.git" ]; then echo "[ERRO] O diretório do repositório $REPO_PATH não é um repositório Git válido." >&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
# Ignora linhas vazias e comentários
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/'..."
# Usa rsync para copiar para uma pasta com o mesmo nome do original
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/"
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
# -R preserva a estrutura de pastas (ex: /etc/proxy-sinc/paths.conf)
rsync -aR "$file" "$AUTOMATION_FILES_DEST"
fi
done
cd "$REPO_PATH"
log_info "A verificar o status do repositório Git..."
if [ -n "$(git status --porcelain)" ]; then
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
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')"
log_info "A fazer o commit com a mensagem: $COMMIT_MESSAGE"
git commit -m "$COMMIT_MESSAGE"
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
log_info "Nenhuma alteração de configuração detetada. O repositório está atualizado."
fi
log_info "--- Verificação de sincronização concluída [$(date)] ---"
exit 0
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..."
# A URL precisa de apontar para o ficheiro RAW.
UPDATE_SCRIPT_URL="${UPDATE_REPO_URL/src\/branch\/main/raw\/branch\/main}"
TEMP_SCRIPT="/tmp/setup_latest.sh"
echo "A baixar a versão mais recente do instalador de: \$UPDATE_SCRIPT_URL"
# Adiciona o --insecure se o repo local estiver configurado para não verificar SSL
SSL_VERIFY_FLAG=""
if [ -d "/opt/config_repo/.git" ]; then
if [ "\$(cd /opt/config_repo && git config --get http.sslVerify)" == "false" ]; then
SSL_VERIFY_FLAG="--insecure"
echo "[AVISO] A usar o modo inseguro para baixar a atualização devido à configuração do repositório."
fi
fi
if curl \$SSL_VERIFY_FLAG -L "\$UPDATE_SCRIPT_URL" -o "\$TEMP_SCRIPT"; then
chmod +x "\$TEMP_SCRIPT"
echo "Instalador baixado com sucesso. A executar a atualização..."
# Executa o novo instalador. Ele irá pedir as credenciais novamente para reconfigurar.
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
[Service]
Type=oneshot
ExecStart=/usr/local/sbin/commit_configs.sh
EOF
cat > "$SYSTEMD_DIR/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
# 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
.B systemctl status proxy-sinc.timer
.br
.B journalctl -u proxy-sinc.service
.br
.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 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
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
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 a raiz do repositório Git.
.sp
Exemplo de conteúdo para \fI/etc/proxy-sinc/paths.conf\fR:
.nf
# Ficheiros e diretórios a serem versionados
/etc/nginx
/etc/fail2ban
/etc/zabbix/zabbix_agentd.d/meu_parametro.conf
.fi
.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.
.TP
\fB/opt/config_repo\fR
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)
EOF
# --- 7. Mover ficheiros para os locais corretos e instalar ---
# Garante que os diretórios de destino existem
mkdir -p "$SCRIPT_INSTALL_DIR" "$SYSTEMD_DIR" "$MAN_DIR"
# Move os ficheiros
mv ./commit_configs.sh "$SCRIPT_INSTALL_DIR/"
mv ./proxy-sinc-update "$SCRIPT_INSTALL_DIR/"
mv ./proxy-sinc.service "$SYSTEMD_DIR/"
mv ./proxy-sinc.timer "$SYSTEMD_DIR/"
mv "/tmp/proxy-sinc.8" "$MAN_DIR/"
# Define as permissões corretas
chmod +x "$SCRIPT_INSTALL_DIR/commit_configs.sh"
chmod +x "$SCRIPT_INSTALL_DIR/proxy-sinc-update"
gzip -f "$MAN_DIR/proxy-sinc.8"
info "Ficheiros instalados com sucesso."
# --- 8. 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/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."
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 " 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 ""