Post

Pterodactyl Panel - Manage game servers for various games easily

Pterodactyl Panel - Manage game servers for various games easily

Pterodactyl® is a free, open-source game server management panel built with PHP, React, and Go. Designed with security in mind, Pterodactyl runs all game servers in isolated Docker containers while exposing a beautiful and intuitive UI to end users.

I run the Pterodactyl Game Server panel on Kubernetes, this panel controls “Wings” instances on 4 different machines, 3 are internal at my house and another that is remote.

Kubernetes Manifest

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
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
---
apiVersion: apps/v1
kind: Deployment
metadata:
  labels:
    app: panel
    app.kubernetes.io/instance: panel
    app.kubernetes.io/name: panel
  name: panel
  namespace: pterodactyl
spec:
  replicas: 1
  strategy:
    type: Recreate
  selector:
    matchLabels:
      app: panel
  template:
    metadata:
      labels:
        app: panel
        app.kubernetes.io/name: panel
    spec:
      nodeSelector:
        worker: "true"
      containers:
      - image: ghcr.io/pterodactyl/panel:latest
        name: panel
        ports:
        - containerPort: 80
          name: http
          protocol: TCP
        - containerPort: 443
          name: https
          protocol: TCP
        env:
        - name: APP_URL
          value: "https://[REDACTED].f9.casa"
        - name: APP_TIMEZONE
          value: Europe/London
        - name: LETSENCRYPT_EMAIL
          value: "[REDACTED]"
        - name: CACHE_DRIVER
          value: redis         
        - name: SESSION_DRIVER
          value: redis                
        - name: QUEUE_DRIVER
          value: redis                   
        - name: REDIS_HOST
          value: redis.redis
        - name: REDIS_PASSWORD
          value: "[REDACTED]"     
        - name: DB_HOST
          value: mariadb.mariadb                    
        - name: DB_PORT
          value: "3306" 
        - name: DB_DATABASE
          value: pterodactyl
        - name: DB_USERNAME
          value: pterodactyl
        - name: DB_PASSWORD
          value: "[REDACTED]"
        volumeMounts:
        - mountPath: "/app/var"
          readOnly: false
          name: data
          subPath: "var"
        - mountPath: "/etc/nginx/http.d/"
          readOnly: false
          name: data
          subPath: "nginx"
        - mountPath: "/etc/letsencrypt/"
          readOnly: false
          name: data
          subPath: "letsencrypt"
        - mountPath: "/app/storage/logs"
          readOnly: false
          name: data
          subPath: "logs"
      hostAliases:
      - ip: "10.0.10.31"
        hostnames:
        - "[REDACTED].f9.casa"
      - ip: "10.0.10.32"
        hostnames:
        - "[REDACTED].f9.casa"
      - ip: "10.0.10.33"
        hostnames:
        - "[REDACTED].f9.casa"
      volumes:
        - name: data
          persistentVolumeClaim:
            claimName: pterodactyl-panel
---
apiVersion: v1
kind: Service
metadata:
  labels:
    app: panel
  name: panel
  namespace: pterodactyl
spec:
  ports:
  - name: https
    port: 443
    protocol: TCP
    targetPort: 443
  - name: http
    port: 80
    protocol: TCP
    targetPort: 80
  selector:
    app: panel
---
apiVersion: traefik.io/v1alpha1
kind: IngressRoute
metadata:
  name: panel
  namespace: pterodactyl
  annotations: 
    kubernetes.io/ingress.class: traefik-external
    gethomepage.dev/href: "https://[REDACTED].f9.casa"
    gethomepage.dev/enabled: "true"
    gethomepage.dev/description: Game Servers
#    gethomepage.dev/group: Media Management
    gethomepage.dev/icon: pterodactyl.png
    gethomepage.dev/name: Pterodactyl
    gethomepage.dev/widget.type: pterodactyl
    gethomepage.dev/widget.url: "http://panel.pterodactyl" 
    gethomepage.dev/widget.key: "[REDACTED]"
spec:
  entryPoints:
    - websecure
  routes:
    - match: Host(`[REDACTED].f9.casa`)
      kind: Rule
      services:
        - name: panel
          port: 80
      middlewares:
        - name: default-headers
          namespace: default
        - name: panel-headers
          namespace: pterodactyl
  tls:
    secretName: f9-casa-tls

This post is licensed under CC BY 4.0 by the author.