├── .bolt └── config.json ├── src ├── vite-env.d.ts ├── main.ts ├── assets │ └── vue.svg ├── components │ ├── HelloWorld.vue │ ├── PresetSelect.vue │ ├── PresetModal.vue │ ├── ImportModal.vue │ ├── CaddyConfig.vue │ └── HostForm.vue ├── style.css ├── types │ └── caddy.ts ├── App.vue └── presets.ts ├── tsconfig.node.tsbuildinfo ├── postcss.config.js ├── tsconfig.json ├── vite.config.ts ├── docker-compose.yml ├── Dockerfile ├── tsconfig.app.tsbuildinfo ├── .gitignore ├── index.html ├── public ├── favicon.svg └── vite.svg ├── tsconfig.node.json ├── nginx.conf ├── tsconfig.app.json ├── package.json ├── .github └── workflows │ └── docker-publish.yml ├── tailwind.config.js └── README.md /.bolt/config.json: -------------------------------------------------------------------------------- 1 | { 2 | "template": "vite-vue-ts" 3 | } 4 | -------------------------------------------------------------------------------- /src/vite-env.d.ts: -------------------------------------------------------------------------------- 1 | /// 2 | -------------------------------------------------------------------------------- /tsconfig.node.tsbuildinfo: -------------------------------------------------------------------------------- 1 | {"root":["./vite.config.ts"],"version":"5.7.2"} -------------------------------------------------------------------------------- /postcss.config.js: -------------------------------------------------------------------------------- 1 | export default { 2 | plugins: { 3 | tailwindcss: {}, 4 | autoprefixer: {}, 5 | }, 6 | } -------------------------------------------------------------------------------- /src/main.ts: -------------------------------------------------------------------------------- 1 | import { createApp } from 'vue' 2 | import './style.css' 3 | import App from './App.vue' 4 | 5 | createApp(App).mount('#app') 6 | -------------------------------------------------------------------------------- /tsconfig.json: -------------------------------------------------------------------------------- 1 | { 2 | "files": [], 3 | "references": [ 4 | { "path": "./tsconfig.app.json" }, 5 | { "path": "./tsconfig.node.json" } 6 | ] 7 | } 8 | -------------------------------------------------------------------------------- /vite.config.ts: -------------------------------------------------------------------------------- 1 | import { defineConfig } from 'vite' 2 | import vue from '@vitejs/plugin-vue' 3 | 4 | // https://vitejs.dev/config/ 5 | export default defineConfig({ 6 | plugins: [vue()], 7 | }) 8 | -------------------------------------------------------------------------------- /docker-compose.yml: -------------------------------------------------------------------------------- 1 | version: '3.8' 2 | 3 | services: 4 | app: 5 | image: wardy784/caddygen:latest 6 | ports: 7 | - "8189:80" 8 | restart: unless-stopped 9 | container_name: caddygen -------------------------------------------------------------------------------- /Dockerfile: -------------------------------------------------------------------------------- 1 | FROM node:20-alpine as build 2 | 3 | WORKDIR /app 4 | COPY package*.json ./ 5 | RUN npm install 6 | COPY . . 7 | RUN npx vite build 8 | 9 | FROM nginx:alpine 10 | COPY --from=build /app/dist /usr/share/nginx/html 11 | COPY nginx.conf /etc/nginx/conf.d/default.conf 12 | EXPOSE 80 13 | CMD ["nginx", "-g", "daemon off;"] -------------------------------------------------------------------------------- /tsconfig.app.tsbuildinfo: -------------------------------------------------------------------------------- 1 | {"root":["./src/main.ts","./src/presets.ts","./src/vite-env.d.ts","./src/types/caddy.ts","./src/app.vue","./src/components/caddyconfig.vue","./src/components/helloworld.vue","./src/components/hostform.vue","./src/components/importmodal.vue","./src/components/presetmodal.vue","./src/components/presetselect.vue"],"errors":true,"version":"5.7.2"} -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | # Logs 2 | logs 3 | *.log 4 | npm-debug.log* 5 | yarn-debug.log* 6 | yarn-error.log* 7 | pnpm-debug.log* 8 | lerna-debug.log* 9 | 10 | node_modules 11 | dist 12 | dist-ssr 13 | *.local 14 | 15 | # Editor directories and files 16 | .vscode/* 17 | !.vscode/extensions.json 18 | .idea 19 | .DS_Store 20 | *.suo 21 | *.ntvs* 22 | *.njsproj 23 | *.sln 24 | *.sw? 25 | -------------------------------------------------------------------------------- /index.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | CaddyGen | Caddy Config Generator 8 | 9 | 10 |
11 | 12 | 13 | 14 | -------------------------------------------------------------------------------- /src/assets/vue.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /public/favicon.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | -------------------------------------------------------------------------------- /tsconfig.node.json: -------------------------------------------------------------------------------- 1 | { 2 | "compilerOptions": { 3 | "target": "ES2022", 4 | "lib": ["ES2023"], 5 | "module": "ESNext", 6 | "skipLibCheck": true, 7 | 8 | /* Bundler mode */ 9 | "moduleResolution": "bundler", 10 | "allowImportingTsExtensions": true, 11 | "isolatedModules": true, 12 | "moduleDetection": "force", 13 | "noEmit": true, 14 | 15 | /* Linting */ 16 | "strict": true, 17 | "noUnusedLocals": true, 18 | "noUnusedParameters": true, 19 | "noFallthroughCasesInSwitch": true 20 | }, 21 | "include": ["vite.config.ts"] 22 | } 23 | -------------------------------------------------------------------------------- /nginx.conf: -------------------------------------------------------------------------------- 1 | server { 2 | listen 80; 3 | server_name _; 4 | root /usr/share/nginx/html; 5 | index index.html; 6 | 7 | location / { 8 | try_files $uri $uri/ /index.html; 9 | } 10 | 11 | # Cache static assets 12 | location ~* \.(js|css|png|jpg|jpeg|gif|ico|svg)$ { 13 | expires 30d; 14 | add_header Cache-Control "public, no-transform"; 15 | } 16 | 17 | # Security headers 18 | add_header X-Frame-Options "SAMEORIGIN"; 19 | add_header X-XSS-Protection "1; mode=block"; 20 | add_header X-Content-Type-Options "nosniff"; 21 | } -------------------------------------------------------------------------------- /tsconfig.app.json: -------------------------------------------------------------------------------- 1 | { 2 | "compilerOptions": { 3 | "target": "ES2020", 4 | "useDefineForClassFields": true, 5 | "module": "ESNext", 6 | "lib": ["ES2020", "DOM", "DOM.Iterable"], 7 | "skipLibCheck": true, 8 | 9 | /* Bundler mode */ 10 | "moduleResolution": "bundler", 11 | "allowImportingTsExtensions": true, 12 | "isolatedModules": true, 13 | "moduleDetection": "force", 14 | "noEmit": true, 15 | "jsx": "preserve", 16 | 17 | /* Linting */ 18 | "strict": true, 19 | "noUnusedLocals": true, 20 | "noUnusedParameters": true, 21 | "noFallthroughCasesInSwitch": true 22 | }, 23 | "include": ["src/**/*.ts", "src/**/*.tsx", "src/**/*.vue"] 24 | } 25 | -------------------------------------------------------------------------------- /package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "vite-vue-typescript-starter", 3 | "private": true, 4 | "version": "0.0.0", 5 | "type": "module", 6 | "scripts": { 7 | "dev": "vite", 8 | "build": "vue-tsc -b && vite build", 9 | "preview": "vite preview" 10 | }, 11 | "dependencies": { 12 | "@radix-ui/colors": "^3.0.0", 13 | "class-variance-authority": "^0.7.0", 14 | "clsx": "^2.1.0", 15 | "lucide-vue-next": "^0.344.0", 16 | "prismjs": "^1.29.0", 17 | "tailwind-merge": "^2.2.1", 18 | "tailwindcss-animate": "^1.0.7", 19 | "uuid": "^11.0.5", 20 | "vue": "^3.4.38", 21 | "vue-select": "^4.0.0-beta.6" 22 | }, 23 | "devDependencies": { 24 | "@types/prismjs": "^1.26.3", 25 | "@types/vue-select": "^3.16.8", 26 | "@vitejs/plugin-vue": "^5.1.3", 27 | "autoprefixer": "^10.4.18", 28 | "postcss": "^8.4.35", 29 | "tailwindcss": "^3.4.1", 30 | "typescript": "^5.5.3", 31 | "vite": "^5.4.2", 32 | "vue-tsc": "^2.1.4" 33 | } 34 | } 35 | -------------------------------------------------------------------------------- /.github/workflows/docker-publish.yml: -------------------------------------------------------------------------------- 1 | name: Docker Build and Publish 2 | 3 | on: 4 | push: 5 | branches: 6 | - main 7 | 8 | jobs: 9 | build-and-push: 10 | runs-on: ubuntu-latest 11 | 12 | steps: 13 | # Checkout the repository 14 | - name: Checkout repository 15 | uses: actions/checkout@v3 16 | 17 | # Set up Docker Buildx 18 | - name: Set up Docker Buildx 19 | uses: docker/setup-buildx-action@v2 20 | 21 | # Log in to Docker Hub 22 | - name: Log in to Docker Hub 23 | uses: docker/login-action@v2 24 | with: 25 | username: ${{ secrets.DOCKER_USERNAME }} 26 | password: ${{ secrets.DOCKER_PASSWORD }} 27 | 28 | # Build and push the multi-platform image 29 | - name: Build and push multi-platform Docker image 30 | uses: docker/build-push-action@v4 31 | with: 32 | context: . 33 | push: true 34 | platforms: linux/amd64,linux/arm64 35 | tags: wardy784/caddygen:latest -------------------------------------------------------------------------------- /src/components/HelloWorld.vue: -------------------------------------------------------------------------------- 1 | 8 | 9 | 36 | 37 | 42 | -------------------------------------------------------------------------------- /public/vite.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /src/style.css: -------------------------------------------------------------------------------- 1 | @tailwind base; 2 | @tailwind components; 3 | @tailwind utilities; 4 | 5 | :root { 6 | --background: 224 71% 4%; 7 | --foreground: 213 31% 91%; 8 | --muted: 223 47% 11%; 9 | --muted-foreground: 215.4 16.3% 56.9%; 10 | --accent: 216 34% 17%; 11 | --accent-foreground: 210 40% 98%; 12 | --popover: 224 71% 4%; 13 | --popover-foreground: 215 20.2% 65.1%; 14 | --border: 216 34% 17%; 15 | --input: 216 34% 17%; 16 | --card: 224 71% 4%; 17 | --card-foreground: 213 31% 91%; 18 | --primary: 263 70% 50%; 19 | --primary-foreground: 210 40% 98%; 20 | --secondary: 215 25% 27%; 21 | --secondary-foreground: 210 40% 98%; 22 | --destructive: 0 62% 45%; 23 | --destructive-foreground: 210 40% 98%; 24 | --ring: 216 34% 17%; 25 | --radius: 0.5rem; 26 | } 27 | 28 | @layer base { 29 | * { 30 | @apply border-border; 31 | } 32 | body { 33 | @apply bg-background text-foreground; 34 | } 35 | } 36 | 37 | /* Custom scrollbar styles */ 38 | .scrollbar-thin { 39 | scrollbar-width: thin; 40 | scrollbar-color: hsl(var(--primary)/0.3) transparent; 41 | } 42 | 43 | .scrollbar-thin::-webkit-scrollbar { 44 | height: 6px; 45 | width: 6px; 46 | } 47 | 48 | .scrollbar-thin::-webkit-scrollbar-track { 49 | background: transparent; 50 | } 51 | 52 | .scrollbar-thin::-webkit-scrollbar-thumb { 53 | background-color: hsl(var(--primary)/0.3); 54 | border-radius: 3px; 55 | } 56 | 57 | .scrollbar-thin::-webkit-scrollbar-thumb:hover { 58 | background-color: hsl(var(--primary)/0.5); 59 | } 60 | -------------------------------------------------------------------------------- /src/types/caddy.ts: -------------------------------------------------------------------------------- 1 | export interface CaddyHost { 2 | id: string; 3 | domain: string; 4 | fileServer?: { 5 | root: string; 6 | browse: boolean; 7 | php: boolean; 8 | frankenphp: boolean; 9 | hide: string[]; 10 | }; 11 | presetName?: string; 12 | reverseProxy?: string; 13 | tls?: { 14 | email?: string; 15 | selfSigned?: boolean; 16 | certFile?: string; 17 | keyFile?: string; 18 | }; 19 | encode?: boolean; 20 | basicAuth?: { 21 | username: string; 22 | password: string; 23 | }[]; 24 | headers?: { 25 | name: string; 26 | value: string; 27 | }[]; 28 | cors?: { 29 | enabled: boolean; 30 | allowOrigins: string[]; 31 | allowMethods: string[]; 32 | allowHeaders: string[]; 33 | }; 34 | security?: { 35 | ipFilter: { 36 | enabled: boolean; 37 | allow: string[]; 38 | block: string[]; 39 | }; 40 | rateLimit: { 41 | enabled: boolean; 42 | requests: number; 43 | window: string; 44 | }; 45 | cspEnabled: boolean; 46 | csp: string; 47 | forwardAuth: { 48 | enabled: boolean; 49 | url: string; 50 | verifyHeader?: string; 51 | verifyValue?: string; 52 | }; 53 | }; 54 | performance?: { 55 | brotli: boolean; 56 | cacheControlEnabled: boolean; 57 | cacheControl: string; 58 | }; 59 | } 60 | 61 | export interface PresetConfig { 62 | name: string; 63 | port: number; 64 | description: string; 65 | category: 'Media & Streaming' | 'Downloaders & File Sharing' | 'Media Management & Automation' | 66 | 'Home Automation & IoT' | 'Development & Code Hosting' | 'Monitoring & Analytics' | 67 | 'Productivity & Collaboration' | 'Authentication & Identity' | 'Security & Networking' | 68 | 'Container & Server Management' | 'Password & Secrets Management' | 'Messaging & Communication'; 69 | webLink?: string; 70 | githubLink?: string; 71 | logo?: string; 72 | } 73 | -------------------------------------------------------------------------------- /src/components/PresetSelect.vue: -------------------------------------------------------------------------------- 1 | 39 | 40 | 67 | 68 | -------------------------------------------------------------------------------- /tailwind.config.js: -------------------------------------------------------------------------------- 1 | /** @type {import('tailwindcss').Config} */ 2 | module.exports = { 3 | darkMode: ["class"], 4 | content: [ 5 | './pages/**/*.{ts,tsx,vue}', 6 | './components/**/*.{ts,tsx,vue}', 7 | './app/**/*.{ts,tsx,vue}', 8 | './src/**/*.{ts,tsx,vue}', 9 | ], 10 | theme: { 11 | container: { 12 | center: true, 13 | padding: "2rem", 14 | screens: { 15 | "2xl": "1400px", 16 | }, 17 | }, 18 | extend: { 19 | colors: { 20 | border: "hsl(var(--border))", 21 | input: "hsl(var(--input))", 22 | ring: "hsl(var(--ring))", 23 | background: "hsl(var(--background))", 24 | foreground: "hsl(var(--foreground))", 25 | primary: { 26 | DEFAULT: "hsl(var(--primary))", 27 | foreground: "hsl(var(--primary-foreground))", 28 | }, 29 | secondary: { 30 | DEFAULT: "hsl(var(--secondary))", 31 | foreground: "hsl(var(--secondary-foreground))", 32 | }, 33 | destructive: { 34 | DEFAULT: "hsl(var(--destructive))", 35 | foreground: "hsl(var(--destructive-foreground))", 36 | }, 37 | muted: { 38 | DEFAULT: "hsl(var(--muted))", 39 | foreground: "hsl(var(--muted-foreground))", 40 | }, 41 | accent: { 42 | DEFAULT: "hsl(var(--accent))", 43 | foreground: "hsl(var(--accent-foreground))", 44 | }, 45 | popover: { 46 | DEFAULT: "hsl(var(--popover))", 47 | foreground: "hsl(var(--popover-foreground))", 48 | }, 49 | card: { 50 | DEFAULT: "hsl(var(--card))", 51 | foreground: "hsl(var(--card-foreground))", 52 | }, 53 | }, 54 | borderRadius: { 55 | lg: "var(--radius)", 56 | md: "calc(var(--radius) - 2px)", 57 | sm: "calc(var(--radius) - 4px)", 58 | }, 59 | keyframes: { 60 | "accordion-down": { 61 | from: { height: 0 }, 62 | to: { height: "var(--radix-accordion-content-height)" }, 63 | }, 64 | "accordion-up": { 65 | from: { height: "var(--radix-accordion-content-height)" }, 66 | to: { height: 0 }, 67 | }, 68 | }, 69 | animation: { 70 | "accordion-down": "accordion-down 0.2s ease-out", 71 | "accordion-up": "accordion-up 0.2s ease-out", 72 | }, 73 | }, 74 | }, 75 | plugins: [require("tailwindcss-animate")], 76 | } -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # **CaddyGen - Caddy Config Generator** 2 | 3 | CaddyGen is a user-friendly web interface for generating [Caddy server](https://caddyserver.com) configurations. Easily create and manage reverse proxy and file server configurations with support for SSL, compression, security headers, and more. 4 | 5 | ## **Features** 6 | 7 | - 🚀 **Visual configuration builder** for the Caddy server 8 | - 🔒 **SSL/TLS configuration** with Let's Encrypt support 9 | - 🔄 **Reverse proxy** and **file server** setup 10 | - 📦 Pre-configured **presets** for popular applications 11 | - 💾 **Local storage** for saving configurations 12 | - 📤 **Import/Export** for Caddyfiles 13 | - 🛡️ Advanced **security options** (CSP, rate limiting, IP filtering) 14 | - ⚡ **Performance optimizations** (compression, caching) 15 | - 🌐 **CORS configuration** 16 | - 📁 File server options (directory listing, PHP and FrankenPHP support) 17 | 18 | --- 19 | 20 | ## **Live Demo** 21 | 22 | Try CaddyGen now: [demo.caddygen.site](https://demo.caddygen.site) 23 | 24 | ### **How to Use** 25 | 1. Click the **"Add New Host"** button. 26 | 2. Configure your settings: 27 | - Choose between **reverse proxy** or **file server**. 28 | - Select from pre-configured **application presets**. 29 | - Configure SSL, compression, and security options. 30 | 3. View, copy, or download your generated **Caddyfile**. 31 | 32 | --- 33 | 34 | ## **Docker Deployment** 35 | 36 | Deploy CaddyGen using Docker with ease: 37 | 38 | ### **Run the Pre-Built Image** 39 | Pull the latest image from Docker Hub and run it: 40 | ```bash 41 | docker pull wardy784/caddygen:latest 42 | docker run -d --restart unless-stopped -p 8189:80 wardy784/caddygen:latest 43 | ``` 44 | 45 | ### **Run with Docker Compose** 46 | Use the following `docker-compose.yml`: 47 | ```yaml 48 | version: '3.8' 49 | 50 | services: 51 | app: 52 | image: wardy784/caddygen:latest 53 | ports: 54 | - "8189:80" 55 | restart: unless-stopped 56 | container_name: caddygen 57 | ``` 58 | 59 | To deploy: 60 | ```bash 61 | docker compose up -d 62 | ``` 63 | 64 | Access the app at `http://localhost:8189`. 65 | 66 | ### **Build Locally** 67 | If you prefer to build the image yourself: 68 | ```bash 69 | docker build -t caddygen . 70 | docker run -p 8189:80 caddygen 71 | ``` 72 | 73 | --- 74 | 75 | ## **Development Setup** 76 | 77 | This project is built using the following technologies: 78 | 79 | - **Vue 3** with TypeScript 80 | - **Vite** for fast builds 81 | - **Tailwind CSS** for styling 82 | - **Prism.js** for syntax highlighting 83 | - **Lucide Icons** for UI elements 84 | 85 | ### **Getting Started** 86 | 1. Clone the repository: 87 | ```bash 88 | git clone https://github.com/wardy784/caddygen.git 89 | cd caddygen 90 | ``` 91 | 92 | 2. Install dependencies: 93 | ```bash 94 | npm install 95 | ``` 96 | 97 | 3. Start the development server: 98 | ```bash 99 | npm run dev 100 | ``` 101 | 102 | 4. Open the app in your browser at `http://localhost:5173`. 103 | 104 | --- 105 | 106 | ## **Contributing** 107 | 108 | Contributions are welcome! Whether it's fixing a bug, suggesting a new feature, or improving the documentation, we’d love your help. Feel free to open an issue or submit a pull request. 109 | 110 | --- 111 | 112 | ## **License** 113 | 114 | CaddyGen is open-source and available under the **MIT License**. Feel free to use, modify, and distribute it as you wish! 115 | -------------------------------------------------------------------------------- /src/components/PresetModal.vue: -------------------------------------------------------------------------------- 1 | 59 | 60 | -------------------------------------------------------------------------------- /src/components/ImportModal.vue: -------------------------------------------------------------------------------- 1 | 122 | 123 | -------------------------------------------------------------------------------- /src/components/CaddyConfig.vue: -------------------------------------------------------------------------------- 1 | 236 | 237 | 260 | 261 | -------------------------------------------------------------------------------- /src/App.vue: -------------------------------------------------------------------------------- 1 | 64 | 65 | -------------------------------------------------------------------------------- /src/components/HostForm.vue: -------------------------------------------------------------------------------- 1 | 106 | 107 | 396 | 397 | -------------------------------------------------------------------------------- /src/presets.ts: -------------------------------------------------------------------------------- 1 | import type { PresetConfig } from './types/caddy'; 2 | 3 | export const presets: PresetConfig[] = [ 4 | // Media & Streaming 5 | { 6 | name: 'Jellyfin', 7 | port: 8096, 8 | description: 'Open-source media server for movies, TV shows, music, and more. Offers DVR functionality, user management, and a fully featured web client.', 9 | category: 'Media & Streaming', 10 | webLink: 'https://jellyfin.org', 11 | githubLink: 'https://github.com/jellyfin/jellyfin', 12 | logo: '' 13 | }, 14 | { 15 | name: 'Plex', 16 | port: 32400, 17 | description: 'Popular media server for organizing and streaming personal movies, TV shows, music, and photos. Features cloud integration, remote access, and apps for most platforms.', 18 | category: 'Media & Streaming', 19 | webLink: 'https://www.plex.tv', 20 | // Plex has some projects on GitHub, but the core server is closed source: 21 | // githubLink: 'https://github.com/plexinc' 22 | logo: '' 23 | }, 24 | { 25 | name: 'Emby', 26 | port: 8096, 27 | description: 'Media server alternative focusing on live TV, DVR support, and media management. Similar to Plex and Jellyfin but with a proprietary freemium model.', 28 | category: 'Media & Streaming', 29 | webLink: 'https://emby.media', 30 | // Emby is partially closed source; no official GitHub for the server: 31 | // githubLink: 'https://github.com/MediaBrowser/Emby' 32 | logo: '' 33 | }, 34 | { 35 | name: 'Subsonic', 36 | port: 4040, 37 | description: 'Music streaming server designed for easy access to your music library from anywhere. Airsonic is the open-source fork of Subsonic.', 38 | category: 'Media & Streaming', 39 | webLink: 'http://www.subsonic.org', 40 | // If you wish to link the open-source fork (Airsonic): 41 | // githubLink: 'https://github.com/airsonic/airsonic' 42 | }, 43 | 44 | // Downloaders & File Sharing 45 | { 46 | name: 'SABnzbd', 47 | port: 8080, 48 | description: 'A user-friendly Usenet download manager that supports automation, scheduling, and categories for organizing downloaded media.', 49 | category: 'Downloaders & File Sharing', 50 | webLink: 'https://sabnzbd.org', 51 | githubLink: 'https://github.com/sabnzbd/sabnzbd', 52 | logo: '' 53 | }, 54 | { 55 | name: 'NZBGet', 56 | port: 6789, 57 | description: 'Efficient, lightweight Usenet downloader with low resource usage. Focuses on performance and can run on devices with minimal specs (e.g., Raspberry Pi).', 58 | category: 'Downloaders & File Sharing', 59 | webLink: 'https://nzbget.net', 60 | githubLink: 'https://github.com/nzbget/nzbget' 61 | }, 62 | { 63 | name: 'qBittorrent', 64 | port: 8080, 65 | description: 'Popular BitTorrent client with an embedded, user-friendly web interface. Offers features like RSS downloading, remote control, and search.', 66 | category: 'Downloaders & File Sharing', 67 | webLink: 'https://www.qbittorrent.org', 68 | githubLink: 'https://github.com/qbittorrent/qBittorrent', 69 | logo: '' 70 | }, 71 | { 72 | name: 'Transmission', 73 | port: 9091, 74 | description: 'Cross-platform BitTorrent client known for its simplicity and low resource consumption. Features a minimal web interface for remote management.', 75 | category: 'Downloaders & File Sharing', 76 | webLink: 'https://transmissionbt.com', 77 | githubLink: 'https://github.com/transmission/transmission' 78 | }, 79 | { 80 | name: 'Deluge', 81 | port: 8112, 82 | description: 'Flexible BitTorrent client that can be controlled via a standalone desktop client, web UI, or console. Plug-in support for extra functionality.', 83 | category: 'Downloaders & File Sharing', 84 | webLink: 'https://deluge-torrent.org', 85 | githubLink: 'https://github.com/deluge-torrent/deluge' 86 | }, 87 | { 88 | name: 'PyLoad', 89 | port: 8000, 90 | description: 'Lightweight downloader focusing on one-click hosting sites, supporting parallel downloads and link decryption.', 91 | category: 'Downloaders & File Sharing', 92 | webLink: 'https://pyload.net', 93 | githubLink: 'https://github.com/pyload/pyload' 94 | }, 95 | 96 | // Media Management & Automation 97 | { 98 | name: 'Sonarr', 99 | port: 8989, 100 | description: 'TV series management tool that integrates with torrent and Usenet clients. Automatically searches, downloads, and renames TV episodes.', 101 | category: 'Media Management & Automation', 102 | webLink: 'https://sonarr.tv', 103 | githubLink: 'https://github.com/Sonarr/Sonarr' 104 | }, 105 | { 106 | name: 'Radarr', 107 | port: 7878, 108 | description: 'Movie management companion for Sonarr. Automates downloading, sorting, and renaming of movie files.', 109 | category: 'Media Management & Automation', 110 | webLink: 'https://radarr.video', 111 | githubLink: 'https://github.com/Radarr/Radarr' 112 | }, 113 | { 114 | name: 'Lidarr', 115 | port: 8686, 116 | description: 'Music management tool in the same family as Sonarr and Radarr. Automates music downloads and organizes libraries.', 117 | category: 'Media Management & Automation', 118 | webLink: 'https://lidarr.audio', 119 | githubLink: 'https://github.com/Lidarr/Lidarr' 120 | }, 121 | { 122 | name: 'Prowlarr', 123 | port: 9696, 124 | description: 'Indexer manager that integrates with Sonarr, Radarr, Lidarr, and other tools. Provides unified management of torrent and Usenet indexers.', 125 | category: 'Media Management & Automation', 126 | webLink: 'https://prowlarr.com', 127 | githubLink: 'https://github.com/Prowlarr/Prowlarr' 128 | }, 129 | { 130 | name: 'Overseerr', 131 | port:5055, 132 | description: 'Media request management system for Plex, Emby, or Jellyfin libraries. Allows users to request new media content and track requests.', 133 | category: 'Media Management & Automation', 134 | webLink: 'https://overseerr.dev', 135 | githubLink: 'https://github.com/sct/overseerr' 136 | }, 137 | { 138 | name: 'Jackett', 139 | port: 9117, 140 | description: 'Indexer aggregator that translates queries from management apps (Sonarr, Radarr, etc.) into tracker-specific web requests.', 141 | category: 'Media Management & Automation', 142 | webLink: 'https://jackett.dev', 143 | githubLink: 'https://github.com/Jackett/Jackett' 144 | }, 145 | { 146 | name: 'CouchPotato', 147 | port: 5050, 148 | description: 'An older movie automation tool. It\'s largely replaced by Radarr, but still used by some for historical reasons.', 149 | category: 'Media Management & Automation', 150 | webLink: 'https://couchpota.to', 151 | githubLink: 'https://github.com/CouchPotato/CouchPotatoServer' 152 | }, 153 | 154 | // Home Automation & IoT 155 | { 156 | name: 'Home Assistant', 157 | port: 8123, 158 | description: 'Powerful home automation platform with extensive support for integrations (lights, switches, sensors, media players). A central hub for smart home setups.', 159 | category: 'Home Automation & IoT', 160 | webLink: 'https://www.home-assistant.io', 161 | githubLink: 'https://github.com/home-assistant/core' 162 | }, 163 | { 164 | name: 'Node-RED', 165 | port: 1880, 166 | description: 'Flow-based development tool for wiring together hardware devices, APIs, and online services. Great for visual automation and IoT projects.', 167 | category: 'Home Automation & IoT', 168 | webLink: 'https://nodered.org', 169 | githubLink: 'https://github.com/node-red/node-red' 170 | }, 171 | { 172 | name: 'openHAB', 173 | port: 8080, 174 | description: 'Open-source, technology-agnostic home automation platform supporting numerous smart home devices and services.', 175 | category: 'Home Automation & IoT', 176 | webLink: 'https://www.openhab.org', 177 | githubLink: 'https://github.com/openhab/openhab-core' 178 | }, 179 | 180 | // Development & Code Hosting 181 | { 182 | name: 'GitLab', 183 | port: 80, 184 | description: 'Comprehensive self-hosted Git service with built-in CI/CD, issue tracking, wikis, and more. A robust all-in-one DevOps platform.', 185 | category: 'Development & Code Hosting', 186 | webLink: 'https://about.gitlab.com', 187 | // Primary code is hosted at GitLab: 188 | githubLink: 'https://gitlab.com/gitlab-org/gitlab' 189 | }, 190 | { 191 | name: 'Gitea', 192 | port: 3000, 193 | description: 'Lightweight, self-hosted Git service. Ideal for smaller teams or individuals who want a simpler, resource-friendly solution.', 194 | category: 'Development & Code Hosting', 195 | webLink: 'https://gitea.io', 196 | githubLink: 'https://github.com/go-gitea/gitea' 197 | }, 198 | { 199 | name: 'Jenkins', 200 | port: 8080, 201 | description: 'Leading open-source automation server for CI/CD pipelines. Highly extensible with hundreds of plugins.', 202 | category: 'Development & Code Hosting', 203 | webLink: 'https://www.jenkins.io', 204 | githubLink: 'https://github.com/jenkinsci/jenkins' 205 | }, 206 | { 207 | name: 'Drone CI', 208 | port: 8000, 209 | description: 'Container-native CI/CD platform. Integrates tightly with GitHub, GitLab, and Gitea, and emphasizes minimal configuration.', 210 | category: 'Development & Code Hosting', 211 | webLink: 'https://www.drone.io', 212 | githubLink: 'https://github.com/harness/drone' 213 | }, 214 | 215 | // Monitoring & Analytics 216 | { 217 | name: 'Grafana', 218 | port: 3000, 219 | description: 'Analytics and visualization platform, typically used with time-series databases like Prometheus or InfluxDB. Flexible dashboards and alerts.', 220 | category: 'Monitoring & Analytics', 221 | webLink: 'https://grafana.com', 222 | githubLink: 'https://github.com/grafana/grafana' 223 | }, 224 | { 225 | name: 'Prometheus', 226 | port: 9090, 227 | description: 'Monitoring system and time-series database. Gathers metrics via a pull model, often coupled with Grafana for visualization.', 228 | category: 'Monitoring & Analytics', 229 | webLink: 'https://prometheus.io', 230 | githubLink: 'https://github.com/prometheus/prometheus' 231 | }, 232 | { 233 | name: 'Uptime Kuma', 234 | port: 3001, 235 | description: 'Self-hosted uptime monitoring tool with a clean UI, multiple protocol checks (HTTP, TCP, etc.), and alerting features.', 236 | category: 'Monitoring & Analytics', 237 | webLink: 'https://uptime.kuma.pet', 238 | githubLink: 'https://github.com/louislam/uptime-kuma' 239 | }, 240 | { 241 | name: 'Netdata', 242 | port: 19999, 243 | description: 'Real-time performance monitoring for systems and applications, offering interactive visualizations and a minimal configuration process.', 244 | category: 'Monitoring & Analytics', 245 | webLink: 'https://www.netdata.cloud', 246 | githubLink: 'https://github.com/netdata/netdata' 247 | }, 248 | { 249 | name: 'Kibana', 250 | port: 5601, 251 | description: 'Front-end visualization tool for Elasticsearch. Helps analyze logs and metrics via advanced dashboards and searching capabilities.', 252 | category: 'Monitoring & Analytics', 253 | webLink: 'https://www.elastic.co/kibana', 254 | githubLink: 'https://github.com/elastic/kibana' 255 | }, 256 | { 257 | name: 'Loki', 258 | port: 3100, 259 | description: 'Log aggregation system by Grafana Labs. Integrates well with Prometheus and Grafana to provide a cohesive monitoring stack.', 260 | category: 'Monitoring & Analytics', 261 | webLink: 'https://grafana.com/oss/loki', 262 | githubLink: 'https://github.com/grafana/loki' 263 | }, 264 | 265 | // Productivity & Collaboration 266 | { 267 | name: 'Nextcloud', 268 | port: 8080, 269 | description: 'Self-hosted productivity platform that includes file syncing, collaborative document editing, calendar, contacts, and more.', 270 | category: 'Productivity & Collaboration', 271 | webLink: 'https://nextcloud.com', 272 | githubLink: 'https://github.com/nextcloud/server' 273 | }, 274 | { 275 | name: 'OnlyOffice', 276 | port: 8081, 277 | description: 'Self-hosted office suite enabling online editing of text documents, spreadsheets, and presentations. Often paired with Nextcloud.', 278 | category: 'Productivity & Collaboration', 279 | webLink: 'https://www.onlyoffice.com', 280 | githubLink: 'https://github.com/ONLYOFFICE/DocumentServer' 281 | }, 282 | { 283 | name: 'Etherpad', 284 | port: 9001, 285 | description: 'Real-time collaborative text editor. Allows multiple users to edit documents simultaneously and view changes in real time.', 286 | category: 'Productivity & Collaboration', 287 | webLink: 'https://etherpad.org', 288 | githubLink: 'https://github.com/ether/etherpad-lite' 289 | }, 290 | { 291 | name: 'CryptPad', 292 | port: 3002, 293 | description: 'Privacy-first collaboration suite (documents, polls, kanbans) with end-to-end encryption.', 294 | category: 'Productivity & Collaboration', 295 | webLink: 'https://cryptpad.fr', 296 | githubLink: 'https://github.com/xwiki-labs/cryptpad' 297 | }, 298 | { 299 | name: 'BookStack', 300 | port: 80, 301 | description: 'Simple, user-friendly wiki platform for storing notes, documentation, and knowledge bases.', 302 | category: 'Productivity & Collaboration', 303 | webLink: 'https://www.bookstackapp.com', 304 | githubLink: 'https://github.com/BookStackApp/BookStack' 305 | }, 306 | 307 | // Authentication & Identity 308 | { 309 | name: 'Keycloak', 310 | port: 8080, 311 | description: 'Open-source identity and access management solution. Provides single sign-on (SSO), identity brokering, and social login integration.', 312 | category: 'Authentication & Identity', 313 | webLink: 'https://www.keycloak.org', 314 | githubLink: 'https://github.com/keycloak/keycloak' 315 | }, 316 | { 317 | name: 'Authelia', 318 | port: 9091, 319 | description: 'Modern, self-hosted authentication and authorization server for securing reverse proxies. Often used with Traefik, Caddy, or Nginx.', 320 | category: 'Authentication & Identity', 321 | webLink: 'https://www.authelia.com', 322 | githubLink: 'https://github.com/authelia/authelia' 323 | }, 324 | 325 | // Security & Networking 326 | { 327 | name: 'Pi-hole', 328 | port: 80, 329 | description: 'Network-wide ad blocking and DNS management solution that can block ads and trackers at the DNS level.', 330 | category: 'Security & Networking', 331 | webLink: 'https://pi-hole.net', 332 | githubLink: 'https://github.com/pi-hole/pi-hole' 333 | }, 334 | { 335 | name: 'Unifi Controller', 336 | port: 8443, 337 | description: 'Management interface for UniFi network devices (access points, switches, gateways). Provides centralized configuration and monitoring.', 338 | category: 'Security & Networking', 339 | webLink: 'https://unifi.ui.com', 340 | // The UniFi Controller is not fully open source: 341 | // githubLink: 'https://github.com/ubiquiti' 342 | }, 343 | 344 | // Container & Server Management 345 | { 346 | name: 'Portainer', 347 | port: 9000, 348 | description: 'Lightweight container management UI, supporting Docker, Docker Swarm, and Kubernetes. Simplifies container and image management.', 349 | category: 'Container & Server Management', 350 | webLink: 'https://www.portainer.io', 351 | githubLink: 'https://github.com/portainer/portainer' 352 | }, 353 | { 354 | name: 'Docker Registry', 355 | port: 5000, 356 | description: 'Private Docker image registry for storing and distributing container images locally.', 357 | category: 'Container & Server Management', 358 | webLink: 'https://docs.docker.com/registry', 359 | githubLink: 'https://github.com/docker/distribution' 360 | }, 361 | { 362 | name: 'Rancher', 363 | port: 80, 364 | description: 'Kubernetes management platform providing a GUI and centralized controls over multiple Kubernetes clusters.', 365 | category: 'Container & Server Management', 366 | webLink: 'https://rancher.com', 367 | githubLink: 'https://github.com/rancher/rancher' 368 | }, 369 | 370 | // Password & Secrets Management 371 | { 372 | name: 'Vaultwarden', 373 | port: 8080, 374 | description: 'Lightweight, self-hosted Bitwarden-compatible server for password management. Maintains core features with lower resource usage.', 375 | category: 'Password & Secrets Management', 376 | // The main site for the Vaultwarden project is its GitHub page: 377 | webLink: 'https://github.com/dani-garcia/vaultwarden', 378 | githubLink: 'https://github.com/dani-garcia/vaultwarden' 379 | }, 380 | { 381 | name: 'HashiCorp Vault', 382 | port: 8200, 383 | description: 'Secure tool for secrets management, encryption, and access control. Can store API keys, passwords, certificates, and more.', 384 | category: 'Password & Secrets Management', 385 | webLink: 'https://www.vaultproject.io', 386 | githubLink: 'https://github.com/hashicorp/vault' 387 | }, 388 | 389 | // Messaging & Communication 390 | { 391 | name: 'Rocket.Chat', 392 | port: 3000, 393 | description: 'Self-hosted team chat solution, similar to Slack. Supports channels, direct messages, audio/video calls, and screen sharing.', 394 | category: 'Messaging & Communication', 395 | webLink: 'https://rocket.chat', 396 | githubLink: 'https://github.com/RocketChat/Rocket.Chat' 397 | }, 398 | { 399 | name: 'Mattermost', 400 | port: 8065, 401 | description: 'Open-source, self-hosted Slack alternative with integrations, theming, and enterprise features.', 402 | category: 'Messaging & Communication', 403 | webLink: 'https://mattermost.com', 404 | githubLink: 'https://github.com/mattermost/mattermost-server' 405 | }, 406 | { 407 | name: 'The Lounge', 408 | port: 9001, 409 | description: 'Self-hosted web IRC client that stays connected even when you\'re offline. Includes multiple theme and plugin options.', 410 | category: 'Messaging & Communication', 411 | webLink: 'https://thelounge.chat', 412 | githubLink: 'https://github.com/thelounge/thelounge' 413 | } 414 | ]; --------------------------------------------------------------------------------