Skip to content

Crafty's Self Signed or User Self Signed Certificate not working #240

@r03n

Description

@r03n

Widget link

https://github.com/glanceapp/community-widgets/blob/main/widgets/crafty-controller-minecraft-server/README.md

Description

Current home.yml

- name: Home
  # Optionally, if you only have a single page you can hide the desktop navigation for a cleaner look
  # hide-desktop-navigation: true
  columns:
    - size: full
      widgets:
        - type: custom-api
          title: Crafty Controller - Minecraft Server
          cache: 5s
          options:
            base-url: ${CRAFTY_URL}
            api-key: ${CRAFTY_API_TOKEN}
            server-id: ${CRAFTY_SERVER_ID}
            display-MOTD: true
          allow-insecure: true
          template: |
            {{/* Required config options */}}
            {{ $baseURL := .Options.StringOr "base-url" "" }}
            {{ $apiKey := .Options.StringOr "api-key" "" }}
            {{ $serverID := .Options.StringOr "server-id" "" }}

            {{/* Optional config options */}}
            {{ $displayMOTD := .Options.BoolOr "display-MOTD" true }}

            {{ $serverStats := newRequest (print $baseURL "/api/v2/servers/" $serverID "/stats")
                | withHeader "Authorization" (print "Bearer " $apiKey)
                | withHeader "Accept" "application/json"
                | getResponse }}

            {{ $is_running :=  $serverStats.JSON.Bool "data.running" }}
            {{ $online_players :=  $serverStats.JSON.Int "data.online" | formatNumber }}
            {{ $max_players :=  $serverStats.JSON.Int "data.max" | formatNumber }}
            {{ $name :=  $serverStats.JSON.String "data.world_name" }}
            {{ $size :=  $serverStats.JSON.String "data.world_size" }}
            {{ $version :=  $serverStats.JSON.String "data.version" }}
            {{ $icon :=  $serverStats.JSON.String "data.icon" }}
            {{ $server_ip :=  $serverStats.JSON.String "data.server_id.server_ip" }}
            {{ $server_port :=  $serverStats.JSON.String "data.server_id.server_port" }}
            {{ $motd :=  $serverStats.JSON.String "data.desc" }}

            {{ $server_addr := "" }}
            {{ if and ($is_running) (eq $server_ip "127.0.0.1") }}
              {{ $server_addr = printf "%s:%s" (replaceMatches "https?://" "" $baseURL) $server_port }}
            {{ else if $is_running }}
              {{ $server_addr = printf "%s:%s" $server_ip $server_port }}
            {{ end }}

            {{ $starting := false }}
            {{ if and ($is_running) (eq $max_players "0") (eq $version "False") }}
              {{ $starting = true }}
            {{ end }}

            <!-- I couldn't find documentation describing the "waiting_start" state or the other booleans below. Implementation might not be correct. -->
            {{ $updating :=  $serverStats.JSON.Bool "data.updating" }}
            {{ $importing :=  $serverStats.JSON.Bool "data.importing" }}
            {{ $crashed :=  $serverStats.JSON.Bool "data.crashed" }}

            <div style="display:flex; align-items:center; gap:12px;">
              <!-- Server Icon -->
              <div style="width:40px; height:40px; flex-shrink:0; border-radius:4px; display:flex; justify-content:center; align-items:center; overflow:hidden;">
                {{ if eq $icon "" }}
                  <img src="https://cdn.jsdelivr.net/gh/selfhst/icons/png/minecraft.png" style="width:100%; height:100%; object-fit:contain;" alt="Server icon">
                {{ else }}
                  <img src="data:image/png;base64, {{ $icon }}" style="width:100%; height:100%; object-fit:contain;" alt="Server icon">
                {{ end }}
              </div>

              <!-- Right side: Info -->
              <div style="display:flex; flex-direction:column;">
                <!-- First row: Server Name + IP -->
                <div style="display:flex; align-items:center; gap:6px;">
                  <span class="size-h4 block text-truncate color-primary">
                    {{ $name }}
                  </span>

                  {{ if and ($is_running) (not $starting) (not (eq $server_addr "")) }}
                  <div style="font-size:0.9em; color:var(--color-secondary);">
                    <span class="size-h6 color-secondary">
                - {{ $server_addr }}
                    </span>
                  </div>
                  {{ end }}
                </div>

                <!-- Second row: MOTD & Stats if server is running, otherwise show status msg  ... -->
                {{ if and ($is_running) (not $starting) }}
                  {{ if and (not (eq $motd "")) ($displayMOTD) }}
                    <div style="font-size:0.9em; color:var(--color-secondary);">
                {{ replaceMatches "§." "" $motd }}
                    </div>
                  {{ end }}

                  <div style="font-size:0.9em; color:var(--color-secondary);">
                    {{ $version }} - {{ $online_players }}/{{ $max_players }} players - {{ $size }}
                  </div>

                <!-- lots of assumptions about the boolean states meanings from crafty api.. -->
                {{ else if $starting }}
                  <div style="font-size:0.9em; color:var(--color-secondary);">Server is starting up..</div>
                {{ else if $importing }}
                  <div style="font-size:0.9em; color:var(--color-secondary);">Server is being imported..</div>
                {{ else if $updating }}
                  <div style="font-size:0.9em; color:var(--color-secondary);">Server is being updated..</div>
                {{ else if $crashed }}
                  <div style="font-size:0.9em; color:var(--color-secondary);">Server has crashed!</div>
                {{ else }}
                  <div style="font-size:0.9em; color:var(--color-secondary);">Server is offline</div>
                {{ end }}
              </div>
            </div>

sudo docker logs glance

dell@macintosh:~/glance$ sudo docker logs glance
2025/12/21 19:59:32 Starting server on :8080 (base-url: "", assets-path: "/app/assets")
2025/12/21 20:08:23 ERROR Could not fetch response within custom API template error="Get \"https://<ip>:8443/api/v2/servers/<server-id>/stats\": tls: failed to verify certificate: x509: certificate signed by unknown authority"

Also tried to copy the self-signed cert to the system CA folder.

❌ default Crafty self-signed
❌ Self-signed (Replace Crafty)
❌ Self-signed (Copy to System CA Folder)

Metadata

Metadata

Assignees

No one assigned

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions