Files
ubicloud/views/postgres/connection.erb
Burak Yucesoy 8dfb9e58ad Don't show connection information until the PG is running
When we give this information too early, before the DNS records are created,
users might attempt to connect to it, which would cause their OS to cache the
negative DNS response, and they would not be able to connect to the PG until
the DNS cache is cleared. In some cases, the negative response can be cached
outside of the OS (e.g. external recursive DNS servers), which would make the
situation even worse as it wouldn't be possible to flush the cache and the only
way to resolve the issue would be to wait for the cache to expire.
2025-07-04 14:59:44 +03:00

62 lines
2.7 KiB
Plaintext

<%
hostname = @pg.hostname
password = URI.encode_uri_component(@pg.superuser_password)
connection_infos = {
"url-5432" => "postgresql://postgres:#{password}@#{hostname}:5432/postgres",
"url-6432" => "postgresql://postgres:#{password}@#{hostname}:6432/postgres",
"psql-5432" => "psql postgresql://postgres:#{password}@#{hostname}:5432/postgres",
"psql-6432" => "psql postgresql://postgres:#{password}@#{hostname}:6432/postgres",
"env-5432" => "PGHOST=#{hostname}\nPGPORT=5432\nPGUSER=postgres\nPGPASSWORD=#{password}\nPGDATABASE=postgres",
"env-6432" => "PGHOST=#{hostname}\nPGPORT=6432\nPGUSER=postgres\nPGPASSWORD=#{password}\nPGDATABASE=postgres",
"yaml-5432" => "host: #{hostname}\nport: 5432\nuser: postgres\npassword: #{password}\ndatabase: postgres",
"yaml-6432" => "host: #{hostname}\nport: 6432\nuser: postgres\npassword: #{password}\ndatabase: postgres",
"jdbc-5432" => "jdbc:postgresql://#{hostname}:5432/postgres?user=postgres&password=#{password}&ssl=true",
"jdbc-6432" => "jdbc:postgresql://#{hostname}:6432/postgres?user=postgres&password=#{password}&ssl=true"
}
%>
<div class="p-6">
<% if @pg.display_state != "creating" %>
<div class="flex items-center gap-6 connection-info-format-selector">
<div class="flex items-center gap-2">
Format:
<div>
<%== part(
"components/form/select",
options: connection_infos.keys.map { it.split("-").first }.uniq.map { [it, it] },
attributes: {
"data-hostname" => @pg.hostname,
"data-username" => "postgres",
"data-password" => @pg.superuser_password,
"data-database" => "postgres"
},
) %>
</div>
</div>
<div><%== part("components/form/checkbox", options: [["1", "Use pgBouncer?", "", {}]]) %></div>
</div>
<%
connection_infos.each_with_index do |(key, value), index|
hidden_class = index == 0 ? "" : "hidden"
%>
<div class="bg-gray-200 rounded-md p-6 mt-5 connection-info-box connection-info-box-<%= key %> <%= hidden_class %>">
<%== part("components/copyable_content", content: value, revealable: true, classes: "!flex justify-between") %>
</div>
<% end %>
<div class="mt-5 flex items-center gap-2">
CA Certificates: <%== part("components/download_button", link: "#{@project_data[:path]}#{@pg.path}/ca-certificates")%>
</div>
<% else %>
<div class="flex flex-col items-center justify-center h-full">
<h2 class="text-2xl font-semibold text-gray-900">No connection information available</h2>
<p class="text-gray-500 mt-2">Connection information will be available once the database is running.</p>
</div>
<% end %>
</div>