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
@@ -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,
@@ -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>
@@ -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,
@@ -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>
@@ -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>
+1 -1
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 => {
+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: 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
@@ -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") {
+3 -3
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 => {