Criado o Instalador do sistema (Instal-Proxy-Sinc.sh)
This commit is contained in:
commit
92a9cfac0c
|
|
@ -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 ""
|
||||||
Loading…
Reference in New Issue