Created
February 12, 2025 11:14
-
-
Save inerba/f868070125467290433ec782f621ead5 to your computer and use it in GitHub Desktop.
Questo script configura un sistema di deployment basato su Git per un sito web.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
#!/bin/bash | |
# ============================================================================= | |
# SETUP-GIT-DEPLOY | |
# ============================================================================= | |
# | |
# Questo script configura un sistema di deployment basato su Git per un sito web. | |
# | |
# STRUTTURA CREATA SUL SERVER: | |
# └── /base_path/domain.tld/ | |
# ├── private/ | |
# │ └── site.git/ # Repository Git bare | |
# └── public_html/ # Directory pubblica del sito | |
# └── deploy.sh # Script eseguito dopo ogni push | |
# | |
# UTILIZZO: | |
# 1. Modalità interattiva: | |
# ./setup-git-deploy.sh | |
# (Lo script chiederà tutti i parametri necessari) | |
# | |
# 2. Modalità con parametri: | |
# ./setup-git-deploy.sh -u username -i 192.168.1.100 -d example.com -p /home/user/web | |
# | |
# PARAMETRI: | |
# -u : Username del server | |
# -i : Indirizzo IP del server | |
# -d : Nome dominio | |
# -p : Percorso base sul server | |
# -h : Mostra questo help | |
# | |
# PREREQUISITI: | |
# - Accesso SSH al server configurato con chiavi | |
# - Git installato sia in locale che sul server | |
# - Permessi di scrittura nella directory di destinazione sul server | |
# | |
# DOPO L'INSTALLAZIONE: | |
# 1. I file andranno posizionati nella directory del progetto locale | |
# 2. Eseguire i normali comandi git (add, commit) | |
# 3. Per deployare: git push live master | |
# | |
# NOTA: Ad ogni push, verrà eseguito automaticamente deploy.sh sul server | |
# che si occuperà di: | |
# - Installare le dipendenze npm (se presente package.json) | |
# - Eseguire npm run build (se presente package.json) | |
# | |
# ============================================================================= | |
# Funzione per mostrare l'uso dello script | |
show_usage() { | |
echo "Uso: $0 [-u username] [-i ip] [-d domain] [-p base_path]" | |
echo " -u: Username del server" | |
echo " -i: Indirizzo IP del server" | |
echo " -d: Dominio (es: domain.tld)" | |
echo " -p: Percorso base sul server (es: /home/user/web)" | |
echo " -h: Mostra questo messaggio" | |
} | |
# Parsing dei parametri | |
while getopts ":u:i:d:p:h" opt; do | |
case $opt in | |
u) SERVER_USER="$OPTARG";; | |
i) SERVER_IP="$OPTARG";; | |
d) DOMAIN="$OPTARG";; | |
p) BASE_PATH="$OPTARG";; | |
h) | |
show_usage | |
exit 0 | |
;; | |
\?) | |
echo "Opzione invalida: -$OPTARG" | |
show_usage | |
exit 1 | |
;; | |
:) | |
echo "L'opzione -$OPTARG richiede un argomento" | |
show_usage | |
exit 1 | |
;; | |
esac | |
done | |
# Se non ci sono parametri, chiedi tutto in modo interattivo | |
if [ $OPTIND -eq 1 ]; then | |
read -p "Inserisci l'username del server: " SERVER_USER | |
read -p "Inserisci l'indirizzo IP del server: " SERVER_IP | |
read -p "Inserisci il dominio (es: domain.tld): " DOMAIN | |
read -p "Inserisci il percorso base sul server (es: /home/user/web): " BASE_PATH | |
else | |
# Richiedi solo le informazioni mancanti | |
[ -z "$SERVER_USER" ] && read -p "Inserisci l'username del server: " SERVER_USER | |
[ -z "$SERVER_IP" ] && read -p "Inserisci l'indirizzo IP del server: " SERVER_IP | |
[ -z "$DOMAIN" ] && read -p "Inserisci il dominio (es: domain.tld): " DOMAIN | |
[ -z "$BASE_PATH" ] && read -p "Inserisci il percorso base sul server (es: /home/user/web): " BASE_PATH | |
fi | |
# Verifica finale che tutti i parametri necessari siano presenti | |
if [ -z "$SERVER_USER" ] || [ -z "$SERVER_IP" ] || [ -z "$DOMAIN" ] || [ -z "$BASE_PATH" ]; then | |
echo "Errore: tutti i parametri sono richiesti" | |
exit 1 | |
fi | |
# Costruisci i percorsi | |
SITE_PATH="${BASE_PATH}/${DOMAIN}" | |
PRIVATE_PATH="${SITE_PATH}/private" | |
PUBLIC_PATH="${SITE_PATH}/public_html" | |
GIT_PATH="${PRIVATE_PATH}/site.git" | |
# Crea la struttura sul server | |
ssh ${SERVER_USER}@${SERVER_IP} "mkdir -p ${GIT_PATH} && \ | |
cd ${GIT_PATH} && \ | |
git init --bare && \ | |
mkdir -p ${PUBLIC_PATH}" | |
# Crea e carica l'hook post-receive | |
cat > post-receive.temp << EOL | |
#!/bin/sh | |
git --work-tree=${PUBLIC_PATH} --git-dir=${GIT_PATH} checkout -f | |
cd ${PUBLIC_PATH} && sh deploy.sh | |
EOL | |
# Carica il file post-receive sul server e rendilo eseguibile | |
scp post-receive.temp ${SERVER_USER}@${SERVER_IP}:${GIT_PATH}/hooks/post-receive | |
ssh ${SERVER_USER}@${SERVER_IP} "chmod +x ${GIT_PATH}/hooks/post-receive" | |
rm post-receive.temp | |
# Crea il file deploy.sh locale | |
cat > deploy.sh << EOL | |
#!/bin/bash | |
# Script di deploy | |
echo "Inizia il deploy..." | |
# Installa le dipendenze NPM se necessario | |
if [ -f package.json ]; then | |
npm install --production | |
fi | |
# Compila gli asset se necessario | |
if [ -f package.json ]; then | |
npm run build | |
fi | |
echo "Deploy completato!" | |
EOL | |
# Rendi eseguibile il deploy.sh locale | |
chmod +x deploy.sh | |
# Copia il deploy.sh sul server | |
scp deploy.sh ${SERVER_USER}@${SERVER_IP}:${PUBLIC_PATH}/deploy.sh | |
ssh ${SERVER_USER}@${SERVER_IP} "chmod +x ${PUBLIC_PATH}/deploy.sh" | |
# Configura il repository locale | |
if [ ! -d .git ]; then | |
git init | |
echo "node_modules/" > .gitignore | |
echo "*.log" >> .gitignore | |
fi | |
# Aggiungi il remote | |
git remote remove live 2>/dev/null | |
git remote add live ssh://${SERVER_USER}@${SERVER_IP}${GIT_PATH} | |
echo "Configurazione completata!" | |
echo "Usa 'git push live master' per pubblicare il tuo sito" |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment