Skip to main content

Migrate from Gatus

SolidPing imports a Gatus config.yaml directly: every entry of the endpoints: list becomes a SolidPing check, conditions and all. Nothing has to be recreated by hand.

Where to find your configuration

Gatus has no configuration-export API — its runtime API returns statuses, not endpoint definitions — so the YAML file itself is the source of truth.

  • Docker / Compose: the file you mount at /config/config.yaml.
  • Kubernetes: the ConfigMap the Gatus pod mounts (kubectl get configmap gatus-config -o jsonpath='{.data.config\.yaml}').
  • Binary install: config/config.yaml next to the binary, or whatever GATUS_CONFIG_PATH points at.

If you split your config across a config/ directory, concatenate the files that contain endpoints: entries into one document before importing.

Import it

  1. Open Checks in the dashboard and click Import.
  2. Pick Gatus (config.yaml) as the source.
  3. Paste the YAML, or click Upload a file.
  4. Click Import preview. Nothing is written yet: you see exactly what would be created, what would be updated, and everything that did not map cleanly.
  5. Review the warnings, then confirm.

Re-importing the same file later is safe — checks are matched by slug and updated in place, never duplicated.

Prefer the API? It is one call:

curl -s -X POST \
-H "Authorization: Bearer $TOKEN" \
-H 'Content-Type: application/yaml' \
--data-binary @config.yaml \
'https://your-instance/api/v1/orgs/myorg/checks/import/convert?source=gatus&dryRun=true' | jq '.'

Drop &dryRun=true to apply. The endpoint requires an organization admin token.

What maps

GatusSolidPing
endpoints[].url scheme http(s)://an http check
tcp://, tls://, starttls://a tcp check (TLS on for tls/starttls)
udp://a udp check
icmp://, ping://an icmp check
ssh://an ssh check
ws://, wss://a websocket check
a dns: blocka dns check (url becomes the resolver)
name, group, enabledcheck name/slug, check group, enabled flag
intervalcheck period
method, body, headers, client.timeoutthe HTTP request settings

Conditions

Gatus conditionSolidPing
[STATUS] == 200expected status
[STATUS] == any(200, 301), [STATUS] == 2XXexpected status codes
[BODY] == value / != valuebody must contain / must not contain
[BODY] == pat(*glob*)body regex
[BODY].path == value (and !=, >, >=, <, <=)a JSONPath assertion
has([BODY].path) == true/falsean exists / not_exists assertion
[CERTIFICATE_EXPIRATION] > 48ha separate ssl check with that threshold
[DOMAIN_EXPIRATION] > 720ha separate domain check with that threshold
[CONNECTED] == true, [DNS_RCODE] == NOERRORimplicit — every SolidPing check already asserts reachability

What does not map

These are reported as warnings on the import preview; the check is still imported.

  • [RESPONSE_TIME] and [IP] conditions — SolidPing records response time as a metric rather than a pass/fail condition.
  • len([BODY].path) conditions — no direct equivalent.
  • alerts: — notification bindings are not imported. Wire up SolidPing integrations after the import.
  • external-endpoints: — Gatus push endpoints. Recreate them as SolidPing heartbeat checks.
  • client.insecure / client.ignore-redirect — SolidPing verifies certificates and follows redirects.
  • SSH credentials — deliberately never imported. SolidPing has fields for them, but an import must not silently re-persist secrets copied out of a foreign config file. Re-enter them on the check.

After the import

Checks created this way carry the label solidping.io/managed=gatus, so you can filter on them and re-run the import as your Gatus config evolves.