Drakkon Site Cheat Sheet

Quick reference for common changes. This page is unlisted and not linked anywhere public.

How the site fits together

Three separate systems, all talking to each other:

  • drakkon-hosting.com — the actual website (Grav CMS). This is what customers see, and what Google Admin (drakkon-hosting.com/admin) edits.
  • billing.drakkon-hosting.com — Paymenter, the billing/product/customer engine. The website's pages call into this via API in the background, you never see it directly as a customer, but it's doing all the real work (cart, checkout, invoices, accounts).
  • panel.drakkon-hosting.com — Pterodactyl, the actual game-server control panel. Paymenter tells Pterodactyl when to create/suspend/delete a server.

When you're editing content (text, pages, images, the banner) → use Grav Admin.
When you're editing products, prices, or specs → use Paymenter Admin.
When you're editing server specs, eggs, or nodes → use Pterodactyl Admin.

Adding / editing products

To add a new product (e.g. a new modpack, a new tier):

  1. Paymenter Admin → Products → Create New
  2. Set the Category to match one of: minecraft-hosting, palworld, or modded-minecraft (the homepage/modded page only show categories they know about, using a new category name means it won't appear anywhere until the relevant page is updated too)
  3. Description field must follow this exact format for the spec badges to parse correctly:
    Infra: [wherever] RAM: X GB Disk: X GB Players: Up to X Mods / Plugins: Yes/No
  4. Server tab → pick the Nest/Egg, and the correct Node/Location
  5. For anything using the CurseForge or Modrinth eggs, the modpack's Project ID goes as a default value on the egg itself in Pterodactyl, not on the Paymenter product, mark it "not user viewable/editable" so customers never see it

Important: if a product ever ends up with more than one billing plan attached (even a leftover test one you think you removed), the native "quick add to cart" button breaks and falls back to the slower checkout page. Always fully delete extra plans in the product's Pricing tab, don't just hide them.

Editing the homepage & games list

Grav Admin → Homepage page → look for the Games List field. Each entry needs an ID, a display name, and a Paymenter category slug that must exactly match a real Paymenter product category, or nothing will show for it.

The /modded page works differently, it pulls live from the modded-minecraft category automatically, no config needed there, any product in that category just appears.

Adding a new page

Every page needs three things, all under /var/www/grav/grav-admin/user/:

  1. A template: themes/drakkon/templates/your-page.html.twig
  2. A blueprint (controls what shows in Admin for it): themes/drakkon/blueprints/your-page.yaml
  3. A content file: pages/NN.your-page/default.md (the number prefix controls ordering, doesn't affect the URL)

Set visible: false in the content file's frontmatter to keep it unlisted/hidden like this page.

Servers & nodes

NodePurposeArchitecture
Oracle (main)Website, billing, Minecraft serversARM64
Limerick x86Palworld, modded serversNative x86_64

Never use raw docker stop/start on a Pterodactyl-managed server. Always use the panel's own Start/Stop buttons, or the Application API's suspend/unsuspend, using raw docker commands leaves Pterodactyl's own tracking out of sync and causes the panel to show wrong/broken status.

Known limitation: the native dashboard's live status dot and Start/Stop buttons only work correctly for servers on the Oracle node right now. Servers on Limerick x86 won't show correct status there yet, that needs Oracle to be able to reach the x86 box remotely (SSH) to check its Docker containers, which isn't set up yet.

Common troubleshooting

Made a change and it's not showing up on the live site? Almost always a caching issue. Run:

cd /var/www/grav/grav-admin sudo -u www-data php bin/grav clearcache

For Paymenter-side changes (routes, controllers, config):

cd /var/www/paymenter sudo -u www-data HOME=/tmp php artisan config:clear sudo -u www-data HOME=/tmp php artisan cache:clear sudo -u www-data HOME=/tmp php artisan route:clear sudo systemctl restart php8.4-fpm

The php8.4-fpm restart specifically has fixed a number of "I cleared cache and it's still wrong" situations tonight, when in doubt, restart it too.

A product's "quick add" button suddenly falls back to the slow checkout page? Check for a duplicate/leftover billing plan on that product (see Products section above).

Invoice checkout suddenly fails with a database error about a duplicate invoice number? The internal invoice counter has fallen out of sync with the real highest invoice number. Fix via Paymenter's tinker console, set the invoice_number setting to match the actual highest existing invoice number.

Where credentials live (not repeated here on purpose)

  • SSH keys — your own PC(s), under Documents/Oracle or similar, referenced throughout past chat sessions
  • Pterodactyl Application API key — Paymenter Admin → your Server entry, and separately wherever it's been pasted into backend scripts on the Oracle server
  • Database passwords — /var/www/pterodactyl/.env and /var/www/paymenter/.env on the Oracle server
  • Resend (email) API key — Paymenter Admin → Settings → Mail
  • CurseForge API key — set as a default value on the CurseForge egg in Pterodactyl, not stored elsewhere