install-vps.sh (1974B)
1 #!/bin/sh 2 # Instala el servidor de un juego en un VPS con systemd. Correr como root en el VPS: 3 # 4 # sh install-vps.sh <juego> <puerto> <binario> [descripcion] 5 # ej: sh install-vps.sh catan 7373 ./catan-server "Servidor de Catan" 6 # 7 # Crea el usuario <juego>, guarda las partidas en /var/lib/<juego> y deja 8 # <juego>-server corriendo con systemd. 9 set -e 10 NAME=$1; PORT=$2; BIN=$3; DESC=${4:-"Servidor de $1"} 11 if [ -z "$NAME" ] || [ -z "$PORT" ] || [ -z "$BIN" ]; then 12 echo "uso: $0 <juego> <puerto> <binario> [descripcion]" >&2 13 exit 1 14 fi 15 install -m 755 "$BIN" /usr/local/bin/$NAME-server 16 id $NAME >/dev/null 2>&1 || useradd --system --home /var/lib/$NAME --shell /usr/sbin/nologin $NAME 17 install -d -o $NAME -g $NAME -m 700 /var/lib/$NAME 18 cat > /etc/systemd/system/$NAME-server.service <<UNIT 19 # /etc/systemd/system/$NAME-server.service 20 [Unit] 21 Description=$DESC 22 After=network-online.target 23 Wants=network-online.target 24 25 [Service] 26 User=$NAME 27 Group=$NAME 28 ExecStart=/usr/local/bin/$NAME-server --port $PORT --data /var/lib/$NAME 29 Restart=on-failure 30 StateDirectory=$NAME 31 NoNewPrivileges=yes 32 ProtectSystem=strict 33 ProtectHome=yes 34 PrivateTmp=yes 35 ReadWritePaths=/var/lib/$NAME 36 StateDirectoryMode=0700 37 38 [Install] 39 WantedBy=multi-user.target 40 UNIT 41 chmod 644 /etc/systemd/system/$NAME-server.service 42 # herramienta de administracion (blanquear contrasenas, listar partidas); la llave del 43 # asiento usa el prefijo "<juego>-asiento" como el cliente (seat_key en linux/online.c). 44 # Solo para los juegos que entran con nombre + contrasena (hoy, Catan). 45 ADMIN=$(dirname "$0")/admin.sh 46 if [ -f "$ADMIN" ] && [ "$NAME" = catan ]; then 47 sed -e "s/^NAME=.*/NAME=$NAME/" -e "s/^PORT=.*/PORT=$PORT/" -e "s/^KEY_PREFIX=.*/KEY_PREFIX=$NAME-asiento/" \ 48 "$ADMIN" > /usr/local/bin/$NAME-admin 49 chmod 755 /usr/local/bin/$NAME-admin 50 fi 51 systemctl daemon-reload 52 systemctl enable --now $NAME-server 53 echo "Listo. AbrĂ el puerto $PORT/tcp en el firewall. Logs: journalctl -u $NAME-server -f"