Como eu criei um servidor de PalWorld na AWS com start por bot no Discord
Tags: programming, devops, aws, gamedev
Published: 2024-01-27 20:49:46

É difícil não ter ouvido sobre [Palworld](https://store.steampowered.com/app/1623730/Palworld/) recentemente, com o sucesso explosivo e [mais de 8 milhões de vendas.](https://www.adrenaline.com.br/games/palworld-8-milhoes-unidades-vendidas/)

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](https://calculator.aws/#/createCalculator/ec2-enhancement)[)](https://calculator.aws/#/createCalculator/ec2-enhancement))

* 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: 

```bash
$ ssh -i [/endereco/da/chave/palworld-sao-paulo.pem] ubuntu@[seu-endereço-ip]
```

* [Instale o docker](https://docs.docker.com/engine/install/ubuntu/)

* [Instale o docker-compose](https://www.digitalocean.com/community/tutorials/how-to-install-and-use-docker-compose-on-ubuntu-20-04)

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](https://github.com/jammsen/docker-palworld-dedicated-server)

* na home do seu servidor (/home/ubuntu) crie uma pasta palworld 

```bash
$ mkdir palworld
```

* dentro da pasta palworld, crie uma pasta chamada “game” 

```bash
$ mkdir game
```

* Dê permissões de acesso para a pasta game:

```bash
$ chmod 777 game 
      ou 
$ chown -R 1000:1000 game/
```

Crie um arquivo de configuração chamado docker-compose.yml e cole o exemplo abaixo ([retirado do github](https://github.com/jammsen/docker-palworld-dedicated-server)):

```yaml
 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'] 
```

**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

* 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!**