Comandi di base e configurazione iniziale
Questa guida assume che Linux (AlmaLinux, RockyLinux, oppure Oracle Linux 10) sia disponibile come macchina remota (attraverso servizi come digital oceans, oppure aruba cloud) oppure che firi come macchina virtuale (VMware).
Nel caso di una macchina locale la modalità di rete utilizzata è NAT, con macchina host Windows 11.
La guida è compatibile anche se usi linux su Virtualbox, l'unica differenza è come fare i port forwarding
Port Forwarding
Recperare l'ip della macchina virtuale. Da dentro oracle linux eseguire il comando ip a. Nel mio caso l'ip della macchina è 192.168.86.128
Dalla interfaccia di WMware acedi alla voce di menu Edit / Virtual Network Editor
Clicca sul pulsante Change Settings
Clicca sulla riga VMnet8 e poi su NAT settings
Cliccare sul tasto Add e impostare la regole seguendo come da immagine, modificando dove serve
L'immagine precedente imposta la reole per accedere alla macchina con ssh. Per accedere alla macchina posso usare il comando seguente, sostituendo il nome utente reale
ssh localhost@[nomeutente] -p 34522
Comandi di sistema essenziali
Ecco i comandi che userai di più nella gestione quotidiana
# Aggiornare il sistema
sudo dnf update -y
# Riavviare / spegnere
sudo reboot
sudo shutdown -h now
# Informazioni sul sistema
uname -a
cat /etc/os-release
hostnamectl
# Gestione servizi (systemd)
sudo systemctl start [servizio]
sudo systemctl stop [servizio]
sudo systemctl restart [servizio]
sudo systemctl enable [servizio] # avvio automatico al boot
sudo systemctl disable [servizio]
sudo systemctl status [servizio]
# Monitoraggio processi e risorse
top
htop # più leggibile, installa con: sudo dnf install htop -y
df -h # spazio disco
free -h # memoria RAM
Abilitare CRB, EPEL e REMI
Questi repository estendono i pacchetti disponibili su distribuzioni AlmaLinux/RockyLinux/Oracle Linux 10.
- CRB (CodeReady Builder): contiene pacchetti di sviluppo e dipendenze che normalmente non sono incluse nel repo base. Molti pacchetti di EPEL e REMI lo richiedono.
- EPEL (Extra Packages for Enterprise Linux): repository della community Fedora con centinaia di pacchetti non presenti nei repo ufficiali Red Hat/Oracle.
- REMI: repository specializzato per versioni aggiornate di PHP, MySQL e software LAMP. Fondamentale per installare PHP 8.5.
Per Oracle Linux 10 puoi i seguenti comandi
# Command to install the EPEL repository configuration package:
sudo dnf install https://dl.fedoraproject.org/pub/epel/epel-release-latest-10.noarch.rpm
# abilitare crb
sudo /usr/bin/crb status
sudo /usr/bin/crb enable
# Command to install the Remi repository configuration package:
sudo dnf install https://rpms.remirepo.net/enterprise/remi-release-10.rpm
sudo dnf update
Per AlmaLinux / RockyLinux 10 puoi usare i seguenti comandi
sudo dnf config-manager --set-enabled crb
sudo dnf install epel-release
sudo dnf install https://rpms.remirepo.net/enterprise/remi-release-10.rpm
sudo dnf update
Disabilitare SELinux
SELinux (Security-Enhanced Linux) è un sistema di controllo degli accessi obligtorio. In produzione va gestito correttamente, ma su un server di sviluppo locale crea spesso problemi con Apache, PHP e la lettura delle cartelle condivise.
Esegui la seguente linea di codice e poi riavvia la macchina
sudo sed -i -e "s/^SELINUX=.*/SELINUX=disabled/" /etc/selinux/config
Impostare il timezone
Verifica che il tuo timezone sia corretto, e nel caso correggilo con i seguenti comandi
# Verificare
timedatectl
date
# Elencare i timezone disponibili (filtrando per Europa)
timedatectl list-timezones | grep Europe
# Impostare Roma
sudo timedatectl set-timezone Europe/Rome
Programmi aggiuntivi
Opzionalmente puoi installare i seuenti programmi aggiuntivi
sudo dnf install wget curl zip unzip nano tar rsync dos2unix
Dopo aver abilitato epel-release puoi installare anche i seguenti programmi
sudo dnf install htop
Gestione pachetti con DNF
# per vedere i programmi installati
sudo dnf list installed
# per vedere se un programma è installato
sudo dnf list installed | grep libreoffice
# per rimuovere un pacchetto e le sue dipendenze
sudo dnf remove libreoffice*
# pulizia dei pacchetti residui
sudo dnf autoremove
sudo dnf clean all
Firewall (firewalld)
Oracle Linux 10 usa firewalld come frontend per iptables. Il concetto base è quello delle zone: ogni interfaccia di rete viene assegnata a una zona con regole specifiche. La zona di default è public
Comandi base
# Stato del firewall
sudo systemctl status firewalld
sudo firewall-cmd --state
# Avviare e abilitare al boot
sudo systemctl enable --now firewalld
# Vedere tutte le regole attive
sudo firewall-cmd --list-all
# Vedere le zone disponibili
sudo firewall-cmd --get-zones
sudo firewall-cmd --get-active-zones
Abilitare servizi http e https
# Aggiungere http e https (permanente)
sudo firewall-cmd --permanent --add-service=http
sudo firewall-cmd --permanent --add-service=https
# Ricaricare per applicare le modifiche permanenti
sudo firewall-cmd --reload
# Verificare
sudo firewall-cmd --list-services
Aprire porte singole
# Aprire la porta 3389 (TCP)
sudo firewall-cmd --permanent --add-port=3389/tcp
# Aprire una porta custom, es. 8080
sudo firewall-cmd --permanent --add-port=8080/tcp
# Aprire un range di porte
sudo firewall-cmd --permanent --add-port=8080-8090/tcp
# Ricaricare
sudo firewall-cmd --reload
# Verificare le porte aperte
sudo firewall-cmd --list-ports
Rimuovere regole
# Rimuovere un servizio
sudo firewall-cmd --permanent --remove-service=http
# Rimuovere una porta
sudo firewall-cmd --permanent --remove-port=3389/tcp
# Ricaricare
sudo firewall-cmd --reload
Gestione pacchetti con DNF
DNF è il package manager di Oracle Linux 10 (successore di YUM). Gestisce l'installazione, aggiornamento e rimozione di software.
Di seguito una serie di comandi base
# Aggiornare tutti i pacchetti
sudo dnf update -y
# Installare un pacchetto
sudo dnf install [nome-pacchetto] -y
# Installare più pacchetti
sudo dnf install wget curl git vim -y
# Rimuovere un pacchetto
sudo dnf remove [nome-pacchetto] -y
# Cercare un pacchetto
sudo dnf search [termine]
# Informazioni su un pacchetto
sudo dnf info [nome-pacchetto]
# Elencare i pacchetti installati
sudo dnf list installed
sudo dnf list installed | grep php
# Pulire la cache
sudo dnf clean all
# Vedere la cronologia delle operazioni
sudo dnf history
# Annullare l'ultima operazione
sudo dnf history undo last
# Elencare i gruppi disponibili
sudo dnf group list
# Installare un gruppo di pacchetti
sudo dnf group install 'Development Tools' -y
SSH con autenticazione a chiave
Macchian remota cloud
L'autenticazione con chiave SSH è più sicura della password. Generi una coppia di chiavi sul tuo PC, copi la chiave pubblica sul server, e da quel momento ti connetti senza digitare la password.
Genera la coppia di chiavi (sul tuo PC)
# Sul tuo computer locale (Windows PowerShell / macOS / Linux)
ssh-keygen -t ed25519 -C 'mio-server-oracle'
# Ti chiede dove salvare (default: ~/.ssh/id_ed25519)
# e una passphrase opzionale (consigliata)
# Verrà creata:
# ~/.ssh/id_ed25519 (chiave privata - non condividere mai!)
# ~/.ssh/id_ed25519.pub (chiave pubblica - questa va sul server)
Copiare la chiave pubblica sul server
# Metodo 1: ssh-copy-id (Linux/macOS)
ssh-copy-id -i ~/.ssh/id_ed25519.pub utente@ip-server
# Metodo 2: manuale (se ssh-copy-id non è disponibile)
# Sul server, crea la cartella .ssh e il file authorized_keys
mkdir -p ~/.ssh
chmod 700 ~/.ssh
nano ~/.ssh/authorized_keys
# Incolla il contenuto del file id_ed25519.pub
chmod 600 ~/.ssh/authorized_keys
Configura SSH sul server
sudo nano /etc/ssh/sshd_config
# Valori consigliati:
PubkeyAuthentication yes
AuthorizedKeysFile .ssh/authorized_keys
PasswordAuthentication no # disabilita login con password
PermitRootLogin no # blocca login diretto come root
# Riavviare il servizio
sudo systemctl restart sshd
# Aprire la porta SSH nel firewall (se non già aperta)
sudo firewall-cmd --permanent --add-service=ssh
sudo firewall-cmd --reload
Crea il file config SSH locale (sul tuo PC). Il file ~/.ssh/config ti permette di definire alias e impostazioni per ogni server, evitando di digitare ogni volta ip, utente e chiave.
# ~/.ssh/config
Host oracle-dev
HostName 192.168.1.100
User mario
IdentityFile ~/.ssh/id_ed25519
Port 22
Host oracle-prod
HostName 10.0.0.50
User deploy
IdentityFile ~/.ssh/id_ed25519_prod
Con questo file puoi connetterti semplicemente con ssh oracle-dev
Macchina locale VMWare
Con VMware in modalità NAT e il port forwarding configurato, non ti connetti direttamente all'IP della VM ma all'IP dell'host Windows sulla porta mappata.
Nel mio caso specifico ho fatto port forwarding della porta 34522 dell'host, sulla porta 22 del guest. Quindi per colelgarmi alla machina posso fare come segue
# Da PowerShell o terminale Windows
ssh mario@127.0.0.1 -p 34522
# Oppure, se ti connetti da un altro PC sulla stessa rete
ssh mario@192.168.86.128 -p 34522
Se vuoi semplificare il comando, aggiungi una voce al file `~/.ssh/config` sul tuo PC Windows (`C:\Users\mario\.ssh\config`):
Host oracle-dev
HostName 127.0.0.1
User mario
Port 34522
Da quel momento ti basta:
ssh oracle-dev
Git con GitHub e Bitbucket
Installazione e configurazione base
sudo dnf install git
# Configurazione globale
git config --global user.name 'NomeCognome'
git config --global user.email 'nome@esempio.it'
# Verificare
git config --list
Autenticazione con chiave SSH: Sia GitHub che Bitbucket supportano l'autenticazione tramite chiave SSH. Il processo è lo stesso per entrambi.
# Generare una chiave dedicata per GitHub
ssh-keygen -t ed25519 -C 'mario@esempio.it' -f ~/.ssh/id_github
# Generare una chiave dedicata per Bitbucket
ssh-keygen -t ed25519 -C 'mario@esempio.it' -f ~/.ssh/id_bitbucket
# Aggiungere le chiavi all'agente SSH
eval '$(ssh-agent -s)'
ssh-add ~/.ssh/id_github
ssh-add ~/.ssh/id_bitbucket
# Visualizzare la chiave pubblica da copiare su GitHub/Bitbucket
cat ~/.ssh/id_github.pub
cat ~/.ssh/id_bitbucket.pub
Copia il contenuto di ogni .pub nelle rispettive impostazioni SSH del tuo account:
- GitHub → Settings → SSH Keys
- Bitbucket → Personal settings → SSH keys
File config SSH per Git
# Aggiungere a ~/.ssh/config
Host github.com
HostName github.com
User git
IdentityFile ~/.ssh/id_github
Host bitbucket.org
HostName bitbucket.org
User git
IdentityFile ~/.ssh/id_bitbucket
Testa la connessione con
ssh -T git@github.com
ssh -T git@bitbucket.org
Cartelle condivise (VMware Shared Folders e Samba)
VMWare cartella condivisa
Come prima cosa impostare la cartella da condividere con VMware
Supponiamo di mondare la cartella condivisa d. Crea la cartella dentro /mnt
sudo mkdir -p /mnt/d
sudo chown $USER:$USER /mnt/d
Per montare la cartella host sulla cartella /mnt/d di linux lanciare il seguente comando da terminale
sudo vmhgfs-fuse .host:/ /mnt/d/ -o allow_other -o uid=1000
Oppure puoi montare tutto dentro la cartella /mnt
sudo vmhgfs-fuse .host:/ /mnt/ -o allow_other -o uid=1000
Per scoprire le cartelle condivise `.host:/` dentro usare
vmware-hgfsclient
Per montare all'avvio della macchina
# Use shared folders between VMWare guest and host
.host:/ /mnt/d/ fuse.vmhgfs-fuse defaults,allow_other,uid=1000 0 0
Samba - condivisione cartelle con Windows
Samba permette di esporre cartelle Linux come share di rete accessibili da Windows. L'utente Samba avrà lo stesso nome dell'utente Linux (mario), con una password Samba separata.
Dato che uso NAT sulla macchiana virtuale devo fare il port forwarding di una porta della macchina windows sulla macchina linux
esempio 34545 -> 445
Procedo con l'installazione di samba
# Installare Samba
sudo dnf install samba samba-client
# Abilitare e avviare
sudo systemctl enable --now smb nmb
# Aprire il firewall
sudo firewall-cmd --permanent --add-service=samba
sudo firewall-cmd --reload
Configura la share nel file smb.conf:
# sudo nano /etc/samba/smb.conf
[home-mario]
comment = Home di Mario
path = /home/mario
valid users = mario
read only = no
browsable = yes
create mask = 0664
directory mask = 0775
force user = mario
force group = mario
Ora aggiungo la password all'utente samba
sudo smbpasswd -a mario
# Riavviare Samba
sudo systemctl restart smb
Da Windows, apri Esplora File e digita nella barra degli indirizzi \\ip-del-server.
Dato però che ho mappato la porta 34545 (host) sulla macchina 445 (linux) posso attaccare una directory
di rete teporanea a windows specificando la porta di connessione.
net use T: \\127.0.0.1\home-mario /TCPPORT:34545 /user:mario
# per togliere la cartella di rete
NET USE T: /DELETE
Inserisci come credenziali mario e la password impostata con smbpasswd. Poiché mario è proprietario della propria home, avrà già pieno accesso in lettura e scrittura senza bisogno di modificare permessi.
Stack LAMP
Apache
Installiamo Apache (httpd) e lo configuriamo per supportare WordPress, Laravel e phpMyAdmin.
Procediamo con l'installazione
# Installazione
sudo dnf install httpd httpd-tools mod_ssl
# Abilitare e avviare
sudo systemctl enable --now httpd
Se la macchina è remota agiungiamo le seguenti regole al firewall
# lancia i seguenti comandi per aprire il firewall
sudo firewall-cmd --permanent --add-service=http
sudo firewall-cmd --permanent --add-service=https
sudo firewall-cmd --reload
Se stai usando la macchina locale con NAT di seguito considero di aver fatto il port forwarding dalla porta 34580 (host) alla 34580 (guest).
Quindi il web server apache risponderà all'indirizzo http://localhost:34580. Apporta le seguenti modifiche
sudo nano /etc/httpd/conf/httpd.conf
# Assicurati che ci sia la seguente riga:
Listen 34580
# lancia i seguenti comandi per aprire il firewall
sudo firewall-cmd --zone=public --permanent --add-port=34580/tcp
sudo firewall-cmd --reload
La root di Apache sarà /var/www. Quando accedi a localhost la root è /var/www/html
Modifica il file di configurazione principale:
sudo nano /etc/httpd/conf/httpd.conf
# assicurati che ci sia "AllowOverride All"
<Directory "/var/www/html">
....
AllowOverride All
Aggiungi il virtualhost per la cartella /var/www/html che risponde all'indirizzo ip della macchina. Sostituisci $APACHE_PORT con la porta corretta.
sudo nano /etc/httpd/conf.d/000-default.conf
<VirtualHost *:$APACHE_PORT>
ServerAdmin webmaster@localhost
DocumentRoot /var/www/html
<Directory "/var/www/html">
Options -Indexes +FollowSymLinks
AllowOverride All
Require all granted
</Directory>
ErrorLog /var/log/httpd/error.log
CustomLog /var/log/httpd/access.log combined
</VirtualHost>
Riavvia Apache e controlla lo status
sudo systemctl restart httpd
sudo systemctl status httpd
Per ogni sito crea un file di configurazione separato in /etc/httpd/conf.d/:
sudo nano /etc/httpd/conf.d/miosito.conf
<VirtualHost *:$APACHE_PORT>
ServerName miosito.local
DocumentRoot /var/www/miosito
<Directory /var/www/miosito>
Options FollowSymLinks
AllowOverride All
Require all granted
</Directory>
ErrorLog /var/log/httpd/miosito-error.log
CustomLog /var/log/httpd/miosito-access.log combined
</VirtualHost>
Se sono in locale per comodità posso aggiungere il mio utente locale al gruppo apache
sudo usermod -aG apache $USER
# riavvia macchina
sudo reboot
# controlla gruppi utente corrente
groups
D'ora in poi posso aggiornare i permessi della cartella /var/www nel seguente modo (di modo che posso modificare i files con il mio utente locale)
# Imposta permessi corretti
sudo chown -R apache:apache /var/www
sudo find /var/www -type d -exec chmod 775 {} \;
sudo find /var/www -type f -exec chmod 664 {} \;
Come utility creo uno script per aggiornare i permessi della cartella corrente, di modo che possa modificare senza problemi i files e cartelle con il mio utente locale
sudo nano /usr/local/bin/aggiorna_permessi_web.sh
#!/bin/bash
# Define user and group variables
WEB_USER="apache"
WEB_GROUP="apache"
# Script to update permissions recursively from current directory
# Usage: ./update_permissions.sh
# Check if running as root or with sudo
# if [ "$EUID" -ne 0 ]; then
# echo "Please run as root or with sudo"
# exit 1
# fi
# Set ownership recursively
echo "Updating ownership to $WEB_USER:$WEB_GROUP..."
sudo chown $WEB_USER:$WEB_GROUP -R .
# Set directory permissions (775)
echo "Setting directory permissions to 775..."
sudo find . -type d -exec chmod 775 {} \;
# Set file permissions (664)
echo "Setting file permissions to 664..."
sudo find . -type f -exec chmod 664 {} \;
echo "Permissions updated successfully!"
Rendi eseguibile lo script con
sudo chmod +x /usr/local/bin/aggiorna_permessi_web.sh
Per vedere i log di apache
# Log di errore principale
sudo tail -f /var/log/httpd/error_log
# Log accessi
sudo tail -f /var/log/httpd/access_log
# Log dei virtual host specifici
sudo tail -f /var/log/httpd/miosito-error.log
# Testare la configurazione senza riavviare
sudo apachectl configtest
# Ricaricare la configurazione
sudo systemctl reload httpd
PHP 8.5
Usiamo il repository REMI per installare PHP 8.5
sudo dnf module reset php
# per vedere i moduli php
sudo dnf module list php
# abilita il modulo per php8.5
sudo dnf module enable php:remi-8.5
Installiamo php
sudo dnf install php php-cli php-fpm php-mysqlnd php-zip php-devel php-gd php-mcrypt php-mbstring php-curl php-xml php-pear php-bcmath php-json php-opcache php-intl php-soap php-xmlrpc php-gettext php-ldap php-imap php-odbc php-pdo php-common php-process php-imagick php-xdebug
Per verificare la versione
php -v
Aumenta i limiti di PHP per compatibilità con WordPress e upload di file grandi:
# Trovare il percorso del php.ini
php --ini
# Di solito si trova in /etc/php.ini
sudo nano /etc/php.ini
# Modificare questi valori:
max_execution_time = 300
max_input_time = 300
upload_max_filesize = 64M
post_max_size = 64M
memory_limit = 512M
date.timezone = Europe/Rome
Configuriamo XDebug
# Trovare il file di configurazione xdebug
php --ini | grep xdebug
# modifica il file xdebug.ini
sudo nano /etc/php.d/15-xdebug.ini
# contenuto da aggiungere
xdebug.mode = debug
xdebug.start_with_request = yes
xdebug.client_host = localhost
xdebug.client_port = 9003
Riavviamo apache e controlliamo che sia caricato il modulo xdebug
# Riavviare Apache
sudo systemctl restart httpd php-fpm
# Verificare che Xdebug sia caricato
php -m | grep xdebug
Come debug aggiungiamo il file info.php alla cartella /var/www/html
echo "<?php phpinfo(); ?>" | sudo tee /var/www/html/info.php
sudo chown apache:apache /var/www/html/info.php
Verifica lo stato navigando su http://[server_ip]:[apache_porta]
MariaDB
Creiamo il file /etc/yum.repos.d/MariaDB.repo e aggiungiamo ils eguente contenuto
sudo nano /etc/yum.repos.d/MariaDB.repo
[mariadb]
name = MariaDB
baseurl = https://mirror1.hs-esslingen.de/pub/Mirrors/mariadb/yum/12.2/rhel/$releasever/$basearch
gpgkey = https://mirror1.hs-esslingen.de/pub/Mirrors/mariadb/yum/RPM-GPG-KEY-MariaDB
gpgcheck = 1
Installa mariadb con il seguente comando
sudo dnf install MariaDB-server MariaDB-client
In aggiunta prosegui con i seguenti comandi
# Abilitare e avviare
sudo systemctl enable --now mariadb
# Verificare la versione
mariadb --version
# Wizard di configurazione sicurezza (imposta password root, rimuove utenti anonimi, ecc.)
sudo mariadb-secure-installation
# Rispondere così:
# Enter current password for root: [invio - vuota di default]
# Switch to unix_socket auth: N
# Change root password: Y → inserisci una password sicura
# Remove anonymous users: Y
# Disallow root login remotely: Y
# Remove test database: Y
# Reload privilege tables: Y
Per gestire il database ti riporto alcune query di utilità generale
# Accedere a MariaDB
sudo mariadb -u root -p
-- Creare un database e un utente
CREATE DATABASE miosito CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
CREATE USER 'mario'@'localhost' IDENTIFIED BY 'password-sicura';
GRANT ALL PRIVILEGES ON miosito.* TO 'mario'@'localhost';
FLUSH PRIVILEGES;
EXIT;
phpMyAdmin
Scarichiamo l'ultima versione di phpMyAdmin e rendiamo il sito disponibile sotto http://localhost:[PORTA]/pma.
Procediamo con l'installazione
# mi spoto nella cartella /var/www/html
cd /var/www/html
# Scaricare l'ultima versione (controlla la versione corrente su phpmyadmin.net)
sudo wget https://www.phpmyadmin.net/downloads/phpMyAdmin-latest-all-languages.tar.gz
# Estrarre
sudo tar -xzf phpMyAdmin-latest-all-languages.tar.gz
sudo mv phpMyAdmin-*-all-languages pma
# pulizia
sudo rm phpMyAdmin-latest-all-languages.tar.gz
# Creare la cartella temporanea
sudo mkdir -p /var/www/html/pma/tmp
# Permessi
sudo chown -R apache:apache /var/www/html/pma
sudo find /var/www/html/pma -type d -exec chmod 775 {} \;
sudo find /var/www/html/pma -type f -exec chmod 664 {} \;
Modifichiamo il file di configurazione di phpmyadmin
# Generare una stringa casuale per blowfish_secret (es. con openssl):
openssl rand -base64 32
# Copiare il file di config di esempio
sudo cp /var/www/html/pma/config.sample.inc.php /var/www/html/pma/config.inc.php
sudo nano /var/www/html/pma/config.inc.php
# Impostare nel file:
$cfg['blowfish_secret'] = 'stringa-generata-da-openssl-qui';
$cfg['TempDir'] = '/var/www/html/pma/tmp';
# per eseguire il login automatico (AMBIENTE LOCALE) aggiungere o modificare i seguenti parametri
$cfg['Servers'][$i]['host'] = 'localhost';
$cfg['Servers'][$i]['user'] = 'root';
$cfg['Servers'][$i]['password'] = 'password di root';
$cfg['Servers'][$i]['auth_type'] = 'config';
$cfg['Servers'][$i]['AllowNoPassword'] = true;
Wordpress
Supponiamo di creare uno script che gestisce la creazione di istanze wordpress sotto la cartella /var/www/html. In questo specifico caso non ho bisogno di creare un file virtualhost.
La porta utilizzata è quella locale di apache overo la 34580. All'inizio dello script ci sono una serie di variabili da modificare secondo il tuo specifico caso
sudo nano /usr/local/bin/wp-manager.sh
#!/bin/bash
# wp-manager.sh - Gestione istanze WordPress
#
# Uso:
# wp-manager.sh create <nome> <db_name>
# wp-manager.sh delete <nome> <db_name>
# wp-manager.sh list
WEB_ROOT="/var/www/html"
APACHE_PORT="34580"
DB_ROOT_PASSWORD="root"
URL_PREFIX="http://localhost"
create_wp() {
SITE=$1
DB_NAME=$2
if [ -z "$SITE" ] || [ -z "$DB_NAME" ]; then
echo "Uso: wp-manager.sh create <nome> <db_name>"
exit 1
fi
SITE_DIR="$WEB_ROOT/$SITE"
if [ -d "$SITE_DIR" ]; then
echo "Errore: la cartella $SITE_DIR esiste già."
exit 1
fi
echo ">>> Creazione database..."
sudo mariadb -u root -p"$DB_ROOT_PASSWORD" -e "
DROP DATABASE IF EXISTS $DB_NAME;
CREATE DATABASE IF NOT EXISTS $DB_NAME CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
"
echo ">>> Download WordPress..."
cd /var/www/html
if [ -f "latest.tar.gz" ]; then
read -p "Il file latest.tar.gz esiste già. Vuoi riscaricarlo? [s/N] " risposta
if [ "$risposta" = "s" ] || [ "$risposta" = "S" ]; then
sudo rm -f latest.tar.gz
sudo wget -q https://wordpress.org/latest.tar.gz
fi
else
sudo wget -q https://wordpress.org/latest.tar.gz
fi
sudo tar -xzf latest.tar.gz
sudo mv wordpress "$SITE"
echo ">>> Configurazione wp-config.php..."
sudo cp "$SITE/wp-config-sample.php" "$SITE/wp-config.php"
sudo sed -i "s/database_name_here/$DB_NAME/" "$SITE/wp-config.php"
sudo sed -i "s/username_here/root/" "$SITE/wp-config.php"
sudo sed -i "s/password_here/$DB_ROOT_PASSWORD/" "$SITE/wp-config.php"
# sostituzioni chiavi salt
# Scarica le nuove chiavi
NEW_KEYS=$(curl -s https://api.wordpress.org/secret-key/1.1/salt)
# Individua la prima e l'ultima riga del blocco da sostituire nel file
FIRST_LINE=$(grep -n "define( 'AUTH_KEY'" $SITE/wp-config.php | head -1 | cut -d: -f1)
LAST_LINE=$(grep -n "define( 'NONCE_SALT'" $SITE/wp-config.php | head -1 | cut -d: -f1)
# Sostituisce il blocco con le nuove chiavi usando sed
sudo sed -i "${FIRST_LINE},${LAST_LINE}d" $SITE/wp-config.php
sudo sed -i "$((FIRST_LINE - 1))r /dev/stdin" $SITE/wp-config.php <<< "$NEW_KEYS"
# === 2) Inserimento delle costanti dopo define( 'WP_DEBUG', false ); ===
EXTRA_DEFINES="define( 'WP_POST_REVISIONS', 5 );\ndefine( 'WP_AUTO_UPDATE_CORE', false );\ndefine( 'ALLOW_UNFILTERED_UPLOADS', true );"
sudo sed -i "/define( 'WP_DEBUG', false );/a ${EXTRA_DEFINES}" $SITE/wp-config.php
echo ">>> Permessi..."
sudo chown -R apache:apache "$SITE"
sudo chmod -R 775 "$SITE"
sudo find "$SITE" -type d -exec chmod g+s {} \;
# echo ">>> Ricarica Apache..."
# sudo systemctl reload httpd
echo ""
echo "=== WordPress installato! ==="
echo " Cartella : $SITE_DIR"
echo " Database : $DB_NAME"
if [ "$APACHE_PORT" = "80" ]; then
echo " URL : $URL_PREFIX/$SITE"
else
echo " URL : $URL_PREFIX:$APACHE_PORT/$SITE"
fi
}
delete_wp() {
SITE=$1
DB_NAME=$2
if [ -z "$SITE" ] || [ -z "$DB_NAME" ]; then
echo "Uso: wp-manager.sh delete <nomecartellasito> <nomedb>"
exit 1
fi
SITE_DIR="$WEB_ROOT/$SITE"
read -p "Sei sicuro di voler eliminare '$SITE'? (s/N): " CONFIRM
if [[ "$CONFIRM" != "s" && "$CONFIRM" != "S" ]]; then
echo "Operazione annullata."
exit 0
fi
echo ">>> Rimozione cartella..."
sudo rm -rf "$SITE_DIR"
echo ">>> Rimozione database..."
sudo mariadb -u root -p"$DB_ROOT_PASSWORD" -e "
DROP DATABASE IF EXISTS $DB_NAME;
"
}
list_wp() {
echo "=== Istanze WordPress in $WEB_ROOT ==="
echo ""
FOUND=0
for DIR in "$WEB_ROOT"/*/; do
if [ -f "${DIR}wp-config.php" ]; then
FOUND=1
NAME=$(basename "$DIR")
DB=$(grep "DB_NAME" "${DIR}wp-config.php" | grep -o "'[^']*'" | sed -n '2p' | tr -d "'")
echo " [$NAME]"
echo " Cartella : $DIR"
echo " Database : $DB"
if [ "$APACHE_PORT" = "80" ]; then
echo " URL : $URL_PREFIX/$NAME"
else
echo " URL : $URL_PREFIX:$APACHE_PORT/$NAME"
fi
echo ""
fi
done
if [ $FOUND -eq 0 ]; then
echo " Nessuna istanza trovata."
fi
}
case "$1" in
create) create_wp "$2" "$3" ;;
delete) delete_wp "$2" "$3" ;;
list) list_wp ;;
*)
echo "Uso:"
echo " wp-manager.sh create <nome> <db_name>"
echo " wp-manager.sh delete <nome> <db_name>"
echo " wp-manager.sh list"
;;
esac
Per rendere eseguibile lo script
sudo chmod +x /usr/local/bin/wp-manager.sh
Esempi d'uso dello script
# creo una nuova istanza con nome cartella "miosito" e nome database "miosito_db"
wp-manager.sh create miosito miosito_db
# elenco le istanze disponbili
wp-manager.sh list
# cancello l'istanza con nome cartella "miosito" e nome database "miosito_db"
wp-manager.sh delete miosito miosito_db
Dopo create, apri il browser su http://localhost:34580/miosito per completare l'installazione di WordPress.
Certificati SSL/TLS per i siti Apache
Usiamo Certbot con Let's Encrypt per i siti raggiungibili da internet. Let's Encrypt fornisce certificati gratuiti e riconosciuti da tutti i browser.
# Installare Certbot
sudo dnf install certbot python3-certbot-apache -y
# Ottenere e installare il certificato (modifica automaticamente il virtual host)
sudo certbot --apache -d miosito.com -d www.miosito.com
# Certbot chiederà:
# - indirizzo email per notifiche di scadenza
# - accettazione termini di servizio
# - se redirigere HTTP → HTTPS automaticamente (consigliato: sì)
Il certificato viene rinnovato automaticamente. Puoi testare il rinnovo con:
sudo certbot renew --dry-run
Per Elencare i certificati Let's Encrypt gestiti da Certbot
sudo certbot certificates
Per rimuovere un certificato Let's Encrypt:
# Revocare e cancellare il certificato
sudo certbot delete --cert-name miosito.com
# In alternativa, solo revocare (mantiene i file)
sudo certbot revoke --cert-path /etc/letsencrypt/live/miosito.com/fullchain.pem
# Dopo la cancellazione, rimuovere il virtual host HTTPS se non più necessario
sudo rm /etc/httpd/conf.d/miosito-ssl.conf
sudo systemctl reload httpd