fix: replace traefik.me with sslip.io for auto-generated domains

Fixes #4365 — traefik.me had availability issues. sslip.io uses the same
IP-in-subdomain format, supports both IPv4 and IPv6, and is more reliable.
This commit is contained in:
Mauricio Siu
2026-05-08 19:04:24 -06:00
parent d5d8914bf6
commit f5ddc36f24
9 changed files with 23 additions and 23 deletions
+1 -1
View File
@@ -229,7 +229,7 @@ export const suggestVariants = async ({
Domain Rules - For each service that needs to be exposed to the internet:
1. Define a domain with:
- host: {service-name}-{random-3-chars-hex}-${ip ? ip.replaceAll(".", "-") : ""}.traefik.me
- host: {service-name}-{random-3-chars-hex}-${ip ? ip.replaceAll(".", "-") : ""}.sslip.io
- port: the internal port the service runs on
- serviceName: the name of the service in the docker-compose
2. Make sure the service is properly configured to work with the specified port
@@ -136,7 +136,7 @@ export const createPreviewDeployment = async (
where: eq(organization.id, application.environment.project.organizationId),
});
const generateDomain = await generateWildcardDomain(
application.previewWildcard || "*.traefik.me",
application.previewWildcard || "*.sslip.io",
appName,
application.server?.ipAddress || "",
org?.ownerId || "",
@@ -238,7 +238,7 @@ const generateWildcardDomain = async (
throw new Error('The base domain must start with "*."');
}
const hash = `${appName}`;
if (baseDomain.includes("traefik.me")) {
if (baseDomain.includes("sslip.io")) {
let ip = "";
if (process.env.NODE_ENV === "development") {
+3 -3
View File
@@ -38,15 +38,15 @@ export const generateRandomDomain = ({
const slugIp = serverIp.replaceAll(".", "-").replaceAll(":", "-");
// Domain labels have a max length of 63 characters
// Reserve space for: hash (6) + separators (1-2) + ip section + dot + traefik.me (10)
// Approx: 6 + 2 + (variable ip length) + 11 = ~19-30 chars for other parts
// Reserve space for: hash (6) + separators (1-2) + ip section + dot + sslip.io (8)
// Approx: 6 + 2 + (variable ip length) + 9 = ~19-30 chars for other parts
const maxProjectNameLength = 40;
const truncatedProjectName =
projectName.length > maxProjectNameLength
? projectName.substring(0, maxProjectNameLength)
: projectName;
return `${truncatedProjectName}-${hash}${slugIp === "" ? "" : `-${slugIp}`}.traefik.me`;
return `${truncatedProjectName}-${hash}${slugIp === "" ? "" : `-${slugIp}`}.sslip.io`;
};
export const generateHash = (length = 8): string => {