Merge pull request #4368 from Dokploy/fix/replace-traefik-me-with-sslip-io

fix: replace traefik.me with sslip.io for auto-generated domains
This commit is contained in:
Mauricio Siu
2026-05-08 19:05:33 -06:00
committed by GitHub
9 changed files with 23 additions and 23 deletions

View File

@@ -168,7 +168,7 @@ export const createColumns = ({
{domain.certificateType} {domain.certificateType}
</Badge> </Badge>
)} )}
{!domain.host.includes("traefik.me") && ( {!domain.host.includes("sslip.io") && (
<TooltipProvider> <TooltipProvider>
<Tooltip> <Tooltip>
<TooltipTrigger asChild> <TooltipTrigger asChild>
@@ -256,7 +256,7 @@ export const createColumns = ({
return ( return (
<div className="flex items-center gap-2"> <div className="flex items-center gap-2">
{!domain.host.includes("traefik.me") && ( {!domain.host.includes("sslip.io") && (
<DnsHelperModal <DnsHelperModal
domain={{ domain={{
host: domain.host, host: domain.host,

View File

@@ -225,7 +225,7 @@ export const AddDomain = ({ id, type, domainId = "", children }: Props) => {
const https = form.watch("https"); const https = form.watch("https");
const domainType = form.watch("domainType"); const domainType = form.watch("domainType");
const host = form.watch("host"); const host = form.watch("host");
const isTraefikMeDomain = host?.includes("traefik.me") || false; const isTraefikMeDomain = host?.includes("sslip.io") || false;
useEffect(() => { useEffect(() => {
if (data) { if (data) {
@@ -513,7 +513,7 @@ export const AddDomain = ({ id, type, domainId = "", children }: Props) => {
render={({ field }) => ( render={({ field }) => (
<FormItem> <FormItem>
{!canGenerateTraefikMeDomains && {!canGenerateTraefikMeDomains &&
field.value.includes("traefik.me") && ( field.value.includes("sslip.io") && (
<AlertBlock type="warning"> <AlertBlock type="warning">
You need to set an IP address in your{" "} You need to set an IP address in your{" "}
<Link <Link
@@ -524,12 +524,12 @@ export const AddDomain = ({ id, type, domainId = "", children }: Props) => {
? "Remote Servers -> Server -> Edit Server -> Update IP Address" ? "Remote Servers -> Server -> Edit Server -> Update IP Address"
: "Web Server -> Server -> Update Server IP"} : "Web Server -> Server -> Update Server IP"}
</Link>{" "} </Link>{" "}
to make your traefik.me domain work. to make your sslip.io domain work.
</AlertBlock> </AlertBlock>
)} )}
{isTraefikMeDomain && ( {isTraefikMeDomain && (
<AlertBlock type="info"> <AlertBlock type="info">
<strong>Note:</strong> traefik.me is a public HTTP <strong>Note:</strong> sslip.io is a public HTTP
service and does not support SSL/HTTPS. HTTPS and service and does not support SSL/HTTPS. HTTPS and
certificate options will not have any effect. certificate options will not have any effect.
</AlertBlock> </AlertBlock>
@@ -567,7 +567,7 @@ export const AddDomain = ({ id, type, domainId = "", children }: Props) => {
sideOffset={5} sideOffset={5}
className="max-w-[10rem]" className="max-w-[10rem]"
> >
<p>Generate traefik.me domain</p> <p>Generate sslip.io domain</p>
</TooltipContent> </TooltipContent>
</Tooltip> </Tooltip>
</TooltipProvider> </TooltipProvider>

View File

@@ -425,7 +425,7 @@ export const ShowDomains = ({ id, type }: Props) => {
</Badge> </Badge>
)} )}
<div className="flex gap-2 flex-wrap"> <div className="flex gap-2 flex-wrap">
{!item.host.includes("traefik.me") && ( {!item.host.includes("sslip.io") && (
<DnsHelperModal <DnsHelperModal
domain={{ domain={{
host: item.host, host: item.host,

View File

@@ -87,7 +87,7 @@ export const AddPreviewDomain = ({
}); });
const host = form.watch("host"); const host = form.watch("host");
const isTraefikMeDomain = host?.includes("traefik.me") || false; const isTraefikMeDomain = host?.includes("sslip.io") || false;
useEffect(() => { useEffect(() => {
if (data) { if (data) {
@@ -162,7 +162,7 @@ export const AddPreviewDomain = ({
<FormItem> <FormItem>
{isTraefikMeDomain && ( {isTraefikMeDomain && (
<AlertBlock type="info"> <AlertBlock type="info">
<strong>Note:</strong> traefik.me is a public HTTP <strong>Note:</strong> sslip.io is a public HTTP
service and does not support SSL/HTTPS. HTTPS and service and does not support SSL/HTTPS. HTTPS and
certificate options will not have any effect. certificate options will not have any effect.
</AlertBlock> </AlertBlock>
@@ -202,7 +202,7 @@ export const AddPreviewDomain = ({
sideOffset={5} sideOffset={5}
className="max-w-[10rem]" className="max-w-[10rem]"
> >
<p>Generate traefik.me domain</p> <p>Generate sslip.io domain</p>
</TooltipContent> </TooltipContent>
</Tooltip> </Tooltip>
</TooltipProvider> </TooltipProvider>

View File

@@ -88,7 +88,7 @@ export const ShowPreviewSettings = ({ applicationId }: Props) => {
const form = useForm<Schema>({ const form = useForm<Schema>({
defaultValues: { defaultValues: {
env: "", env: "",
wildcardDomain: "*.traefik.me", wildcardDomain: "*.sslip.io",
port: 3000, port: 3000,
previewLimit: 3, previewLimit: 3,
previewLabels: [], previewLabels: [],
@@ -102,7 +102,7 @@ export const ShowPreviewSettings = ({ applicationId }: Props) => {
const previewHttps = form.watch("previewHttps"); const previewHttps = form.watch("previewHttps");
const wildcardDomain = form.watch("wildcardDomain"); const wildcardDomain = form.watch("wildcardDomain");
const isTraefikMeDomain = wildcardDomain?.includes("traefik.me") || false; const isTraefikMeDomain = wildcardDomain?.includes("sslip.io") || false;
useEffect(() => { useEffect(() => {
setIsEnabled(data?.isPreviewDeploymentsActive || false); setIsEnabled(data?.isPreviewDeploymentsActive || false);
@@ -114,7 +114,7 @@ export const ShowPreviewSettings = ({ applicationId }: Props) => {
env: data.previewEnv || "", env: data.previewEnv || "",
buildArgs: data.previewBuildArgs || "", buildArgs: data.previewBuildArgs || "",
buildSecrets: data.previewBuildSecrets || "", buildSecrets: data.previewBuildSecrets || "",
wildcardDomain: data.previewWildcard || "*.traefik.me", wildcardDomain: data.previewWildcard || "*.sslip.io",
port: data.previewPort || 3000, port: data.previewPort || 3000,
previewLabels: data.previewLabels || [], previewLabels: data.previewLabels || [],
previewLimit: data.previewLimit || 3, previewLimit: data.previewLimit || 3,
@@ -173,7 +173,7 @@ export const ShowPreviewSettings = ({ applicationId }: Props) => {
<div className="grid gap-4"> <div className="grid gap-4">
{isTraefikMeDomain && ( {isTraefikMeDomain && (
<AlertBlock type="info"> <AlertBlock type="info">
<strong>Note:</strong> traefik.me is a public HTTP service and <strong>Note:</strong> sslip.io is a public HTTP service and
does not support SSL/HTTPS. HTTPS and certificate options will does not support SSL/HTTPS. HTTPS and certificate options will
not have any effect. not have any effect.
</AlertBlock> </AlertBlock>
@@ -192,7 +192,7 @@ export const ShowPreviewSettings = ({ applicationId }: Props) => {
<FormItem> <FormItem>
<FormLabel>Wildcard Domain</FormLabel> <FormLabel>Wildcard Domain</FormLabel>
<FormControl> <FormControl>
<Input placeholder="*.traefik.me" {...field} /> <Input placeholder="*.sslip.io" {...field} />
</FormControl> </FormControl>
<FormMessage /> <FormMessage />
</FormItem> </FormItem>

View File

@@ -29,7 +29,7 @@ export const generateRandomDomain = ({
const hash = randomBytes(3).toString("hex"); const hash = randomBytes(3).toString("hex");
const slugIp = serverIp.replaceAll(".", "-"); const slugIp = serverIp.replaceAll(".", "-");
return `${projectName}-${hash}${slugIp === "" ? "" : `-${slugIp}`}.traefik.me`; return `${projectName}-${hash}${slugIp === "" ? "" : `-${slugIp}`}.sslip.io`;
}; };
export const generateHash = (projectName: string, quantity = 3): string => { export const generateHash = (projectName: string, quantity = 3): string => {

View File

@@ -229,7 +229,7 @@ export const suggestVariants = async ({
Domain Rules - For each service that needs to be exposed to the internet: Domain Rules - For each service that needs to be exposed to the internet:
1. Define a domain with: 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 - port: the internal port the service runs on
- serviceName: the name of the service in the docker-compose - serviceName: the name of the service in the docker-compose
2. Make sure the service is properly configured to work with the specified port 2. Make sure the service is properly configured to work with the specified port

View File

@@ -136,7 +136,7 @@ export const createPreviewDeployment = async (
where: eq(organization.id, application.environment.project.organizationId), where: eq(organization.id, application.environment.project.organizationId),
}); });
const generateDomain = await generateWildcardDomain( const generateDomain = await generateWildcardDomain(
application.previewWildcard || "*.traefik.me", application.previewWildcard || "*.sslip.io",
appName, appName,
application.server?.ipAddress || "", application.server?.ipAddress || "",
org?.ownerId || "", org?.ownerId || "",
@@ -238,7 +238,7 @@ const generateWildcardDomain = async (
throw new Error('The base domain must start with "*."'); throw new Error('The base domain must start with "*."');
} }
const hash = `${appName}`; const hash = `${appName}`;
if (baseDomain.includes("traefik.me")) { if (baseDomain.includes("sslip.io")) {
let ip = ""; let ip = "";
if (process.env.NODE_ENV === "development") { if (process.env.NODE_ENV === "development") {

View File

@@ -38,15 +38,15 @@ export const generateRandomDomain = ({
const slugIp = serverIp.replaceAll(".", "-").replaceAll(":", "-"); const slugIp = serverIp.replaceAll(".", "-").replaceAll(":", "-");
// Domain labels have a max length of 63 characters // Domain labels have a max length of 63 characters
// Reserve space for: hash (6) + separators (1-2) + ip section + dot + traefik.me (10) // Reserve space for: hash (6) + separators (1-2) + ip section + dot + sslip.io (8)
// Approx: 6 + 2 + (variable ip length) + 11 = ~19-30 chars for other parts // Approx: 6 + 2 + (variable ip length) + 9 = ~19-30 chars for other parts
const maxProjectNameLength = 40; const maxProjectNameLength = 40;
const truncatedProjectName = const truncatedProjectName =
projectName.length > maxProjectNameLength projectName.length > maxProjectNameLength
? projectName.substring(0, maxProjectNameLength) ? projectName.substring(0, maxProjectNameLength)
: projectName; : projectName;
return `${truncatedProjectName}-${hash}${slugIp === "" ? "" : `-${slugIp}`}.traefik.me`; return `${truncatedProjectName}-${hash}${slugIp === "" ? "" : `-${slugIp}`}.sslip.io`;
}; };
export const generateHash = (length = 8): string => { export const generateHash = (length = 8): string => {