commit 8dbf28c693da3bdbf4aff7f80325bbe9d579f944 Author: Mauricio Siu <47042324+Siumauricio@users.noreply.github.com> Date: Mon Apr 29 23:13:00 2024 -0600 Nuevo inicio del repositorio diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..0b13095 --- /dev/null +++ b/.gitignore @@ -0,0 +1,37 @@ +# See https://help.github.com/articles/ignoring-files/ for more about ignoring files. + +.idea + +# dependencies +/node_modules +/.pnp +.pnp.js + +# testing +/coverage + +# next.js +/.next/ +/out/ + +# production +/build + +# misc +.DS_Store +*.pem + +# debug +npm-debug.log* +yarn-debug.log* +yarn-error.log* + +# local env files +.env*.local + +# vercel +.vercel + +# typescript +*.tsbuildinfo +next-env.d.ts diff --git a/README.md b/README.md new file mode 100644 index 0000000..ddcd17e --- /dev/null +++ b/README.md @@ -0,0 +1,2 @@ +# Dokploy Website + diff --git a/app/icon.svg b/app/icon.svg new file mode 100644 index 0000000..3a8930d --- /dev/null +++ b/app/icon.svg @@ -0,0 +1,5 @@ + + + + + diff --git a/app/layout.tsx b/app/layout.tsx new file mode 100644 index 0000000..25e77b8 --- /dev/null +++ b/app/layout.tsx @@ -0,0 +1,98 @@ +import { Inter, Lexend } from "next/font/google"; +import clsx from "clsx"; +import "@/styles/tailwind.css"; +import type { Metadata } from "next"; +import GoogleAnalytics from "@/components/analitycs/google"; + +export const metadata: Metadata = { + title: { + default: "Dokploy - Effortless Deployment Solutions", + template: "%s | Simplify Your DevOps", + }, + alternates: { + canonical: "https://dokploy.com", + languages: { + en: "https://dokploy.com", + }, + }, + description: + "Streamline your deployment process with Dokploy. Effortlessly manage applications and databases on any VPS using Docker and Traefik for improved performance and security.", + applicationName: "Dokploy", + keywords: [ + "Dokploy", + "Docker", + "Traefik", + "deployment", + "VPS", + "application management", + "database management", + "DevOps", + "cloud infrastructure", + "UI Self hosted", + ], + referrer: "origin", + robots: "index, follow", + openGraph: { + type: "website", + url: "https://dokploy.com", + title: "Dokploy - Effortless Deployment Solutions", + description: + "Simplify your DevOps with Dokploy. Deploy applications and manage databases efficiently on any VPS.", + siteName: "Dokploy", + images: [ + { + url: "http://dokploy.com/og.png", + }, + ], + }, + twitter: { + card: "summary_large_image", + site: "@Dokploy", + creator: "@Dokploy", + title: "Dokploy - Simplify Your DevOps", + description: + "Deploy applications and manage databases with ease using Dokploy. Learn how our platform can elevate your infrastructure management.", + images: "https://dokploy.com/og.png", + }, +}; + +const inter = Inter({ + subsets: ["latin"], + display: "swap", + variable: "--font-inter", +}); + +const lexend = Lexend({ + subsets: ["latin"], + display: "swap", + variable: "--font-lexend", +}); + +export default function RootLayout({ + children, +}: { + children: React.ReactNode; +}) { + return ( + + + {children} + + Dokploy - Open-source alternative to Heroku, Vercel, and Netlify. | Product Hunt + + + ); +} diff --git a/app/not-found.tsx b/app/not-found.tsx new file mode 100644 index 0000000..dd7a785 --- /dev/null +++ b/app/not-found.tsx @@ -0,0 +1,27 @@ +import Link from "next/link"; + +// import { Button } from "../components/Button"; +import { Logo } from "../components/shared/Logo"; +import { SlimLayout } from "../components/SlimLayout"; + +export default function NotFound() { + return ( + +
+ + + +
+

404

+

+ Page not found +

+

+ Sorry, we couldn’t find the page you’re looking for. +

+ {/* */} +
+ ); +} diff --git a/app/page.tsx b/app/page.tsx new file mode 100644 index 0000000..2847ee1 --- /dev/null +++ b/app/page.tsx @@ -0,0 +1,25 @@ +import { CallToAction } from "../components/CallToAction"; +import { Faqs } from "../components/Faqs"; +import { Footer } from "../components/Footer"; +import { Header } from "../components/Header"; +import { Hero } from "../components/Hero"; +import { PrimaryFeatures } from "../components/PrimaryFeatures"; +import { SecondaryFeatures } from "../components/SecondaryFeatures"; +import { Testimonials } from "../components/Testimonials"; + +export default function Home() { + return ( +
+
+
+ + + + + {/* */} + +
+
+
+ ); +} diff --git a/app/robots.ts b/app/robots.ts new file mode 100644 index 0000000..ebf4d79 --- /dev/null +++ b/app/robots.ts @@ -0,0 +1,11 @@ +import type { MetadataRoute } from "next"; + +export default function robots(): MetadataRoute.Robots { + return { + rules: { + userAgent: "*", + allow: "/", + }, + sitemap: "https://dokploy.com/sitemap.xml", + }; +} diff --git a/app/sitemap.ts b/app/sitemap.ts new file mode 100644 index 0000000..52a2ad7 --- /dev/null +++ b/app/sitemap.ts @@ -0,0 +1,12 @@ +import type { MetadataRoute } from "next"; + +export default function sitemap(): MetadataRoute.Sitemap { + return [ + { + url: "https://dokploy.com", + lastModified: new Date(), + changeFrequency: "yearly", + priority: 1, + }, + ]; +} diff --git a/biome.json b/biome.json new file mode 100644 index 0000000..1e98f43 --- /dev/null +++ b/biome.json @@ -0,0 +1,15 @@ +{ + "$schema": "https://biomejs.dev/schemas/1.7.0/schema.json", + "organizeImports": { + "enabled": true + }, + "linter": { + "enabled": true, + "rules": { + "recommended": true, + "a11y":{ + "noSvgWithoutTitle":"off" + } + } + } +} diff --git a/components.json b/components.json new file mode 100644 index 0000000..e56b199 --- /dev/null +++ b/components.json @@ -0,0 +1,17 @@ +{ + "$schema": "https://ui.shadcn.com/schema.json", + "style": "default", + "rsc": true, + "tsx": true, + "tailwind": { + "config": "tailwind.config.ts", + "css": "src/styles/tailwind.css", + "baseColor": "zinc", + "cssVariables": true, + "prefix": "" + }, + "aliases": { + "components": "@/components", + "utils": "@/lib/utils" + } +} \ No newline at end of file diff --git a/components/Button.tsx b/components/Button.tsx new file mode 100644 index 0000000..900a39c --- /dev/null +++ b/components/Button.tsx @@ -0,0 +1,59 @@ +import Link from "next/link"; +import clsx from "clsx"; +import { cn } from "@/lib/utils"; + +const baseStyles = { + solid: + "group inline-flex items-center justify-center rounded-full py-2 px-4 text-sm font-semibold focus:outline-none focus-visible:outline-2 focus-visible:outline-offset-2", + outline: + "group inline-flex ring-1 items-center justify-center rounded-full py-2 px-4 text-sm focus:outline-none", +}; + +const variantStyles = { + solid: { + slate: + "bg-slate-900 text-white hover:bg-slate-700 hover:text-slate-100 active:bg-slate-800 active:text-slate-300 focus-visible:outline-slate-900", + blue: "bg-blue-600 text-white hover:text-slate-100 hover:bg-blue-500 active:bg-blue-800 active:text-blue-100 focus-visible:outline-blue-600", + white: + "bg-white text-slate-900 hover:bg-blue-50 active:bg-blue-200 active:text-slate-600 focus-visible:outline-white", + }, + outline: { + slate: + "ring-slate-200 text-slate-700 hover:text-slate-900 hover:ring-slate-300 active:bg-slate-100 active:text-slate-600 focus-visible:outline-blue-600 focus-visible:ring-slate-300", + white: + "ring-slate-700 text-white hover:ring-slate-500 active:ring-slate-700 active:text-slate-400 focus-visible:outline-white", + }, +}; + +type VariantKey = keyof typeof variantStyles; +type ColorKey = + keyof (typeof variantStyles)[Variant]; + +type ButtonProps< + Variant extends VariantKey, + Color extends ColorKey, +> = { + variant?: Variant; + color?: Color; +} & ( + | Omit, "color"> + | (Omit, "color"> & { + href?: undefined; + }) +); + +export function Button< + Color extends ColorKey, + Variant extends VariantKey = "solid", +>({ variant, color, className, ...props }: ButtonProps) { + variant = variant ?? ("solid" as Variant); + color = color ?? ("slate" as Color); + + className = cn(baseStyles[variant], variantStyles[variant][color], className); + + return typeof props.href === "undefined" ? ( + + + + + ); +} diff --git a/components/Container.tsx b/components/Container.tsx new file mode 100644 index 0000000..85eaa00 --- /dev/null +++ b/components/Container.tsx @@ -0,0 +1,13 @@ +import clsx from "clsx"; + +export function Container({ + className, + ...props +}: React.ComponentPropsWithoutRef<"div">) { + return ( +
+ ); +} diff --git a/components/Faqs.tsx b/components/Faqs.tsx new file mode 100644 index 0000000..117b4d0 --- /dev/null +++ b/components/Faqs.tsx @@ -0,0 +1,101 @@ +import { Container } from "./Container"; + +const faqs = [ + [ + { + question: "What is dokploy?", + answer: + "Dokploy is a stable, easy-to-use deployment solution designed to simplify the application management process. Think of Dokploy as a free alternative self-hostable solution to platforms like Heroku, Vercel, and Netlify.", + }, + { + question: "Why Choose Dokploy?", + answer: "Simplicity, Flexibility, and Fast", + }, + { + question: "Is free?", + answer: + "Yes, dokploy is totally free. You can use it for personal projects, small teams, or even for large-scale applications.", + }, + { + question: "Is it open source?", + answer: "Yes, dokploy is open source and free to use.", + }, + ], + [ + { + question: "What type of applications can i deploy with dokploy?", + answer: + "Dokploy is a great choice for any type of application. You can deploy your code to dokploy and manage it from the dashboard. We support a wide range of languages and frameworks, so you can choose the one that best fits your needs.", + }, + { + question: "How do I request a feature or report a bug?", + answer: + "Currently we are working on fixing bug fixes, but we will be releasing new features soon. You can also request features or report bugs.", + }, + { + question: "Do you track the usage of Dokploy?", + answer: "No, we don't track any usage data.", + }, + ], + [ + { + question: + "Are there any user forums or communities where I can interact with other users?", + answer: + "Yes, we have active github discussions where you can share ideas, ask for help, and connect with other users.", + }, + { + question: "What types of applications can I deploy with Dokploy?", + answer: + "Dokploy supports a variety of applications, including those built with Docker, as well as applications from any Git repository, offering custom builds with Nixpacks, Dockerfiles, or Buildpacks like Heroku and Paketo.", + }, + { + question: "How does Dokploy handle database management?", + answer: + "Dokploy supports multiple database systems including Postgres, MySQL, MariaDB, MongoDB, and Redis, providing tools for easy deployment and management directly from the dashboard.", + }, + ], +]; + +export function Faqs() { + return ( +
+ +
+

+ Frequently asked questions +

+

+ If you can’t find what you’re looking for, email our support team + and if you’re lucky someone will get back to you. +

+
+
    + {faqs.map((column, columnIndex) => ( +
  • +
      + {column.map((faq, faqIndex) => ( +
    • +

      + {faq.question} +

      +

      + {faq.answer} +

      +
    • + ))} +
    +
  • + ))} +
+
+
+ ); +} diff --git a/components/Footer.tsx b/components/Footer.tsx new file mode 100644 index 0000000..91fc9db --- /dev/null +++ b/components/Footer.tsx @@ -0,0 +1,68 @@ +import Link from "next/link"; + +import { Container } from "./Container"; +import { Logo } from "./shared/Logo"; +import { NavLink } from "./NavLink"; + +export function Footer() { + return ( +
+ +
+
+ + + Dokploy + +
+ + +
+
+
+ + + + + + +
+

+ Copyright © {new Date().getFullYear()} Dokploy. All rights + reserved. +

+
+
+
+ ); +} diff --git a/components/Header.tsx b/components/Header.tsx new file mode 100644 index 0000000..7700d62 --- /dev/null +++ b/components/Header.tsx @@ -0,0 +1,178 @@ +"use client"; + +import { Fragment } from "react"; +import Link from "next/link"; +import { Popover, Transition } from "@headlessui/react"; +import { Container } from "./Container"; +import { Logo } from "./shared/Logo"; +import { NavLink } from "./NavLink"; +import { Button } from "./ui/button"; +import { cn } from "@/lib/utils"; +import { trackGAEvent } from "./analitycs"; + +function MobileNavLink({ + href, + children, + target, +}: { + href: string; + children: React.ReactNode; + target?: string; +}) { + return ( + { + trackGAEvent({ + action: "Nav Link Clicked", + category: "Navigation", + label: href, + }); + }} + as={Link} + href={href} + target={target} + className="block w-full p-2" + > + {children} + + ); +} + +function MobileNavIcon({ open }: { open: boolean }) { + return ( + + ); +} + +function MobileNavigation() { + return ( + + + {({ open }) => } + + + + + + + + Features + Testimonials + Faqs + + Docs + + + + + + ); +} + +export function Header() { + return ( +
+ + + +
+ ); +} diff --git a/components/Hero.tsx b/components/Hero.tsx new file mode 100644 index 0000000..c5bfebd --- /dev/null +++ b/components/Hero.tsx @@ -0,0 +1,196 @@ +"use client"; +import Link from "next/link"; +import { Container } from "./Container"; +import { Button, buttonVariants } from "./ui/button"; +import { Check, Copy, Github } from "lucide-react"; +import { useEffect, useState } from "react"; + +const ProductHunt = () => { + return ( + + + + + + + + + + ); +}; + +export function Hero() { + const [isCopied, setIsCopied] = useState(false); + + useEffect(() => { + const timer = setTimeout(() => { + setIsCopied(false); + }, 2000); + return () => clearTimeout(timer); + }, [isCopied]); + return ( + +
+ {/* + + + + + + + + + + + + + + */} + + + + + + + + + + + + + + + + +
+ +
+

+ Deploy{" "} + + + Anywhere + {" "} + with Total Freedom and Ease. +

+

+ Streamline your operations with our all-in-one platform—perfect for + managing projects, data, and system health with simplicity and + efficiency. +

+
+
+ + curl -sSL https://dokploy.com/install.sh | sh + + + {/* */} + +
+
+
+