Skip to content

Config Files

Complete reference for every configuration and state file Portlama uses.

File Overview

FileFormatOwnerModePurpose
/etc/portlama/panel.jsonJSONportlama:portlama0640Panel server configuration
/etc/portlama/tunnels.jsonJSONportlama:portlama0600Tunnel definitions
/etc/portlama/sites.jsonJSONportlama:portlama0600Static site definitions
/etc/authelia/configuration.ymlYAMLroot:root0600Authelia server configuration
/etc/authelia/users.ymlYAMLroot:root0600User database
/etc/authelia/.secrets.jsonJSONroot:root0600Authelia secrets
/etc/portlama/ticket-scopes.jsonJSONportlama:portlama0600Ticket scope registry
/etc/portlama/tickets.jsonJSONportlama:portlama0600Ticket and session store
/etc/nginx/sites-available/portlama-*nginx confroot:root0644Vhost configurations
/etc/nginx/snippets/portlama-mtls.confnginx confroot:root0644mTLS snippet
~/.portlama/servers.jsonJSONuser0600Desktop app server registry
~/.portlama/agents.jsonJSONuser0600Multi-agent registry
~/.portlama/agents/<label>/config.jsonJSONuser0600Per-agent configuration
~/.portlama/agents/<label>/client.p12PKCS#12user0600Per-agent mTLS certificate
~/.portlama/agents/<label>/ca.crtPEMuser0644Per-agent CA certificate
~/.portlama/agents/<label>/logs/directoryuser0700Per-agent Chisel log files
~/.portlama/agent.jsonJSONuser0600Legacy single-server config

/etc/portlama/panel.json

The primary configuration file for the panel server. Created by the installer, updated during onboarding and tunnel management.

Schema:

FieldTypeRequiredDefaultDescription
ipstringYesServer public IP address
domainstring | nullYesnullBase domain (set during onboarding)
emailstring | nullYesnullAdmin email for Let's Encrypt (set during onboarding)
dataDirstringYes/etc/portlamaPath to data/state directory
staticDirstringNoPath to panel-client dist directory
maxSiteSizenumberNo524288000Max static site upload size in bytes (500 MB)
adminAuthModestringNo"p12""p12" or "hardware-bound". When "hardware-bound", P12 download and rotation are disabled; admin authenticates via Keychain-backed certificate.
panel2faobjectNoBuilt-in TOTP 2FA configuration (see sub-fields below)
panel2fa.enabledbooleanNofalseWhether 2FA is active for admin panel access
panel2fa.secretstring | nullNonullBase32-encoded TOTP secret
panel2fa.setupCompletebooleanNofalseWhether the 2FA setup flow has been confirmed
sessionSecretstringNoHMAC key for signing session cookies (auto-generated during 2FA setup)
onboarding.statusenumYesFRESHCurrent onboarding state

Onboarding status values:

ValueMeaning
FRESHNo onboarding started — shows onboarding wizard
DOMAIN_SETDomain and email entered, awaiting DNS verification
DNS_READYDNS verified, ready to provision
PROVISIONINGStack provisioning in progress
COMPLETEDOnboarding complete — shows management UI

Example (fresh install):

json
{
  "ip": "203.0.113.42",
  "domain": null,
  "email": null,
  "dataDir": "/etc/portlama",
  "staticDir": "/opt/portlama/panel-client/dist",
  "onboarding": {
    "status": "FRESH"
  }
}

Example (after onboarding):

json
{
  "ip": "203.0.113.42",
  "domain": "example.com",
  "email": "admin@example.com",
  "dataDir": "/etc/portlama",
  "staticDir": "/opt/portlama/panel-client/dist",
  "maxSiteSize": 524288000,
  "onboarding": {
    "status": "COMPLETED"
  }
}

Example (with 2FA enabled):

json
{
  "ip": "203.0.113.42",
  "domain": "example.com",
  "email": "admin@example.com",
  "dataDir": "/etc/portlama",
  "staticDir": "/opt/portlama/panel-client/dist",
  "maxSiteSize": 524288000,
  "onboarding": {
    "status": "COMPLETED"
  },
  "panel2fa": {
    "enabled": true,
    "secret": "JBSWY3DPEHPK3PXP...",
    "setupComplete": true
  },
  "sessionSecret": "a1b2c3d4..."
}

Config resolution order:

  1. PORTLAMA_CONFIG environment variable (if set)
  2. In development (NODE_ENV=development or NODE_ENV unset): <package-root>/dev/panel.json
  3. In production (NODE_ENV=production): /etc/portlama/panel.json

Note: The systemd service unit sets CONFIG_FILE in the environment, but the panel server code reads PORTLAMA_CONFIG. The systemd variable CONFIG_FILE is not used by the application. In production deployments this has no effect because the code falls back to /etc/portlama/panel.json when PORTLAMA_CONFIG is unset and NODE_ENV=production.

Write pattern: Atomic — writes to .tmp file then rename().

Validated with: Zod schema in packages/panel-server/src/lib/config.js.


/etc/portlama/tunnels.json

Stores the array of configured tunnels. Created automatically when the first tunnel is added.

Schema: Array of tunnel objects.

FieldTypeDescription
idstringUUID
subdomainstringSubdomain name (e.g., myapp)
fqdnstringFull domain (e.g., myapp.example.com)
portnumberLocal port on the tunnel client machine
descriptionstring | nullOptional description (max 200 characters)
enabledbooleanWhether the tunnel is active
createdAtstringISO 8601 timestamp

Example:

json
[
  {
    "id": "a1b2c3d4-e5f6-7890-abcd-ef1234567890",
    "subdomain": "myapp",
    "fqdn": "myapp.example.com",
    "port": 3000,
    "description": "My web app",
    "enabled": true,
    "createdAt": "2026-03-13T10:30:45.000Z"
  },
  {
    "id": "b2c3d4e5-f6a7-8901-bcde-f12345678901",
    "subdomain": "api",
    "fqdn": "api.example.com",
    "port": 8080,
    "description": null,
    "enabled": true,
    "createdAt": "2026-03-13T11:00:00.000Z"
  }
]

Write pattern: Atomic — writes to .tmp, calls fsync(), then rename().

State directory: Configurable via PORTLAMA_STATE_DIR environment variable, defaults to /etc/portlama.


/etc/portlama/sites.json

Stores the array of static sites hosted through Portlama.

Schema: Array of site objects.

FieldTypeDescription
idstringUUID
fqdnstringFull domain (e.g., blog.example.com)
spaModebooleanIf true, try_files falls back to /index.html
autheliaProtectedbooleanIf true, requires Authelia authentication
rootPathstringDocument root (e.g., /var/www/portlama/<id>/)
createdAtstringISO 8601 timestamp

Example:

json
[
  {
    "id": "c3d4e5f6-a7b8-9012-cdef-123456789012",
    "fqdn": "blog.example.com",
    "spaMode": false,
    "autheliaProtected": false,
    "rootPath": "/var/www/portlama/c3d4e5f6-a7b8-9012-cdef-123456789012/",
    "createdAt": "2026-03-13T12:00:00.000Z"
  }
]

Write pattern: Same as tunnels.json — atomic with fsync().


/etc/portlama/ticket-scopes.json

Stores the ticket scope registry: registered scopes, active instances, and agent-to-instance assignments. Created automatically on first use.

Schema:

FieldTypeDescription
scopesarrayRegistered scope definitions (name, version, transport)
instancesarrayActive instances (scope, instanceId, agentLabel, status)
assignmentsarrayAgent-to-instance assignments

Example:

json
{
  "scopes": [
    {
      "name": "shell",
      "version": "1.0.0",
      "description": "Remote shell access",
      "scopes": [{ "name": "shell:connect", "description": "Connect to shell", "instanceScoped": true }],
      "transport": { "strategies": ["tunnel"], "preferred": "tunnel", "port": 9000, "protocol": "wss" },
      "hooks": {},              // Reserved for future hook configuration
      "installedAt": "2026-03-26T10:00:00.000Z"
    }
  ],
  "instances": [
    {
      "scope": "shell:connect",
      "instanceId": "a7f3b2c9d1e2f3a4b5c6d7e8f9a0b1c2",
      "agentLabel": "macbook-pro",
      "registeredAt": "2026-03-26T10:05:00.000Z",
      "lastHeartbeat": "2026-03-26T10:15:30.000Z",
      "status": "active",
      "transport": { "strategies": ["tunnel"], "preferred": "tunnel" }
    }
  ],
  "assignments": [
    {
      "agentLabel": "linux-agent",
      "instanceScope": "shell:connect:a7f3b2c9d1e2f3a4b5c6d7e8f9a0b1c2",
      "assignedAt": "2026-03-26T10:10:00.000Z",
      "assignedBy": "admin"
    }
  ]
}

Instance transport sub-schema:

The instance transport object may include a direct sub-object when the direct strategy is listed:

FieldTypeRequiredDescription
transport.strategiesstring[]YesArray of "tunnel", "relay", "direct"
transport.preferredstringNoPreferred strategy (must be in strategies)
transport.directobjectNoDirect connection details (required when using direct strategy)
transport.direct.hoststringYes*Public hostname or IP (1-255 chars). Private/reserved IPs rejected (SSRF prevention)
transport.direct.portnumberYes*Port number (1024-65535)

* Required when transport.direct is provided.

Host validation: The transport.direct.host field rejects private and reserved addresses: 10.0.0.0/8, 172.16.0.0/12, 192.168.0.0/16, 169.254.0.0/16, loopback (localhost, 127.0.0.1, ::1), cloud metadata endpoints (169.254.169.254, metadata.google.internal), and the zero network (0.0.0.0/8).

Write pattern: Atomic — temp file, fsync(), rename(). Concurrency controlled by promise-chain mutex.


/etc/portlama/tickets.json

Stores active tickets and sessions for agent-to-agent authorization. Created automatically on first use.

Schema:

FieldTypeDescription
ticketsarrayIssued tickets (id, scope, instanceId, source, target, expiry)
sessionsarrayActive sessions (server-generated sessionId, ticketId, status, heartbeat)

Example:

json
{
  "tickets": [
    {
      "id": "64-hex-char-ticket-id",
      "scope": "shell:connect",
      "instanceId": "a7f3b2c9d1e2f3a4b5c6d7e8f9a0b1c2",
      "source": "macbook-pro",
      "target": "linux-agent",
      "createdAt": "2026-03-26T10:15:00.000Z",
      "expiresAt": "2026-03-26T10:15:30.000Z",
      "used": false,
      "usedAt": null,
      "sessionId": null,
      "transport": {}
    }
  ],
  "sessions": [
    {
      "sessionId": "c3d4e5f6a7b8c9d0e1f2a3b4c5d6e7f8",
      "ticketId": "64-hex-char-ticket-id",
      "scope": "shell:connect",
      "instanceId": "a7f3b2c9d1e2f3a4b5c6d7e8f9a0b1c2",
      "source": "macbook-pro",
      "target": "linux-agent",
      "createdAt": "2026-03-26T10:15:30.000Z",
      "lastActivityAt": "2026-03-26T10:20:00.000Z",
      "status": "active",
      "reconnectGraceSeconds": 60
    }
  ]
}

Write pattern: Same as ticket-scopes.json — atomic with mutex.

Cleanup: Tickets older than 1 hour are removed. Dead sessions older than 24 hours are removed.


/etc/authelia/configuration.yml

Authelia server configuration. Written during onboarding provisioning.

Key fields:

yaml
server:
  host: 127.0.0.1
  port: 9091

log:
  level: info
  file_path: /var/log/authelia/authelia.log

jwt_secret: <random-secret>

authentication_backend:
  file:
    path: /etc/authelia/users.yml
    password:
      algorithm: bcrypt
      bcrypt:
        cost: 12

access_control:
  default_policy: one_factor

session:
  name: portlama_session
  secret: <random-secret>
  domain: example.com
  expiration: 12h
  inactivity: 2h

storage:
  encryption_key: <random-secret>
  local:
    path: /etc/authelia/db.sqlite3

notifier:
  filesystem:
    filename: /etc/authelia/notifications.txt

totp:
  issuer: Portlama
  period: 30
  digits: 6

Critical settings:

SettingValueWhy
server.host127.0.0.1Never bind to 0.0.0.0 — nginx handles public access
password.algorithmbcryptArgon2id uses ~93 MB per hash, causes OOM on 512 MB droplets
bcrypt.cost12Balance between security and performance
session.domainYour domainMust match the domain in panel.json

Do not edit this file directly unless you understand Authelia configuration. Changes require a service restart: sudo systemctl restart authelia.


/etc/authelia/users.yml

The user database. Authelia reads this file live (no restart needed for user changes, but Portlama restarts Authelia after writes for safety).

Format:

yaml
users:
  admin:
    displayname: admin
    password: $2b$12$abcdefghijklmnopqrstuuABCDEFGHIJKLMNOPQRSTUVWXYZ012
    email: admin@portlama.local
    groups:
      - admins
  alice:
    displayname: alice
    password: $2b$12$xyzdefghijklmnopqrstuuABCDEFGHIJKLMNOPQRSTUVWXYZ012
    email: alice@portlama.local
    groups:
      - admins

Password format: bcrypt hash (starts with $2b$12$). Never use argon2id on a 512 MB droplet.

Write pattern: Atomic via temp file + sudo mv. After writing, Authelia is restarted.

Warning: Never delete the last user. The panel server prevents this, but manual editing could bypass the guard.


/etc/authelia/.secrets.json

Stores the randomly generated secrets used in the Authelia configuration. Backed up here so they can be referenced if the configuration file is regenerated.

json
{
  "jwtSecret": "<64-char-random-string>",
  "sessionSecret": "<64-char-random-string>",
  "storageEncryptionKey": "<64-char-random-string>"
}

Mode: 0600 (root only). If these values change, all active sessions are invalidated.


Client-Side Configuration

~/.portlama/servers.json

Stores the server registry for the desktop app's multi-server support. Created by cloud provisioning or manual server addition. When this file exists and contains an active entry, load_effective_config() uses it instead of agent.json.

Schema: Array of server entry objects.

FieldTypeDescription
idstringUUID
labelstringDisplay name (typically the domain)
panelUrlstringPanel URL (e.g., https://203.0.113.42:9292)
ipstringServer IP address
providerstring | nullCloud provider name (e.g., digitalocean)
providerIdstring | nullProvider-specific resource ID (e.g., droplet ID)
regionstring | nullProvider region slug
createdAtstringISO 8601 timestamp
activebooleanWhether this is the currently active server
authMethodstring"p12" or "keychain"
keychainIdentitystring | nullKeychain identity name (when authMethod is "keychain")
p12Pathstring | nullPath to P12 file (when authMethod is "p12")
activeModestring"agent" or "admin" — which UI mode the desktop app shows for this server. Defaults to "agent"
adminAuthobject | nullAdmin certificate details for Server mode access (see sub-fields below)
adminAuth.methodstring"p12" or "keychain" — how the admin cert is stored
adminAuth.p12Pathstring | nullPath to admin P12 file (when method is "p12")
adminAuth.keychainIdentitystring | nullKeychain identity for admin cert (when method is "keychain")

Example:

json
[
  {
    "id": "d4e5f6a7-b8c9-0123-defg-456789012345",
    "label": "example.com",
    "panelUrl": "https://203.0.113.42:9292",
    "ip": "203.0.113.42",
    "provider": "digitalocean",
    "providerId": "123456789",
    "region": "fra1",
    "createdAt": "2026-03-27T10:00:00.000Z",
    "active": true,
    "authMethod": "p12",
    "p12Path": "/Users/admin/.portlama/servers/d4e5f6a7/client.p12",
    "keychainIdentity": null,
    "activeMode": "admin",
    "adminAuth": {
      "method": "p12",
      "p12Path": "/Users/admin/.portlama/servers/d4e5f6a7/admin.p12",
      "keychainIdentity": null
    }
  }
]

Notes on adminAuth: When adminAuth is present and valid, the desktop app shows the Agents/Servers mode toggle in the sidebar. Cloud-provisioned servers populate adminAuth automatically (the admin certificate is downloaded during provisioning). For manually added servers, the user must import an admin certificate to enable Server mode.

P12 password: Not stored in the JSON file. Retrieved from the OS credential store (com.portlama.server service, keyed by server UUID).

Cloud API token: Not stored in this file. Retrieved from the OS credential store (com.portlama.cloud service).

Write pattern: Atomic — temp file with mode 0600, fsync(), then rename().

Config resolution: load_effective_config() checks agents.json first (multi-agent registry), then servers.json (active entry), then falls back to agent.json (legacy).


~/.portlama/agents.json

Multi-agent registry. Created by portlama-agent setup. Tracks all configured agents and the current default.

json
{
  "version": 1,
  "currentLabel": "my-server",
  "agents": [
    {
      "label": "my-server",
      "panelUrl": "https://1.2.3.4:9292",
      "authMethod": "p12",
      "p12Path": "~/.portlama/agents/my-server/client.p12",
      "keychainIdentity": null,
      "agentLabel": "agent:my-machine",
      "domain": "example.com",
      "chiselVersion": "1.10.1",
      "setupAt": "2026-03-28T10:00:00.000Z",
      "updatedAt": null
    }
  ]
}

Write pattern: Atomic — temp file with mode 0600, fsync(), then rename().

Per-agent data is stored at ~/.portlama/agents/<label>/:

  • config.json — agent configuration (panelUrl, authMethod, credentials)
  • client.p12 — mTLS certificate (mode 0600)
  • ca.crt — CA certificate (mode 0644)
  • logs/chisel.log — Chisel stdout log
  • logs/chisel.error.log — Chisel stderr log
  • plugins.json — agent plugin registry
  • plugins/ — per-plugin data directories

Service files use per-agent names:

  • macOS: com.portlama.chisel-<label> (plist label), ~/Library/LaunchAgents/com.portlama.chisel-<label>.plist
  • Linux: portlama-chisel-<label> (unit name), /etc/systemd/system/portlama-chisel-<label>.service

~/.portlama/agent.json

Legacy single-server configuration. Automatically migrated to the multi-agent registry on first use. After migration, renamed to agent.json.backup.


nginx Vhost Patterns

/etc/nginx/sites-available/portlama-panel-ip

The IP-based panel vhost. Created by the installer. Active as a fallback unless panel 2FA is enabled, which disables it (domain-only access).

nginx
# Rate limit zone for public enrollment endpoint (5 requests/minute per IP)
limit_req_zone $binary_remote_addr zone=enroll:1m rate=5r/m;

map $http_upgrade $connection_upgrade {
    default upgrade;
    ''      close;
}

server {
    listen 9292 ssl;
    server_name _;

    ssl_certificate /etc/portlama/pki/self-signed.pem;
    ssl_certificate_key /etc/portlama/pki/self-signed-key.pem;

    include /etc/nginx/snippets/portlama-mtls.conf;

    ssl_protocols TLSv1.2 TLSv1.3;
    ssl_ciphers HIGH:!aNULL:!MD5;
    ssl_prefer_server_ciphers on;

    error_page 495 496 /cert-help.html;
    location = /cert-help.html {
        root /opt/portlama/panel-client;
        internal;
    }

    # Protected locations — reject if client cert missing or invalid
    location / {
        if ($ssl_client_verify != SUCCESS) {
            return 496;
        }
        proxy_pass http://127.0.0.1:3100;
        proxy_set_header X-SSL-Client-Verify $ssl_client_verify;
        proxy_set_header X-SSL-Client-DN $ssl_client_s_dn;
        proxy_set_header X-SSL-Client-Serial $ssl_client_serial;
        proxy_set_header Host $host;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header X-Forwarded-Proto $scheme;
    }

    # Public API paths — no mTLS check, cert headers cleared
    location /api/enroll {
        limit_req zone=enroll burst=5 nodelay;
        proxy_pass http://127.0.0.1:3100;
        proxy_http_version 1.1;
        proxy_set_header X-SSL-Client-Verify "";
        proxy_set_header X-SSL-Client-DN "";
        proxy_set_header X-SSL-Client-Serial "";
        # ... standard proxy headers
    }

    location /api/invite {
        proxy_pass http://127.0.0.1:3100;
        proxy_http_version 1.1;
        proxy_set_header X-SSL-Client-Verify "";
        proxy_set_header X-SSL-Client-DN "";
        proxy_set_header X-SSL-Client-Serial "";
        # ... standard proxy headers
    }

    # API paths with WebSocket upgrade support (mTLS required)
    location /api {
        if ($ssl_client_verify != SUCCESS) {
            return 496;
        }
        proxy_pass http://127.0.0.1:3100;
        proxy_http_version 1.1;
        proxy_set_header X-SSL-Client-Verify $ssl_client_verify;
        proxy_set_header X-SSL-Client-DN $ssl_client_s_dn;
        proxy_set_header X-SSL-Client-Serial $ssl_client_serial;
        proxy_set_header Host $host;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header X-Forwarded-Proto $scheme;
        proxy_set_header Upgrade $http_upgrade;
        proxy_set_header Connection $connection_upgrade;
    }
}

/etc/nginx/sites-available/portlama-panel-domain

The domain-based panel vhost. Created during onboarding provisioning. Uses Let's Encrypt certificates and mTLS.

nginx
server {
    listen 443 ssl;
    server_name panel.example.com;

    ssl_certificate /etc/letsencrypt/live/panel.example.com/fullchain.pem;
    ssl_certificate_key /etc/letsencrypt/live/panel.example.com/privkey.pem;

    include /etc/nginx/snippets/portlama-mtls.conf;
    # ... (same proxy headers and locations as IP vhost)
}

/etc/nginx/sites-available/portlama-auth

The Authelia authentication portal. Proxies to 127.0.0.1:9091.

/etc/nginx/sites-available/portlama-tunnel

The Chisel WebSocket tunnel endpoint. Proxies to 127.0.0.1:9090 with WebSocket upgrade and 24-hour timeout.

/etc/nginx/sites-available/portlama-app-<subdomain>

Per-tunnel vhosts with Authelia forward authentication. Proxies to the tunnel's local port with WebSocket support.

/etc/nginx/sites-available/portlama-site-<uuid>

Per-static-site vhosts. Serve files from /var/www/portlama/<uuid>/ with optional Authelia protection and SPA mode.


/etc/nginx/snippets/portlama-mtls.conf

The mTLS configuration snippet included by all panel vhosts:

nginx
ssl_client_certificate /etc/portlama/pki/ca.crt;
ssl_verify_client optional;

This enables client certificate verification at the TLS level. The optional setting allows connections without a certificate (needed for public endpoints like /api/enroll and /api/invite). Protected locations enforce mTLS via if ($ssl_client_verify != SUCCESS) { return 496; } in each vhost's location blocks.


File Permissions Table

PathOwnerModeNotes
/etc/portlama/portlama:portlama0755State directory
/etc/portlama/panel.jsonportlama:portlama0640Panel config
/etc/portlama/tunnels.jsonportlama:portlama0600Tunnel state
/etc/portlama/sites.jsonportlama:portlama0600Site state
/etc/portlama/pki/portlama:portlama0700PKI directory
/etc/portlama/pki/ca.keyroot:root0600CA private key
/etc/portlama/pki/ca.crtroot:root0644CA certificate
/etc/portlama/pki/client.keyroot:root0600Client private key
/etc/portlama/pki/client.crtroot:root0644Client certificate
/etc/portlama/pki/client.p12root:root0600PKCS12 bundle
/etc/portlama/pki/.p12-passwordroot:root0600PKCS12 password
/etc/portlama/pki/self-signed.pemroot:root0644Self-signed TLS cert
/etc/portlama/pki/self-signed-key.pemroot:root0600Self-signed TLS key
/etc/portlama/ticket-scopes.jsonportlama:portlama0600Ticket scope registry
/etc/portlama/tickets.jsonportlama:portlama0600Ticket/session store
/etc/authelia/configuration.ymlroot:root0600Auth config
/etc/authelia/users.ymlroot:root0600User database
/etc/authelia/.secrets.jsonroot:root0600Auth secrets
/etc/authelia/db.sqlite3root:root0600Auth session DB
/opt/portlama/portlama:portlama0755Install directory
/var/www/portlama/www-data:www-data0755Static site files
/etc/sudoers.d/portlamaroot:root0440Sudo rules
~/.portlama/servers.jsonuser0600Server registry
~/.portlama/agent.jsonuser0600Legacy agent config
~/.portlama/services.jsonuser0600Service registry

Quick Reference

Config FileRead ByModified ByRestart Needed?
panel.jsonpanel-serverpanel-server (atomic write)No (hot reload)
tunnels.jsonpanel-serverpanel-server (atomic write + fsync)No
sites.jsonpanel-serverpanel-server (atomic write + fsync)No
ticket-scopes.jsonpanel-serverpanel-server (atomic write + mutex)No
tickets.jsonpanel-serverpanel-server (atomic write + mutex)No
configuration.ymlautheliaonboarding provisioningYes (systemctl restart authelia)
users.ymlautheliapanel-server (via sudo)Yes (systemctl restart authelia)
portlama-* vhostsnginxpanel-server (via sudo)Yes (nginx -t && systemctl reload nginx)

Released under the PolyForm Noncommercial License 1.0.0