DEV Community

Cover image for Como eu criei um servidor de PalWorld na AWS com start por bot no Discord
Magno Gouveia
Magno Gouveia

Posted on

Como eu criei um servidor de PalWorld na AWS com start por bot no Discord

É difícil não ter ouvido sobre Palworld recentemente, com o sucesso explosivo e mais de 8 milhões de vendas.

Queria jogar com meus amigos e ter um servidor sempre disponível, independente de um de nós hostear. Isso pareceu uma ótima oportunidade para brincar um pouco com a AWS.

Cheguei a testar alguns outros servidores, como Nitrado, mas a falta de servidor no Brasil, quedas constantes e também pouco controle de acesso ao servidor, me fizeram optar por criar o meu próprio servidor em um serviço de cloud privado, como já trabalho com AWS há alguns anos, não tive duvidas e comecei a criar a infra.

Aqui vou mostrar como fiz cada passo.

Criação de um servidor EC2

EC2 é o serviço da AWS para criar “máquinas na cloud”, ao criar uma, a primeira coisa para ter em mente é o tamanho do servidor.

  • Dentro do console da Aws, busque pelo serviço: EC2.

  • No canto esquerdo no menu, selecione Instâncias

  • No canto superior direito, clique em “Executar Instâncias”

Nome e tags

  • Dê um nome para sua instância (eg: PalworldServer)

Application and OS Images (Amazon Machine Image)

  • Neste guia vamos escolher o sistema operacional Ubuntu 22.04 (64bits x86)

Tipo de instância

Pelas configurações ideais dadas pelos desenvolvedores, a maquina deveria ter:

  • 16gb de Ram

  • 4 núcleos de processamento

Optei então pela maquina mais barata que atendesse esses requisitos: t3a.xlarge.

(Você pode buscar o tipo da maquina por configuração na calculadora da aws))

  • Selecione o tipo de instância (t3a.xlarge)

Par de chaves (login)

  • Crie uma par de chaves para fazer o login por ssh:

  • nesse exemplo, vou chamar de palworld-sao-paulo.pem

  • Tipo: RSA

  • Formato: .pem

  • Criar par de chaves

Configurações de Rede

Neste momento não é necessário fazer nenhuma mudança aqui, mas vamos voltar para essa configuração depois de criar a máquina, só lembre de deixar marcado a opção:

Allow SSH traffic from” — “Qualquer lugar” (Só será possível acessar a maquina usando o arquivo .pem criado anteriormente.)

Configurar armazenamento

1x de 20gb gp2 é o suficiente para um servidor, na minha experiência o servidor usa menos de 7gb, mas gosto de deixar espaço para alguma emergência.

(Obs: Não recomendo tentar usar uma instancia spot, mesmo sendo mais barato, a instabilidade de disponibilidade quebra todo o conceito de ter um servidor para jogar com os amigos na hora que você quiser.

Se isso não é um problema pra você e souber o que está fazendo, é uma opção.)

Configuração inicial da maquina linux

Pronto! você tem uma instancia linux preparada para uso, agora vamos configurá-la

  • No console da aws em EC2>Instâncias copie o “Endereço IPv4 público”

  • Usando um terminal (cmd/bash) conecte-se no endereço com o seguinte comando:

$ ssh -i [/endereco/da/chave/palworld-sao-paulo.pem] ubuntu@[seu-endereço-ip]
Enter fullscreen mode Exit fullscreen mode

Com isso você já tem a maquina preparada para receber o servidor, vamos utilizar essa imagem docker-compose:

https://github.com/jammsen/docker-palworld-dedicated-server

  • na home do seu servidor (/home/ubuntu) crie uma pasta palworld
$ mkdir palworld
Enter fullscreen mode Exit fullscreen mode
  • dentro da pasta palworld, crie uma pasta chamada “game”
$ mkdir game
Enter fullscreen mode Exit fullscreen mode
  • Dê permissões de acesso para a pasta game:
$ chmod 777 game 
      ou 
$ chown -R 1000:1000 game/
Enter fullscreen mode Exit fullscreen mode

Crie um arquivo de configuração chamado docker-compose.yml e cole o exemplo abaixo (retirado do github):

 version: '3.9'
    services:
      palworld-dedicated-server:
        #build: .
        container_name: palworld-dedicated-server
        image: jammsen/palworld-dedicated-server:latest
        restart: always
        network_mode: bridge
        ports:
          - target: 8211 # Gamerserver port inside of the container
            published: 8211 # Gamerserver port on your host
            protocol: udp
            mode: host
          - target: 25575 # RCON port inside of the container
            published: 25575 # RCON port on your host
            protocol: tcp
            mode: host
        environment:
          - TZ=Europe/Berlin # Change this for logging and backup, see "Environment-Variables" 
          - ALWAYS_UPDATE_ON_START=true
          - MULTITHREAD_ENABLED=true
          - COMMUNITY_SERVER=true
          - BACKUP_ENABLED=true
          - BACKUP_CRON_EXPRESSION=0 * * * *
          - NETSERVERMAXTICKRATE=120
          - DIFFICULTY=None
          - DAYTIME_SPEEDRATE=1.000000
          - NIGHTTIME_SPEEDRATE=1.000000
          - EXP_RATE=1.000000
          - PAL_CAPTURE_RATE=1.000000
          - PAL_SPAWN_NUM_RATE=1.000000
          - PAL_DAMAGE_RATE_ATTACK=1.000000
          - PAL_DAMAGE_RATE_DEFENSE=1.000000
          - PLAYER_DAMAGE_RATE_ATTACK=1.000000
          - PLAYER_DAMAGE_RATE_DEFENSE=1.000000
          - PLAYER_STOMACH_DECREASE_RATE=1.000000
          - PLAYER_STAMINA_DECREACE_RATE=1.000000
          - PLAYER_AUTO_HP_REGENE_RATE=1.000000
          - PLAYER_AUTO_HP_REGENE_RATE_IN_SLEEP=1.000000
          - PAL_STOMACH_DECREACE_RATE=1.000000
          - PAL_STAMINA_DECREACE_RATE=1.000000
          - PAL_AUTO_HP_REGENE_RATE=1.000000
          - PAL_AUTO_HP_REGENE_RATE_IN_SLEEP=1.000000
          - BUILD_OBJECT_DAMAGE_RATE=1.000000
          - BUILD_OBJECT_DETERIORATION_DAMAGE_RATE=1.000000
          - COLLECTION_DROP_RATE=1.000000
          - COLLECTION_OBJECT_HP_RATE=1.000000
          - COLLECTION_OBJECT_RESPAWN_SPEED_RATE=1.000000
          - ENEMY_DROP_ITEM_RATE=1.000000
          - DEATH_PENALTY=All
          - ENABLE_PLAYER_TO_PLAYER_DAMAGE=false
          - ENABLE_FRIENDLY_FIRE=false
          - ENABLE_INVADER_ENEMY=true
          - ACTIVE_UNKO=false
          - ENABLE_AIM_ASSIST_PAD=true
          - ENABLE_AIM_ASSIST_KEYBOARD=false
          - DROP_ITEM_MAX_NUM=3000
          - DROP_ITEM_MAX_NUM_UNKO=100
          - BASE_CAMP_MAX_NUM=128
          - BASE_CAMP_WORKER_MAXNUM=15
          - DROP_ITEM_ALIVE_MAX_HOURS=1.000000 
          - AUTO_RESET_GUILD_NO_ONLINE_PLAYERS=false
          - AUTO_RESET_GUILD_TIME_NO_ONLINE_PLAYERS=72.000000
          - GUILD_PLAYER_MAX_NUM=20
          - PAL_EGG_DEFAULT_HATCHING_TIME=72.000000
          - WORK_SPEED_RATE=1.000000 
          - IS_MULTIPLAY=false
          - IS_PVP=false
          - CAN_PICKUP_OTHER_GUILD_DEATH_PENALTY_DROP=false
          - ENABLE_NON_LOGIN_PENALTY=true
          - ENABLE_FAST_TRAVEL=true
          - IS_START_LOCATION_SELECT_BY_MAP=true
          - EXIST_PLAYER_AFTER_LOGOUT=false
          - ENABLE_DEFENSE_OTHER_GUILD_PLAYER=false
          - COOP_PLAYER_MAX_NUM=4
          - MAX_PLAYERS=32
          - SERVER_NAME=jammsen-docker-generated-###RANDOM###
          - SERVER_DESCRIPTION=Palworld-Dedicated-Server running in Docker by jammsen
          - ADMIN_PASSWORD=adminPasswordHere
          - SERVER_PASSWORD=serverPasswordHere
          - PUBLIC_PORT=8211
          - PUBLIC_IP=
          - RCON_ENABLED=false
          - RCON_PORT=25575
          - REGION=
          - USEAUTH=true
          - BAN_LIST_URL=https://api.palworldgame.com/api/banlist.txt
        volumes:
          - ./game:/palworld

      rcon:
        image: outdead/rcon:latest
        entrypoint: ['/rcon', '-a', '10.0.0.5:25575', '-p', 'adminPasswordHere']
        profiles: ['rcon'] 
Enter fullscreen mode Exit fullscreen mode

Lembre-se de alterar o arquivo de acordo com o seu servidor.

Após a criação do docker-compose.yml, execute o docker-compose:

$ sudo docker-compose up -d
Enter fullscreen mode Exit fullscreen mode
  • Você pode acompanhar os logs com: $ sudo docker-compose logs -f

  • Após algum tempo o container irá baixar a steam, o servidor, fazer o login anonimamente e servir o jogo na porta: 8211

Vamos liberar o acesso a essa porta na aws:

  • No console da aws no serviço EC2, selecione “security groups”

  • Clique no security group atrelado a sua maquina (provavelmente launch-wizard-1)

  • Clique em “Regras de saída”

  • Clique em “Editar Regras de saída”

  • Clique em “Adicionar Regra”

  • Selecione o Tipo: “UDP Personalizado”

  • Intervalo de portas: 8211

  • Destino: Qualquer Local — IPv4

Com isso já será possível se conectar com o jogo na sua máquina.

Porém temos alguns problemas:

  • Sem um IP estático, toda vez que a maquina reiniciar, o IP de acesso público irá mudar

  • Só é possível iniciar a máquina pelo painel da AWS

  • A maquina ficará ligada 24/7 a menos que você a desligue manualmente pelo console da AWS.

Com essa configuração, os custos não são otimizados, e a máquina ligada 24/7 terá um custo aproximado de: $170USD por mês.

Vou criar uma parte 2 explicando como resolver cada um desses problemas, diminuir drasticamente os custos e como facilitar seu acesso, criando um bot no discord vinculado com a AWS!

Top comments (0)