fix: correct spelling of Tailscale in feature comparisons

- Updated instances of "TailScale" to "Tailscale" across multiple comparison pages for consistency and accuracy.
- Added a new feature regarding team access and role-based permissions in the Dokploy vs. Dokku comparison page, enhancing the documentation for user management capabilities.
This commit is contained in:
Mauricio Siu
2026-03-25 00:16:19 -06:00
parent 13d1b6a911
commit 505d662eb2
5 changed files with 61 additions and 23 deletions

View File

@@ -28,7 +28,7 @@ const featureComparisonRows: FeatureRow[] = [
// Setup & Installation
{ feature: "One-command installation", dokploy: true, caprover: true, section: "Setup & Installation" },
{ feature: "Installation feedback and progress logs", dokploy: true, caprover: false },
{ feature: "Works with firewall and TailScale out of the box", dokploy: true, caprover: false },
{ feature: "Works with firewall and Tailscale out of the box", dokploy: true, caprover: false },
{ feature: "Lightweight CPU usage while idle", dokploy: true, caprover: false },
{ feature: "Built with Next.js / TypeScript", dokploy: true, caprover: false },
// Deployment

View File

@@ -18,7 +18,7 @@ export const metadata: Metadata = {
const featureComparisonRows = [
{ feature: "One-command installation", dokploy: true, coolify: true },
{ feature: "Installation feedback and progress logs", dokploy: true, coolify: true },
{ feature: "Works with firewall and TailScale out of the box", dokploy: true, coolify: false },
{ feature: "Works with firewall and Tailscale out of the box", dokploy: true, coolify: false },
{ feature: "Lightweight CPU usage while idle", dokploy: true, coolify: false },
{ feature: "Low memory usage", dokploy: true, coolify: true },
{ feature: "Teams and organizations support", dokploy: true, coolify: true },
@@ -46,7 +46,7 @@ const whyChooseItems = [
icon: Zap,
title: "Benefit from a fast, reliable setup",
description:
"Use a single command to deploy with Dokploy, which works seamlessly across firewalls, TailScale, and secure environments. Launch applications faster with Dokploy's optimized build system.",
"Use a single command to deploy with Dokploy, which works seamlessly across firewalls, Tailscale, and secure environments. Launch applications faster with Dokploy's optimized build system.",
},
{
icon: Cpu,

View File

@@ -3,14 +3,14 @@ import { CallToAction } from "@/components/CallToAction";
import { Testimonials } from "@/components/Testimonials";
import { ComparisonStats } from "@/components/comparison-stats";
import AnimatedGridPattern from "@/components/ui/animated-grid-pattern";
import { Check, X, Zap, Globe, Bell, Users } from "lucide-react";
import { Check, X, Zap, Globe, Bell, Users, Shield } from "lucide-react";
import Image from "next/image";
import Link from "next/link";
import type { Metadata } from "next";
import { Button } from "@/components/ui/button";
export const metadata: Metadata = {
title: "Dokploy vs. Dokku Comparison | Dokploy",
title: "Dokploy vs. Dokku Comparison | Dokploy | Dokploy",
description:
"Dokploy vs. Dokku: Compare self-hosted PaaS platforms. See how Dokploy's UI-first approach stacks up against Dokku's CLI-based workflow for deployments.",
};
@@ -28,7 +28,7 @@ const featureComparisonRows: FeatureRow[] = [
// Setup & Installation
{ feature: "One-command installation", dokploy: true, dokku: true, section: "Setup & Installation" },
{ feature: "Web-based UI dashboard", dokploy: true, dokku: false },
{ feature: "Works with firewall and TailScale out of the box", dokploy: true, dokku: false },
{ feature: "Works with firewall and Tailscale out of the box", dokploy: true, dokku: false },
{ feature: "Lightweight CPU usage while idle", dokploy: true, dokku: true },
// Deployment
{ feature: "Deploy from GitHub, GitLab, Bitbucket", dokploy: true, dokku: "limited", section: "Deployment" },
@@ -101,6 +101,16 @@ const whyChooseItems = [
alt: "Dokploy deploy settings with provider and domain configuration",
},
},
{
icon: Shield,
title: "Give teams more control over access",
description:
"Dokploy gives teams built-in role-based access and project organization in the UI, so you can manage services, databases, and infrastructure as you grow across multiple servers—with the right level of oversight for developers seeking control without handing out broad server access. Dokku user access starts at the SSH key level. More granular control for users with specific needs depends on extra plugins or tooling.",
image: {
src: "/images/dokploy-projects-dashboard.png",
alt: "Dokploy team access and role-based permissions dashboard",
},
},
];
const integrationRows = [
@@ -168,10 +178,23 @@ export default function DokployVsDokkuPage() {
For experienced developers who prefer a CLI-driven,
Heroku-like PaaS that's minimal and scriptable, with a
plugin ecosystem for extending functionality—choose Dokku.
Trade-offs include fewer enterprise features and
integrations.
</p>
</div>
</div>
<div className="mt-16">
<h2 className="text-xl font-semibold text-white sm:text-2xl">
A Dokploy vs. Dokku comparison for growing teams
</h2>
<p className="mt-4 text-muted-foreground">
Choose Dokploy if you want complete control over your
infrastructure with a simpler way to manage apps, databases,
and multiple servers.
</p>
</div>
<Button className="mt-10 rounded-full" asChild>
<Link
href="https://app.dokploy.com/register"
@@ -337,8 +360,9 @@ export default function DokployVsDokkuPage() {
<p className="mt-6 text-lg text-muted-foreground">
Whether you've outgrown Dokku's CLI-only workflow or you're
choosing your first self-hosted PaaS, Dokploy gives you the visual
interface, team features, and built-in tooling that Dokku relies on
plugins and shell scripts forall in one cohesive platform.
interface, team features, Docker Compose support, and built-in
tooling that Dokku relies on plugins and shell scripts forall in
one cohesive platform.
</p>
</div>
</Container>

View File

@@ -28,7 +28,7 @@ const featureComparisonRows: FeatureRow[] = [
// Setup & Installation
{ feature: "One-command installation", dokploy: true, portainer: true, section: "Setup & Installation" },
{ feature: "Installation feedback and progress logs", dokploy: true, portainer: false },
{ feature: "Works with firewall and TailScale out of the box", dokploy: true, portainer: false },
{ feature: "Works with firewall and Tailscale out of the box", dokploy: true, portainer: false },
{ feature: "Lightweight CPU usage while idle", dokploy: true, portainer: true },
// Deployment
{ feature: "Deploy web apps from git repos (GitHub, GitLab, Bitbucket)", dokploy: true, portainer: "limited", section: "Deployment" },

View File

@@ -14,24 +14,38 @@ const statsValues = {
export function ComparisonStats() {
const [githubStars, setGithubStars] = useState(statsValues.githubStars);
const [dockerDownloads, setDockerDownloads] = useState(
statsValues.dockerDownloads,
);
const [contributors, setContributors] = useState(
statsValues.contributors,
);
useEffect(() => {
const fetchGitHubStars = async () => {
try {
const response = await fetch(
"/api/github-stars?owner=dokploy&repo=dokploy",
);
const fetchStats = async () => {
const [starsRes, dockerRes, contribRes] = await Promise.allSettled([
fetch("/api/github-stars?owner=dokploy&repo=dokploy"),
fetch("/api/docker-stats"),
fetch("/api/github-contributors"),
]);
if (response.ok) {
const data = await response.json();
setGithubStars(data.stargazers_count);
}
} catch (error) {
console.error("Error fetching GitHub stars:", error);
if (starsRes.status === "fulfilled" && starsRes.value.ok) {
const data = await starsRes.value.json();
setGithubStars(data.stargazers_count);
}
if (dockerRes.status === "fulfilled" && dockerRes.value.ok) {
const data = await dockerRes.value.json();
setDockerDownloads(data.pull_count);
}
if (contribRes.status === "fulfilled" && contribRes.value.ok) {
const data = await contribRes.value.json();
setContributors(data.contributors_count);
}
};
fetchGitHubStars();
fetchStats();
}, []);
return (
@@ -66,7 +80,7 @@ export function ComparisonStats() {
DockerHub Downloads
</p>
<p className="relative z-20 mt-2 text-3xl font-bold">
<NumberTicker value={statsValues.dockerDownloads} />+
<NumberTicker value={dockerDownloads} />+
</p>
<p className="relative z-20 mt-2 text-sm text-muted-foreground">
Go-to solution for deployments
@@ -78,7 +92,7 @@ export function ComparisonStats() {
Community Contributors
</p>
<p className="relative z-20 mt-2 text-3xl font-bold">
<NumberTicker value={statsValues.contributors} />+
<NumberTicker value={contributors} />+
</p>
<p className="relative z-20 mt-2 text-sm text-muted-foreground">
Thriving open source community