Migrate
This commit is contained in:
@@ -0,0 +1,4 @@
|
||||
PUID=1000
|
||||
PGID=1000
|
||||
# TZ for container timezone
|
||||
TZ=America/New_York
|
||||
@@ -0,0 +1,3 @@
|
||||
---
|
||||
|
||||
|
||||
@@ -0,0 +1,385 @@
|
||||
@import url('https://fonts.googleapis.com/css2?family=Fira+Code&family=Orbitron:wght@500;700;900&family=Poppins:wght@300;400;500;600&family=Rajdhani:wght@500;600;700&display=swap');
|
||||
|
||||
/* APPLY STYLING AND THEME VARIABLES GLOBALLY & ON ACTIVE THEMES */
|
||||
:root, .dark, .theme-gray, .theme-slate, .theme-zinc {
|
||||
font-family: 'Poppins', sans-serif;
|
||||
|
||||
/* DRACULA & CYBERPUNK COLOR SYSTEM */
|
||||
--dracula-background: #181923;
|
||||
--dracula-background-dark: #0f1015;
|
||||
--dracula-foreground: #2d3142;
|
||||
--dracula-text: #f8f8f2;
|
||||
--dracula-slate: #6272a4;
|
||||
--dracula-cyan: #8be9fd;
|
||||
--dracula-green: #50fa7b;
|
||||
--dracula-orange: #ffb86c;
|
||||
--dracula-pink: #ff79c6;
|
||||
--dracula-purple: #bd93f9;
|
||||
--dracula-red: #ff5555;
|
||||
--dracula-yellow: #f1fa8c;
|
||||
|
||||
/* Theme preset colors (RGB values for Tailwind transparency support) */
|
||||
--color-50: 249 250 251;
|
||||
--color-100: 243 244 246;
|
||||
--color-200: 248 248 242; /* Text Color */
|
||||
--color-300: 209 213 219;
|
||||
--color-400: 156 163 175;
|
||||
--color-500: 107 114 128;
|
||||
--color-600: 75 85 99;
|
||||
--color-700: 45 49 66;
|
||||
--color-800: 24 25 35; /* Main container background */
|
||||
--color-900: 15 16 21; /* Core background */
|
||||
--color-logo-start: 189 147 249;
|
||||
--color-logo-stop: 139 233 253;
|
||||
|
||||
--standard-bg: rgba(45, 49, 66, 0.45);
|
||||
|
||||
/* INFO WIDGET COLORS */
|
||||
--info-widgets: var(--dracula-cyan);
|
||||
--resource-bar-bg: rgba(98, 114, 164, 0.2);
|
||||
--resource-bar-fg: var(--dracula-cyan);
|
||||
|
||||
--widget-border: rgba(139, 233, 253, 0.2);
|
||||
|
||||
/* SERVICES COLORS */
|
||||
--service-group: var(--dracula-purple);
|
||||
--service-name: var(--dracula-text);
|
||||
--service-description: #a9b1d6;
|
||||
|
||||
--service-block-bg: rgba(15, 16, 21, 0.7);
|
||||
--service-block-text: var(--dracula-pink);
|
||||
|
||||
/* BOOKMARKS COLORS */
|
||||
--bookmark-group: var(--dracula-purple);
|
||||
--bookmark-icon-bg: rgba(189, 147, 249, 0.15);
|
||||
--bookmark-icon: var(--dracula-purple);
|
||||
--bookmark-name: var(--dracula-text);
|
||||
|
||||
/* ALL CARD COLORS (GLASSMORPHISM DEFAULT) */
|
||||
--card-color: rgba(30, 32, 48, 0.55);
|
||||
--card-color-hover: rgba(40, 44, 68, 0.8);
|
||||
|
||||
/* FOOTER COLORS */
|
||||
--footer-items: var(--dracula-purple);
|
||||
--scrollbar-fg: var(--dracula-purple);
|
||||
--scrollbar-bg: var(--dracula-background-dark);
|
||||
}
|
||||
|
||||
/* ==========================================
|
||||
* FUTURISTIC SCIFI HUD OVERLAY
|
||||
* ========================================== */
|
||||
body {
|
||||
background-color: #0c0d12 !important;
|
||||
position: relative;
|
||||
overflow-x: hidden;
|
||||
}
|
||||
|
||||
body::before {
|
||||
content: "";
|
||||
position: fixed;
|
||||
top: 0; left: 0; right: 0; bottom: 0;
|
||||
background:
|
||||
linear-gradient(rgba(12, 13, 18, 0.75), rgba(12, 13, 18, 0.85)),
|
||||
linear-gradient(90deg, rgba(139, 233, 253, 0.02) 1px, transparent 1px),
|
||||
linear-gradient(rgba(139, 233, 253, 0.02) 1px, transparent 1px);
|
||||
background-size: 100% 100%, 50px 50px, 50px 50px;
|
||||
pointer-events: none;
|
||||
z-index: -1;
|
||||
animation: gridPan 120s linear infinite;
|
||||
}
|
||||
|
||||
/* Add a neon scanline effect */
|
||||
body::after {
|
||||
content: "";
|
||||
position: fixed;
|
||||
top: 0; left: 0; width: 100%; height: 100%;
|
||||
background: linear-gradient(rgba(18, 16, 16, 0) 50%, rgba(0, 0, 0, 0.25) 50%), linear-gradient(90deg, rgba(255, 0, 0, 0.06), rgba(0, 255, 0, 0.02), rgba(0, 0, 255, 0.06));
|
||||
background-size: 100% 4px, 6px 100%;
|
||||
pointer-events: none;
|
||||
z-index: 9999;
|
||||
opacity: 0.15;
|
||||
}
|
||||
|
||||
@keyframes gridPan {
|
||||
from { background-position: 0 0, 0 0, 0 0; }
|
||||
to { background-position: 0 0, 1000px 1000px, 1000px 1000px; }
|
||||
}
|
||||
|
||||
/* ==========================================
|
||||
* TYPOGRAPHY & TITLE STYLES
|
||||
* ========================================== */
|
||||
.service-group-name, .bookmark-group-name, #widgets-title {
|
||||
font-family: 'Orbitron', sans-serif !important;
|
||||
font-weight: 700 !important;
|
||||
letter-spacing: 0.15em !important;
|
||||
text-transform: uppercase !important;
|
||||
text-shadow: 0 0 10px rgba(189, 147, 249, 0.6) !important;
|
||||
color: var(--dracula-purple) !important;
|
||||
}
|
||||
|
||||
.service-name {
|
||||
font-family: 'Rajdhani', sans-serif !important;
|
||||
font-weight: 700 !important;
|
||||
font-size: 1.15rem !important;
|
||||
letter-spacing: 0.03em !important;
|
||||
color: var(--dracula-text) !important;
|
||||
}
|
||||
|
||||
.service-description {
|
||||
font-family: 'Poppins', sans-serif !important;
|
||||
font-size: 0.8rem !important;
|
||||
color: #a9b1d6 !important;
|
||||
}
|
||||
|
||||
/* ==========================================
|
||||
* GLASSMORPHISM CARDS & ANIMATIONS
|
||||
* ========================================== */
|
||||
.service-card, li.bookmark > a, #information-widgets, #dracula-calendar {
|
||||
background: var(--card-color) !important;
|
||||
backdrop-filter: blur(14px) !important;
|
||||
-webkit-backdrop-filter: blur(14px) !important;
|
||||
border: 1px solid rgba(255, 255, 255, 0.06) !important;
|
||||
box-shadow: 0 8px 32px 0 rgba(0, 0, 0, 0.4) !important;
|
||||
transition: all 0.4s cubic-bezier(0.165, 0.84, 0.44, 1) !important;
|
||||
position: relative;
|
||||
overflow: hidden;
|
||||
}
|
||||
|
||||
/* Hover base styling */
|
||||
.service-card:hover, li.bookmark > a:hover {
|
||||
transform: translateY(-4px) scale(1.02);
|
||||
background: var(--card-color-hover) !important;
|
||||
border-color: rgba(139, 233, 253, 0.4) !important;
|
||||
box-shadow: 0 12px 40px 0 rgba(0, 0, 0, 0.6), 0 0 15px rgba(139, 233, 253, 0.2) !important;
|
||||
}
|
||||
|
||||
/* Subtle corner tech border lines for hover */
|
||||
.service-card::after {
|
||||
content: "";
|
||||
position: absolute;
|
||||
top: 0; left: 0; width: 4px; height: 4px;
|
||||
border-top: 2px solid transparent;
|
||||
border-left: 2px solid transparent;
|
||||
transition: all 0.3s;
|
||||
}
|
||||
|
||||
.service-card:hover::after {
|
||||
border-top-color: var(--dracula-cyan);
|
||||
border-left-color: var(--dracula-cyan);
|
||||
width: 15px; height: 15px;
|
||||
}
|
||||
|
||||
/* Service Images */
|
||||
.service img {
|
||||
border-radius: 20%;
|
||||
border: 1px solid rgba(255, 255, 255, 0.1);
|
||||
padding: 2px;
|
||||
background: rgba(0, 0, 0, 0.2);
|
||||
transition: all 0.4s;
|
||||
}
|
||||
|
||||
.service-card:hover img {
|
||||
transform: rotate(5deg) scale(1.05);
|
||||
border-color: rgba(139, 233, 253, 0.4);
|
||||
}
|
||||
|
||||
/* ==========================================
|
||||
* PULSING STATUS / ONLINE DOTS
|
||||
* ========================================== */
|
||||
.bg-green-500, .bg-emerald-500, .text-green-500, .text-emerald-500 {
|
||||
position: relative;
|
||||
background-color: var(--dracula-green) !important;
|
||||
box-shadow: 0 0 10px var(--dracula-green) !important;
|
||||
}
|
||||
|
||||
/* Create glowing animation rings */
|
||||
.bg-green-500::after, .bg-emerald-500::after {
|
||||
content: "";
|
||||
position: absolute;
|
||||
top: -2px; left: -2px; right: -2px; bottom: -2px;
|
||||
border-radius: 50%;
|
||||
border: 1.5px solid var(--dracula-green);
|
||||
animation: statusPulse 2s infinite ease-out;
|
||||
opacity: 0;
|
||||
pointer-events: none;
|
||||
}
|
||||
|
||||
@keyframes statusPulse {
|
||||
0% { transform: scale(1); opacity: 0.8; }
|
||||
100% { transform: scale(2.4); opacity: 0; }
|
||||
}
|
||||
|
||||
.bg-red-500, .text-red-500 {
|
||||
position: relative;
|
||||
background-color: var(--dracula-red) !important;
|
||||
box-shadow: 0 0 10px var(--dracula-red) !important;
|
||||
}
|
||||
|
||||
.bg-red-500::after {
|
||||
content: "";
|
||||
position: absolute;
|
||||
top: -2px; left: -2px; right: -2px; bottom: -2px;
|
||||
border-radius: 50%;
|
||||
border: 1.5px solid var(--dracula-red);
|
||||
animation: statusPulse 2s infinite ease-out;
|
||||
opacity: 0;
|
||||
pointer-events: none;
|
||||
}
|
||||
|
||||
/* ==========================================
|
||||
* WIDGET & SCROLLBAR CUSTOMS
|
||||
* ========================================== */
|
||||
#information-widgets {
|
||||
border-color: var(--widget-border) !important;
|
||||
margin-bottom: 2rem;
|
||||
}
|
||||
|
||||
#information-widgets * {
|
||||
font-family: 'Rajdhani', sans-serif !important;
|
||||
font-weight: 600;
|
||||
color: var(--info-widgets) !important;
|
||||
}
|
||||
|
||||
.resource-usage {
|
||||
background-color: var(--resource-bar-bg) !important;
|
||||
border: 1px solid rgba(255, 255, 255, 0.05);
|
||||
border-radius: 4px;
|
||||
height: 8px !important;
|
||||
overflow: hidden;
|
||||
}
|
||||
|
||||
.resource-usage > div {
|
||||
background: linear-gradient(90deg, var(--dracula-cyan), var(--dracula-purple)) !important;
|
||||
box-shadow: 0 0 8px rgba(139, 233, 253, 0.6);
|
||||
height: 100%;
|
||||
}
|
||||
|
||||
.service-block {
|
||||
background: var(--service-block-bg) !important;
|
||||
border-radius: 6px;
|
||||
border: 1px solid rgba(255, 255, 255, 0.05) !important;
|
||||
}
|
||||
|
||||
.service-block .uppercase {
|
||||
color: var(--service-block-text) !important;
|
||||
font-family: 'Orbitron', sans-serif;
|
||||
font-size: 0.7rem;
|
||||
letter-spacing: 0.08em;
|
||||
}
|
||||
|
||||
.service-block .font-thin {
|
||||
color: var(--dracula-text) !important;
|
||||
font-family: 'Fira Code', monospace;
|
||||
}
|
||||
|
||||
/* Bookmarks styling */
|
||||
.bookmark-icon {
|
||||
background-color: var(--bookmark-icon-bg) !important;
|
||||
border: 1px solid rgba(189, 147, 249, 0.2);
|
||||
}
|
||||
|
||||
.bookmark-icon > div > div {
|
||||
background: var(--bookmark-icon) !important;
|
||||
}
|
||||
|
||||
.bookmark-name {
|
||||
font-family: 'Poppins', sans-serif !important;
|
||||
font-weight: 500;
|
||||
}
|
||||
|
||||
/* Calendar widget tweaks */
|
||||
#dracula-calendar .flex.justify-between.flex-wrap span {
|
||||
color: var(--dracula-purple) !important;
|
||||
font-family: 'Rajdhani', sans-serif;
|
||||
font-weight: 700;
|
||||
}
|
||||
|
||||
#footer svg {
|
||||
color: var(--footer-items) !important;
|
||||
filter: drop-shadow(0 0 5px rgba(189, 147, 249, 0.5));
|
||||
}
|
||||
|
||||
* {
|
||||
--scrollbar-thumb: var(--scrollbar-fg);
|
||||
--scrollbar-track: var(--scrollbar-bg);
|
||||
}
|
||||
|
||||
/* Custom styling for the search input widget */
|
||||
#search-input, .search-container input {
|
||||
background: rgba(15, 23, 42, 0.6) !important;
|
||||
border: 1px solid rgba(56, 189, 248, 0.3) !important;
|
||||
color: #e2e8f0 !important;
|
||||
font-family: 'Courier New', Courier, monospace !important;
|
||||
border-radius: 8px !important;
|
||||
backdrop-filter: blur(8px) !important;
|
||||
}
|
||||
|
||||
#search-input:focus, .search-container input:focus {
|
||||
border-color: rgba(56, 189, 248, 0.8) !important;
|
||||
box-shadow: 0 0 15px rgba(56, 189, 248, 0.4) !important;
|
||||
outline: none !important;
|
||||
}
|
||||
|
||||
/* ==========================================
|
||||
* CUSTOM COLOR INTEGRATION BY ID
|
||||
* ========================================== */
|
||||
/* Setup distinct neon glow values on hover for individual service IDs */
|
||||
|
||||
#blue:hover .service-card { border-color: #6272a4 !important; box-shadow: 0 8px 32px 0 rgba(0, 0, 0, 0.4), 0 0 20px rgba(98, 114, 164, 0.45) !important; }
|
||||
#yellow:hover .service-card { border-color: #f1fa8c !important; box-shadow: 0 8px 32px 0 rgba(0, 0, 0, 0.4), 0 0 20px rgba(241, 250, 140, 0.45) !important; }
|
||||
#red:hover .service-card { border-color: #ff5555 !important; box-shadow: 0 8px 32px 0 rgba(0, 0, 0, 0.4), 0 0 20px rgba(255, 85, 85, 0.45) !important; }
|
||||
#cyan:hover .service-card { border-color: #8be9fd !important; box-shadow: 0 8px 32px 0 rgba(0, 0, 0, 0.4), 0 0 20px rgba(139, 233, 253, 0.45) !important; }
|
||||
#purple:hover .service-card { border-color: #bd93f9 !important; box-shadow: 0 8px 32px 0 rgba(0, 0, 0, 0.4), 0 0 20px rgba(189, 147, 249, 0.45) !important; }
|
||||
#white:hover .service-card { border-color: #f8f8f2 !important; box-shadow: 0 8px 32px 0 rgba(0, 0, 0, 0.4), 0 0 20px rgba(248, 248, 242, 0.45) !important; }
|
||||
#gold:hover .service-card { border-color: #ffd700 !important; box-shadow: 0 8px 32px 0 rgba(0, 0, 0, 0.4), 0 0 20px rgba(255, 215, 0, 0.45) !important; }
|
||||
#green:hover .service-card { border-color: #50fa7b !important; box-shadow: 0 8px 32px 0 rgba(0, 0, 0, 0.4), 0 0 20px rgba(80, 250, 123, 0.45) !important; }
|
||||
#lime:hover .service-card { border-color: #a3e635 !important; box-shadow: 0 8px 32px 0 rgba(0, 0, 0, 0.4), 0 0 20px rgba(163, 230, 53, 0.45) !important; }
|
||||
#cobalt:hover .service-card { border-color: #3b82f6 !important; box-shadow: 0 8px 32px 0 rgba(0, 0, 0, 0.4), 0 0 20px rgba(59, 130, 246, 0.45) !important; }
|
||||
#gray:hover .service-card { border-color: #9ca3af !important; box-shadow: 0 8px 32px 0 rgba(0, 0, 0, 0.4), 0 0 20px rgba(156, 163, 175, 0.45) !important; }
|
||||
#crimson:hover .service-card { border-color: #dc143c !important; box-shadow: 0 8px 32px 0 rgba(0, 0, 0, 0.4), 0 0 20px rgba(220, 20, 60, 0.45) !important; }
|
||||
#lavender:hover .service-card { border-color: #e6e6fa !important; box-shadow: 0 8px 32px 0 rgba(0, 0, 0, 0.4), 0 0 20px rgba(230, 230, 250, 0.45) !important; }
|
||||
#teal:hover .service-card { border-color: #008080 !important; box-shadow: 0 8px 32px 0 rgba(0, 0, 0, 0.4), 0 0 20px rgba(0, 128, 128, 0.45) !important; }
|
||||
#violet:hover .service-card { border-color: #7c3aed !important; box-shadow: 0 8px 32px 0 rgba(0, 0, 0, 0.4), 0 0 20px rgba(124, 58, 237, 0.45) !important; }
|
||||
#aqua:hover .service-card { border-color: #00ffff !important; box-shadow: 0 8px 32px 0 rgba(0, 0, 0, 0.4), 0 0 20px rgba(0, 255, 255, 0.45) !important; }
|
||||
#navy:hover .service-card { border-color: #000080 !important; box-shadow: 0 8px 32px 0 rgba(0, 0, 0, 0.4), 0 0 20px rgba(0, 0, 128, 0.45) !important; }
|
||||
#beige:hover .service-card { border-color: #f5f5dc !important; box-shadow: 0 8px 32px 0 rgba(0, 0, 0, 0.4), 0 0 20px rgba(245, 245, 220, 0.45) !important; }
|
||||
#slate:hover .service-card { border-color: #708090 !important; box-shadow: 0 8px 32px 0 rgba(0, 0, 0, 0.4), 0 0 20px rgba(112, 128, 144, 0.45) !important; }
|
||||
#burgundy:hover .service-card { border-color: #800020 !important; box-shadow: 0 8px 32px 0 rgba(0, 0, 0, 0.4), 0 0 20px rgba(128, 0, 32, 0.45) !important; }
|
||||
#emerald:hover .service-card { border-color: #50c878 !important; box-shadow: 0 8px 32px 0 rgba(0, 0, 0, 0.4), 0 0 20px rgba(80, 200, 120, 0.45) !important; }
|
||||
#salmon:hover .service-card { border-color: #fa8072 !important; box-shadow: 0 8px 32px 0 rgba(0, 0, 0, 0.4), 0 0 20px rgba(250, 128, 114, 0.45) !important; }
|
||||
#jade:hover .service-card { border-color: #00a86b !important; box-shadow: 0 8px 32px 0 rgba(0, 0, 0, 0.4), 0 0 20px rgba(0, 168, 107, 0.45) !important; }
|
||||
#indigo:hover .service-card { border-color: #4b0082 !important; box-shadow: 0 8px 32px 0 rgba(0, 0, 0, 0.4), 0 0 20px rgba(75, 0, 130, 0.45) !important; }
|
||||
#charcoal:hover .service-card { border-color: #36454f !important; box-shadow: 0 8px 32px 0 rgba(0, 0, 0, 0.4), 0 0 20px rgba(54, 69, 79, 0.45) !important; }
|
||||
#cerulean:hover .service-card { border-color: #007ba7 !important; box-shadow: 0 8px 32px 0 rgba(0, 0, 0, 0.4), 0 0 20px rgba(0, 123, 167, 0.45) !important; }
|
||||
#rose:hover .service-card { border-color: #ff007f !important; box-shadow: 0 8px 32px 0 rgba(0, 0, 0, 0.4), 0 0 20px rgba(255, 0, 127, 0.45) !important; }
|
||||
#coral:hover .service-card { border-color: #ff7f50 !important; box-shadow: 0 8px 32px 0 rgba(0, 0, 0, 0.4), 0 0 20px rgba(255, 127, 80, 0.45) !important; }
|
||||
|
||||
/* Keep active indicators styled cleanly inside the cards */
|
||||
#blue:hover .service-card::after { border-top-color: #6272a4; border-left-color: #6272a4; }
|
||||
#yellow:hover .service-card::after { border-top-color: #f1fa8c; border-left-color: #f1fa8c; }
|
||||
#red:hover .service-card::after { border-top-color: #ff5555; border-left-color: #ff5555; }
|
||||
#cyan:hover .service-card::after { border-top-color: #8be9fd; border-left-color: #8be9fd; }
|
||||
#purple:hover .service-card::after { border-top-color: #bd93f9; border-left-color: #bd93f9; }
|
||||
#white:hover .service-card::after { border-top-color: #f8f8f2; border-left-color: #f8f8f2; }
|
||||
#gold:hover .service-card::after { border-top-color: #ffd700; border-left-color: #ffd700; }
|
||||
#green:hover .service-card::after { border-top-color: #50fa7b; border-left-color: #50fa7b; }
|
||||
#lime:hover .service-card::after { border-top-color: #a3e635; border-left-color: #a3e635; }
|
||||
#cobalt:hover .service-card::after { border-top-color: #3b82f6; border-left-color: #3b82f6; }
|
||||
#gray:hover .service-card::after { border-top-color: #9ca3af; border-left-color: #9ca3af; }
|
||||
#crimson:hover .service-card::after { border-top-color: #dc143c; border-left-color: #dc143c; }
|
||||
#lavender:hover .service-card::after { border-top-color: #e6e6fa; border-left-color: #e6e6fa; }
|
||||
#teal:hover .service-card::after { border-top-color: #008080; border-left-color: #008080; }
|
||||
#violet:hover .service-card::after { border-top-color: #7c3aed; border-left-color: #7c3aed; }
|
||||
#aqua:hover .service-card::after { border-top-color: #00ffff; border-left-color: #00ffff; }
|
||||
#navy:hover .service-card::after { border-top-color: #000080; border-left-color: #000080; }
|
||||
#beige:hover .service-card::after { border-top-color: #f5f5dc; border-left-color: #f5f5dc; }
|
||||
#slate:hover .service-card::after { border-top-color: #708090; border-left-color: #708090; }
|
||||
#burgundy:hover .service-card::after { border-top-color: #800020; border-left-color: #800020; }
|
||||
#emerald:hover .service-card::after { border-top-color: #50c878; border-left-color: #50c878; }
|
||||
#salmon:hover .service-card::after { border-top-color: #fa8072; border-left-color: #fa8072; }
|
||||
#jade:hover .service-card::after { border-top-color: #00a86b; border-left-color: #00a86b; }
|
||||
#indigo:hover .service-card::after { border-top-color: #4b0082; border-left-color: #4b0082; }
|
||||
#charcoal:hover .service-card::after { border-top-color: #36454f; border-left-color: #36454f; }
|
||||
#cerulean:hover .service-card::after { border-top-color: #007ba7; border-left-color: #007ba7; }
|
||||
#rose:hover .service-card::after { border-top-color: #ff007f; border-left-color: #ff007f; }
|
||||
#coral:hover .service-card::after { border-top-color: #ff7f50; border-left-color: #ff7f50; }
|
||||
Binary file not shown.
@@ -0,0 +1,10 @@
|
||||
---
|
||||
# For configuration options and examples, please see:
|
||||
# https://gethomepage.dev/configs/docker/
|
||||
|
||||
# my-docker:
|
||||
# host: 127.0.0.1
|
||||
# port: 2375
|
||||
|
||||
# my-docker:
|
||||
# socket: /var/run/docker.sock
|
||||
@@ -0,0 +1,2 @@
|
||||
---
|
||||
# sample kubernetes config
|
||||
@@ -0,0 +1,5 @@
|
||||
---
|
||||
# pve:
|
||||
# url: https://proxmox.host.or.ip:8006
|
||||
# token: username@pam!Token ID
|
||||
# secret: secret
|
||||
@@ -0,0 +1,392 @@
|
||||
---
|
||||
######################################### HOME TAB SERVICES ######################################################################
|
||||
- Infrastructure:
|
||||
- Proxmox 1: # Main Virt Server
|
||||
id: blue
|
||||
tab: Home
|
||||
href: https://192.168.2.1:8006
|
||||
icon: proxmox.png
|
||||
description: Virtual Server 1
|
||||
widget:
|
||||
type: proxmox
|
||||
url: https://192.168.2.1:8006
|
||||
username: api@pam!homepage
|
||||
password: faca2bd5-e6df-4192-85ce-928fccde4623
|
||||
node: pve
|
||||
fields: ["vms", "lxc", "resources.cpu", "resources.mem"]
|
||||
|
||||
- Proxmox 2:
|
||||
id: yellow
|
||||
tab: Home
|
||||
href: https://192.168.2.2:8006
|
||||
icon: proxmox.png
|
||||
description: Virtual Server 2
|
||||
widget:
|
||||
type: proxmox
|
||||
url: https://192.168.2.2:8006
|
||||
username: api@pam!homepage
|
||||
password: 1b2fa246-a994-4f93-ab4d-1c91a4aea614
|
||||
node: pve
|
||||
fields: ["vms", "lxc", "resources.cpu", "resources.mem"]
|
||||
|
||||
- Authentik:
|
||||
id: red
|
||||
tab: Home
|
||||
href: https://auth.mikemcfetridge.com
|
||||
icon: authentik.png
|
||||
description: Authentik SSO
|
||||
widget:
|
||||
type: authentik
|
||||
url: https://192.168.2.6:9543
|
||||
key: NW5ldUK8qDRY91ny67dE6ckWCMXThF9nwj6EZw7pKbS5FzXx5wouAo4sC19n
|
||||
version: 2
|
||||
|
||||
- Dockhand:
|
||||
id: cyan
|
||||
tab: Home
|
||||
href: http://192.168.2.6:3200
|
||||
icon: dockhand.png
|
||||
description: Dockhand
|
||||
widget:
|
||||
type: dockhand
|
||||
url: http://192.168.2.6:3200
|
||||
username: mmcfetridge
|
||||
password: "!Sucyetat123"
|
||||
fields: ["running", "total", "pending_updates", "paused"]
|
||||
|
||||
- Mailcow:
|
||||
id: cyan
|
||||
tab: Home
|
||||
href: https://216.144.227.142/admin
|
||||
icon: mailcow.png
|
||||
description: mailcow
|
||||
widget:
|
||||
type: mailcow
|
||||
url: https://mail.mmcfetridge.net
|
||||
key: 2C3DAF-9DA97F-22FF12-851295-2A7E37
|
||||
|
||||
############################################## APPS TAB Services ###########################################################
|
||||
- Applications:
|
||||
- Immich:
|
||||
id: white
|
||||
tab: Home
|
||||
href: https://immich.mikemcfetridge.com
|
||||
icon: immich.png
|
||||
description: Photos Server
|
||||
widget:
|
||||
type: immich
|
||||
url: http://192.168.2.6:2283
|
||||
key: "MLbcal27A67J6FZV1PIb3AdMsRf8xZC1uruOLB7js"
|
||||
fields: ["users", "photos", "storage"]
|
||||
version: 2
|
||||
|
||||
- MySpeed:
|
||||
id: lime
|
||||
tab: Home
|
||||
icon: myspeed.png
|
||||
href: http://192.168.2.6:5216
|
||||
widget:
|
||||
type: myspeed
|
||||
url: http://192.168.2.6:5216
|
||||
password: "!Sucyetat123" # only required if password is set
|
||||
|
||||
- mealie:
|
||||
id: cobalt
|
||||
tab: Home
|
||||
icon: mealie.png
|
||||
href: http://192.168.2.7:9200/
|
||||
widget:
|
||||
type: mealie
|
||||
url: http://192.168.2.7:9200
|
||||
key: eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJsb25nX3Rva2VuIjp0cnVlLCJpZCI6ImVhNDAxMTIzLTg1ZGItNDZhMi04Y2M1LTEzYmVmNGM2ZjgxMCIsIm5hbWUiOiJIb21lcGFnZSIsImludGVncmF0aW9uX2lkIjoiZ2VuZXJpYyIsImV4cCI6MTk0MDE1NTE4NX0.NgpovwuA-FGjt6f6q5kInmmIUadjXRCEpoowfRnYhHE
|
||||
version: 2 # only required if version > 1, defaults to 1
|
||||
|
||||
- Nextcloud:
|
||||
id: gold
|
||||
tab: Home
|
||||
href: https://next.mcfetridge.us
|
||||
icon: nextcloud.png
|
||||
description: Nextcloud Server
|
||||
widget:
|
||||
type: nextcloud
|
||||
url: https://next.mcfetridge.us
|
||||
username: mmcfetridge
|
||||
password: "!Sucyetat123"
|
||||
|
||||
- MyGitea:
|
||||
id: navy
|
||||
tab: Home
|
||||
icon: gitea.png
|
||||
href: https://mygitea.mikemcfetridge.com/
|
||||
widget:
|
||||
type: gitea
|
||||
url: https://mygitea.mikemcfetridge.com/
|
||||
key: 1ba8eac5698e4e1ea9461b814635e5220b707767
|
||||
|
||||
- Gitea:
|
||||
id: navy
|
||||
tab: Home
|
||||
icon: gitea.png
|
||||
href: https://gitea.mikemcfetridge.com/
|
||||
widget:
|
||||
type: gitea
|
||||
url: https://gitea.mikemcfetridge.com/
|
||||
key: 10db6351209bc8cd900f6b03064e5a4f3f971eb3
|
||||
|
||||
|
||||
- BookStack:
|
||||
id: slate
|
||||
tab: Home
|
||||
icon: bookstack.png
|
||||
href: https://book.mikemcfetridge.com/
|
||||
|
||||
|
||||
############################################## MEDIA TAB Services ###########################################################
|
||||
- Media downloader:
|
||||
- Calendar:
|
||||
id: gray
|
||||
tab: Media
|
||||
name: Calendar
|
||||
widget:
|
||||
type: calendar
|
||||
view: agenda
|
||||
maxEvents: 6
|
||||
firstDayInWeek: sunday
|
||||
integrations:
|
||||
- type: sonarr
|
||||
service_group: Media downloader
|
||||
service_name: Sonarr
|
||||
- type: radarr
|
||||
service_group: Media downloader
|
||||
service_name: Radarr
|
||||
|
||||
- Gluetun:
|
||||
id: jade
|
||||
tab: System
|
||||
href: http://192.168.2.8:8000
|
||||
icon: gluetun.png
|
||||
description: Media VPN Server
|
||||
widget:
|
||||
type: gluetun
|
||||
url: http://192.168.2.8:8000
|
||||
fields: ["public_ip", "region", "country"]
|
||||
version: 2 # optional, default is 1
|
||||
|
||||
- Sonarr:
|
||||
id: crimson
|
||||
tab: Media
|
||||
href: http://192.168.2.8:8989
|
||||
icon: sonarr.png
|
||||
description: TV Show Service
|
||||
widget:
|
||||
type: sonarr
|
||||
url: http://192.168.2.8:8989
|
||||
key: b4227fd07fd046f094d620b88d92e494
|
||||
fields: ["wanted", "queued", "series"]
|
||||
|
||||
- Radarr:
|
||||
id: lavender
|
||||
tab: Media
|
||||
href: http://192.168.2.8:7878
|
||||
icon: radarr.png
|
||||
description: Movie Service
|
||||
widget:
|
||||
type: radarr
|
||||
url: http://192.168.2.8:7878
|
||||
key: 9b0e1202f7b94907ba92a1ea23304fa4
|
||||
fields: ["wanted", "missing", "queued", "movies"]
|
||||
|
||||
- Qbittorrent:
|
||||
id: teal
|
||||
tab: Media
|
||||
href: http://192.168.2.8:8080
|
||||
icon: qbittorrent.png
|
||||
description: Download Client
|
||||
widget:
|
||||
type: qbittorrent
|
||||
url: http://192.168.2.8:8080
|
||||
username: admin
|
||||
password: "!Sucyetat123"
|
||||
|
||||
- Media Apps:
|
||||
- Jellyfin:
|
||||
id: violet
|
||||
tab: Media
|
||||
href: http://192.168.2.8:8096
|
||||
icon: jellyfin.png
|
||||
description: Movies & TV Shows
|
||||
widget:
|
||||
type: jellyfin
|
||||
url: http://192.168.2.8:8096
|
||||
key: ffe8e2b31fd24464ac779121e920ac25
|
||||
enableBlocks: true
|
||||
enableNowPlaying: true
|
||||
|
||||
- Jellyseerr:
|
||||
id: aqua
|
||||
tab: Media
|
||||
href: http://192.168.2.8:5055
|
||||
icon: jellyseerr.png
|
||||
description: Movie/show Database
|
||||
widget:
|
||||
type: jellyseerr
|
||||
url: http://192.168.2.8:5055
|
||||
key: MTc4MzM0NDc0OTI1OWY1YzJkYWJkLTA0OWEtNDY0NS05ZTMwLTI3NjFkZjYxNjdhZQ==
|
||||
fields: ["pending", "approved", "available"]
|
||||
|
||||
- Navidrome:
|
||||
id: navy
|
||||
tab: Media
|
||||
icon: navidrome.png
|
||||
href: http://192.168.2.8:4533
|
||||
widget:
|
||||
type: navidrome
|
||||
url: http://192.168.2.8:4533
|
||||
user: mmcfetridge
|
||||
token: 05dee16046666bb05d98291b9c6e39d3
|
||||
salt: 50c05a
|
||||
|
||||
- AudioBookShelf:
|
||||
id: beige
|
||||
tab: Media
|
||||
href: http://192.168.2.8:13378
|
||||
icon: audiobookshelf.png
|
||||
description: Index Server
|
||||
widget:
|
||||
type: audiobookshelf
|
||||
url: http://192.168.2.8:13378
|
||||
key: "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJrZXlJZCI6IjU1MzViZDFiLTI3NGUtNGNjOC1iMWZkLTNiZWFiNjg0NDQ1YiIsIm5hbWUiOiJob21lcGFnZSIsInR5cGUiOiJhcGkiLCJpYXQiOjE3ODM0NjE1NjJ9.BYvicD24tA3lEx_ktwmf6Igme6dpLj1SUrc0Y9ISBMs"
|
||||
fields: ["podcasts", "books"]
|
||||
|
||||
##################################### Network & System TAB Services ##############################################################
|
||||
- Network:
|
||||
- Pi-hole:
|
||||
id: slate
|
||||
tab: Network
|
||||
href: http://192.168.2.5/admin/login
|
||||
icon: pi-hole.png
|
||||
widget:
|
||||
type: pihole
|
||||
url: http://192.168.2.5
|
||||
version: 6
|
||||
key: "!Sucyetat123"
|
||||
fields: ["queries", "blocked", "blocked_percent", "gravity"]
|
||||
|
||||
- Nginx Proxy Manager:
|
||||
id: emerald
|
||||
tab: Network
|
||||
href: http://192.168.2.12:81
|
||||
icon: nginx-proxy-manager.png
|
||||
description: Nginx Proxy Manager
|
||||
widget:
|
||||
type: npm
|
||||
url: http://192.168.2.12:81
|
||||
username: mmcfetridg@aol.com
|
||||
password: "!Sucyetat123"
|
||||
fields: ["enabled", "disabled", "total"]
|
||||
|
||||
- Pangolin:
|
||||
id: salmon
|
||||
tab: Network
|
||||
icon: pangolin.png
|
||||
href: https://app.pangolin.net
|
||||
description: External network
|
||||
widget:
|
||||
type: pangolin
|
||||
url: https://api.pangolin.net
|
||||
key: "w3f8ong2hz7a3da.dappsg2veyo36my5ibsmrmnzd2c2626lyrok7inn"
|
||||
org: org_lsxd0ocafwikxgs
|
||||
fields: ["sites", "resources", "targets"]
|
||||
|
||||
######################################## System TAB Services ######################################################################
|
||||
- Systems:
|
||||
|
||||
- Public IP:
|
||||
icon: mdi-web
|
||||
href: https://whatismyipaddress.com/
|
||||
widget:
|
||||
type: customapi
|
||||
url: https://api.ipify.org?format=json
|
||||
refreshInterval: 3600000 # Refreshes once an hour (in milliseconds)
|
||||
method: GET
|
||||
mappings:
|
||||
- field: ip
|
||||
label: WAN IP
|
||||
format: text
|
||||
|
||||
- Technitium:
|
||||
id: burgundy
|
||||
tab: Network
|
||||
href: http://192.168.2.3:5380
|
||||
icon: technitium.png
|
||||
description: Technitium DNS Server
|
||||
widget:
|
||||
type: technitium
|
||||
url: http://192.168.2.3:5380
|
||||
key: 03348d06cd472fbd091d8232b1c13321ff70a8628dad7b0c23dd4512a18fb34b
|
||||
range: LastDay
|
||||
fields: ["totalQueries", "totalAuthoritative", "totalCached", "totalServerFailure"]
|
||||
|
||||
- PatchMon:
|
||||
id: cyan
|
||||
tab: Network
|
||||
href: https://patch.mikemcfetridge.com
|
||||
description: PatchMon Statistics
|
||||
icon: https://patch.mikemcfetridge.com/assets/logo_square_default.svg
|
||||
widget:
|
||||
type: customapi
|
||||
url: https://patch.mikemcfetridge.com/api/v1/gethomepage/stats
|
||||
headers:
|
||||
Authorization: Basic cGF0Y2htb25fYWVfYzJlZGUxODcyNzI4NDU0MTM1ZWI5ZWE3ZThkYmY1MTY6MzdlMDdlNjM4YjFiMjUzYjIyYWFjMWQ3ODA0ZTdhODExZTM0ZTMzNGM0MDczMjI5YWQwN2EwYjIzODU2NDhhOQ==
|
||||
mappings:
|
||||
- field: total_hosts
|
||||
label: Total Hosts
|
||||
- field: hosts_needing_updates
|
||||
label: Needs Updates
|
||||
- field: security_updates
|
||||
label: Security Updates
|
||||
############################################## Bookmark TAB Services #############################################################
|
||||
|
||||
- Bookmarks:
|
||||
- Github:
|
||||
id: indigo
|
||||
tab: Bookmarks
|
||||
abbr: GH
|
||||
href: https://github.com
|
||||
icon: github-light.png
|
||||
description: GitHub
|
||||
|
||||
- Linkwarden:
|
||||
id: charcoal
|
||||
tab: Bookmarks
|
||||
href: https://lw.mikemcfetridge.com
|
||||
icon: linkwarden.png
|
||||
description: Web Bookmarker
|
||||
widget:
|
||||
type: linkwarden
|
||||
url: http://192.168.2.10:3000
|
||||
key: "eyJhbGciOiJkaXIiLCJlbmMiOiJBMjU2R0NNIn0..ZLJgig_ol-n3i1tv.vhWCnMSHVd81bdidL85-imXKpxGC0U3mHlvmkQyIJqJvcFRRJVBAasw9C0cmfSXVPq08HT-B-3zUAmftnPRymPHMJCkfo8pv_XBbEPneIFH-n59_dg26.qcXSK2REP3M_Vdgp0aOqcA"
|
||||
fields: ["links", "collections"]
|
||||
|
||||
- Semaphore:
|
||||
id: cerulean
|
||||
tab: Bookmarks
|
||||
icon: semaphore.png
|
||||
href: http://192.168.2.7:3020
|
||||
description: CI/CD Automation
|
||||
|
||||
- Wg-Easy:
|
||||
id: rose
|
||||
tab: Bookmarks
|
||||
icon: wireguard.png
|
||||
href: http://192.168.2.7:10086
|
||||
description: Wireguard VPN
|
||||
|
||||
- YouTube:
|
||||
id: coral
|
||||
tab: Bookmarks
|
||||
icon: youtube.png
|
||||
href: https://youtube.com/
|
||||
description: Video Platform
|
||||
|
||||
#
|
||||
@@ -0,0 +1,55 @@
|
||||
---
|
||||
title: Miker's Homepage
|
||||
description: Here is my awesome homepage
|
||||
|
||||
|
||||
background:
|
||||
image: https://backiee.com/static/wallpapers/1000x563/412861.webp
|
||||
blur: sm
|
||||
saturate: 50
|
||||
brightness: 75
|
||||
opacity: 75
|
||||
|
||||
theme: dark
|
||||
color: slate
|
||||
|
||||
layout:
|
||||
Infrastructure:
|
||||
icon: mdi-folder-network
|
||||
tab: Home
|
||||
header: true
|
||||
columns: 3
|
||||
Applications:
|
||||
icon: mdi-application
|
||||
tab: Home
|
||||
header: true
|
||||
columns: 3
|
||||
Media downloader:
|
||||
icon: mdi-multimedia
|
||||
tab: Media
|
||||
header: true
|
||||
columns: 3
|
||||
Media Apps:
|
||||
icon: mdi-movie
|
||||
tab: Media
|
||||
header: true
|
||||
columns: 3
|
||||
Network:
|
||||
tab: System
|
||||
icon: mdi-switch
|
||||
header: true
|
||||
columns: 3
|
||||
Systems:
|
||||
tab: System
|
||||
icon: mdi-television
|
||||
header: true
|
||||
columns: 3
|
||||
Bookmarks:
|
||||
tab: Bookmarks
|
||||
icon: mdi-baby
|
||||
style: row
|
||||
columns: 4
|
||||
|
||||
fiveColumns: true
|
||||
useEqualHeights: true
|
||||
showStats: true
|
||||
@@ -0,0 +1,42 @@
|
||||
# Homepage Widgets Configuration
|
||||
# Organized by System, Environment, and Search
|
||||
- logo:
|
||||
icon: wireguard.svg # optional
|
||||
|
||||
- resources:
|
||||
cpu: true
|
||||
memory: true
|
||||
disk: /
|
||||
cputemp: true
|
||||
tempmin: 0
|
||||
tempmax: 100
|
||||
uptime: true
|
||||
units: imperial
|
||||
refresh: 3000
|
||||
diskUnits: bytes
|
||||
network: true
|
||||
|
||||
- openmeteo:
|
||||
label: Bealeton
|
||||
latitude: 38.5718
|
||||
longitude: -77.7639
|
||||
timezone: America/New_York
|
||||
units: imperial
|
||||
cache: 5
|
||||
format:
|
||||
maximumFractionDigits: 1
|
||||
|
||||
- datetime:
|
||||
text_size: sm
|
||||
format:
|
||||
dateStyle: short
|
||||
timeStyle: short
|
||||
hour12: true
|
||||
timeZone: 'America/New_York'
|
||||
|
||||
# /config/widgets.yaml
|
||||
- search:
|
||||
provider: google # google, duckduckgo, bing, baidu, brave or custom
|
||||
focus: true # Optional, will set focus to the search bar on page load
|
||||
showSearchSuggestions: true # Optional, will show search suggestions. Defaults to false
|
||||
target: _blank # One of _self, _blank, _parent or _top
|
||||
@@ -0,0 +1,30 @@
|
||||
services:
|
||||
|
||||
homepage:
|
||||
image: ghcr.io/gethomepage/homepage:latest
|
||||
container_name: homepage
|
||||
environment:
|
||||
HOMEPAGE_ALLOWED_HOSTS: "*" # required, may need port.
|
||||
PUID: 1000
|
||||
PGID: 1000
|
||||
DOCKER_HOST: tcp://socket-proxy:2375
|
||||
ports:
|
||||
- 3100:3000
|
||||
volumes:
|
||||
- /opt/Docker-Deployments/Homepage/config:/app/config # Make sure your local config directory exists
|
||||
- /opt/Docker-Deployments/Homepage/images:/app/public/images
|
||||
- /var/run/docker.sock:/var/run/docker.sock:ro # optional, for docker integrations
|
||||
networks:
|
||||
- external
|
||||
restart: unless-stopped
|
||||
|
||||
healthcheck:
|
||||
test: ["CMD", "curl", "-f", "http://localhost:3000"]
|
||||
interval: 10s
|
||||
retries: 3
|
||||
timeout: 10s
|
||||
start_period: 30s
|
||||
|
||||
networks:
|
||||
external:
|
||||
external: true # Tells Compose not to create this network
|
||||
Binary file not shown.
|
After Width: | Height: | Size: 1.7 MiB |
Binary file not shown.
|
After Width: | Height: | Size: 1.6 MiB |
Binary file not shown.
|
After Width: | Height: | Size: 1.6 MiB |
@@ -0,0 +1,58 @@
|
||||
services:
|
||||
db:
|
||||
image: 'jc21/mariadb-aria:latest'
|
||||
container_name: npm-db
|
||||
restart: unless-stopped
|
||||
environment:
|
||||
- MYSQL_ROOT_PASSWORD=rhDGjilZm6XEMJ
|
||||
- MYSQL_DATABASE=npm
|
||||
- MYSQL_USER=npm
|
||||
- MYSQL_PASSWORD=rhDGjilZm6XEMJ
|
||||
- MARIADB_AUTO_UPGRADE=1
|
||||
volumes:
|
||||
- /opt/Docker-Deployments/NginxProxyManager/data/mysql:/var/lib/mysql
|
||||
networks:
|
||||
- internal
|
||||
healthcheck:
|
||||
test: ["CMD", "mysqladmin", "ping", "-h", "localhost", "-u$MYSQL_USER", "-p$MYSQL_PASSWORD"]
|
||||
interval: 20s
|
||||
timeout: 5s
|
||||
retries: 5
|
||||
start_period: 30s
|
||||
|
||||
nginx-proxy-manager:
|
||||
image: 'jc21/nginx-proxy-manager:latest'
|
||||
container_name: nginx-proxy-manager
|
||||
restart: unless-stopped
|
||||
environment:
|
||||
- TZ=America/New_York
|
||||
- DB_MYSQL_HOST=db
|
||||
- DB_MYSQL_PORT=3306
|
||||
- DB_MYSQL_USER=npm
|
||||
- DB_MYSQL_PASSWORD=rhDGjilZm6XEMJ
|
||||
- DB_MYSQL_NAME=npm
|
||||
ports:
|
||||
- '80:80'
|
||||
- '81:81'
|
||||
- '443:443'
|
||||
volumes:
|
||||
- /opt/Docker-Deployments/NginxProxyManager/data/npm:/data
|
||||
- /opt/Docker-Deployments/NginxProxyManager/data/letsencrypt:/etc/letsencrypt
|
||||
- /opt/Docker-Deployments/NginxProxyManager/logs:/data/logs
|
||||
depends_on:
|
||||
- db
|
||||
networks:
|
||||
- internal
|
||||
- external
|
||||
healthcheck:
|
||||
test: ["CMD", "curl", "-f", "http://localhost:81/api/status"]
|
||||
interval: 20s
|
||||
timeout: 5s
|
||||
retries: 5
|
||||
start_period: 40s
|
||||
|
||||
networks:
|
||||
internal:
|
||||
external: true
|
||||
external:
|
||||
external: true
|
||||
@@ -0,0 +1,17 @@
|
||||
services:
|
||||
sencho:
|
||||
image: saelix/sencho:latest
|
||||
container_name: sencho
|
||||
restart: unless-stopped
|
||||
ports:
|
||||
- "1852:1852"
|
||||
volumes:
|
||||
- /var/run/docker.sock:/var/run/docker.sock
|
||||
- /opt/Docker-Deployments/Sencho/data:/app/data
|
||||
# Change this line so the container path matches the host path:
|
||||
- /opt/Docker-Deployments:/opt/Docker-Deployments
|
||||
environment:
|
||||
- COMPOSE_DIR=/opt/Docker-Deployments
|
||||
- DATA_DIR=/app/data
|
||||
|
||||
|
||||
@@ -0,0 +1,17 @@
|
||||
TZ=America/New_York
|
||||
WATCHTOWER_CLEANUP=true
|
||||
WATCHTOWER_INCLUDE_RESTARTING=true
|
||||
WATCHTOWER_ROLLING_RESTARTING=true
|
||||
WATCHTOWER_SCHEDULE=0 0 4 * * *
|
||||
WATCHTOWER_INCLUDE_STOPPED=true
|
||||
WATCHTOWER_NOTIFICATIONS=email
|
||||
WATCHTOWER_NOTIFICATIONS_HOSTNAME=Docker-Deply # Add Server Name or IP Address
|
||||
WATCHTOWER_NOTIFICATION_EMAIL_FROM=miker@mmcfetridge.net
|
||||
WATCHTOWER_NOTIFICATION_EMAIL_TO=miker@mmcfetridge.net
|
||||
WATCHTOWER_NOTIFICATION_EMAIL_SERVER=mail.mmcfetridge.net
|
||||
WATCHTOWER_NOTIFICATION_EMAIL_SERVER_PORT=465
|
||||
WATCHTOWER_NOTIFICATION_EMAIL_SERVER_USER=miker@mmcfetridge.net
|
||||
WATCHTOWER_NOTIFICATION_EMAIL_SERVER_PASSWORD=!Sucyetat123
|
||||
WATCHTOWER_NOTIFICATION_EMAIL_DELAY=2
|
||||
PUID=1000
|
||||
PGID=1000
|
||||
@@ -0,0 +1,36 @@
|
||||
services:
|
||||
watchtower:
|
||||
image: containrrr/watchtower
|
||||
container_name: watchtower
|
||||
restart: unless-stopped
|
||||
env_file: .env
|
||||
environment:
|
||||
- DOCKER_API_VERSION=1.44
|
||||
- TZ=America/New_York
|
||||
- PUID:=1000 # Reference PUID from .env
|
||||
- PGID=1000 # Reference PGID from .env
|
||||
- WATCHTOWER_CLEANUP=true
|
||||
- WATCHTOWER_INCLUDE_RESTARTING=true
|
||||
- WATCHTOWER_ROLLING_RESTARTING=true
|
||||
- WATCHTOWER_SCHEDULE=0 0 4 * * *
|
||||
- WATCHTOWER_INCLUDE_STOPPED=true
|
||||
- WATCHTOWER_NOTIFICATIONS=email
|
||||
- WATCHTOWER_NOTIFICATIONS_HOSTNAME=Docker-Deployment # Add Server Name or IP Address
|
||||
- WATCHTOWER_NOTIFICATION_EMAIL_FROM=miker@mmcfetridge.net
|
||||
- WATCHTOWER_NOTIFICATION_EMAIL_TO=miker@mmcfetridge.net
|
||||
- WATCHTOWER_NOTIFICATION_EMAIL_SERVER=mail.mmcfetridge.net
|
||||
- WATCHTOWER_NOTIFICATION_EMAIL_SERVER_PORT=465
|
||||
- WATCHTOWER_NOTIFICATION_EMAIL_SERVER_USER=miker@mmcfetridge.net
|
||||
- WATCHTOWER_NOTIFICATION_EMAIL_SERVER_PASSWORD=!Sucyetat123
|
||||
- WATCHTOWER_NOTIFICATION_EMAIL_DELAY=2
|
||||
security_opt:
|
||||
- no-new-privileges:true
|
||||
volumes:
|
||||
- /etc/timezone:/etc/timezone:ro
|
||||
- /etc/localtime:/etc/localtime:ro
|
||||
- /var/run/docker.sock:/var/run/docker.sock
|
||||
networks:
|
||||
- external
|
||||
networks:
|
||||
external:
|
||||
external: true # Tells Compose not to create this network
|
||||
@@ -0,0 +1,48 @@
|
||||
name: Validate and Deploy Homelab
|
||||
|
||||
on:
|
||||
push:
|
||||
branches: [ "main" ]
|
||||
|
||||
jobs:
|
||||
test-and-deploy:
|
||||
runs-on: ubuntu-latest
|
||||
|
||||
steps:
|
||||
- name: Checkout Repository Code
|
||||
uses: actions/checkout@v4
|
||||
|
||||
- name: Verify Compose File Validity
|
||||
env:
|
||||
DB_ROOT_PASSWORD: ${{ secrets.MYSQL_ROOT_PASSWORD }}
|
||||
DB_PASSWORD: ${{ secrets.MYSQL_PASSWORD }}
|
||||
run: docker compose config
|
||||
|
||||
# --- DEPLOYMENT PHASE ---
|
||||
|
||||
- name: Set up SSH Private Key
|
||||
run: |
|
||||
mkdir -p ~/.ssh
|
||||
echo "${{ secrets.DEPLOY_SSH_KEY }}" > ~/.ssh/id_ed25519
|
||||
chmod 600 ~/.ssh/id_ed25519
|
||||
# Scan the host key to prevent SSH hanging on a manual confirmation prompt
|
||||
ssh-keyscan -H ${{ secrets.DEPLOY_HOST }} >> ~/.ssh/known_hosts
|
||||
|
||||
- name: Create Remote Docker Context
|
||||
run: |
|
||||
# Define a remote endpoint pointing to your live server over SSH
|
||||
docker context create homelab-target \
|
||||
--docker "host=ssh://${{ secrets.DEPLOY_USER }}@${{ secrets.DEPLOY_HOST }}"
|
||||
|
||||
- name: Deploy Containers to Live Server
|
||||
env:
|
||||
# Pass your production secrets to the live deployment step
|
||||
DB_ROOT_PASSWORD: ${{ secrets.MYSQL_ROOT_PASSWORD }}
|
||||
DB_PASSWORD: ${{ secrets.MYSQL_PASSWORD }}
|
||||
run: |
|
||||
echo "Switching Docker context to live server..."
|
||||
docker context use homelab-target
|
||||
|
||||
echo "Pulling latest images and starting services remotely..."
|
||||
# The --project-directory . flag ensures it reads the docker-compose file fetched by Git
|
||||
docker compose --project-directory . up -d --remove-orphans
|
||||
@@ -0,0 +1,54 @@
|
||||
##### My SearXNG personal settings.
|
||||
use_default_settings: true
|
||||
|
||||
general:
|
||||
debug: false
|
||||
instance_name: "McFetridge Private Search" # Changes the name on the homepage and browser tabs
|
||||
|
||||
brand:
|
||||
docs_url: "" # Use empty strings instead of false
|
||||
issue_url: "" # Hides the links without crashing the parser
|
||||
custom:
|
||||
links:
|
||||
"Dockhand": "http://192.168.0.8:3200"
|
||||
"My Dashboard": "http://192.168.0.9:3100"
|
||||
|
||||
server:
|
||||
port: 8080
|
||||
bind_address: "0.0.0.0"
|
||||
secret_key: "ee072bb45348da92be54b5224bee58b982a4279d3531f056b727c4dd3397bc3e"
|
||||
image_proxy: true # Proxies images through your server to protect your IP
|
||||
|
||||
search:
|
||||
default_lang: "en-US" # Force results to a specific region
|
||||
safe_search: 1 # 0 = None, 1 = Moderate, 2 = Strict
|
||||
autocomplete: "duckduckgo" # Upstream source for search suggestions
|
||||
formats:
|
||||
- html
|
||||
- json # Adds API capabilities for external script ingestion
|
||||
|
||||
ui:
|
||||
theme: simple
|
||||
results_on_new_tab: true # Keeps your engine open when browsing links
|
||||
default_locale: "en"
|
||||
default_interface: "general" # The default tab ("general", "images", "videos", "news", "it")
|
||||
|
||||
# This is the standard way to cleanly enable/disable specific engines in SearXNG
|
||||
engines:
|
||||
- name: google
|
||||
disabled: false
|
||||
|
||||
- name: duckduckgo
|
||||
disabled: false
|
||||
|
||||
- name: wikipedia
|
||||
disabled: false
|
||||
|
||||
- name: wikidata
|
||||
disabled: true
|
||||
|
||||
- name: bing
|
||||
disabled: false
|
||||
|
||||
- name: brave
|
||||
disabled: false
|
||||
@@ -0,0 +1,21 @@
|
||||
services:
|
||||
searxng:
|
||||
container_name: searxng
|
||||
image: docker.io/searxng/searxng:latest
|
||||
restart: unless-stopped
|
||||
ports:
|
||||
- "8080:8080"
|
||||
volumes:
|
||||
- /opt/Docker-Deployments/searxng:/etc/searxng:rw
|
||||
- /opt/Docker-Deployments/searxng_cache:/var/cache/searxng:rw
|
||||
environment:
|
||||
- SEARXNG_BASE_URL=https://search.mikemcfetridge.com
|
||||
- UWSGI_WORKERS=${SEARXNG_UWSGI_WORKERS:-4}
|
||||
- UWSGI_THREADS=${SEARXNG_UWSGI_THREADS:-4}
|
||||
healthcheck:
|
||||
test: [ "CMD", "curl", "-f", "http://localhost:8080" ]
|
||||
interval: 10s
|
||||
retries: 3
|
||||
timeout: 10s
|
||||
start_period: 30s
|
||||
|
||||
@@ -0,0 +1,39 @@
|
||||
##### My SearXNG personal settings.
|
||||
use_default_settings: true
|
||||
|
||||
general:
|
||||
debug: false
|
||||
instance_name: "McFetridge Private Search" # Changes the name on the homepage and browser tabs
|
||||
|
||||
brand:
|
||||
docs_url: "" # Use empty strings instead of false
|
||||
issue_url: "" # Hides the links without crashing the parser
|
||||
custom:
|
||||
links:
|
||||
"Dockhand": "http://192.168.0.8:3200"
|
||||
"My Dashboard": "http://192.168.0.9:3100"
|
||||
|
||||
server:
|
||||
port: 8080
|
||||
bind_address: "0.0.0.0"
|
||||
secret_key: "ee072bb45348da92be54b5224bee58b982a4279d3531f056b727c4dd3397bc3e"
|
||||
image_proxy: true # Proxies images through your server to protect your IP
|
||||
|
||||
search:
|
||||
default_lang: "en-US" # Force results to a specific region
|
||||
safe_search: 1 # 0 = None, 1 = Moderate, 2 = Strict
|
||||
autocomplete: "duckduckgo" # Upstream source for search suggestions
|
||||
formats:
|
||||
- html
|
||||
- json # Adds API capabilities for external script ingestion
|
||||
|
||||
ui:
|
||||
theme: simple
|
||||
results_on_new_tab: true # Keeps your engine open when browsing links
|
||||
default_locale: "en"
|
||||
default_interface: "general" # The default tab ("general", "images", "videos", "news", "it")
|
||||
|
||||
# This is the standard way to cleanly enable/disable specific engines in SearXNG
|
||||
engines:
|
||||
- name: wikidata
|
||||
disabled: true
|
||||
@@ -0,0 +1,22 @@
|
||||
services:
|
||||
wgdashboard:
|
||||
image: ghcr.io/wgdashboard/wgdashboard:latest
|
||||
container_name: wgdashboard
|
||||
restart: unless-stopped
|
||||
ports:
|
||||
- "10086:10086/tcp"
|
||||
- "51820:51820/udp"
|
||||
volumes:
|
||||
- /opt/Docker-Deployments/wireguard/conf:/etc/wireguard
|
||||
- /opt/Docker-Deployments/wireguard/data:/data
|
||||
cap_add:
|
||||
- NET_ADMIN
|
||||
networks:
|
||||
- external
|
||||
environment:
|
||||
- GUNICORN_WORKERS=1 # Keeps RAM usage low by only running 1 worker process
|
||||
- GUNICORN_TIMEOUT=120 # Raises timeout to 2 minutes so long tasks don't trigger a restart
|
||||
- GUNICORN_WORKER_CLASS=sync # Prevents threading conflicts during background updates
|
||||
networks:
|
||||
external:
|
||||
external: true # Tells Compose not to create this network..
|
||||
Reference in New Issue
Block a user