diff --git a/Dockerfile b/Dockerfile new file mode 100644 index 0000000..2553613 --- /dev/null +++ b/Dockerfile @@ -0,0 +1,32 @@ +FROM debian:bookworm-slim + +LABEL author="Makaren0" maintainer="Makaffe@hotmail.com" + +ENV DEBIAN_FRONTEND=noninteractive +ENV DEBCONF_NOWARNINGS="yes" + +RUN apt update; apt upgrade -y\ + && dpkg --add-architecture i386 \ + && apt install -y unzip curl wget tar gzip python3 ca-certificates + +RUN apt-get update \ + && apt-get clean \ + && apt-get autoremove + +RUN apt-get install -y lib32gcc-s1 libicu-dev + +RUN apt --fix-broken install \ + && apt-get update \ + && apt-get upgrade -y \ + && dpkg --configure -a \ + && apt-get install -f + +RUN adduser --disabled-password --home /home/container container +USER container +ENV USER=container HOME=/home/container + +WORKDIR /home/container + +COPY ./entrypoint.sh /entrypoint.sh + +CMD ["/bin/bash", "/entrypoint.sh"] diff --git a/entrypoint.sh b/entrypoint.sh new file mode 100644 index 0000000..b3de94c --- /dev/null +++ b/entrypoint.sh @@ -0,0 +1,354 @@ +#!/bin/bash + +# Advertencia: El script podría no estar preparado para producción, si este es su caso, siéntase libre de editar el script según sus requisitos. +# Advertencia: No se recomienda ejecutar este script como root. +# Assembled by: Makaren0 + + +echo -e "╔═════════════════════╗" +echo -e "║ EntryPoint.sh ║" +echo -e "╚═════════════════════╝\n" + + +# VARIABLES DE CONFIGURACION # +#1.Configuración cuentas steam +# steamcmd esta alojado en el directorio principal del usuario que ejecuta el script +STEAM_ACCOUNT="anonymous" # For security reasons, it is recommended that you create a new Steam account just for your dedicated servers. +STEAM_PSW="" # Leave it blank to disable +STEAM_GUARD="" # Steam guard code for first login +GSLT_TOKEN="E28A6DFBF5961B7C6DCB439E420728A1" # Necesario para mostrar el server en la lista publica Note:Valve sais cs2 generate automatically + +#2.Configuración del juego +SERVER_IP="" # Sobreescribe las configuraciones desde Pterodactyl +SERVER_PORT="" # Sobreescribe las configuraciones desde Pterodactyl +MAX_PLAYERS="20" +DEFAULT_START_MAP="de_nuke" # Deshabilitado si se usan mapas de la workshop +WORKSHOP_START_MAP="" # https://steamcommunity.com/sharedfiles/filedetails/?id=125488374 + +UPDATE_ON_BOOT="1" # Actualiza el servidor mediante steamcmd ANTES de descargar cualquier otro externo. Usa 1 para activarlo, cualquier otra cosa para desactivarlo +VAC="1" # Habilita el uso de VAC en el servidor. Usa 1 para activarlo, cualquier otra cosa para desactivarlo +SRCDS_DEBUG="0" # Habilita -debug en los argumentos de srcds +METAMOD="0" + +LAUNCH_ARGS="-dedicated +ip ${SERVER_IP} -port ${SERVER_PORT} -maxplayers ${MAX_PLAYERS}" +EXTRA_ARGS="" + +# API_AUTHORIZATION_KEY="" #https://steamcommunity.com/dev/apikey +# WORKSHOP_COLLECTION_ID="" #https://steamcommunity.com/sharedfiles/filedetails/?id=125499818 + +# Workshop maps. More info: https://developer.valvesoftware.com/wiki/CSGO_Workshop_For_Server_Operators +# CSGO OLD - EXTRAPARAMS="-nohltv +sv_pure 0 +game_type 0 +game_mode 0" # Puedes usar -autoupdate en los argumentos para actualizar automaticamente el servidor +# CSGO OLD - LAUNCH_ARGS="-nobreakpad -game csgo -console -usercon -secure -maxplayers_override ${MAX_PLAYERS} -tickrate ${TICKRATE} +sv_setsteamaccount ${GSLT_TOKEN} -net_port_try 1 +net_public_adr ${IP} +hostport ${PORT} ${EXTRAPARAMS}" +# AUTO_UPDATE="1" # Se refiere a la comprobación que hace el juego MIENTRAS esta corriendo para actualizar el servidor automaticamente. Usa 1 para activarlo, cualquier otra cosa para desactivarlo +# TICKRATE="64" + + + + +# # # # # # # # +# SCRIPT INIT # +# # # # # # # # +APP_ID="730" +SCREEN_NAME="CS2-SERVER-PRACTICE" +RUNSCRIPT_USER=$USER # Se puede usar cualquier usuario sin privilegios de administrador. En este caso al estar utilizando un servicio de Linux directamente obtendremos la variable de entorno $USER +SERVER_DIR=$PWD +SRCDS_RUN="$SERVER_DIR/game/bin/linuxsteamrt64/cs2" + +# Define la ubicación del archivo de registro de screen +# Define alojamiento de backups +LOG_FILE="$SERVER_DIR/screen-log-gameserver.log" +BACKUP="1" # Backups sobre la configuracion y plugins de Source Mods +BACKUP_DIR="$SERVER_DIR/backups" # Directorio de las backups de plugins y configuraciones de SourceMod +MAX_BACKUPS="10" + + +# Comprobar parametros desde Pterodactyl +if [[ ! -z $P_STEAM_ACCOUNT ]]; then + STEAM_ACCOUNT=$P_STEAM_ACCOUNT +fi +if [[ ! -z $P_STEAM_ACCOUNT ]]; then + STEAM_ACCOUNT=$P_STEAM_ACCOUNT +fi +if [[ ! -z $P_STEAM_GUARD ]]; then + STEAM_GUARD=$P_STEAM_GUARD +fi +if [[ ! -z $P_STEAM_PSW ]]; then + STEAM_PSW=$P_STEAM_PSW +fi +if [[ ! -z $P_MAX_PLAYERS ]]; then + MAX_PLAYERS=$P_MAX_PLAYERS +fi +if [[ ! -z $P_GSLT_TOKEN ]]; then + GSLT_TOKEN=$P_GSLT_TOKEN +fi +if [[ ! -z $P_VAC ]]; then + VAC=$P_VAC +fi +if [[ ! -z $P_UPDATE_ON_BOOT ]]; then + UPDATE_ON_BOOT=$P_UPDATE_ON_BOOT +fi +if [[ ! -z $P_SRCDS_DEBUG ]]; then + SRCDS_DEBUG=$P_SRCDS_DEBUG +fi +if [[ ! -z $P_EXTRA_ARGS ]]; then + EXTRA_ARGS=$P_EXTRA_ARGS +fi +if [[ ! -z $P_SERVER_IP ]]; then + SERVER_IP=$P_SERVER_IP +fi +if [[ ! -z $P_SERVER_PORT ]]; then + SERVER_PORT=$P_SERVER_PORT +fi +if [[ ! -z $P_METAMOD ]]; then + METAMOD=$P_METAMOD +fi +if [[ ! -z $P_WORKSHOP_START_MAP ]]; then + WORKSHOP_START_MAP=$P_WORKSHOP_START_MAP +fi + + +# Componer el nuevo argumento de lanzamiento combinado desde Pterodactyl, para que de alguna manera puedan interpretarse a la vez, tanto desde este script como Pterodactyl +if [[ ! -z $STARTUP ]]; then + LAUNCH_ARGS="$STARTUP +ip ${SERVER_IP} -port ${SERVER_PORT} -maxplayers ${MAX_PLAYERS}" +fi + + +# Añadir los parametros de lanzamiento extra +if [[ ! -z $EXTRA_ARGS ]]; then + LAUNCH_ARGS=$LAUNCH_ARGS $EXTRA_ARGS +fi + + +# Comprobar si existe un directorio home adecuado +if [ ! -d "$HOME" ]; then + echo "No se puede encontrar o no se tienen permisos en la carpeta principal home del usuario: $USER" + exit 1 +else + if [ ! -w "$HOME" ] || [ ! -r "$HOME" ]; then + echo "No se tienen permisos de lectura o escritura dentro del directorio home del usuario: $USER" + exit 1 + fi +fi + +# Comprobar si existe el directorio principal donde se ejecuta el juego y alcanzarlo +if [ ! -d "$SERVER_DIR" ]; then + # Si el directorio no existe, crearlo + mkdir -p "$GAME_DIR" + echo "Se ha creado el directorio $GAME_DIR" +fi +cd $SERVER_DIR + +# SteamCMD Descarga e instala steamcmd si no existe. +STEAMCMD_DIR="$HOME/steamcmd" +if [ ! -d "$STEAMCMD_DIR" ]; then + echo "|> NO SE HA ENCONTRADO STEAMCMD. Descargando e instalando steamcmd..." + mkdir -p "$STEAMCMD_DIR" + cd "$STEAMCMD_DIR" + wget -O "steamcmd_linux.tar.gz" "https://steamcdn-a.akamaihd.net/client/installer/steamcmd_linux.tar.gz" + tar -xvzf steamcmd_linux.tar.gz + rm steamcmd_linux.tar.gz +fi + +# Crear un script de actualizacion automatica para el servidor +# STEAM_RUNSCRIPT="$STEAMCMD_DIR/server_autoupdate_script_${SCREEN_NAME}.txt" +# touch "$STEAM_RUNSCRIPT" + +# echo "force_install_dir $SERVER_DIR" > "$STEAM_RUNSCRIPT" +# if [ -z "$STEAM_PSW" ]; then +# echo "login anonymous" >> "$STEAM_RUNSCRIPT" +# else +# echo "login $STEAM_ACCOUNT $STEAM_PSW" >> "$STEAM_RUNSCRIPT" +# fi +# echo "app_update $APP_ID" >> "$STEAM_RUNSCRIPT" +# echo "quit" >> "$STEAM_RUNSCRIPT" + +# chown ${USER} "$STEAM_RUNSCRIPT" +# chmod 666 "$STEAM_RUNSCRIPT" + +# Lanzar steamcmd para comprobar actualizaciones del cliente +$STEAMCMD_DIR/steamcmd.sh +quit + +# Crear enlaces simbolicos para conectar con steamcmdclient desde el usuario +mkdir -p ~/.steam/sdk32/ +mkdir -p ~/.steam/sdk64/ +rm "$HOME/.steam/sdk32/steamclient.so" +ln -s $STEAMCMD_DIR/linux32/steamclient.so ~/.steam/sdk32/steamclient.so # Enlazar los ejecutables de steam al directorio del usuario para actualizar automaticamente (AUTO_UPDATE variable) +ln -s $STEAMCMD_DIR/linux64/steamclient.so ~/.steam/sdk64/steamclient.so +#ln -s "$STEAMCMD_DIR/linux32/steamcmd" "$STEAMCMD_DIR/linux32/steam" # Esto se hace debido a que Volvo esta completamente loco. +#ln -s "$STEAMCMD_DIR/steamcmd.sh" "$STEAMCMD_DIR/steam.sh" # Esto se hace debido a que Volvo esta completamente loco. +echo "|> steamcmd completamente instalado" + + +# # Establecer la actualizacion automatica propia de CS2 +# if [ "$AUTO_UPDATE" = "1" ]; then +# LAUNCH_ARGS="${LAUNCH_ARGS} -autoupdate -steam_dir $STEAMCMD_DIR -steamcmd_script server_autoupdate_script_${SCREEN_NAME}.txt" +# echo "|> ACTIVADA Actualizacion propia del juego mediante argumentos" +# fi + +# Verificar si se utilizan mapas de la workshop +if [ -n "$WORKSHOP_START_MAP" ]; then + LAUNCH_ARGS="${LAUNCH_ARGS} +map $DEFAULT_START_MAP +host_workshop_map ${WORKSHOP_START_MAP}" +else + LAUNCH_ARGS="${LAUNCH_ARGS} +map $DEFAULT_START_MAP" + echo "|> No se han definido mapas de la workshop o API. Continuando con ${DEFAULT_START_MAP}..." +fi + + +# Uso de Valve-Anticheat +if [ "$VAC" != "1" ]; then + LAUNCH_ARGS="${LAUNCH_ARGS} -insecure" + echo "|> VAC Anticheat desativado desde configuracion" +fi + + +# Hacer el uso de debug +if [ "$SRCDS_DEBUG" = "1" ]; then + LAUNCH_ARGS="${LAUNCH_ARGS} -debug" +fi + + +# Actualiza el servidor de CSGO +echo "|> UPDATE on boot server... running steamcmd" +cd "$STEAMCMD_DIR" +if [ "$UPDATE_ON_BOOT" = "1" ]; then + if [ -z "$STEAM_PSW" ]; then + ./steamcmd.sh +force_install_dir "$SERVER_DIR" +login anonymous +app_update $APP_ID +quit + else + ./steamcmd.sh +force_install_dir "$SERVER_DIR" +login "$STEAM_ACCOUNT" "$STEAM_PSW" "$STEAM_GUARD" +app_update $APP_ID +quit + fi +fi + +# Instalar o actualizar MetaMod +echo "4.Actualizando MetaMod" +MM_VERSION_FILE="$SERVER_DIR/MM_installed_version.txt" +METAMOD_VERSION_URL="https://mms.alliedmods.net/mmsdrop/2.0/mmsource-latest-linux" +METAMOD_VERSION_URL=$(wget -qO- "$METAMOD_VERSION_URL") + +if [ "$METAMOD" = "1" ]; then + if [ ! -d $MM_VERSION_FILE ]; then + touch $MM_VERSION_FILE + chown ${USER} "$MM_VERSION_FILE" + chmod 600 "$MM_VERSION_FILE" + fi + if [ ! "$METAMOD_VERSION_URL" = "$(cat $MM_VERSION_FILE)" ]; then + echo "Se ha encontrado una última versión distinta a la ya instalada" + echo "Actual MM version: $(cat $MM_VERSION_FILE) | New MM version: $METAMOD_VERSION_URL" + + echo "$METAMOD_VERSION_URL" > $MM_VERSION_FILE + + METAMOD_DOWNLOAD_BY_VERSION_URL="https://mms.alliedmods.net/mmsdrop/2.0/$METAMOD_VERSION_URL" + DROP_MM_DIR="${SERVER_DIR}/game/csgo" # For download the binaries + METAMOD_DIR="${SERVER_DIR}/game/csgo/addons/metamod" # Fixes news installations + + if [ ! -d "$METAMOD_DIR" ]; then + echo "Instalando MetaMod..." + mkdir -p "$METAMOD_DIR" + else + echo "Actualizando MetaMod..." + fi + if wget -qO- "$METAMOD_DOWNLOAD_BY_VERSION_URL" | tar -xz -C "$DROP_MM_DIR"; then + echo "El archivo se descargó y descomprimió correctamente." + echo "MetaMod instalado/actualizado con éxito." + else + echo "Error: No se pudo descargar o descomprimir el archivo." + exit 1 + fi + # Comprobar y activar el mecanismo de carga de plugins hacia Source2 + # ya ves + + else + echo "La ultima version de MM es la misma que la actualmente instalada." + fi +fi + +# Instalar o actualizar SourceMod +# echo "5.Actualizando SourceMod" +# SM_VERSION_FILE="$SERVER_DIR/SM_installed_version.txt" +# SOURCEMOD_VERSION_URL="https://sm.alliedmods.net/smdrop/1.11/sourcemod-latest-linux" +# SOURCEMOD_VERSION_URL=$(wget -qO- "$SOURCEMOD_VERSION_URL") + +# if [ ! -d $SM_VERSION_FILE ]; then +# touch $SM_VERSION_FILE +# chown ${USER} "$SM_VERSION_FILE" +# chmod 600 "$SM_VERSION_FILE" +# fi +# if [ ! "$SOURCEMOD_VERSION_URL" = "$(cat $SM_VERSION_FILE)" ]; then +# echo "Se ha encontrado una última versión distinta a la ya instalada" +# echo "Actual SM version: $(cat $SM_VERSION_FILE) | New SM version: $SOURCEMOD_VERSION_URL" + +# echo "$SOURCEMOD_VERSION_URL" > $SM_VERSION_FILE + +# SOURCEMOD_VERSION_URL="https://sm.alliedmods.net/smdrop/1.11/$SOURCEMOD_VERSION_URL" +# SOURCEMOD_DIR="$SERVER_DIR/csgo/addons/sourcemod" +# if [ ! -d "$SOURCEMOD_DIR" ]; then +# echo "Instalando SourceMod desde cero..." +# mkdir -p "$SOURCEMOD_DIR" +# wget -qO- "$SOURCEMOD_VERSION_URL" | tar -xz -C "$SERVER_DIR/csgo" +# echo "SourceMod instalado con éxito." +# else +# if [ "$BACKUP_SM_CFG" = "1" ]; then +# TIMESTAMP=$(date +%Y%m%d_%H%M%S) +# if [ ! -d "$BACKUP_DIR" ]; then +# echo "El directorio de backups no existe: BACKUP_DIR" +# mkdir -p "$BACKUP_DIR" +# echo "Directorio creado: $BACKUP_DIR" +# fi +# tar -czf "$BACKUP_DIR/addons_backup_$TIMESTAMP.tar.gz" -C "$SERVER_DIR/csgo/addons" . +# FILES_COUNT=$(ls -1 $directorio | wc -l) +# if [ $FILES_COUNT -gt $MAX_BACKUPS ]; then +# # Obtener la lista de archivos ordenados por fecha de modificación (el más antiguo al final) +# OLD_FILES=$(ls -1t $BACKUP_DIR | tail -n $(expr $FILES_COUNT - $MAX_BACKUPS)) +# # Eliminar los archivos más antiguos +# rm $BACKUP_DIR/$OLD_FILES +# fi +# echo "Copia de seguridad finalizada" +# fi +# echo "Actualizando SourceMod sin perder la configuración existente..." +# TEMP_DIR="$(mktemp -d)" +# wget -qO- "$SOURCEMOD_VERSION_URL" | tar -xz -C "$TEMP_DIR" +# rm -rf "$TEMP_DIR/cfg" "$TEMP_DIR/addons/sourcemod/configs" "$TEMP_DIR/addons/sourcemod/data" +# cp -R "$TEMP_DIR/addons" "$SERVER_DIR/csgo" +# echo "SourceMod instalado/actualizado con éxito." +# rm -rf "$TEMP_DIR" +# fi +# else +# echo "La ultima version de SM es la misma que la actualmente instalada." +# fi + + + +#Iniciar servidor de CS:GO + +cd "$SERVER_DIR/game/bin/linuxsteamrt64/" +echo "Lanzando servidor >> $SRCDS_RUN $LAUNCH_ARGS" + +$SRCDS_RUN $LAUNCH_ARGS + + +# if [[ -n $INVOCATION_ID ]]; then # Comprobar si el script esta lanzando un servicio o desde el +# echo "El script se está ejecutando desde un archivo .service." +# echo -c "####################\nArgumentos de lanzamiento: ${LAUNCH_ARGS}\n ####################" +# echo "Lanzando servidor el $SCREEN_NAME en 5 segundos..." +# sleep 5 +# $SRCDS_RUN $LAUNCH_ARGS + +# else +# # Lanza el servidor usando screen +# echo -c "####################\nArgumentos de lanzamiento: ${LAUNCH_ARGS}\n ####################" +# echo "Lanzando servidor el $SCREEN_NAME en 5 segundos..." +# echo "El script se está ejecutando manualmente por un usuario." +# sleep 5 +# rm -f screenlog.* +# screen -L -AdmS $SCREEN_NAME $SRCDS_RUN $LAUNCH_ARGS + +# # Espera un momento para que la pantalla tenga tiempo de iniciar +# sleep 1 + +# # Redirige la salida estándar y la salida de error a un archivo de registro +# screen -S $SCREEN_NAME -X logfile $LOG_FILE +# screen -S $SCREEN_NAME -X log on +# echo "La salida se está guardando en $LOG_FILE" + +# echo ".Servidor de CSGO lanzado en la pantalla '$SCREEN_NAME'. Para adjuntar, ejecute: screen -r $SCREEN_NAME" +# exit 0 +# fi