Skip to content

Instantly share code, notes, and snippets.

@inerba
Created February 12, 2025 11:14
Show Gist options
  • Save inerba/f868070125467290433ec782f621ead5 to your computer and use it in GitHub Desktop.
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.
#!/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