SealSkin

Settings Reference

Every environment variable the SealSkin server reads, with its default.

Every setting is read once at start-up from an environment variable named SEALSKIN_<NAME>. Booleans accept true, 1, or yes (anything else is false); an unparsable integer falls back to the default with an error in the log. When the server runs in the linuxserver/sealskin container the defaults already point at the /config and /storage volumes, so most installations set none of these.

HOST_URL is the one variable without the prefix: it is read by the first-run admin bootstrap and written into /config/admin.json as the server address. See Configuration for the files these paths refer to.

VariableTypeDefaultDescription
SEALSKIN_LOG_LEVELstrINFOLogging level (e.g., DEBUG, INFO, WARNING).
SEALSKIN_API_PORTint8000Port for the main API server.
SEALSKIN_SESSION_PORTint8443Port for the session proxy server.
SEALSKIN_DEFAULT_PROVIDERstrautoBackend that runs sessions: docker, kubernetes, or auto, which picks Kubernetes when the server runs in a Kubernetes pod and Docker otherwise.
SEALSKIN_APP_RESOURCE_PATHstrhttps://raw.githubusercontent.com/linuxserver/sealskin-apps/refs/heads/master/apps.ymlURL for the YAML file defining default available applications.
SEALSKIN_INSTALLED_APPS_PATHstr/config/.config/sealskin/installed_apps.ymlPath to the YAML file for installed application configurations.
SEALSKIN_APP_STORES_PATHstr/config/.config/sealskin/app_stores.ymlPath to the YAML file defining available app stores.
SEALSKIN_APP_TEMPLATES_PATHstr/config/.config/sealskin/app_templatesPath to the directory for user-defined application templates.
SEALSKIN_DEFAULT_APP_TEMPLATES_PATHstrapp/default_templatesPath to the directory for default application templates.
SEALSKIN_UPLOAD_DIRstr/storage/sealskin_uploadsDirectory for temporary file uploads (one sub-directory per user).
SEALSKIN_SESSION_COOKIE_NAMEstrsealskin_session_tokenName of the session cookie.
SEALSKIN_AUTOSTART_CACHE_PATHstr/config/.config/sealskin/autostart_cachePath to cache autostart scripts.
SEALSKIN_APP_STORE_CACHE_PATHstr/config/.config/sealskin/app_stores_cachePath to cache app store YAML files.
SEALSKIN_PROOT_CATALOGS_PATHstr/config/.config/sealskin/proot_catalogs.ymlPath to the YAML file of the PRoot Apps catalogs, shared by the nodes of a cluster.
SEALSKIN_PROOT_APPS_PATHstr/storage/sealskin_proot_appsDirectory this node keeps the content of every PRoot Apps catalog in, one folder per catalog, mounted read-only into the sessions of the users assigned to it.
SEALSKIN_PROOT_APPS_REMOTEstrlinuxserver/proot-appsThe PRoot Apps remote the catalog editor opens with: the GitHub owner/repo of a proot-apps repository, whose apps are tags of ghcr.io/<owner>/<repo>, or the base URL under which metadata/metadata.yml is served and the registry its apps are tags of, separated by a space (https://git.example/raw/it/proot-apps/main registry.example/it/proot-apps). Catalogs name its apps by their short names, which sessions on a catalog resolve through PA_DEFAULT_REPO; the apps of any other remote are named by their image.
SEALSKIN_VPN_PROFILES_PATHstr/config/.config/sealskin/vpn_profiles.ymlPath to the YAML file of the VPN profiles, shared by the nodes of a cluster.
SEALSKIN_VPN_IMAGEstrghcr.io/selkies-project/sealskin-vpn:latestImage of the VPN gateway a node starts beside the sessions that chose a VPN profile, and of the helper that points a session's default route at it.
SEALSKIN_VPN_HUB_SUBNETstr10.231.0.0/16On Kubernetes, the network a VPN hub and the sessions' spokes take their addresses from, the hub at .1; change it when it collides with a network the cluster reaches.
SEALSKIN_VPN_LOCAL_CIDRSstr10.0.0.0/8,172.16.0.0/12,192.168.0.0/16On Kubernetes, the networks a session pod and a VPN hub keep reaching directly beside the tunnel: the cluster's pod and Service ranges, and whatever else on the private ranges a session must reach without the VPN. Comma separated.
SEALSKIN_VPN_SUBNETSstr10.230.0.0/16Address range the internal networks of the VPN gateways are carved from, one /24 per gateway; change it when it collides with a network the host reaches.
SEALSKIN_AUTO_UPDATE_APPSbooltrueEnable automatic pulling of the latest app images in the background.
SEALSKIN_AUTO_UPDATE_INTERVAL_SECONDSint3600How often to check for app image updates (in seconds).
SEALSKIN_IMAGE_MIRRORSstr(empty)Mirror per upstream registry every image is pulled through, as upstream=mirror pairs separated by commas: lscr.io=registry.example/lscr,docker.io=registry.example/hub pulls lscr.io/linuxserver/firefox as registry.example/lscr/linuxserver/firefox. Records keep the upstream name.
SEALSKIN_REGISTRY_AUTH_PATHstr/config/.docker/config.jsonDocker config.json whose auths sign this node in to registries: for session and gateway images, digest checks, and the packages of PRoot Apps catalogs. Read at every use; credential helpers are not run. On Kubernetes the session template's pull secrets add to it.
SEALSKIN_NETRC_PATHstr/config/.netrcnetrc file whose machines sign this node in to the hosts of app stores, autostart scripts, logos, and the metadata and icons of PRoot Apps catalogs, with basic authentication. Read at every use.
SEALSKIN_PUIDint1000Default User ID to run containers as.
SEALSKIN_PGIDint1000Default Group ID to run containers as.
SEALSKIN_KEYS_BASE_PATHstr/config/.config/sealskin/keysBase directory for admin and user public keys.
SEALSKIN_GROUPS_BASE_PATHstr/config/.config/sealskin/groupsBase directory for group definition files.
SEALSKIN_STORAGE_PATHstr/storageBase directory for user home directories.
SEALSKIN_APP_ICONS_PATHstr/storage/sealskin_app_iconsDirectory for storing custom-uploaded application icons.
SEALSKIN_BRANDING_PATHstr/config/.config/sealskin/brandingDirectory of the brand the web app wears: branding.yml and the logo and wallpaper an administrator uploads. Shared by every node of a cluster.
SEALSKIN_HOME_TEMPLATES_PATHstr/storage/sealskin_home_templatesBase directory for meta-app home directory templates.
SEALSKIN_CONTAINER_CONFIG_PATHstr/configMount point for home directories inside the container.
SEALSKIN_SERVER_PRIVATE_KEY_PATHstr/config/ssl/server_key.pemPath to the server private key PEM file.
SEALSKIN_PROXY_KEY_PATHstr/config/ssl/proxy_key.pemPath to the proxy SSL private key file.
SEALSKIN_PROXY_CERT_PATHstr/config/ssl/proxy_cert.pemPath to the proxy SSL certificate file.
SEALSKIN_PUBLIC_STORAGE_PATHstr/storage/sealskin_publicDirectory for storing publicly shared files.
SEALSKIN_PUBLIC_SHARES_METADATA_PATHstr/config/.config/sealskin/public_shares.ymlPath to the YAML file for public share metadata.
SEALSKIN_SHARE_CLEANUP_INTERVAL_SECONDSint600How often to run the cleanup job for expired shares (in seconds).
SEALSKIN_SESSIONS_DB_PATHstr/config/.config/sealskin/sessions.ymlPath to the YAML file for session persistence.
SEALSKIN_CADDYFILE_PATHstr/config/.config/sealskin/CaddyfilePath to the generated Caddyfile for the proxy.
SEALSKIN_UI_PATHstrapp/ui inside the installed package, else <repo>/client/dist/uiDirectory holding the built web UI served under /ui.
SEALSKIN_TEMPLATE_SCHEMA_PATHstrtemplate_schema.yml next to the server packageYAML file describing the environment variables editable in app templates.
SEALSKIN_CRYPTO_SESSION_TTL_SECONDSint86400Idle lifetime of an E2EE session key before it is discarded.
SEALSKIN_SSO_KEYS_PATHstr/config/.config/sealskin/sso_keys.ymlPath to the YAML file of browser keys registered by signing in through an identity provider.
SEALSKIN_OIDC_ISSUERstr(empty)Issuer URL of an OpenID Connect provider the web app offers sign-in with; empty offers none.
SEALSKIN_OIDC_CLIENT_IDstr(empty)Client ID of SealSkin at the OpenID Connect provider.
SEALSKIN_OIDC_CLIENT_SECRETstr(empty)Client secret of SealSkin at the OpenID Connect provider; empty for a public client.
SEALSKIN_OIDC_SCOPESstropenid profile emailScopes requested from the OpenID Connect provider.
SEALSKIN_SAML_METADATA_URLstr(empty)Metadata URL of a SAML identity provider the web app offers sign-in with; empty offers none.
SEALSKIN_SSO_USERNAME_CLAIMstr(empty)Claim (OpenID Connect) or attribute (SAML, by its Name or FriendlyName) naming the SealSkin user; empty takes preferred_username, or the SAML attribute username, else the SAML NameID.
SEALSKIN_SSO_GROUPS_CLAIMstrgroupsClaim or attribute listing the user's groups at the identity provider.
SEALSKIN_SAML_USERNAME_ATTRIBUTEstr(empty)SAML attribute naming the SealSkin user, by its Name or FriendlyName, where OpenID Connect is set up beside SAML and names its claim otherwise; empty takes sso_username_claim.
SEALSKIN_SAML_GROUPS_ATTRIBUTEstr(empty)SAML attribute listing the user's groups; empty takes sso_groups_claim.
SEALSKIN_SSO_ADMIN_GROUPstr(empty)Identity provider group whose members sign in as administrators; empty makes none.
SEALSKIN_SSO_MAX_AGE_SECONDSint43200Longest an identity provider sign-in lasts; one the provider ends sooner ends then.
SEALSKIN_STORE_URLstrfileWhere the objects the nodes of a cluster share are kept: file for this server's own files, or s3://<bucket>/<prefix>?endpoint=<url>&region=<region> for a bucket of an S3-compatible service.
SEALSKIN_STORE_ACCESS_KEYstr(empty)Access key id for an S3 store.
SEALSKIN_STORE_SECRET_KEYstr(empty)Secret access key for an S3 store.
SEALSKIN_STORE_KEYstr(empty)Secret every node of a cluster holds, under which the users' shared files are encrypted on their way to a remote store, each user under a key of their own. Any long random string, the same on every node; empty sends the files as they are.
SEALSKIN_STORE_POLL_SECONDSint15How often a node looks for objects another node changed in a remote store.
SEALSKIN_CLUSTER_PATHstr/config/.config/sealskin/clusterDirectory of the cluster's shared records (nodes, pools, sign-in settings, home locations).
SEALSKIN_NODE_STATE_PATHstr/config/.config/sealskin/nodeDirectory of this node's own state: web sign-ins, its join record, and usage not yet reported.
SEALSKIN_NODE_NAMEstr(empty)Name of this node, which is its identity in the cluster: its records are kept under it, and a node started again with an empty configuration directory but the same name and storage is the same node. Empty takes the container's name in Docker, else the host name.
SEALSKIN_NODE_ROLESstrfrontend,runtimeComma-separated roles of this node: frontend signs users in and proxies their sessions, runtime runs sessions.
SEALSKIN_NODE_POOLstrdefaultPool this node joins when it first registers; an administrator can move it later.
SEALSKIN_NODE_ADDRESSstr(empty)host:port other nodes reach this node's peer listener on; empty takes the host of HOST_URL and peer_port.
SEALSKIN_NODE_MAX_SESSIONSint0Most sessions this node runs at once; 0 sets no limit.
SEALSKIN_NODE_GPU_SLOTSint0Most GPU sessions this node runs at once; 0 sets no limit.
SEALSKIN_PEER_PORTint8444Port of the listener other nodes of the cluster reach this one on.
SEALSKIN_PEER_POLL_SECONDSint10How often a node asks every other node for its sessions and load.
SEALSKIN_JOIN_URLstr(empty)host:port of the peer listener of a node of the cluster to join; with join_code, the node asks to join at start and keeps the cluster's records on that node.
SEALSKIN_JOIN_CODEstr(empty)Join code an administrator of the cluster issued for this node.
SEALSKIN_LEGACY_AUTHbooltrueAccept the key-file clients (browser extension and mobile app configuration files) and their encrypted API; they reach this node alone, never the rest of a cluster. Off, the dashboard makes sign-in-only users and no administrators. Also written for the whole cluster under Sign In.
SEALSKIN_PUBLIC_URLstr(empty)URL browsers reach the web app on, https://sealskin.example.com; empty takes HOST_URL and the session port. Set it behind a reverse proxy.
SEALSKIN_SESSION_DOMAINstr(empty)Domain whose every subdomain reaches this node, apps.example.com: with session_isolation, a session of a signed-in web user opens on <session id>.<domain>, apart from the web app. Needs wildcard DNS and a certificate for *.<domain>; empty takes the host of public_url.
SEALSKIN_SESSION_ISOLATIONboolfalseServe each session of a signed-in web user on an origin of its own, <session id>.<session_domain>, apart from the web app and the other sessions, which needs wildcard DNS and a certificate for every such name. Off serves sessions at /<session id>/ on the web app's origin, where this node serves the application's web client itself and the container answers its API alone.
SEALSKIN_WEB_CLIENT_PATHstr/usr/share/selkiesDirectory of an application image holding the Selkies web client, one dashboard per subdirectory as the linuxserver images keep them, which this node exports once per image and serves to browsers in place of the container's own copy.
SEALSKIN_TRUSTED_PROXIESstr(empty)Comma-separated addresses or networks of the reverse proxies in front of this node, whose forwarded client address and sign-in headers are believed.
SEALSKIN_PROXY_AUTH_USER_HEADERstr(empty)Header a trusted proxy names the signed-in user in, Remote-User; empty takes no sign-in from a proxy.
SEALSKIN_PROXY_AUTH_GROUPS_HEADERstr(empty)Header a trusted proxy lists the user's groups in, Remote-Groups, separated by commas or by |; empty takes no groups from a proxy. Name only a header the proxy sets.
SEALSKIN_PROXY_AUTH_UNCHECKEDboolfalseBelieve the proxy's sign-in header although this node cannot check, by reaching its own public_url or a trusted proxy's address, that the proxy removes the header a visitor sends. Leave it off wherever the check can run.
SEALSKIN_PROXY_AUTH_LOGOUT_URLstr(empty)URL the web app opens to sign out a user a proxy signed in, as the proxy's or its identity provider's logout page; empty leaves signing out to the proxy.
SEALSKIN_HTTP_PORTint0Port of a plain HTTP listener for a reverse proxy that terminates TLS, serving what the session port does; 0 opens none. It answers the addresses in trusted_proxies alone, and only requests they say arrived over HTTPS.
SEALSKIN_ROOT_KEYstr(empty)Application key the built-in administrator admin signs in to the web app with, kept as their key named environment; empty generates one at first start and writes it to root_key_path.
SEALSKIN_ROOT_KEY_PATHstr/config/root_keyFile the generated root application key is written to, for the administrator to copy and delete.
SEALSKIN_WEB_SESSION_SECONDSint43200Longest a web sign-in with the root key, or a reverse proxy's sign-in, lasts unused.
SEALSKIN_ROOT_SIGN_INbooltrueAccept the root key, the built-in administrator's, on this node's web sign-in. Turn it off once administrators sign in through an identity provider; a node restarted with it on takes the key again.
SEALSKIN_AUTO_SIGN_INstr(empty)Identity provider, oidc or saml, the web app sends a signed-out browser to at once instead of showing its sign-in page; #root on the web app's address shows the page anyway.
SEALSKIN_SSO_FORCE_LOGINboolfalseMake the identity provider ask for credentials at every sign-in instead of reusing its session.
SEALSKIN_SSO_CREATE_USERSbooltrueCreate a user at the first sign-in an identity provider or a proxy vouches for.
SEALSKIN_SSO_HOLD_NEW_USERSbooltrueHold a user a sign-in creates, who may do nothing here, until an administrator places them in a group or approves them; a user the provider puts in a group is never held. Off, new users are let in at once; those already held stay held until approved.
SEALSKIN_USAGE_FLUSH_SECONDSint300How often a node adds the session time it ran to the cluster's usage records.
SEALSKIN_FILES_SYNCstrautoKeep every user's shared files in the object store so each node a session starts on has them: on, off, or auto, which syncs once the cluster has a second node.
SEALSKIN_SHARED_FILES_PATHstr/storage/sealskin_shared_storeDirectory a file store keeps the users' shared files in.
SEALSKIN_WATCH_CONFIG_FILESbooltrueReload YAML configuration files automatically when they change on disk.