Post

Pterodactyl

Connaissances requises pour ce tuto :

  • Linux (shell, script, Bash, pid, gid, uid, systemd, ip, port)
  • Docker
  • Docker Compose
  • Portainer
  • Cloudflare (domaine et DNS)
  • Caddy
  • Api (le principe)
  • CORS (pour que ça fonctionne)

Introduction

Pterodactyl est panneau d’installation, de configuration et de gestion de jeux.

Pterodactyl® est un panneau de gestion de serveur de jeu gratuit et open-source construit avec PHP, React et Go. Conçu dans un souci de sécurité, Pterodactyl exécute tous les serveurs de jeu dans des conteneurs Docker isolés, tout en exposant une interface utilisateur belle et intuitive aux utilisateurs finaux.Ne vous contentez pas de peu. Faites des serveurs de jeux un citoyen de première classe sur votre plateforme.

Il est disponible ici : https://pterodactyl.io/

Il repose sur 2 composants principaux :

  • Le panneau (panel) qui est l’interface (frontend) du logiciel
  • Le démon (wings) de gestion des jeux (backend)

Prérequis

Cet article par du principe que vous avez un nom de domaine et que ses DNS sont gérés par Cloudflare.

Si ce n’est pas le cas, il vous faudra adapter en fonction de votre hébergeur ; ou au moins votre gestionnaire de DNS.

La 2ᵉ supposition est que vous disposez d’un serveur Caddy afin de disposer d’un reverse proxy.

Et celui-ci doit être lié à Cloudflare avec une gestion de certificats wildcard.

Donc, si vous n’avez ni nom de domaine, ni une gestion des DNS chez Cloudflare, ni Caddy ; je vous conseille d’aller mettre ça en place avant de continuer.

De plus, il faut avoir les services suivant d’opérationnels au préalable : MariaDB et Redis

Il faudra, en suivant entièrement cet article, créer les répertoires suivant sur la machine :

  • /opt/docker/pterodactyl (qui servira de répertoire de base)

Ensuite, dans ce répertoire, il faut créer les sous-répertoires suivants :

  • conf/certs
  • conf/etc
  • conf/nginx
  • datas/containers
  • datas/lib
  • datas/logs/panel
  • datas/logs/wings
  • datas/panel
  • datas/tmp
  • datas/var
  • scripts
  • mods (optionnel)
  • mounts (optionnel)

Par défaut, l’utilisateur (uid) et le groupe d’utilisateur (gid) utilisés sont ceux du 1er compte utilisateur Linux (1000).

Libre à vous de le changer ; en pensant à mettre à jour les valeurs dans le docker-compose et dans init.sh.

Une fois toute l’arborescence créée, il vous faut créer les fichiers suivants :

scripts/init.sh

[Fichier]

Ce script va servir à créer des liens symboliques entre la partie Docker (Wings) et la partie host. C’est le seul moyen que j’aie trouvé pour que le démon Wings arrive à gérer les conteneurs. Sachant qu’avec la solution décrite dans cet article, nous nous retrouvons avec des conteneurs (Wings > Jeux) gérés au sein de Docker…

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
#!/bin/bash
# 2023-04-04

if [ ! -d /var/lib/pterodactyl ]; then
	mkdir -p /var/lib/pterodactyl
fi
if [ ! -L /var/lib/pterodactyl/volumes ]; then
	ln -s /opt/docker/pterodactyl/datas/lib/volumes /var/lib/pterodactyl/volumes
fi
chown -R 1000:1000 /var/lib/pterodactyl

if [ ! -L /tmp/pterodactyl ]; then
	ln -s /opt/docker/pterodactyl/datas/tmp /tmp/pterodactyl
fi
chown -R 1000:1000 /tmp/pterodactyl

#chown -R 1000:1000 /opt/docker/pterodactyl

Ne pas forcer autrement sur 1000:1000 le répertoire /opt/docker/pterodactyl/database ou bien, le Panel perdra la capacité d’accéder à la base de donnée.

scripts/pterodactyl-init.service

[Fichier]

Ce service Systemd sert à lancer init.sh au démarrage de la machine.Afin de s’assurer que les liens symboliques soient toujours présents pour Wings.Il sera à copier dans /etc/systemd/system/ et à assigner à root.

1
2
3
4
5
6
7
8
9
10
11
12
# /opt/docker/pterodactyl/scripts/init.sh
# 2023-04-06
[Unit]
Description=Pterodactyl Docker Init
After=default.target

[Service]
Type=oneshot
ExecStart=/opt/docker/pterodactyl/scripts/init.sh

[Install]
WantedBy=default.target

Il conviendra de l’installer et de l’activer :

1
2
3
4
sudo cp scripts/pterodactyl-init.service /etc/systemd/system/
sudo chown root:root /etc/systemd/system/pterodactyl-init.service
sudo systemctl enable pterodactyl-init.service
sudo systemctl start pterodactyl-init.service

conf/etc/config.yml

[Fichier]

Le fichier est juste à initialiser à vide :

1
touch etc/config.yml

conf/nginx/panel.conf

[Fichier]

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
server {
    listen 80;
    server_name _;

    root /app/public;
    index index.html index.htm index.php;
    charset utf-8;

    location / {
        try_files $uri $uri/ /index.php?$query_string;
    }

    location = /favicon.ico { access_log off; log_not_found off; }
    location = /robots.txt  { access_log off; log_not_found off; }

    access_log off;
    error_log  /var/log/nginx/pterodactyl.app-error.log error;

    # allow larger file uploads and longer script runtimes
    client_max_body_size 100m;
    client_body_timeout 120s;

    sendfile off;

    location ~ \.php$ {

        fastcgi_split_path_info ^(.+\.php)(/.+)$;
        # the fastcgi_pass path needs to be changed accordingly when using CentOS
        fastcgi_pass 127.0.0.1:9000;
        fastcgi_index index.php;
        include fastcgi_params;
        fastcgi_param PHP_VALUE "upload_max_filesize = 100M \n post_max_size=100M";
        fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
        fastcgi_param HTTP_PROXY "";
        fastcgi_intercept_errors off;
        fastcgi_buffer_size 16k;
        fastcgi_buffers 4 16k;
        fastcgi_connect_timeout 300;
        fastcgi_send_timeout 300;
        fastcgi_read_timeout 300;
    }

    location ~ /\.ht {
        deny all;
    }
}

Attribution des droits

Maintenant, on met à jour les droits utilisateurs :)

1
sudo chown -R 1000:1000 /opt/docker/pterodactyl/

À ajuster si vous utilisez un autre compte/groupe utilisateur.

Cloudflare

Il est temps de mettre en place la partie DNS chez Cloudflare.

Soit, vous êtes hébergés et toute la configuration est uniquement sur un serveur distant directement lié à votre nom de domaine.

Dans ce cas, vous créez 2 entrées de type CNAME :

Type Nom Contenu Etat du proxy Durée TTL
CNAME panel domain.com Proxied Automatic
CNAME node domain.com Proxied Automatic

Si vous êtes auto hébergés, il faut créer 2 entrées de type A :

Type Nom Contenu Etat du proxy Durée TTL
CNAME panel IP publique du serveur Proxied Automatic
CNAME node IP publique du serveur Proxied Automatic

Au cas où, vous pouvez passer Cloudflare en mode développement pour désactiver le cache le temps de faire quelques tests.

Traefik

Je partirai du principe que Traefik est installé et fonctionnel ; et que sa configuration s’effectue par des fichiers Yaml.

Vous aurez à créer 2 routers :

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
panel:
  entryPoints:
    - "https"
  rule: "Host(`panel.domain.com`)"
  middlewares:
    - pterodadctyl
  tls: {}
  service: panel

node:
  entryPoints:
    - "https"
  rule: "Host(`node.domain.com`)"
  middlewares:
    - pterodadctyl
  tls: {}
  service: node

Ainsi que 2 services :

1
2
3
4
5
6
7
8
9
10
11
panel:
  loadBalancer:
    servers:
      - url: "http://[IP de la machine héberge le panel]:8001"
    passHostHeader: true

node:
  loadBalancer:
    servers:
      - url: "http://[IP de la machine héberge wings]:8181"
    passHostHeader: true

Et 11 middlewares :

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
    https-redirectscheme:
      redirectScheme:
        scheme: https
        permanent: true

    default-headers:
      headers:
        frameDeny: false
        browserXssFilter: false
        forceSTSHeader: true
        stsIncludeSubdomains: true
        stsPreload: true
        stsSeconds: 15552000
        customFrameOptionsValue: SAMEORIGIN

    default-csp:
      headers:
        contentsecuritypolicy: "script-src 'self' 'unsafe-inline' 'unsafe-eval' blob: data: wss: https:; img-src 'self' 'unsafe-inline' 'unsafe-eval' blob: data: wss: https:; font-src 'self' 'unsafe-inline' 'unsafe-eval' blob: data: wss: https:; connect-src 'self' 'unsafe-inline' 'unsafe-eval' blob: data: wss: https:; frame-src 'self' 'unsafe-inline' 'unsafe-eval' blob: data: wss: https:; object-src 'self' 'unsafe-inline' 'unsafe-eval' blob: data: wss: https:; media-src 'self' 'unsafe-inline' 'unsafe-eval' blob: data: wss: https:; prefetch-src 'self' 'unsafe-inline' 'unsafe-eval' blob: data: wss: https:; style-src 'self' 'unsafe-inline' 'unsafe-eval' blob: data: wss: https:; child-src 'self' 'unsafe-inline' 'unsafe-eval' blob: data: wss: https:; default-src 'self' 'unsafe-inline' 'unsafe-eval' blob: data: wss: https:;"

    cors-all:
      headers:
        customRequestHeaders:
          Access-Control-Allow-Origin: origin-list-or-null
          Sec-Fetch-Site: cross-site
          X-Forwarded-Proto: https
          Access-Control-Allow-Headers: "*, Authorization"
        customResponseHeaders:
          Access-Control-Allow-Origin: "*"
          Sec-Fetch-Site: cross-site
          X-Forwarded-Proto: https
          Access-Control-Allow-Headers: "*, Authorization"
        accessControlAllowMethods:
          - OPTIONS
          - POST
          - GET
          - PUT
          - DELETE
          - PATCH
        accessControlAllowHeaders:
          - "*, Authorization"
        accessControlExposeHeaders:
          - "*, Authorization"
        accessControlMaxAge: 100
        addVaryHeader: true
        accessControlAllowCredentials: true
        accessControlAllowOriginList:
          - "*"

    hsts-headers:
      headers:
        customResponseHeaders:
          X-Permitted-Cross-Domain-Policies: none

    security-headers:
      headers:
        customResponseHeaders:
          Permissions-Policy: "fullscreen=(*), display-capture=(self), accelerometer=(), battery=(), camera=(), autoplay=(self), vibrate=(self), geolocation=(self), midi=(self), notifications=(*), push=(*), microphone=(self), magnetometer=(self), gyroscope=(self), payment=(self)"
          X-Robots-Tag: "none,noarchive,nosnippet,notranslate,noimageindex"
          server: ""
          via: ""
          X-Forwarded-Proto: https
        sslProxyHeaders:
          X-Forwarded-Proto: https
        referrerPolicy: same-origin
        hostsProxyHeaders:
          - X-Forwarded-Host
        customRequestHeaders:
          X-Forwarded-Proto: https
        contentTypeNosniff: true

    inflight-req:
      inFlightReq:
        amount: 128

    rate-limit:
      rateLimit:
        average: 128
        period: 1m
        burst: 128

    retry-attempts:
      retry:
        attempts: 16
        initialInterval: 1000ms

    compress-all:
      compress:
        excludedContentTypes:
          - text/event-stream
        minResponseBodyBytes: 1024

    pterodadctyl:
      chain:
        middlewares:
          - https-redirectscheme
          - default-headers
          - default-csp
          - cors-all
          - hsts-headers
          - security-headers
          - inflight-req
          - rate-limit
          - retry-attempts
          - compress-all

Tout ça est à ajouter dans votre fichier config.yml de Traefik.

N’utilisez pas le cors-all ailleurs que dans cette configuration, il permet au panel et à wings de communiquer par le biais de leurs API sur des IP différentes, des ports différents et des noms de domaines différents ; alors que Wings devrait être en mesure de taper sans problème sur le panel. C’est le seul moyen, dans cette configuration, de passer outre les blocages CORS.

Une fois que vous avez mis en place les règles dans Traefik, il suffit de redémarrer son conteneur et hop, c’est bon pour cette partie.

Caddy

Il s’agit d’un exemple de configuration au cas où vous utilisez Caddy à la place de Traefik.

Ces informations sont en complément du tutoriel sur Caddy.

Je partirai du principe que Caddy est installé et fonctionnel ; et que sa configuration s’effectue par des fichiers.

Vous aurez besoin simplement de 2 entrées de configuration pour Caddy :

Panel

1
2
3
4
5
6
7
@panel host panel.domain.com
handle @panel {
	import pterodadctyl
	reverse_proxy [ip du panel]:[port du panel] {
		import reverseProxy
	}
}

Wings

1
2
3
4
5
6
7
@node host node.domain.com
handle @node {
	import pterodadctyl
	reverse_proxy [ip de wings]:[port de wings] {
		import reverseProxy
	}
}

Portainer

Maintenant que les préparatifs sont faits, on passe aux choses sérieuses :)

… La création de la stack Docker sous Portainer !

[Fichier]

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
version: "3.0"

### https://pterodactyl.io/guides/mounts.html

#
# updated: 2023-04-04
# stack:   pterodactyl
#

#
# Services that need to be setup before running this stack
#   - Redis
#   - MariaDB
#

#
# You need to setup, activate and run systemd service before.
#

# Initialization:
#
#  After the first succeessful launch of the stack, you need to create the first user in Panel.
#
# 	run a command shell into "panel" container using '/bin/sh'
#
#	run:
#		php artisan p:user:mak

services:
  panel:
    container_name: panel
    hostname: panel
    image: ghcr.io/pterodactyl/panel:v1.11.3
    restart: always
    stdin_open: true
    tty: true
    ports:
      - "8001:80"
    expose:
      - "80"
    environment:
      TZ: "Etc/UTC"
      APP_TIMEZONE: "Etc/UTC"
      APP_ENV: "production"
      APP_ENVIRONMENT_ONLY: "false"
      APP_URL: "https://panel.domain.com"
      APP_SERVICE_AUTHOR: "[your email]"
      MAIL_FROM: "[your email]"
      MAIL_DRIVER: "[smtp for exemple]"
      MAIL_HOST: "[host for the mail driver, eg. smtp.domain.com]"
      MAIL_PORT: "[port number for mail]"
      MAIL_USERNAME: "[email username]"
      MAIL_PASSWORD: "[email password]"
      MAIL_ENCRYPTION: "true"
      TRUSTED_PROXIES: "*"
      PTERODACTYL_TELEMETRY_ENABLED: "false"
      DB_HOST: "[ip address of MariaDB server]"
      DB_PORT: "[port number of MariaDB]"
      DB_USERNAME: "[database username]"
      DB_PASSWORD: "[database password]"
      DB_DATABASE: "panel"
      CACHE_DRIVER: "redis"
      SESSION_DRIVER: "redis"
      QUEUE_DRIVER: "redis"
      REDIS_HOST: "[ip address of redis server]"
    volumes:
      - /var/run/docker.sock:/var/run/docker.sock
      - /etc/ssl/certs:/etc/ssl/certs:ro
      - /opt/docker/pterodactyl/conf/certs:/etc/letsencrypt
      - /opt/docker/pterodactyl/conf/etc:/etc/pterodactyl
      - /opt/docker/pterodactyl/conf/nginx:/etc/nginx/http.d
      - /opt/docker/pterodactyl/datas/var:/app/var
      - /opt/docker/pterodactyl/datas/logs/panel:/app/storage/logs
      - /opt/docker/pterodactyl/datas/logs/panel:/var/log/panel/logs
      - /opt/docker/pterodactyl/datas/panel:/var/www/html
      - /opt/docker/pterodactyl/datas/lib:/var/lib/pterodactyl
      - /opt/docker/pterodactyl/datas/containers:/var/lib/docker/containers
  wings:
    container_name: wings
    hostname: wings
    image: ghcr.io/pterodactyl/wings:v1.11.5
    restart: always
    stdin_open: true
    tty: true
    networks:
      - wings0
    ports:
      - "8181:8080"
      - "2022:2022"
    expose:
      - "8080"
      - "2022"
    depends_on:
      - panel
    environment:
      TZ: "Etc/UTC"
      APP_TIMEZONE: "Etc/UTC"
      WINGS_UID: 1000
      WINGS_GID: 1000
      WINGS_USERNAME: pterodactyl
    volumes:
      - /var/run/docker.sock:/var/run/docker.sock
      - /etc/ssl/certs:/etc/ssl/certs:ro
      - /opt/docker/pterodactyl/conf/etc:/etc/pterodactyl
      - /opt/docker/pterodactyl/datas/logs/wings:/var/log/pterodactyl
      - /opt/docker/pterodactyl/datas/tmp:/tmp/pterodactyl
      - /opt/docker/pterodactyl/datas/lib:/var/lib/pterodactyl
      - /opt/docker/pterodactyl/datas/containers:/var/lib/docker/containers
      - /opt/docker/pterodactyl/datas/lib/wings.db:/var/lib/pterodactyl/wings.db
networks:
  default:
    ipam:
      config:
        - subnet: 172.100.0.0/16
  wings0:
    name: wings0
    driver: bridge
    ipam:
      config:
        - subnet: "172.101.0.0/16"
    driver_opts:
      com.docker.network.bridge.name: wings0

Pensez à modifier les éléments qui seront propres à votre configuration :

  • APP_URL
  • APP_SERVICE_AUTHOR
  • MAIL_FROM
  • MAIL_DRIVER
  • MAIL_HOST
  • MAIL_PORT
  • MAIL_USERNAME
  • MAIL_PASSWORD
  • DB_HOST
  • DB_PORT
  • DB_USERNAME
  • DB_PASSWORD
  • REDIS_HOST

Éventuellement :

  • APP_TIMEZONE
  • TZ
  • MAIL_ENCRYPTION
  • PUID
  • PGID

Si vous rencontrez des problèmes avec des ports déjà utilisés… Ajustez :p Y compris dans la configuration de Traefik/Caddy.

Lorsque la stack démarre correctement, pensez à créer votre premier utilisateur (qui sera automatiquement administrateur du panel).

Sous Portainer, il suffit de faire lancer une invite de commande avec /bin/sh et de lancer

1
php artisan p:user:mak

Une fois ceci réaliser, allez faire un tour du côté de votre panel :)

https://panel.domain.com

Le Panel et son 1er Node

Une fois sur le panel et correctement identifié, la 1ère chose à faire est de créer un node.

Ce qui est important ici :

  • FQDN: doit être le nom complet que vous avez défini sur Cloudflare et paramétré dans Traefik pour le [u]node[/u] (node.domain.com)
  • Use SSL Connection: doit être coché
  • Behind Proxy: doit être coché
  • Daemon Port: doit être sur 443

Pour la partie allocation de mémoire et d’espace disque, vous mettez ce que vous voulez tant que c’est suffisant pour installer les jeux et les lancer. Il s’agit des valeurs maximales disponibles pour l’ensemble des jeux qui seront installés sur ce node.

Une fois que c’est passé, vous allez sur l’onglet Configuration et vous copiez le contenu pour aller le coller dans le fichier conf/etc/config.yml.

Le fichier devrait ressembler à quelque chose comme ça :

[Fichier]

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
debug: false
app_name: Pterodactyl
uuid: [removed]
token_id: [removed]
token: [removed]
api:
  host: 0.0.0.0
  port: 8080
  ssl:
    enabled: false
    cert: /etc/letsencrypt/live/node.zogg.fr/fullchain.pem
    key: /etc/letsencrypt/live/node.zogg.fr/privkey.pem
  disable_remote_download: false
  upload_limit: 100
  trusted_proxies: []
system:
  root_directory: /var/lib/pterodactyl
  log_directory: /var/log/pterodactyl
  data: /var/lib/pterodactyl/volumes
  archive_directory: /var/lib/pterodactyl/archives
  backup_directory: /var/lib/pterodactyl/backups
  tmp_directory: /tmp/pterodactyl
  username: pterodactyl
  timezone: Etc/UTC
  user:
    rootless:
      enabled: false
      container_uid: 0
      container_gid: 0
    uid: 1000
    gid: 1000
  disk_check_interval: 150
  activity_send_interval: 60
  activity_send_count: 100
  check_permissions_on_boot: true
  enable_log_rotate: true
  websocket_log_count: 150
  sftp:
    bind_address: 0.0.0.0
    bind_port: 2022
    read_only: false
  crash_detection:
    enabled: true
    detect_clean_exit_as_crash: true
    timeout: 60
  backups:
    write_limit: 0
    compression_level: best_speed
  transfers:
    download_limit: 0
docker:
  network:
    interface: 172.110.0.1
    dns:
    - 1.1.1.1
    - 1.0.0.1
    name: pterodactyl_nw
    ispn: false
    driver: bridge
    network_mode: pterodactyl_nw
    is_internal: false
    enable_icc: true
    network_mtu: 1500
    interfaces:
      v4:
        subnet: 172.110.0.0/16
        gateway: 172.110.0.1
      v6:
        subnet: fdba:17c8:6c94::/64
        gateway: fdba:17c8:6c94::1011
  domainname: ""
  registries: {}
  tmpfs_size: 100
  container_pid_limit: 512
  installer_limits:
    memory: 1024
    cpu: 100
  overhead:
    override: false
    default_multiplier: 1.05
    multipliers: {}
  use_performant_inspect: true
  userns_mode: ""
  log_config:
    type: local
    config:
      compress: "false"
      max-file: "1"
      max-size: 5m
      mode: non-blocking
throttles:
  enabled: true
  lines: 2000
  line_reset_interval: 100
remote: https://panel.domain.com
remote_query:
  timeout: 30
  boot_servers_per_page: 50
#allowed_mounts:
#- /opt/docker/pterodactyl/mounts
allowed_origins:
- '*'
allow_cors_private_network: true
ignore_panel_config_updates: false

Les éléments suivants sont remplis automatiquement par Wings et ne doivent pas être modifiés à la main : uuid, token_id, token.

Il est très important que le port soit bien sur 8080 et non sur 443

Vous redémarrez uniquement le conteneur wings et une fois que c’est fait, vous cliquez sur Nodes dans le bandeau gauche du Panel.

Et là, tant que vous n’avez pas le petit cœur vert indiquant que le démon Wings est bien lancé et accessible, vous reprenez toutes les étapes précédentes parce que vous avez loupé un truc.

Et sans le cœur vert, vous disposerez seulement d’un front sans accès au back et donc pas de jeux…

Lorsque vous avez la confirmation que Wings est opérationnel, vous avez fait le plus dur ; à savoir mettre en place un panel et son gestionnaire de jeux fonctionnels.

Félicitations !

Allocations / Serveurs

Maintenant que le Panel et Wings fonctionnent et sont capables de communiquer, il ne reste plus qu’à attribuer des ressources (allocations) pour les futurs jeux (servers).

On va partir sur un objectif simple : un serveur Minecraft Vanilla tout simple.

Sur le Node, vous allez dans l’onglet Allocations et dans la partie droite, vous saisissez l’adresse IP du node (dans IP Address) et vous mettez un numéro de port (dans Ports) et vous faites Submit.

L’adresse IP du node est celle du démon Wings.

Vous venez de définir une ressource (allocation = couple IP du node + un n° de port [ou une plage de n° de ports]).

À présent, vous passez sur l’onglet Servers et il est vide !…

Eh bien, on va le remplir :)

Dans le bandeau gauche du Panel, vous cliquez sur Servers et vous faites Create New !

Vous lui donnez :

  • un nom (Server Name)
  • un propriétaire (Server Owner, par défaut, ce sera votre compte mail)
  • un node (qui doit déjà être sélectionné par défaut)
  • une allocation (qui doit par défaut être celle que vous venez de définir)
  • du cpu (CPU Limit)
  • de la mémoire (Memory)
  • de l’espace disque (Disk Space)

Pour CPU Limit, il s’agit du nombre de threads (dépendant de la machine hôte) que vous affecterez au jeu.

Donc 100% définit un jeu qui tournera sur 1 thread.

Si vous avez un processeur disposant de cœurs et que vous souhaitez tout utiliser, alors mettez : 400%

Vous allez choisir le groupe de jeux (Nest) et le type de jeux (Egg) que vous souhaitez utiliser.

Dans notre cas :

  • Nest = Minecraft
  • Egg = Minecraft Vanilla

Et il ne reste plus qu’à cliquer sur Create Server en bas à droite.

Vous allez recevoir par mail, une fois l’installation terminée, la confirmation que tout s’est bien passé.

Dans le cas contraire, soit il n’y a pas assez de ressource allouée, soit vous avez modifié d’autres paramètres (et dans ce cas, repartez sur un cas simple), soit il faut supprimer le serveur et recommencer.

Minecraft Vanilla

Lorsque le serveur de jeux (ici Minecraft Vanilla) est installé et opérationnel, il n’y a plus qu’à le lancer :)

Vous revenez à l’accueil du Panel et vous cliquez sur votre serveur pour le sélectionner.

Là, vous cliquez sur Start et vous attendez qu’il se lance !

Lancer votre client Minecraft, passez en multijoueurs et connectez-vous en utilisant les informations indiquées dans Address.

Amusez-vous !

Minecraft Fabric

Voici un petit exemple ce que ça peut donner avec un serveur Minecraft Fabric légèrement moddé qui utilise mon image GraalVM :)

Remerciements

IBRACORP: https://docs.ibracorp.io/

Techno Tim: https://docs.technotim.live/

Sans IBRACorp et TechnoTim , je n’aurais pas réussi à mettre en place une solution aussi complète !

Changelog

2022-12-12

  • Ajout de la configuration avec Caddy en reverse proxy
  • Déport de la base de données en externe (BDD commune pré-installée)
  • Déport du cache Redis en externe (pré-installé)
  • Simplification de la stack Portainer (uniquement le Panel et Wings)

2023-04-04

  • Mise à jour de Panel en v1.11.3 et de Wings en v1.11.5
  • Mise à jour des chemins
  • Corrections des scripts
  • Merci à Uzurka#0404 pour les retours et corrections !

2023-04-06

  • Ajustements et corrections
  • Ajouts de précisions dans le tutoriel
Cet article est sous licence CC BY 4.0 par l'auteur.

© 2022- Olivier. Certains droits réservés.

Propulsé par τζ avec le thème Χ