Skip to content

Server configuration

This document describes the different options for configuring a datalab instance. It is primarily intended for those who are deploying datalab on persistent hardware, but may also be useful for developers. Deployment instructions can be found under "Deploying datalab and server administration".

datalab has 3 main configuration sources.

  1. The Python ServerConfig (described below) that allows for datalab-specific configuration, such as database connection info, filestore locations and remote filesystem configuration. .
    • This can be provided via a JSON or YAML config file at the location provided by the PYDATALAB_CONFIG_FILE environment variable, or as environment variables themselves, prefixed with PYDATALAB_. The available configuration variables and their default values are listed below.
  2. Additional server configuration provided as environment variables, such as secrets like the Flask server's SECRET_KEY, API keys for external services (e.g., SMTP MAIL_PASSWORD) and OAuth client credentials (for logging in via GitHub, ORCID, etc.). These can be provided as either:
    • environment variables with the appropriate FLASK_ or PYDATALAB_ prefix (for options that are also in the config model from option 1.)
    • an .env file in the directory from which pydatalab is launched (NB: here, the FLASK_ prefix is not required, but any options present in the pydatalab config must still have the PYDATALAB_ prefix).
  3. Web app configuration, such as the URL of the relevant datalab API and branding (logo URLs, external homepage links).
    • These are typically provided as a .env file in the directory from which the webapp is built/served.
    • The main options include (a full list can be found in the docker-compose.yml file):
      • VUE_APP_API_URL: the URL of the datalab API, which is used by the web app to communicate with the server.
      • VUE_APP_LOGO_URL: the URL of an image to use as the logo header in the web app.
      • VUE_APP_HOMEPAGE_URL: a URL to provide as a link from the web app header, and as a button on the dedicated login page.
      • VUE_APP_EDITABLE_INVENTORY: whether the inventory can be edited by non-admin users in the web app.
      • VUE_APP_WEBSITE_TITLE: the title of the web app, which is displayed in the browser tab and header. It is also used in the heading of the dedicated login page, as "Welcome to the ".</li> <li><code>VUE_APP_QR_CODE_RESOLVER_URL</code>: the URL of a service that can resolve QR codes to <em>datalab</em> entries, which is used by the web app to display QR codes for entries (see <a href="https://github.com/datalab-org/datalab-purl">datalab-org/datalab-purl</a> for more information).</li> <li><code>VUE_APP_AUTOMATICALLY_GENERATE_ID_DEFAULT</code>: whether to automatically generate IDs for new entries in the web app by default, or require a checkbox to be ticked at item creation.</li> </ul> </li> </ul> </li> </ol> <div class="admonition note"> <p class="admonition-title">Note</p> <p>The possible ways to set configuration options can be inconsistent with each other, e.g., values required to be <code>None</code> in Python should be set to <code>null</code> in the JSON config file and as .env values. Similarly, boolean values may be set to <code>true</code> or <code>false</code> in the JSON config file, but can be set to {<code>1</code>, <code>yes</code>, <code>true</code>} or {<code>0</code>, <code>no</code>, <code>false</code>} in a <code>.env</code> file.</p> </div> <h2 id="mandatory-settings">Mandatory settings<a class="headerlink" href="#mandatory-settings" title="Permanent link">¶</a></h2> <p>There is only one mandatory setting when creating a deployment. This is the <a class="autorefs autorefs-internal" title=" IDENTIFIER_PREFIX" href="#pydatalab.config.ServerConfig.IDENTIFIER_PREFIX"><code>IDENTIFIER_PREFIX</code></a>, which shall be prepended to every entry's refcode to enable global uniqueness of <em>datalab</em> entries. For now, the prefixes themselves are not checked for uniqueness across the fledgling <em>datalab</em> federation, but will in the future.</p> <p>This prefix should be set to something relatively short (max 10 chars.) that describes your group or your deployment, e.g., the PI's surname, project ID or department.</p> <p>This can be set either via a config file, or as an environment variable (e.g., <code>PYDATALAB_IDENTIFIER_PREFIX='grey'</code>). Be warned, if the prefix changes between server launches, all entries will have to be migrated manually to the desired prefix, or maintained at the old prefix.</p> <h2 id="user-registration-authentication">User registration & authentication<a class="headerlink" href="#user-registration-authentication" title="Permanent link">¶</a></h2> <p><em>datalab</em> has two supported user registration/authentication mechanisms:</p> <ol> <li>OAuth2 via an OAuth provider like <a href="https://github.com">GitHub</a>, <a href="https://orcid.org">ORCID</a> or Google and Microsoft.</li> <li>via magic links sent to email addresses</li> </ol> <p>Each is configured differently. If left unconfigured, then the corresponding registration mechanism will not be available to the user.</p> <h3 id="email-magic-links">Email magic links<a class="headerlink" href="#email-magic-links" title="Permanent link">¶</a></h3> <p>To support sign-in via email magic-links, you must currently provide additional configuration for authorized SMTP server. The SMTP server must be configured via the settings <a class="autorefs autorefs-internal" title=" EMAIL_AUTH_SMTP_SETTINGS" href="#pydatalab.config.ServerConfig.EMAIL_AUTH_SMTP_SETTINGS"><code>EMAIL_AUTH_SMTP_SETTINGS</code></a>, with expected values <code>MAIL_SERVER</code>, <code>MAIL_USER</code>, <code>MAIL_DEFAULT_SENDER</code>, <code>MAIL_PORT</code> and <code>MAIL_USE_TLS</code>, following the environment variables described in the <a href="https://flask-mail.readthedocs.io/en/latest/#configuring-flask-mail">Flask-Mail documentation</a>. The <code>MAIL_PASSWORD</code> setting should then be provided via a <code>.env</code> file.</p> <p>Third-party options with a free tier include <a href="https://resend.com/">resend</a>, which can be configured to use an appropriate API key, after verifying ownership of the <code>MAIL_DEFAULT_SENDER</code> address via DNS (see <a href="https://resend.com/docs/dashboard/domains/introduction">resend</a> for an example configuration).</p> <p>The email addresses that are allowed to sign up can be restricted by domain/subdomain using the <a class="autorefs autorefs-internal" title=" EMAIL_DOMAIN_ALLOW_LIST" href="#pydatalab.config.ServerConfig.EMAIL_DOMAIN_ALLOW_LIST"><code>EMAIL_DOMAIN_ALLOW_LIST</code></a> setting.</p> <p>If SMTP settings are required for notification emails but email magic-link sign-in should be disabled, set <a class="autorefs autorefs-internal" title=" DISABLE_MAGIC_LINK_AUTH" href="#pydatalab.config.ServerConfig.DISABLE_MAGIC_LINK_AUTH"><code>DISABLE_MAGIC_LINK_AUTH</code></a> to <code>true</code>. This hides email authentication from the advertised authentication mechanisms and rejects direct requests to generate or consume magic links.</p> <h3 id="oauth2">OAuth2<a class="headerlink" href="#oauth2" title="Permanent link">¶</a></h3> <p>OAuth2 allows users to log in using their existing accounts with third-party providers, without the need for a password. Generally, you register an application with the provider, which gives you a client ID and secret that you can use to configure the OAuth2 settings in <em>datalab</em>.</p> <p>When the dedicated login page is enabled, the web app preserves the requested internal page through the external OAuth flow and returns the user to it after login. This redirect uses <a class="autorefs autorefs-internal" title=" APP_URL" href="#pydatalab.config.ServerConfig.APP_URL"><code>APP_URL</code></a> as the trusted web app origin, so <code>APP_URL</code> must be configured correctly.</p> <p>Each provider then has bespoke settings to control the permissions that accounts registered via the external provider will have.</p> <p>For developers, if you are testing locally without HTTPS, you must also set <code>OAUTHLIB_INSECURE_TRANSPORT=1</code> and <code>OAUTHLIB_RELAX_TOKEN_SCOPE=1</code> in your environment to circumvent security requirements; this should not be used in production.</p> <div class="admonition note"> <p class="admonition-title">Note</p> <p>A common user confusion occurs when they register an account via an OAuth provider, but then try to log in via email magic link (or vice versa) (or via another OAuth provider). These accounts will not be associated with each other, so the user will end up with multiple accounts that they have to log in to separately. Admins can merge the accounts manually, or simply delete the duplicates and ask the user to login via the appropriate method before trying to connect the other external account.</p> </div> <h4 id="github-oauth2">GitHub OAuth2<a class="headerlink" href="#github-oauth2" title="Permanent link">¶</a></h4> <p>For GitHub, you must register a <a href="https://docs.github.com/en/apps/oauth-apps/building-oauth-apps/creating-an-oauth-app">GitHub OAuth application</a> for your instance, providing the client ID and secret in the <code>.env</code> for the API, using the variable names <code>GITHUB_OAUTH_CLIENT_ID</code> and <code>GITHUB_OAUTH_CLIENT_SECRET</code>. These should be provided in a <code>.env</code> file local to your app and not added to your main config file.</p> <p>The authorization callback URL in the GitHub app settings should be set to <code><YOUR_API_URL>/login/github/authorized</code>.</p> <p>Then, you can configure <a class="autorefs autorefs-internal" title=" GITHUB_ORG_ALLOW_LIST" href="#pydatalab.config.ServerConfig.GITHUB_ORG_ALLOW_LIST"><code>GITHUB_ORG_ALLOW_LIST</code></a> with a list of string IDs of GitHub organizations that user's must be a public member of to register an account. If this value is set to <code>None</code>, then any GitHub account will be able to register, and if it is set to an empty list, then no accounts will be able to register. You can find the relevant organization IDs using the GitHub API, for example at <code>https://api.github.com/orgs/<org_name></code>.</p> <h4 id="google-oauth2">Google OAuth2<a class="headerlink" href="#google-oauth2" title="Permanent link">¶</a></h4> <p>For Google, you must register a <a href="https://developers.google.com/identity/protocols/oauth2/web-server">Google OAuth 2.0 Client</a> in the Google Cloud Console for your instance. You need to provide the client ID and secret in the <code>.env</code> file for the API using the variable names <code>GOOGLE_OAUTH_CLIENT_ID</code> and <code>GOOGLE_OAUTH_CLIENT_SECRET</code>.</p> <p>The Authorized redirect URI in the Google Cloud settings must be set to <code><YOUR_API_URL>/login/google/authorized</code>.</p> <p>You can restrict registration to specific email domains using the <a class="autorefs autorefs-internal" title=" EMAIL_DOMAIN_ALLOW_LIST" href="#pydatalab.config.ServerConfig.EMAIL_DOMAIN_ALLOW_LIST"><code>EMAIL_DOMAIN_ALLOW_LIST</code></a> setting. If this is set to <code>None</code> or <code>null</code>, any user with a Google account can register.</p> <h4 id="microsoft-oauth2">Microsoft OAuth2<a class="headerlink" href="#microsoft-oauth2" title="Permanent link">¶</a></h4> <p>For Microsoft (Azure AD), you must register an <a href="https://learn.microsoft.com/en-us/entra/identity-platform/v2-app-types#web-apps">Azure App Registration</a> for your instance, providing the client ID and secret in the <code>.env</code> for the API, using the variable names <code>MICROSOFT_OAUTH_CLIENT_ID</code> and <code>MICROSOFT_OAUTH_CLIENT_SECRET</code>. These should be provided in a <code>.env</code> file local to your app and not added to your main config file.</p> <p>The redirect URI in the Azure app settings should be set to <code><YOUR_API_URL>/login/microsoft/authorized</code>. When creating the credentials in the Azure Portal, ensure you navigate to "Certificates & secrets" and copy the <strong>Value</strong> of the client secret, as the "Secret ID" cannot be used for authentication.</p> <p>By default, any Microsoft account (work, school, or personal) can be used to register if the application is configured as "Multi-tenant" in Azure.</p> <h4 id="orcid-oauth2">ORCID OAuth2<a class="headerlink" href="#orcid-oauth2" title="Permanent link">¶</a></h4> <p>For <a href="https://orcid.org">ORCID</a> integration, each <em>datalab</em> instance must currently register for the ORCID developer program and request new credentials for their public API. These credentials can then be provided via the <code>ORCID_OAUTH_CLIENT_ID</code> and <code>ORCID_OAUTH_CLIENT_SECRET</code> environment variables, in the same way as the GitHub settings above.</p> <h2 id="remote-filesystems">Remote filesystems<a class="headerlink" href="#remote-filesystems" title="Permanent link">¶</a></h2> <p>This package allows you to attach files from remote filesystems to samples and other entries. These filesystems can be configured in the config file with the <a class="autorefs autorefs-internal" title=" REMOTE_FILESYSTEMS" href="#pydatalab.config.ServerConfig.REMOTE_FILESYSTEMS"><code>REMOTE_FILESYSTEMS</code></a> option. In practice, these options should be set in a centralised deployment.</p> <p>Currently, there are two mechanisms for accessing remote files:</p> <ol> <li>You can mount the filesystem locally and provide the path in your datalab config file. For example, for Cambridge Chemistry users, you will have to (connect to the ChemNet VPN and) mount the Grey Group backup servers on your local machine, then define these folders in your config.</li> <li>Access over SSH: alternatively, you can set up passwordless <code>ssh</code> access to a machine (e.g., using <code>citadel</code> as a proxy jump), and paths on that remote machine can be configured as separate filesystems. The filesystem metadata will be synced periodically, and any files attached in <code>datalab</code> will be downloaded and stored locally on the <code>pydatalab</code> server (with the file being kept younger than 1 hour old on each access).</li> </ol> <h2 id="customisation-and-branding">Customisation and branding<a class="headerlink" href="#customisation-and-branding" title="Permanent link">¶</a></h2> <p>Deployments can customise the look and feel of their <em>datalab</em> instance by providing files under a <code>public/custom/</code> directory in the web app. This directory can be a symlink to a folder in your deployment repository, or mounted as a volume in Docker. It should be made available at <code>webapp/public/custom/</code> relative to the <em>datalab</em> source tree.</p> <p>The following customisations are supported:</p> <h3 id="css-overrides-publiccustomoverridecss">CSS overrides (<code>public/custom/override.css</code>)<a class="headerlink" href="#css-overrides-publiccustomoverridecss" title="Permanent link">¶</a></h3> <p>A CSS file that is loaded globally before the app styles, allowing you to override any default styling. Common uses include setting a custom font, accent colours, or other branding tweaks. If this file does not exist, it is silently ignored.</p> <p>For example, to set a custom font globally:</p> <div class="highlight"><pre><span></span><code><span class="p">@</span><span class="k">font-face</span><span class="w"> </span><span class="p">{</span> <span class="w"> </span><span class="nt">font-family</span><span class="o">:</span><span class="w"> </span><span class="s2">"My Custom Font"</span><span class="o">;</span> <span class="w"> </span><span class="nt">src</span><span class="o">:</span><span class="w"> </span><span class="nt">url</span><span class="o">(</span><span class="s2">"fonts/MyCustomFont-Regular.woff2"</span><span class="o">)</span><span class="w"> </span><span class="nt">format</span><span class="o">(</span><span class="s2">"woff2"</span><span class="o">);</span> <span class="w"> </span><span class="nt">font-weight</span><span class="o">:</span><span class="w"> </span><span class="nt">400</span><span class="o">;</span> <span class="p">}</span> <span class="p">:</span><span class="nd">root</span><span class="w"> </span><span class="p">{</span> <span class="w"> </span><span class="nv">--custom-font-family</span><span class="p">:</span><span class="w"> </span><span class="s2">"My Custom Font"</span><span class="p">;</span> <span class="p">}</span> <span class="p">#</span><span class="nn">app</span><span class="w"> </span><span class="p">{</span> <span class="w"> </span><span class="k">font-family</span><span class="p">:</span><span class="w"> </span><span class="nf">var</span><span class="p">(</span><span class="nv">--custom-font-family</span><span class="p">),</span><span class="w"> </span><span class="kc">sans-serif</span><span class="p">;</span> <span class="p">}</span> </code></pre></div> <h3 id="custom-fonts-publiccustomfonts">Custom fonts (<code>public/custom/fonts/</code>)<a class="headerlink" href="#custom-fonts-publiccustomfonts" title="Permanent link">¶</a></h3> <p>Place font files (<code>.woff2</code>, <code>.ttf</code>, etc.) in this directory and reference them from <code>override.css</code> using relative paths (e.g., <code>url("fonts/MyFont.woff2")</code>).</p> <h3 id="custom-logos-publiccustomlogos">Custom logos (<code>public/custom/logos/</code>)<a class="headerlink" href="#custom-logos-publiccustomlogos" title="Permanent link">¶</a></h3> <p>Place logo images in this directory. They can be referenced from custom components or CSS using absolute paths (e.g., <code>/custom/logos/mylogo.png</code>).</p> <p>The main instance logo can also be customised via the <code>VUE_APP_LOGO_URL</code> environment variable, which accepts a path relative to the <code>public/</code> directory.</p> <h3 id="custom-about-page-publiccustomcomponentscustomaboutvue">Custom about page (<code>public/custom/components/CustomAbout.vue</code>)<a class="headerlink" href="#custom-about-page-publiccustomcomponentscustomaboutvue" title="Permanent link">¶</a></h3> <p>Deployments can provide a custom Vue component that will be displayed in a collapsible panel on the About page. Place a <code>CustomAbout.vue</code> file in <code>public/custom/components/</code> and it will automatically replace the default empty skeleton at build time (via webpack's <code>NormalModuleReplacementPlugin</code>).</p> <p>The component can contain any valid Vue template, script and scoped styles. No special configuration or flags are needed — if the file exists, it will be used.</p> <h3 id="custom-login-page-content-publiccustomcomponentscustomlogininfovue">Custom login page content (<code>public/custom/components/CustomLoginInfo.vue</code>)<a class="headerlink" href="#custom-login-page-content-publiccustomcomponentscustomlogininfovue" title="Permanent link">¶</a></h3> <p>Deployments can provide a custom Vue component for the content of the login box. Place a <code>CustomLoginInfo.vue</code> file in <code>public/custom/components/</code> and it will automatically replace the built-in <code>LoginInfo.vue</code> component at build time. If no custom component is provided, the built-in login welcome content is used.</p> <p>Authentication buttons and login behaviour remain managed by <em>datalab</em>. The login controls are passed to the component as a <code>login</code> slot: place <code><slot name="login" /></code> wherever they should appear (the built-in component puts them directly under the title). If the slot is omitted, users will have no way to log in from this page. The custom component should otherwise only provide branding, text, links, images, and styling for the login box. To reuse content from <a href="#custom-about-page-publiccustomcomponentscustomaboutvue"><code>CustomAbout.vue</code></a>, copy it into this component. The deployment logo (<code>VUE_APP_LOGO_URL</code>) is already shown at the top of the box, so it does not need to be included.</p> <p>For example:</p> <div class="highlight"><pre><span></span><code><span class="p"><</span><span class="nt">template</span><span class="p">></span> <span class="p"><</span><span class="nt">h1</span><span class="p">></span>My lab datalab<span class="p"></</span><span class="nt">h1</span><span class="p">></span> <span class="p"><</span><span class="nt">p</span><span class="p">></span>Research data management for our group.<span class="p"></</span><span class="nt">p</span><span class="p">></span> <span class="p"><</span><span class="nt">slot</span> <span class="na">name</span><span class="o">=</span><span class="s">"login"</span> <span class="p">/></span> <span class="p"></</span><span class="nt">template</span><span class="p">></span> <span class="p"><</span><span class="nt">script</span><span class="p">></span> <span class="k">export</span><span class="w"> </span><span class="k">default</span><span class="w"> </span><span class="p">{</span> <span class="w"> </span><span class="nx">name</span><span class="o">:</span><span class="w"> </span><span class="s2">"CustomLoginInfo"</span><span class="p">,</span> <span class="p">};</span> <span class="p"></</span><span class="nt">script</span><span class="p">></span> </code></pre></div> <p>Login page colours and sizes can also be tuned from <code>public/custom/override.css</code> without providing a custom component:</p> <div class="highlight"><pre><span></span><code><span class="p">:</span><span class="nd">root</span><span class="w"> </span><span class="p">{</span> <span class="w"> </span><span class="nv">--login-background</span><span class="p">:</span><span class="w"> </span><span class="mh">#f5f6f8</span><span class="p">;</span><span class="w"> </span><span class="c">/* page background */</span> <span class="w"> </span><span class="nv">--login-box-background</span><span class="p">:</span><span class="w"> </span><span class="kc">white</span><span class="p">;</span> <span class="w"> </span><span class="nv">--login-box-color</span><span class="p">:</span><span class="w"> </span><span class="mh">#222</span><span class="p">;</span> <span class="w"> </span><span class="nv">--login-max-width</span><span class="p">:</span><span class="w"> </span><span class="mi">26</span><span class="kt">rem</span><span class="p">;</span><span class="w"> </span><span class="c">/* maximum width of the login box */</span> <span class="w"> </span><span class="nv">--login-logo-max-width</span><span class="p">:</span><span class="w"> </span><span class="mi">240</span><span class="kt">px</span><span class="p">;</span> <span class="w"> </span><span class="nv">--login-logo-max-height</span><span class="p">:</span><span class="w"> </span><span class="mi">120</span><span class="kt">px</span><span class="p">;</span> <span class="p">}</span> </code></pre></div> <h3 id="directory-structure">Directory structure<a class="headerlink" href="#directory-structure" title="Permanent link">¶</a></h3> <p>A typical deployment customisation directory looks like:</p> <div class="highlight"><pre><span></span><code>public/custom/ ├── override.css ├── fonts/ │ ├── MyFont-Regular.woff2 │ └── MyFont-Bold.woff2 ├── logos/ │ └── mylogo.png └── components/ ├── CustomAbout.vue └── CustomLoginInfo.vue </code></pre></div> <h2 id="config-api-reference">Config API Reference<a class="headerlink" href="#config-api-reference" title="Permanent link">¶</a></h2> <div class="doc doc-object doc-class"> <h2 id="pydatalab.config.ServerConfig" class="doc doc-heading"> <code class="doc-symbol doc-symbol-heading doc-symbol-class"></code> <span class="doc doc-object-name doc-class-name">pydatalab.config.ServerConfig</span> <a href="#pydatalab.config.ServerConfig" class="headerlink" title="Permanent link">¶</a></h2> <div class="doc doc-contents first"> <p class="doc doc-class-bases"> Bases: <code><a class="autorefs autorefs-external" title="pydantic_settings.BaseSettings" href="https://docs.pydantic.dev/latest/api/pydantic_settings/#pydantic_settings.BaseSettings">BaseSettings</a></code></p> <p>A model that provides settings for deploying the API.</p> <p>Config:</p> <ul> <li><code>env_prefix</code>: <code class="highlight language-python"><span class="n">PYDATALAB_</span></code></li> <li><code>extra</code>: <code class="highlight language-python"><span class="n">allow</span></code></li> <li><code>env_file</code>: <code class="highlight language-python"><span class="o">.</span><span class="n">env</span></code></li> <li><code>env_file_encoding</code>: <code class="highlight language-python"><span class="n">utf</span><span class="o">-</span><span class="mi">8</span></code></li> <li><code>validate_assignment</code>: <code class="highlight language-python"><span class="kc">True</span></code></li> <li><code>case_sensitive</code>: <code class="highlight language-python"><span class="kc">False</span></code></li> </ul> <div class="doc doc-children"> <div class="doc doc-object doc-attribute"> <h3 id="pydatalab.config.ServerConfig.APP_URL" class="doc doc-heading"> <code class="doc-symbol doc-symbol-heading doc-symbol-attribute"></code> <span class="doc doc-object-name doc-attribute-name">APP_URL</span> <a href="#pydatalab.config.ServerConfig.APP_URL" class="headerlink" title="Permanent link">¶</a></h3> <div class="doc-signature highlight"><pre><span></span><code><span class="n">APP_URL</span><span class="p">:</span> <span class="n"><a class="autorefs autorefs-external" href="https://docs.python.org/3/builtins/stdtypes.html#str">str</a></span> <span class="o">|</span> <span class="kc">None</span> <span class="o">=</span> <span class="kc">None</span> </code></pre></div> <div class="doc doc-contents "> <p>The canonical URL for any UI associated with this instance; will be used for redirects on user login/registration.</p> </div> </div> <div class="doc doc-object doc-attribute"> <h3 id="pydatalab.config.ServerConfig.ASYNC_BLOCK_TYPES" class="doc doc-heading"> <code class="doc-symbol doc-symbol-heading doc-symbol-attribute"></code> <span class="doc doc-object-name doc-attribute-name">ASYNC_BLOCK_TYPES</span> <a href="#pydatalab.config.ServerConfig.ASYNC_BLOCK_TYPES" class="headerlink" title="Permanent link">¶</a></h3> <div class="doc-signature highlight"><pre><span></span><code><span class="n">ASYNC_BLOCK_TYPES</span><span class="p">:</span> <span class="n"><a class="autorefs autorefs-external" href="https://docs.python.org/3/builtins/stdtypes.html#list">list</a></span><span class="p">[</span><span class="n"><a class="autorefs autorefs-external" href="https://docs.python.org/3/builtins/stdtypes.html#str">str</a></span><span class="p">]</span> <span class="o">=</span> <span class="p">[]</span> </code></pre></div> <div class="doc doc-contents "> <p>A list of block type slugs (e.g. ['cycle', 'xrd']) that should be processed asynchronously via the task queue. Defaults to no blocks.</p> </div> </div> <div class="doc doc-object doc-attribute"> <h3 id="pydatalab.config.ServerConfig.AUTO_ACTIVATE_ACCOUNTS" class="doc doc-heading"> <code class="doc-symbol doc-symbol-heading doc-symbol-attribute"></code> <span class="doc doc-object-name doc-attribute-name">AUTO_ACTIVATE_ACCOUNTS</span> <a href="#pydatalab.config.ServerConfig.AUTO_ACTIVATE_ACCOUNTS" class="headerlink" title="Permanent link">¶</a></h3> <div class="doc-signature highlight"><pre><span></span><code><span class="n">AUTO_ACTIVATE_ACCOUNTS</span><span class="p">:</span> <span class="n"><a class="autorefs autorefs-external" href="https://docs.python.org/3/builtins/functions.html#bool">bool</a></span> <span class="o">=</span> <span class="kc">False</span> </code></pre></div> <div class="doc doc-contents "> <p>Whether to automatically activate accounts created via any registration method.</p> </div> </div> <div class="doc doc-object doc-attribute"> <h3 id="pydatalab.config.ServerConfig.BACKUP_STRATEGIES" class="doc doc-heading"> <code class="doc-symbol doc-symbol-heading doc-symbol-attribute"></code> <span class="doc doc-object-name doc-attribute-name">BACKUP_STRATEGIES</span> <a href="#pydatalab.config.ServerConfig.BACKUP_STRATEGIES" class="headerlink" title="Permanent link">¶</a></h3> <div class="doc-signature highlight"><pre><span></span><code><span class="n">BACKUP_STRATEGIES</span><span class="p">:</span> <span class="n"><a class="autorefs autorefs-external" href="https://docs.python.org/3/builtins/stdtypes.html#dict">dict</a></span><span class="p">[</span><span class="n"><a class="autorefs autorefs-external" href="https://docs.python.org/3/builtins/stdtypes.html#str">str</a></span><span class="p">,</span> <span class="n"><span title="pydatalab.config.BackupStrategy">BackupStrategy</span></span><span class="p">]</span> <span class="o">|</span> <span class="kc">None</span> <span class="o">=</span> <span class="p">{</span><span class="s1">'daily-snapshots'</span><span class="p">:</span> <span class="n"><span title="pydatalab.config.BackupStrategy">BackupStrategy</span></span><span class="p">(</span><span class="n"><span title="pydatalab.config.BackupStrategy(hostname)">hostname</span></span><span class="o">=</span><span class="kc">None</span><span class="p">,</span> <span class="n"><span title="pydatalab.config.BackupStrategy(location)">location</span></span><span class="o">=</span><span class="s1">'/tmp/datalab-backups/daily-snapshots/'</span><span class="p">,</span> <span class="n"><span title="pydatalab.config.BackupStrategy(frequency)">frequency</span></span><span class="o">=</span><span class="s1">'5 4 * * *'</span><span class="p">,</span> <span class="n"><span title="pydatalab.config.BackupStrategy(retention)">retention</span></span><span class="o">=</span><span class="mi">7</span><span class="p">),</span> <span class="s1">'weekly-snapshots'</span><span class="p">:</span> <span class="n"><span title="pydatalab.config.BackupStrategy">BackupStrategy</span></span><span class="p">(</span><span class="n"><span title="pydatalab.config.BackupStrategy(hostname)">hostname</span></span><span class="o">=</span><span class="kc">None</span><span class="p">,</span> <span class="n"><span title="pydatalab.config.BackupStrategy(location)">location</span></span><span class="o">=</span><span class="s1">'/tmp/datalab-backups/weekly-snapshots/'</span><span class="p">,</span> <span class="n"><span title="pydatalab.config.BackupStrategy(frequency)">frequency</span></span><span class="o">=</span><span class="s1">'5 3 * * 1'</span><span class="p">,</span> <span class="n"><span title="pydatalab.config.BackupStrategy(retention)">retention</span></span><span class="o">=</span><span class="mi">5</span><span class="p">),</span> <span class="s1">'quarterly-snapshots'</span><span class="p">:</span> <span class="n"><span title="pydatalab.config.BackupStrategy">BackupStrategy</span></span><span class="p">(</span><span class="n"><span title="pydatalab.config.BackupStrategy(hostname)">hostname</span></span><span class="o">=</span><span class="kc">None</span><span class="p">,</span> <span class="n"><span title="pydatalab.config.BackupStrategy(location)">location</span></span><span class="o">=</span><span class="s1">'/tmp/datalab-backups/quarterly-snapshots/'</span><span class="p">,</span> <span class="n"><span title="pydatalab.config.BackupStrategy(frequency)">frequency</span></span><span class="o">=</span><span class="s1">'5 2 1 1,4,7,10 *'</span><span class="p">,</span> <span class="n"><span title="pydatalab.config.BackupStrategy(retention)">retention</span></span><span class="o">=</span><span class="mi">4</span><span class="p">)}</span> </code></pre></div> <div class="doc doc-contents "> <p>The desired backup configuration.</p> </div> </div> <div class="doc doc-object doc-attribute"> <h3 id="pydatalab.config.ServerConfig.BEHIND_REVERSE_PROXY" class="doc doc-heading"> <code class="doc-symbol doc-symbol-heading doc-symbol-attribute"></code> <span class="doc doc-object-name doc-attribute-name">BEHIND_REVERSE_PROXY</span> <a href="#pydatalab.config.ServerConfig.BEHIND_REVERSE_PROXY" class="headerlink" title="Permanent link">¶</a></h3> <div class="doc-signature highlight"><pre><span></span><code><span class="n">BEHIND_REVERSE_PROXY</span><span class="p">:</span> <span class="n"><a class="autorefs autorefs-external" href="https://docs.python.org/3/builtins/functions.html#bool">bool</a></span> <span class="o">=</span> <span class="kc">False</span> </code></pre></div> <div class="doc doc-contents "> <p>Whether the Flask app is being deployed behind a reverse proxy. If <code>True</code>, the reverse proxy middleware described in the <a href="https://flask.palletsprojects.com/en/2.2.x/deploying/proxy_fix/">Flask docs</a> will be attached to the app.</p> </div> </div> <div class="doc doc-object doc-attribute"> <h3 id="pydatalab.config.ServerConfig.CUSTOM_ITEM_MODELS" class="doc doc-heading"> <code class="doc-symbol doc-symbol-heading doc-symbol-attribute"></code> <span class="doc doc-object-name doc-attribute-name">CUSTOM_ITEM_MODELS</span> <a href="#pydatalab.config.ServerConfig.CUSTOM_ITEM_MODELS" class="headerlink" title="Permanent link">¶</a></h3> <div class="doc-signature highlight"><pre><span></span><code><span class="n">CUSTOM_ITEM_MODELS</span><span class="p">:</span> <span class="n"><a class="autorefs autorefs-external" href="https://docs.python.org/3/builtins/stdtypes.html#list">list</a></span><span class="p">[</span><span class="n"><a class="autorefs autorefs-external" href="https://docs.python.org/3/builtins/stdtypes.html#str">str</a></span><span class="p">]</span> <span class="o">=</span> <span class="p">[]</span> </code></pre></div> <div class="doc doc-contents "> <p>A list of dotted import paths ('package.module:ClassName') to custom <code>Item</code> subclasses to register as additional item types served through the generic item endpoints, e.g. ['mypackage.models:MySample']. Each model must declare its own unique <code>type</code> literal.</p> </div> </div> <div class="doc doc-object doc-attribute"> <h3 id="pydatalab.config.ServerConfig.DEBUG" class="doc doc-heading"> <code class="doc-symbol doc-symbol-heading doc-symbol-attribute"></code> <span class="doc doc-object-name doc-attribute-name">DEBUG</span> <a href="#pydatalab.config.ServerConfig.DEBUG" class="headerlink" title="Permanent link">¶</a></h3> <div class="doc-signature highlight"><pre><span></span><code><span class="n">DEBUG</span><span class="p">:</span> <span class="n"><a class="autorefs autorefs-external" href="https://docs.python.org/3/builtins/functions.html#bool">bool</a></span> <span class="o">=</span> <span class="kc">True</span> </code></pre></div> <div class="doc doc-contents "> <p>Whether to enable debug-level logging in the server.</p> </div> </div> <div class="doc doc-object doc-attribute"> <h3 id="pydatalab.config.ServerConfig.DEPLOYMENT_METADATA" class="doc doc-heading"> <code class="doc-symbol doc-symbol-heading doc-symbol-attribute"></code> <span class="doc doc-object-name doc-attribute-name">DEPLOYMENT_METADATA</span> <a href="#pydatalab.config.ServerConfig.DEPLOYMENT_METADATA" class="headerlink" title="Permanent link">¶</a></h3> <div class="doc-signature highlight"><pre><span></span><code><span class="n">DEPLOYMENT_METADATA</span><span class="p">:</span> <span class="n"><a class="autorefs autorefs-internal" title=" pydatalab.config.DeploymentMetadata" href="#pydatalab.config.DeploymentMetadata">DeploymentMetadata</a></span> <span class="o">|</span> <span class="kc">None</span> <span class="o">=</span> <span class="kc">None</span> </code></pre></div> <div class="doc doc-contents "> <p>A dictionary containing metadata to serve at <code>/info</code>.</p> </div> </div> <div class="doc doc-object doc-attribute"> <h3 id="pydatalab.config.ServerConfig.DISABLE_MAGIC_LINK_AUTH" class="doc doc-heading"> <code class="doc-symbol doc-symbol-heading doc-symbol-attribute"></code> <span class="doc doc-object-name doc-attribute-name">DISABLE_MAGIC_LINK_AUTH</span> <a href="#pydatalab.config.ServerConfig.DISABLE_MAGIC_LINK_AUTH" class="headerlink" title="Permanent link">¶</a></h3> <div class="doc-signature highlight"><pre><span></span><code><span class="n">DISABLE_MAGIC_LINK_AUTH</span><span class="p">:</span> <span class="n"><a class="autorefs autorefs-external" href="https://docs.python.org/3/builtins/functions.html#bool">bool</a></span> <span class="o">=</span> <span class="kc">False</span> </code></pre></div> <div class="doc doc-contents "> <p>Whether to disable magic-link email authentication while retaining SMTP-backed notification emails.</p> </div> </div> <div class="doc doc-object doc-attribute"> <h3 id="pydatalab.config.ServerConfig.EMAIL_AUTH_SMTP_SETTINGS" class="doc doc-heading"> <code class="doc-symbol doc-symbol-heading doc-symbol-attribute"></code> <span class="doc doc-object-name doc-attribute-name">EMAIL_AUTH_SMTP_SETTINGS</span> <a href="#pydatalab.config.ServerConfig.EMAIL_AUTH_SMTP_SETTINGS" class="headerlink" title="Permanent link">¶</a></h3> <div class="doc-signature highlight"><pre><span></span><code><span class="n">EMAIL_AUTH_SMTP_SETTINGS</span><span class="p">:</span> <span class="n"><a class="autorefs autorefs-internal" title=" pydatalab.config.SMTPSettings" href="#pydatalab.config.SMTPSettings">SMTPSettings</a></span> <span class="o">|</span> <span class="kc">None</span> <span class="o">=</span> <span class="kc">None</span> </code></pre></div> <div class="doc doc-contents "> <p>A dictionary containing SMTP settings for sending emails for account registration.</p> </div> </div> <div class="doc doc-object doc-attribute"> <h3 id="pydatalab.config.ServerConfig.EMAIL_AUTO_ACTIVATE_ACCOUNTS" class="doc doc-heading"> <code class="doc-symbol doc-symbol-heading doc-symbol-attribute"></code> <span class="doc doc-object-name doc-attribute-name">EMAIL_AUTO_ACTIVATE_ACCOUNTS</span> <a href="#pydatalab.config.ServerConfig.EMAIL_AUTO_ACTIVATE_ACCOUNTS" class="headerlink" title="Permanent link">¶</a></h3> <div class="doc-signature highlight"><pre><span></span><code><span class="n">EMAIL_AUTO_ACTIVATE_ACCOUNTS</span><span class="p">:</span> <span class="n"><a class="autorefs autorefs-external" href="https://docs.python.org/3/builtins/functions.html#bool">bool</a></span> <span class="o">=</span> <span class="kc">False</span> </code></pre></div> <div class="doc doc-contents "> <p>Whether to automatically activate accounts created via email registration.</p> </div> </div> <div class="doc doc-object doc-attribute"> <h3 id="pydatalab.config.ServerConfig.EMAIL_DOMAIN_ALLOW_LIST" class="doc doc-heading"> <code class="doc-symbol doc-symbol-heading doc-symbol-attribute"></code> <span class="doc doc-object-name doc-attribute-name">EMAIL_DOMAIN_ALLOW_LIST</span> <a href="#pydatalab.config.ServerConfig.EMAIL_DOMAIN_ALLOW_LIST" class="headerlink" title="Permanent link">¶</a></h3> <div class="doc-signature highlight"><pre><span></span><code><span class="n">EMAIL_DOMAIN_ALLOW_LIST</span><span class="p">:</span> <span class="n"><a class="autorefs autorefs-external" href="https://docs.python.org/3/builtins/stdtypes.html#list">list</a></span><span class="p">[</span><span class="n"><a class="autorefs autorefs-external" href="https://docs.python.org/3/builtins/stdtypes.html#str">str</a></span><span class="p">]</span> <span class="o">|</span> <span class="kc">None</span> <span class="o">=</span> <span class="p">[]</span> </code></pre></div> <div class="doc doc-contents "> <p>A list of domains for which users will be able to register accounts if they have a matching verified email address, which still need to be verified by an admin. Setting the value to <code>None</code> will allow any email addresses at any domain to register <em>and activate</em> an account, otherwise the default <code>[]</code> will not allow any email addresses registration.</p> </div> </div> <div class="doc doc-object doc-attribute"> <h3 id="pydatalab.config.ServerConfig.ENABLE_TAGS" class="doc doc-heading"> <code class="doc-symbol doc-symbol-heading doc-symbol-attribute"></code> <span class="doc doc-object-name doc-attribute-name">ENABLE_TAGS</span> <a href="#pydatalab.config.ServerConfig.ENABLE_TAGS" class="headerlink" title="Permanent link">¶</a></h3> <div class="doc-signature highlight"><pre><span></span><code><span class="n">ENABLE_TAGS</span><span class="p">:</span> <span class="n"><a class="autorefs autorefs-external" href="https://docs.python.org/3/builtins/functions.html#bool">bool</a></span> <span class="o">=</span> <span class="kc">False</span> </code></pre></div> <div class="doc doc-contents "> <p>Whether to enable the (experimental) item tags feature and its <code>/tags</code> API routes.</p> </div> </div> <div class="doc doc-object doc-attribute"> <h3 id="pydatalab.config.ServerConfig.FILE_DIRECTORY" class="doc doc-heading"> <code class="doc-symbol doc-symbol-heading doc-symbol-attribute"></code> <span class="doc doc-object-name doc-attribute-name">FILE_DIRECTORY</span> <a href="#pydatalab.config.ServerConfig.FILE_DIRECTORY" class="headerlink" title="Permanent link">¶</a></h3> <div class="doc-signature highlight"><pre><span></span><code><span class="n">FILE_DIRECTORY</span><span class="p">:</span> <span class="n"><a class="autorefs autorefs-external" href="https://docs.python.org/3/builtins/stdtypes.html#str">str</a></span> <span class="o">|</span> <span class="n"><a class="autorefs autorefs-external" title="pathlib.Path" href="https://docs.python.org/3/library/pathlib.html#pathlib.Path">Path</a></span> <span class="o">=</span> <span class="n"><a class="autorefs autorefs-external" title="pathlib.Path" href="https://docs.python.org/3/library/pathlib.html#pathlib.Path">Path</a></span><span class="p">(</span><span class="n"><span title="__file__">__file__</span></span><span class="p">)</span><span class="o">.</span><span class="n"><span title="parent">parent</span></span><span class="o">.</span><span class="n"><span title="parent.joinpath">joinpath</span></span><span class="p">(</span><span class="s1">'../files'</span><span class="p">)</span><span class="o">.</span><span class="n"><span title="resolve">resolve</span></span><span class="p">()</span> </code></pre></div> <div class="doc doc-contents "> <p>The path under which to place stored files uploaded to the server.</p> </div> </div> <div class="doc doc-object doc-attribute"> <h3 id="pydatalab.config.ServerConfig.GITHUB_ORG_ALLOW_LIST" class="doc doc-heading"> <code class="doc-symbol doc-symbol-heading doc-symbol-attribute"></code> <span class="doc doc-object-name doc-attribute-name">GITHUB_ORG_ALLOW_LIST</span> <a href="#pydatalab.config.ServerConfig.GITHUB_ORG_ALLOW_LIST" class="headerlink" title="Permanent link">¶</a></h3> <div class="doc-signature highlight"><pre><span></span><code><span class="n">GITHUB_ORG_ALLOW_LIST</span><span class="p">:</span> <span class="n"><a class="autorefs autorefs-external" href="https://docs.python.org/3/builtins/stdtypes.html#list">list</a></span><span class="p">[</span><span class="n"><a class="autorefs autorefs-external" href="https://docs.python.org/3/builtins/stdtypes.html#str">str</a></span><span class="p">]</span> <span class="o">|</span> <span class="kc">None</span> <span class="o">=</span> <span class="p">[]</span> </code></pre></div> <div class="doc doc-contents "> <p>A list of GitHub organization IDs (available from <code>https://api.github.com/orgs/<org_name></code>, and are immutable) or organisation names (which can change, so be warned), that the membership of which will be required to register a new datalab account. Setting the value to <code>None</code> will allow any GitHub user to register an account.</p> </div> </div> <div class="doc doc-object doc-attribute"> <h3 id="pydatalab.config.ServerConfig.IDENTIFIER_PREFIX" class="doc doc-heading"> <code class="doc-symbol doc-symbol-heading doc-symbol-attribute"></code> <span class="doc doc-object-name doc-attribute-name">IDENTIFIER_PREFIX</span> <a href="#pydatalab.config.ServerConfig.IDENTIFIER_PREFIX" class="headerlink" title="Permanent link">¶</a></h3> <div class="doc-signature highlight"><pre><span></span><code><span class="n">IDENTIFIER_PREFIX</span><span class="p">:</span> <span class="n"><a class="autorefs autorefs-external" href="https://docs.python.org/3/builtins/stdtypes.html#str">str</a></span> <span class="o">=</span> <span class="kc">None</span> </code></pre></div> <div class="doc doc-contents "> <p>The prefix to use for identifiers in this deployment, e.g., 'grey' in <code>grey:AAAAAA</code></p> </div> </div> <div class="doc doc-object doc-attribute"> <h3 id="pydatalab.config.ServerConfig.LOG_FILE" class="doc doc-heading"> <code class="doc-symbol doc-symbol-heading doc-symbol-attribute"></code> <span class="doc doc-object-name doc-attribute-name">LOG_FILE</span> <a href="#pydatalab.config.ServerConfig.LOG_FILE" class="headerlink" title="Permanent link">¶</a></h3> <div class="doc-signature highlight"><pre><span></span><code><span class="n">LOG_FILE</span><span class="p">:</span> <span class="n"><a class="autorefs autorefs-external" href="https://docs.python.org/3/builtins/stdtypes.html#str">str</a></span> <span class="o">|</span> <span class="n"><a class="autorefs autorefs-external" title="pathlib.Path" href="https://docs.python.org/3/library/pathlib.html#pathlib.Path">Path</a></span> <span class="o">|</span> <span class="kc">None</span> <span class="o">=</span> <span class="kc">None</span> </code></pre></div> <div class="doc doc-contents "> <p>The path to the log file to use for the server and all associated processes (e.g., invoke tasks)</p> </div> </div> <div class="doc doc-object doc-attribute"> <h3 id="pydatalab.config.ServerConfig.MAX_BATCH_CREATE_SIZE" class="doc doc-heading"> <code class="doc-symbol doc-symbol-heading doc-symbol-attribute"></code> <span class="doc doc-object-name doc-attribute-name">MAX_BATCH_CREATE_SIZE</span> <a href="#pydatalab.config.ServerConfig.MAX_BATCH_CREATE_SIZE" class="headerlink" title="Permanent link">¶</a></h3> <div class="doc-signature highlight"><pre><span></span><code><span class="n">MAX_BATCH_CREATE_SIZE</span><span class="p">:</span> <span class="n"><a class="autorefs autorefs-external" href="https://docs.python.org/3/builtins/functions.html#int">int</a></span> <span class="o">=</span> <span class="mi">10000</span> </code></pre></div> <div class="doc doc-contents "> <p>Maximum number of items that can be created in a single batch operation.</p> </div> </div> <div class="doc doc-object doc-attribute"> <h3 id="pydatalab.config.ServerConfig.MAX_CONTENT_LENGTH" class="doc doc-heading"> <code class="doc-symbol doc-symbol-heading doc-symbol-attribute"></code> <span class="doc doc-object-name doc-attribute-name">MAX_CONTENT_LENGTH</span> <a href="#pydatalab.config.ServerConfig.MAX_CONTENT_LENGTH" class="headerlink" title="Permanent link">¶</a></h3> <div class="doc-signature highlight"><pre><span></span><code><span class="n">MAX_CONTENT_LENGTH</span><span class="p">:</span> <span class="n"><a class="autorefs autorefs-external" href="https://docs.python.org/3/builtins/functions.html#int">int</a></span> <span class="o">=</span> <span class="mi">10</span> <span class="o">*</span> <span class="mi">1000</span> <span class="o">**</span> <span class="mi">3</span> </code></pre></div> <div class="doc doc-contents "> <p>Direct mapping to the equivalent Flask setting. In practice, limits the file size that can be uploaded. Defaults to 10 GB to avoid filling the tmp directory of a server.</p> <p>Warning: this value will overwrite any other values passed to <code>FLASK_MAX_CONTENT_LENGTH</code> but is included here to clarify its importance when deploying a datalab instance.</p> </div> </div> <div class="doc doc-object doc-attribute"> <h3 id="pydatalab.config.ServerConfig.MONGO_URI" class="doc doc-heading"> <code class="doc-symbol doc-symbol-heading doc-symbol-attribute"></code> <span class="doc doc-object-name doc-attribute-name">MONGO_URI</span> <a href="#pydatalab.config.ServerConfig.MONGO_URI" class="headerlink" title="Permanent link">¶</a></h3> <div class="doc-signature highlight"><pre><span></span><code><span class="n">MONGO_URI</span><span class="p">:</span> <span class="n"><a class="autorefs autorefs-external" href="https://docs.python.org/3/builtins/stdtypes.html#str">str</a></span> <span class="o">=</span> <span class="s1">'mongodb://localhost:27017/datalabvue'</span> </code></pre></div> <div class="doc doc-contents "> <p>The URI for the underlying MongoDB.</p> </div> </div> <div class="doc doc-object doc-attribute"> <h3 id="pydatalab.config.ServerConfig.PREDEFINED_LOCATIONS" class="doc doc-heading"> <code class="doc-symbol doc-symbol-heading doc-symbol-attribute"></code> <span class="doc doc-object-name doc-attribute-name">PREDEFINED_LOCATIONS</span> <a href="#pydatalab.config.ServerConfig.PREDEFINED_LOCATIONS" class="headerlink" title="Permanent link">¶</a></h3> <div class="doc-signature highlight"><pre><span></span><code><span class="n">PREDEFINED_LOCATIONS</span><span class="p">:</span> <span class="n"><a class="autorefs autorefs-external" href="https://docs.python.org/3/builtins/stdtypes.html#set">set</a></span><span class="p">[</span><span class="n"><a class="autorefs autorefs-external" href="https://docs.python.org/3/builtins/stdtypes.html#str">str</a></span><span class="p">]</span> </code></pre></div> <div class="doc doc-contents "> <p>A list of additional lab locations to populate in the /locations endpoint that will be suggested globally for autocompletion. Use '>' to indicate location hierarchy</p> </div> </div> <div class="doc doc-object doc-attribute"> <h3 id="pydatalab.config.ServerConfig.REFCODE_GENERATOR" class="doc doc-heading"> <code class="doc-symbol doc-symbol-heading doc-symbol-attribute"></code> <span class="doc doc-object-name doc-attribute-name">REFCODE_GENERATOR</span> <a href="#pydatalab.config.ServerConfig.REFCODE_GENERATOR" class="headerlink" title="Permanent link">¶</a></h3> <div class="doc-signature highlight"><pre><span></span><code><span class="n">REFCODE_GENERATOR</span><span class="p">:</span> <span class="n"><a class="autorefs autorefs-external" href="https://docs.python.org/3/builtins/functions.html#type">type</a></span><span class="p">[</span><span class="n"><span title="pydatalab.models.utils.RefCodeFactory">RefCodeFactory</span></span><span class="p">]</span> <span class="o">=</span> <span class="n"><span title="pydatalab.models.utils.RandomAlphabeticalRefcodeFactory">RandomAlphabeticalRefcodeFactory</span></span> </code></pre></div> <div class="doc doc-contents "> <p>The class to use to generate refcodes.</p> </div> </div> <div class="doc doc-object doc-attribute"> <h3 id="pydatalab.config.ServerConfig.REMOTE_CACHE_MAX_AGE" class="doc doc-heading"> <code class="doc-symbol doc-symbol-heading doc-symbol-attribute"></code> <span class="doc doc-object-name doc-attribute-name">REMOTE_CACHE_MAX_AGE</span> <a href="#pydatalab.config.ServerConfig.REMOTE_CACHE_MAX_AGE" class="headerlink" title="Permanent link">¶</a></h3> <div class="doc-signature highlight"><pre><span></span><code><span class="n">REMOTE_CACHE_MAX_AGE</span><span class="p">:</span> <span class="n"><a class="autorefs autorefs-external" href="https://docs.python.org/3/builtins/functions.html#int">int</a></span> <span class="o">=</span> <span class="mi">60</span> </code></pre></div> <div class="doc doc-contents "> <p>The maximum age, in minutes, of the remote filesystem cache after which it should be invalidated.</p> </div> </div> <div class="doc doc-object doc-attribute"> <h3 id="pydatalab.config.ServerConfig.REMOTE_CACHE_MIN_AGE" class="doc doc-heading"> <code class="doc-symbol doc-symbol-heading doc-symbol-attribute"></code> <span class="doc doc-object-name doc-attribute-name">REMOTE_CACHE_MIN_AGE</span> <a href="#pydatalab.config.ServerConfig.REMOTE_CACHE_MIN_AGE" class="headerlink" title="Permanent link">¶</a></h3> <div class="doc-signature highlight"><pre><span></span><code><span class="n">REMOTE_CACHE_MIN_AGE</span><span class="p">:</span> <span class="n"><a class="autorefs autorefs-external" href="https://docs.python.org/3/builtins/functions.html#int">int</a></span> <span class="o">=</span> <span class="mi">1</span> </code></pre></div> <div class="doc doc-contents "> <p>The minimum age, in minutes, of the remote filesystem cache, below which the cache will not be invalidated if an update is manually requested.</p> </div> </div> <div class="doc doc-object doc-attribute"> <h3 id="pydatalab.config.ServerConfig.REMOTE_FILESYSTEMS" class="doc doc-heading"> <code class="doc-symbol doc-symbol-heading doc-symbol-attribute"></code> <span class="doc doc-object-name doc-attribute-name">REMOTE_FILESYSTEMS</span> <a href="#pydatalab.config.ServerConfig.REMOTE_FILESYSTEMS" class="headerlink" title="Permanent link">¶</a></h3> <div class="doc-signature highlight"><pre><span></span><code><span class="n">REMOTE_FILESYSTEMS</span><span class="p">:</span> <span class="n"><a class="autorefs autorefs-external" href="https://docs.python.org/3/builtins/stdtypes.html#list">list</a></span><span class="p">[</span><span class="n"><a class="autorefs autorefs-internal" title=" pydatalab.config.RemoteFilesystem" href="#pydatalab.config.RemoteFilesystem">RemoteFilesystem</a></span><span class="p">]</span> <span class="o">=</span> <span class="p">[]</span> </code></pre></div> <div class="doc doc-contents "> <p>A list of dictionaries describing remote filesystems to be accessible from the server.</p> </div> </div> <div class="doc doc-object doc-attribute"> <h3 id="pydatalab.config.ServerConfig.ROOT_PATH" class="doc doc-heading"> <code class="doc-symbol doc-symbol-heading doc-symbol-attribute"></code> <span class="doc doc-object-name doc-attribute-name">ROOT_PATH</span> <a href="#pydatalab.config.ServerConfig.ROOT_PATH" class="headerlink" title="Permanent link">¶</a></h3> <div class="doc-signature highlight"><pre><span></span><code><span class="n">ROOT_PATH</span><span class="p">:</span> <span class="n"><a class="autorefs autorefs-external" href="https://docs.python.org/3/builtins/stdtypes.html#str">str</a></span> <span class="o">=</span> <span class="s1">'/'</span> </code></pre></div> <div class="doc doc-contents "> <p>The root path of the application, e.g., <code>/api</code> if hosting from a subpath.</p> </div> </div> <div class="doc doc-object doc-attribute"> <h3 id="pydatalab.config.ServerConfig.SECRET_KEY" class="doc doc-heading"> <code class="doc-symbol doc-symbol-heading doc-symbol-attribute"></code> <span class="doc doc-object-name doc-attribute-name">SECRET_KEY</span> <a href="#pydatalab.config.ServerConfig.SECRET_KEY" class="headerlink" title="Permanent link">¶</a></h3> <div class="doc-signature highlight"><pre><span></span><code><span class="n">SECRET_KEY</span><span class="p">:</span> <span class="n"><a class="autorefs autorefs-external" href="https://docs.python.org/3/builtins/stdtypes.html#str">str</a></span> <span class="o">|</span> <span class="kc">None</span> <span class="o">=</span> <span class="kc">None</span> </code></pre></div> <div class="doc doc-contents "> <p>The secret key to use for Flask. This value should be changed and/or loaded from an environment variable for production deployments.</p> </div> </div> <div class="doc doc-object doc-attribute"> <h3 id="pydatalab.config.ServerConfig.SESSION_LIFETIME" class="doc doc-heading"> <code class="doc-symbol doc-symbol-heading doc-symbol-attribute"></code> <span class="doc doc-object-name doc-attribute-name">SESSION_LIFETIME</span> <a href="#pydatalab.config.ServerConfig.SESSION_LIFETIME" class="headerlink" title="Permanent link">¶</a></h3> <div class="doc-signature highlight"><pre><span></span><code><span class="n">SESSION_LIFETIME</span><span class="p">:</span> <span class="n"><a class="autorefs autorefs-external" href="https://docs.python.org/3/builtins/functions.html#int">int</a></span> <span class="o">=</span> <span class="mi">7</span> <span class="o">*</span> <span class="mi">24</span> </code></pre></div> <div class="doc doc-contents "> <p>The lifetime of authenticated sessions for users who select "remember me" at login, in hours. Other sessions end when the browser is closed.</p> </div> </div> <div class="doc doc-object doc-attribute"> <h3 id="pydatalab.config.ServerConfig.TESTING" class="doc doc-heading"> <code class="doc-symbol doc-symbol-heading doc-symbol-attribute"></code> <span class="doc doc-object-name doc-attribute-name">TESTING</span> <a href="#pydatalab.config.ServerConfig.TESTING" class="headerlink" title="Permanent link">¶</a></h3> <div class="doc-signature highlight"><pre><span></span><code><span class="n">TESTING</span><span class="p">:</span> <span class="n"><a class="autorefs autorefs-external" href="https://docs.python.org/3/builtins/functions.html#bool">bool</a></span> <span class="o">=</span> <span class="kc">False</span> </code></pre></div> <div class="doc doc-contents "> <p>Whether to run the server in testing mode, i.e., with a deterministic secret key and backups disabled. This does not disable authentication, but allows test users (with an <code>@datalab.test</code> email) to log in with tokens minted by invoke tasks (see <code>dev.list-test-users</code> and <code>dev.seed-e2e-users</code>).</p> </div> </div> <div class="doc doc-object doc-attribute"> <h3 id="pydatalab.config.ServerConfig.UNGROUPED_INVENTORY" class="doc doc-heading"> <code class="doc-symbol doc-symbol-heading doc-symbol-attribute"></code> <span class="doc doc-object-name doc-attribute-name">UNGROUPED_INVENTORY</span> <a href="#pydatalab.config.ServerConfig.UNGROUPED_INVENTORY" class="headerlink" title="Permanent link">¶</a></h3> <div class="doc-signature highlight"><pre><span></span><code><span class="n">UNGROUPED_INVENTORY</span><span class="p">:</span> <span class="n"><a class="autorefs autorefs-external" title="typing.Literal" href="https://docs.python.org/3/library/typing.html#typing.Literal">Literal</a></span><span class="p">[</span><span class="s1">'none'</span><span class="p">,</span> <span class="s1">'warn'</span><span class="p">,</span> <span class="s1">'error'</span><span class="p">]</span> <span class="o">=</span> <span class="s1">'none'</span> </code></pre></div> <div class="doc doc-contents "> <p>How to handle inventory items (starting materials and equipment) that are not assigned to any groups, as such items are visible to and editable by all users of the deployment.</p> <ul> <li><code>"none"</code>: allow ungrouped inventory items without comment.</li> <li><code>"warn"</code>: ask users to confirm in the UI before creating an ungrouped inventory item.</li> <li><code>"error"</code>: refuse to create inventory items without groups, or to remove all groups from an existing one.</li> </ul> </div> </div> <div class="doc doc-object doc-attribute"> <h3 id="pydatalab.config.ServerConfig.USE_X_ACCEL_REDIRECT" class="doc doc-heading"> <code class="doc-symbol doc-symbol-heading doc-symbol-attribute"></code> <span class="doc doc-object-name doc-attribute-name">USE_X_ACCEL_REDIRECT</span> <a href="#pydatalab.config.ServerConfig.USE_X_ACCEL_REDIRECT" class="headerlink" title="Permanent link">¶</a></h3> <div class="doc-signature highlight"><pre><span></span><code><span class="n">USE_X_ACCEL_REDIRECT</span><span class="p">:</span> <span class="n"><a class="autorefs autorefs-external" href="https://docs.python.org/3/builtins/functions.html#bool">bool</a></span> <span class="o">=</span> <span class="kc">False</span> </code></pre></div> <div class="doc doc-contents "> <p>Whether to offload large file/export downloads to the reverse proxy via the <code>X-Accel-Redirect</code> header rather than streaming them through a Flask worker. Requires an <strong>nginx</strong> proxy with a matching <code>internal</code> location; leave <code>False</code> for other proxies (Caddy, traefik) or when running without a proxy.</p> </div> </div> <div class="doc doc-object doc-attribute"> <h3 id="pydatalab.config.ServerConfig.model_config" class="doc doc-heading"> <code class="doc-symbol doc-symbol-heading doc-symbol-attribute"></code> <span class="doc doc-object-name doc-attribute-name">model_config</span> <a href="#pydatalab.config.ServerConfig.model_config" class="headerlink" title="Permanent link">¶</a></h3> <div class="doc-signature highlight"><pre><span></span><code><span class="n">model_config</span> <span class="o">=</span> <span class="n"><a class="autorefs autorefs-external" title="pydantic_settings.SettingsConfigDict" href="https://docs.pydantic.dev/latest/api/pydantic_settings/#pydantic_settings.SettingsConfigDict">SettingsConfigDict</a></span><span class="p">(</span><span class="n"><span title="pydantic_settings.SettingsConfigDict(env_prefix)">env_prefix</span></span><span class="o">=</span><span class="s1">'PYDATALAB_'</span><span class="p">,</span> <span class="n"><span title="pydantic_settings.SettingsConfigDict(extra)">extra</span></span><span class="o">=</span><span class="s1">'allow'</span><span class="p">,</span> <span class="n"><span title="pydantic_settings.SettingsConfigDict(env_file)">env_file</span></span><span class="o">=</span><span class="s1">'.env'</span><span class="p">,</span> <span class="n"><span title="pydantic_settings.SettingsConfigDict(env_file_encoding)">env_file_encoding</span></span><span class="o">=</span><span class="s1">'utf-8'</span><span class="p">,</span> <span class="n"><span title="pydantic_settings.SettingsConfigDict(validate_assignment)">validate_assignment</span></span><span class="o">=</span><span class="kc">True</span><span class="p">,</span> <span class="n"><span title="pydantic_settings.SettingsConfigDict(case_sensitive)">case_sensitive</span></span><span class="o">=</span><span class="kc">False</span><span class="p">)</span> </code></pre></div> <div class="doc doc-contents "> </div> </div> <div class="doc doc-object doc-function"> <h3 id="pydatalab.config.ServerConfig.settings_customise_sources" class="doc doc-heading"> <code class="doc-symbol doc-symbol-heading doc-symbol-method"></code> <span class="doc doc-object-name doc-function-name">settings_customise_sources</span> <a href="#pydatalab.config.ServerConfig.settings_customise_sources" class="headerlink" title="Permanent link">¶</a></h3> <div class="doc-signature highlight"><pre><span></span><code><span class="nf">settings_customise_sources</span><span class="p">(</span><span class="n">settings_cls</span><span class="p">:</span> <span class="n"><a class="autorefs autorefs-external" href="https://docs.python.org/3/builtins/functions.html#type">type</a></span><span class="p">[</span><span class="n"><a class="autorefs autorefs-external" title="pydantic_settings.BaseSettings" href="https://docs.pydantic.dev/latest/api/pydantic_settings/#pydantic_settings.BaseSettings">BaseSettings</a></span><span class="p">],</span> <span class="n">init_settings</span><span class="p">,</span> <span class="n">env_settings</span><span class="p">,</span> <span class="n">dotenv_settings</span><span class="p">,</span> <span class="n">file_secret_settings</span><span class="p">)</span> </code></pre></div> <div class="doc doc-contents "> </div> </div> <div class="doc doc-object doc-function"> <h3 id="pydatalab.config.ServerConfig.update" class="doc doc-heading"> <code class="doc-symbol doc-symbol-heading doc-symbol-method"></code> <span class="doc doc-object-name doc-function-name">update</span> <a href="#pydatalab.config.ServerConfig.update" class="headerlink" title="Permanent link">¶</a></h3> <div class="doc-signature highlight"><pre><span></span><code><span class="nf">update</span><span class="p">(</span><span class="n">values</span><span class="p">:</span> <span class="n"><a class="autorefs autorefs-external" href="https://docs.python.org/3/builtins/stdtypes.html#dict">dict</a></span><span class="p">)</span> </code></pre></div> <div class="doc doc-contents "> <p>Update the configuration with new values, following Pydantic v1 behavior.</p> </div> </div> </div> </div> </div> <div class="doc doc-object doc-class"> <h2 id="pydatalab.config.RemoteFilesystem" class="doc doc-heading"> <code class="doc-symbol doc-symbol-heading doc-symbol-class"></code> <span class="doc doc-object-name doc-class-name">pydatalab.config.RemoteFilesystem</span> <a href="#pydatalab.config.RemoteFilesystem" class="headerlink" title="Permanent link">¶</a></h2> <div class="doc doc-contents first"> <p class="doc doc-class-bases"> Bases: <code><a class="autorefs autorefs-external" title="pydantic.BaseModel" href="https://docs.pydantic.dev/latest/api/pydantic/base_model/#pydantic.BaseModel">BaseModel</a></code></p> <p>Configuration for specifying a single remote filesystem accessible from the server.</p> <div class="doc doc-children"> <div class="doc doc-object doc-attribute"> <h3 id="pydatalab.config.RemoteFilesystem.hostname" class="doc doc-heading"> <code class="doc-symbol doc-symbol-heading doc-symbol-attribute"></code> <span class="doc doc-object-name doc-attribute-name">hostname</span> <a href="#pydatalab.config.RemoteFilesystem.hostname" class="headerlink" title="Permanent link">¶</a></h3> <div class="doc-signature highlight"><pre><span></span><code><span class="n">hostname</span><span class="p">:</span> <span class="n"><a class="autorefs autorefs-external" href="https://docs.python.org/3/builtins/stdtypes.html#str">str</a></span> <span class="o">|</span> <span class="kc">None</span> <span class="o">=</span> <span class="kc">None</span> </code></pre></div> <div class="doc doc-contents "> <p>The hostname for the filesystem. <code>None</code> indicates the filesystem is already mounted locally.</p> </div> </div> <div class="doc doc-object doc-attribute"> <h3 id="pydatalab.config.RemoteFilesystem.name" class="doc doc-heading"> <code class="doc-symbol doc-symbol-heading doc-symbol-attribute"></code> <span class="doc doc-object-name doc-attribute-name">name</span> <a href="#pydatalab.config.RemoteFilesystem.name" class="headerlink" title="Permanent link">¶</a></h3> <div class="doc-signature highlight"><pre><span></span><code><span class="n">name</span><span class="p">:</span> <span class="n"><a class="autorefs autorefs-external" href="https://docs.python.org/3/builtins/stdtypes.html#str">str</a></span> </code></pre></div> <div class="doc doc-contents "> <p>The name of the filesystem to use in the UI.</p> </div> </div> <div class="doc doc-object doc-attribute"> <h3 id="pydatalab.config.RemoteFilesystem.path" class="doc doc-heading"> <code class="doc-symbol doc-symbol-heading doc-symbol-attribute"></code> <span class="doc doc-object-name doc-attribute-name">path</span> <a href="#pydatalab.config.RemoteFilesystem.path" class="headerlink" title="Permanent link">¶</a></h3> <div class="doc-signature highlight"><pre><span></span><code><span class="n">path</span><span class="p">:</span> <span class="n"><a class="autorefs autorefs-external" title="pathlib.Path" href="https://docs.python.org/3/library/pathlib.html#pathlib.Path">Path</a></span> </code></pre></div> <div class="doc doc-contents "> <p>The path to the base of the filesystem to include.</p> </div> </div> </div> </div> </div> <div class="doc doc-object doc-class"> <h2 id="pydatalab.config.SMTPSettings" class="doc doc-heading"> <code class="doc-symbol doc-symbol-heading doc-symbol-class"></code> <span class="doc doc-object-name doc-class-name">pydatalab.config.SMTPSettings</span> <a href="#pydatalab.config.SMTPSettings" class="headerlink" title="Permanent link">¶</a></h2> <div class="doc doc-contents first"> <p class="doc doc-class-bases"> Bases: <code><a class="autorefs autorefs-external" title="pydantic.BaseModel" href="https://docs.pydantic.dev/latest/api/pydantic/base_model/#pydantic.BaseModel">BaseModel</a></code></p> <p>Configuration for specifying SMTP settings for sending emails.</p> <div class="doc doc-children"> <div class="doc doc-object doc-attribute"> <h3 id="pydatalab.config.SMTPSettings.MAIL_DEFAULT_SENDER" class="doc doc-heading"> <code class="doc-symbol doc-symbol-heading doc-symbol-attribute"></code> <span class="doc doc-object-name doc-attribute-name">MAIL_DEFAULT_SENDER</span> <a href="#pydatalab.config.SMTPSettings.MAIL_DEFAULT_SENDER" class="headerlink" title="Permanent link">¶</a></h3> <div class="doc-signature highlight"><pre><span></span><code><span class="n">MAIL_DEFAULT_SENDER</span><span class="p">:</span> <span class="n"><a class="autorefs autorefs-external" href="https://docs.python.org/3/builtins/stdtypes.html#str">str</a></span> <span class="o">=</span> <span class="s1">''</span> </code></pre></div> <div class="doc doc-contents "> <p>The email address to use as the sender for emails.</p> </div> </div> <div class="doc doc-object doc-attribute"> <h3 id="pydatalab.config.SMTPSettings.MAIL_PORT" class="doc doc-heading"> <code class="doc-symbol doc-symbol-heading doc-symbol-attribute"></code> <span class="doc doc-object-name doc-attribute-name">MAIL_PORT</span> <a href="#pydatalab.config.SMTPSettings.MAIL_PORT" class="headerlink" title="Permanent link">¶</a></h3> <div class="doc-signature highlight"><pre><span></span><code><span class="n">MAIL_PORT</span><span class="p">:</span> <span class="n"><a class="autorefs autorefs-external" href="https://docs.python.org/3/builtins/functions.html#int">int</a></span> <span class="o">=</span> <span class="mi">587</span> </code></pre></div> <div class="doc doc-contents "> <p>The port to use for the SMTP server.</p> </div> </div> <div class="doc doc-object doc-attribute"> <h3 id="pydatalab.config.SMTPSettings.MAIL_SERVER" class="doc doc-heading"> <code class="doc-symbol doc-symbol-heading doc-symbol-attribute"></code> <span class="doc doc-object-name doc-attribute-name">MAIL_SERVER</span> <a href="#pydatalab.config.SMTPSettings.MAIL_SERVER" class="headerlink" title="Permanent link">¶</a></h3> <div class="doc-signature highlight"><pre><span></span><code><span class="n">MAIL_SERVER</span><span class="p">:</span> <span class="n"><a class="autorefs autorefs-external" href="https://docs.python.org/3/builtins/stdtypes.html#str">str</a></span> <span class="o">=</span> <span class="s1">'127.0.0.1'</span> </code></pre></div> <div class="doc doc-contents "> <p>The SMTP server to use for sending emails.</p> </div> </div> <div class="doc doc-object doc-attribute"> <h3 id="pydatalab.config.SMTPSettings.MAIL_USERNAME" class="doc doc-heading"> <code class="doc-symbol doc-symbol-heading doc-symbol-attribute"></code> <span class="doc doc-object-name doc-attribute-name">MAIL_USERNAME</span> <a href="#pydatalab.config.SMTPSettings.MAIL_USERNAME" class="headerlink" title="Permanent link">¶</a></h3> <div class="doc-signature highlight"><pre><span></span><code><span class="n">MAIL_USERNAME</span><span class="p">:</span> <span class="n"><a class="autorefs autorefs-external" href="https://docs.python.org/3/builtins/stdtypes.html#str">str</a></span> <span class="o">=</span> <span class="s1">''</span> </code></pre></div> <div class="doc doc-contents "> <p>The username to use for the SMTP server. Will use the externally provided <code>MAIL_PASSWORD</code> environment variable for authentication.</p> </div> </div> <div class="doc doc-object doc-attribute"> <h3 id="pydatalab.config.SMTPSettings.MAIL_USE_TLS" class="doc doc-heading"> <code class="doc-symbol doc-symbol-heading doc-symbol-attribute"></code> <span class="doc doc-object-name doc-attribute-name">MAIL_USE_TLS</span> <a href="#pydatalab.config.SMTPSettings.MAIL_USE_TLS" class="headerlink" title="Permanent link">¶</a></h3> <div class="doc-signature highlight"><pre><span></span><code><span class="n">MAIL_USE_TLS</span><span class="p">:</span> <span class="n"><a class="autorefs autorefs-external" href="https://docs.python.org/3/builtins/functions.html#bool">bool</a></span> <span class="o">=</span> <span class="kc">True</span> </code></pre></div> <div class="doc doc-contents "> <p>Whether to use TLS for the SMTP connection.</p> </div> </div> </div> </div> </div> <div class="doc doc-object doc-class"> <h2 id="pydatalab.config.DeploymentMetadata" class="doc doc-heading"> <code class="doc-symbol doc-symbol-heading doc-symbol-class"></code> <span class="doc doc-object-name doc-class-name">pydatalab.config.DeploymentMetadata</span> <a href="#pydatalab.config.DeploymentMetadata" class="headerlink" title="Permanent link">¶</a></h2> <div class="doc doc-contents first"> <p class="doc doc-class-bases"> Bases: <code><a class="autorefs autorefs-external" title="pydantic.BaseModel" href="https://docs.pydantic.dev/latest/api/pydantic/base_model/#pydantic.BaseModel">BaseModel</a></code></p> <p>A model for specifying metadata about a datalab deployment.</p> <p>Config:</p> <ul> <li><code>extra</code>: <code class="highlight language-python"><span class="n">allow</span></code></li> </ul> <div class="doc doc-children"> <div class="doc doc-object doc-attribute"> <h3 id="pydatalab.config.DeploymentMetadata.homepage" class="doc doc-heading"> <code class="doc-symbol doc-symbol-heading doc-symbol-attribute"></code> <span class="doc doc-object-name doc-attribute-name">homepage</span> <a href="#pydatalab.config.DeploymentMetadata.homepage" class="headerlink" title="Permanent link">¶</a></h3> <div class="doc-signature highlight"><pre><span></span><code><span class="n">homepage</span><span class="p">:</span> <span class="n"><a class="autorefs autorefs-external" title="pydantic.AnyUrl" href="https://docs.pydantic.dev/latest/api/pydantic/networks/#pydantic.networks.AnyUrl">AnyUrl</a></span> <span class="o">|</span> <span class="kc">None</span> <span class="o">=</span> <span class="kc">None</span> </code></pre></div> <div class="doc doc-contents "> </div> </div> <div class="doc doc-object doc-attribute"> <h3 id="pydatalab.config.DeploymentMetadata.issue_tracker" class="doc doc-heading"> <code class="doc-symbol doc-symbol-heading doc-symbol-attribute"></code> <span class="doc doc-object-name doc-attribute-name">issue_tracker</span> <a href="#pydatalab.config.DeploymentMetadata.issue_tracker" class="headerlink" title="Permanent link">¶</a></h3> <div class="doc-signature highlight"><pre><span></span><code><span class="n">issue_tracker</span><span class="p">:</span> <span class="n"><a class="autorefs autorefs-external" title="pydantic.AnyUrl" href="https://docs.pydantic.dev/latest/api/pydantic/networks/#pydantic.networks.AnyUrl">AnyUrl</a></span> <span class="o">|</span> <span class="kc">None</span> <span class="o">=</span> <span class="s1">'https://github.com/datalab-org/datalab/issues'</span> </code></pre></div> <div class="doc doc-contents "> </div> </div> <div class="doc doc-object doc-attribute"> <h3 id="pydatalab.config.DeploymentMetadata.maintainer" class="doc doc-heading"> <code class="doc-symbol doc-symbol-heading doc-symbol-attribute"></code> <span class="doc doc-object-name doc-attribute-name">maintainer</span> <a href="#pydatalab.config.DeploymentMetadata.maintainer" class="headerlink" title="Permanent link">¶</a></h3> <div class="doc-signature highlight"><pre><span></span><code><span class="n">maintainer</span><span class="p">:</span> <span class="n"><span title="pydatalab.models.Person">Person</span></span> <span class="o">|</span> <span class="kc">None</span> <span class="o">=</span> <span class="kc">None</span> </code></pre></div> <div class="doc doc-contents "> </div> </div> <div class="doc doc-object doc-attribute"> <h3 id="pydatalab.config.DeploymentMetadata.model_config" class="doc doc-heading"> <code class="doc-symbol doc-symbol-heading doc-symbol-attribute"></code> <span class="doc doc-object-name doc-attribute-name">model_config</span> <a href="#pydatalab.config.DeploymentMetadata.model_config" class="headerlink" title="Permanent link">¶</a></h3> <div class="doc-signature highlight"><pre><span></span><code><span class="n">model_config</span> <span class="o">=</span> <span class="n"><a class="autorefs autorefs-external" title="pydantic.ConfigDict" href="https://docs.pydantic.dev/latest/api/pydantic/config/#pydantic.config.ConfigDict">ConfigDict</a></span><span class="p">(</span><span class="n"><span title="pydantic.ConfigDict(extra)">extra</span></span><span class="o">=</span><span class="s1">'allow'</span><span class="p">)</span> </code></pre></div> <div class="doc doc-contents "> </div> </div> <div class="doc doc-object doc-attribute"> <h3 id="pydatalab.config.DeploymentMetadata.source_repository" class="doc doc-heading"> <code class="doc-symbol doc-symbol-heading doc-symbol-attribute"></code> <span class="doc doc-object-name doc-attribute-name">source_repository</span> <a href="#pydatalab.config.DeploymentMetadata.source_repository" class="headerlink" title="Permanent link">¶</a></h3> <div class="doc-signature highlight"><pre><span></span><code><span class="n">source_repository</span><span class="p">:</span> <span class="n"><a class="autorefs autorefs-external" title="pydantic.AnyUrl" href="https://docs.pydantic.dev/latest/api/pydantic/networks/#pydantic.networks.AnyUrl">AnyUrl</a></span> <span class="o">|</span> <span class="kc">None</span> <span class="o">=</span> <span class="s1">'https://github.com/datalab-org/datalab'</span> </code></pre></div> <div class="doc doc-contents "> </div> </div> </div> </div> </div> </article> </div> <script>var tabs=__md_get("__tabs");if(Array.isArray(tabs))e:for(var set of document.querySelectorAll(".tabbed-set")){var labels=set.querySelector(".tabbed-labels");for(var tab of tabs)for(var label of labels.getElementsByTagName("label"))if(label.innerText.trim()===tab){var input=document.getElementById(label.htmlFor);input.checked=!0;continue e}}</script> <script>var target=document.getElementById(location.hash.slice(1));target&&target.name&&(target.checked=target.name.startsWith("__tabbed_"))</script> </div> </main> <footer class="md-footer"> <div class="md-footer-meta md-typeset"> <div class="md-footer-meta__inner md-grid"> <div class="md-copyright"> Made with <a href="https://squidfunk.github.io/mkdocs-material/" target="_blank" rel="noopener"> Material for MkDocs </a> </div> <div class="md-social"> <a href="https://github.com/datalab-org" target="_blank" rel="noopener" title="github.com" class="md-social__link"> <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 512 512"><!--! Font Awesome Free 7.1.0 by @fontawesome - https://fontawesome.com License - https://fontawesome.com/license/free (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License) Copyright 2025 Fonticons, Inc.--><path d="M173.9 397.4c0 2-2.3 3.6-5.2 3.6-3.3.3-5.6-1.3-5.6-3.6 0-2 2.3-3.6 5.2-3.6 3-.3 5.6 1.3 5.6 3.6m-31.1-4.5c-.7 2 1.3 4.3 4.3 4.9 2.6 1 5.6 0 6.2-2s-1.3-4.3-4.3-5.2c-2.6-.7-5.5.3-6.2 2.3m44.2-1.7c-2.9.7-4.9 2.6-4.6 4.9.3 2 2.9 3.3 5.9 2.6 2.9-.7 4.9-2.6 4.6-4.6-.3-1.9-3-3.2-5.9-2.9M252.8 8C114.1 8 8 113.3 8 252c0 110.9 69.8 205.8 169.5 239.2 12.8 2.3 17.3-5.6 17.3-12.1 0-6.2-.3-40.4-.3-61.4 0 0-70 15-84.7-29.8 0 0-11.4-29.1-27.8-36.6 0 0-22.9-15.7 1.6-15.4 0 0 24.9 2 38.6 25.8 21.9 38.6 58.6 27.5 72.9 20.9 2.3-16 8.8-27.1 16-33.7-55.9-6.2-112.3-14.3-112.3-110.5 0-27.5 7.6-41.3 23.6-58.9-2.6-6.5-11.1-33.3 2.6-67.9 20.9-6.5 69 27 69 27 20-5.6 41.5-8.5 62.8-8.5s42.8 2.9 62.8 8.5c0 0 48.1-33.6 69-27 13.7 34.7 5.2 61.4 2.6 67.9 16 17.7 25.8 31.5 25.8 58.9 0 96.5-58.9 104.2-114.8 110.5 9.2 7.9 17 22.9 17 46.4 0 33.7-.3 75.4-.3 83.6 0 6.5 4.6 14.4 17.3 12.1C436.2 457.8 504 362.9 504 252 504 113.3 391.5 8 252.8 8M105.2 352.9c-1.3 1-1 3.3.7 5.2 1.6 1.6 3.9 2.3 5.2 1 1.3-1 1-3.3-.7-5.2-1.6-1.6-3.9-2.3-5.2-1m-10.8-8.1c-.7 1.3.3 2.9 2.3 3.9 1.6 1 3.6.7 4.3-.7.7-1.3-.3-2.9-2.3-3.9-2-.6-3.6-.3-4.3.7m32.4 35.6c-1.6 1.3-1 4.3 1.3 6.2 2.3 2.3 5.2 2.6 6.5 1 1.3-1.3.7-4.3-1.3-6.2-2.2-2.3-5.2-2.6-6.5-1m-11.4-14.7c-1.6 1-1.6 3.6 0 5.9s4.3 3.3 5.6 2.3c1.6-1.3 1.6-3.9 0-6.2-1.4-2.3-4-3.3-5.6-2"/></svg> </a> </div> </div> </div> </footer> </div> <div class="md-dialog" data-md-component="dialog"> <div class="md-dialog__inner md-typeset"></div> </div> <script id="__config" type="application/json">{"annotate": null, "base": "..", "features": ["content.tabs.link"], "search": "../assets/javascripts/workers/search.2c215733.min.js", "tags": null, "translations": {"clipboard.copied": "Copied to clipboard", "clipboard.copy": "Copy to clipboard", "search.result.more.one": "1 more on this page", "search.result.more.other": "# more on this page", "search.result.none": "No matching documents", "search.result.one": "1 matching document", "search.result.other": "# matching documents", "search.result.placeholder": "Type to start searching", "search.result.term.missing": "Missing", "select.version": "Select version"}, "version": null}</script> <script src="../assets/javascripts/bundle.d7400e89.min.js"></script> </body> </html>