<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
  <channel>
    <title>Documentation Center</title>
    <description>Scalingo Documentation Center
</description>
    <link>https://doc.scalingo.com/</link>
    <atom:link href="https://doc.scalingo.com/feed.xml" rel="self" type="application/rss+xml" />
    <pubDate>Fri, 09 Oct 2026 09:13:36 +0000</pubDate>
    <lastBuildDate>Fri, 09 Oct 2026 09:13:36 +0000</lastBuildDate>
    <generator>Jekyll v4.4.1</generator>
    
    
      <item>
        <title>Overview</title>
        <description>&lt;h2 id=&quot;opensearch&quot;&gt;OpenSearch®&lt;/h2&gt;

&lt;p&gt;OpenSearch® is a free and open-source search and analytics engine developed by
Amazon and designed as a community-driven fork of Elasticsearch® 7.10, after
Elastic® changed its licensing model. It allows users to ingest, search,
visualize, and analyze large volumes of data quickly and in real time.
OpenSearch® supports a variety of use cases such as log analytics,
observability, and enterprise search, thanks to its powerful full-text search
capabilities, scalability and RESTful API. Its modular design makes it a very
good choice for both small applications, and large-scale, distributed systems.&lt;/p&gt;

&lt;h2 id=&quot;scalingo-for-opensearch&quot;&gt;Scalingo for OpenSearch®&lt;/h2&gt;

&lt;p&gt;Scalingo for OpenSearch® is our official OpenSearch® addon. &lt;a href=&quot;https://scalingo.com/databases/opensearch#database-compare&quot;&gt;We have several
plans available&lt;/a&gt; from which you can choose depending on your
needs and budget.&lt;/p&gt;

&lt;p&gt;Please make sure to also see &lt;a href=&quot;/databases/opensearch/about/features&quot;&gt;&lt;strong&gt;Features&lt;/strong&gt;&lt;/a&gt; and
&lt;a href=&quot;/databases/opensearch/about/limitations&quot;&gt;&lt;strong&gt;Limitations&lt;/strong&gt;&lt;/a&gt;, as well as the dedicated
&lt;a href=&quot;/databases/opensearch/guides/using-plugins&quot;&gt;&lt;strong&gt;Plugins&lt;/strong&gt;&lt;/a&gt; page to get a comprehensive view of what is
included in our offers.&lt;/p&gt;

&lt;h3 id=&quot;life-cycle&quot;&gt;Life-Cycle&lt;/h3&gt;

&lt;p&gt;OpenSearch® delivers feature releases every few months, with major versions
released approximately once a year. At Scalingo, we focus on providing stable
and well-supported OpenSearch® versions for production workloads.&lt;/p&gt;

&lt;p&gt;Our managed service currently includes version 2.x, with plans to introduce
version 3.x once it becomes stable and widely adopted. However, as the
OpenSearch® roadmap is not finalized, the exact timeline for this upgrade
depends on the availability and maturity of the 3.x release.&lt;/p&gt;

&lt;p&gt;Each major version we provide benefits from minor upgrades including critical
bug fixes and security patches.&lt;/p&gt;

&lt;h4 id=&quot;available-versions&quot;&gt;Available Versions&lt;/h4&gt;

&lt;table&gt;
  &lt;thead&gt;
    &lt;tr&gt;
      &lt;th style=&quot;text-align: right&quot;&gt;OpenSearch Version&lt;/th&gt;
      &lt;th style=&quot;text-align: right&quot;&gt;Full Version&lt;/th&gt;
    &lt;/tr&gt;
  &lt;/thead&gt;
  &lt;tbody&gt;
    &lt;tr&gt;
      &lt;td style=&quot;text-align: right&quot;&gt;&lt;strong&gt;&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;2&lt;/code&gt;&lt;/strong&gt;&lt;/td&gt;
      &lt;td style=&quot;text-align: right&quot;&gt;up to &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;2.19.6&lt;/code&gt;&lt;/td&gt;
    &lt;/tr&gt;
  &lt;/tbody&gt;
&lt;/table&gt;

&lt;p&gt;The default version when provisioning a Scalingo for OpenSearch® addon is
&lt;strong&gt;&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;2.19.6-1&lt;/code&gt;&lt;/strong&gt;.&lt;/p&gt;

&lt;aside class=&quot;note&quot;&gt;
  &lt;p&gt;If you need to provision a Scalingo for OpenSearch® addon with a specific
version, please get in touch with our Support team.&lt;/p&gt;
&lt;/aside&gt;

&lt;h3 id=&quot;pricing&quot;&gt;Pricing&lt;/h3&gt;

&lt;p&gt;Our prices are detailed on &lt;a href=&quot;https://scalingo.com/databases/opensearch&quot;&gt;our dedicated page&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;Billing of your Scalingo for OpenSearch® addon is done on a minute basis.&lt;/p&gt;

&lt;p&gt;If your database disk usage exceeds the threshold set on your plan, the
over-quota is billed per GB-hour (&lt;a href=&quot;https://scalingo.com/databases/opensearch&quot;&gt;see our FAQ for further
details&lt;/a&gt;).&lt;/p&gt;

</description>
        <pubDate>Fri, 09 Oct 2026 12:00:00 +0000</pubDate>
        <link>
          
          https://doc.scalingo.com/databases/opensearch/about/overview
          
        </link>
        <guid isPermaLink="true">
          
          https://doc.scalingo.com/databases/opensearch/about/overview
          
        </guid>
        
        <category>database</category>
        
        <category>opensearch</category>
        
        <category>addon</category>
        
        
        <category>databases</category>
        
        <category>opensearch</category>
        
        <category>about</category>
        
      </item>
    
      <item>
        <title>OpenSearch - New Scalingo release: 2.19.6-1</title>
        <description>&lt;p&gt;New default version: &lt;strong&gt;2.19.6-1&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;Changelog:&lt;/p&gt;

&lt;p&gt;Docker images on &lt;a href=&quot;https://hub.docker.com/r/scalingo/opensearch&quot;&gt;Docker Hub&lt;/a&gt;:&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;scalingo/opensearch:2.19.6-1&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
</description>
        <pubDate>Fri, 09 Oct 2026 12:00:00 +0000</pubDate>
        <link>
          
          https://doc.scalingo.com/changelog#changelog-databases-opensearch-2-19-6-1
          
        </link>
        <guid isPermaLink="true">
          
          https://doc.scalingo.com/changelog#changelog-databases-opensearch-2-19-6-1
          
        </guid>
        
        
        <category>changelog</category>
        
        <category>databases</category>
        
      </item>
    
      <item>
        <title>Understanding Roles</title>
        <description>&lt;p&gt;Scalingo currently provides three predefined roles to help you adapt
permissions to the level of responsibility you want to delegate to your
collaborators: &lt;a href=&quot;#owner&quot;&gt;&lt;strong&gt;Owner&lt;/strong&gt;&lt;/a&gt;, &lt;a href=&quot;#collaborator&quot;&gt;&lt;strong&gt;Collaborator&lt;/strong&gt;&lt;/a&gt; and
&lt;a href=&quot;#limited-collaborator&quot;&gt;&lt;strong&gt;Limited Collaborator&lt;/strong&gt;&lt;/a&gt;.&lt;/p&gt;

&lt;h2 id=&quot;owner&quot;&gt;Owner&lt;/h2&gt;

&lt;p&gt;Reserved for the application owner, the &lt;strong&gt;Owner&lt;/strong&gt; role grants the highest level
of permissions, including full administrative control such as renaming or 
deleting the application. The Owner is also the one who is billed for the
project’s usage.&lt;/p&gt;

&lt;h2 id=&quot;collaborator&quot;&gt;Collaborator&lt;/h2&gt;

&lt;p&gt;The &lt;strong&gt;Collaborator&lt;/strong&gt; role is intended for trusted team members who are directly
responsible for the configuration, deployment, and operational maintenance of
applications and databases. It grants broad permissions, including access to
environment variables, hosted data, deployment settings, and collaborator
management, making it suitable for lead developers or DevOps engineers who need
full technical control over the application.&lt;/p&gt;

&lt;p&gt;While collaborators can perform almost all actions, including inviting and
managing other users, they cannot delete or rename the application.
Those actions remain reserved for the Owner.&lt;/p&gt;

&lt;aside class=&quot;note&quot;&gt;
  &lt;p&gt;This role should only be assigned to individuals you fully trust, as it allows
unrestricted access to sensitive data and the ability to make impactful changes
to the application environment.&lt;/p&gt;
&lt;/aside&gt;

&lt;h2 id=&quot;limited-collaborator&quot;&gt;Limited Collaborator&lt;/h2&gt;

&lt;p&gt;The &lt;strong&gt;Limited Collaborator&lt;/strong&gt; role is designed to minimize the risks associated
with granting access to third parties or collaborators without operational
responsibility. It allows contributors to perform essential day-to-day
operations such as restarting applications, viewing logs or metrics, and
managing review apps while preventing actions that could compromise the
stability, confidentiality, or integrity of your services.&lt;/p&gt;

&lt;p&gt;This role explicitly restricts access to critical operations like modifying
configurations, deploying unvalidated code, exploring or exporting sensitive
data and managing collaborators.&lt;/p&gt;

&lt;p&gt;It is especially suited for environments where separation of duties is
required. It ensures that users can contribute to the project without being
able to compromise service stability, data integrity, or team governance.&lt;/p&gt;

&lt;aside class=&quot;note&quot;&gt;
  &lt;p&gt;In most cases, we recommend assigning the Limited Collaborator role by default,
unless the user explicitly needs full access to configuration, data, or
collaborator management.&lt;/p&gt;
&lt;/aside&gt;

&lt;h2 id=&quot;role-capabilities&quot;&gt;Role Capabilities&lt;/h2&gt;

&lt;h3 id=&quot;overview&quot;&gt;Overview&lt;/h3&gt;

&lt;p&gt;The following table provides a synthetic overview of the main permissions
associated with each role. In most cases, it should be enough to select the
role that best suits your collaborators. However, we also provide an
&lt;a href=&quot;#permissions-matrices&quot;&gt;exhaustive list of access rights associated with each
role&lt;/a&gt;.&lt;/p&gt;

&lt;table&gt;
  &lt;thead&gt;
    &lt;tr&gt;
      &lt;th&gt; &lt;/th&gt;
      &lt;th&gt;Owner&lt;/th&gt;
      &lt;th&gt;Collaborator&lt;/th&gt;
      &lt;th&gt;Limited Collaborator&lt;/th&gt;
    &lt;/tr&gt;
  &lt;/thead&gt;
  &lt;tbody&gt;
    &lt;tr&gt;
      &lt;td&gt;Destructive Actions&lt;/td&gt;
      &lt;td&gt;🟢 Yes&lt;/td&gt;
      &lt;td&gt;🔴 No&lt;/td&gt;
      &lt;td&gt;🔴 No&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;App Configuration&lt;/td&gt;
      &lt;td&gt;🟢 Yes&lt;/td&gt;
      &lt;td&gt;🟢 Yes&lt;/td&gt;
      &lt;td&gt;🔴 No&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;Deployment&lt;/td&gt;
      &lt;td&gt;🟢 Yes&lt;/td&gt;
      &lt;td&gt;🟢 Yes&lt;/td&gt;
      &lt;td&gt;🟡 Limited&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;Add-ons Management&lt;/td&gt;
      &lt;td&gt;🟢 Yes&lt;/td&gt;
      &lt;td&gt;🟢 Yes&lt;/td&gt;
      &lt;td&gt;🔴 No&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;Collaborator Management&lt;/td&gt;
      &lt;td&gt;🟢 Yes&lt;/td&gt;
      &lt;td&gt;🟢 Yes&lt;/td&gt;
      &lt;td&gt;🔴 No&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;Access Data &amp;amp; Secrets&lt;/td&gt;
      &lt;td&gt;🟢 Yes&lt;/td&gt;
      &lt;td&gt;🟢 Yes&lt;/td&gt;
      &lt;td&gt;🔴 No&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;Public Routing Configuration&lt;/td&gt;
      &lt;td&gt;🟢 Yes&lt;/td&gt;
      &lt;td&gt;🟢 Yes&lt;/td&gt;
      &lt;td&gt;🔴 No&lt;/td&gt;
    &lt;/tr&gt;
  &lt;/tbody&gt;
&lt;/table&gt;

&lt;aside class=&quot;note&quot;&gt;
  &lt;p&gt;For improved security, especially in large organizations, we recommend
reviewing our &lt;a href=&quot;/platform/user-management/teamwork/best-practices&quot;&gt;security best practices guide&lt;/a&gt;.&lt;/p&gt;
&lt;/aside&gt;

&lt;h3 id=&quot;permissions-matrices&quot;&gt;Permissions Matrices&lt;/h3&gt;

&lt;p&gt;The following tables detail the permissions available to collaborators of an
app, grouped by scope, and differentiated according to the collaborator’s role.
The &lt;strong&gt;Owner&lt;/strong&gt; role is not listed, as it holds full and unrestricted access to
all application resources.&lt;/p&gt;

&lt;h4 id=&quot;application-lifecycle&quot;&gt;Application Lifecycle&lt;/h4&gt;

&lt;table&gt;
  &lt;thead&gt;
    &lt;tr&gt;
      &lt;th&gt;Permission&lt;/th&gt;
      &lt;th style=&quot;text-align: left&quot;&gt;Collaborator&lt;/th&gt;
      &lt;th style=&quot;text-align: left&quot;&gt;Limited Collaborator&lt;/th&gt;
    &lt;/tr&gt;
  &lt;/thead&gt;
  &lt;tbody&gt;
    &lt;tr&gt;
      &lt;td&gt;Restart app&lt;/td&gt;
      &lt;td style=&quot;text-align: left&quot;&gt;🟢 Yes&lt;/td&gt;
      &lt;td style=&quot;text-align: left&quot;&gt;🟢 Yes&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;Stop app&lt;/td&gt;
      &lt;td style=&quot;text-align: left&quot;&gt;🟢 Yes&lt;/td&gt;
      &lt;td style=&quot;text-align: left&quot;&gt;🔴 No&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;&lt;a href=&quot;/platform/app/scaling/scaling#scaling-vertically&quot;&gt;Scale vertically&lt;/a&gt;&lt;/td&gt;
      &lt;td style=&quot;text-align: left&quot;&gt;🟢 Yes&lt;/td&gt;
      &lt;td style=&quot;text-align: left&quot;&gt;🔴 No&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;&lt;a href=&quot;/platform/app/scaling/scaling#scaling-horizontally&quot;&gt;Scale horizontally&lt;/a&gt;&lt;/td&gt;
      &lt;td style=&quot;text-align: left&quot;&gt;🟢 Yes&lt;/td&gt;
      &lt;td style=&quot;text-align: left&quot;&gt;🔴 No&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;&lt;a href=&quot;/platform/app/scaling/scalingo-autoscaler&quot;&gt;Setup an autoscaler&lt;/a&gt;&lt;/td&gt;
      &lt;td style=&quot;text-align: left&quot;&gt;🟢 Yes&lt;/td&gt;
      &lt;td style=&quot;text-align: left&quot;&gt;🔴 No&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;&lt;a href=&quot;/platform/app/scaling/scalingo-autoscaler&quot;&gt;Update the settings of an autoscaler&lt;/a&gt;&lt;/td&gt;
      &lt;td style=&quot;text-align: left&quot;&gt;🟢 Yes&lt;/td&gt;
      &lt;td style=&quot;text-align: left&quot;&gt;🔴 No&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;Grant data access to Scalingo support operators&lt;/td&gt;
      &lt;td style=&quot;text-align: left&quot;&gt;🟢 Yes&lt;/td&gt;
      &lt;td style=&quot;text-align: left&quot;&gt;🟢 Yes&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;&lt;a href=&quot;/platform/app/log-drain&quot;&gt;Manage log drains&lt;/a&gt;&lt;/td&gt;
      &lt;td style=&quot;text-align: left&quot;&gt;🟢 Yes&lt;/td&gt;
      &lt;td style=&quot;text-align: left&quot;&gt;🔴 No&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;Create a child app&lt;/td&gt;
      &lt;td style=&quot;text-align: left&quot;&gt;🟢 Yes&lt;/td&gt;
      &lt;td style=&quot;text-align: left&quot;&gt;🔴 No&lt;/td&gt;
    &lt;/tr&gt;
  &lt;/tbody&gt;
&lt;/table&gt;

&lt;h4 id=&quot;monitoring-and-logs&quot;&gt;Monitoring and Logs&lt;/h4&gt;

&lt;table&gt;
  &lt;thead&gt;
    &lt;tr&gt;
      &lt;th&gt;Permission&lt;/th&gt;
      &lt;th style=&quot;text-align: left&quot;&gt;Collaborator&lt;/th&gt;
      &lt;th style=&quot;text-align: left&quot;&gt;Limited Collaborator&lt;/th&gt;
    &lt;/tr&gt;
  &lt;/thead&gt;
  &lt;tbody&gt;
    &lt;tr&gt;
      &lt;td&gt;View activity&lt;/td&gt;
      &lt;td style=&quot;text-align: left&quot;&gt;🟢 Yes&lt;/td&gt;
      &lt;td style=&quot;text-align: left&quot;&gt;🟢 Yes&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;View activity details&lt;/td&gt;
      &lt;td style=&quot;text-align: left&quot;&gt;🟢 Yes&lt;/td&gt;
      &lt;td style=&quot;text-align: left&quot;&gt;🟡 Yes (env-vars values are hidden)&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;View logs&lt;/td&gt;
      &lt;td style=&quot;text-align: left&quot;&gt;🟢 Yes&lt;/td&gt;
      &lt;td style=&quot;text-align: left&quot;&gt;🟢 Yes&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;Download log archives&lt;/td&gt;
      &lt;td style=&quot;text-align: left&quot;&gt;🟢 Yes&lt;/td&gt;
      &lt;td style=&quot;text-align: left&quot;&gt;🔴 No&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;View metrics&lt;/td&gt;
      &lt;td style=&quot;text-align: left&quot;&gt;🟢 Yes&lt;/td&gt;
      &lt;td style=&quot;text-align: left&quot;&gt;🟢 Yes&lt;/td&gt;
    &lt;/tr&gt;
  &lt;/tbody&gt;
&lt;/table&gt;

&lt;h4 id=&quot;app-configuration&quot;&gt;App Configuration&lt;/h4&gt;

&lt;table&gt;
  &lt;thead&gt;
    &lt;tr&gt;
      &lt;th&gt;Permission&lt;/th&gt;
      &lt;th style=&quot;text-align: left&quot;&gt;Collaborator&lt;/th&gt;
      &lt;th style=&quot;text-align: left&quot;&gt;Limited Collaborator&lt;/th&gt;
    &lt;/tr&gt;
  &lt;/thead&gt;
  &lt;tbody&gt;
    &lt;tr&gt;
      &lt;td&gt;Delete app&lt;/td&gt;
      &lt;td style=&quot;text-align: left&quot;&gt;🔴 No&lt;/td&gt;
      &lt;td style=&quot;text-align: left&quot;&gt;🔴 No&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;Rename app&lt;/td&gt;
      &lt;td style=&quot;text-align: left&quot;&gt;🔴 No&lt;/td&gt;
      &lt;td style=&quot;text-align: left&quot;&gt;🔴 No&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;Change app’s stack&lt;/td&gt;
      &lt;td style=&quot;text-align: left&quot;&gt;🟢 Yes&lt;/td&gt;
      &lt;td style=&quot;text-align: left&quot;&gt;🔴 No&lt;/td&gt;
    &lt;/tr&gt;
  &lt;/tbody&gt;
&lt;/table&gt;

&lt;h4 id=&quot;managing-collaborators-and-their-access&quot;&gt;Managing Collaborators and Their Access&lt;/h4&gt;

&lt;table&gt;
  &lt;thead&gt;
    &lt;tr&gt;
      &lt;th&gt;Permission&lt;/th&gt;
      &lt;th style=&quot;text-align: left&quot;&gt;Collaborator&lt;/th&gt;
      &lt;th style=&quot;text-align: left&quot;&gt;Limited Collaborator&lt;/th&gt;
    &lt;/tr&gt;
  &lt;/thead&gt;
  &lt;tbody&gt;
    &lt;tr&gt;
      &lt;td&gt;&lt;a href=&quot;/platform/user-management/teamwork/managing#inviting-a-collaborator&quot;&gt;Invite collaborator&lt;/a&gt;&lt;/td&gt;
      &lt;td style=&quot;text-align: left&quot;&gt;🟢 Yes&lt;/td&gt;
      &lt;td style=&quot;text-align: left&quot;&gt;🔴 No&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;&lt;a href=&quot;/platform/user-management/teamwork/managing#removing-a-collaborator&quot;&gt;Revoke collaborator’s access&lt;/a&gt;&lt;/td&gt;
      &lt;td style=&quot;text-align: left&quot;&gt;🟢 Yes&lt;/td&gt;
      &lt;td style=&quot;text-align: left&quot;&gt;🔴 No&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;&lt;a href=&quot;/platform/user-management/teamwork/managing#updating-a-collaborators-role&quot;&gt;Change collaborator’s role&lt;/a&gt;&lt;/td&gt;
      &lt;td style=&quot;text-align: left&quot;&gt;🟢 Yes&lt;/td&gt;
      &lt;td style=&quot;text-align: left&quot;&gt;🔴 No&lt;/td&gt;
    &lt;/tr&gt;
  &lt;/tbody&gt;
&lt;/table&gt;

&lt;h4 id=&quot;deployments&quot;&gt;Deployments&lt;/h4&gt;

&lt;table&gt;
  &lt;thead&gt;
    &lt;tr&gt;
      &lt;th&gt;Permission&lt;/th&gt;
      &lt;th style=&quot;text-align: left&quot;&gt;Collaborator&lt;/th&gt;
      &lt;th style=&quot;text-align: left&quot;&gt;Limited Collaborator&lt;/th&gt;
    &lt;/tr&gt;
  &lt;/thead&gt;
  &lt;tbody&gt;
    &lt;tr&gt;
      &lt;td&gt;Configure SCM&lt;/td&gt;
      &lt;td style=&quot;text-align: left&quot;&gt;🟢 Yes&lt;/td&gt;
      &lt;td style=&quot;text-align: left&quot;&gt;🔴 No&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;Manage automatic deployments&lt;/td&gt;
      &lt;td style=&quot;text-align: left&quot;&gt;🟢 Yes&lt;/td&gt;
      &lt;td style=&quot;text-align: left&quot;&gt;🔴 No&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;Redeploy any branch&lt;/td&gt;
      &lt;td style=&quot;text-align: left&quot;&gt;🟢 Yes&lt;/td&gt;
      &lt;td style=&quot;text-align: left&quot;&gt;🔴 No&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;Redeploy the branch set as the default one&lt;/td&gt;
      &lt;td style=&quot;text-align: left&quot;&gt;🟢 Yes&lt;/td&gt;
      &lt;td style=&quot;text-align: left&quot;&gt;🟢 Yes&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;Access deployments history&lt;/td&gt;
      &lt;td style=&quot;text-align: left&quot;&gt;🟢 Yes&lt;/td&gt;
      &lt;td style=&quot;text-align: left&quot;&gt;🟢 Yes&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;Access deployments logs&lt;/td&gt;
      &lt;td style=&quot;text-align: left&quot;&gt;🟢 Yes&lt;/td&gt;
      &lt;td style=&quot;text-align: left&quot;&gt;🟡 Yes (only for deployments &amp;lt; 7 days)&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;Reset deployment cache&lt;/td&gt;
      &lt;td style=&quot;text-align: left&quot;&gt;🟢 Yes&lt;/td&gt;
      &lt;td style=&quot;text-align: left&quot;&gt;🟢 Yes&lt;/td&gt;
    &lt;/tr&gt;
  &lt;/tbody&gt;
&lt;/table&gt;

&lt;h4 id=&quot;public-routing&quot;&gt;Public Routing&lt;/h4&gt;

&lt;table&gt;
  &lt;thead&gt;
    &lt;tr&gt;
      &lt;th&gt;Permission&lt;/th&gt;
      &lt;th style=&quot;text-align: left&quot;&gt;Collaborator&lt;/th&gt;
      &lt;th style=&quot;text-align: left&quot;&gt;Limited Collaborator&lt;/th&gt;
    &lt;/tr&gt;
  &lt;/thead&gt;
  &lt;tbody&gt;
    &lt;tr&gt;
      &lt;td&gt;&lt;a href=&quot;/platform/networking/public/domains/custom&quot;&gt;Manage custom domains&lt;/a&gt;&lt;/td&gt;
      &lt;td style=&quot;text-align: left&quot;&gt;🟢 Yes&lt;/td&gt;
      &lt;td style=&quot;text-align: left&quot;&gt;🔴 No&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;&lt;a href=&quot;/platform/networking/public/application-firewall&quot;&gt;Manage Firewall Rules&lt;/a&gt;&lt;/td&gt;
      &lt;td style=&quot;text-align: left&quot;&gt;🟢 Yes&lt;/td&gt;
      &lt;td style=&quot;text-align: left&quot;&gt;🔴 No&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;Configure public routing&lt;/td&gt;
      &lt;td style=&quot;text-align: left&quot;&gt;🟢 Yes&lt;/td&gt;
      &lt;td style=&quot;text-align: left&quot;&gt;🔴 No&lt;/td&gt;
    &lt;/tr&gt;
  &lt;/tbody&gt;
&lt;/table&gt;

&lt;h4 id=&quot;one-off-containers-and-scheduled-jobs&quot;&gt;One-Off Containers and Scheduled Jobs&lt;/h4&gt;

&lt;table&gt;
  &lt;thead&gt;
    &lt;tr&gt;
      &lt;th&gt;Permission&lt;/th&gt;
      &lt;th style=&quot;text-align: left&quot;&gt;Collaborator&lt;/th&gt;
      &lt;th style=&quot;text-align: left&quot;&gt;Limited Collaborator&lt;/th&gt;
    &lt;/tr&gt;
  &lt;/thead&gt;
  &lt;tbody&gt;
    &lt;tr&gt;
      &lt;td&gt;&lt;a href=&quot;/platform/app/tasks&quot;&gt;List one-offs&lt;/a&gt;&lt;/td&gt;
      &lt;td style=&quot;text-align: left&quot;&gt;🟢 Yes&lt;/td&gt;
      &lt;td style=&quot;text-align: left&quot;&gt;🟢 Yes&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;&lt;a href=&quot;/platform/app/tasks&quot;&gt;Create a one-off&lt;/a&gt;&lt;/td&gt;
      &lt;td style=&quot;text-align: left&quot;&gt;🟢 Yes&lt;/td&gt;
      &lt;td style=&quot;text-align: left&quot;&gt;🔴 No&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;&lt;a href=&quot;/platform/app/tasks&quot;&gt;Access a one-off&lt;/a&gt;&lt;/td&gt;
      &lt;td style=&quot;text-align: left&quot;&gt;🟢 Yes&lt;/td&gt;
      &lt;td style=&quot;text-align: left&quot;&gt;🔴 No&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;&lt;a href=&quot;/platform/app/task-scheduling/scalingo-scheduler&quot;&gt;List cron jobs&lt;/a&gt;&lt;/td&gt;
      &lt;td style=&quot;text-align: left&quot;&gt;🟢 Yes&lt;/td&gt;
      &lt;td style=&quot;text-align: left&quot;&gt;🟢 Yes&lt;/td&gt;
    &lt;/tr&gt;
  &lt;/tbody&gt;
&lt;/table&gt;

&lt;h4 id=&quot;environment-variables&quot;&gt;Environment Variables&lt;/h4&gt;

&lt;table&gt;
  &lt;thead&gt;
    &lt;tr&gt;
      &lt;th&gt;Permission&lt;/th&gt;
      &lt;th style=&quot;text-align: left&quot;&gt;Collaborator&lt;/th&gt;
      &lt;th style=&quot;text-align: left&quot;&gt;Limited Collaborator&lt;/th&gt;
    &lt;/tr&gt;
  &lt;/thead&gt;
  &lt;tbody&gt;
    &lt;tr&gt;
      &lt;td&gt;&lt;a href=&quot;/platform/app/environment&quot;&gt;Manage environment variables&lt;/a&gt;&lt;/td&gt;
      &lt;td style=&quot;text-align: left&quot;&gt;🟢 Yes&lt;/td&gt;
      &lt;td style=&quot;text-align: left&quot;&gt;🔴 No&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;&lt;a href=&quot;/platform/app/environment&quot;&gt;View environment variables names&lt;/a&gt;&lt;/td&gt;
      &lt;td style=&quot;text-align: left&quot;&gt;🟢 Yes&lt;/td&gt;
      &lt;td style=&quot;text-align: left&quot;&gt;🟢 Yes&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;&lt;a href=&quot;/platform/app/environment&quot;&gt;View environment variables values&lt;/a&gt;&lt;/td&gt;
      &lt;td style=&quot;text-align: left&quot;&gt;🟢 Yes&lt;/td&gt;
      &lt;td style=&quot;text-align: left&quot;&gt;🔴 No&lt;/td&gt;
    &lt;/tr&gt;
  &lt;/tbody&gt;
&lt;/table&gt;

&lt;h4 id=&quot;review-apps&quot;&gt;Review Apps&lt;/h4&gt;

&lt;table&gt;
  &lt;thead&gt;
    &lt;tr&gt;
      &lt;th&gt;Permission&lt;/th&gt;
      &lt;th style=&quot;text-align: left&quot;&gt;Collaborator&lt;/th&gt;
      &lt;th style=&quot;text-align: left&quot;&gt;Limited Collaborator&lt;/th&gt;
    &lt;/tr&gt;
  &lt;/thead&gt;
  &lt;tbody&gt;
    &lt;tr&gt;
      &lt;td&gt;&lt;a href=&quot;/platform/app/review-apps&quot;&gt;Configure review apps&lt;/a&gt;&lt;/td&gt;
      &lt;td style=&quot;text-align: left&quot;&gt;🟢 Yes&lt;/td&gt;
      &lt;td style=&quot;text-align: left&quot;&gt;🔴 No&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;&lt;a href=&quot;/platform/app/review-apps&quot;&gt;List review apps&lt;/a&gt;&lt;/td&gt;
      &lt;td style=&quot;text-align: left&quot;&gt;🟢 Yes&lt;/td&gt;
      &lt;td style=&quot;text-align: left&quot;&gt;🟢 Yes&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;&lt;a href=&quot;/platform/app/review-apps&quot;&gt;Create review apps&lt;/a&gt;&lt;/td&gt;
      &lt;td style=&quot;text-align: left&quot;&gt;🟢 Yes&lt;/td&gt;
      &lt;td style=&quot;text-align: left&quot;&gt;🟡 Yes (only via SCM Tool if allowed)&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;&lt;a href=&quot;/platform/app/review-apps&quot;&gt;Close review apps&lt;/a&gt;&lt;/td&gt;
      &lt;td style=&quot;text-align: left&quot;&gt;🟢 Yes&lt;/td&gt;
      &lt;td style=&quot;text-align: left&quot;&gt;🟢 Yes&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;&lt;a href=&quot;/platform/app/review-apps&quot;&gt;Redeploy a review app&lt;/a&gt;&lt;/td&gt;
      &lt;td style=&quot;text-align: left&quot;&gt;🟢 Yes&lt;/td&gt;
      &lt;td style=&quot;text-align: left&quot;&gt;🟢 Yes&lt;/td&gt;
    &lt;/tr&gt;
  &lt;/tbody&gt;
&lt;/table&gt;

&lt;h4 id=&quot;add-ons&quot;&gt;Add-ons&lt;/h4&gt;

&lt;table&gt;
  &lt;thead&gt;
    &lt;tr&gt;
      &lt;th&gt;Permission&lt;/th&gt;
      &lt;th style=&quot;text-align: left&quot;&gt;Collaborator&lt;/th&gt;
      &lt;th style=&quot;text-align: left&quot;&gt;Limited Collaborator&lt;/th&gt;
    &lt;/tr&gt;
  &lt;/thead&gt;
  &lt;tbody&gt;
    &lt;tr&gt;
      &lt;td&gt;Provision an add-on&lt;/td&gt;
      &lt;td style=&quot;text-align: left&quot;&gt;🟢 Yes&lt;/td&gt;
      &lt;td style=&quot;text-align: left&quot;&gt;🔴 No&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;Access an add-on dashboard&lt;/td&gt;
      &lt;td style=&quot;text-align: left&quot;&gt;🟢 Yes&lt;/td&gt;
      &lt;td style=&quot;text-align: left&quot;&gt;🔴 No&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;Change an add-on plan&lt;/td&gt;
      &lt;td style=&quot;text-align: left&quot;&gt;🟢 Yes&lt;/td&gt;
      &lt;td style=&quot;text-align: left&quot;&gt;🔴 No&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;Remove an add-on&lt;/td&gt;
      &lt;td style=&quot;text-align: left&quot;&gt;🟢 Yes&lt;/td&gt;
      &lt;td style=&quot;text-align: left&quot;&gt;🔴 No&lt;/td&gt;
    &lt;/tr&gt;
  &lt;/tbody&gt;
&lt;/table&gt;

&lt;h4 id=&quot;databases&quot;&gt;Databases&lt;/h4&gt;

&lt;aside class=&quot;note&quot;&gt;
  &lt;p&gt;Collaborators can provision &lt;strong&gt;Shared Resources&lt;/strong&gt; databases because they are 
created as application add-ons. &lt;strong&gt;Dedicated Resources&lt;/strong&gt; databases can only be 
provisioned by the owner, since they are top-level resources and are not 
attached to an application. See &lt;a href=&quot;/databases/about/architecture-models&quot;&gt;Architecture Models&lt;/a&gt; 
for details.&lt;/p&gt;
&lt;/aside&gt;

&lt;table&gt;
  &lt;thead&gt;
    &lt;tr&gt;
      &lt;th&gt;Permission&lt;/th&gt;
      &lt;th style=&quot;text-align: left&quot;&gt;Collaborator&lt;/th&gt;
      &lt;th style=&quot;text-align: left&quot;&gt;Limited Collaborator&lt;/th&gt;
    &lt;/tr&gt;
  &lt;/thead&gt;
  &lt;tbody&gt;
    &lt;tr&gt;
      &lt;td&gt;Access a database dashboard&lt;/td&gt;
      &lt;td style=&quot;text-align: left&quot;&gt;🟢 Yes&lt;/td&gt;
      &lt;td style=&quot;text-align: left&quot;&gt;🔴 No&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;Create a manual backup&lt;/td&gt;
      &lt;td style=&quot;text-align: left&quot;&gt;🟢 Yes&lt;/td&gt;
      &lt;td style=&quot;text-align: left&quot;&gt;🔴 No&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;Manage scheduled backups&lt;/td&gt;
      &lt;td style=&quot;text-align: left&quot;&gt;🟢 Yes&lt;/td&gt;
      &lt;td style=&quot;text-align: left&quot;&gt;🔴 No&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;Download backups&lt;/td&gt;
      &lt;td style=&quot;text-align: left&quot;&gt;🟢 Yes&lt;/td&gt;
      &lt;td style=&quot;text-align: left&quot;&gt;🔴 No&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;Restore backups&lt;/td&gt;
      &lt;td style=&quot;text-align: left&quot;&gt;🟢 Yes&lt;/td&gt;
      &lt;td style=&quot;text-align: left&quot;&gt;🔴 No&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;Restore a PITR&lt;/td&gt;
      &lt;td style=&quot;text-align: left&quot;&gt;🟢 Yes&lt;/td&gt;
      &lt;td style=&quot;text-align: left&quot;&gt;🔴 No&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;View connection details&lt;/td&gt;
      &lt;td style=&quot;text-align: left&quot;&gt;🟢 Yes&lt;/td&gt;
      &lt;td style=&quot;text-align: left&quot;&gt;🔴 No&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;&lt;a href=&quot;/databases/about/features#logs&quot;&gt;View database logs&lt;/a&gt;&lt;/td&gt;
      &lt;td style=&quot;text-align: left&quot;&gt;🟢 Yes&lt;/td&gt;
      &lt;td style=&quot;text-align: left&quot;&gt;🔴 No&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;&lt;a href=&quot;/databases/about/features#metrics&quot;&gt;View database metrics&lt;/a&gt;&lt;/td&gt;
      &lt;td style=&quot;text-align: left&quot;&gt;🟢 Yes&lt;/td&gt;
      &lt;td style=&quot;text-align: left&quot;&gt;🔴 No&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;Manage Internet accessibility&lt;/td&gt;
      &lt;td style=&quot;text-align: left&quot;&gt;🟢 Yes&lt;/td&gt;
      &lt;td style=&quot;text-align: left&quot;&gt;🔴 No&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;Manage database configuration&lt;/td&gt;
      &lt;td style=&quot;text-align: left&quot;&gt;🟢 Yes&lt;/td&gt;
      &lt;td style=&quot;text-align: left&quot;&gt;🔴 No&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;Manage database users&lt;/td&gt;
      &lt;td style=&quot;text-align: left&quot;&gt;🟢 Yes&lt;/td&gt;
      &lt;td style=&quot;text-align: left&quot;&gt;🔴 No&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;&lt;a href=&quot;/databases/about/maintenance-windows&quot;&gt;Manage maintenance windows&lt;/a&gt;&lt;/td&gt;
      &lt;td style=&quot;text-align: left&quot;&gt;🟢 Yes&lt;/td&gt;
      &lt;td style=&quot;text-align: left&quot;&gt;🔴 No&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;Perform major upgrades&lt;/td&gt;
      &lt;td style=&quot;text-align: left&quot;&gt;🟢 Yes&lt;/td&gt;
      &lt;td style=&quot;text-align: left&quot;&gt;🔴 No&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;Perform minor upgrades&lt;/td&gt;
      &lt;td style=&quot;text-align: left&quot;&gt;🟢 Yes&lt;/td&gt;
      &lt;td style=&quot;text-align: left&quot;&gt;🔴 No&lt;/td&gt;
    &lt;/tr&gt;
  &lt;/tbody&gt;
&lt;/table&gt;

</description>
        <pubDate>Fri, 09 Oct 2026 07:00:00 +0000</pubDate>
        <link>
          
          https://doc.scalingo.com/platform/user-management/teamwork/roles
          
        </link>
        <guid isPermaLink="true">
          
          https://doc.scalingo.com/platform/user-management/teamwork/roles
          
        </guid>
        
        <category>user</category>
        
        <category>role</category>
        
        <category>permission</category>
        
        <category>collaborator</category>
        
        
        <category>platform</category>
        
        <category>user-management</category>
        
        <category>teamwork</category>
        
      </item>
    
      <item>
        <title>Scalingo JSON Manifest</title>
        <description>&lt;p&gt;The manifest is an &lt;strong&gt;optional&lt;/strong&gt; file named &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;scalingo.json&lt;/code&gt; you can add at the
root of your repository to configure &lt;a href=&quot;/platform/app/review-apps&quot;&gt;review apps&lt;/a&gt; and &lt;a href=&quot;/platform/deployment/one-click-deploy&quot;&gt;one-click deploy button&lt;/a&gt;. Its intent is to
configure how an application should be created.&lt;/p&gt;

&lt;p&gt;For Review Apps, configuration in &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;scalingo.json&lt;/code&gt; takes precedence over
configuration inherited from the parent application. The manifest is evaluated
only when the review app is created. Changes to &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;scalingo.json&lt;/code&gt; do not reconfigure
existing review apps on subsequent deployments.&lt;/p&gt;

&lt;h2 id=&quot;configuration-of-the-environment&quot;&gt;Configuration of the Environment&lt;/h2&gt;

&lt;p&gt;The &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;scalingo.json&lt;/code&gt; manifest can be used to customize the environment of the
application.&lt;/p&gt;

&lt;h3 id=&quot;review-apps&quot;&gt;Review Apps&lt;/h3&gt;

&lt;p&gt;Variables described in the manifest are created when the review app is created,
if one of those variables is present in the parent app environment, it will be
replaced following the manifest rule.&lt;/p&gt;

&lt;h3 id=&quot;one-click-deployment&quot;&gt;One-Click Deployment&lt;/h3&gt;

&lt;p&gt;The manifest describes the default values of the environment variables, the user
can still customize them before triggering the deployment.&lt;/p&gt;

&lt;h3 id=&quot;example&quot;&gt;Example&lt;/h3&gt;

&lt;div class=&quot;language-json highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;&lt;span class=&quot;w&quot;&gt;
  &lt;/span&gt;&lt;span class=&quot;nl&quot;&gt;&quot;env&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;&lt;span class=&quot;w&quot;&gt;
    &lt;/span&gt;&lt;span class=&quot;nl&quot;&gt;&quot;ENVIRONMENT&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;&lt;span class=&quot;w&quot;&gt;
      &lt;/span&gt;&lt;span class=&quot;nl&quot;&gt;&quot;value&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;&quot;staging&quot;&lt;/span&gt;&lt;span class=&quot;w&quot;&gt;
    &lt;/span&gt;&lt;span class=&quot;p&quot;&gt;},&lt;/span&gt;&lt;span class=&quot;w&quot;&gt;
    &lt;/span&gt;&lt;span class=&quot;nl&quot;&gt;&quot;ADMIN_URL&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;&lt;span class=&quot;w&quot;&gt;
      &lt;/span&gt;&lt;span class=&quot;nl&quot;&gt;&quot;generator&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;&quot;url&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;w&quot;&gt;
      &lt;/span&gt;&lt;span class=&quot;nl&quot;&gt;&quot;template&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;&quot;%URL%/admin&quot;&lt;/span&gt;&lt;span class=&quot;w&quot;&gt;
    &lt;/span&gt;&lt;span class=&quot;p&quot;&gt;},&lt;/span&gt;&lt;span class=&quot;w&quot;&gt;
    &lt;/span&gt;&lt;span class=&quot;nl&quot;&gt;&quot;SECRET_KEY&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;&lt;span class=&quot;w&quot;&gt;
      &lt;/span&gt;&lt;span class=&quot;nl&quot;&gt;&quot;generator&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;&quot;secret&quot;&lt;/span&gt;&lt;span class=&quot;w&quot;&gt;
    &lt;/span&gt;&lt;span class=&quot;p&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;w&quot;&gt;
  &lt;/span&gt;&lt;span class=&quot;p&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;w&quot;&gt;
&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;w&quot;&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;h3 id=&quot;monorepos&quot;&gt;Monorepos&lt;/h3&gt;

&lt;p&gt;If your application code is in a subdirectory (configured using the &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;PROJECT_DIR&lt;/code&gt; environment variable), Scalingo
detects the JSON manifest under this subdirectory.&lt;/p&gt;

&lt;p&gt;If there is no JSON manifest in the &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;PROJECT_DIR&lt;/code&gt; folder, Scalingo
tries to get the &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;scalingo.json&lt;/code&gt; in every folder up to the root of your repository.&lt;/p&gt;

&lt;p&gt;See our dedicated page on &lt;a href=&quot;/platform/app/monorepo&quot;&gt;monorepos&lt;/a&gt; for more information about this type of setup.&lt;/p&gt;

&lt;h2 id=&quot;configuration-of-the-application-firewall&quot;&gt;Configuration of the Application Firewall&lt;/h2&gt;

&lt;p&gt;Review apps inherit the &lt;a href=&quot;/platform/networking/public/application-firewall&quot;&gt;Application Firewall&lt;/a&gt; rules from their parent app by default. You can override the inherited rules in &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;scalingo.json&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;An explicit &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;firewall_rules&lt;/code&gt; list replaces the parent’s rules; it is not merged
with them. Omitting &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;firewall_rules&lt;/code&gt; keeps the inherited rules.&lt;/p&gt;

&lt;p&gt;If &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;firewall_rules&lt;/code&gt; contains more rules than the application’s quota allows
(20 by default), Review App creation fails.&lt;/p&gt;

&lt;h3 id=&quot;example-1&quot;&gt;Example&lt;/h3&gt;

&lt;div class=&quot;language-json highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;&lt;span class=&quot;w&quot;&gt;
  &lt;/span&gt;&lt;span class=&quot;nl&quot;&gt;&quot;firewall_rules&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;p&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;w&quot;&gt;
    &lt;/span&gt;&lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;&lt;span class=&quot;w&quot;&gt;
      &lt;/span&gt;&lt;span class=&quot;nl&quot;&gt;&quot;cidr&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;&quot;203.0.113.42/32&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;w&quot;&gt;
      &lt;/span&gt;&lt;span class=&quot;nl&quot;&gt;&quot;label&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;&quot;office&quot;&lt;/span&gt;&lt;span class=&quot;w&quot;&gt;
    &lt;/span&gt;&lt;span class=&quot;p&quot;&gt;},&lt;/span&gt;&lt;span class=&quot;w&quot;&gt;
    &lt;/span&gt;&lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;&lt;span class=&quot;w&quot;&gt;
      &lt;/span&gt;&lt;span class=&quot;nl&quot;&gt;&quot;cidr&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;&quot;192.0.2.0/24&quot;&lt;/span&gt;&lt;span class=&quot;w&quot;&gt;
    &lt;/span&gt;&lt;span class=&quot;p&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;w&quot;&gt;
  &lt;/span&gt;&lt;span class=&quot;p&quot;&gt;]&lt;/span&gt;&lt;span class=&quot;w&quot;&gt;
&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;w&quot;&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;h3 id=&quot;disabling-the-application-firewall&quot;&gt;Disabling the Application Firewall&lt;/h3&gt;

&lt;p&gt;To disable the firewall on a review app where the parent app have some firewall rules, pass an empty array.&lt;/p&gt;

&lt;p&gt;In that case the child app will be created without any firewall rules and thus the firewall will be disabled for the child app.&lt;/p&gt;

&lt;div class=&quot;language-json highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;&lt;span class=&quot;w&quot;&gt;
  &lt;/span&gt;&lt;span class=&quot;nl&quot;&gt;&quot;firewall_rules&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;p&quot;&gt;[]&lt;/span&gt;&lt;span class=&quot;w&quot;&gt;
&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;w&quot;&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;h2 id=&quot;configuration-of-addons&quot;&gt;Configuration of Addons&lt;/h2&gt;

&lt;p&gt;Addons can also be declared in the JSON manifest and they’ll be provisioned before deploying
a review app or starting a one-click deploy.&lt;/p&gt;

&lt;h3 id=&quot;review-apps-1&quot;&gt;Review Apps&lt;/h3&gt;

&lt;p&gt;By default, addons are copied from the parent app. If you want to change the plan the review app
will be using, or to avoid using some of them which only make sense in production, you can specify
the list of addons in the manifest.&lt;/p&gt;

&lt;h3 id=&quot;one-click-deployments&quot;&gt;One-Click Deployments&lt;/h3&gt;

&lt;p&gt;Addons declared in the manifest will be provisioned before starting the deployment of the application.&lt;/p&gt;

&lt;h3 id=&quot;example-2&quot;&gt;Example&lt;/h3&gt;

&lt;p&gt;The &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;options&lt;/code&gt; attribute is optional, currently only the &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;version&lt;/code&gt; parameter is allowed in it.&lt;/p&gt;

&lt;div class=&quot;language-json highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;&lt;span class=&quot;w&quot;&gt;
  &lt;/span&gt;&lt;span class=&quot;nl&quot;&gt;&quot;addons&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;p&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;w&quot;&gt;
    &lt;/span&gt;&lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;&lt;span class=&quot;w&quot;&gt;
      &lt;/span&gt;&lt;span class=&quot;nl&quot;&gt;&quot;plan&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;&quot;postgresql:postgresql-starter-512&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;w&quot;&gt;
      &lt;/span&gt;&lt;span class=&quot;nl&quot;&gt;&quot;options&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;&lt;span class=&quot;w&quot;&gt;
        &lt;/span&gt;&lt;span class=&quot;nl&quot;&gt;&quot;version&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;&quot;11&quot;&lt;/span&gt;&lt;span class=&quot;w&quot;&gt;
      &lt;/span&gt;&lt;span class=&quot;p&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;w&quot;&gt;
    &lt;/span&gt;&lt;span class=&quot;p&quot;&gt;},&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;&lt;span class=&quot;w&quot;&gt;
      &lt;/span&gt;&lt;span class=&quot;nl&quot;&gt;&quot;plan&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;&quot;redis:redis-starter-128&quot;&lt;/span&gt;&lt;span class=&quot;w&quot;&gt;
    &lt;/span&gt;&lt;span class=&quot;p&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;w&quot;&gt;
  &lt;/span&gt;&lt;span class=&quot;p&quot;&gt;]&lt;/span&gt;&lt;span class=&quot;w&quot;&gt;
&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;w&quot;&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;aside class=&quot;note&quot;&gt;
  &lt;p&gt;You can use the CLI
&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;scalingo addons-list&lt;/code&gt;
&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;scalingo addons-plans {addon-id}&lt;/code&gt;
to get addon names and their plans.&lt;/p&gt;
&lt;/aside&gt;

&lt;h2 id=&quot;deployment-hooks&quot;&gt;Deployment Hooks&lt;/h2&gt;

&lt;p&gt;The JSON manifest also lets you declare scripts which will be executed as &lt;a href=&quot;/platform/app/postdeploy-hook&quot;&gt;postdeploy hook&lt;/a&gt;.&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;first-deploy&lt;/code&gt;: Executed after the first deployment of a review app or one-click app. It will be executed as many times as necessary until a first deployment is considered a “success” by the platform.&lt;/li&gt;
  &lt;li&gt;&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;postdeploy&lt;/code&gt; [Deprecated]: Executed after each deployment of a review app except the first one if &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;first-deploy&lt;/code&gt; is defined. This feature has been deprecated in favor of postdeploy script in the &lt;a href=&quot;/platform/app/postdeploy-hook&quot;&gt;&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;Procfile&lt;/code&gt; file&lt;/a&gt;.&lt;/li&gt;
&lt;/ul&gt;

&lt;aside class=&quot;note&quot;&gt;
  &lt;p&gt;&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;first-deploy&lt;/code&gt; and &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;postdeploy&lt;/code&gt; have the same effect for one-click applications as the &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;scalingo.json&lt;/code&gt; is only used once at the app creation.&lt;/p&gt;
&lt;/aside&gt;

&lt;h3 id=&quot;example-3&quot;&gt;Example&lt;/h3&gt;

&lt;div class=&quot;language-json highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;&lt;span class=&quot;w&quot;&gt;
  &lt;/span&gt;&lt;span class=&quot;nl&quot;&gt;&quot;scripts&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;&lt;span class=&quot;w&quot;&gt;
    &lt;/span&gt;&lt;span class=&quot;nl&quot;&gt;&quot;first-deploy&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;&quot;bundle exec rake db:migrate db:seed&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;w&quot;&gt;
    &lt;/span&gt;&lt;span class=&quot;nl&quot;&gt;&quot;postdeploy&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;&quot;bundle exec rake db:migrate&quot;&lt;/span&gt;&lt;span class=&quot;w&quot;&gt;
  &lt;/span&gt;&lt;span class=&quot;p&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;w&quot;&gt;
&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;w&quot;&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;h2 id=&quot;container-formation&quot;&gt;Container Formation&lt;/h2&gt;

&lt;p&gt;The &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;scalingo.json&lt;/code&gt; manifest can be used to setup a container formation. A container formation defines the shape of the containers that will be launched.&lt;/p&gt;

&lt;h3 id=&quot;review-apps-2&quot;&gt;Review Apps&lt;/h3&gt;

&lt;p&gt;You can specify the shape and the number of containers to be launched when a Review App is created. This is useful for making an exact copy of a production environment in Review Apps without having to perform any manual actions.&lt;/p&gt;

&lt;h3 id=&quot;one-click-deployment-1&quot;&gt;One-Click Deployment&lt;/h3&gt;

&lt;p&gt;The manifest describes how applications deployed with our one-click button are deployed. This can be useful, for example, if you want to deploy a worker at the same time to handle asynchronous tasks.&lt;/p&gt;

&lt;h3 id=&quot;example-4&quot;&gt;Example&lt;/h3&gt;

&lt;div class=&quot;language-json highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;&lt;span class=&quot;w&quot;&gt;
  &lt;/span&gt;&lt;span class=&quot;nl&quot;&gt;&quot;formation&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;&lt;span class=&quot;w&quot;&gt;
    &lt;/span&gt;&lt;span class=&quot;nl&quot;&gt;&quot;web&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;&lt;span class=&quot;w&quot;&gt;
      &lt;/span&gt;&lt;span class=&quot;nl&quot;&gt;&quot;amount&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;2&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;w&quot;&gt;
      &lt;/span&gt;&lt;span class=&quot;nl&quot;&gt;&quot;size&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;&quot;L&quot;&lt;/span&gt;&lt;span class=&quot;w&quot;&gt;
    &lt;/span&gt;&lt;span class=&quot;p&quot;&gt;},&lt;/span&gt;&lt;span class=&quot;w&quot;&gt;
    &lt;/span&gt;&lt;span class=&quot;nl&quot;&gt;&quot;worker&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;&lt;span class=&quot;w&quot;&gt;
      &lt;/span&gt;&lt;span class=&quot;nl&quot;&gt;&quot;amount&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;1&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;w&quot;&gt;
      &lt;/span&gt;&lt;span class=&quot;nl&quot;&gt;&quot;size&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;&quot;XL&quot;&lt;/span&gt;&lt;span class=&quot;w&quot;&gt;
    &lt;/span&gt;&lt;span class=&quot;p&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;w&quot;&gt;
  &lt;/span&gt;&lt;span class=&quot;p&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;w&quot;&gt;
&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;w&quot;&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;aside class=&quot;note&quot;&gt;
  &lt;p&gt;You can find more information about formation in our &lt;a href=&quot;https://scalingo.com/blog/scalingo-json-formation&quot;&gt;dedicated blog post&lt;/a&gt;&lt;/p&gt;
&lt;/aside&gt;

&lt;h2 id=&quot;reference-documentation&quot;&gt;Reference Documentation&lt;/h2&gt;

&lt;p&gt;You can find the comprehensive documentation about the structure of the
Scalingo JSON Manifest in our &lt;a href=&quot;https://developers.scalingo.com/scalingo-json-schema&quot;&gt;developers documentation&lt;/a&gt;&lt;/p&gt;
</description>
        <pubDate>Fri, 09 Oct 2026 00:00:00 +0000</pubDate>
        <link>
          
          https://doc.scalingo.com/platform/app/app-manifest
          
        </link>
        <guid isPermaLink="true">
          
          https://doc.scalingo.com/platform/app/app-manifest
          
        </guid>
        
        <category>app</category>
        
        <category>review</category>
        
        <category>apps</category>
        
        <category>one-click</category>
        
        <category>manifest</category>
        
        
        <category>platform</category>
        
        <category>app</category>
        
      </item>
    
      <item>
        <title>Custom Error and Maintenance Pages</title>
        <description>&lt;h2 id=&quot;custom-error-pages&quot;&gt;Custom Error Pages&lt;/h2&gt;

&lt;p&gt;Our routers may return an error page when an application is unreachable. By
default, the error page looks like the following:&lt;/p&gt;

&lt;div class=&quot;mdl-card mdl-shadow--2dp&quot; style=&quot;width: 100%; max-width: ; margin: 16px auto;&quot;&gt;
  &lt;div class=&quot;mdl-card__media&quot; style=&quot;background-color: white;&quot;&gt;
    &lt;img src=&quot;https://cdn.scalingo.com/documentation/screenshot_application_error.png&quot; style=&quot;max-width: ; display: block; margin: auto&quot; /&gt;
  &lt;/div&gt;
&lt;/div&gt;

&lt;p&gt;You can customize these pages by providing Scalingo with a custom error page
URL. Five different error pages can be customized. You need to set one of these
environment variables depending on which error page you want to customize:&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;SCALINGO_NO_FRONT_ERROR_URL&lt;/code&gt;: if the application has no &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;web&lt;/code&gt; container
running but other types of containers are.&lt;/li&gt;
  &lt;li&gt;&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;SCALINGO_STOPPED_PAGE_URL&lt;/code&gt;: if the application has no running container.&lt;/li&gt;
  &lt;li&gt;&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;SCALINGO_APP_ERROR_URL&lt;/code&gt;: if the application returns a 502 HTTP response,
crashed or cut the connection unexpectedly.&lt;/li&gt;
  &lt;li&gt;&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;SCALINGO_TIMEOUT_ERROR_URL&lt;/code&gt;: if the application returns a 504 HTTP response
or timed out.&lt;/li&gt;
  &lt;li&gt;&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;SCALINGO_FORBIDDEN_PAGE_URL&lt;/code&gt;: if the request is denied by the application IP
firewall.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;To learn more about HTTP errors returned by our frontends, please see &lt;a href=&quot;/platform/networking/public/routing#http-errors&quot;&gt;our
documentation&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;The usage is the following:
&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;SCALINGO_STOPPED_PAGE_URL=https://cdn.example.com/stopped_page.html&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;In order to prevent the page to be fetched at each request, the content is
cached in the router’s memory. Hence we limit the size of this page to 10MB.&lt;/p&gt;

&lt;p&gt;It is mandatory to restart the application for the configuration of these pages to be taken into account.&lt;/p&gt;

&lt;aside class=&quot;note&quot;&gt;
  &lt;p&gt;We advise you to develop the simplest page, with everything inlined (CSS, image,
etc.)&lt;/p&gt;
&lt;/aside&gt;

&lt;h2 id=&quot;custom-maintenance-page&quot;&gt;Custom Maintenance Page&lt;/h2&gt;

&lt;p&gt;The &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;SCALINGO_NO_FRONT_ERROR_URL&lt;/code&gt; environment can be used to display a specific
page when an application is in maintenance. Here are the steps:&lt;/p&gt;

&lt;ol&gt;
  &lt;li&gt;Set the &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;SCALINGO_NO_FRONT_ERROR_URL&lt;/code&gt; environment variable to point to a
valid URL containing the maintenance page.&lt;/li&gt;
  &lt;li&gt;Scale down the &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;web&lt;/code&gt; containers to 0.&lt;/li&gt;
  &lt;li&gt;Execute all the operations needed for as long as you need. During this
step, the maintenance page will be displayed for any request to the
application.&lt;/li&gt;
  &lt;li&gt;Scale back up the &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;web&lt;/code&gt; containers to the original value.&lt;/li&gt;
&lt;/ol&gt;

&lt;aside class=&quot;note&quot;&gt;
  &lt;p&gt;All these steps can be achieved using either the web dashboard or the CLI.&lt;/p&gt;
&lt;/aside&gt;

</description>
        <pubDate>Fri, 09 Oct 2026 00:00:00 +0000</pubDate>
        <link>
          
          https://doc.scalingo.com/platform/app/custom-error-page
          
        </link>
        <guid isPermaLink="true">
          
          https://doc.scalingo.com/platform/app/custom-error-page
          
        </guid>
        
        <category>app</category>
        
        <category>custom</category>
        
        <category>error</category>
        
        <category>page</category>
        
        
        <category>platform</category>
        
        <category>app</category>
        
      </item>
    
      <item>
        <title>Review Apps</title>
        <description>&lt;p&gt;Review apps are a &lt;em&gt;powerful collaboration tool&lt;/em&gt; to discuss about a new features
between members of your organization. We implemented this feature as part of
our &lt;a href=&quot;/platform/app/scm-integration&quot;&gt;SCM integration&lt;/a&gt;.&lt;/p&gt;

&lt;h2 id=&quot;what-are-review-apps&quot;&gt;What Are Review Apps?&lt;/h2&gt;

&lt;p&gt;Let say that you have worked some hours on an awesome new feature. It’s time to
show the world your work and to open a new Pull/Merge Request (PR) on the SCM
tool (even if it’s not fully done). With review apps enabled on Scalingo, we
will create a new application (called a &lt;em&gt;review app&lt;/em&gt;) with the code of the new
feature. You can now share the result of your work, to get it validated, with
all people involved, even if they are not in the tech field.&lt;/p&gt;

&lt;p&gt;Maybe they will tell you to change something like adding tests or to change a
button color. You need to push your following modifications on the branch
involved in the PR to update the review app.&lt;/p&gt;

&lt;p&gt;Once all of our teammates are satisfied and the PR is closed, we will
automatically delete the review app. You can disable this behavior or add a
delay to fit your needs. This latter setting means that you can still review PR
after your dev team has closed the PR.&lt;/p&gt;

&lt;p&gt;The owner of the parent application is the only account which can manually delete the review app, via
the Settings menu of &lt;em&gt;the review app&lt;/em&gt;, submenu &lt;strong&gt;General&lt;/strong&gt;, in the dashboard, or via our &lt;a href=&quot;https://developers.scalingo.com/apps#delete-an-application&quot;&gt;CLI&lt;/a&gt;.&lt;/p&gt;

&lt;aside class=&quot;warning&quot;&gt;

  &lt;p&gt;The procedure to delete a standard application is similar. Ensure you’re deleting the review app before proceeding.&lt;/p&gt;

&lt;/aside&gt;

&lt;p&gt;If you don’t want to create a new review app for each PR you can also choose
among open PRs of your app to manually deploy a review app.&lt;/p&gt;

&lt;div class=&quot;mdl-card mdl-shadow--2dp&quot; style=&quot;width: 100%; max-width: ; margin: 16px auto;&quot;&gt;
  &lt;div class=&quot;mdl-card__media&quot; style=&quot;background-color: white;&quot;&gt;
    &lt;img src=&quot;https://cdn.scalingo.com/documentation/screenshot_dashboard_review_apps_manual_deploy.png&quot; style=&quot;max-width: ; display: block; margin: auto&quot; /&gt;
  &lt;/div&gt;
&lt;/div&gt;

&lt;div class=&quot;mdl-card mdl-shadow--2dp&quot; style=&quot;width: 100%; max-width: ; margin: 16px auto;&quot;&gt;
  &lt;div class=&quot;mdl-card__media&quot; style=&quot;background-color: white;&quot;&gt;
    &lt;img src=&quot;https://cdn.scalingo.com/documentation/screenshot_dashboard_review_apps_configuration.png&quot; style=&quot;max-width: ; display: block; margin: auto&quot; /&gt;
  &lt;/div&gt;
&lt;/div&gt;

&lt;p&gt;It is also possible to manually create a review app using the &lt;a href=&quot;/tools/cli/features&quot;&gt;Scalingo CLI&lt;/a&gt;:&lt;/p&gt;

&lt;div class=&quot;language-bash highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;scalingo &lt;span class=&quot;nt&quot;&gt;--app&lt;/span&gt; my-app integration-link-manual-review-app 42
&lt;span class=&quot;nt&quot;&gt;-----&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;&amp;gt;&lt;/span&gt; Manual review app created &lt;span class=&quot;k&quot;&gt;for &lt;/span&gt;app &lt;span class=&quot;s1&quot;&gt;&apos;my-app&apos;&lt;/span&gt; with pull/merge request &lt;span class=&quot;nb&quot;&gt;id&lt;/span&gt; &lt;span class=&quot;s1&quot;&gt;&apos;42&apos;&lt;/span&gt;&lt;span class=&quot;nb&quot;&gt;.&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;In this example, &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;42&lt;/code&gt; is the pull request or merge request ID.&lt;/p&gt;

&lt;p&gt;A manually created review app is instantly deleted after the pull request is closed.&lt;/p&gt;

&lt;aside class=&quot;note&quot;&gt;
  &lt;p&gt;If one manually deletes a review app, it will not be automatically created again after a deployment. You need to manually deploy a new one.&lt;/p&gt;
&lt;/aside&gt;

&lt;h2 id=&quot;addons-collaborators-and-environment-variables&quot;&gt;Addons, Collaborators and Environment Variables&lt;/h2&gt;

&lt;p&gt;If you’ve enabled review apps, a new application will be created every time a
new PR is opened in your linked SCM-hosted repository. This new
application is a child application.&lt;/p&gt;

&lt;p&gt;Child applications clone some information from the parent app:&lt;/p&gt;
&lt;ul&gt;
  &lt;li&gt;the &lt;a href=&quot;/platform/app/scaling/scaling&quot;&gt;container formation&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;the &lt;a href=&quot;/platform/internals/stacks/overview&quot;&gt;stack&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;the &lt;a href=&quot;/platform/app/environment&quot;&gt;environment variables&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;the databases and addons: including version and plans (can be overridden in &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;scalingo.json&lt;/code&gt;), but &lt;em&gt;excluding&lt;/em&gt; the content of the databases.&lt;/li&gt;
  &lt;li&gt;the collaborators&lt;/li&gt;
  &lt;li&gt;the routing settings: &lt;a href=&quot;/platform/networking/public/cert/force-https&quot;&gt;Force HTTPS&lt;/a&gt;, &lt;a href=&quot;/platform/app/sticky-sessions&quot;&gt;Sticky Sessions&lt;/a&gt;, and &lt;a href=&quot;/platform/networking/public/application-firewall&quot;&gt;Application Firewall&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;This default behavior can be customized using a &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;scalingo.json&lt;/code&gt; file, see: &lt;a href=&quot;#configuration-of-review-apps&quot;&gt;configuration of review apps&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;It is however important to understand that the customization can allow to connect directly the Review App to the parent application database and addons, so Review Apps must be enabled only when trusted sources are allowed to create merge requests in the source code repositories. As a consequence, Scalingo prevents, by default, Review Apps from being created from forks of the original repository.&lt;/p&gt;

&lt;aside class=&quot;note&quot;&gt;
  &lt;p&gt;Databases content and other addons content won’t be copied from the parent application to its child applications.&lt;/p&gt;
&lt;/aside&gt;

&lt;h2 id=&quot;accepting-review-apps-deployments-from-forks&quot;&gt;Accepting Review Apps deployments from forks&lt;/h2&gt;
&lt;p&gt;When your project also accepts pull requests from forked repositories, and you want to take advantage of the automatic deployment of the corresponding reviews apps, you can activate the automatic deployment of review apps from forks.&lt;/p&gt;

&lt;p&gt;In the Dashboard, go to Review Apps configuration, and edit the setting for automatic deployment. Check “I want to allow review apps coming from forks”, then click on Update. As soon as the next pull request opened from a fork is received, a complete clone of your application will be automatically created!&lt;/p&gt;

&lt;p&gt;When using the CLI, add the &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;--allow-review-apps-from-forks&lt;/code&gt; flag to your integration-link configuration and accept the warning message.&lt;/p&gt;
&lt;div class=&quot;language-bash highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;nv&quot;&gt;$ &lt;/span&gt;scalingo &lt;span class=&quot;nt&quot;&gt;--app&lt;/span&gt; my-app integration-link-update &lt;span class=&quot;nt&quot;&gt;--deploy-review-apps&lt;/span&gt; &lt;span class=&quot;nt&quot;&gt;--allow-review-apps-from-forks&lt;/span&gt;
  /!&lt;span class=&quot;se&quot;&gt;\ &lt;/span&gt; Only allow automatic review apps deployments from forks &lt;span class=&quot;k&quot;&gt;if &lt;/span&gt;you trust the owners of those forks, as this could lead to security issues. More info here: https://doc.scalingo.com/platform/app/review-apps#addons-collaborators-and-environment-variables

? Allow automatic creation of review apps from forks? Yes
&lt;span class=&quot;nt&quot;&gt;-----&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;&amp;gt;&lt;/span&gt; Your app &lt;span class=&quot;s1&quot;&gt;&apos;my-app&apos;&lt;/span&gt; integration &lt;span class=&quot;nb&quot;&gt;link &lt;/span&gt;has been updated.
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;h2 id=&quot;configuration-of-review-apps&quot;&gt;Configuration of Review Apps&lt;/h2&gt;

&lt;p&gt;Having a strict copy of the parent application is sometimes not desirable. You
might not want to copy production credentials, or it is sometimes required to
start a custom task after the initialization of the app. That’s where the &lt;a href=&quot;/platform/app/app-manifest&quot;&gt;Scalingo
JSON manifest&lt;/a&gt; becomes useful.&lt;/p&gt;

&lt;p&gt;If there are valid reasons and cases where configuring the &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;scalingo.json&lt;/code&gt; is the
adequate solution, it is important to understand that it is sometimes not the appropriate
one. As Review Apps can connect to their parent database, and addons, this means personal,
or health-related information can be exposed.&lt;/p&gt;

&lt;p&gt;As a consequence, Scalingo recommends not to enable Review Apps for production applications.
The preferred approach is to create a second application linked to the same repository.
This second, separate application can then have Review Apps, while protecting production data.&lt;/p&gt;

&lt;p&gt;As a quick example, here is a sample &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;scalingo.json&lt;/code&gt; that customize the
environment variable &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;CANONICAL_HOST_URL&lt;/code&gt; for a child app:&lt;/p&gt;

&lt;div class=&quot;language-json highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;&lt;span class=&quot;w&quot;&gt;
  &lt;/span&gt;&lt;span class=&quot;nl&quot;&gt;&quot;env&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;&lt;span class=&quot;w&quot;&gt;
    &lt;/span&gt;&lt;span class=&quot;nl&quot;&gt;&quot;CANONICAL_HOST_URL&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;&lt;span class=&quot;w&quot;&gt;
      &lt;/span&gt;&lt;span class=&quot;nl&quot;&gt;&quot;generator&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;&quot;url&quot;&lt;/span&gt;&lt;span class=&quot;w&quot;&gt;
    &lt;/span&gt;&lt;span class=&quot;p&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;w&quot;&gt;
  &lt;/span&gt;&lt;span class=&quot;p&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;w&quot;&gt;
&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;w&quot;&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;Here, the value of the environment variable &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;CANONICAL_HOST_URL&lt;/code&gt; will contain
the URL to reach the newly deployed app. The &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;scalingo.json&lt;/code&gt; configuration
always takes precedence over parent app configuration.&lt;/p&gt;

&lt;h3 id=&quot;protect-a-review-app-with-basic-auth&quot;&gt;Protect a Review App with Basic Auth&lt;/h3&gt;

&lt;p&gt;You may want to protect access to your review apps so that authentication is
mandatory before reaching the review app. A solution is to update the
&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;scalingo.json&lt;/code&gt; file to look like:&lt;/p&gt;

&lt;div class=&quot;language-json highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;&lt;span class=&quot;w&quot;&gt;
  &lt;/span&gt;&lt;span class=&quot;nl&quot;&gt;&quot;env&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;&lt;span class=&quot;w&quot;&gt;
    &lt;/span&gt;&lt;span class=&quot;nl&quot;&gt;&quot;BASIC_AUTH&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;&lt;span class=&quot;w&quot;&gt;
      &lt;/span&gt;&lt;span class=&quot;nl&quot;&gt;&quot;value&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;kc&quot;&gt;true&lt;/span&gt;&lt;span class=&quot;w&quot;&gt;
    &lt;/span&gt;&lt;span class=&quot;p&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;w&quot;&gt;
  &lt;/span&gt;&lt;span class=&quot;p&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;w&quot;&gt;
&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;w&quot;&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;Then you can test the presence of this environment variable in your application
and setup Basic Auth in case this environment is defined in the environment of
the application.&lt;/p&gt;

&lt;p&gt;You can also generate a different password for each review app by using the
&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;secret&lt;/code&gt; generator in the &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;scalingo.json&lt;/code&gt; file:&lt;/p&gt;

&lt;div class=&quot;language-json highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;&lt;span class=&quot;w&quot;&gt;
  &lt;/span&gt;&lt;span class=&quot;nl&quot;&gt;&quot;env&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;&lt;span class=&quot;w&quot;&gt;
    &lt;/span&gt;&lt;span class=&quot;err&quot;&gt;//&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;err&quot;&gt;...&lt;/span&gt;&lt;span class=&quot;w&quot;&gt;
    &lt;/span&gt;&lt;span class=&quot;nl&quot;&gt;&quot;PASSWORD&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;&lt;span class=&quot;w&quot;&gt;
      &lt;/span&gt;&lt;span class=&quot;nl&quot;&gt;&quot;description&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;&quot;Basic auth password for review apps&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;w&quot;&gt;
      &lt;/span&gt;&lt;span class=&quot;nl&quot;&gt;&quot;generator&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;&quot;secret&quot;&lt;/span&gt;&lt;span class=&quot;w&quot;&gt;
    &lt;/span&gt;&lt;span class=&quot;p&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;w&quot;&gt;
  &lt;/span&gt;&lt;span class=&quot;p&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;w&quot;&gt;
&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;w&quot;&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;The environment variable &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;PASSWORD&lt;/code&gt; should be used by your application to
configure Basic Auth on your app.&lt;/p&gt;

&lt;h3 id=&quot;run-a-task-after-the-first-deployment-of-a-review-app&quot;&gt;Run a Task After the First Deployment of a Review App&lt;/h3&gt;

&lt;p&gt;When a review app is created, you might want to execute a custom action like
seeding its database. This can be done using the &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;first-deploy&lt;/code&gt; script in the
&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;scalingo.json&lt;/code&gt; manifest. If such a property is defined, the given command will
be executed as a &lt;a href=&quot;/platform/app/postdeploy-hook&quot;&gt;postdeploy hook&lt;/a&gt; after the first deployment.&lt;/p&gt;

&lt;aside class=&quot;warning&quot;&gt;

  &lt;p&gt;This script replaces the &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;postdeploy&lt;/code&gt; hook for the first deployment of a review
app. If a &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;postdeploy&lt;/code&gt; is defined in your &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;scalingo.json&lt;/code&gt; or &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;Procfile&lt;/code&gt;, it
won’t be executed.&lt;/p&gt;

&lt;/aside&gt;

&lt;div class=&quot;language-json highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;&lt;span class=&quot;w&quot;&gt;
  &lt;/span&gt;&lt;span class=&quot;nl&quot;&gt;&quot;scripts&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;&lt;span class=&quot;w&quot;&gt;
    &lt;/span&gt;&lt;span class=&quot;nl&quot;&gt;&quot;first-deploy&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;&quot;bundle exec rake db:deploy db:seed&quot;&lt;/span&gt;&lt;span class=&quot;w&quot;&gt;
  &lt;/span&gt;&lt;span class=&quot;p&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;w&quot;&gt;
&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;w&quot;&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;h3 id=&quot;run-a-task-after-each-deployment-of-a-review-app&quot;&gt;Run a Task After Each Deployment of a Review App&lt;/h3&gt;

&lt;p&gt;To run a custom command after each deployment of a review app, you need to
define a &lt;a href=&quot;/platform/app/postdeploy-hook&quot;&gt;postdeploy hook&lt;/a&gt; for your application. However defining a postdeploy hook would also
impact the parent application.&lt;/p&gt;

&lt;p&gt;To make sure only review apps are impacted, the common practice is to define a
custom environment variable in the &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;scalingo.json&lt;/code&gt; manifest:&lt;/p&gt;

&lt;div class=&quot;language-json highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;&lt;span class=&quot;w&quot;&gt;
  &lt;/span&gt;&lt;span class=&quot;nl&quot;&gt;&quot;env&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;&lt;span class=&quot;w&quot;&gt;
    &lt;/span&gt;&lt;span class=&quot;nl&quot;&gt;&quot;IS_REVIEW_APP&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;&lt;span class=&quot;w&quot;&gt;
      &lt;/span&gt;&lt;span class=&quot;nl&quot;&gt;&quot;value&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;&quot;true&quot;&lt;/span&gt;&lt;span class=&quot;w&quot;&gt;
    &lt;/span&gt;&lt;span class=&quot;p&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;w&quot;&gt;
  &lt;/span&gt;&lt;span class=&quot;p&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;w&quot;&gt;
&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;w&quot;&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;Then use the environment variable in your postdeploy task to check if it is
executed in the scope of a review app or not.&lt;/p&gt;

&lt;h2 id=&quot;is-it-possible-to-create-review-apps-if-my-code-is-hosted-at-a-different-place&quot;&gt;Is It Possible to Create Review Apps If My Code Is Hosted at a Different Place?&lt;/h2&gt;

&lt;p&gt;We implement review apps for code hosted on GitHub or GitLab. However you can
set it up for your specific case thanks to the Scalingo API:&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;Create a &lt;a href=&quot;/platform/app/child-apps&quot;&gt;child application&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;Deploy a gzipped tar archive containing your code:
&lt;a href=&quot;https://developers.scalingo.com/deployments#trigger-manually-a-deployment-from-an-archive&quot;&gt;https://developers.scalingo.com/deployments#trigger-manually-a-deployment-from-an-archive&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
</description>
        <pubDate>Fri, 09 Oct 2026 00:00:00 +0000</pubDate>
        <link>
          
          https://doc.scalingo.com/platform/app/review-apps
          
        </link>
        <guid isPermaLink="true">
          
          https://doc.scalingo.com/platform/app/review-apps
          
        </guid>
        
        <category>app</category>
        
        <category>review</category>
        
        <category>apps</category>
        
        
        <category>platform</category>
        
        <category>app</category>
        
      </item>
    
      <item>
        <title>Application Firewall</title>
        <description>&lt;p&gt;&lt;strong&gt;&lt;em&gt;Application Firewall&lt;/em&gt;&lt;/strong&gt; is a feature that, once configured, restricts public HTTP and HTTPS access to an application
based on allowed IPv4 &lt;abbr title=&quot;Classless Inter-Domain Routing&quot;&gt;CIDR&lt;/abbr&gt; ranges. Scalingo’s routers check the source IP address
before forwarding a request to the application’s &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;web&lt;/code&gt; containers.&lt;/p&gt;

&lt;aside class=&quot;note&quot;&gt;
  &lt;p&gt;This feature is currently in Preview and available upon request. Contact our 
Support team to get access.&lt;/p&gt;
&lt;/aside&gt;

&lt;h2 id=&quot;how-the-firewall-works&quot;&gt;How the Firewall Works&lt;/h2&gt;

&lt;p&gt;Each firewall rule &lt;strong&gt;allows access&lt;/strong&gt; from an IPv4 range. A request only needs to
match one rule to be allowed.&lt;/p&gt;

&lt;table&gt;
  &lt;thead&gt;
    &lt;tr&gt;
      &lt;th&gt;Configuration&lt;/th&gt;
      &lt;th&gt;Request source IP&lt;/th&gt;
      &lt;th&gt;Result&lt;/th&gt;
    &lt;/tr&gt;
  &lt;/thead&gt;
  &lt;tbody&gt;
    &lt;tr&gt;
      &lt;td&gt;No rules&lt;/td&gt;
      &lt;td&gt;Any IP&lt;/td&gt;
      &lt;td&gt;The firewall is disabled and does not restrict public access&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;One or more rules&lt;/td&gt;
      &lt;td&gt;Matches at least one allowed range&lt;/td&gt;
      &lt;td&gt;The firewall allows the request&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;One or more rules&lt;/td&gt;
      &lt;td&gt;Matches none of the allowed ranges&lt;/td&gt;
      &lt;td&gt;The router returns HTTP &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;403 Forbidden&lt;/code&gt;&lt;/td&gt;
    &lt;/tr&gt;
  &lt;/tbody&gt;
&lt;/table&gt;

&lt;p&gt;Adding the first rule restricts public access to the allowed ranges. Deleting
the last rule restores access from any source IP once the change takes effect.&lt;/p&gt;

&lt;h3 id=&quot;traffic-and-source-ip&quot;&gt;Traffic and Source IP&lt;/h3&gt;

&lt;p&gt;The same rules apply to the application’s default Scalingo domain and all its
custom domains.&lt;/p&gt;

&lt;p&gt;Only public HTTP and HTTPS traffic to &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;web&lt;/code&gt; containers is filtered. Traffic
exposed through the &lt;a href=&quot;/addons/tcp-gateway/start&quot;&gt;TCP addon&lt;/a&gt; is not filtered.&lt;/p&gt;

&lt;p&gt;Traffic through &lt;a href=&quot;/platform/networking/private/overview&quot;&gt;Private Networks&lt;/a&gt; is unaffected. Requests
using the application’s public route remain subject to firewall rules, even
when they come from another Scalingo application.&lt;/p&gt;

&lt;p&gt;The firewall checks the IP address that opens the TCP connection to the router.
It does not use HTTP headers such as &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;X-Forwarded-For&lt;/code&gt; to decide whether access
is allowed. When requests pass through a proxy, allow the proxy’s outbound
IP addresses.&lt;/p&gt;

&lt;aside class=&quot;note&quot;&gt;
  &lt;p&gt;Application Firewall filters source IP addresses. It is not a Web Application
Firewall (WAF): it does not inspect HTTP content to detect attacks such as SQL
injection, or provide anti-bot protection.&lt;/p&gt;
&lt;/aside&gt;

&lt;h3 id=&quot;rule-format-and-limits&quot;&gt;Rule Format and Limits&lt;/h3&gt;

&lt;ul&gt;
  &lt;li&gt;Each rule has an ID, an IPv4 range in &lt;abbr title=&quot;Classless Inter-Domain Routing&quot;&gt;CIDR&lt;/abbr&gt; notation, and an optional label.&lt;/li&gt;
  &lt;li&gt;Use a range such as &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;203.0.113.0/24&lt;/code&gt;, or &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;/32&lt;/code&gt; for a single address, such as
&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;203.0.113.42/32&lt;/code&gt;. Addresses without a &lt;abbr title=&quot;Classless Inter-Domain Routing&quot;&gt;CIDR&lt;/abbr&gt; suffix are not accepted.&lt;/li&gt;
  &lt;li&gt;Incoming IPv6 traffic is currently not supported.&lt;/li&gt;
  &lt;li&gt;Each application can have up to 20 rules by default. This limit can be changed
by Scalingo support.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2 id=&quot;managing-firewall-rules&quot;&gt;Managing Firewall Rules&lt;/h2&gt;

&lt;p&gt;Collaborators can view, add, and remove firewall rules. Limited Collaborators
can only view them.&lt;/p&gt;

&lt;p&gt;Rule additions and deletions appear in the application’s &lt;strong&gt;Activity&lt;/strong&gt;, with
the user who performed the action, regardless of the interface used.&lt;/p&gt;

&lt;p&gt;You can manage rules through the Dashboard, the &lt;a href=&quot;/tools/cli/features#manage-application-ip-firewall-rules&quot;&gt;CLI&lt;/a&gt;, the
&lt;a href=&quot;https://developers.scalingo.com/&quot;&gt;API&lt;/a&gt;, or the &lt;a href=&quot;/tools/terraform-provider&quot;&gt;Terraform Provider&lt;/a&gt;. To change a rule,
remove it and add a new one. To disable the firewall, delete all its rules.&lt;/p&gt;

&lt;aside class=&quot;note&quot;&gt;
  &lt;p&gt;Adding or removing a rule can take several minutes to take effect. 
The previous firewall configuration remains active until then.&lt;/p&gt;
&lt;/aside&gt;

&lt;h3 id=&quot;using-the-dashboard&quot;&gt;Using the Dashboard&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;Firewall enabled&lt;/strong&gt; means at least one rule exists. &lt;strong&gt;Firewall disabled&lt;/strong&gt; means
no rules exist. This indicator does not report whether changes have propagated
to the routers.&lt;/p&gt;

&lt;p&gt;To add a rule:&lt;/p&gt;

&lt;ol&gt;
  &lt;li&gt;From your web browser, open your &lt;a href=&quot;https://dashboard.scalingo.com/&quot;&gt;dashboard&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;Click on the application for which you want to add a firewall rule&lt;/li&gt;
  &lt;li&gt;Click on the &lt;strong&gt;Settings&lt;/strong&gt; tab&lt;/li&gt;
  &lt;li&gt;From the &lt;strong&gt;Settings&lt;/strong&gt; sub-menu, select &lt;strong&gt;Public Routing&lt;/strong&gt;&lt;/li&gt;
  &lt;li&gt;Locate the &lt;strong&gt;Firewall rules&lt;/strong&gt; block&lt;/li&gt;
  &lt;li&gt;In the &lt;strong&gt;IP Range&lt;/strong&gt; field, enter the IPv4 range to allow in &lt;abbr title=&quot;Classless Inter-Domain Routing&quot;&gt;CIDR&lt;/abbr&gt; notation,
for example &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;203.0.113.42/32&lt;/code&gt;&lt;/li&gt;
  &lt;li&gt;Optionally, enter a label in the &lt;strong&gt;Label&lt;/strong&gt; field, for example &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;Office VPN&lt;/code&gt;&lt;/li&gt;
  &lt;li&gt;Click the &lt;strong&gt;Save&lt;/strong&gt; button&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;To remove a rule from the same &lt;strong&gt;Firewall rules&lt;/strong&gt; block:&lt;/p&gt;

&lt;ol&gt;
  &lt;li&gt;Locate the rule you want to remove by its IP range or label&lt;/li&gt;
  &lt;li&gt;Use the delete action for that rule&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Deleting the last rule disables the firewall and restores public access from
any source IP once the change takes effect.&lt;/p&gt;

&lt;h3 id=&quot;using-the-cli&quot;&gt;Using the CLI&lt;/h3&gt;

&lt;p&gt;List the current rules, including their IDs and labels:&lt;/p&gt;

&lt;div class=&quot;language-bash highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;scalingo &lt;span class=&quot;nt&quot;&gt;--app&lt;/span&gt; my-app app-firewall-rules
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;Allow access from a single IPv4 address:&lt;/p&gt;

&lt;div class=&quot;language-bash highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;scalingo &lt;span class=&quot;nt&quot;&gt;--app&lt;/span&gt; my-app app-firewall-rule-add &lt;span class=&quot;nt&quot;&gt;--cidr&lt;/span&gt; 203.0.113.42/32 &lt;span class=&quot;nt&quot;&gt;--label&lt;/span&gt; office
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;Remove a rule using its ID:&lt;/p&gt;

&lt;div class=&quot;language-bash highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;scalingo &lt;span class=&quot;nt&quot;&gt;--app&lt;/span&gt; my-app app-firewall-rule-remove &lt;span class=&quot;s1&quot;&gt;&apos;&amp;lt;rule-id&amp;gt;&apos;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;Replace &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;my-app&lt;/code&gt; with your application’s name and &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;&amp;lt;rule-id&amp;gt;&lt;/code&gt; with the ID
returned by &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;app-firewall-rules&lt;/code&gt;.&lt;/p&gt;

&lt;h2 id=&quot;common-use-cases&quot;&gt;Common Use Cases&lt;/h2&gt;

&lt;h3 id=&quot;restricting-access-to-a-vpn&quot;&gt;Restricting Access to a VPN&lt;/h3&gt;

&lt;p&gt;Allow the VPN’s public outbound IPv4 addresses. Users must route their requests
to the application through that VPN. To restrict public access to the VPN,
allow only its outbound addresses: any other allowed range also grants access.&lt;/p&gt;

&lt;h3 id=&quot;allowing-cloudflare-traffic&quot;&gt;Allowing Cloudflare Traffic&lt;/h3&gt;

&lt;p&gt;To require public incoming requests to your application to pass through Cloudflare:&lt;/p&gt;
&lt;ul&gt;
  &lt;li&gt;Add one rule for each &lt;a href=&quot;https://www.cloudflare.com/ips/&quot;&gt;Cloudflare proxy IPv4 range&lt;/a&gt; in your Application Firewall allowlist&lt;/li&gt;
  &lt;li&gt;Make sure to only allow these ranges, so that any other source is rejected&lt;/li&gt;
  &lt;li&gt;Keep the allowlist in sync with Cloudflare’s published IP ranges&lt;/li&gt;
&lt;/ul&gt;

&lt;aside class=&quot;warning&quot;&gt;

  &lt;p&gt;Cloudflare’s proxy IP ranges are shared across its customers. Allowing these
ranges does not restrict access to your Cloudflare account.&lt;/p&gt;

&lt;/aside&gt;

&lt;h3 id=&quot;allowing-other-scalingo-applications&quot;&gt;Allowing Other Scalingo Applications&lt;/h3&gt;

&lt;p&gt;Applications in the same project can use &lt;a href=&quot;/platform/networking/private/overview&quot;&gt;private routing&lt;/a&gt;,
which is unaffected by Application Firewall.&lt;/p&gt;

&lt;p&gt;For connections through the public route, including from other projects,
allow the &lt;a href=&quot;/platform/networking/public/egress&quot;&gt;egress IPv4 addresses&lt;/a&gt; of each source region.&lt;/p&gt;

&lt;aside class=&quot;warning&quot;&gt;

  &lt;p&gt;Scalingo’s egress IP addresses are shared. Allowing them grants access to all
applications using those addresses, including other customers’ applications.
It does not restrict access to a specific application, project, or account.&lt;/p&gt;

&lt;/aside&gt;

&lt;h3 id=&quot;allowing-webhooks-and-external-monitoring&quot;&gt;Allowing Webhooks and External Monitoring&lt;/h3&gt;

&lt;p&gt;When a webhook provider or monitoring service calls your application over the
Internet, its connection source IP must match an allowed range. Add the
service’s outbound IPv4 ranges to keep receiving these requests after enabling
the firewall.&lt;/p&gt;

&lt;h2 id=&quot;firewall-rules-for-review-apps&quot;&gt;Firewall Rules for Review Apps&lt;/h2&gt;

&lt;p&gt;&lt;a href=&quot;/platform/app/review-apps&quot;&gt;Review Apps&lt;/a&gt; copy their parent’s firewall rules at creation.
Later changes to the parent’s rules are not synchronized to existing Review
Apps.&lt;/p&gt;

&lt;p&gt;The &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;firewall_rules&lt;/code&gt; setting in &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;scalingo.json&lt;/code&gt; can replace the inherited rules
or disable the firewall for a Review App. It is read only at creation;
subsequent deployments do not update the rules from this setting.&lt;/p&gt;

&lt;p&gt;See &lt;a href=&quot;/platform/app/app-manifest#configuration-of-the-application-firewall&quot;&gt;Application Firewall configuration in the manifest&lt;/a&gt;
for the configuration and JSON examples.&lt;/p&gt;

&lt;h2 id=&quot;identifying-blocked-requests&quot;&gt;Identifying Blocked Requests&lt;/h2&gt;

&lt;p&gt;Blocked requests receive an HTTP &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;403 Forbidden&lt;/code&gt; response with a standard
Scalingo error page. They are not forwarded to an application container.&lt;/p&gt;

&lt;p&gt;Enable router logs to see blocked requests in your &lt;a href=&quot;/platform/app/logs&quot;&gt;application logs&lt;/a&gt;:&lt;/p&gt;

&lt;div class=&quot;language-bash highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;scalingo &lt;span class=&quot;nt&quot;&gt;--app&lt;/span&gt; my-app router-logs &lt;span class=&quot;nt&quot;&gt;--enable&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;A firewall rejection has both &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;status=403&lt;/code&gt; and &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;container=false&lt;/code&gt;. For example,
the relevant fields are:&lt;/p&gt;

&lt;div class=&quot;language-text highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;container=false status=403
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;The &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;container=false&lt;/code&gt; field indicates that no target container was selected.
It distinguishes a firewall rejection from an HTTP 403 returned by your
application; &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;status=403&lt;/code&gt; alone does not.&lt;/p&gt;

&lt;h2 id=&quot;customizing-the-access-denied-page&quot;&gt;Customizing the Access Denied Page&lt;/h2&gt;

&lt;p&gt;Set the &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;SCALINGO_FORBIDDEN_PAGE_URL&lt;/code&gt; environment variable to the URL of your
custom error page. See &lt;a href=&quot;/platform/app/custom-error-page&quot;&gt;Custom Error and Maintenance Pages&lt;/a&gt;
for configuration requirements and restart instructions.&lt;/p&gt;

</description>
        <pubDate>Fri, 09 Oct 2026 00:00:00 +0000</pubDate>
        <link>
          
          https://doc.scalingo.com/platform/networking/public/application-firewall
          
        </link>
        <guid isPermaLink="true">
          
          https://doc.scalingo.com/platform/networking/public/application-firewall
          
        </guid>
        
        <category>networking</category>
        
        <category>firewall</category>
        
        <category>ipv4</category>
        
        <category>access</category>
        
        
        <category>platform</category>
        
        <category>networking</category>
        
        <category>public</category>
        
      </item>
    
      <item>
        <title>Overview</title>
        <description>&lt;p&gt;In a Platform as a Service environment such as Scalingo, &lt;strong&gt;public routing&lt;/strong&gt;
refers to the way hosted applications are exposed to the Internet through
publicly accessible network paths.&lt;/p&gt;

&lt;p&gt;It designates how the platform connects external (Internet) traffic to the
right application running inside our managed infrastructure. This process is
fully handled by Scalingo in an automatic, fast, and secure manner.&lt;/p&gt;

&lt;p&gt;When an application is deployed on Scalingo, the following happens:&lt;/p&gt;
&lt;ul&gt;
  &lt;li&gt;The platform runs your app on our internal infrastructure, in an isolated
runtime environment.&lt;/li&gt;
  &lt;li&gt;It assigns your application a publicly reachable domain name, ending in
&lt;strong&gt;&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;.scalingo.io.&lt;/code&gt;&lt;/strong&gt;.&lt;/li&gt;
  &lt;li&gt;It updates our public routing layer to ensure incoming requests are forwarded
to the appropriate application containers. It ensures the connection
between the outside world and our internal runtime environment (where your
application is running).&lt;/li&gt;
  &lt;li&gt;The public routing layer also handles &lt;a href=&quot;/platform/networking/public/cert/overview&quot;&gt;TLS termination (HTTPS)&lt;/a&gt;, &lt;a href=&quot;/platform/networking/public/routing#requests-distribution&quot;&gt;load
balancing&lt;/a&gt;, &lt;a href=&quot;/platform/networking/public/application-firewall&quot;&gt;Application Firewall&lt;/a&gt;,
&lt;a href=&quot;/platform/networking/public/routing#requests-queue&quot;&gt;rate-limiting&lt;/a&gt;, and &lt;a href=&quot;/platform/networking/public/routing#requests-distribution&quot;&gt;automatic failover&lt;/a&gt;.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;In short, public routing turns your isolated application instance into a
publicly consumable service. Networking (DNS, requests forwarding), security
(TLS termination), and scalability (rate-limiting, failover) concerns are all
automatically handled by the platform.&lt;/p&gt;

&lt;p&gt;Public routing is a &lt;strong&gt;core component&lt;/strong&gt; of a &lt;abbr title=&quot;Platform as a Service&quot;&gt;PaaS&lt;/abbr&gt;. It brings a good part of the
magic while sparing our customers a lot of networking annoyances. As such, it’s
fully included into our offers.&lt;/p&gt;

</description>
        <pubDate>Fri, 09 Oct 2026 00:00:00 +0000</pubDate>
        <link>
          
          https://doc.scalingo.com/platform/networking/public/overview
          
        </link>
        <guid isPermaLink="true">
          
          https://doc.scalingo.com/platform/networking/public/overview
          
        </guid>
        
        
        <category>platform</category>
        
        <category>networking</category>
        
        <category>public</category>
        
      </item>
    
      <item>
        <title>Routing</title>
        <description>&lt;h2 id=&quot;reverse-proxy&quot;&gt;Reverse Proxy&lt;/h2&gt;

&lt;p&gt;Our infrastructure involves a multitude of servers running our customer’s
applications. These servers are not directly reachable from the wild outside
world. Instead, they are hidden behind frontend servers called &lt;strong&gt;reverse
proxies&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;A reverse proxy designates a server that sits
in front of web servers and forwards client (e.g. web browser) requests to
those servers.&lt;/p&gt;

&lt;p&gt;At Scalingo, our frontend reverse proxies have multiple responsibilities:&lt;/p&gt;
&lt;ul&gt;
  &lt;li&gt;Filter out undesirable traffic.&lt;/li&gt;
  &lt;li&gt;Apply &lt;a href=&quot;/platform/networking/public/application-firewall&quot;&gt;Application Firewall rules&lt;/a&gt;.&lt;/li&gt;
  &lt;li&gt;Apply some constraints on ingress traffic to protect the platform and ensure
good performances.&lt;/li&gt;
  &lt;li&gt;Terminate HTTPS and HTTP/2 traffic.&lt;/li&gt;
  &lt;li&gt;Forward HTTP requests to applications’ &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;web&lt;/code&gt; containers, which act, as the
name implies, as web servers.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;img src=&quot;https://cdn.scalingo.com/documentation/internals/reverse_proxies.svg&quot; alt=&quot;Reverse Proxy&quot; /&gt;&lt;/p&gt;

&lt;h3 id=&quot;key-benefits&quot;&gt;Key Benefits&lt;/h3&gt;

&lt;p&gt;Running these frontend reverse proxies provides a lot of key benefits:&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;They add a layer of security by hidding the internal structure of the
platform and reducing the attack surface available for malicious users. From
the outside world, our frontend reverse proxies are the only visible brick
of our infrastructure.&lt;/li&gt;
  &lt;li&gt;They allow us to distribute &lt;a href=&quot;/platform/networking/public/ingress&quot;&gt;ingress traffic&lt;/a&gt; across available
servers hosting the applications’ containers. When a server becomes
unavailable, the reverse proxies’ configuration are updated so they can
re-route the traffic to the available ones.&lt;br /&gt;
When an application is running multiple &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;web&lt;/code&gt; containers, this also allows us
to forward the requests to one of these containers.&lt;/li&gt;
  &lt;li&gt;Since our frontend reverse proxies also act as TLS termination points, they
allow us to easily provide TLS encryption and simplify the certificate
management and renewals via Let’s Encrypt automation.&lt;/li&gt;
  &lt;li&gt;They allow us to provide &lt;a href=&quot;/platform/app/logs&quot;&gt;router logs&lt;/a&gt; and request
&lt;a href=&quot;/platform/app/metrics&quot;&gt;metrics&lt;/a&gt;.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2 id=&quot;routing-specifics&quot;&gt;Routing Specifics&lt;/h2&gt;

&lt;h3 id=&quot;requests-distribution&quot;&gt;Requests Distribution&lt;/h3&gt;

&lt;p&gt;When an HTTP request is sent to an app hosted on Scalingo, it’s first received
and analyzed by our frontend proxies to retrieve the
targeted domain name, using either the &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;Host&lt;/code&gt; HTTP header for simple HTTP
requests, or the Server Name Indication (&lt;abbr title=&quot;Server Name Indication&quot;&gt;SNI&lt;/abbr&gt;) of the TLS handshake for
encrypted HTTPS requests.&lt;/p&gt;

&lt;p&gt;Once the domain name is known, our routers use it to determine the location of
the application’s &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;web&lt;/code&gt; container(s) and forward the request to one of them.
Selection is made by applying a strict round-robin scheduling across the
available &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;web&lt;/code&gt; containers of the application, ensuring even load balancing.&lt;/p&gt;

&lt;p&gt;The request is processed by the application, and the answer is sent back to the
client through the reverse proxy.&lt;/p&gt;

&lt;h4 id=&quot;quarantine&quot;&gt;Quarantine&lt;/h4&gt;

&lt;p&gt;Our reverse proxies also include a quarantine mechanism to prevent requests
from being sent to misbehaving containers. If one of your application’s &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;web&lt;/code&gt;
containers unexpectedly closes the connection, it is automatically placed in
quarantine. From this point on, our frontends will stop routing requests to it
and will instead periodically attempt to contact the container using
exponential backoff. Once the container responds successfully, it is removed
from quarantine and begins to receiving requests again.&lt;/p&gt;

&lt;h4 id=&quot;sticky-session&quot;&gt;Sticky Session&lt;/h4&gt;

&lt;p&gt;Our Sticky Sessions feature allows to slightly modify the default routing
configuration by associating all incoming HTTP requests to a specific,
single &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;web&lt;/code&gt; container.&lt;/p&gt;

&lt;p&gt;For more details about this feature, please read the &lt;a href=&quot;/platform/app/sticky-sessions&quot;&gt;dedicated documentation
page&lt;/a&gt;.&lt;/p&gt;

&lt;h3 id=&quot;requests-queue&quot;&gt;Requests Queue&lt;/h3&gt;

&lt;p&gt;Each router of the infrastructure is keeping a local request queue for each
application running on the platform. For each application, this queue is
limited to 50 requests per &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;web&lt;/code&gt; container. If the queue is full and a new
request is received the router returns a &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;503 Service Unavailable&lt;/code&gt; &lt;a href=&quot;#http-errors&quot;&gt;HTTP
error&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;For instance, if your application is using 2 &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;web&lt;/code&gt; containers, our reverse
proxies accept to queue up to 100 requests, and then reject any additional
requests.&lt;/p&gt;

&lt;p&gt;When requests are being queued, it means the application is not able to cope
with the amount of received requests. It often means the application is not
well sized compared to the traffic the instances need to handle. The
application should either have more &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;web&lt;/code&gt; containers, or it should be optimized
to respond to requests faster.&lt;/p&gt;

&lt;h3 id=&quot;timeouts&quot;&gt;Timeouts&lt;/h3&gt;

&lt;p&gt;When a new connection has been established to a &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;web&lt;/code&gt; container, the app is
given an initial 30 seconds window to return a response. This response can be
incomplete, the idea is to have some data transiting into the TCP
socket so we know the &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;web&lt;/code&gt; process is active.&lt;/p&gt;

&lt;p&gt;After this first exchange, the window grows to 60 seconds. To maintain the
connection active (for instance, while your app is processing a response), it
has to send data back to the client at least once every 59 seconds.&lt;/p&gt;

&lt;p&gt;When these timeouts are reached, our frontend reverse proxies return a
&lt;a href=&quot;#http-504&quot;&gt;&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;504 Gateway Timeout&lt;/code&gt;&lt;/a&gt; HTTP error.&lt;/p&gt;

&lt;aside class=&quot;note&quot;&gt;
  &lt;p&gt;These timeouts only apply to &lt;a href=&quot;/platform/networking/public/ingress&quot;&gt;ingress&lt;/a&gt; connections.&lt;br /&gt;
There are no timeouts for &lt;a href=&quot;/platform/networking/public/egress&quot;&gt;egress&lt;/a&gt; connections.&lt;/p&gt;
&lt;/aside&gt;

&lt;h3 id=&quot;websockets-server-sent-events-and-long-running-connections&quot;&gt;WebSockets, Server-Sent Events and Long-Running Connections&lt;/h3&gt;

&lt;p&gt;WebSockets, Server-Sent Events (&lt;abbr title=&quot;Server-Sent Events&quot;&gt;SSE&lt;/abbr&gt;) and long-running connections are
fully supported and available by default.&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;#timeouts&quot;&gt;Timeouts&lt;/a&gt; still apply, so please make sure your application keeps
the connection alive when necessary.&lt;/p&gt;

&lt;h3 id=&quot;headers&quot;&gt;Headers&lt;/h3&gt;

&lt;p&gt;Our frontend reverse proxies add or update a few headers to each request:&lt;/p&gt;

&lt;!-- The following creates a definition list using Kramdown specific syntax.
Each item is given an id so we can link them directly.
https://kramdown.gettalong.org/syntax.html#definition-lists --&gt;

&lt;dl&gt;
  &lt;dt id=&quot;x-real-ip&quot;&gt;&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;X-Real-IP&lt;/code&gt;&lt;/dt&gt;
  &lt;dd&gt;The originating IP address of the client connecting to Scalingo.&lt;/dd&gt;
  &lt;dt id=&quot;x-forwarded-for&quot;&gt;&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;X-Forwarded-For&lt;/code&gt;&lt;/dt&gt;
  &lt;dd&gt;The originating IP address of the client connecting to Scalingo.&lt;/dd&gt;
  &lt;dt id=&quot;x-forwarded-proto&quot;&gt;&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;X-Forwarded-Proto&lt;/code&gt;&lt;/dt&gt;
  &lt;dd&gt;The originating protocol of the HTTP request. Either &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;http&lt;/code&gt; or &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;https&lt;/code&gt;.&lt;/dd&gt;
  &lt;dt id=&quot;x-forwarded-port&quot;&gt;&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;X-Forwarded-Port&lt;/code&gt;&lt;/dt&gt;
  &lt;dd&gt;The originating port of the HTTP request. Either &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;80&lt;/code&gt; or &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;443&lt;/code&gt;.&lt;/dd&gt;
  &lt;dt id=&quot;x-request-id&quot;&gt;&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;X-Request-ID&lt;/code&gt;&lt;/dt&gt;
  &lt;dd&gt;UUID identifying the request, set only if not already existing.&lt;/dd&gt;
  &lt;dt id=&quot;x-request-start&quot;&gt;&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;X-Request-Start&lt;/code&gt;&lt;/dt&gt;
  &lt;dd&gt;Unix timestamp (in milliseconds) when the request was received by the front
server.&lt;br /&gt;
Example: &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;t=1693406590.527&lt;/code&gt;.&lt;/dd&gt;
  &lt;dt id=&quot;x-scalingo-error&quot;&gt;&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;X-Scalingo-Error&lt;/code&gt;&lt;/dt&gt;
  &lt;dd&gt;Detailed error message when an error occurred on the router.&lt;/dd&gt;
&lt;/dl&gt;

&lt;h3 id=&quot;requests-compression&quot;&gt;Requests Compression&lt;/h3&gt;

&lt;p&gt;Our routers apply gzip compression to incoming requests that include the
&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;Accept-Encoding: gzip&lt;/code&gt; HTTP header, but only for a limited set of resource
types identified by the following mimetypes:&lt;/p&gt;
&lt;ul&gt;
  &lt;li&gt;&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;application/atom+xml&lt;/code&gt;&lt;/li&gt;
  &lt;li&gt;&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;application/javascript&lt;/code&gt;&lt;/li&gt;
  &lt;li&gt;&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;application/json&lt;/code&gt;&lt;/li&gt;
  &lt;li&gt;&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;application/rss+xml&lt;/code&gt;&lt;/li&gt;
  &lt;li&gt;&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;application/x-javascript&lt;/code&gt;&lt;/li&gt;
  &lt;li&gt;&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;application/xml&lt;/code&gt;&lt;/li&gt;
  &lt;li&gt;&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;text/css&lt;/code&gt;&lt;/li&gt;
  &lt;li&gt;&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;text/html&lt;/code&gt;&lt;/li&gt;
  &lt;li&gt;&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;text/javascript&lt;/code&gt;&lt;/li&gt;
  &lt;li&gt;&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;text/mathml&lt;/code&gt;&lt;/li&gt;
  &lt;li&gt;&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;text/plain&lt;/code&gt;&lt;/li&gt;
  &lt;li&gt;&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;text/xml&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;If you need a different compression algorithm, or support for additional file
types, please let your application code handle it.&lt;/p&gt;

&lt;h3 id=&quot;http2&quot;&gt;HTTP/2&lt;/h3&gt;

&lt;p&gt;HTTP/2 is enabled by default and always available.&lt;/p&gt;

&lt;p&gt;If the client supports HTTP/2, and if it is reaching the application using
HTTPS, the connection is automatically upgraded to HTTP/2 by our frontend
reverse proxies.&lt;/p&gt;

&lt;p&gt;The HTTP/2 connection terminates at the Scalingo frontend reverse proxies. We
then forward the requests from the routers to the application’s containers
through HTTP/1.1. Consequently, your application should &lt;strong&gt;not&lt;/strong&gt; expect HTTP/2
traffic.&lt;/p&gt;

&lt;p&gt;The performance benefits of HTTP/2 still apply, especially for slow clients
(e.g. mobile, xDSL) as the protocol is designed to improve speed over slow
connections. Behind the scene, multiplexed requests are handled in parallel
using HTTP/1.1 when communicating with the containers. Since these containers
operate within the same internal network, adopting HTTP/2 there would not
provide any significant additional performance gains.&lt;/p&gt;

&lt;h3 id=&quot;http-errors&quot;&gt;HTTP Errors&lt;/h3&gt;

&lt;dl&gt;
  &lt;dt id=&quot;http-413&quot;&gt;&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;413 Payload Too Large&lt;/code&gt;&lt;/dt&gt;
  &lt;dd&gt;The request size exceeds the &lt;a href=&quot;/platform/networking/public/ingress#max-request-size-and-uploads&quot;&gt;max allowed body size&lt;/a&gt;.&lt;br /&gt;
Was previously called &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;Request Entity Too Large&lt;/code&gt;.&lt;/dd&gt;
  &lt;dt id=&quot;http-403&quot;&gt;&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;403 Forbidden&lt;/code&gt;&lt;/dt&gt;
  &lt;dd&gt;The request source IP address does not match the application’s
&lt;a href=&quot;/platform/networking/public/application-firewall&quot;&gt;app firewall&lt;/a&gt;.&lt;/dd&gt;
  &lt;dt id=&quot;http-499&quot;&gt;&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;499 Client Closed Request&lt;/code&gt;&lt;/dt&gt;
  &lt;dd&gt;The client closed the connection before the server answered the request. It
is usually caused by client side timeout.&lt;/dd&gt;
  &lt;dt id=&quot;http-502&quot;&gt;&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;502 Bad Gateway&lt;/code&gt;&lt;/dt&gt;
  &lt;dd&gt;
    &lt;ul&gt;
      &lt;li&gt;The application sent an invalid response to our reverse proxy. This error
is often sent when your application is abruptly cutting connections.&lt;/li&gt;
      &lt;li&gt;All containers running the app are in quarantine.&lt;/li&gt;
    &lt;/ul&gt;

    &lt;p&gt;You can distinguish between these two cases based on the context: if you
notice multiple consecutive requests returning a &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;502&lt;/code&gt; error, it probably
means one of your application containers is in quarantine.&lt;/p&gt;
  &lt;/dd&gt;
  &lt;dt id=&quot;http-503&quot;&gt;&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;503 Service Unavailable&lt;/code&gt;&lt;/dt&gt;
  &lt;dd&gt;
    &lt;ul&gt;
      &lt;li&gt;The application requests queue is full, so the newly incoming request has
not been dequeued.&lt;/li&gt;
      &lt;li&gt;The application has been stopped by its owner.&lt;/li&gt;
      &lt;li&gt;The application has no &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;web&lt;/code&gt; container responding to HTTP requests.&lt;/li&gt;
    &lt;/ul&gt;
  &lt;/dd&gt;
  &lt;dt id=&quot;http-504&quot;&gt;&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;504 Gateway Timeout&lt;/code&gt;&lt;/dt&gt;
  &lt;dd&gt;The application timed out. Your application must accept connections and send
the first byte in a &lt;a href=&quot;#timeouts&quot;&gt;limited amount of time&lt;/a&gt;.&lt;/dd&gt;
&lt;/dl&gt;

</description>
        <pubDate>Fri, 09 Oct 2026 00:00:00 +0000</pubDate>
        <link>
          
          https://doc.scalingo.com/platform/networking/public/routing
          
        </link>
        <guid isPermaLink="true">
          
          https://doc.scalingo.com/platform/networking/public/routing
          
        </guid>
        
        
        <category>platform</category>
        
        <category>networking</category>
        
        <category>public</category>
        
      </item>
    
      <item>
        <title>Features</title>
        <description>&lt;h2 id=&quot;create-new-apps&quot;&gt;Create new apps&lt;/h2&gt;

&lt;p&gt;&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;scalingo create&lt;/code&gt;&lt;/p&gt;

&lt;div class=&quot;language-bash highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;scalingo create my-app

&lt;span class=&quot;c&quot;&gt;# Create a new app with a custom Git remote&lt;/span&gt;
scalingo &lt;span class=&quot;nt&quot;&gt;--remote&lt;/span&gt; staging create my-app
scalingo &lt;span class=&quot;nt&quot;&gt;--remote&lt;/span&gt; production create my-app
scalingo &lt;span class=&quot;nt&quot;&gt;--remote&lt;/span&gt; custom create my-app
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;h2 id=&quot;setup-your-account-ssh-keys&quot;&gt;Setup your account SSH keys&lt;/h2&gt;

&lt;p&gt;&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;scalingo keys|keys-add|keys-remove&lt;/code&gt;&lt;/p&gt;

&lt;div class=&quot;language-bash highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;scalingo keys
scalingo keys-add &lt;span class=&quot;s2&quot;&gt;&quot;Laptop SSH key&quot;&lt;/span&gt; &lt;span class=&quot;nv&quot;&gt;$HOME&lt;/span&gt;/.ssh/id_ed25519.pub
scalingo keys-remove &lt;span class=&quot;s2&quot;&gt;&quot;Laptop SSH key&quot;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;h2 id=&quot;configure-their-environment&quot;&gt;Configure their environment&lt;/h2&gt;

&lt;p&gt;&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;scalingo env|env-set|env-unset&lt;/code&gt;&lt;/p&gt;

&lt;div class=&quot;language-bash highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;scalingo &lt;span class=&quot;nt&quot;&gt;--app&lt;/span&gt; my-app &lt;span class=&quot;nb&quot;&gt;env
&lt;/span&gt;scalingo &lt;span class=&quot;nt&quot;&gt;--app&lt;/span&gt; my-app env-set &lt;span class=&quot;nv&quot;&gt;NODE_ENV&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;production
scalingo &lt;span class=&quot;nt&quot;&gt;--app&lt;/span&gt; my-app env-unset NODE_ENV
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;h2 id=&quot;configure-custom-domain-names&quot;&gt;Configure custom domain names&lt;/h2&gt;

&lt;p&gt;&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;scalingo domains|domains-add|domains-ssl|domains-remove&lt;/code&gt;&lt;/p&gt;

&lt;div class=&quot;language-bash highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;scalingo &lt;span class=&quot;nt&quot;&gt;--app&lt;/span&gt; my-app domains
scalingo &lt;span class=&quot;nt&quot;&gt;--app&lt;/span&gt; my-app domains-add example.com
scalingo &lt;span class=&quot;nt&quot;&gt;--app&lt;/span&gt; my-app domains-ssl example.com &lt;span class=&quot;nt&quot;&gt;--cert&lt;/span&gt; file.crt &lt;span class=&quot;nt&quot;&gt;--key&lt;/span&gt; file.key
scalingo &lt;span class=&quot;nt&quot;&gt;--app&lt;/span&gt; my-app domains-remove example.com
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;h2 id=&quot;configure-canonical-domain-name&quot;&gt;Configure canonical domain name&lt;/h2&gt;

&lt;p&gt;&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;scalingo set-canonical-domain|unset-canonical-domain&lt;/code&gt;&lt;/p&gt;

&lt;div class=&quot;language-bash highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;scalingo &lt;span class=&quot;nt&quot;&gt;--app&lt;/span&gt; my-app set-canonical-domain example.com
scalingo &lt;span class=&quot;nt&quot;&gt;--app&lt;/span&gt; my-app unset-canonical-domain
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;h2 id=&quot;configure-router&quot;&gt;Configure router&lt;/h2&gt;

&lt;p&gt;&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;scalingo sticky-session|force-https|router-logs&lt;/code&gt;&lt;/p&gt;

&lt;div class=&quot;language-bash highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;scalingo &lt;span class=&quot;nt&quot;&gt;--app&lt;/span&gt; my-app sticky-session &lt;span class=&quot;nt&quot;&gt;--enable&lt;/span&gt;
scalingo &lt;span class=&quot;nt&quot;&gt;--app&lt;/span&gt; my-app sticky-session &lt;span class=&quot;nt&quot;&gt;--disable&lt;/span&gt;
scalingo &lt;span class=&quot;nt&quot;&gt;--app&lt;/span&gt; my-app force-https &lt;span class=&quot;nt&quot;&gt;--enable&lt;/span&gt;
scalingo &lt;span class=&quot;nt&quot;&gt;--app&lt;/span&gt; my-app force-https &lt;span class=&quot;nt&quot;&gt;--disable&lt;/span&gt;
scalingo &lt;span class=&quot;nt&quot;&gt;--app&lt;/span&gt; my-app router-logs &lt;span class=&quot;nt&quot;&gt;--enable&lt;/span&gt;
scalingo &lt;span class=&quot;nt&quot;&gt;--app&lt;/span&gt; my-app router-logs &lt;span class=&quot;nt&quot;&gt;--disable&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;h2 id=&quot;manage-application-ip-firewall-rules&quot;&gt;Manage application IP firewall rules&lt;/h2&gt;

&lt;p&gt;&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;scalingo app-firewall-rules|app-firewall-rule-add|app-firewall-rule-remove&lt;/code&gt;&lt;/p&gt;

&lt;div class=&quot;language-bash highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;scalingo &lt;span class=&quot;nt&quot;&gt;--app&lt;/span&gt; my-app app-firewall-rules
scalingo &lt;span class=&quot;nt&quot;&gt;--app&lt;/span&gt; my-app app-firewall-rule-add &lt;span class=&quot;nt&quot;&gt;--cidr&lt;/span&gt; 203.0.113.42/32 &lt;span class=&quot;nt&quot;&gt;--label&lt;/span&gt; office
scalingo &lt;span class=&quot;nt&quot;&gt;--app&lt;/span&gt; my-app app-firewall-rule-remove &lt;span class=&quot;s1&quot;&gt;&apos;&amp;lt;rule-id&amp;gt;&apos;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;Use &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;app-firewall-rules&lt;/code&gt; to display the current rules, including their IDs and
labels. Replace &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;&amp;lt;rule-id&amp;gt;&lt;/code&gt; with the ID of the rule to remove. To change a
rule, remove it and add a new one.
See the &lt;a href=&quot;/platform/networking/public/application-firewall&quot;&gt;Application IP Firewall&lt;/a&gt; documentation for availability,
limits, and propagation delays.&lt;/p&gt;

&lt;h2 id=&quot;manage-collaborators-of-the-application&quot;&gt;Manage collaborators of the application&lt;/h2&gt;

&lt;p&gt;&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;scalingo collaborators|collaborators-add|collaborators-remove&lt;/code&gt;&lt;/p&gt;

&lt;div class=&quot;language-bash highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;scalingo &lt;span class=&quot;nt&quot;&gt;--app&lt;/span&gt; my-app collaborators
scalingo &lt;span class=&quot;nt&quot;&gt;--app&lt;/span&gt; my-app collaborators-add user@example.com
scalingo &lt;span class=&quot;nt&quot;&gt;--app&lt;/span&gt; my-app collaborators-remove user@example.com
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;h2 id=&quot;list-existing-addons-and-plans&quot;&gt;List existing addons and plans&lt;/h2&gt;

&lt;p&gt;&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;scalingo addons-list|addons-plans&lt;/code&gt;&lt;/p&gt;

&lt;div class=&quot;language-bash highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;scalingo addons-list
scalingo addons-plans mongodb
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;h2 id=&quot;manage-addons-of-your-applications&quot;&gt;Manage addons of your applications&lt;/h2&gt;

&lt;p&gt;&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;scalingo addons|addons-add|addons-remove|addons-upgrade&lt;/code&gt;&lt;/p&gt;

&lt;div class=&quot;language-bash highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;scalingo &lt;span class=&quot;nt&quot;&gt;--app&lt;/span&gt; my-app addons
scalingo &lt;span class=&quot;nt&quot;&gt;--app&lt;/span&gt; my-app addons-add mongodb 1g
scalingo &lt;span class=&quot;nt&quot;&gt;--app&lt;/span&gt; my-app addons-remove my-app_12345
scalingo &lt;span class=&quot;nt&quot;&gt;--app&lt;/span&gt; my-app addons-upgrade my-app_12345 2g

&lt;span class=&quot;c&quot;&gt;# Display logs for addon&lt;/span&gt;
scalingo &lt;span class=&quot;nt&quot;&gt;--app&lt;/span&gt; my-app &lt;span class=&quot;nt&quot;&gt;--addon&lt;/span&gt; addon-uuid logs
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;h2 id=&quot;download-backups-of-your-applications-addons&quot;&gt;Download backups of your applications addons&lt;/h2&gt;

&lt;p&gt;&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;scalingo backups|backups-download&lt;/code&gt;&lt;/p&gt;

&lt;div class=&quot;language-bash highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;c&quot;&gt;# List backups&lt;/span&gt;
scalingo &lt;span class=&quot;nt&quot;&gt;--app&lt;/span&gt; my-app &lt;span class=&quot;nt&quot;&gt;--addon&lt;/span&gt; addon-uuid backups

&lt;span class=&quot;c&quot;&gt;# Download backup&lt;/span&gt;
scalingo &lt;span class=&quot;nt&quot;&gt;--app&lt;/span&gt; my-app &lt;span class=&quot;nt&quot;&gt;--addon&lt;/span&gt; addon-uuid backups-download &lt;span class=&quot;nt&quot;&gt;--backup&lt;/span&gt; &lt;span class=&quot;nv&quot;&gt;$BACKUP_ID&lt;/span&gt;

&lt;span class=&quot;c&quot;&gt;# Download last backup&lt;/span&gt;
scalingo &lt;span class=&quot;nt&quot;&gt;--app&lt;/span&gt; my-app &lt;span class=&quot;nt&quot;&gt;--addon&lt;/span&gt; addon-uuid backups-download

&lt;span class=&quot;c&quot;&gt;# Set output path&lt;/span&gt;
scalingo &lt;span class=&quot;nt&quot;&gt;--app&lt;/span&gt; my-app &lt;span class=&quot;nt&quot;&gt;--addon&lt;/span&gt; addon-uuid backups-download &lt;span class=&quot;nt&quot;&gt;--output&lt;/span&gt; tmp

&lt;span class=&quot;c&quot;&gt;# Do not show the progress bar and loading messages&lt;/span&gt;
scalingo &lt;span class=&quot;nt&quot;&gt;--app&lt;/span&gt; my-app &lt;span class=&quot;nt&quot;&gt;--addon&lt;/span&gt; addon-uuid backups-download &lt;span class=&quot;nt&quot;&gt;--silent&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;h2 id=&quot;read-and-watch-the-logs&quot;&gt;Read and watch the logs&lt;/h2&gt;

&lt;p&gt;&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;scalingo logs&lt;/code&gt;&lt;/p&gt;

&lt;div class=&quot;language-bash highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;c&quot;&gt;# Display the last 1000 lines of log&lt;/span&gt;
scalingo &lt;span class=&quot;nt&quot;&gt;--app&lt;/span&gt; my-app logs &lt;span class=&quot;nt&quot;&gt;-n&lt;/span&gt; 1000

&lt;span class=&quot;c&quot;&gt;# Display logs for addon&lt;/span&gt;
scalingo &lt;span class=&quot;nt&quot;&gt;--app&lt;/span&gt; my-app &lt;span class=&quot;nt&quot;&gt;--addon&lt;/span&gt; addon-uuid logs

&lt;span class=&quot;c&quot;&gt;# Follow the logs of your application in real-time&lt;/span&gt;
scalingo &lt;span class=&quot;nt&quot;&gt;--app&lt;/span&gt; my-app logs &lt;span class=&quot;nt&quot;&gt;-f&lt;/span&gt;

&lt;span class=&quot;c&quot;&gt;# Filter your logs by container type&lt;/span&gt;
scalingo &lt;span class=&quot;nt&quot;&gt;--app&lt;/span&gt; my-app logs &lt;span class=&quot;nt&quot;&gt;-F&lt;/span&gt; &lt;span class=&quot;s2&quot;&gt;&quot;web&quot;&lt;/span&gt;
scalingo &lt;span class=&quot;nt&quot;&gt;--app&lt;/span&gt; my-app logs &lt;span class=&quot;nt&quot;&gt;--filter&lt;/span&gt; &lt;span class=&quot;s2&quot;&gt;&quot;worker&quot;&lt;/span&gt;
scalingo &lt;span class=&quot;nt&quot;&gt;--app&lt;/span&gt; my-app logs &lt;span class=&quot;nt&quot;&gt;-F&lt;/span&gt; &lt;span class=&quot;s2&quot;&gt;&quot;web|worker&quot;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;h2 id=&quot;list-the-logs-archives&quot;&gt;List the logs archives&lt;/h2&gt;

&lt;p&gt;&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;scalingo logs-archives&lt;/code&gt;&lt;/p&gt;

&lt;div class=&quot;language-bash highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;c&quot;&gt;# Display the last 10 logs archives&lt;/span&gt;
scalingo &lt;span class=&quot;nt&quot;&gt;--app&lt;/span&gt; my-app logs-archives

&lt;span class=&quot;c&quot;&gt;# Follow the 2nd page of logs archives (from 11 to 20)&lt;/span&gt;
scalingo &lt;span class=&quot;nt&quot;&gt;--app&lt;/span&gt; my-app logs-archives &lt;span class=&quot;nt&quot;&gt;--page&lt;/span&gt; 2
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;h2 id=&quot;run-custom-job&quot;&gt;Run custom job&lt;/h2&gt;

&lt;p&gt;&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;scalingo run&lt;/code&gt;&lt;/p&gt;

&lt;div class=&quot;language-bash highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;scalingo &lt;span class=&quot;nt&quot;&gt;--app&lt;/span&gt; my-app run bundle &lt;span class=&quot;nb&quot;&gt;exec &lt;/span&gt;rails console

&lt;span class=&quot;c&quot;&gt;# Define custom environment variables into the one-off container&lt;/span&gt;
scalingo &lt;span class=&quot;nt&quot;&gt;--app&lt;/span&gt; my-app run &lt;span class=&quot;nt&quot;&gt;--env&lt;/span&gt; &lt;span class=&quot;nv&quot;&gt;CUSTOM_ENV&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;value &lt;span class=&quot;nt&quot;&gt;--env&lt;/span&gt; &lt;span class=&quot;nv&quot;&gt;ENV_EXAMPLE&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;custom &amp;lt;&lt;span class=&quot;nb&quot;&gt;command&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;&amp;gt;&lt;/span&gt;

&lt;span class=&quot;c&quot;&gt;# Upload a file to the one-off container (target is /tmp/uploads)&lt;/span&gt;
scalingo &lt;span class=&quot;nt&quot;&gt;--app&lt;/span&gt; my-app run &lt;span class=&quot;nt&quot;&gt;--file&lt;/span&gt; ./dump.sql &amp;lt;&lt;span class=&quot;nb&quot;&gt;command&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;&amp;gt;&lt;/span&gt;

&lt;span class=&quot;c&quot;&gt;# Start the one-off container with a specific size of container&lt;/span&gt;
scalingo &lt;span class=&quot;nt&quot;&gt;--app&lt;/span&gt; my-app run &lt;span class=&quot;nt&quot;&gt;--size&lt;/span&gt; 2XL &amp;lt;&lt;span class=&quot;nb&quot;&gt;command&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;&amp;gt;&lt;/span&gt;

&lt;span class=&quot;c&quot;&gt;# When using hyphens in the job command, you must use double quotation marks&lt;/span&gt;
scalingo &lt;span class=&quot;nt&quot;&gt;--app&lt;/span&gt; my-app run &lt;span class=&quot;s2&quot;&gt;&quot;bundle exec rails console --sandbox&quot;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;h2 id=&quot;get-metrics-of-your-application&quot;&gt;Get metrics of your application&lt;/h2&gt;

&lt;p&gt;&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;scalingo stats&lt;/code&gt;&lt;/p&gt;

&lt;div class=&quot;language-bash highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;c&quot;&gt;# Get the current stats of the containers of your app&lt;/span&gt;
scalingo &lt;span class=&quot;nt&quot;&gt;--app&lt;/span&gt; my-app stats

&lt;span class=&quot;c&quot;&gt;# Display and update every 10 seconds the stats of the containers of your app&lt;/span&gt;
scalingo &lt;span class=&quot;nt&quot;&gt;--app&lt;/span&gt; my-app stats &lt;span class=&quot;nt&quot;&gt;--stream&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;h2 id=&quot;access-your-database&quot;&gt;Access your database&lt;/h2&gt;

&lt;p&gt;&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;scalingo mongo-console|redis-console|mysql-console|pgsql-console|db-tunnel&lt;/code&gt;&lt;/p&gt;

&lt;div class=&quot;language-bash highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;scalingo &lt;span class=&quot;nt&quot;&gt;--app&lt;/span&gt; my-app mongo-console
scalingo &lt;span class=&quot;nt&quot;&gt;--app&lt;/span&gt; my-app redis-console
scalingo &lt;span class=&quot;nt&quot;&gt;--app&lt;/span&gt; my-app mysql-console
scalingo &lt;span class=&quot;nt&quot;&gt;--app&lt;/span&gt; my-app pgsql-console

&lt;span class=&quot;c&quot;&gt;# Build an encrypted tunnel to access your database&lt;/span&gt;
scalingo &lt;span class=&quot;nt&quot;&gt;--app&lt;/span&gt; my-app db-tunnel MONGO_URL
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;h2 id=&quot;manage-containers-scale-send-signal&quot;&gt;Manage containers, scale, send signal&lt;/h2&gt;

&lt;p&gt;&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;scalingo ps|restart|scale|one-off-stop&lt;/code&gt;&lt;/p&gt;

&lt;div class=&quot;language-bash highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;scalingo &lt;span class=&quot;nt&quot;&gt;--app&lt;/span&gt; my-app ps
scalingo &lt;span class=&quot;nt&quot;&gt;--app&lt;/span&gt; my-app restart web-1
scalingo &lt;span class=&quot;nt&quot;&gt;--app&lt;/span&gt; my-app scale web:2
scalingo &lt;span class=&quot;nt&quot;&gt;--app&lt;/span&gt; my-app scale worker:2:L
scalingo &lt;span class=&quot;nt&quot;&gt;--app&lt;/span&gt; my-app scale clock:0
scalingo &lt;span class=&quot;nt&quot;&gt;--app&lt;/span&gt; my-app one-off-stop one-off-1234
scalingo &lt;span class=&quot;nt&quot;&gt;--app&lt;/span&gt; my-app send-signal &lt;span class=&quot;nt&quot;&gt;--signal&lt;/span&gt; SIGUSR1 web
scalingo &lt;span class=&quot;nt&quot;&gt;--app&lt;/span&gt; my-app send-signal &lt;span class=&quot;nt&quot;&gt;--signal&lt;/span&gt; SIGUSR2 web-1 web-2
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;h2 id=&quot;check-the-logged-in-user&quot;&gt;Check the logged in user&lt;/h2&gt;

&lt;p&gt;&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;scalingo self|whoami&lt;/code&gt;&lt;/p&gt;

&lt;div class=&quot;language-bash highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;c&quot;&gt;# Return the logged in user with either command&lt;/span&gt;
scalingo self
scalingo &lt;span class=&quot;nb&quot;&gt;whoami&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

</description>
        <pubDate>Fri, 09 Oct 2026 00:00:00 +0000</pubDate>
        <link>
          
          https://doc.scalingo.com/tools/cli/features
          
        </link>
        <guid isPermaLink="true">
          
          https://doc.scalingo.com/tools/cli/features
          
        </guid>
        
        <category>cli</category>
        
        <category>interface</category>
        
        <category>app</category>
        
        
        <category>tools</category>
        
        <category>cli</category>
        
      </item>
    
      <item>
        <title>New: Application Firewall</title>
        <description>&lt;p&gt;Application Firewall lets you restrict public HTTP and HTTPS access to your
application to allowed IPv4 ranges, for example your VPN’s outbound addresses.&lt;/p&gt;

&lt;p&gt;Requests from other addresses receive HTTP &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;403 Forbidden&lt;/code&gt; before reaching
your application’s containers.&lt;/p&gt;

&lt;p&gt;See the &lt;a href=&quot;/platform/networking/public/application-firewall&quot;&gt;Application Firewall documentation&lt;/a&gt;
to configure your rules.&lt;/p&gt;
</description>
        <pubDate>Fri, 09 Oct 2026 00:00:00 +0000</pubDate>
        <link>
          
          https://doc.scalingo.com/changelog#changelog-platform-application-firewall
          
        </link>
        <guid isPermaLink="true">
          
          https://doc.scalingo.com/changelog#changelog-platform-application-firewall
          
        </guid>
        
        
        <category>changelog</category>
        
        <category>platform</category>
        
      </item>
    
      <item>
        <title>jemalloc - jemalloc 5.4.0 is now available</title>
        <description>&lt;p&gt;jemalloc &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;5.4.0&lt;/code&gt; is now available for &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;scalingo-22&lt;/code&gt;, &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;scalingo-24&lt;/code&gt;, and
&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;scalingo-26&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;This is also the default version.&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://github.com/jemalloc/jemalloc/releases/tag/5.4.0&quot;&gt;Changelog&lt;/a&gt;&lt;/p&gt;
</description>
        <pubDate>Tue, 06 Oct 2026 12:00:00 +0000</pubDate>
        <link>
          
          https://doc.scalingo.com/changelog#changelog-buildpacks-jemalloc-5-4-0
          
        </link>
        <guid isPermaLink="true">
          
          https://doc.scalingo.com/changelog#changelog-buildpacks-jemalloc-5-4-0
          
        </guid>
        
        
        <category>changelog</category>
        
        <category>buildpacks</category>
        
      </item>
    
      <item>
        <title>Jemalloc Buildpack</title>
        <description>&lt;h2 id=&quot;purpose-of-this-buildpack&quot;&gt;Purpose of this buildpack&lt;/h2&gt;

&lt;p&gt;Jemalloc is a general purpose malloc implementation that works to avoid memory
fragmentation in multithreaded applications. This buildpack makes it easy to
install and use jemalloc with your apps.&lt;/p&gt;

&lt;h2 id=&quot;set-up-this-buildpack-for-your-application&quot;&gt;Set up this buildpack for your application&lt;/h2&gt;

&lt;p&gt;This buildpack is designed to be used in conjunction with one or more additional
buildpacks, thanks to the &lt;a href=&quot;/platform/deployment/buildpacks/multi&quot;&gt;multi buildpack&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;For instance, when creating a new Ruby app on Scalingo:&lt;/p&gt;

&lt;div class=&quot;language-console highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;gp&quot;&gt;$&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;scalingo create my-app
&lt;span class=&quot;go&quot;&gt;
&lt;/span&gt;&lt;span class=&quot;gp&quot;&gt;$&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;nb&quot;&gt;cat&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;&amp;lt;&amp;lt;&lt;/span&gt; &lt;span class=&quot;no&quot;&gt;EOF&lt;/span&gt;&lt;span class=&quot;sh&quot;&gt; &amp;gt; .buildpacks
&lt;/span&gt;&lt;span class=&quot;go&quot;&gt;https://github.com/Scalingo/jemalloc-buildpack
https://github.com/Scalingo/ruby-buildpack
EOF
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;The above commands configure your application to use the multi buildpack, and
define the &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;.buildpacks&lt;/code&gt; file. This file configures the different buildpacks to
apply. In this example, we configure the jemalloc and the Ruby buildpack.&lt;/p&gt;

&lt;h2 id=&quot;configuration&quot;&gt;Configuration&lt;/h2&gt;

&lt;h3 id=&quot;recommended&quot;&gt;Recommended&lt;/h3&gt;

&lt;p&gt;Set the &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;JEMALLOC_ENABLED&lt;/code&gt; config option to true and jemalloc will be used for
all commands run inside of your containers.&lt;/p&gt;

&lt;div class=&quot;language-plaintext highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;scalingo env-set JEMALLOC_ENABLED=true
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;h3 id=&quot;per-container-type&quot;&gt;Per Container Type&lt;/h3&gt;

&lt;p&gt;To control when jemalloc is configured on a per container basis, use &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;jemalloc.sh &amp;lt;cmd&amp;gt;&lt;/code&gt;
and ensure that &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;JEMALLOC_ENABLED&lt;/code&gt; is unset.&lt;/p&gt;

&lt;p&gt;Example Procfile:&lt;/p&gt;

&lt;div class=&quot;language-plaintext highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;web: jemalloc.sh bundle exec puma -C config/puma.rb
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;h2 id=&quot;jemalloc-versions&quot;&gt;jemalloc Versions&lt;/h2&gt;

&lt;h3 id=&quot;availability&quot;&gt;Availability&lt;/h3&gt;

&lt;p&gt;The following jemalloc versions are available:&lt;/p&gt;

&lt;table&gt;
  &lt;thead&gt;
    &lt;tr&gt;
      &lt;th style=&quot;text-align: right&quot;&gt;jemalloc Version&lt;/th&gt;
      &lt;th style=&quot;text-align: right&quot;&gt;&lt;span class=&quot;stack deprecated&quot; title=&quot;Current status: Deprecated&quot;&gt;scalingo-22&lt;/span&gt;&lt;/th&gt;
      &lt;th style=&quot;text-align: right&quot;&gt;&lt;span class=&quot;stack supported&quot; title=&quot;Current status: Supported&quot;&gt;scalingo-24&lt;/span&gt;&lt;/th&gt;
      &lt;th style=&quot;text-align: right&quot;&gt;&lt;span class=&quot;stack supported&quot; title=&quot;Current status: Supported&quot;&gt;scalingo-26&lt;/span&gt;&lt;/th&gt;
    &lt;/tr&gt;
  &lt;/thead&gt;
  &lt;tbody&gt;
    &lt;tr&gt;
      &lt;td style=&quot;text-align: right&quot;&gt;&lt;strong&gt;&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;5.4&lt;/code&gt;&lt;/strong&gt;&lt;/td&gt;
      &lt;td style=&quot;text-align: right&quot;&gt;Up to &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;5.4.0&lt;/code&gt;&lt;/td&gt;
      &lt;td style=&quot;text-align: right&quot;&gt;Up to &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;5.4.0&lt;/code&gt;&lt;/td&gt;
      &lt;td style=&quot;text-align: right&quot;&gt;Up to &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;5.4.0&lt;/code&gt;&lt;/td&gt;
    &lt;/tr&gt;
  &lt;/tbody&gt;
&lt;/table&gt;

&lt;h3 id=&quot;select-a-version&quot;&gt;Select a Version&lt;/h3&gt;

&lt;p&gt;The default jemalloc version on all stacks is the latest &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;5.4&lt;/code&gt; version. If you
need to install another version, please use the &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;JEMALLOC_VERSION&lt;/code&gt; environment
variable, like so:&lt;/p&gt;

&lt;div class=&quot;language-bash highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;scalingo env-set &lt;span class=&quot;nv&quot;&gt;JEMALLOC_VERSION&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;5.3.1
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;
</description>
        <pubDate>Tue, 06 Oct 2026 00:00:00 +0000</pubDate>
        <link>
          
          https://doc.scalingo.com/platform/deployment/buildpacks/jemalloc
          
        </link>
        <guid isPermaLink="true">
          
          https://doc.scalingo.com/platform/deployment/buildpacks/jemalloc
          
        </guid>
        
        <category>buildpacks</category>
        
        <category>build</category>
        
        <category>jemalloc</category>
        
        
        <category>platform</category>
        
        <category>deployment</category>
        
        <category>buildpacks</category>
        
      </item>
    
      <item>
        <title>nginx - ModSecurity OWASP Core Rule Set 4.25.2 (LTS) is now available</title>
        <description>&lt;p&gt;nginx ModSecurity OWASP CRS &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;4.25.2&lt;/code&gt; (LTS) is now available.&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://github.com/coreruleset/coreruleset/releases/tag/v4.25.2&quot;&gt;Changelog&lt;/a&gt;&lt;/p&gt;
</description>
        <pubDate>Mon, 05 Oct 2026 12:00:00 +0000</pubDate>
        <link>
          
          https://doc.scalingo.com/changelog#changelog-buildpacks-nginx-modsecurity-coreruleset-4-25-2
          
        </link>
        <guid isPermaLink="true">
          
          https://doc.scalingo.com/changelog#changelog-buildpacks-nginx-modsecurity-coreruleset-4-25-2
          
        </guid>
        
        
        <category>changelog</category>
        
        <category>buildpacks</category>
        
      </item>
    
      <item>
        <title>OWASP ModSecurity 3.0.17 is available</title>
        <description>&lt;p&gt;OWASP ModSecurity &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;3.0.17&lt;/code&gt; is now available for nginx.&lt;/p&gt;

&lt;p&gt;It’s also the default version.&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://github.com/owasp-modsecurity/ModSecurity/blob/v3.0.17/CHANGES&quot;&gt;Changelog&lt;/a&gt;&lt;/p&gt;
</description>
        <pubDate>Mon, 05 Oct 2026 12:00:00 +0000</pubDate>
        <link>
          
          https://doc.scalingo.com/changelog#changelog-buildpacks-nginx-owasp-modsecurity-3-0-17
          
        </link>
        <guid isPermaLink="true">
          
          https://doc.scalingo.com/changelog#changelog-buildpacks-nginx-owasp-modsecurity-3-0-17
          
        </guid>
        
        
        <category>changelog</category>
        
        <category>buildpacks</category>
        
      </item>
    
      <item>
        <title>Python - Python 3.11.17, 3.12.15, 3.13.16 and 3.14.8 are now available</title>
        <description>&lt;p&gt;Python &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;3.11.17&lt;/code&gt;, &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;3.12.15&lt;/code&gt;, &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;3.13.16&lt;/code&gt; and &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;3.14.8&lt;/code&gt; are now available.&lt;/p&gt;

&lt;p&gt;These are also the new default version for, respectively, Python 3.11, 3.12,
3.13 and 3.14.&lt;/p&gt;

&lt;p&gt;Changelogs:&lt;/p&gt;
&lt;ul&gt;
  &lt;li&gt;&lt;a href=&quot;https://docs.python.org/3.14/whatsnew/changelog.html#python-3.14.8-final&quot;&gt;Python 3.14.8&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;https://docs.python.org/3.13/whatsnew/changelog.html#python-3.13.16-final&quot;&gt;Python 3.13.16&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;https://docs.python.org/3.12/whatsnew/changelog.html#python-3.12.15-final&quot;&gt;Python 3.12.15&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;https://docs.python.org/3.11/whatsnew/changelog.html#python-3.11.17-final&quot;&gt;Python 3.11.17&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
</description>
        <pubDate>Mon, 05 Oct 2026 12:00:00 +0000</pubDate>
        <link>
          
          https://doc.scalingo.com/changelog#changelog-buildpacks-python-3-11-17-3-12-15-3-13-16-3-14-8
          
        </link>
        <guid isPermaLink="true">
          
          https://doc.scalingo.com/changelog#changelog-buildpacks-python-3-11-17-3-12-15-3-13-16-3-14-8
          
        </guid>
        
        
        <category>changelog</category>
        
        <category>buildpacks</category>
        
      </item>
    
      <item>
        <title>Scalingo for PostgreSQL® Overview</title>
        <description>&lt;h2 id=&quot;postgresql&quot;&gt;PostgreSQL®&lt;/h2&gt;

&lt;p&gt;PostgreSQL® is a free, open-source, community-managed object-relational
database management system focusing on SQL compliance and extensibility. It is
well-known for its performances, reliability and robustness, making it a very
powerful database, able to handle small to huge workloads.&lt;/p&gt;

&lt;p&gt;Besides the core features (ACID transactions, views, triggers, foreign keys,
…) PostgreSQL® also offers solutions for more specialized usages, such as
object storage with the native jsonb format, for specific dataset kinds,
such as geographic datasets with the PostGIS extension, for time-series
datasets with TimescaleDB or for vector similarity search thanks to the
pgvector extension.&lt;/p&gt;

&lt;h2 id=&quot;scalingo-for-postgresql&quot;&gt;Scalingo for PostgreSQL®&lt;/h2&gt;

&lt;p&gt;Scalingo for PostgreSQL® is our official PostgreSQL® addon. &lt;a href=&quot;https://scalingo.com/databases/postgresql#database-compare&quot;&gt;We have several
plans available&lt;/a&gt; from which you can choose depending on your
needs and budget. A free plan is available for you to test our offer.&lt;/p&gt;

&lt;p&gt;To get a complete view of what is included in our service, see
&lt;a href=&quot;/databases/postgresql/about/ha&quot;&gt;&lt;strong&gt;High availability&lt;/strong&gt;&lt;/a&gt;, &lt;a href=&quot;/databases/postgresql/about/features&quot;&gt;&lt;strong&gt;Features&lt;/strong&gt;&lt;/a&gt;,
&lt;a href=&quot;/databases/postgresql/about/limitations&quot;&gt;&lt;strong&gt;Limitations&lt;/strong&gt;&lt;/a&gt;, and the dedicated
&lt;a href=&quot;/databases/postgresql/extensions/managing-extensions&quot;&gt;&lt;strong&gt;Extensions&lt;/strong&gt;&lt;/a&gt; page.&lt;/p&gt;

&lt;h3 id=&quot;life-cycle&quot;&gt;Life-Cycle&lt;/h3&gt;

&lt;p&gt;The PostgreSQL® project releases new major versions annually, introducing new
features and performance improvements. At Scalingo, we ensure compatibility
with these major versions, typically making them available on our platform
about one year after their initial release.&lt;/p&gt;

&lt;p&gt;While the PostgreSQL® community supports a major version for up to five years
after its initial release, Scalingo supports each major version on our platform
for three years, providing minor upgrades that include critical bug fixes and
security patches. After this period, we gradually deprecate oldest versions to
ensure security, performance, and operational efficiency.&lt;/p&gt;

&lt;h4 id=&quot;available-versions&quot;&gt;Available Versions&lt;/h4&gt;

&lt;table&gt;
  &lt;thead&gt;
    &lt;tr&gt;
      &lt;th style=&quot;text-align: right&quot;&gt;PostgreSQL Version&lt;/th&gt;
      &lt;th&gt;Full Version&lt;/th&gt;
      &lt;th&gt;EOL&lt;/th&gt;
    &lt;/tr&gt;
  &lt;/thead&gt;
  &lt;tbody&gt;
    &lt;tr&gt;
      &lt;td style=&quot;text-align: right&quot;&gt;&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;18&lt;/code&gt;&lt;/td&gt;
      &lt;td&gt;up to &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;18.6.0-2&lt;/code&gt;&lt;/td&gt;
      &lt;td&gt;Nov 2030&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td style=&quot;text-align: right&quot;&gt;&lt;strong&gt;&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;17&lt;/code&gt;&lt;/strong&gt;&lt;/td&gt;
      &lt;td&gt;up to &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;17.11.0-1&lt;/code&gt;&lt;/td&gt;
      &lt;td&gt;Nov 2029&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td style=&quot;text-align: right&quot;&gt;&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;16&lt;/code&gt;&lt;/td&gt;
      &lt;td&gt;up to &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;16.15.0-1&lt;/code&gt;&lt;/td&gt;
      &lt;td&gt;Nov 2028&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td style=&quot;text-align: right&quot;&gt;&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;15&lt;/code&gt;&lt;/td&gt;
      &lt;td&gt;up to &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;15.19.0-1&lt;/code&gt;&lt;/td&gt;
      &lt;td&gt;Nov 2027&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td style=&quot;text-align: right&quot;&gt;&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;14&lt;/code&gt;&lt;/td&gt;
      &lt;td&gt;up to &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;14.24.0-1&lt;/code&gt;&lt;/td&gt;
      &lt;td&gt;Nov 2026&lt;/td&gt;
    &lt;/tr&gt;
  &lt;/tbody&gt;
&lt;/table&gt;

&lt;p&gt;The default version when provisioning a Scalingo for PostgreSQL® addon is the
latest &lt;strong&gt;&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;17&lt;/code&gt;&lt;/strong&gt; version.&lt;/p&gt;

&lt;aside class=&quot;note&quot;&gt;
  &lt;p&gt;If you need to provision a Scalingo for PostgreSQL® addon with a specific
version, please get in touch with our Support team.&lt;/p&gt;
&lt;/aside&gt;

&lt;h3 id=&quot;pricing&quot;&gt;Pricing&lt;/h3&gt;

&lt;p&gt;Our prices are details on &lt;a href=&quot;https://scalingo.com/databases/postgresql&quot;&gt;our dedicated page&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;Billing of your PostgreSQL® addon is done on a minute basis.&lt;/p&gt;

&lt;p&gt;If your database disk usage exceeds the threshold set on your plan, the
over-quota is billed per GB-hour (&lt;a href=&quot;https://scalingo.com/databases/postgresql&quot;&gt;see our FAQ for further details&lt;/a&gt;).&lt;/p&gt;

</description>
        <pubDate>Mon, 05 Oct 2026 00:00:00 +0000</pubDate>
        <link>
          
          https://doc.scalingo.com/databases/postgresql/about/overview
          
        </link>
        <guid isPermaLink="true">
          
          https://doc.scalingo.com/databases/postgresql/about/overview
          
        </guid>
        
        <category>database</category>
        
        <category>postgresql</category>
        
        <category>addon</category>
        
        
        <category>databases</category>
        
        <category>postgresql</category>
        
        <category>about</category>
        
      </item>
    
      <item>
        <title>Python</title>
        <description>&lt;p&gt;The Python language is officially supported on the platform.&lt;/p&gt;

&lt;h2 id=&quot;detection&quot;&gt;Detection&lt;/h2&gt;

&lt;p&gt;To ensure our deployment system considers your application as a Python
application, a file &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;Pipfile&lt;/code&gt;, &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;requirements.txt&lt;/code&gt;, &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;poetry.lock&lt;/code&gt; or &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;uv.lock&lt;/code&gt;
should be present at the root of your project, defining the dependencies of
your app.&lt;/p&gt;

&lt;h2 id=&quot;python-versions&quot;&gt;Python Versions&lt;/h2&gt;

&lt;h3 id=&quot;availability&quot;&gt;Availability&lt;/h3&gt;

&lt;p&gt;The following versions of Python are available:&lt;/p&gt;

&lt;table&gt;
  &lt;thead&gt;
    &lt;tr&gt;
      &lt;th style=&quot;text-align: right&quot;&gt;Python Version&lt;/th&gt;
      &lt;th style=&quot;text-align: right&quot;&gt;&lt;span class=&quot;stack deprecated&quot; title=&quot;Current status: Deprecated&quot;&gt;scalingo-22&lt;/span&gt;&lt;/th&gt;
      &lt;th style=&quot;text-align: right&quot;&gt;&lt;span class=&quot;stack supported&quot; title=&quot;Current status: Supported&quot;&gt;scalingo-24&lt;/span&gt;&lt;/th&gt;
      &lt;th style=&quot;text-align: right&quot;&gt;&lt;span class=&quot;stack supported&quot; title=&quot;Current status: Supported&quot;&gt;scalingo-26&lt;/span&gt;&lt;/th&gt;
    &lt;/tr&gt;
  &lt;/thead&gt;
  &lt;tbody&gt;
    &lt;tr&gt;
      &lt;td style=&quot;text-align: right&quot;&gt;&lt;strong&gt;&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;3.14&lt;/code&gt;&lt;/strong&gt;&lt;/td&gt;
      &lt;td style=&quot;text-align: right&quot;&gt;up to &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;3.14.8&lt;/code&gt;&lt;/td&gt;
      &lt;td style=&quot;text-align: right&quot;&gt;up to &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;3.14.8&lt;/code&gt;&lt;/td&gt;
      &lt;td style=&quot;text-align: right&quot;&gt;up to &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;3.14.8&lt;/code&gt;&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td style=&quot;text-align: right&quot;&gt;&lt;strong&gt;&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;3.13&lt;/code&gt;&lt;/strong&gt;&lt;/td&gt;
      &lt;td style=&quot;text-align: right&quot;&gt;up to &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;3.13.16&lt;/code&gt;&lt;/td&gt;
      &lt;td style=&quot;text-align: right&quot;&gt;up to &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;3.13.16&lt;/code&gt;&lt;/td&gt;
      &lt;td style=&quot;text-align: right&quot;&gt;up to &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;3.13.16&lt;/code&gt;&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td style=&quot;text-align: right&quot;&gt;&lt;strong&gt;&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;3.12&lt;/code&gt;&lt;/strong&gt;&lt;/td&gt;
      &lt;td style=&quot;text-align: right&quot;&gt;up to &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;3.12.15&lt;/code&gt;&lt;/td&gt;
      &lt;td style=&quot;text-align: right&quot;&gt;up to &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;3.12.15&lt;/code&gt;&lt;/td&gt;
      &lt;td style=&quot;text-align: right&quot;&gt;up to &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;3.12.15&lt;/code&gt;&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td style=&quot;text-align: right&quot;&gt;&lt;strong&gt;&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;3.11&lt;/code&gt;&lt;/strong&gt;&lt;/td&gt;
      &lt;td style=&quot;text-align: right&quot;&gt;up to &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;3.11.17&lt;/code&gt;&lt;/td&gt;
      &lt;td style=&quot;text-align: right&quot;&gt;up to &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;3.11.17&lt;/code&gt;&lt;/td&gt;
      &lt;td style=&quot;text-align: right&quot;&gt;up to &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;3.11.17&lt;/code&gt;&lt;/td&gt;
    &lt;/tr&gt;
  &lt;/tbody&gt;
&lt;/table&gt;

&lt;h3 id=&quot;selecting-a-version&quot;&gt;Selecting a Version&lt;/h3&gt;

&lt;p&gt;The default Python version on all stacks is the latest &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;3.13&lt;/code&gt; version.
You can, however, instruct the platform to use another version.&lt;/p&gt;

&lt;p&gt;The buildpack looks for a Python version in the following places (in descending
order of precedence):&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;The &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;runtime.txt&lt;/code&gt; file (deprecated)&lt;/li&gt;
  &lt;li&gt;The &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;.python-version&lt;/code&gt; file (recommended)&lt;/li&gt;
  &lt;li&gt;The &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;python_full_version&lt;/code&gt; field in the &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;Pipfile.lock&lt;/code&gt; file (Pipenv users
only)&lt;/li&gt;
  &lt;li&gt;The &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;python_version&lt;/code&gt; field in the &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;Pipfile.lock&lt;/code&gt; file (Pipenv users only)&lt;/li&gt;
&lt;/ul&gt;

&lt;aside class=&quot;warning&quot;&gt;

  &lt;p&gt;The &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;runtime.txt&lt;/code&gt; file is deprecated. If your app uses it, we recommend
switching to a &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;.python-version&lt;/code&gt; file instead, since it’s more widely supported
by other tooling in the Python ecosystem.&lt;/p&gt;

&lt;/aside&gt;

&lt;p&gt;To instruct the platform to use a specific Python runtime, add a
&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;.python-version&lt;/code&gt; file to your app’s root directory and declare the Python
version number to use in it.&lt;/p&gt;

&lt;p&gt;This version can be either:&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;The major Python version such as &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;3.12&lt;/code&gt; (recommended)&lt;/li&gt;
  &lt;li&gt;The full Python version such as &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;3.12.7&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;aside class=&quot;note&quot;&gt;
  &lt;p&gt;We usually recommend to specify only a major version (such as &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;3.13&lt;/code&gt;) so that
your app automatically gets the latest security updates when it’s built.&lt;/p&gt;
&lt;/aside&gt;

&lt;h2 id=&quot;dependencies&quot;&gt;Dependencies&lt;/h2&gt;

&lt;h3 id=&quot;recommended-pipenv&quot;&gt;Recommended: pipenv&lt;/h3&gt;

&lt;p&gt;When the project is using &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;pipenv&lt;/code&gt; and contains a &lt;strong&gt;Pipfile&lt;/strong&gt; and a
&lt;strong&gt;Pipfile.lock&lt;/strong&gt; files, the following command is used to install dependencies:&lt;/p&gt;

&lt;div class=&quot;language-plaintext highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;pipenv install
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;h3 id=&quot;legacy-requirementstxt&quot;&gt;Legacy: requirements.txt&lt;/h3&gt;

&lt;p&gt;If a &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;requirements.txt&lt;/code&gt; file is present in your application, the dependencies
will be installed respecting this file with:&lt;/p&gt;

&lt;div class=&quot;language-plaintext highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;pip install -r requirements.txt
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;h3 id=&quot;alternative-poetry&quot;&gt;Alternative: Poetry&lt;/h3&gt;

&lt;p&gt;If your project uses &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;poetry&lt;/code&gt; and contains a &lt;strong&gt;poetry.lock&lt;/strong&gt; file, the following command is used to install dependencies:&lt;/p&gt;

&lt;div class=&quot;language-plaintext highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;poetry sync --compile
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;h2 id=&quot;frameworks&quot;&gt;Frameworks&lt;/h2&gt;

&lt;p&gt;We handle most of the common frameworks. Obviously, Django is among them. You need to
configure your application to bind the port defined by the environment variable &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;$PORT&lt;/code&gt;.&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;&lt;a href=&quot;/languages/python/django/start&quot;&gt;Getting Started with Django&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;h2 id=&quot;specific-python-buildpack-hooks&quot;&gt;Specific Python Buildpack Hooks&lt;/h2&gt;

&lt;p&gt;You may want to trigger custom actions after a successful deployment. The &lt;a href=&quot;/platform/app/postdeploy-hook&quot;&gt;postdeploy hook&lt;/a&gt; is exactly what you need. But your
application may require some actions to be executed during the deployment.&lt;/p&gt;

&lt;p&gt;The Python buildpack can execute two hooks: before and after the installation of Python and its
dependencies. They must be located in the &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;bin&lt;/code&gt; root folder of your application and be named
&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;pre_compile&lt;/code&gt; and &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;post_compile&lt;/code&gt;.&lt;/p&gt;

&lt;h2 id=&quot;buildpack&quot;&gt;Buildpack&lt;/h2&gt;

&lt;p&gt;More information at
&lt;a href=&quot;https://github.com/Scalingo/python-buildpack&quot;&gt;https://github.com/Scalingo/python-buildpack&lt;/a&gt;.&lt;/p&gt;

&lt;h2 id=&quot;web_concurrency&quot;&gt;WEB_CONCURRENCY&lt;/h2&gt;

&lt;p&gt;The default level of concurrency is automatically defined, depending on the amount of memory available in the container running the app:&lt;/p&gt;

&lt;table&gt;
  &lt;thead&gt;
    &lt;tr&gt;
      &lt;th style=&quot;text-align: right&quot;&gt;Container Size&lt;/th&gt;
      &lt;th style=&quot;text-align: right&quot;&gt;Memory (MB)&lt;/th&gt;
      &lt;th style=&quot;text-align: right&quot;&gt;Default Concurrency&lt;/th&gt;
    &lt;/tr&gt;
  &lt;/thead&gt;
  &lt;tbody&gt;
    &lt;tr&gt;
      &lt;td style=&quot;text-align: right&quot;&gt;S&lt;/td&gt;
      &lt;td style=&quot;text-align: right&quot;&gt;256&lt;/td&gt;
      &lt;td style=&quot;text-align: right&quot;&gt;1&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td style=&quot;text-align: right&quot;&gt;M&lt;/td&gt;
      &lt;td style=&quot;text-align: right&quot;&gt;512&lt;/td&gt;
      &lt;td style=&quot;text-align: right&quot;&gt;2&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td style=&quot;text-align: right&quot;&gt;L&lt;/td&gt;
      &lt;td style=&quot;text-align: right&quot;&gt;1024&lt;/td&gt;
      &lt;td style=&quot;text-align: right&quot;&gt;4&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td style=&quot;text-align: right&quot;&gt;XL&lt;/td&gt;
      &lt;td style=&quot;text-align: right&quot;&gt;2048&lt;/td&gt;
      &lt;td style=&quot;text-align: right&quot;&gt;8&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td style=&quot;text-align: right&quot;&gt;2XL&lt;/td&gt;
      &lt;td style=&quot;text-align: right&quot;&gt;4096&lt;/td&gt;
      &lt;td style=&quot;text-align: right&quot;&gt;16&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td style=&quot;text-align: right&quot;&gt;3XL&lt;/td&gt;
      &lt;td style=&quot;text-align: right&quot;&gt;8192&lt;/td&gt;
      &lt;td style=&quot;text-align: right&quot;&gt;32&lt;/td&gt;
    &lt;/tr&gt;
  &lt;/tbody&gt;
&lt;/table&gt;

&lt;p&gt;For further details about this calculation, please see the &lt;a href=&quot;https://github.com/Scalingo/python-buildpack/blob/master/vendor/WEB_CONCURRENCY.sh&quot;&gt;WEB_CONCURRENCY.sh&lt;/a&gt; script of the Python buildpack.&lt;/p&gt;

&lt;p&gt;To override the automatically defined value, set the &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;WEB_CONCURRENCY&lt;/code&gt; environment variable to the desired value.&lt;/p&gt;
</description>
        <pubDate>Mon, 05 Oct 2026 00:00:00 +0000</pubDate>
        <link>
          
          https://doc.scalingo.com/languages/python/start
          
        </link>
        <guid isPermaLink="true">
          
          https://doc.scalingo.com/languages/python/start
          
        </guid>
        
        <category>python</category>
        
        
        <category>languages</category>
        
        <category>python</category>
        
      </item>
    
      <item>
        <title>PostgreSQL - New Version: 18.6.0-2</title>
        <description>&lt;h2 id=&quot;new-image&quot;&gt;New Image&lt;/h2&gt;

&lt;ul&gt;
  &lt;li&gt;&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;scalingo/postgresql:18.6.0-2&lt;/code&gt;
    &lt;ul&gt;
      &lt;li&gt;TimescaleDB v2.30.1&lt;/li&gt;
      &lt;li&gt;pgvector v0.8.6&lt;/li&gt;
      &lt;li&gt;PostGIS v3.6.4&lt;/li&gt;
      &lt;li&gt;PostgreSQL Anonymizer v3.1.3&lt;/li&gt;
    &lt;/ul&gt;
  &lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Docker image on &lt;a href=&quot;https://hub.docker.com/r/scalingo/postgresql&quot;&gt;Docker Hub&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Default version remains: &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;17.11.0-1&lt;/code&gt;&lt;/p&gt;
</description>
        <pubDate>Mon, 05 Oct 2026 00:00:00 +0000</pubDate>
        <link>
          
          https://doc.scalingo.com/changelog#changelog-databases-postgresql-18-6-0-2
          
        </link>
        <guid isPermaLink="true">
          
          https://doc.scalingo.com/changelog#changelog-databases-postgresql-18-6-0-2
          
        </guid>
        
        
        <category>changelog</category>
        
        <category>databases</category>
        
      </item>
    
      <item>
        <title>Free Trial</title>
        <description>&lt;h2 id=&quot;free-trial&quot;&gt;Free trial&lt;/h2&gt;

&lt;p&gt;When you &lt;a href=&quot;https://auth.scalingo.com/users/sign_up&quot;&gt;create an account&lt;/a&gt;, Scalingo offers
eligible accounts a 30-day free trial to test the platform.&lt;/p&gt;

&lt;p&gt;To use your free trial, you must configure your &lt;a href=&quot;/platform/billing/profile&quot;&gt;billing profile&lt;/a&gt;
and add a valid &lt;a href=&quot;/platform/billing/payment-methods&quot;&gt;payment method&lt;/a&gt;. You are not charged while the free
trial is active.&lt;/p&gt;

&lt;h3 id=&quot;what-can-i-do-under-the-free-trial&quot;&gt;What can I do under the free trial?&lt;/h3&gt;

&lt;p&gt;You can have a &lt;strong&gt;maximum of 1 application&lt;/strong&gt; using a &lt;strong&gt;maximum of 5 containers&lt;/strong&gt;
(S or M size).&lt;/p&gt;

&lt;p&gt;Review apps are considered as applications, so you can’t create one while in
free trial.&lt;/p&gt;

&lt;p&gt;Your test application can also use managed databases during the free trial.
For each of the eligible database engines listed below, you can provision &lt;strong&gt;1 database instance on its smallest plan&lt;/strong&gt;:&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;&lt;a href=&quot;/databases/postgresql/about/overview&quot;&gt;Scalingo for PostgreSQL®&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;/databases/mysql/about/overview&quot;&gt;Scalingo for MySQL®&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;/databases/redis/start&quot;&gt;Scalingo for Caching (Redis®)&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;You would like to test another engine or another plan? Contact us on the chat.&lt;/p&gt;

&lt;h3 id=&quot;how-to-leave-the-free-trial-early&quot;&gt;How to leave the free trial early?&lt;/h3&gt;

&lt;p&gt;You may want to leave the free trial period earlier to start using the platform to
its full potential. To do so, open the
&lt;a href=&quot;https://dashboard.scalingo.com/billing&quot;&gt;web dashboard&lt;/a&gt; and click the
&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;Stop free trial&lt;/code&gt; button. Your billing starts and the free trial limits are
removed.&lt;/p&gt;

&lt;h3 id=&quot;what-happens-at-the-end-of-the-free-trial&quot;&gt;What happens at the end of the free trial?&lt;/h3&gt;

&lt;p&gt;3 days and 1 day before the end of the free trial, you will receive an email
to notify you of the remaining days under the free trial.&lt;/p&gt;

&lt;p&gt;At the end of the free trial, the resources you created keep running and your
billing starts automatically with the payment method configured on your account.&lt;/p&gt;

&lt;aside class=&quot;warning&quot;&gt;

  &lt;p&gt;If you don’t want to be charged after the free trial, you must delete your
applications, databases, and add-ons before the trial ends. Scalingo does not
automatically remove these resources at the end of the free trial.&lt;/p&gt;

&lt;/aside&gt;

</description>
        <pubDate>Thu, 01 Oct 2026 00:00:00 +0000</pubDate>
        <link>
          
          https://doc.scalingo.com/platform/getting-started/free-trial
          
        </link>
        <guid isPermaLink="true">
          
          https://doc.scalingo.com/platform/getting-started/free-trial
          
        </guid>
        
        <category>billing</category>
        
        <category>free</category>
        
        <category>trial</category>
        
        
        <category>platform</category>
        
        <category>getting-started</category>
        
      </item>
    
  </channel>
</rss>
