[Altro] Gestire ottimamente l'esecuzione dei server

Ciao a tutti.
In questa guida mostrerò come gestire in maniera più ottimale del classico run.sh dentro uno screen l'esecuzione dei server di Minecraft.
Non stravolgerò completamente il sistema esistente, ma aggiungerò un pezzo al puzzle che renderà il tutto notevolmente più facile da gestire.

Pre-requisiti


  • Conoscenze a livello medio di come gestire un server Linux: il sistema che sto per presentare se configurato male può portare a falle molto gravi nella sicurezza dell'intero server.
  • Aver già il sistema di avvio classico (il run.sh dentro ad uno screen) pronto e funzionante
  • Un server con Linux (ho testato tutto su Ubuntu 12.04)

Come funziona questo sistema

Premetto subito che questo sisterma non intaccherà il modo in cui accedete alla console (sempre con gli screen quindi), ma il modo in cui si avvia il server.
Componente fondamentale di questo sistema è supervisord. Esso è un process-manager da affiancare al normale gestore dei processi.
È scritto in Python che offre molte più funzioni rispetto al gestore di processi tradizionale e dagli altri gestori di processi.
Una sua funzionalità molto potente è l'autorestart, che significa che quando un processo crasha lui lo riavvia istantaneamente.
Per chi ci capisce un po di più, il suo punto forte è spawnare i programmi che gestisce come subprocessi di se stesso, in modo che riesce ad ottenere i segnali destinati al programma gestito istantaneamente e in maniera del tutto trasparente. Ciò significa che può effettuare certe operazioni come l'autorestart o la panoramica dei processi senza doversi appoggiare agli inaffidabili pidfile.

L'altro componente di questo sistema è uno script Python scritto da me che permette di interfacciare supervisord con i server Minecraft.
Infatti, supervisord non è in grado di gestire nativamente i programmi eseguiti dentro gli screen, ma il mio script fa da wrapper attorno allo screen per potersi interfacciare correttamente.


Mi hai convinto, iniziamo!

È sottinteso che bisogna essere loggati da root nel server!

Per prima cosa è necessario installare le due dipendenze necessarie ad installare supervisord, cioè Python 2 e PIP.
Per far questo in Ubuntu/Debian digitiamo:

Codice:
apt-get install python python-pip
Su CentOS/Fedora:

Codice:
yum install python python-pip

Fatto questo procediamo ad installare supervisord tramite PIP:
Codice:
pip install supervisor


Scarichiamo e configuriamo il wrapper

Per scaricare il wrapper ed iniziare la configurazione eseguiamo il seguente comando:

Codice:
wget -O /path/to/wrapper.py https://gist.githubusercontent.com/pietroalbini/11149118/raw/7f4ba936b64be45dd3c4784c55c0245b9fe49150/wrapper.py
chmod +x /path/to/wrapper.py
nano /path/to/wrapper.py
Sostituiamo /path/to con una directory in cui potremo ritrovare il file successivamente (io consiglio la directory stessa del server).
All'interno del file alla riga 25 sostituiamo /path/to/run.sh con il percorso assoluto del file di avvio del server.
Alla riga 28 sostituiamo stop con il comando da dare alla console per spegnere il server (solitamente si può lasciare invariato).
Alla riga 32 sostituiamo 5 con il tempo in secondi che ci mette solitamente il server a spegnersi (meglio abbondare).
Alla riga 38 sostituiamo minecraft con il nome dello screen a cui normalmente accediamo per usare la console.

Configuriamo supervisord

Ok, ora è necessario configurare supervisord. Prestare molta attenzione in quanto una configurazione errata potrebbe portare ad aprire grosse vulnerabilità nell'intero sistema.

Per prima cosa creiamo il file di configurazione:

Codice:
touch /etc/supervisord.conf
chmod 0600 /etc/supervisord.conf
nano /etc/supervisord.conf

All'interno del file di configurazione inseriamo il seguente contenuto:

Codice:
[inet_http_server]
port=127.0.0.1:9001
username=myself
password=changemeplease

[supervisord]
logfile=/var/log/supervisord.log
pidfile=/var/run/supervisord.pid

[rpcinterface:supervisor]
supervisor.rpcinterface_factory = supervisor.rpcinterface:make_main_rpcinterface

[supervisorctl]
serverurl=http://127.0.0.1:9001
username=myself
password=changemeplease

[program:minecraft]
command=/path/to/wrapper.py
directory=/path/to/server/directory
autostart=false
autorestart=unexpected
user=server_owner
Alla riga 2 sostituiamo 9001 con una porta a nostra scelta (deve essere libera).
Alle righe 3 e 4 sostituiamo myself e changemeplease con un username ed una password a nostra scelta. Queste serviranno per proteggere supervisord.
Alla riga 14 sostituiamo 9001 con la porta scelta sopra.
Alle righe 15 e 16 sostituiamo myself e changemeplease con username e password scelti prima. Questo permetterà di non dover inserire username e password quando si userà supervisord da terminale.
Alla riga 18 sostituiamo minecraft con il nome che vogliamo dare all'istanza di questo server (opzionale; necessario solo se avete più server).
Alla riga 19 sostituiamo /path/to/my/wrapper.py con la posizione assoluta del file wrapper.py scaricato precedentemente.
Alla riga 20 sostituiamo /path/to/server/directory con la posizione assoluta della directory in cui risiedono i file del server.
Alla riga 23 sostituiamo server_owner con l'utente che potrà accedere allo screen.

Ed ora?

Beh, ora hai configurato tutto, non ti resta che ammirare il risultato delle tue fatiche!
Per prima cosa spegnamo il server se è in funzione.
Dopo di questo avviamo supervisord con il seguente comando:

Codice:
supervisord -c /etc/supervisord.conf
Benissimo! Ora supervisord è stato avviato!

Per avviare il server digitiamo il seguente comando:

Codice:
supervisorctr start minecraft
Sostituiamo minecraft con il nome dell'istanza (se cambiato precedentemente).

Per stoppare il server digitiamo il seguente comando:
Codice:
supervisorctr stop minecraft
Sostituiamo minecraft con il nome dell'istanza (se cambiato precedentemente).

Per controllare lo stato del server digitiamo il seguente comando:
Codice:
supervisorctr status

Per accedere alla console utilizziamo il classico comando:
Codice:
screen -x minecraft
Sostituiamo minecraft con il nome dello screen (se cambiato precedentemente).

Note varie

  • Supervisor dispone di un interfaccia web raggiungibile all'indirizzo http://ip.del.tuo.server:porta_di_supervisord/. Anche se è protetta da password, è vivamente consigliato bloccare la porta di supervisord dal firewall per prevenire accessi esterni
  • Non stoppare il server con /stop (in-game) o stop (dalla console). Per supervisord se il server viene stoppato senza un segnale di stop da supervisor stesso il server è crashato, e quindi procede a riavviarlo automaticamente.
  • Volendo è possibile utilizzare gli Unix Domain Socket al posto dei socket TCP. Consultare la documentazione di supervisord per maggiori informazioni.
  • In caso si volesse avviare supervisord automaticamente all'avvio del sistema seguire le istruzioni di questa pagina della documentazione.
  • No, supervisord NON funziona su Windows.
  • State veramente leggendo tutta questa roba?
  • È possibile avviare il server all'avvio si supervisord cambiando alla riga 24 del file /etc/supervisord.conf false con true
  • È possibile unire più server in un gruppo per gestirli come un unico server (questo è comodo con bungeecord). Consultare la documentazione di supervisord per maggiori informazioni.
  • Supervisord non serve solo per gestire server di Minecraft, ma per tantissime altre cose. Magari vi potrebbero tornare utili.
Licenza
Lo script wrapper.py è stato creato da me (Pietro Albini) ed è rilasciato sotto licenza GNU-GPL v3.
Non mi assumo alcuna responsabilità per gli ipotetici danni causati da questa guida/lo script di wrapper.
2 utenti apprezzano questo post
Guida utile (non l'ho letta tutta) io tempo fa avevo un vps linux dai se è possibile eseguire la condivisione schermo in qualche modo?

Inviato dal mio GT-I9300 utilizzando Tapatalk
Inviato dal mio computer accanto al mio Creeper Supercharged addomesticato...
(21/04/2014, 20:43)099tintin ha scritto: Guida utile (non l'ho letta tutta) io tempo fa avevo un vps linux dai se è possibile eseguire la condivisione schermo in qualche modo?

Certo che è possibile, ma non è per niente conveniente! Per farlo infatti devi installare un server Xorg e un desktop enviroment che consumerebbero la maggior parte della memoria RAM, oltre ad un sistema di desktop remoto.
Poi non ci vuole molto per imparare ad usare agevolmente il terminale Wink
OK grazie perchè ho provato il vps ma non fa per me XD Piú che altro io la avrei messa (la condivisione) momentanemente per installare bukkit

Inviato dal mio GT-I9300 utilizzando Tapatalk
Inviato dal mio computer accanto al mio Creeper Supercharged addomesticato...
(21/04/2014, 20:56)099tintin ha scritto: OK grazie perchè ho provato il vps ma non fa per me XD Piú che altro io la avrei messa (la condivisione) momentanemente per installare bukkit

Inviato dal mio GT-I9300 utilizzando Tapatalk

"Google + CTRL+C + CTRL+V" is the way!!!

Significa cerca su google, copi i comandi, adattandoli, e incolli nella console. È semplice. Se hai problemi installi linux server su VirtualBox nel tuo pc e provi in locale.


My Config:
    MotherBoard: GigaByte 990 FX A-UD3 Ultra Durable
    CPU: AMD FX-8350 (8 core, 4.00GHz)
    Dissipatore: ThermalRight Macho HR-02 Rev.a
    RAM: Corsair Vengeance 8GB 4GBx2
    GPU: nVidia GTX 780 Asus OC
    PSU: Corsair CX 750M
    Case: Cooler Master 690 III Midi
    SSD 256GB
    HHD 1TB
    Masterizzatore
(21/04/2014, 21:03)xXSkiFire13Xx ha scritto:
(21/04/2014, 20:56)099tintin ha scritto: OK grazie perchè ho provato il vps ma non fa per me XD Piú che altro io la avrei messa (la condivisione) momentanemente per installare bukkit

Inviato dal mio GT-I9300 utilizzando Tapatalk

"Google + CTRL+C + CTRL+V" is the way!!!

Significa cerca su google, copi i comandi, adattandoli, e incolli nella console. È semplice. Se hai problemi installi linux server su VirtualBox nel tuo pc e provi in locale.
Ma anche no!
Primo: se fai CTRL+C taante brutte cose iniziano ad accadere (e non sto scherzando). Quindi devi usare CTRL+SHIFT+C e CTRL+SHIFT+V.
Secondo: non devi limitarti a copiare, altrimenti non impari niente, devi sbatterci la testa ed imparare come funzionano!
2 utenti apprezzano questo post
(21/04/2014, 21:51)pietro98th ha scritto:
(21/04/2014, 21:03)xXSkiFire13Xx ha scritto:
(21/04/2014, 20:56)099tintin ha scritto: OK grazie perchè ho provato il vps ma non fa per me XD Piú che altro io la avrei messa (la condivisione) momentanemente per installare bukkit

Inviato dal mio GT-I9300 utilizzando Tapatalk

"Google + CTRL+C + CTRL+V" is the way!!!

Significa cerca su google, copi i comandi, adattandoli, e incolli nella console. È semplice. Se hai problemi installi linux server su VirtualBox nel tuo pc e provi in locale.
Ma anche no!
Primo: se fai CTRL+C taante brutte cose iniziano ad accadere (e non sto scherzando). Quindi devi usare CTRL+SHIFT+C e CTRL+SHIFT+V.
Secondo: non devi limitarti a copiare, altrimenti non impari niente, devi sbatterci la testa ed imparare come funzionano!

Per le cose più complicate faccio così Tongue poi se mi servono ancora provo a ricordare (ricordo bene) e se sbaglio so ritrovare la pagina da cui l'ho preso. Comunque non serve tante nozioni per creare un server tramite console e ftp su linux.


My Config:
    MotherBoard: GigaByte 990 FX A-UD3 Ultra Durable
    CPU: AMD FX-8350 (8 core, 4.00GHz)
    Dissipatore: ThermalRight Macho HR-02 Rev.a
    RAM: Corsair Vengeance 8GB 4GBx2
    GPU: nVidia GTX 780 Asus OC
    PSU: Corsair CX 750M
    Case: Cooler Master 690 III Midi
    SSD 256GB
    HHD 1TB
    Masterizzatore
Ma usare un controllo PID in bash no eh?

Installare nmila software di cui uno instabile e che offre una falla di sicurezza grossa con il traforo del monte bianco ( remote exec over http )...bah io ste cose esotiche non le capisco proprio...
Vuoi giocare moddato? Clicca quì!
[Immagine: IKMizww.png][Immagine: 6S8nQyK.png]
(22/04/2014, 14:11)Fantazzini4Ever ha scritto: Ma usare un controllo PID in bash no eh?

Installare nmila software di cui uno instabile e che offre una falla di sicurezza grossa con il traforo del monte bianco ( remote exec over http )...bah io ste cose esotiche non le capisco proprio...

La soluzione con supervisord è comoda nel caso in cui si devono gestire più server con bungeecord, in quanto permette di avviarli/bloccarli tutti con un solo comando. Inoltre fornisce un'alternativa più semplice alle stesse funzioni permesse dal sistema operativo (per esempio l'avvio automatico, che richiederebbe scrivere un file di init).

Supervisord non è instabile, anzi, è molto usato in altri ambiti (non minecraft), per esempio daemonizzazione di script e gestione dei server fastcgi. Come ho scritto per bloccare l'interfaccia web si può o bloccare la porta dal firewall od usare i socket unix, ma questi ultimi potevano fornire alcuni problemi se si voleva avviare il server non da root.

Sei ovviamente libero di non usare questa guida, io usando ed abusando di supervisord per quello che faccio all'esterno di Minecraft ho creato questo wrapper per me (che mi tornerà utile), e l'ho pubblicato qui perché mi era venuto bene, non come obbiettivo finale.

Pietro.
Complimenti @pietro98th+1 meritato!
Non rispondo a richieste di supporto in privato!

Moderatore&Neswer
Sviluppatore

Discussioni simili
Risposta di gamer891962
18/06/2018, 11:55
Risposta di Maxetto
01/05/2018, 16:51
Risposta di Maxetto
04/04/2018, 16:21

Utente(i) che stanno guardando questa discussione: 1 Ospite(i)