├── .all-contributorsrc ├── .devcontainer └── devcontainer.json ├── .github ├── FUNDING.yml ├── PULL_REQUEST_TEMPLATE.yml ├── actions │ └── chart-releaser-action │ │ ├── action.yml │ │ └── cr.sh ├── auto_assign.yml ├── dependabot.yml └── workflows │ ├── check-pihole-docker-versions.yaml │ ├── lint-test.yaml │ ├── prepare.yaml │ ├── release-please.yaml │ └── semantic.yaml ├── .gitignore ├── .release-please-manifest.json ├── CONTRIBUTING.md ├── README.md ├── charts └── pihole │ ├── .helmignore │ ├── CHANGELOG.md │ ├── Chart.yaml │ ├── Makefile │ ├── README.md │ ├── README.md.gotmpl │ ├── ci │ └── monitoring-values.yaml │ ├── docs │ └── Values.md │ ├── examples │ ├── dhcp-values.yaml │ ├── k3s-values.yaml │ └── metallb-values.yaml │ ├── templates │ ├── NOTES.txt │ ├── _helpers.tpl │ ├── configmap-adlists.yaml │ ├── configmap-blacklist.yaml │ ├── configmap-regex.yaml │ ├── configmap-static-dhcp.yaml │ ├── configmap-whitelist.yaml │ ├── configmap.yaml │ ├── deployment.yaml │ ├── extra-manifests.yaml │ ├── ingress.yaml │ ├── pdb.yaml │ ├── podmonitor.yaml │ ├── secret.yaml │ ├── service-dhcp.yaml │ ├── service-dns-tcp.yaml │ ├── service-dns-udp.yaml │ ├── service-dns.yaml │ ├── service-web.yaml │ ├── tests │ │ └── test-pihole-endpoint.yml │ └── volume-claim.yaml │ └── values.yaml ├── classic ├── README.md ├── configmap-pihole-custom-dnsmasq.yml ├── deployment-pihole.yml ├── pvc-pihole.yml ├── sample-metallb-configmap.yaml ├── secret-pihole-webpassword.yaml ├── svc-pihole-tcp.yml └── svc-pihole-udp.yml ├── ct.yaml ├── docs ├── index.yaml ├── pihole-0.1.2.tgz ├── pihole-0.1.3.tgz ├── pihole-1.0.0.tgz ├── pihole-1.1.0.tgz ├── pihole-1.2.0.tgz └── screenshot.png ├── example ├── README.md └── values.yaml ├── index.yaml ├── package-lock.json ├── package.json └── release-please-config.json /.all-contributorsrc: -------------------------------------------------------------------------------- 1 | { 2 | "files": [ 3 | "README.md", 4 | "charts/pihole/README.md", 5 | "charts/pihole/README.md.gotmpl" 6 | ], 7 | "imageSize": 100, 8 | "commit": false, 9 | "badgeTemplate": "[![All Contributors](https://img.shields.io/badge/all_contributors-27-blue.svg?style=flat-square)](#contributors-)", 10 | "contributorTemplate": "\">\" width=\"<%= options.imageSize %>px;\" alt=\"\"/>
<%= contributor.name %>
", 11 | "contributors": [ 12 | { 13 | "login": "MoJo2600", 14 | "name": "Christian Erhardt", 15 | "avatar_url": "https://avatars1.githubusercontent.com/u/2462817?v=4", 16 | "profile": "http://www.mojo2k.de", 17 | "contributions": [ 18 | "code" 19 | ] 20 | }, 21 | { 22 | "login": "billimek", 23 | "name": "Jeff Billimek", 24 | "avatar_url": "https://avatars0.githubusercontent.com/u/6393612?v=4", 25 | "profile": "https://billimek.com/", 26 | "contributions": [ 27 | "code" 28 | ] 29 | }, 30 | { 31 | "login": "imle", 32 | "name": "Steven Imle", 33 | "avatar_url": "https://avatars3.githubusercontent.com/u/4809109?v=4", 34 | "profile": "https://github.com/imle", 35 | "contributions": [ 36 | "code" 37 | ] 38 | }, 39 | { 40 | "login": "jetersen", 41 | "name": "Joseph Petersen", 42 | "avatar_url": "https://avatars2.githubusercontent.com/u/1661688?v=4", 43 | "profile": "https://github.com/jetersen", 44 | "contributions": [ 45 | "code" 46 | ] 47 | }, 48 | { 49 | "login": "SiM22", 50 | "name": "Simon Garcia", 51 | "avatar_url": "https://avatars2.githubusercontent.com/u/5759618?v=4", 52 | "profile": "https://github.com/SiM22", 53 | "contributions": [ 54 | "code" 55 | ] 56 | }, 57 | { 58 | "login": "AndyG-0", 59 | "name": "Andy Gilbreath", 60 | "avatar_url": "https://avatars1.githubusercontent.com/u/29743443?v=4", 61 | "profile": "https://github.com/AndyG-0", 62 | "contributions": [ 63 | "code" 64 | ] 65 | }, 66 | { 67 | "login": "northerngit", 68 | "name": "James Wilson", 69 | "avatar_url": "https://avatars0.githubusercontent.com/u/4513272?v=4", 70 | "profile": "https://github.com/northerngit", 71 | "contributions": [ 72 | "code" 73 | ] 74 | }, 75 | { 76 | "login": "jskswamy", 77 | "name": "Krishnaswamy Subramanian", 78 | "avatar_url": "https://avatars2.githubusercontent.com/u/232449?v=4", 79 | "profile": "https://github.com/jskswamy", 80 | "contributions": [ 81 | "code" 82 | ] 83 | }, 84 | { 85 | "login": "luqasn", 86 | "name": "Lucas Romero", 87 | "avatar_url": "https://avatars2.githubusercontent.com/u/274902?v=4", 88 | "profile": "https://github.com/luqasn", 89 | "contributions": [ 90 | "code" 91 | ] 92 | }, 93 | { 94 | "login": "konturn", 95 | "name": "konturn", 96 | "avatar_url": "https://avatars0.githubusercontent.com/u/35545508?v=4", 97 | "profile": "https://github.com/konturn", 98 | "contributions": [ 99 | "code" 100 | ] 101 | }, 102 | { 103 | "login": "tdorsey", 104 | "name": "tdorsey", 105 | "avatar_url": "https://avatars3.githubusercontent.com/u/1218404?v=4", 106 | "profile": "https://github.com/tdorsey", 107 | "contributions": [ 108 | "code" 109 | ] 110 | }, 111 | { 112 | "login": "alesz", 113 | "name": "Ales Zelenik", 114 | "avatar_url": "https://avatars0.githubusercontent.com/u/12436980?v=4", 115 | "profile": "https://github.com/alesz", 116 | "contributions": [ 117 | "code" 118 | ] 119 | }, 120 | { 121 | "login": "dtourde", 122 | "name": "Damien TOURDE", 123 | "avatar_url": "https://avatars1.githubusercontent.com/u/49169262?v=4", 124 | "profile": "https://github.com/dtourde", 125 | "contributions": [ 126 | "code" 127 | ] 128 | }, 129 | { 130 | "login": "putz612", 131 | "name": "Jason Sievert", 132 | "avatar_url": "https://avatars3.githubusercontent.com/u/952758?v=4", 133 | "profile": "https://github.com/putz612", 134 | "contributions": [ 135 | "code" 136 | ] 137 | }, 138 | { 139 | "login": "joshua-nord", 140 | "name": "joshua-nord", 141 | "avatar_url": "https://avatars2.githubusercontent.com/u/1181300?v=4", 142 | "profile": "https://github.com/joshua-nord", 143 | "contributions": [ 144 | "code" 145 | ] 146 | }, 147 | { 148 | "login": "mbode", 149 | "name": "Maximilian Bode", 150 | "avatar_url": "https://avatars3.githubusercontent.com/u/9051309?v=4", 151 | "profile": "https://maximilianbo.de/", 152 | "contributions": [ 153 | "code" 154 | ] 155 | }, 156 | { 157 | "login": "raackley", 158 | "name": "raackley", 159 | "avatar_url": "https://avatars0.githubusercontent.com/u/1700688?v=4", 160 | "profile": "https://github.com/raackley", 161 | "contributions": [ 162 | "code" 163 | ] 164 | }, 165 | { 166 | "login": "StoicPerlman", 167 | "name": "Sam Kleiner", 168 | "avatar_url": "https://avatars1.githubusercontent.com/u/3152359?v=4", 169 | "profile": "https://github.com/StoicPerlman", 170 | "contributions": [ 171 | "code" 172 | ] 173 | }, 174 | { 175 | "login": "arpankapoor", 176 | "name": "Arpan Kapoor", 177 | "avatar_url": "https://avatars3.githubusercontent.com/u/3677810?v=4", 178 | "profile": "https://arpankapoor.com/", 179 | "contributions": [ 180 | "code" 181 | ] 182 | }, 183 | { 184 | "login": "chrodriguez", 185 | "name": "Christian Rodriguez", 186 | "avatar_url": "https://avatars1.githubusercontent.com/u/1460882?v=4", 187 | "profile": "https://github.com/chrodriguez", 188 | "contributions": [ 189 | "code" 190 | ] 191 | }, 192 | { 193 | "login": "davecahill", 194 | "name": "Dave Cahill", 195 | "avatar_url": "https://avatars0.githubusercontent.com/u/361096?v=4", 196 | "profile": "http://dave-cahill.com/", 197 | "contributions": [ 198 | "code" 199 | ] 200 | }, 201 | { 202 | "login": "golgoth31", 203 | "name": "golgoth31", 204 | "avatar_url": "https://avatars2.githubusercontent.com/u/5741421?v=4", 205 | "profile": "https://github.com/golgoth31", 206 | "contributions": [ 207 | "code" 208 | ] 209 | }, 210 | { 211 | "login": "gjeanmart", 212 | "name": "Greg Jeanmart", 213 | "avatar_url": "https://avatars3.githubusercontent.com/u/506784?v=4", 214 | "profile": "https://greg.jeanmart.me/", 215 | "contributions": [ 216 | "code" 217 | ] 218 | }, 219 | { 220 | "login": "ballj", 221 | "name": "Joseph Ball", 222 | "avatar_url": "https://avatars1.githubusercontent.com/u/38097813?v=4", 223 | "profile": "https://github.com/ballj", 224 | "contributions": [ 225 | "code" 226 | ] 227 | }, 228 | { 229 | "login": "OnekO", 230 | "name": "Karlos", 231 | "avatar_url": "https://avatars2.githubusercontent.com/u/4233214?v=4", 232 | "profile": "http://www.oneko.org/", 233 | "contributions": [ 234 | "code" 235 | ] 236 | }, 237 | { 238 | "login": "dza89", 239 | "name": "dza89", 240 | "avatar_url": "https://avatars0.githubusercontent.com/u/20373984?v=4", 241 | "profile": "https://github.com/dza89", 242 | "contributions": [ 243 | "code" 244 | ] 245 | }, 246 | { 247 | "login": "mikewhitley", 248 | "name": "mikewhitley", 249 | "avatar_url": "https://avatars0.githubusercontent.com/u/52802633?v=4", 250 | "profile": "https://github.com/mikewhitley", 251 | "contributions": [ 252 | "code" 253 | ] 254 | }, 255 | { 256 | "login": "Vashiru", 257 | "name": "Vashiru", 258 | "avatar_url": "https://avatars2.githubusercontent.com/u/11370057?v=4", 259 | "profile": "https://github.com/Vashiru", 260 | "contributions": [ 261 | "code" 262 | ] 263 | }, 264 | { 265 | "login": "sam-kleiner", 266 | "name": "sam-kleiner", 267 | "avatar_url": "https://avatars.githubusercontent.com/u/63059772?v=4", 268 | "profile": "https://github.com/sam-kleiner", 269 | "contributions": [ 270 | "code" 271 | ] 272 | }, 273 | { 274 | "login": "alexgorbatchev", 275 | "name": "Alex Gorbatchev", 276 | "avatar_url": "https://avatars.githubusercontent.com/u/65633?v=4", 277 | "profile": "https://www.linkedin.com/in/alexgorbatchev/", 278 | "contributions": [ 279 | "code" 280 | ] 281 | }, 282 | { 283 | "login": "c-yco", 284 | "name": "Alexander Rabenstein", 285 | "avatar_url": "https://avatars.githubusercontent.com/u/355591?v=4", 286 | "profile": "https://github.com/c-yco", 287 | "contributions": [ 288 | "code" 289 | ] 290 | }, 291 | { 292 | "login": "tibbon", 293 | "name": "David Fisher", 294 | "avatar_url": "https://avatars.githubusercontent.com/u/82880?v=4", 295 | "profile": "http://tibbon.com/", 296 | "contributions": [ 297 | "code" 298 | ] 299 | }, 300 | { 301 | "login": "utkuozdemir", 302 | "name": "Utku Özdemir", 303 | "avatar_url": "https://avatars.githubusercontent.com/u/1465819?v=4", 304 | "profile": "https://github.com/utkuozdemir", 305 | "contributions": [ 306 | "code" 307 | ] 308 | }, 309 | { 310 | "login": "morremeyer", 311 | "name": "Morre Meyer", 312 | "avatar_url": "https://avatars.githubusercontent.com/u/7683567?v=4", 313 | "profile": "https://mor.re/", 314 | "contributions": [ 315 | "code" 316 | ] 317 | }, 318 | { 319 | "login": "johnsondnz", 320 | "name": "Donald Johnson", 321 | "avatar_url": "https://avatars.githubusercontent.com/u/7608966?v=4", 322 | "profile": "https://github.com/johnsondnz", 323 | "contributions": [ 324 | "code" 325 | ] 326 | }, 327 | { 328 | "login": "wrmilling", 329 | "name": "Winston R. Milling", 330 | "avatar_url": "https://avatars.githubusercontent.com/u/6162814?v=4", 331 | "profile": "https://winston.milli.ng/", 332 | "contributions": [ 333 | "code" 334 | ] 335 | }, 336 | { 337 | "login": "larivierec", 338 | "name": "Christopher Larivière", 339 | "avatar_url": "https://avatars.githubusercontent.com/u/3633214?v=4", 340 | "profile": "https://github.com/larivierec", 341 | "contributions": [ 342 | "code" 343 | ] 344 | }, 345 | { 346 | "login": "jsievenpiper", 347 | "name": "Justin Sievenpiper", 348 | "avatar_url": "https://avatars.githubusercontent.com/u/1131882?v=4", 349 | "profile": "https://sievenpiper.co/", 350 | "contributions": [ 351 | "code" 352 | ] 353 | }, 354 | { 355 | "login": "beastob", 356 | "name": "beastob", 357 | "avatar_url": "https://avatars.githubusercontent.com/u/76816315?v=4", 358 | "profile": "https://github.com/beastob", 359 | "contributions": [ 360 | "code" 361 | ] 362 | }, 363 | { 364 | "login": "muhlba91", 365 | "name": "Daniel Mühlbachler-Pietrzykowski", 366 | "avatar_url": "https://avatars.githubusercontent.com/u/653739?v=4", 367 | "profile": "https://niftyside.io/", 368 | "contributions": [ 369 | "code" 370 | ] 371 | }, 372 | { 373 | "login": "consideRatio", 374 | "name": "Erik Sundell", 375 | "avatar_url": "https://avatars.githubusercontent.com/u/3837114?v=4", 376 | "profile": "https://github.com/consideRatio", 377 | "contributions": [ 378 | "code" 379 | ] 380 | }, 381 | { 382 | "login": "Ornias1993", 383 | "name": "Kjeld Schouten-Lebbing", 384 | "avatar_url": "https://avatars.githubusercontent.com/u/7613738?v=4", 385 | "profile": "https://github.com/Ornias1993", 386 | "contributions": [ 387 | "code" 388 | ] 389 | }, 390 | { 391 | "login": "mrwulf", 392 | "name": "Brandon Wulf", 393 | "avatar_url": "https://avatars.githubusercontent.com/u/2494769?v=4", 394 | "profile": "https://github.com/mrwulf", 395 | "contributions": [ 396 | "code" 397 | ] 398 | }, 399 | { 400 | "login": "DerRockWolf", 401 | "name": "DerRockWolf", 402 | "avatar_url": "https://avatars.githubusercontent.com/u/50499906?v=4", 403 | "profile": "https://github.com/DerRockWolf", 404 | "contributions": [ 405 | "code" 406 | ] 407 | }, 408 | { 409 | "login": "brnl", 410 | "name": "brnl", 411 | "avatar_url": "https://avatars.githubusercontent.com/u/3243133?v=4", 412 | "profile": "https://github.com/brnl", 413 | "contributions": [ 414 | "code" 415 | ] 416 | }, 417 | { 418 | "login": "rafaelgaspar", 419 | "name": "Rafael Gaspar", 420 | "avatar_url": "https://avatars.githubusercontent.com/u/5567?v=4", 421 | "profile": "https://rafaelgaspar.xyz/", 422 | "contributions": [ 423 | "code" 424 | ] 425 | }, 426 | { 427 | "login": "ChadiEM", 428 | "name": "Chadi El Masri", 429 | "avatar_url": "https://avatars.githubusercontent.com/u/1502811?v=4", 430 | "profile": "https://chadimasri.com/", 431 | "contributions": [ 432 | "code" 433 | ] 434 | }, 435 | { 436 | "login": "dfoulkes", 437 | "name": "Dan Foulkes", 438 | "avatar_url": "https://avatars.githubusercontent.com/u/8113674?v=4", 439 | "profile": "https://github.com/dfoulkes", 440 | "contributions": [ 441 | "code" 442 | ] 443 | }, 444 | { 445 | "login": "george124816", 446 | "name": "George Rodrigues", 447 | "avatar_url": "https://avatars.githubusercontent.com/u/26443736?v=4", 448 | "profile": "https://github.com/george124816", 449 | "contributions": [ 450 | "code" 451 | ] 452 | }, 453 | { 454 | "login": "pascaliske", 455 | "name": "Pascal Iske", 456 | "avatar_url": "https://avatars.githubusercontent.com/u/7473880?v=4", 457 | "profile": "https://pascaliske.dev/", 458 | "contributions": [ 459 | "code" 460 | ] 461 | }, 462 | { 463 | "login": "Blamas", 464 | "name": "Theo REY", 465 | "avatar_url": "https://avatars.githubusercontent.com/u/23526880?v=4", 466 | "profile": "https://www.reyth.dev/", 467 | "contributions": [ 468 | "code" 469 | ] 470 | }, 471 | { 472 | "login": "piwi3910", 473 | "name": "Watteel Pascal", 474 | "avatar_url": "https://avatars.githubusercontent.com/u/12539757?v=4", 475 | "profile": "https://github.com/piwi3910", 476 | "contributions": [ 477 | "code" 478 | ] 479 | }, 480 | { 481 | "login": "frittenlab", 482 | "name": "simon", 483 | "avatar_url": "https://avatars.githubusercontent.com/u/29921946?v=4", 484 | "profile": "https://github.com/frittenlab", 485 | "contributions": [ 486 | "code" 487 | ] 488 | }, 489 | { 490 | "login": "vince-vibin", 491 | "name": "Vincent", 492 | "avatar_url": "https://avatars.githubusercontent.com/u/99386370?v=4", 493 | "profile": "https://github.com/vince-vibin", 494 | "contributions": [ 495 | "code" 496 | ] 497 | }, 498 | { 499 | "login": "Keydrain", 500 | "name": "Clint", 501 | "avatar_url": "https://avatars.githubusercontent.com/u/5723055?v=4", 502 | "profile": "https://github.com/Keydrain", 503 | "contributions": [ 504 | "code" 505 | ] 506 | }, 507 | { 508 | "login": "tamcore", 509 | "name": "Philipp B.", 510 | "avatar_url": "https://avatars.githubusercontent.com/u/319917?v=4", 511 | "profile": "https://github.com/tamcore", 512 | "contributions": [ 513 | "code" 514 | ] 515 | }, 516 | { 517 | "login": "ebCrypto", 518 | "name": "ebCrypto", 519 | "avatar_url": "https://avatars.githubusercontent.com/u/44279886?v=4", 520 | "profile": "https://github.com/ebCrypto", 521 | "contributions": [ 522 | "code" 523 | ] 524 | }, 525 | { 526 | "login": "kenlasko", 527 | "name": "Ken Lasko", 528 | "avatar_url": "https://avatars.githubusercontent.com/u/44060527?v=4", 529 | "profile": "https://ucdialplans.com/", 530 | "contributions": [ 531 | "code" 532 | ] 533 | }, 534 | { 535 | "login": "mbund", 536 | "name": "Mark Bundschuh", 537 | "avatar_url": "https://avatars.githubusercontent.com/u/25110595?v=4", 538 | "profile": "https://github.com/mbund", 539 | "contributions": [ 540 | "code" 541 | ] 542 | }, 543 | { 544 | "login": "ekeih", 545 | "name": "Max Rosin", 546 | "avatar_url": "https://avatars.githubusercontent.com/u/3430656?v=4", 547 | "profile": "https://fotoallerlei.com/", 548 | "contributions": [ 549 | "code" 550 | ] 551 | }, 552 | { 553 | "login": "yzeng1314", 554 | "name": "Yang", 555 | "avatar_url": "https://avatars.githubusercontent.com/u/6365365?v=4", 556 | "profile": "https://github.com/yzeng1314", 557 | "contributions": [ 558 | "code" 559 | ] 560 | }, 561 | { 562 | "login": "dwarf-king-hreidmar", 563 | "name": "dwarf-king-hreidmar", 564 | "avatar_url": "https://avatars.githubusercontent.com/u/45319558?v=4", 565 | "profile": "https://github.com/dwarf-king-hreidmar", 566 | "contributions": [ 567 | "code" 568 | ] 569 | }, 570 | { 571 | "login": "s94santos", 572 | "name": "s94santos", 573 | "avatar_url": "https://avatars.githubusercontent.com/u/10950164?v=4", 574 | "profile": "https://github.com/s94santos", 575 | "contributions": [ 576 | "code" 577 | ] 578 | }, 579 | { 580 | "login": "adamrdavid", 581 | "name": "Adam David", 582 | "avatar_url": "https://avatars.githubusercontent.com/u/1854876?v=4", 583 | "profile": "https://github.com/adamrdavid", 584 | "contributions": [ 585 | "code" 586 | ] 587 | }, 588 | { 589 | "login": "bkonicek", 590 | "name": "Ben Konicek", 591 | "avatar_url": "https://avatars.githubusercontent.com/u/7397530?v=4", 592 | "profile": "https://github.com/bkonicek", 593 | "contributions": [ 594 | "code" 595 | ] 596 | }, 597 | { 598 | "login": "Gabisonfire", 599 | "name": "Gabisonfire", 600 | "avatar_url": "https://avatars.githubusercontent.com/u/6416239?v=4", 601 | "profile": "https://github.com/Gabisonfire", 602 | "contributions": [ 603 | "code" 604 | ] 605 | }, 606 | { 607 | "login": "giolekva", 608 | "name": "Giorgi Lekveishvili", 609 | "avatar_url": "https://avatars.githubusercontent.com/u/124899?v=4", 610 | "profile": "https://github.com/giolekva", 611 | "contributions": [ 612 | "code" 613 | ] 614 | }, 615 | { 616 | "login": "paimonsoror", 617 | "name": "Paimon Sorornejad", 618 | "avatar_url": "https://avatars.githubusercontent.com/u/935046?v=4", 619 | "profile": "https://github.com/paimonsoror", 620 | "contributions": [ 621 | "code" 622 | ] 623 | }, 624 | { 625 | "login": "mivek", 626 | "name": "Jean-Kevin KPADEY", 627 | "avatar_url": "https://avatars.githubusercontent.com/u/9912558?v=4", 628 | "profile": "https://github.com/mivek", 629 | "contributions": [ 630 | "code" 631 | ] 632 | }, 633 | { 634 | "login": "aogier", 635 | "name": "Alessandro Ogier", 636 | "avatar_url": "https://avatars.githubusercontent.com/u/321364?v=4", 637 | "profile": "https://github.com/aogier", 638 | "contributions": [ 639 | "code" 640 | ] 641 | }, 642 | { 643 | "login": "Luukvdm", 644 | "name": "Luuk v/d Maagdenberg", 645 | "avatar_url": "https://avatars.githubusercontent.com/u/25098818?v=4", 646 | "profile": "https://github.com/Luukvdm", 647 | "contributions": [ 648 | "code" 649 | ] 650 | }, 651 | { 652 | "login": "sunsided", 653 | "name": "Markus Mayer", 654 | "avatar_url": "https://avatars.githubusercontent.com/u/495335?v=4", 655 | "profile": "https://github.com/sunsided", 656 | "contributions": [ 657 | "code" 658 | ] 659 | }, 660 | { 661 | "login": "prfj", 662 | "name": "Paulo Jesus", 663 | "avatar_url": "https://avatars.githubusercontent.com/u/37109548?v=4", 664 | "profile": "https://github.com/prfj", 665 | "contributions": [ 666 | "code" 667 | ] 668 | }, 669 | { 670 | "login": "bergpb", 671 | "name": "Lindemberg Barbosa", 672 | "avatar_url": "https://avatars.githubusercontent.com/u/11005963?v=4", 673 | "profile": "https://blog.bergpb.dev/", 674 | "contributions": [ 675 | "code" 676 | ] 677 | }, 678 | { 679 | "login": "ricardochaves", 680 | "name": "Ricardo Baltazar Chaves", 681 | "avatar_url": "https://avatars.githubusercontent.com/u/1923140?v=4", 682 | "profile": "https://ricardobaltazar.com/", 683 | "contributions": [ 684 | "code" 685 | ] 686 | }, 687 | { 688 | "login": "wolviecb", 689 | "name": "Thomas Andrade", 690 | "avatar_url": "https://avatars.githubusercontent.com/u/13783824?v=4", 691 | "profile": "https://github.com/wolviecb", 692 | "contributions": [ 693 | "code" 694 | ] 695 | }, 696 | { 697 | "login": "alexinthesky", 698 | "name": "Alexandre Chappaz", 699 | "avatar_url": "https://avatars.githubusercontent.com/u/14876221?v=4", 700 | "profile": "https://github.com/alexinthesky", 701 | "contributions": [ 702 | "code" 703 | ] 704 | }, 705 | { 706 | "login": "cristiklein", 707 | "name": "Cristian Klein", 708 | "avatar_url": "https://avatars.githubusercontent.com/u/1660833?v=4", 709 | "profile": "https://github.com/cristiklein", 710 | "contributions": [ 711 | "code" 712 | ] 713 | }, 714 | { 715 | "login": "jpflouret", 716 | "name": "JP Flouret", 717 | "avatar_url": "https://avatars.githubusercontent.com/u/9397098?v=4", 718 | "profile": "http://flouret.com/", 719 | "contributions": [ 720 | "code" 721 | ] 722 | }, 723 | { 724 | "login": "fernferret", 725 | "name": "Eric", 726 | "avatar_url": "https://avatars.githubusercontent.com/u/72811?v=4", 727 | "profile": "https://github.com/fernferret", 728 | "contributions": [ 729 | "code" 730 | ] 731 | } 732 | ], 733 | "contributorsPerLine": 7, 734 | "projectName": "pihole-kubernetes", 735 | "projectOwner": "MoJo2600", 736 | "repoType": "github", 737 | "repoHost": "https://github.com", 738 | "skipCi": true, 739 | "commitConvention": "none" 740 | } 741 | -------------------------------------------------------------------------------- /.devcontainer/devcontainer.json: -------------------------------------------------------------------------------- 1 | // For format details, see https://aka.ms/devcontainer.json. For config options, see the 2 | // README at: https://github.com/devcontainers/templates/tree/main/src/javascript-node 3 | { 4 | "name": "Node.js", 5 | // Or use a Dockerfile or Docker Compose file. More info: https://containers.dev/guide/dockerfile 6 | "image": "mcr.microsoft.com/devcontainers/javascript-node:1-22-bookworm" 7 | 8 | // Features to add to the dev container. More info: https://containers.dev/features. 9 | // "features": {}, 10 | 11 | // Use 'forwardPorts' to make a list of ports inside the container available locally. 12 | // "forwardPorts": [], 13 | 14 | // Use 'postCreateCommand' to run commands after the container is created. 15 | // "postCreateCommand": "yarn install", 16 | 17 | // Configure tool-specific properties. 18 | // "customizations": {}, 19 | 20 | // Uncomment to connect as root instead. More info: https://aka.ms/dev-containers-non-root. 21 | // "remoteUser": "root" 22 | } 23 | -------------------------------------------------------------------------------- /.github/FUNDING.yml: -------------------------------------------------------------------------------- 1 | # These are supported funding model platforms 2 | 3 | #github: # Replace with up to 4 GitHub Sponsors-enabled usernames e.g., [user1, user2] 4 | #patreon: # Replace with a single Patreon username 5 | #open_collective: # Replace with a single Open Collective username 6 | ko_fi: mojo2600 7 | #tidelift: # Replace with a single Tidelift platform-name/package-name e.g., npm/babel 8 | #community_bridge: # Replace with a single Community Bridge project-name e.g., cloud-foundry 9 | #liberapay: # Replace with a single Liberapay username 10 | #issuehunt: # Replace with a single IssueHunt username 11 | #otechie: # Replace with a single Otechie username 12 | #custom: # Replace with up to 4 custom sponsorship URLs e.g., ['link1', 'link2'] 13 | -------------------------------------------------------------------------------- /.github/PULL_REQUEST_TEMPLATE.yml: -------------------------------------------------------------------------------- 1 | 12 | 13 | ### Description of the change 14 | 15 | 16 | 17 | ### Benefits 18 | 19 | 20 | 21 | ### Possible drawbacks 22 | 23 | 24 | 25 | ### Applicable issues 26 | 27 | 28 | - fixes # 29 | 30 | ### Additional information 31 | 32 | 33 | 34 | ### Checklist 35 | 36 | 37 | 38 | - [ ] Variables are documented in the values.yaml they will be automatically added to README.md during deployment 39 | - [ ] Title of the pull request follows [conventional commits](https://www.conventionalcommits.org/en/v1.0.0/) 40 | - [ ] All commits signed off and in agreement of [Developer Certificate of Origin (DCO)](https://github.com/MoJo2600/pihole-kubernetes/blob/main/CONTRIBUTING.md#sign-your-work) -------------------------------------------------------------------------------- /.github/actions/chart-releaser-action/action.yml: -------------------------------------------------------------------------------- 1 | name: "Helm Chart Releaser" 2 | description: "Host a Helm charts repo on GitHub Pages" 3 | author: "The Helm authors" 4 | branding: 5 | color: blue 6 | icon: anchor 7 | inputs: 8 | version: 9 | description: "The chart-releaser version to use (default: v1.5.0)" 10 | required: false 11 | default: v1.5.0 12 | config: 13 | description: "The relative path to the chart-releaser config file" 14 | required: false 15 | charts_dir: 16 | description: The charts directory 17 | required: false 18 | default: charts 19 | install_dir: 20 | description: "Where to install the cr tool" 21 | required: false 22 | install_only: 23 | description: "Just install cr tool" 24 | required: false 25 | skip_packaging: 26 | description: "Skip the packaging option (do your custom packaging before running this action)" 27 | required: false 28 | skip_existing: 29 | description: "Skip package upload if release exists" 30 | required: false 31 | mark_as_latest: 32 | description: Mark the created GitHub release as 'latest' 33 | required: false 34 | default: true 35 | 36 | runs: 37 | using: composite 38 | steps: 39 | - run: | 40 | owner=$(cut -d '/' -f 1 <<< "$GITHUB_REPOSITORY") 41 | repo=$(cut -d '/' -f 2 <<< "$GITHUB_REPOSITORY") 42 | 43 | args=(--owner "$owner" --repo "$repo") 44 | args+=(--charts-dir "${{ inputs.charts_dir }}") 45 | 46 | if [[ -n "${{ inputs.version }}" ]]; then 47 | args+=(--version "${{ inputs.version }}") 48 | fi 49 | 50 | if [[ -n "${{ inputs.config }}" ]]; then 51 | args+=(--config "${{ inputs.config }}") 52 | fi 53 | 54 | if [[ -z "${{ inputs.install_dir }}" ]]; then 55 | install="$RUNNER_TOOL_CACHE/cr/${{ inputs.version }}/$(uname -m)" 56 | echo "$install" >> "$GITHUB_PATH" 57 | args+=(--install-dir "$install") 58 | else 59 | echo ${{ inputs.install_dir }} >> "$GITHUB_PATH" 60 | args+=(--install-dir "${{ inputs.install_dir }}") 61 | fi 62 | 63 | if [[ -n "${{ inputs.install_only }}" ]]; then 64 | args+=(--install-only "${{ inputs.install_only }}") 65 | fi 66 | 67 | if [[ -n "${{ inputs.skip_packaging }}" ]]; then 68 | args+=(--skip-packaging "${{ inputs.skip_packaging }}") 69 | fi 70 | 71 | if [[ -n "${{ inputs.skip_existing }}" ]]; then 72 | args+=(--skip-existing "${{ inputs.skip_existing }}") 73 | fi 74 | 75 | if [[ -n "${{ inputs.mark_as_latest }}" ]]; then 76 | args+=(--mark-as-latest "${{ inputs.mark_as_latest }}") 77 | fi 78 | 79 | "$GITHUB_ACTION_PATH/cr.sh" "${args[@]}" 80 | shell: bash -------------------------------------------------------------------------------- /.github/actions/chart-releaser-action/cr.sh: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env bash 2 | 3 | # Copyright The Helm Authors 4 | # 5 | # Licensed under the Apache License, Version 2.0 (the "License"); 6 | # you may not use this file except in compliance with the License. 7 | # You may obtain a copy of the License at 8 | # 9 | # https://www.apache.org/licenses/LICENSE-2.0 10 | # 11 | # Unless required by applicable law or agreed to in writing, software 12 | # distributed under the License is distributed on an "AS IS" BASIS, 13 | # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 14 | # See the License for the specific language governing permissions and 15 | # limitations under the License. 16 | 17 | set -o errexit 18 | set -o nounset 19 | set -o pipefail 20 | 21 | DEFAULT_CHART_RELEASER_VERSION=v1.5.0 22 | 23 | show_help() { 24 | cat << EOF 25 | Usage: $(basename "$0") 26 | 27 | -h, --help Display help 28 | -v, --version The chart-releaser version to use (default: $DEFAULT_CHART_RELEASER_VERSION)" 29 | --config The path to the chart-releaser config file 30 | -d, --charts-dir The charts directory (default: charts) 31 | -o, --owner The repo owner 32 | -r, --repo The repo name 33 | -n, --install-dir The Path to install the cr tool 34 | -i, --install-only Just install the cr tool 35 | -s, --skip-packaging Skip the packaging step (run your own packaging before using the releaser) 36 | --skip-existing Skip package upload if release exists 37 | -l, --mark-as-latest Mark the created GitHub release as 'latest' (default: true) 38 | EOF 39 | } 40 | 41 | main() { 42 | local version="$DEFAULT_CHART_RELEASER_VERSION" 43 | local config= 44 | local charts_dir=charts 45 | local owner= 46 | local repo= 47 | local install_dir= 48 | local install_only= 49 | local skip_packaging= 50 | local skip_existing= 51 | local mark_as_latest=true 52 | 53 | parse_command_line "$@" 54 | 55 | : "${CR_TOKEN:?Environment variable CR_TOKEN must be set}" 56 | 57 | local repo_root 58 | repo_root=$(git rev-parse --show-toplevel) 59 | pushd "$repo_root" > /dev/null 60 | 61 | if ! [[ -n "$skip_packaging" ]]; then 62 | echo 'Looking up latest tag...' 63 | local latest_tag 64 | latest_tag=$(lookup_latest_tag) 65 | 66 | echo "Discovering changed charts since '$latest_tag'..." 67 | local changed_charts=() 68 | readarray -t changed_charts <<< "$(lookup_changed_charts "$latest_tag")" 69 | 70 | if [[ -n "${changed_charts[*]}" ]]; then 71 | install_chart_releaser 72 | 73 | rm -rf .cr-release-packages 74 | mkdir -p .cr-release-packages 75 | 76 | rm -rf .cr-index 77 | mkdir -p .cr-index 78 | 79 | for chart in "${changed_charts[@]}"; do 80 | if [[ -d "$chart" ]]; then 81 | package_chart "$chart" 82 | else 83 | echo "Chart '$chart' no longer exists in repo. Skipping it..." 84 | fi 85 | done 86 | 87 | release_charts 88 | update_index 89 | else 90 | echo "Nothing to do. No chart changes detected." 91 | fi 92 | else 93 | install_chart_releaser 94 | rm -rf .cr-index 95 | mkdir -p .cr-index 96 | release_charts 97 | update_index 98 | fi 99 | 100 | popd > /dev/null 101 | } 102 | 103 | parse_command_line() { 104 | while :; do 105 | case "${1:-}" in 106 | -h|--help) 107 | show_help 108 | exit 109 | ;; 110 | --config) 111 | if [[ -n "${2:-}" ]]; then 112 | config="$2" 113 | shift 114 | else 115 | echo "ERROR: '--config' cannot be empty." >&2 116 | show_help 117 | exit 1 118 | fi 119 | ;; 120 | -v|--version) 121 | if [[ -n "${2:-}" ]]; then 122 | version="$2" 123 | shift 124 | else 125 | echo "ERROR: '-v|--version' cannot be empty." >&2 126 | show_help 127 | exit 1 128 | fi 129 | ;; 130 | -d|--charts-dir) 131 | if [[ -n "${2:-}" ]]; then 132 | charts_dir="$2" 133 | shift 134 | else 135 | echo "ERROR: '-d|--charts-dir' cannot be empty." >&2 136 | show_help 137 | exit 1 138 | fi 139 | ;; 140 | -o|--owner) 141 | if [[ -n "${2:-}" ]]; then 142 | owner="$2" 143 | shift 144 | else 145 | echo "ERROR: '--owner' cannot be empty." >&2 146 | show_help 147 | exit 1 148 | fi 149 | ;; 150 | -r|--repo) 151 | if [[ -n "${2:-}" ]]; then 152 | repo="$2" 153 | shift 154 | else 155 | echo "ERROR: '--repo' cannot be empty." >&2 156 | show_help 157 | exit 1 158 | fi 159 | ;; 160 | -n|--install-dir) 161 | if [[ -n "${2:-}" ]]; then 162 | install_dir="$2" 163 | shift 164 | fi 165 | ;; 166 | -i|--install-only) 167 | if [[ -n "${2:-}" ]]; then 168 | install_only="$2" 169 | shift 170 | fi 171 | ;; 172 | -s|--skip-packaging) 173 | if [[ -n "${2:-}" ]]; then 174 | skip_packaging="$2" 175 | shift 176 | fi 177 | ;; 178 | --skip-existing) 179 | if [[ -n "${2:-}" ]]; then 180 | skip_existing="$2" 181 | shift 182 | fi 183 | ;; 184 | -l|--mark-as-latest) 185 | if [[ -n "${2:-}" ]]; then 186 | mark_as_latest="$2" 187 | shift 188 | fi 189 | ;; 190 | *) 191 | break 192 | ;; 193 | esac 194 | 195 | shift 196 | done 197 | 198 | if [[ -z "$owner" ]]; then 199 | echo "ERROR: '-o|--owner' is required." >&2 200 | show_help 201 | exit 1 202 | fi 203 | 204 | if [[ -z "$repo" ]]; then 205 | echo "ERROR: '-r|--repo' is required." >&2 206 | show_help 207 | exit 1 208 | fi 209 | 210 | if [[ -z "$install_dir" ]]; then 211 | local arch 212 | arch=$(uname -m) 213 | install_dir="$RUNNER_TOOL_CACHE/cr/$version/$arch" 214 | fi 215 | 216 | if [[ -n "$install_only" ]]; then 217 | echo "Will install cr tool and not run it..." 218 | install_chart_releaser 219 | exit 0 220 | fi 221 | } 222 | 223 | install_chart_releaser() { 224 | if [[ ! -d "$RUNNER_TOOL_CACHE" ]]; then 225 | echo "Cache directory '$RUNNER_TOOL_CACHE' does not exist" >&2 226 | exit 1 227 | fi 228 | 229 | if [[ ! -d "$install_dir" ]]; then 230 | mkdir -p "$install_dir" 231 | 232 | echo "Installing chart-releaser on $install_dir..." 233 | curl -sSLo cr.tar.gz "https://github.com/helm/chart-releaser/releases/download/$version/chart-releaser_${version#v}_linux_amd64.tar.gz" 234 | tar -xzf cr.tar.gz -C "$install_dir" 235 | rm -f cr.tar.gz 236 | fi 237 | 238 | echo 'Adding cr directory to PATH...' 239 | export PATH="$install_dir:$PATH" 240 | } 241 | 242 | lookup_latest_tag() { 243 | git fetch --tags > /dev/null 2>&1 244 | 245 | if ! git describe --tags --abbrev=0 HEAD^^ 2> /dev/null; then 246 | git rev-list --tags --max-count=1 --skip=1 --no-walk 247 | # git rev-list --max-parents=0 --first-parent HEAD 248 | fi 249 | } 250 | 251 | filter_charts() { 252 | while read -r chart; do 253 | [[ ! -d "$chart" ]] && continue 254 | local file="$chart/Chart.yaml" 255 | if [[ -f "$file" ]]; then 256 | echo "$chart" 257 | else 258 | echo "WARNING: $file is missing, assuming that '$chart' is not a Helm chart. Skipping." 1>&2 259 | fi 260 | done 261 | } 262 | 263 | lookup_changed_charts() { 264 | local commit="$1" 265 | 266 | local changed_files 267 | changed_files=$(git diff --find-renames --name-only "$commit" -- "$charts_dir") 268 | 269 | local depth=$(( $(tr "/" "\n" <<< "$charts_dir" | sed '/^\(\.\)*$/d' | wc -l) + 1 )) 270 | local fields="1-${depth}" 271 | 272 | cut -d '/' -f "$fields" <<< "$changed_files" | uniq | filter_charts 273 | } 274 | 275 | package_chart() { 276 | local chart="$1" 277 | 278 | local args=("$chart" --package-path .cr-release-packages) 279 | if [[ -n "$config" ]]; then 280 | args+=(--config "$config") 281 | fi 282 | 283 | echo "Packaging chart '$chart'..." 284 | cr package "${args[@]}" 285 | } 286 | 287 | release_charts() { 288 | local args=(-o "$owner" -r "$repo" -c "$(git rev-parse HEAD)") 289 | if [[ -n "$config" ]]; then 290 | args+=(--config "$config") 291 | fi 292 | if [[ -n "$skip_existing" ]]; then 293 | args+=(--skip-existing) 294 | fi 295 | if [[ "$mark_as_latest" = false ]]; then 296 | args+=(--make-release-latest=false) 297 | fi 298 | 299 | echo 'Releasing charts...' 300 | cr upload "${args[@]}" 301 | } 302 | 303 | update_index() { 304 | local args=(-o "$owner" -r "$repo" --push) 305 | if [[ -n "$config" ]]; then 306 | args+=(--config "$config") 307 | fi 308 | 309 | echo 'Updating charts repo index...' 310 | cr index "${args[@]}" 311 | } 312 | 313 | main "$@" -------------------------------------------------------------------------------- /.github/auto_assign.yml: -------------------------------------------------------------------------------- 1 | # Set to true to add reviewers to pull requests 2 | addReviewers: true 3 | 4 | # Set to true to add assignees to pull requests 5 | addAssignees: true 6 | 7 | assignees: 8 | - MoJo2600 9 | 10 | # A list of reviewers to be added to pull requests (GitHub user name) 11 | reviewers: 12 | - MoJo2600 13 | 14 | # A list of keywords to be skipped the process that add reviewers if pull requests include it 15 | skipKeywords: 16 | - wip 17 | 18 | # A number of reviewers added to the pull request 19 | # Set 0 to add all the reviewers (default: 0) 20 | numberOfReviewers: 0 21 | -------------------------------------------------------------------------------- /.github/dependabot.yml: -------------------------------------------------------------------------------- 1 | # Copyright VMware, Inc. 2 | # SPDX-License-Identifier: APACHE-2.0 3 | 4 | version: 2 5 | # Check for updates to GitHub Actions every week 6 | updates: 7 | - package-ecosystem: "github-actions" 8 | directory: "/" 9 | schedule: 10 | interval: "weekly" -------------------------------------------------------------------------------- /.github/workflows/check-pihole-docker-versions.yaml: -------------------------------------------------------------------------------- 1 | name: Check for new pihole version 2 | 3 | on: 4 | schedule: 5 | - cron: '0 4 * * *' 6 | workflow_dispatch: 7 | 8 | jobs: 9 | docker: 10 | name: Check for new pihole version 11 | 12 | runs-on: ubuntu-latest 13 | steps: 14 | 15 | - name: ✨ Checkout repository 16 | uses: actions/checkout@v4 17 | with: 18 | fetch-depth: 0 19 | 20 | - name: 👀 Looking for a new version 21 | id: version-check 22 | run: | 23 | CURRENT_PIHOLE_VERSION=$(cat charts/pihole/Chart.yaml | yq .appVersion) 24 | curl -s 'https://registry.hub.docker.com/v2/repositories/pihole/pihole/tags/' > version.json 25 | LATEST_PIHOLE_DIGEST=$(cat version.json | jq -r '.results[] | select(.name == "latest") | .digest') 26 | LATEST_PIHOLE_VERSION=$(cat version.json | jq -r --arg v "$LATEST_PIHOLE_DIGEST" '.results[] | select(.digest==$v) | select(.name!="latest") | .name') 27 | rm version.json 28 | echo $CURRENT_PIHOLE_VERSION 29 | echo $LATEST_PIHOLE_DIGEST 30 | echo $LATEST_PIHOLE_VERSION 31 | echo "latest_pihole_version=$LATEST_PIHOLE_VERSION" >> "$GITHUB_OUTPUT" 32 | [[ "$LATEST_PIHOLE_VERSION" == "$CURRENT_PIHOLE_VERSION" ]] && echo "new_version=false" || echo "new_version=true" >> "$GITHUB_OUTPUT" 33 | 34 | - name: Debug 35 | run: | 36 | echo ${{ steps.version-check.outputs.new_version }} 37 | echo ${{ steps.version-check.outputs.new_version == true }} 38 | echo ${{ steps.version-check.outputs.new_version == 'true' }} 39 | 40 | - name: Update version 41 | id: update-version 42 | if: ${{ steps.version-check.outputs.new_version == 'true' }} 43 | run: | 44 | echo "New pihole version: ${{ steps.version-check.outputs.latest_pihole_version }}" 45 | V="${{ steps.version-check.outputs.latest_pihole_version }}" yq -i '.appVersion |= env(V)' charts/pihole/Chart.yaml 46 | 47 | - name: 📢 Create Pull Request 48 | id: create-pr 49 | uses: peter-evans/create-pull-request@v7 50 | with: 51 | token: ${{ github.token }} 52 | commit-message: >- 53 | feat: bump pihole version to ${{ steps.version-check.outputs.latest_pihole_version }} 54 | 55 | Bump program version 56 | 57 | [Workflow Run]: https://github.com/${{ github.repository }}/actions/runs/${{ github.run_id }} 58 | branch: deps/version-bump 59 | title: "feat: bump pihole version to ${{ steps.version-check.outputs.latest_pihole_version }}" 60 | body: >- 61 | Bumps the version of the program to ${{ steps.version-check.outputs.latest_pihole_version }}. 62 | 63 | See details in [workflow run]. 64 | 65 | [Workflow Run]: https://github.com/${{ github.repository }}/actions/runs/${{ github.run_id }} 66 | author: github-actions 67 | committer: github-actions 68 | signoff: true 69 | 70 | 71 | -------------------------------------------------------------------------------- /.github/workflows/lint-test.yaml: -------------------------------------------------------------------------------- 1 | name: Lint and Test Charts 2 | 3 | on: 4 | pull_request: 5 | branches: 6 | - main 7 | paths-ignore: 8 | - "**/README.md" 9 | - "charts/pihole/examples/**" 10 | 11 | jobs: 12 | 13 | lint-test: 14 | runs-on: ubuntu-latest 15 | steps: 16 | - name: Checkout 17 | uses: actions/checkout@v4 18 | with: 19 | fetch-depth: 0 20 | 21 | - name: Set up Helm 22 | uses: azure/setup-helm@v4 23 | with: 24 | version: v3.17.1 25 | 26 | - uses: actions/setup-python@v5 27 | with: 28 | python-version: '3.x' 29 | check-latest: true 30 | 31 | - name: Set up chart-testing 32 | uses: helm/chart-testing-action@v2.7.0 33 | 34 | - name: Run chart-testing (list-changed) 35 | id: list-changed 36 | run: | 37 | changed=$(ct list-changed --target-branch ${{ github.event.repository.default_branch }}) 38 | if [[ -n "$changed" ]]; then 39 | echo "changed=true" >> "$GITHUB_OUTPUT" 40 | fi 41 | 42 | - name: Run chart-testing (lint) 43 | if: steps.list-changed.outputs.changed == 'true' 44 | run: ct lint --check-version-increment=false --target-branch ${{ github.event.repository.default_branch }} 45 | 46 | - name: Create kind cluster 47 | if: steps.list-changed.outputs.changed == 'true' 48 | uses: helm/kind-action@v1.12.0 49 | 50 | - name: Run chart-testing (install) 51 | if: steps.list-changed.outputs.changed == 'true' 52 | run: ct install --target-branch ${{ github.event.repository.default_branch }} 53 | 54 | -------------------------------------------------------------------------------- /.github/workflows/prepare.yaml: -------------------------------------------------------------------------------- 1 | name: prepare-release 2 | on: 3 | push: 4 | branches: 5 | - release-* 6 | 7 | permissions: 8 | contents: write 9 | pull-requests: write 10 | 11 | jobs: 12 | prepare-dist: 13 | runs-on: ubuntu-latest 14 | steps: 15 | - uses: actions/checkout@v4 16 | with: 17 | fetch-depth: 0 18 | 19 | - name: Generate documentation 20 | id: generate-documentation 21 | run: | 22 | docker run --rm --volume "$(pwd):/helm-docs" -u $(id -u) jnorwood/helm-docs:latest 23 | 24 | - uses: stefanzweifel/git-auto-commit-action@v5 25 | with: 26 | commit_message: 'chore(documentation): Update documentation' -------------------------------------------------------------------------------- /.github/workflows/release-please.yaml: -------------------------------------------------------------------------------- 1 | on: 2 | push: 3 | branches: 4 | - main 5 | 6 | permissions: 7 | contents: write 8 | pull-requests: write 9 | 10 | env: 11 | PUBLISHABLE_ITEMS: '["charts/pihole"]' 12 | 13 | name: release-please 14 | 15 | jobs: 16 | # since there is currently only one chart to be released I leave it like this for now 17 | # for multiple charts this would have to be more dynamic 18 | release: 19 | name: Release 20 | runs-on: ubuntu-latest 21 | 22 | steps: 23 | - name: ✨ Checkout repository 24 | uses: actions/checkout@v4 25 | with: 26 | fetch-depth: 0 27 | 28 | - uses: googleapis/release-please-action@v4 29 | name: 🙌 Prepare release 30 | id: release-please 31 | with: 32 | token: ${{ secrets.CR_TOKEN }} 33 | 34 | - name: 🐛 Dump Release Please Output 35 | env: 36 | RELEASE_PLEASE_OUTPUT: ${{ toJson(steps.release-please.outputs) }} 37 | run: | 38 | echo "$RELEASE_PLEASE_OUTPUT" 39 | 40 | - name: 📦 Determine what should be published 41 | uses: actions/github-script@v7 42 | id: items-to-publish 43 | env: 44 | CHANGED_ITEMS: "${{ steps.release-please.outputs.paths_released }}" 45 | with: 46 | # Release please outputs a string representation of an array under the key paths_released 47 | # This script parses the output, and filters each of the changed items (provided as paths to the root of the package) 48 | # to remove any values not present in the PUBLISHABLE_ITEMS array. This filtered array is then stringified and exported as items-to-publish.outputs.result 49 | # this can be picked up by subsequent jobs and used in a matrix to loop over the PUBLISHABLE_ITEMS within the release 50 | script: | 51 | const changedItems = JSON.parse(process.env.CHANGED_ITEMS || '[]'); 52 | console.log("changed items", changedItems); 53 | const eligibleItems = JSON.parse(process.env.PUBLISHABLE_ITEMS || '[]'); 54 | console.log("eligible items", eligibleItems); 55 | const itemsToPublish = changedItems.filter(i => eligibleItems.includes(i)); 56 | console.log("items to publish", itemsToPublish); 57 | return itemsToPublish; 58 | outputs: 59 | items_to_publish: ${{ steps.items-to-publish.outputs.result }} 60 | releases: ${{ toJson(steps.release-please.outputs) }} 61 | 62 | # prepare-release: 63 | # name: Prepare 64 | # runs-on: ubuntu-latest 65 | # needs: release 66 | # if: ${{ needs.release.outputs.items_to_publish != '' && toJson(fromJson(needs.release.outputs.items_to_publish)) != '[]' }} 67 | # steps: 68 | 69 | release-charts: 70 | name: Release Charts 71 | needs: release 72 | runs-on: ubuntu-latest 73 | if: ${{ needs.release.outputs.items_to_publish != '' && toJson(fromJson(needs.release.outputs.items_to_publish)) != '[]' }} 74 | strategy: 75 | fail-fast: false 76 | matrix: 77 | path: ${{ fromJSON(needs.release.outputs.items_to_publish) }} 78 | 79 | env: 80 | TAG: ${{ fromJson(needs.release.outputs.releases)[format('{0}--tag_name', matrix.path)] }} 81 | VERSION: ${{ fromJson(needs.release.outputs.releases)[format('{0}--version', matrix.path)] }} 82 | 83 | steps: 84 | - name: 🐛 Debug 85 | run: | 86 | echo ${{ env.TAG }} 87 | echo ${{ env.VERSION }} 88 | echo ${{ matrix.path }} 89 | 90 | - name: ✨ Checkout repository 91 | uses: actions/checkout@v4 92 | with: 93 | fetch-depth: 0 94 | 95 | - name: 🔧 Configure Git 96 | run: | 97 | echo ${{ needs.release.outputs.items_to_publish }} 98 | git config user.name "$GITHUB_ACTOR" 99 | git config user.email "$GITHUB_ACTOR@users.noreply.github.com" 100 | 101 | - name: 🔧 Install Chart Releaser 102 | run: | 103 | version=v1.6.0 104 | mkdir .tmp 105 | install_dir=.tmp 106 | echo "Installing chart-releaser on $install_dir..." 107 | curl -sSLo cr.tar.gz "https://github.com/helm/chart-releaser/releases/download/$version/chart-releaser_${version#v}_linux_amd64.tar.gz" 108 | tar -xzf cr.tar.gz -C "$install_dir" 109 | rm -f cr.tar.gz 110 | 111 | - name: 📦 Package chart 112 | run: | 113 | .tmp/cr package ${{ matrix.path }} 114 | ls -la .cr-release-packages/ 115 | 116 | - name: 📢 Upload binaries to release 117 | uses: svenstaro/upload-release-action@v2 118 | with: 119 | repo_token: ${{ secrets.GITHUB_TOKEN }} 120 | file: .cr-release-packages/*.tgz 121 | file_glob: true 122 | overwrite: true 123 | tag: ${{ env.TAG }} 124 | 125 | - name: 📁 Upadate index 126 | run: | 127 | owner=$(cut -d '/' -f 1 <<< "$GITHUB_REPOSITORY") 128 | repo=$(cut -d '/' -f 2 <<< "$GITHUB_REPOSITORY") 129 | args=(-o "$owner" -r "$repo" --push -t "${{ secrets.CR_TOKEN }}" --index-path .) 130 | .tmp/cr index "${args[@]}" 131 | -------------------------------------------------------------------------------- /.github/workflows/semantic.yaml: -------------------------------------------------------------------------------- 1 | name: "Lint PR" 2 | 3 | on: 4 | pull_request_target: 5 | types: 6 | - opened 7 | - edited 8 | - synchronize 9 | 10 | jobs: 11 | main: 12 | name: Validate PR title 13 | runs-on: ubuntu-latest 14 | steps: 15 | - uses: amannn/action-semantic-pull-request@v5 16 | with: 17 | types: | 18 | fix 19 | feat 20 | chore 21 | deps 22 | docs 23 | test 24 | requireScope: false 25 | env: 26 | GITHUB_TOKEN: ${{ secrets.CR_TOKEN }} -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | /values.yaml 2 | **/node_modules/ 3 | .cr-release-packages/ 4 | -------------------------------------------------------------------------------- /.release-please-manifest.json: -------------------------------------------------------------------------------- 1 | { 2 | "charts/pihole": "2.31.0" 3 | } 4 | -------------------------------------------------------------------------------- /CONTRIBUTING.md: -------------------------------------------------------------------------------- 1 | # Contributing Guidelines 2 | 3 | This charts project accepts contributions via GitHub pull requests. This document outlines the process to help get your contribution accepted. 4 | 5 | Any type of contribution is welcome; from new features, bug fixes, [tests](#testing) or documentation improvements. 6 | 7 | ## How to Contribute 8 | 9 | 1. Fork this repository, develop, and test your changes. 10 | 2. Please [allow edits from maintainers](https://docs.github.com/en/free-pro-team@latest/github/collaborating-with-issues-and-pull-requests/allowing-changes-to-a-pull-request-branch-created-from-a-fork) so small changes can be added if necessary. 11 | 3. Ensure your Chart changes follow the [technical](#technical-requirements) and [documentation](#documentation-requirements) guidelines, described below. 12 | 4. Submit a pull request. 13 | 14 | ### Reporting a Bug in Helm 15 | 16 | This repository is used by Chart developers for maintaining the inofficial pihole helm chart. If your issue is in the Helm tool itself, please use the issue tracker in the [helm/helm](https://github.com/helm/helm) repository. 17 | 18 | ### Technical Requirements 19 | 20 | When submitting a PR make sure that it: 21 | 22 | * Must pass CI jobs for linting and test the changes on top of different k8s platforms. (Automatically done by the CI/CD pipeline). 23 | * Must follow [Helm best practices](https://helm.sh/docs/chart_best_practices/). 24 | * Must successfully launch with default values (`helm install .`) 25 | * All pods go to the running state (or NOTES.txt provides further instructions if a required value is missing e.g. [minecraft](https://github.com/helm/charts/blob/master/stable/minecraft/templates/NOTES.txt#L3)) 26 | * All services have at least one endpoint 27 | * Must include source GitHub repositories for images used in the Chart 28 | * Images should not have any major security vulnerabilities 29 | * Must be up-to-date with the latest stable Helm/Kubernetes features 30 | * Use Deployments in favor of ReplicationControllers 31 | * Should follow Kubernetes best practices 32 | * Include Health Checks wherever practical 33 | * Allow configurable [resource requests and limits](http://kubernetes.io/docs/user-guide/compute-resources/#resource-requests-and-limits-of-pod-and-container) 34 | * Provide a method for data persistence (if applicable) 35 | * Support application upgrades 36 | * Allow customization of the application configuration 37 | * Provide a secure default configuration 38 | * Do not leverage alpha features of Kubernetes 39 | * Includes a [NOTES.txt](https://helm.sh/docs/topics/charts/#chart-license-readme-and-notes) explaining how to use the application after install 40 | * Follows [best practices](https://helm.sh/docs/chart_best_practices/) 41 | (especially for [labels](https://helm.sh/docs/chart_best_practices/labels/) 42 | and [values](https://helm.sh/docs/chart_best_practices/values/)) 43 | 44 | #### Sign Your Work 45 | 46 | The sign-off is a simple line at the end of the explanation for a commit. All commits needs to be signed. Your signature certifies that you wrote the patch or otherwise have the right to contribute the material. The rules are pretty simple, you only need to certify the guidelines from [developercertificate.org](https://developercertificate.org/). 47 | 48 | Then you just add a line to every git commit message: 49 | 50 | ```text 51 | Signed-off-by: Joe Smith 52 | ``` 53 | 54 | Use your real name (sorry, no pseudonyms or anonymous contributions.) 55 | 56 | If you set your `user.name` and `user.email` git configs, you can sign your commit automatically with `git commit -s`. 57 | 58 | Note: If your git config information is set properly then viewing the `git log` information for your commit will look something like this: 59 | 60 | ```text 61 | Author: Joe Smith 62 | Date: Thu Feb 2 11:41:15 2018 -0800 63 | 64 | Update README 65 | 66 | Signed-off-by: Joe Smith 67 | ``` 68 | 69 | Notice the `Author` and `Signed-off-by` lines match. If they don't your PR will be rejected by the automated DCO check. 70 | 71 | ### Documentation Requirements 72 | 73 | * A chart's `README.md` must include configuration options. The tables of parameters are automatically generated based on the metadata information from the `values.yaml` file. 74 | * Please update `NOTES.txt` if necessary, including: 75 | * Any relevant post-installation information for the Chart 76 | * Instructions on how to access the application or service provided by the Chart 77 | 78 | ### Merge Approval and Release Process 79 | 80 | A maintainer will review the Chart change submission, a validation job in the CI is automatically started. A maintainer may add "LGTM" (Looks Good To Me) or an equivalent comment to indicate that a PR is acceptable. Any change requires at least one LGTM. No pull requests can be merged until at least one maintainer signs off with an LGTM. 81 | 82 | Once the Chart has been merged, the release job will automatically run in the CI to package and release the Chart. 83 | 84 | ## Support Channels 85 | 86 | Whether you are a user or contributor, official support channels include: 87 | 88 | - GitHub issues: https://github.com/MoJo2600/pihole-kubernetes/issues 89 | - GitHub discussions: https://github.com/MoJo2600/pihole-kubernetes/discussions 90 | 91 | Before opening a new issue or submitting a new pull request, it's helpful to search the project - it's likely that another user has already reported the issue you're facing, or it's a known issue that we're already aware of. 92 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # mojo2600.github.io 2 | 3 | [![All Contributors](https://img.shields.io/badge/all_contributors-27-blue.svg?style=flat-square)](#contributors-) 4 | 5 | 6 | [Helm](https://helm.sh) repo for different charts which can be installed on [Kubernetes](https://kubernetes.io) 7 | 8 | Further documentation including chart keys, types, and default values is at https://hub.helm.sh/charts/mojo2600/pihole 9 | 10 | ### Add Helm repository 11 | 12 | To install the repo just run: 13 | 14 | ```bash 15 | helm repo add mojo2600 https://mojo2600.github.io/pihole-kubernetes/ 16 | helm repo update 17 | ``` 18 | 19 | ### Helm Charts 20 | 21 | * [pihole](https://mojo2600.github.io/pihole-kubernetes) 22 | 23 | ```bash 24 | helm install your-release mojo2600/pihole 25 | ``` 26 | 27 | 28 | ## Contributors ✨ 29 | 30 | Thanks goes to these wonderful people: 31 | 32 | 33 | 34 | 35 | 36 | 37 | 38 | 39 | 40 | 41 | 42 | 43 | 44 | 45 | 46 | 47 | 48 | 49 | 50 | 51 | 52 | 53 | 54 | 55 | 56 | 57 | 58 | 59 | 60 | 61 | 62 | 63 | 64 | 65 | 66 | 67 | 68 | 69 | 70 | 71 | 72 | 73 | 74 | 75 | 76 | 77 | 78 | 79 | 80 | 81 | 82 | 83 | 84 | 85 | 86 | 87 | 88 | 89 | 90 | 91 | 92 | 93 | 94 | 95 | 96 | 97 | 98 | 99 | 100 | 101 | 102 | 103 | 104 | 105 | 106 | 107 | 108 | 109 | 110 | 111 | 112 | 113 | 114 | 115 | 116 | 117 | 118 | 119 | 120 | 121 | 122 | 123 | 124 | 125 | 126 | 127 | 128 | 129 | 130 | 131 | 132 | 133 | 134 | 135 | 136 | 137 | 138 | 139 | 140 | 141 | 142 |

Christian Erhardt

Jeff Billimek

Steven Imle

Joseph Petersen

Simon Garcia

Andy Gilbreath

James Wilson

Krishnaswamy Subramanian

Lucas Romero

konturn

tdorsey

Ales Zelenik

Damien TOURDE

Jason Sievert

joshua-nord

Maximilian Bode

raackley

Sam Kleiner

Arpan Kapoor

Christian Rodriguez

Dave Cahill

golgoth31

Greg Jeanmart

Joseph Ball

Karlos

dza89

mikewhitley

Vashiru

sam-kleiner

Alex Gorbatchev

Alexander Rabenstein

David Fisher

Utku Özdemir

Morre Meyer

Donald Johnson

Winston R. Milling

Christopher Larivière

Justin Sievenpiper

beastob

Daniel Mühlbachler-Pietrzykowski

Erik Sundell

Kjeld Schouten-Lebbing

Brandon Wulf

DerRockWolf

brnl

Rafael Gaspar

Chadi El Masri

Dan Foulkes

George Rodrigues

Pascal Iske

Theo REY

Watteel Pascal

simon

Vincent

Clint

Philipp B.

ebCrypto

Ken Lasko

Mark Bundschuh

Max Rosin

Yang

dwarf-king-hreidmar

s94santos

Adam David

Ben Konicek

Gabisonfire

Giorgi Lekveishvili

Paimon Sorornejad

Jean-Kevin KPADEY

Alessandro Ogier

Luuk v/d Maagdenberg

Markus Mayer

Paulo Jesus

Lindemberg Barbosa

Ricardo Baltazar Chaves

Thomas Andrade

Alexandre Chappaz

Cristian Klein

JP Flouret

Eric
143 | 144 | 145 | 146 | 147 | 148 | 149 | This project follows the [all-contributors](https://github.com/all-contributors/all-contributors) specification. Contributions of any kind welcome! 150 | -------------------------------------------------------------------------------- /charts/pihole/.helmignore: -------------------------------------------------------------------------------- 1 | # Patterns to ignore when building packages. 2 | # This supports shell glob matching, relative path matching, and 3 | # negation (prefixed with !). Only one pattern per line. 4 | .DS_Store 5 | # Common VCS dirs 6 | .git/ 7 | .gitignore 8 | .bzr/ 9 | .bzrignore 10 | .hg/ 11 | .hgignore 12 | .svn/ 13 | # Common backup files 14 | *.swp 15 | *.bak 16 | *.tmp 17 | *~ 18 | # Various IDEs 19 | .project 20 | .idea/ 21 | *.tmproj 22 | 23 | # Manually added entries 24 | ci/ 25 | examples/ 26 | Makefile 27 | README.md.gotmpl 28 | -------------------------------------------------------------------------------- /charts/pihole/CHANGELOG.md: -------------------------------------------------------------------------------- 1 | # Changelog 2 | 3 | ## [2.31.0](https://github.com/MoJo2600/pihole-kubernetes/compare/pihole-2.30.0...pihole-2.31.0) (2025-05-16) 4 | 5 | 6 | ### Features 7 | 8 | * Allow specifying loadBalancerClass for LoadBalancer services ([#370](https://github.com/MoJo2600/pihole-kubernetes/issues/370)) ([d0c9f95](https://github.com/MoJo2600/pihole-kubernetes/commit/d0c9f9534d83020d5b4541f6c402912279db38d5)) 9 | 10 | ## [2.30.0](https://github.com/MoJo2600/pihole-kubernetes/compare/pihole-2.29.1...pihole-2.30.0) (2025-04-30) 11 | 12 | 13 | ### Features 14 | 15 | * bump pihole version to 2025.04.0 ([#364](https://github.com/MoJo2600/pihole-kubernetes/issues/364)) ([b41ff7f](https://github.com/MoJo2600/pihole-kubernetes/commit/b41ff7f264ea4472a2556ed34c8d8a79eb616af0)) 16 | 17 | ## [2.29.1](https://github.com/MoJo2600/pihole-kubernetes/compare/pihole-2.29.0...pihole-2.29.1) (2025-03-08) 18 | 19 | 20 | ### Bug Fixes 21 | 22 | * revert liveness and readiness probe back to http ([#357](https://github.com/MoJo2600/pihole-kubernetes/issues/357)) ([bbb557b](https://github.com/MoJo2600/pihole-kubernetes/commit/bbb557b1730c31cec5401d99c9962613e376358a)), closes [#356](https://github.com/MoJo2600/pihole-kubernetes/issues/356) 23 | * updated pihole exporter to v1.0.0 ([#351](https://github.com/MoJo2600/pihole-kubernetes/issues/351)) ([04d4e90](https://github.com/MoJo2600/pihole-kubernetes/commit/04d4e9047e3cbe6d1d0dade813367beb6291777c)) 24 | 25 | ## [2.29.0](https://github.com/MoJo2600/pihole-kubernetes/compare/pihole-2.28.0...pihole-2.29.0) (2025-03-07) 26 | 27 | 28 | ### Features 29 | 30 | * allow for env map values ([#339](https://github.com/MoJo2600/pihole-kubernetes/issues/339)) ([f6fcb06](https://github.com/MoJo2600/pihole-kubernetes/commit/f6fcb06d4c5d3a5fd41e08d8dbcc7e3fbba68a85)) 31 | * bump pihole version to 2025.03.0 ([#352](https://github.com/MoJo2600/pihole-kubernetes/issues/352)) ([83dd678](https://github.com/MoJo2600/pihole-kubernetes/commit/83dd67801fe07f872a12301a96f087b8e9d0f2f1)) 32 | 33 | ## [2.28.0](https://github.com/MoJo2600/pihole-kubernetes/compare/pihole-2.27.0...pihole-2.28.0) (2025-03-02) 34 | 35 | 36 | ### Features 37 | 38 | * add custom deployment annotation option ([#332](https://github.com/MoJo2600/pihole-kubernetes/issues/332)) ([bc8f720](https://github.com/MoJo2600/pihole-kubernetes/commit/bc8f720a9343e8b61fea68b67a2aa4f9ca56c0f4)) 39 | * allow to override the command of the cloudflared container. ([#331](https://github.com/MoJo2600/pihole-kubernetes/issues/331)) ([02cff49](https://github.com/MoJo2600/pihole-kubernetes/commit/02cff4992313488524f0883946bb6e425be8be77)) 40 | * PiHole v6 Support ([#343](https://github.com/MoJo2600/pihole-kubernetes/issues/343)) ([8112b80](https://github.com/MoJo2600/pihole-kubernetes/commit/8112b800b98eb6ff23aa19d074b56acd72e1066b)) 41 | * support doh readiness and podmonitor ([#335](https://github.com/MoJo2600/pihole-kubernetes/issues/335)) ([2c5aaf5](https://github.com/MoJo2600/pihole-kubernetes/commit/2c5aaf592b10d69ce674e87833edb82ad4954110)) 42 | 43 | ## [2.27.0](https://github.com/MoJo2600/pihole-kubernetes/compare/pihole-2.26.2...pihole-2.27.0) (2024-11-28) 44 | 45 | 46 | ### Features 47 | 48 | * add command option to set up readiness probe. ([#323](https://github.com/MoJo2600/pihole-kubernetes/issues/323)) ([f5c6ad3](https://github.com/MoJo2600/pihole-kubernetes/commit/f5c6ad3661a2a87e5014aff6c617ea0367177b24)) 49 | * add the label app.kubernetes.io/name to deployment and services ([#321](https://github.com/MoJo2600/pihole-kubernetes/issues/321)) ([61ab00d](https://github.com/MoJo2600/pihole-kubernetes/commit/61ab00d1f7fe0cfabfc426bf484cec46fff6ed11)) 50 | * configurable pathType for the ingress resource ([#317](https://github.com/MoJo2600/pihole-kubernetes/issues/317)) ([d3c09bc](https://github.com/MoJo2600/pihole-kubernetes/commit/d3c09bc0a6addc487ceda44b516e0714c06c1875)) 51 | 52 | ## [2.26.2](https://github.com/MoJo2600/pihole-kubernetes/compare/pihole-2.26.1...pihole-2.26.2) (2024-10-27) 53 | 54 | 55 | ### Bug Fixes 56 | 57 | * wrong customSettings.otherSettings exmaple in values.yaml ([#319](https://github.com/MoJo2600/pihole-kubernetes/issues/319)) ([67a0e3f](https://github.com/MoJo2600/pihole-kubernetes/commit/67a0e3fce49f9899bd92f1fad3ed96ae1148b78e)), closes [#318](https://github.com/MoJo2600/pihole-kubernetes/issues/318) 58 | 59 | ## [2.26.1](https://github.com/MoJo2600/pihole-kubernetes/compare/pihole-2.26.0...pihole-2.26.1) (2024-07-26) 60 | 61 | 62 | ### Bug Fixes 63 | 64 | * Update Notes.txt ([#309](https://github.com/MoJo2600/pihole-kubernetes/issues/309)) ([0c98981](https://github.com/MoJo2600/pihole-kubernetes/commit/0c9898127323effa124aef86f492c3935d8bc017)), closes [#307](https://github.com/MoJo2600/pihole-kubernetes/issues/307) 65 | 66 | ## [2.26.0](https://github.com/MoJo2600/pihole-kubernetes/compare/pihole-2.25.0...pihole-2.26.0) (2024-07-18) 67 | 68 | 69 | ### Features 70 | 71 | * bump pihole version to 2024.07.0 ([#306](https://github.com/MoJo2600/pihole-kubernetes/issues/306)) ([a119d89](https://github.com/MoJo2600/pihole-kubernetes/commit/a119d893c9d193b38875f6b7841855f68716ca32)) 72 | 73 | ## [2.25.0](https://github.com/MoJo2600/pihole-kubernetes/compare/pihole-2.24.0...pihole-2.25.0) (2024-06-27) 74 | 75 | 76 | ### Features 77 | 78 | * bump pihole version to 2024.06.0 ([#303](https://github.com/MoJo2600/pihole-kubernetes/issues/303)) ([7f96afc](https://github.com/MoJo2600/pihole-kubernetes/commit/7f96afce866cd2dadfbb7d717ad05b87e23538a4)) 79 | 80 | ## [2.24.0](https://github.com/MoJo2600/pihole-kubernetes/compare/pihole-2.23.0...pihole-2.24.0) (2024-05-14) 81 | 82 | 83 | ### Features 84 | 85 | * bump pihole version to 2024.05.0 ([#298](https://github.com/MoJo2600/pihole-kubernetes/issues/298)) ([2b9fada](https://github.com/MoJo2600/pihole-kubernetes/commit/2b9fada9ea76857e9641935a7637a317451751cd)) 86 | 87 | ## [2.23.0](https://github.com/MoJo2600/pihole-kubernetes/compare/pihole-2.22.0...pihole-2.23.0) (2024-04-04) 88 | 89 | 90 | ### Features 91 | 92 | * Add optional annotations to the password secret ([#287](https://github.com/MoJo2600/pihole-kubernetes/issues/287)) ([b71d543](https://github.com/MoJo2600/pihole-kubernetes/commit/b71d54321e4c78f2640e0bbd979f3ebe840b2660)) 93 | * bump pihole version to 2024.03.2 Bump program version [Workflow Run]: https://github.com/MoJo2600/pihole-kubernetes/actions/runs/8555143588 ([#294](https://github.com/MoJo2600/pihole-kubernetes/issues/294)) ([6e9bd88](https://github.com/MoJo2600/pihole-kubernetes/commit/6e9bd882a0df505468bcdee2a3a476e2fb39058d)) 94 | 95 | 96 | ### Bug Fixes 97 | 98 | * invalid web service manifest generation ([#288](https://github.com/MoJo2600/pihole-kubernetes/issues/288)) ([b1019dc](https://github.com/MoJo2600/pihole-kubernetes/commit/b1019dcdd2b3f42ba05dbca8b687ee2627d92411)) 99 | * Update Chart.yaml ([#291](https://github.com/MoJo2600/pihole-kubernetes/issues/291)) ([f10c1fc](https://github.com/MoJo2600/pihole-kubernetes/commit/f10c1fca167346de4fbd6681cfebd08cae7c13df)) 100 | 101 | ## [2.22.0](https://github.com/MoJo2600/pihole-kubernetes/compare/pihole-v2.28.0...pihole-2.22.0) (2024-02-16) 102 | 103 | 104 | ### Features 105 | 106 | * add support for service extraLabels ([#266](https://github.com/MoJo2600/pihole-kubernetes/issues/266)) ([4a09a58](https://github.com/MoJo2600/pihole-kubernetes/commit/4a09a5839e35d075598343bdf138161cf4ed5da7)) 107 | * Bump pihole version to 2024.02.0 ([#283](https://github.com/MoJo2600/pihole-kubernetes/issues/283)) ([f9ec0af](https://github.com/MoJo2600/pihole-kubernetes/commit/f9ec0af000d6e4724010e5c18004896031485450)) 108 | * Change to trigger a new Release ([#280](https://github.com/MoJo2600/pihole-kubernetes/issues/280)) ([dea65aa](https://github.com/MoJo2600/pihole-kubernetes/commit/dea65aa7d2e17336c63cb4ee8fdbb5f13eceaab6)) 109 | 110 | ## [2.28.0](https://github.com/MoJo2600/pihole-kubernetes-githubactions/compare/pihole-2.27.15...pihole-2.28.0) (2024-01-22) 111 | 112 | 113 | ### Features 114 | 115 | * Bump pihole version to 2024.01.0 ([#69](https://github.com/MoJo2600/pihole-kubernetes-githubactions/issues/69)) ([4954679](https://github.com/MoJo2600/pihole-kubernetes-githubactions/commit/49546795430caa09ae7d2739fc2710650e5a753e)) 116 | * documentation ([7902fa0](https://github.com/MoJo2600/pihole-kubernetes-githubactions/commit/7902fa03627cf7f1643bb5fcf71fe473d2725058)) 117 | 118 | ## [2.27.15](https://github.com/MoJo2600/pihole-kubernetes-githubactions/compare/pihole-2.27.14...pihole-2.27.15) (2024-01-22) 119 | 120 | 121 | ### Bug Fixes 122 | 123 | * pipeline ([cd5c934](https://github.com/MoJo2600/pihole-kubernetes-githubactions/commit/cd5c934099b40921a05e5657b068d735b19aa5a5)) 124 | * version ([cfdc6a8](https://github.com/MoJo2600/pihole-kubernetes-githubactions/commit/cfdc6a8b59c7848520b0a33414d0aecfa6d0e38f)) 125 | 126 | ## [2.27.14](https://github.com/MoJo2600/pihole-kubernetes-githubactions/compare/pihole-2.27.13...pihole-2.27.14) (2024-01-22) 127 | 128 | 129 | ### Bug Fixes 130 | 131 | * docu ([9d4cf11](https://github.com/MoJo2600/pihole-kubernetes-githubactions/commit/9d4cf111dabf42ff4e924e77357f24b410702264)) 132 | * docu ([2d1c7de](https://github.com/MoJo2600/pihole-kubernetes-githubactions/commit/2d1c7de714eba1d311db699e2f59f8e20a65814a)) 133 | 134 | ## [2.27.13](https://github.com/MoJo2600/pihole-kubernetes-githubactions/compare/pihole-2.27.12...pihole-2.27.13) (2024-01-22) 135 | 136 | 137 | ### Bug Fixes 138 | 139 | * docu ([c52c82c](https://github.com/MoJo2600/pihole-kubernetes-githubactions/commit/c52c82c321b5cef5224d92209f7c5c87c3ac30d0)) 140 | 141 | ## [2.27.12](https://github.com/MoJo2600/pihole-kubernetes-githubactions/compare/pihole-2.27.11...pihole-2.27.12) (2024-01-22) 142 | 143 | 144 | ### Bug Fixes 145 | 146 | * docu ([26298d4](https://github.com/MoJo2600/pihole-kubernetes-githubactions/commit/26298d4fa18fe5b4c1b5b6fee0c35768f749ccfd)) 147 | 148 | ## [2.27.11](https://github.com/MoJo2600/pihole-kubernetes-githubactions/compare/pihole-2.27.10...pihole-2.27.11) (2024-01-22) 149 | 150 | 151 | ### Bug Fixes 152 | 153 | * docu ([ba0e068](https://github.com/MoJo2600/pihole-kubernetes-githubactions/commit/ba0e0685dfa5aa457b0199faac8640ae6426ed31)) 154 | 155 | ## [2.27.10](https://github.com/MoJo2600/pihole-kubernetes-githubactions/compare/pihole-2.27.9...pihole-2.27.10) (2024-01-22) 156 | 157 | 158 | ### Bug Fixes 159 | 160 | * docu ([357a35e](https://github.com/MoJo2600/pihole-kubernetes-githubactions/commit/357a35e7ea3420b13812115680702bc99cc88b7c)) 161 | * docu ([7ee22ef](https://github.com/MoJo2600/pihole-kubernetes-githubactions/commit/7ee22effee65aa243c530bb91cbb79ac96edb28c)) 162 | 163 | ## [2.27.9](https://github.com/MoJo2600/pihole-kubernetes-githubactions/compare/pihole-2.27.8...pihole-2.27.9) (2024-01-22) 164 | 165 | 166 | ### Bug Fixes 167 | 168 | * documentation ([a667641](https://github.com/MoJo2600/pihole-kubernetes-githubactions/commit/a6676416755a998cbc92172ae8850bacf7bfcf23)) 169 | 170 | ## [2.27.8](https://github.com/MoJo2600/pihole-kubernetes-githubactions/compare/pihole-2.27.7...pihole-2.27.8) (2024-01-22) 171 | 172 | 173 | ### Bug Fixes 174 | 175 | * docu ([044794e](https://github.com/MoJo2600/pihole-kubernetes-githubactions/commit/044794e56d7cb4062f1d448f5b4ab53d1d2bfb97)) 176 | 177 | ## [2.27.7](https://github.com/MoJo2600/pihole-kubernetes-githubactions/compare/pihole-2.27.6...pihole-2.27.7) (2024-01-22) 178 | 179 | 180 | ### Bug Fixes 181 | 182 | * docu ([5319065](https://github.com/MoJo2600/pihole-kubernetes-githubactions/commit/53190650a860caba1f4db78ad6bd3bfde814b83c)) 183 | * documentation ([28b59be](https://github.com/MoJo2600/pihole-kubernetes-githubactions/commit/28b59be0b29e564b3f8e3b0d63fc117280ee4959)) 184 | * pipeline ([f94cb6a](https://github.com/MoJo2600/pihole-kubernetes-githubactions/commit/f94cb6a0a1c028627eac6002c227dff51383c655)) 185 | 186 | ## [2.27.6](https://github.com/MoJo2600/pihole-kubernetes-githubactions/compare/pihole-2.27.5...pihole-2.27.6) (2024-01-22) 187 | 188 | 189 | ### Bug Fixes 190 | 191 | * documentation ([6e73f70](https://github.com/MoJo2600/pihole-kubernetes-githubactions/commit/6e73f70d1e8ea2cd8d8be222872f53ff2ba39cfa)) 192 | * documentation ([5d0e28d](https://github.com/MoJo2600/pihole-kubernetes-githubactions/commit/5d0e28d8e2e980c5759dda885a96a0036b9a773f)) 193 | * documentation ([767adf6](https://github.com/MoJo2600/pihole-kubernetes-githubactions/commit/767adf6b19d4e888bafd1f1eb3cc302cfa8770de)) 194 | 195 | ## [2.27.5](https://github.com/MoJo2600/pihole-kubernetes-githubactions/compare/pihole-2.27.4...pihole-2.27.5) (2024-01-22) 196 | 197 | 198 | ### Bug Fixes 199 | 200 | * documentation ([e031bf3](https://github.com/MoJo2600/pihole-kubernetes-githubactions/commit/e031bf330de12dd6cc40163c7c58337e30d045ca)) 201 | 202 | ## [2.27.4](https://github.com/MoJo2600/pihole-kubernetes-githubactions/compare/pihole-2.27.3...pihole-2.27.4) (2024-01-22) 203 | 204 | 205 | ### Bug Fixes 206 | 207 | * chart ([eb77bd6](https://github.com/MoJo2600/pihole-kubernetes-githubactions/commit/eb77bd6e5f0faa548a58d9f4a55b3b08b384370b)) 208 | * documentation ([c33a323](https://github.com/MoJo2600/pihole-kubernetes-githubactions/commit/c33a3239b6eb074194e4161b0c6a416098b5f985)) 209 | 210 | ## [2.27.3](https://github.com/MoJo2600/pihole-kubernetes-githubactions/compare/pihole-2.27.2...pihole-2.27.3) (2024-01-19) 211 | 212 | 213 | ### Bug Fixes 214 | 215 | * reasdf ([#52](https://github.com/MoJo2600/pihole-kubernetes-githubactions/issues/52)) ([1614b4f](https://github.com/MoJo2600/pihole-kubernetes-githubactions/commit/1614b4f01333e7d974a09c7cad99c43e4ab9e013)) 216 | 217 | ## [2.27.2](https://github.com/MoJo2600/pihole-kubernetes-githubactions/compare/pihole-2.27.1...pihole-2.27.2) (2024-01-19) 218 | 219 | 220 | ### Bug Fixes 221 | 222 | * reasdf ([#50](https://github.com/MoJo2600/pihole-kubernetes-githubactions/issues/50)) ([a189de9](https://github.com/MoJo2600/pihole-kubernetes-githubactions/commit/a189de95b50683313ae71bb02709e1af0ff49c10)) 223 | 224 | ## [2.27.1](https://github.com/MoJo2600/pihole-kubernetes-githubactions/compare/pihole-2.27.0...pihole-2.27.1) (2024-01-19) 225 | 226 | 227 | ### Bug Fixes 228 | 229 | * release worthy ([#48](https://github.com/MoJo2600/pihole-kubernetes-githubactions/issues/48)) ([89f2b67](https://github.com/MoJo2600/pihole-kubernetes-githubactions/commit/89f2b679ae4628069d3237ff4bf60c80841f4506)) 230 | 231 | ## [2.27.0](https://github.com/MoJo2600/pihole-kubernetes-githubactions/compare/pihole-2.26.0...pihole-2.27.0) (2024-01-19) 232 | 233 | 234 | ### Features 235 | 236 | * new value ([#46](https://github.com/MoJo2600/pihole-kubernetes-githubactions/issues/46)) ([9f350de](https://github.com/MoJo2600/pihole-kubernetes-githubactions/commit/9f350de18ca5dafbcd71ed6c295970ab5bbf4024)) 237 | 238 | ## [2.26.0](https://github.com/MoJo2600/pihole-kubernetes-githubactions/compare/pihole-2.25.5...pihole-2.26.0) (2024-01-18) 239 | 240 | 241 | ### Features 242 | 243 | * nonsemantic release ([#44](https://github.com/MoJo2600/pihole-kubernetes-githubactions/issues/44)) ([0949c23](https://github.com/MoJo2600/pihole-kubernetes-githubactions/commit/0949c2378c9002c31ed64ffad2d85ffbb35e9240)) 244 | * semantic pr title check ([#43](https://github.com/MoJo2600/pihole-kubernetes-githubactions/issues/43)) ([0bb7787](https://github.com/MoJo2600/pihole-kubernetes-githubactions/commit/0bb7787ce6bcf7ff8000e9fcf462dfde6d978a69)) 245 | 246 | 247 | ### Bug Fixes 248 | 249 | * add prepare ([fc3d3ed](https://github.com/MoJo2600/pihole-kubernetes-githubactions/commit/fc3d3edadb99c10e9372f74ad00a4669ee631704)) 250 | * another fix ([fd147a9](https://github.com/MoJo2600/pihole-kubernetes-githubactions/commit/fd147a9304755dc06f5bde2e300dfe995e3b76bb)) 251 | 252 | ## [2.25.5](https://github.com/MoJo2600/pihole-kubernetes-githubactions/compare/pihole-2.25.4...pihole-2.25.5) (2024-01-18) 253 | 254 | 255 | ### Bug Fixes 256 | 257 | * user facing change ([c0b8572](https://github.com/MoJo2600/pihole-kubernetes-githubactions/commit/c0b85721d31d7ea7ad4fd952944bec6b8179aa52)) 258 | 259 | ## [2.25.4](https://github.com/MoJo2600/pihole-kubernetes-githubactions/compare/pihole-2.25.3...pihole-2.25.4) (2024-01-18) 260 | 261 | 262 | ### Bug Fixes 263 | 264 | * changes were made ([126f99a](https://github.com/MoJo2600/pihole-kubernetes-githubactions/commit/126f99a012c8acaacd83943b2c59273959ab6e44)) 265 | * split release-please steps ([e6c299c](https://github.com/MoJo2600/pihole-kubernetes-githubactions/commit/e6c299c39b3b3faa04373268067e9c63fe6f4769)) 266 | * split release-please steps 3 ([68061ef](https://github.com/MoJo2600/pihole-kubernetes-githubactions/commit/68061ef7f00fe5b8d736e1d67fe7cddff17fbd88)) 267 | * update readme ([1e1da72](https://github.com/MoJo2600/pihole-kubernetes-githubactions/commit/1e1da7287b47094082077e4a4e070c47b72b97cc)) 268 | 269 | ## [2.25.3](https://github.com/MoJo2600/pihole-kubernetes-githubactions/compare/pihole-2.25.2...pihole-2.25.3) (2024-01-17) 270 | 271 | 272 | ### Bug Fixes 273 | 274 | * documentation add ([216d9a0](https://github.com/MoJo2600/pihole-kubernetes-githubactions/commit/216d9a0b09ca20338728c29c4137b61d938c4e27)) 275 | 276 | ## [2.25.2](https://github.com/MoJo2600/pihole-kubernetes-githubactions/compare/pihole-2.25.1...pihole-2.25.2) (2024-01-17) 277 | 278 | 279 | ### Bug Fixes 280 | 281 | * docu ([19775ae](https://github.com/MoJo2600/pihole-kubernetes-githubactions/commit/19775ae1c56767a52423b29560cccc76e5210f59)) 282 | * dudeldidum ([#37](https://github.com/MoJo2600/pihole-kubernetes-githubactions/issues/37)) ([771b66b](https://github.com/MoJo2600/pihole-kubernetes-githubactions/commit/771b66b58234e351383e5c9ba6ff2319a3bc8e41)) 283 | * extra-files ([7fd4659](https://github.com/MoJo2600/pihole-kubernetes-githubactions/commit/7fd465958db3c217d728bfe04fe3a728e90af2b1)) 284 | * more stuff ([21b6f50](https://github.com/MoJo2600/pihole-kubernetes-githubactions/commit/21b6f500f3416bbbcdd887257faed98d6270e6b8)) 285 | * version string ([37b0726](https://github.com/MoJo2600/pihole-kubernetes-githubactions/commit/37b0726952ee3368394857ceba72b354b1da53c9)) 286 | 287 | ## [2.25.1](https://github.com/MoJo2600/pihole-kubernetes-githubactions/compare/pihole-2.25.0...pihole-2.25.1) (2024-01-17) 288 | 289 | 290 | ### Bug Fixes 291 | 292 | * update workflow ([b34a376](https://github.com/MoJo2600/pihole-kubernetes-githubactions/commit/b34a3763d1e729180ed6e12c62d8b35e6257a9a6)) 293 | 294 | ## [2.25.0](https://github.com/MoJo2600/pihole-kubernetes-githubactions/compare/pihole-2.24.1...pihole-2.25.0) (2024-01-17) 295 | 296 | 297 | ### Features 298 | 299 | * add workflow ([2e6b419](https://github.com/MoJo2600/pihole-kubernetes-githubactions/commit/2e6b419d7feae0e44c7f3c4d3c6d8dd9c5cb1aba)) 300 | 301 | 302 | ### Bug Fixes 303 | 304 | * deplyoment ([51c4de2](https://github.com/MoJo2600/pihole-kubernetes-githubactions/commit/51c4de263207464fa4530108a96b78d39fb88554)) 305 | * docu ([cebbe86](https://github.com/MoJo2600/pihole-kubernetes-githubactions/commit/cebbe860ae67da8ecfa3dcfcd6f2523cddc959c8)) 306 | * docu ([315ba58](https://github.com/MoJo2600/pihole-kubernetes-githubactions/commit/315ba587f16942c30d57c4bbbe2f326985a25433)) 307 | * docu ([#31](https://github.com/MoJo2600/pihole-kubernetes-githubactions/issues/31)) ([e922ee7](https://github.com/MoJo2600/pihole-kubernetes-githubactions/commit/e922ee73eb88b5e30e8e33b2fc92f4ac9bb45743)) 308 | * documentation ([1e11b06](https://github.com/MoJo2600/pihole-kubernetes-githubactions/commit/1e11b064a1a03245fbbfc38e9c5eeffdfeed1555)) 309 | * documentation ([f4eb84d](https://github.com/MoJo2600/pihole-kubernetes-githubactions/commit/f4eb84da543272b7945a1b8d196a6487c38a0a8f)) 310 | * documentation ([780df0d](https://github.com/MoJo2600/pihole-kubernetes-githubactions/commit/780df0d9d5c1dbb455c17a08837fda6dafc42af7)) 311 | * documentation ([#32](https://github.com/MoJo2600/pihole-kubernetes-githubactions/issues/32)) ([28c05e1](https://github.com/MoJo2600/pihole-kubernetes-githubactions/commit/28c05e194f4dc63619ac9aba7a7bf6177c25d843)) 312 | * foo ([2d48537](https://github.com/MoJo2600/pihole-kubernetes-githubactions/commit/2d485377272cbcff78f50eb3076df9510a8fea9b)) 313 | 314 | ## [2.24.1](https://github.com/MoJo2600/pihole-kubernetes-githubactions/compare/pihole-2.24.0...pihole-2.24.1) (2023-10-26) 315 | 316 | 317 | ### Bug Fixes 318 | 319 | * test ([368b29d](https://github.com/MoJo2600/pihole-kubernetes-githubactions/commit/368b29d72b7eb40058a6723cb12a118ae80a335f)) 320 | 321 | ## [2.24.0](https://github.com/MoJo2600/pihole-kubernetes-githubactions/compare/pihole-v2.23.2...pihole-2.24.0) (2023-10-26) 322 | 323 | 324 | ### Features 325 | 326 | * chart change ([b97b4f1](https://github.com/MoJo2600/pihole-kubernetes-githubactions/commit/b97b4f17c689a8e7a782820366501eb3f3d47822)) 327 | * chart change ([#27](https://github.com/MoJo2600/pihole-kubernetes-githubactions/issues/27)) ([79caa0a](https://github.com/MoJo2600/pihole-kubernetes-githubactions/commit/79caa0a2b868d92b5181071b67e268d81e460ce2)) 328 | * chart change more docu ([ee97a50](https://github.com/MoJo2600/pihole-kubernetes-githubactions/commit/ee97a50bb986e12acac90c0f6ae23d1ee3bd8f11)) 329 | * more documentation ([14b6386](https://github.com/MoJo2600/pihole-kubernetes-githubactions/commit/14b6386825725053455bbb1bbec4b47b95bb7a0a)) 330 | * more documentation ([ab229d7](https://github.com/MoJo2600/pihole-kubernetes-githubactions/commit/ab229d7c6fb8654a1d13bcfacf79b33dfc8e1233)) 331 | * release-please ([c084b92](https://github.com/MoJo2600/pihole-kubernetes-githubactions/commit/c084b92fd3cca0f45a43be384c4394d8ee066cec)) 332 | 333 | 334 | ### Bug Fixes 335 | 336 | * more documentation ([ab229d7](https://github.com/MoJo2600/pihole-kubernetes-githubactions/commit/ab229d7c6fb8654a1d13bcfacf79b33dfc8e1233)) 337 | * more documentation ([061aab8](https://github.com/MoJo2600/pihole-kubernetes-githubactions/commit/061aab85983c6e3adc853e68b3e96277c39659a5)) 338 | * release ([6dd7615](https://github.com/MoJo2600/pihole-kubernetes-githubactions/commit/6dd7615e603bba728ce1edcffac8361ddb18ddf4)) 339 | 340 | ## [2.23.1](https://github.com/MoJo2600/pihole-kubernetes-githubactions/compare/pihole-2.23.0...pihole-2.23.1) (2023-05-17) 341 | 342 | 343 | ### Bug Fixes 344 | 345 | * release ([6dd7615](https://github.com/MoJo2600/pihole-kubernetes-githubactions/commit/6dd7615e603bba728ce1edcffac8361ddb18ddf4)) 346 | 347 | ## [2.23.0](https://github.com/MoJo2600/pihole-kubernetes-githubactions/compare/pihole-2.22.0...pihole-2.23.0) (2023-05-17) 348 | 349 | 350 | ### Features 351 | 352 | * chart change ([b97b4f1](https://github.com/MoJo2600/pihole-kubernetes-githubactions/commit/b97b4f17c689a8e7a782820366501eb3f3d47822)) 353 | 354 | ## [2.22.0](https://github.com/MoJo2600/pihole-kubernetes-githubactions/compare/pihole-2.21.0...pihole-2.22.0) (2023-05-17) 355 | 356 | 357 | ### Features 358 | 359 | * chart change more docu ([ee97a50](https://github.com/MoJo2600/pihole-kubernetes-githubactions/commit/ee97a50bb986e12acac90c0f6ae23d1ee3bd8f11)) 360 | 361 | ## [2.21.0](https://github.com/MoJo2600/pihole-kubernetes-githubactions/compare/pihole-2.20.0...pihole-2.21.0) (2023-05-17) 362 | 363 | 364 | ### Features 365 | 366 | * more documentation ([14b6386](https://github.com/MoJo2600/pihole-kubernetes-githubactions/commit/14b6386825725053455bbb1bbec4b47b95bb7a0a)) 367 | 368 | ## [2.20.0](https://github.com/MoJo2600/pihole-kubernetes-githubactions/compare/pihole-v2.19.0...pihole-2.20.0) (2023-05-17) 369 | 370 | 371 | ### Features 372 | 373 | * more documentation ([ab229d7](https://github.com/MoJo2600/pihole-kubernetes-githubactions/commit/ab229d7c6fb8654a1d13bcfacf79b33dfc8e1233)) 374 | 375 | 376 | ### Bug Fixes 377 | 378 | * more documentation ([ab229d7](https://github.com/MoJo2600/pihole-kubernetes-githubactions/commit/ab229d7c6fb8654a1d13bcfacf79b33dfc8e1233)) 379 | * more documentation ([061aab8](https://github.com/MoJo2600/pihole-kubernetes-githubactions/commit/061aab85983c6e3adc853e68b3e96277c39659a5)) 380 | 381 | ## [2.19.0](https://github.com/MoJo2600/pihole-kubernetes-githubactions/compare/pihole-v2.18.0...pihole-v2.19.0) (2023-05-04) 382 | 383 | 384 | ### Features 385 | 386 | * release-please ([c084b92](https://github.com/MoJo2600/pihole-kubernetes-githubactions/commit/c084b92fd3cca0f45a43be384c4394d8ee066cec)) 387 | 388 | ## [2.18.0](https://github.com/MoJo2600/pihole-kubernetes-githubactions/compare/pihole-v2.17.0...pihole-v2.18.0) (2023-05-02) 389 | 390 | 391 | ### Features 392 | 393 | * more docu3 ([#8](https://github.com/MoJo2600/pihole-kubernetes-githubactions/issues/8)) ([a8ac693](https://github.com/MoJo2600/pihole-kubernetes-githubactions/commit/a8ac69371a794779bbbfc832509e5edd2d5d3708)) 394 | * more docu4 ([#10](https://github.com/MoJo2600/pihole-kubernetes-githubactions/issues/10)) ([e371a33](https://github.com/MoJo2600/pihole-kubernetes-githubactions/commit/e371a3307d72209203cfd3912874483d1982a9d6)) 395 | * more documentation ([#5](https://github.com/MoJo2600/pihole-kubernetes-githubactions/issues/5)) ([90d4703](https://github.com/MoJo2600/pihole-kubernetes-githubactions/commit/90d4703f40349fcfc0464d2e1631254ffac8f077)) 396 | * new build pipeline ([c3a7d71](https://github.com/MoJo2600/pihole-kubernetes-githubactions/commit/c3a7d714b332ee4de7e41947b78b35eb77cd1bbf)) 397 | * release please test ([#6](https://github.com/MoJo2600/pihole-kubernetes-githubactions/issues/6)) ([886eac4](https://github.com/MoJo2600/pihole-kubernetes-githubactions/commit/886eac4d8af189606ce6c8c42470a3cd8cf7b3aa)) 398 | * release please test asdf ([#12](https://github.com/MoJo2600/pihole-kubernetes-githubactions/issues/12)) ([005679e](https://github.com/MoJo2600/pihole-kubernetes-githubactions/commit/005679ec9debc74ae590f0897420024b50e8d8c0)) 399 | 400 | ## [2.17.0](https://github.com/MoJo2600/pihole-kubernetes-githubactions/compare/pihole-2.16.0...pihole-v2.17.0) (2023-05-02) 401 | 402 | 403 | ### Features 404 | 405 | * release please test asdf ([#12](https://github.com/MoJo2600/pihole-kubernetes-githubactions/issues/12)) ([005679e](https://github.com/MoJo2600/pihole-kubernetes-githubactions/commit/005679ec9debc74ae590f0897420024b50e8d8c0)) 406 | 407 | ## [2.16.0](https://github.com/MoJo2600/pihole-kubernetes-githubactions/compare/pihole-v2.15.0...pihole-v2.16.0) (2023-04-28) 408 | 409 | 410 | ### Features 411 | 412 | * more docu3 ([#8](https://github.com/MoJo2600/pihole-kubernetes-githubactions/issues/8)) ([a8ac693](https://github.com/MoJo2600/pihole-kubernetes-githubactions/commit/a8ac69371a794779bbbfc832509e5edd2d5d3708)) 413 | * more docu4 ([#10](https://github.com/MoJo2600/pihole-kubernetes-githubactions/issues/10)) ([e371a33](https://github.com/MoJo2600/pihole-kubernetes-githubactions/commit/e371a3307d72209203cfd3912874483d1982a9d6)) 414 | * more documentation ([#5](https://github.com/MoJo2600/pihole-kubernetes-githubactions/issues/5)) ([90d4703](https://github.com/MoJo2600/pihole-kubernetes-githubactions/commit/90d4703f40349fcfc0464d2e1631254ffac8f077)) 415 | * new build pipeline ([c3a7d71](https://github.com/MoJo2600/pihole-kubernetes-githubactions/commit/c3a7d714b332ee4de7e41947b78b35eb77cd1bbf)) 416 | * release please test ([#6](https://github.com/MoJo2600/pihole-kubernetes-githubactions/issues/6)) ([886eac4](https://github.com/MoJo2600/pihole-kubernetes-githubactions/commit/886eac4d8af189606ce6c8c42470a3cd8cf7b3aa)) 417 | -------------------------------------------------------------------------------- /charts/pihole/Chart.yaml: -------------------------------------------------------------------------------- 1 | apiVersion: v1 2 | description: Installs pihole in kubernetes 3 | home: https://github.com/MoJo2600/pihole-kubernetes/tree/main/charts/pihole 4 | name: pihole 5 | appVersion: "2025.04.0" 6 | # Do not touch will be updated during release 7 | version: 2.31.0 8 | sources: 9 | - https://github.com/MoJo2600/pihole-kubernetes/tree/main/charts/pihole 10 | - https://pi-hole.net/ 11 | - https://github.com/pi-hole 12 | - https://github.com/pi-hole/docker-pi-hole 13 | icon: https://wp-cdn.pi-hole.net/wp-content/uploads/2016/12/Vortex-R.png 14 | maintainers: 15 | - name: MoJo2600 16 | email: christian.erhardt@mojo2k.de 17 | -------------------------------------------------------------------------------- /charts/pihole/Makefile: -------------------------------------------------------------------------------- 1 | SHELL := /bin/bash 2 | .DEFAULT_GOAL := help 3 | 4 | .PHONY: help 5 | help: ## help target to show available commands with information 6 | @grep -E '^[a-zA-Z_-]+:.*?## .*$$' $(MAKEFILE_LIST) | awk 'BEGIN {FS = ":.*?## "}; {printf "\033[36m%-30s\033[0m %s\n", $$1, $$2}' 7 | 8 | .PHONY: generate-documentation 9 | generate-documentation: ## Generate README.md from template 10 | helm-docs -------------------------------------------------------------------------------- /charts/pihole/README.md.gotmpl: -------------------------------------------------------------------------------- 1 | {{ template "chart.header" . }} 2 | {{ template "chart.description" . }} 3 | 4 | {{ template "chart.versionBadge" . }}{{ template "chart.typeBadge" . }}{{ template "chart.appVersionBadge" . }} 5 | [![All Contributors](https://img.shields.io/badge/all_contributors-27-blue.svg?style=flat-square)](#contributors-) 6 | 7 | 8 | {{ template "chart.sourcesSection" . }} 9 | 10 | {{ template "chart.requirementsSection" . }} 11 | 12 | ## Installation 13 | 14 | Jeff Geerling on YouTube made a video about the installation of this chart: 15 | 16 | [![Jeff Geerling on YouTube](https://img.youtube.com/vi/IafVCHkJbtI/0.jpg)](https://youtu.be/IafVCHkJbtI?t=2655) 17 | 18 | ### Add Helm repository 19 | 20 | ```shell 21 | helm repo add mojo2600 https://mojo2600.github.io/pihole-kubernetes/ 22 | helm repo update 23 | ``` 24 | 25 | ### Configure the chart 26 | 27 | The following items can be set via `--set` flag during installation or configured by editing the `values.yaml` directly. 28 | 29 | #### Configure the way how to expose pihole service: 30 | 31 | - **Ingress**: The ingress controller must be installed in the Kubernetes cluster. 32 | - **ClusterIP**: Exposes the service on a cluster-internal IP. Choosing this value makes the service only reachable from within the cluster. 33 | - **LoadBalancer**: Exposes the service externally using a cloud provider’s load balancer. 34 | 35 | ## My settings in values.yaml 36 | 37 | ```console 38 | dnsmasq: 39 | customDnsEntries: 40 | - address=/nas/192.168.178.10 41 | 42 | customCnameEntries: 43 | - cname=foo.nas,nas 44 | 45 | persistentVolumeClaim: 46 | enabled: true 47 | 48 | serviceWeb: 49 | loadBalancerIP: 192.168.178.252 50 | annotations: 51 | metallb.universe.tf/allow-shared-ip: pihole-svc 52 | type: LoadBalancer 53 | 54 | serviceDns: 55 | loadBalancerIP: 192.168.178.252 56 | annotations: 57 | metallb.universe.tf/allow-shared-ip: pihole-svc 58 | type: LoadBalancer 59 | ``` 60 | 61 | ## Configuring Upstream DNS Resolvers 62 | 63 | By default, `pihole-kubernetes` will configure pod DNS automatically to use Google's `8.8.8.8` nameserver for upstream 64 | DNS resolution. You can configure this, or opt-out of pod DNS configuration completely. 65 | 66 | ### Changing The Upstream DNS Resolver 67 | 68 | For example, to use Cloudflare's resolver: 69 | 70 | ```yaml 71 | podDnsConfig: 72 | enabled: true 73 | policy: "None" 74 | nameservers: 75 | - 127.0.0.1 76 | - 1.1.1.1 77 | ``` 78 | 79 | ### Disabling Pod DNS Configuration 80 | 81 | If you have other DNS policy at play (for example, when running a service mesh), you may not want to have 82 | `pihole-kubernetes` control this behavior. In that case, you can disable DNS configuration on `pihole` pods: 83 | 84 | ```yaml 85 | podDnsConfig: 86 | enabled: false 87 | ``` 88 | 89 | ## Upgrading 90 | 91 | ### To 2.0.0 92 | 93 | This version splits the DHCP service into its own resource and puts the configuration to `serviceDhcp`. 94 | 95 | **If you have not changed any configuration for `serviceDns`, you don’t need to do anything.** 96 | 97 | If you have changed your `serviceDns` configuration, **copy** your `serviceDns` section into a new `serviceDhcp` section. 98 | 99 | ### To 1.8.22 100 | 101 | To enhance compatibility for Traefik, we split the TCP and UDP service into Web and DNS. This means, if you have a dedicated configuration for the service, you have to 102 | update your `values.yaml` and add a new configuration for this new service. 103 | 104 | Before (In my case, with metallb): 105 | ``` 106 | serviceTCP: 107 | loadBalancerIP: 192.168.178.252 108 | annotations: 109 | metallb.universe.tf/allow-shared-ip: pihole-svc 110 | 111 | serviceUDP: 112 | loadBalancerIP: 192.168.178.252 113 | annotations: 114 | metallb.universe.tf/allow-shared-ip: pihole-svc 115 | ``` 116 | 117 | After: 118 | ``` 119 | serviceWeb: 120 | loadBalancerIP: 192.168.178.252 121 | annotations: 122 | metallb.universe.tf/allow-shared-ip: pihole-svc 123 | 124 | serviceDns: 125 | loadBalancerIP: 192.168.178.252 126 | annotations: 127 | metallb.universe.tf/allow-shared-ip: pihole-svc 128 | ``` 129 | 130 | Version 1.8.22 has switched from the deprecated ingress api `extensions/v1beta1` to the go forward version `networking.k8s.io/v1`. This means that your cluster must be running 1.19.x as this api is not available on older versions. If necessary to run on an older Kubernetes Version, it can be done by modifying the ingress.yaml and changing the api definition back. The backend definition would also change from: 131 | 132 | ``` 133 | backend: 134 | service: 135 | name: \{\{ $serviceName \}\} 136 | port: 137 | name: http 138 | ``` 139 | to: 140 | ``` 141 | backend: 142 | serviceName: \{\{ $serviceName \}\} 143 | servicePort: http 144 | ``` 145 | 146 | ## Uninstallation 147 | 148 | To uninstall/delete the `my-release` deployment (NOTE: `--purge` is default behaviour in Helm 3+ and will error): 149 | 150 | ```bash 151 | helm delete --purge my-release 152 | ``` 153 | 154 | ## Configuration 155 | 156 | The following table lists the configurable parameters of the pihole chart and the default values. 157 | 158 | {{ template "chart.valuesSection" . }} 159 | 160 | {{ template "chart.maintainersSection" . }} 161 | 162 | ## Remarks 163 | 164 | ### MetalLB 0.8.1+ 165 | 166 | pihole seems to work without issue in MetalLB 0.8.1+ 167 | 168 | ### MetalLB 0.7.3 169 | 170 | MetalLB 0.7.3 has a bug, where the service is not announced anymore, when the pod changes (e.g. update of a deployment). My workaround is to restart the `metallb-speaker-*` pods. 171 | 172 | ## Credits 173 | 174 | [Pi-hole®](https://pi-hole.net/) 175 | 176 | ## Contributing 177 | 178 | Feel free to contribute by making a [pull request](https://github.com/MoJo2600/pihole-kubernetes/pull/new/master). 179 | 180 | Please read [Contribution Guide](../../CONTRIBUTING.md) for more information on how you can contribute to this Chart. 181 | 182 | 183 | ## Contributors ✨ 184 | 185 | Thanks goes to these wonderful people: 186 | 187 | 188 | 189 | 190 | 191 | 192 | 193 | 194 | 195 | 196 | 197 | 198 | 199 | 200 | 201 | 202 | 203 | 204 | 205 | 206 | 207 | 208 | 209 | 210 | 211 | 212 | 213 | 214 | 215 | 216 | 217 | 218 | 219 | 220 | 221 | 222 | 223 | 224 | 225 | 226 | 227 | 228 | 229 | 230 | 231 | 232 | 233 | 234 | 235 | 236 | 237 | 238 | 239 | 240 | 241 | 242 | 243 | 244 | 245 | 246 | 247 | 248 | 249 | 250 | 251 | 252 | 253 | 254 | 255 | 256 | 257 | 258 | 259 | 260 | 261 | 262 | 263 | 264 | 265 | 266 | 267 | 268 | 269 | 270 | 271 | 272 | 273 | 274 | 275 | 276 | 277 | 278 | 279 | 280 | 281 | 282 | 283 | 284 | 285 | 286 | 287 | 288 | 289 | 290 | 291 | 292 | 293 | 294 | 295 | 296 | 297 |

Christian Erhardt

Jeff Billimek

Steven Imle

Joseph Petersen

Simon Garcia

Andy Gilbreath

James Wilson

Krishnaswamy Subramanian

Lucas Romero

konturn

tdorsey

Ales Zelenik

Damien TOURDE

Jason Sievert

joshua-nord

Maximilian Bode

raackley

Sam Kleiner

Arpan Kapoor

Christian Rodriguez

Dave Cahill

golgoth31

Greg Jeanmart

Joseph Ball

Karlos

dza89

mikewhitley

Vashiru

sam-kleiner

Alex Gorbatchev

Alexander Rabenstein

David Fisher

Utku Özdemir

Morre Meyer

Donald Johnson

Winston R. Milling

Christopher Larivière

Justin Sievenpiper

beastob

Daniel Mühlbachler-Pietrzykowski

Erik Sundell

Kjeld Schouten-Lebbing

Brandon Wulf

DerRockWolf

brnl

Rafael Gaspar

Chadi El Masri

Dan Foulkes

George Rodrigues

Pascal Iske

Theo REY

Watteel Pascal

simon

Vincent

Clint

Philipp B.

ebCrypto

Ken Lasko

Mark Bundschuh

Max Rosin

Yang

dwarf-king-hreidmar

s94santos

Adam David

Ben Konicek

Gabisonfire

Giorgi Lekveishvili

Paimon Sorornejad

Jean-Kevin KPADEY

Alessandro Ogier

Luuk v/d Maagdenberg

Markus Mayer

Paulo Jesus

Lindemberg Barbosa

Ricardo Baltazar Chaves

Thomas Andrade

Alexandre Chappaz

Cristian Klein

JP Flouret

Eric
298 | 299 | 300 | 301 | 302 | 303 | 304 | This project follows the [all-contributors](https://github.com/all-contributors/all-contributors) specification. Contributions of any kind welcome! 305 | 306 | {{ template "helm-docs.versionFooter" . }} 307 | -------------------------------------------------------------------------------- /charts/pihole/ci/monitoring-values.yaml: -------------------------------------------------------------------------------- 1 | monitoring: 2 | enabled: true 3 | labels: 4 | testExtraLabel: fofa 5 | podMonitor: 6 | enabled: false 7 | -------------------------------------------------------------------------------- /charts/pihole/docs/Values.md: -------------------------------------------------------------------------------- 1 | # Values 2 | 3 | ## admin 4 | 5 | ### admin.annotations 6 | 7 | By allowing annotations to be added to the password secret, we can use tools like [Reflector](https://github.com/emberstack/kubernetes-reflector) to synchronize secrets across namespaces. 8 | 9 | This is interesting e.g. with the [ExternalDNS](https://github.com/kubernetes-sigs/external-dns) 0.14+'s Pi-Hole integration that can automatically expose Ingress host names to the Local DNS configuration: 10 | 11 | ```yaml 12 | apiVersion: apps/v1 13 | kind: Deployment 14 | metadata: 15 | name: external-dns 16 | spec: 17 | strategy: 18 | type: Recreate 19 | selector: 20 | matchLabels: 21 | app: external-dns 22 | template: 23 | metadata: 24 | labels: 25 | app: external-dns 26 | spec: 27 | serviceAccountName: external-dns 28 | containers: 29 | - name: external-dns 30 | image: registry.k8s.io/external-dns/external-dns:v0.14.0 31 | # If authentication is disabled and/or you didn't create 32 | # a secret, you can remove this block. 33 | envFrom: 34 | - secretRef: 35 | # Change this if you gave the secret a different name 36 | name: pihole-password 37 | args: 38 | - --source=service 39 | - --source=ingress 40 | # Pihole only supports A/CNAME records so there is no mechanism to track ownership. 41 | # You don't need to set this flag, but if you leave it unset, you will receive warning 42 | # logs when ExternalDNS attempts to create TXT records. 43 | - --registry=noop 44 | # IMPORTANT: If you have records that you manage manually in Pi-hole, set 45 | # the policy to upsert-only so they do not get deleted. 46 | - --policy=upsert-only 47 | - --provider=pihole 48 | # Change this to the actual address of your Pi-hole web server 49 | - --pihole-server=http://pihole-web.pihole.svc.cluster.local 50 | resources: 51 | limits: 52 | cpu: 1 53 | memory: 1Gi 54 | requests: 55 | cpu: 100m 56 | memory: 256M 57 | securityContext: 58 | fsGroup: 65534 # For ExternalDNS to be able to read Kubernetes token files 59 | ``` 60 | 61 | Since the Secret reference can only refer to a secret in the same namespace as ExternalDNS, using Reflector is a viable option to synchronize the two secrets. This can now be done via 62 | 63 | ```yaml 64 | admin: 65 | enabled: true 66 | existingSecret: "" 67 | passwordKey: "password" 68 | annotations: 69 | reflector.v1.k8s.emberstack.com/reflection-allowed: "true" 70 | reflector.v1.k8s.emberstack.com/reflection-allowed-namespaces: "external-dns" 71 | ``` 72 | 73 | For Reflector to work we also need to create the mirror (target) secret in ExternalDNS' namespace like this: 74 | 75 | ```yaml 76 | apiVersion: v1 77 | kind: Secret 78 | metadata: 79 | # Change this to match the secretRef used in the ExternalDNS deployment: 80 | name: pihole-password 81 | # Change this to ExternalDNS' namespace: 82 | namespace: external-dns 83 | annotations: 84 | # Change this to address the pihole password secret: 'namespace/secret-name': 85 | reflector.v1.k8s.emberstack.com/reflects: "pihole/pihole-password" 86 | data: {} # Will be overwritten by Reflector 87 | ``` 88 | -------------------------------------------------------------------------------- /charts/pihole/examples/dhcp-values.yaml: -------------------------------------------------------------------------------- 1 | --- 2 | # Start from this example if you also want to deploy the DHCP server. 3 | # 4 | # Sources: 5 | # - https://github.com/pi-hole/docker-pi-hole?tab=readme-ov-file#running-dhcp-from-docker-pi-hole 6 | # - https://askubuntu.com/a/1333865 7 | # 8 | # IMPORTANT!!! You must start by disabling `systemd-resolved`'s DNS Stub 9 | # resolver: 10 | # 11 | # 1. Edit `cat /etc/systemd/resolved.conf`. 12 | # 2. Change `#DNSStubListener=yes` to `DNSStubListener=no`. 13 | # 3. Type: 14 | # sudo ln -sf /run/systemd/resolve/resolv.conf /etc/resolv.conf 15 | # sudo systemctl daemon-reload 16 | # sudo systemctl restart systemd-resolved.service 17 | 18 | # Optional. Rather arbitrary resource settings. These work for me. 19 | # Take them or leave them, as you see fit. 20 | resources: 21 | limits: 22 | cpu: 100m 23 | memory: 128Mi 24 | requests: 25 | cpu: 100m 26 | memory: 128Mi 27 | 28 | # Optional. Persist DHCP leases and configuration. 29 | persistentVolumeClaim: 30 | enabled: true 31 | size: "10Mi" 32 | 33 | # Optional. Give the gateway and the pihole pretty DNS entries. 34 | # pi.hole is the default virtualhost for the web interface. 35 | dnsmasq: 36 | customDnsEntries: 37 | - address=/gateway.lan/192.168.1.1 38 | - address=/blacky.lan/192.168.1.10 39 | - address=/pi.hole/192.168.1.10 40 | 41 | # Mandatory. Allow DHCP to listen to broadcasts. 42 | capabilities: 43 | add: 44 | - NET_ADMIN 45 | 46 | # Mandatory. Allow DHCP broadcasts won't be heard via the CNI. 47 | hostNetwork: true 48 | 49 | # Optional. 50 | adminPassword: oqij234poij # UGLY!!! Consider using an existing secret 51 | 52 | # Mandatory. Configures the DHCP server, so you don't have to click around in 53 | # the web UI. 54 | extraEnvVars: 55 | DHCP_ACTIVE: true 56 | DHCP_START: 192.168.1.64 # Choose a reasonable start. 57 | DHCP_END: 192.168.1.254 # Choose a reasonable end. 58 | DHCP_ROUTER: 192.168.1.1 # Make sure this matches your gateway 59 | FTLCONF_LOCAL_IPV4: 192.168.1.10 # Set to the LAN IP address of your Pi-hole host 60 | INTERFACE: enp0s31f6 # Make sure this matches your hosts network interface 61 | -------------------------------------------------------------------------------- /charts/pihole/examples/k3s-values.yaml: -------------------------------------------------------------------------------- 1 | # This is the values.yaml I used on my k3s raspberrypi cluster 2 | 3 | # if you have a problem with serviceWeb Pods not building you might need to checkout this issue: 4 | # https://github.com/MoJo2600/pihole-kubernetes/issues/230 5 | 6 | ingress: 7 | enabled: true 8 | 9 | persistentVolumeClaim: 10 | enabled: true 11 | 12 | serviceWeb: 13 | loadBalancerIP: 192.168.178.201 14 | annotations: 15 | metallb.universe.tf/allow-shared-ip: pihole-svc 16 | type: LoadBalancer 17 | 18 | serviceDns: 19 | loadBalancerIP: 192.168.178.201 20 | annotations: 21 | metallb.universe.tf/allow-shared-ip: pihole-svc 22 | type: LoadBalancer 23 | 24 | serviceDhcp: 25 | loadBalancerIP: 192.168.178.201 26 | annotations: 27 | metallb.universe.tf/allow-shared-ip: pihole-svc 28 | type: LoadBalancer 29 | 30 | podDnsConfig: 31 | enabled: true 32 | policy: "None" 33 | nameservers: 34 | - 127.0.0.1 35 | - 8.8.8.8 36 | 37 | #! use an existing secret in a prod env 38 | adminPassword: "0n4BQ2l7Dbu3ViYgd4wu" 39 | 40 | resources: 41 | limits: 42 | cpu: 200m 43 | memory: 256Mi 44 | requests: 45 | cpu: 100m 46 | memory: 128Mi 47 | 48 | extraEnvVars: { 49 | DNSMASQ_USER: "root" 50 | } 51 | -------------------------------------------------------------------------------- /charts/pihole/examples/metallb-values.yaml: -------------------------------------------------------------------------------- 1 | dnsmasq: 2 | customDnsEntries: 3 | - address=/nas/192.168.178.10 4 | 5 | persistentVolumeClaim: 6 | enabled: true 7 | 8 | serviceTCP: 9 | loadBalancerIP: 192.168.178.253 10 | annotations: 11 | metallb.universe.tf/address-pool: network-services 12 | metallb.universe.tf/allow-shared-ip: pihole-svc 13 | 14 | serviceUDP: 15 | loadBalancerIP: 192.168.178.253 16 | annotations: 17 | metallb.universe.tf/address-pool: network-services 18 | metallb.universe.tf/allow-shared-ip: pihole-svc 19 | 20 | -------------------------------------------------------------------------------- /charts/pihole/templates/NOTES.txt: -------------------------------------------------------------------------------- 1 | Pi-hole Helm Chart Deployment 2 | 3 | 1. Pi-hole Deployment Information: 4 | - Release Name: {{ .Release.Name }} 5 | - Namespace: {{ .Release.Namespace }} 6 | - Chart Name: {{ .Chart.Name }} 7 | - Chart Version: {{ .Chart.Version }} 8 | 9 | 2. Pi-hole Service Information: 10 | - Service Name: {{ template "pihole.fullname" . }}-web 11 | - Service Type: ClusterIP 12 | - Service Port: 80/443 TCP 13 | 14 | - Service Name: {{ template "pihole.fullname" . }}-dns-tcp 15 | - Service Type: NodePort 16 | - Service Port: 53 TCP 17 | 18 | - Service Name: {{ template "pihole.fullname" . }}-dns-udp 19 | - Service Type: NodePort 20 | - Service Port: 53 UDP 21 | 22 | - Service Name: {{ template "pihole.fullname" . }}-dhcp 23 | - Service Type: NodePort 24 | - Service Port: 67 UDP 25 | 26 | 3. Accessing Pi-hole: 27 | !!! This chart does not create a Loadbalancer for pihole by default. Please 28 | create a configuration that is tailored to your setup. Especially the DNS 29 | and DHCP services are system services that require a dedicated setup based 30 | on your system !!! 31 | 32 | Find more information in the wiki: 33 | https://github.com/MoJo2600/pihole-kubernetes/wiki/Pi%E2%80%90hole 34 | 35 | 4. Useful Commands: 36 | - Check the Pi-hole Deployment Status: 37 | helm status {{ .Release.Name }} 38 | 39 | - Get Detailed Information about the Pi-hole Deployment: 40 | helm get all {{ .Release.Name }} 41 | 42 | 5. Clean Up: 43 | - To uninstall/delete the Pi-hole deployment, run: 44 | helm uninstall {{ .Release.Name }} -------------------------------------------------------------------------------- /charts/pihole/templates/_helpers.tpl: -------------------------------------------------------------------------------- 1 | {{/* vim: set filetype=mustache: */}} 2 | {{/* 3 | Expand the name of the chart. 4 | */}} 5 | {{- define "pihole.name" -}} 6 | {{- default .Chart.Name .Values.nameOverride | trunc 63 | trimSuffix "-" -}} 7 | {{- end -}} 8 | 9 | {{/* 10 | Create a default fully qualified app name. 11 | We truncate at 63 chars because some Kubernetes name fields are limited to this (by the DNS naming spec). 12 | If release name contains chart name it will be used as a full name. 13 | */}} 14 | {{- define "pihole.fullname" -}} 15 | {{- if .Values.fullnameOverride -}} 16 | {{- .Values.fullnameOverride | trunc 63 | trimSuffix "-" -}} 17 | {{- else -}} 18 | {{- $name := default .Chart.Name .Values.nameOverride -}} 19 | {{- if contains $name .Release.Name -}} 20 | {{- .Release.Name | trunc 63 | trimSuffix "-" -}} 21 | {{- else -}} 22 | {{- printf "%s-%s" .Release.Name $name | trunc 63 | trimSuffix "-" -}} 23 | {{- end -}} 24 | {{- end -}} 25 | {{- end -}} 26 | 27 | {{/* 28 | Create chart name and version as used by the chart label. 29 | */}} 30 | {{- define "pihole.chart" -}} 31 | {{- printf "%s-%s" .Chart.Name .Chart.Version | replace "+" "_" | trunc 63 | trimSuffix "-" -}} 32 | {{- end -}} 33 | 34 | {{/* 35 | Default password secret name. 36 | */}} 37 | {{- define "pihole.password-secret" -}} 38 | {{- printf "%s-%s" (include "pihole.fullname" .) "password" | replace "+" "_" | trunc 63 | trimSuffix "-" -}} 39 | {{- end -}} 40 | -------------------------------------------------------------------------------- /charts/pihole/templates/configmap-adlists.yaml: -------------------------------------------------------------------------------- 1 | {{ if .Values.adlists }} 2 | apiVersion: v1 3 | kind: ConfigMap 4 | metadata: 5 | name: {{ template "pihole.fullname" . }}-adlists 6 | labels: 7 | app: {{ template "pihole.name" . }} 8 | chart: {{ template "pihole.chart" . }} 9 | release: {{ .Release.Name }} 10 | heritage: {{ .Release.Service }} 11 | data: 12 | adlists.list: | 13 | {{- range .Values.adlists }} 14 | {{ . }} 15 | {{- end }} 16 | {{ end }} 17 | -------------------------------------------------------------------------------- /charts/pihole/templates/configmap-blacklist.yaml: -------------------------------------------------------------------------------- 1 | {{ if .Values.blacklist }} 2 | apiVersion: v1 3 | kind: ConfigMap 4 | metadata: 5 | name: {{ template "pihole.fullname" . }}-blacklist 6 | labels: 7 | app: {{ template "pihole.name" . }} 8 | chart: {{ template "pihole.chart" . }} 9 | release: {{ .Release.Name }} 10 | heritage: {{ .Release.Service }} 11 | data: 12 | blacklist.txt: | 13 | {{- range .Values.blacklist }} 14 | {{ . }} 15 | {{- end }} 16 | {{ end }} 17 | -------------------------------------------------------------------------------- /charts/pihole/templates/configmap-regex.yaml: -------------------------------------------------------------------------------- 1 | {{ if .Values.regex }} 2 | apiVersion: v1 3 | kind: ConfigMap 4 | metadata: 5 | name: {{ template "pihole.fullname" . }}-regex 6 | labels: 7 | app: {{ template "pihole.name" . }} 8 | chart: {{ template "pihole.chart" . }} 9 | release: {{ .Release.Name }} 10 | heritage: {{ .Release.Service }} 11 | data: 12 | regex.list: | 13 | {{- range .Values.regex }} 14 | {{ . }} 15 | {{- end }} 16 | {{ end }} 17 | -------------------------------------------------------------------------------- /charts/pihole/templates/configmap-static-dhcp.yaml: -------------------------------------------------------------------------------- 1 | {{ if .Values.dnsmasq.staticDhcpEntries }} 2 | apiVersion: v1 3 | kind: ConfigMap 4 | metadata: 5 | name: {{ template "pihole.fullname" . }}-static-dhcp 6 | labels: 7 | app: {{ template "pihole.name" . }} 8 | chart: {{ template "pihole.chart" . }} 9 | release: {{ .Release.Name }} 10 | heritage: {{ .Release.Service }} 11 | data: 12 | pihole-static-dhcp.conf: | 13 | {{- range .Values.dnsmasq.staticDhcpEntries }} 14 | {{ . }} 15 | {{- end }} 16 | {{ end }} 17 | -------------------------------------------------------------------------------- /charts/pihole/templates/configmap-whitelist.yaml: -------------------------------------------------------------------------------- 1 | {{ if .Values.whitelist }} 2 | apiVersion: v1 3 | kind: ConfigMap 4 | metadata: 5 | name: {{ template "pihole.fullname" . }}-whitelist 6 | labels: 7 | app: {{ template "pihole.name" . }} 8 | chart: {{ template "pihole.chart" . }} 9 | release: {{ .Release.Name }} 10 | heritage: {{ .Release.Service }} 11 | data: 12 | whitelist.txt: | 13 | {{- range .Values.whitelist }} 14 | {{ . }} 15 | {{- end }} 16 | {{ end }} 17 | -------------------------------------------------------------------------------- /charts/pihole/templates/configmap.yaml: -------------------------------------------------------------------------------- 1 | apiVersion: v1 2 | kind: ConfigMap 3 | metadata: 4 | name: {{ template "pihole.fullname" . }}-custom-dnsmasq 5 | labels: 6 | app: {{ template "pihole.name" . }} 7 | chart: {{ template "pihole.chart" . }} 8 | release: {{ .Release.Name }} 9 | heritage: {{ .Release.Service }} 10 | data: 11 | 02-custom.conf: | 12 | addn-hosts=/etc/addn-hosts 13 | {{- range .Values.dnsmasq.upstreamServers }} 14 | {{ . }} 15 | {{- end }} 16 | {{- range .Values.dnsmasq.customDnsEntries }} 17 | {{ . }} 18 | {{- end }} 19 | {{- if .Values.serviceDns.loadBalancerIP }} 20 | dhcp-option=6,{{ .Values.serviceDns.loadBalancerIP }} 21 | {{- end }} 22 | {{- range .Values.dnsmasq.customSettings }} 23 | {{ . }} 24 | {{- end }} 25 | addn-hosts: | 26 | {{- range .Values.dnsmasq.additionalHostsEntries }} 27 | {{ . }} 28 | {{- end }} 29 | 05-pihole-custom-cname.conf: | 30 | {{- range .Values.dnsmasq.customCnameEntries }} 31 | {{ . }} 32 | {{- end }} 33 | -------------------------------------------------------------------------------- /charts/pihole/templates/deployment.yaml: -------------------------------------------------------------------------------- 1 | apiVersion: apps/v1 2 | kind: Deployment 3 | metadata: 4 | name: {{ template "pihole.fullname" . }} 5 | labels: 6 | app: {{ template "pihole.name" . }} 7 | app.kubernetes.io/name: {{ template "pihole.name" . }} 8 | chart: {{ template "pihole.chart" . }} 9 | release: {{ .Release.Name }} 10 | heritage: {{ .Release.Service }} 11 | {{- with .Values.deploymentAnnotations }} 12 | annotations: 13 | {{- toYaml . | nindent 4 }} 14 | {{- end }} 15 | spec: 16 | replicas: {{ .Values.replicaCount }} 17 | strategy: 18 | type: {{ .Values.strategyType }} 19 | {{- if eq .Values.strategyType "RollingUpdate" }} 20 | rollingUpdate: 21 | maxSurge: {{ .Values.maxSurge }} 22 | maxUnavailable: {{ .Values.maxUnavailable }} 23 | {{- end }} 24 | selector: 25 | matchLabels: 26 | app: {{ template "pihole.name" . }} 27 | release: {{ .Release.Name }} 28 | template: 29 | metadata: 30 | annotations: 31 | checksum.config.adlists: {{ include (print $.Template.BasePath "/configmap-adlists.yaml") . | sha256sum | trunc 63 }} 32 | checksum.config.blacklist: {{ include (print $.Template.BasePath "/configmap-blacklist.yaml") . | sha256sum | trunc 63 }} 33 | checksum.config.regex: {{ include (print $.Template.BasePath "/configmap-regex.yaml") . | sha256sum | trunc 63 }} 34 | checksum.config.whitelist: {{ include (print $.Template.BasePath "/configmap-whitelist.yaml") . | sha256sum | trunc 63 }} 35 | checksum.config.dnsmasqConfig: {{ include (print $.Template.BasePath "/configmap.yaml") . | sha256sum | trunc 63 }} 36 | checksum.config.staticDhcpConfig: {{ include (print $.Template.BasePath "/configmap-static-dhcp.yaml") . | sha256sum | trunc 63 }} 37 | {{- with .Values.podAnnotations }} 38 | {{ toYaml . | indent 8 }} 39 | {{- end }} 40 | labels: 41 | app: {{ template "pihole.name" . }} 42 | app.kubernetes.io/name: {{ template "pihole.name" . }} 43 | release: {{ .Release.Name }} 44 | spec: 45 | {{- if .Values.antiaff.enabled }} 46 | affinity: 47 | podAntiAffinity: 48 | {{- if .Values.antiaff.strict }} 49 | requiredDuringSchedulingIgnoredDuringExecution: 50 | - labelSelector: 51 | {{- else }} 52 | preferredDuringSchedulingIgnoredDuringExecution: 53 | - weight: 100 54 | podAffinityTerm: 55 | labelSelector: 56 | {{- end }} 57 | matchExpressions: 58 | - key: release 59 | operator: In 60 | values: 61 | - {{ .Values.antiaff.avoidRelease }} 62 | {{- if .Values.antiaff.namespaces}} 63 | namespaces: 64 | {{- toYaml .Values.antiaff.namespaces | nindent 14 }} 65 | {{- end }} 66 | topologyKey: "kubernetes.io/hostname" 67 | {{- end }} 68 | {{- if .Values.podDnsConfig.enabled }} 69 | dnsPolicy: {{ .Values.podDnsConfig.policy }} 70 | dnsConfig: 71 | nameservers: 72 | {{- toYaml .Values.podDnsConfig.nameservers | nindent 8 }} 73 | {{- end }} 74 | hostname: {{ .Values.hostname }} 75 | hostNetwork: {{ .Values.hostNetwork }} 76 | {{- with .Values.extraInitContainers }} 77 | initContainers: 78 | {{- toYaml . | nindent 8 }} 79 | {{- end }} 80 | containers: 81 | {{- if .Values.extraContainers }} 82 | {{- toYaml .Values.extraContainers | nindent 8 }} 83 | {{- end }} 84 | {{- if .Values.monitoring.sidecar.enabled }} 85 | - name: exporter 86 | image: "{{ .Values.monitoring.sidecar.image.repository }}:{{ .Values.monitoring.sidecar.image.tag }}" 87 | imagePullPolicy: {{ .Values.monitoring.sidecar.image.pullPolicy }} 88 | terminationMessagePath: /dev/termination-log 89 | terminationMessagePolicy: File 90 | env: 91 | - name: PIHOLE_HOSTNAME 92 | valueFrom: 93 | fieldRef: 94 | fieldPath: status.podIP 95 | - name: PIHOLE_PORT 96 | value: "{{ .Values.webHttp }}" 97 | - name: PIHOLE_PASSWORD 98 | {{- if .Values.admin.enabled }} 99 | valueFrom: 100 | secretKeyRef: 101 | key: {{ .Values.admin.passwordKey | default "password" }} 102 | name: {{ .Values.admin.existingSecret | default (include "pihole.password-secret" .) }} 103 | {{- else }} 104 | value: "" 105 | {{- end }} 106 | resources: 107 | {{ toYaml .Values.monitoring.sidecar.resources | indent 12 }} 108 | ports: 109 | - containerPort: {{ .Values.monitoring.sidecar.port }} 110 | name: prometheus 111 | protocol: TCP 112 | {{- end }} 113 | {{- if .Values.doh.enabled }} 114 | - name: cloudflared 115 | image: "{{ .Values.doh.repository }}:{{ .Values.doh.tag }}" 116 | imagePullPolicy: {{ .Values.doh.pullPolicy }} 117 | terminationMessagePath: /dev/termination-log 118 | terminationMessagePolicy: File 119 | {{- if .Values.doh.command }} 120 | command: 121 | {{- range $key, $value := .Values.doh.command }} 122 | - {{ $value }} 123 | {{- end }} 124 | {{- end }} 125 | resources: 126 | limits: 127 | memory: 128Mi 128 | ports: 129 | - containerPort: 5053 130 | name: cloudflared-udp 131 | protocol: UDP 132 | - containerPort: 49312 133 | name: cloudflared-met 134 | protocol: TCP 135 | {{- if .Values.doh.envVars }} 136 | env: 137 | {{- range $key, $value := .Values.doh.envVars }} 138 | - name: {{ $key | quote }} 139 | value: {{ $value | quote }} 140 | {{- end }} 141 | {{- end }} 142 | {{- if .Values.doh.probes.liveness.enabled }} 143 | livenessProbe: 144 | {{ toYaml .Values.doh.probes.liveness.probe | indent 12 }} 145 | initialDelaySeconds: {{ .Values.doh.probes.liveness.initialDelaySeconds }} 146 | failureThreshold: {{ .Values.doh.probes.liveness.failureThreshold }} 147 | timeoutSeconds: {{ .Values.doh.probes.liveness.timeoutSeconds }} 148 | {{- end }} 149 | {{- if .Values.doh.probes.readiness.enabled }} 150 | readinessProbe: 151 | {{ toYaml .Values.doh.probes.readiness.probe | indent 12 }} 152 | initialDelaySeconds: {{ .Values.doh.probes.readiness.initialDelaySeconds }} 153 | failureThreshold: {{ .Values.doh.probes.readiness.failureThreshold }} 154 | timeoutSeconds: {{ .Values.doh.probes.readiness.timeoutSeconds }} 155 | {{- end }} 156 | {{- end }} 157 | - name: {{ .Chart.Name }} 158 | env: 159 | - name: 'FTLCONF_webserver_port' 160 | value: "{{ .Values.webHttp }}" 161 | - name: VIRTUAL_HOST 162 | value: {{ .Values.virtualHost }} 163 | - name: FTLCONF_misc_etc_dnsmasq_d 164 | value: {{ ne .Values.dnsmasq.enableCustomDnsMasq false | quote }} 165 | - name: FTLCONF_webserver_api_password 166 | {{- if .Values.admin.enabled }} 167 | valueFrom: 168 | secretKeyRef: 169 | key: {{ .Values.admin.passwordKey | default "password" }} 170 | name: {{ .Values.admin.existingSecret | default (include "pihole.password-secret" .) }} 171 | {{- else }} 172 | value: "" 173 | {{- end }} 174 | {{- range $key, $value := .Values.extraEnvVars }} 175 | - name: {{ $key | quote }} 176 | {{- if kindIs "map" $value }} 177 | {{- toYaml $value | nindent 12 }} 178 | {{- else }} 179 | value: {{ $value | quote }} 180 | {{- end }} 181 | {{- end }} 182 | {{- range $key, $value := .Values.extraEnvVarsSecret }} 183 | - name: {{ $key | quote }} 184 | valueFrom: 185 | secretKeyRef: 186 | key: {{ $value.key | quote }} 187 | name: {{ $value.name | quote }} 188 | {{- end }} 189 | {{- if .Values.doh.enabled }} 190 | - name: 'FTLCONF_dns_upstreams' 191 | value: "127.0.0.1#5053" 192 | {{- else }} 193 | {{- if .Values.DNS1 }} 194 | - name: 'FTLCONF_dns_upstreams' 195 | value: {{ if .Values.DNS2 }}{{ ( printf "%v;%v" .Values.DNS1 .Values.DNS2 ) }}{{ else }}{{ .Values.DNS1 }}{{ end }} 196 | {{- end }} 197 | {{- end }} 198 | {{- range $key, $value := .Values.ftl }} 199 | - name: 'FTLCONF_{{ $key }}' 200 | {{- if kindIs "map" $value }} 201 | {{- toYaml $value | nindent 12 }} 202 | {{- else }} 203 | value: {{ $value | quote }} 204 | {{- end }} 205 | {{- end }} 206 | image: "{{ .Values.image.repository }}:{{ .Values.image.tag | default .Chart.AppVersion }}" 207 | imagePullPolicy: {{ .Values.image.pullPolicy }} 208 | securityContext: 209 | privileged: {{ .Values.privileged }} 210 | {{- if .Values.capabilities }} 211 | capabilities: 212 | {{- toYaml .Values.capabilities | nindent 14 }} 213 | {{- end }} 214 | ports: 215 | - containerPort: {{ .Values.webHttp }} 216 | name: http 217 | protocol: TCP 218 | - containerPort: 53 219 | name: dns 220 | protocol: TCP 221 | {{- if .Values.dnsHostPort.enabled }} 222 | hostPort: {{ .Values.dnsHostPort.port }} 223 | {{- end }} 224 | - containerPort: 53 225 | name: dns-udp 226 | protocol: UDP 227 | {{- if .Values.dnsHostPort.enabled }} 228 | hostPort: {{ .Values.dnsHostPort.port }} 229 | {{- end }} 230 | - containerPort: {{ .Values.webHttps }} 231 | name: https 232 | protocol: TCP 233 | - containerPort: 67 234 | name: client-udp 235 | protocol: UDP 236 | {{- if .Values.probes.liveness.enabled }} 237 | livenessProbe: 238 | {{- if eq .Values.probes.liveness.type "command" }} 239 | exec: 240 | command: {{ .Values.probes.liveness.command | required "An array of command(s) is required if 'type' is set to 'command'." | toYaml | nindent 16 }} 241 | {{- else }} 242 | httpGet: 243 | path: /admin 244 | port: {{ .Values.probes.liveness.port }} 245 | scheme: {{ .Values.probes.liveness.scheme }} 246 | {{- end }} 247 | initialDelaySeconds: {{ .Values.probes.liveness.initialDelaySeconds }} 248 | failureThreshold: {{ .Values.probes.liveness.failureThreshold }} 249 | timeoutSeconds: {{ .Values.probes.liveness.timeoutSeconds }} 250 | 251 | {{- end }} 252 | {{- if .Values.probes.readiness.enabled }} 253 | readinessProbe: 254 | {{- if eq .Values.probes.readiness.type "command" }} 255 | exec: 256 | command: {{ .Values.probes.readiness.command | required "An array of command(s) is required if 'type' is set to 'command'." | toYaml | nindent 16 }} 257 | {{- else }} 258 | httpGet: 259 | path: /admin 260 | port: {{ .Values.probes.readiness.port }} 261 | scheme: {{ .Values.probes.readiness.scheme }} 262 | {{- end }} 263 | initialDelaySeconds: {{ .Values.probes.readiness.initialDelaySeconds }} 264 | failureThreshold: {{ .Values.probes.readiness.failureThreshold }} 265 | timeoutSeconds: {{ .Values.probes.readiness.timeoutSeconds }} 266 | {{- end }} 267 | volumeMounts: 268 | - mountPath: /etc/pihole 269 | name: config 270 | {{- if .Values.persistentVolumeClaim.subPath }} 271 | subPath: {{ .Values.persistentVolumeClaim.subPath }} 272 | {{- end }} 273 | - mountPath: /etc/dnsmasq.d/02-custom.conf 274 | name: custom-dnsmasq 275 | subPath: 02-custom.conf 276 | - mountPath: /etc/addn-hosts 277 | name: custom-dnsmasq 278 | subPath: addn-hosts 279 | {{- if .Values.dnsmasq.customCnameEntries }} 280 | - mountPath: /etc/dnsmasq.d/05-pihole-custom-cname.conf 281 | name: custom-dnsmasq 282 | subPath: 05-pihole-custom-cname.conf 283 | {{- end }} 284 | {{- if .Values.adlists }} 285 | - mountPath: /etc/pihole/adlists.list 286 | name: adlists 287 | subPath: adlists.list 288 | {{- end }} 289 | {{- if .Values.blacklist }} 290 | - mountPath: /etc/pihole/blacklist.txt 291 | name: blacklist 292 | subPath: blacklist.txt 293 | {{- end }} 294 | {{- if .Values.regex }} 295 | - mountPath: /etc/pihole/regex.list 296 | name: regex 297 | subPath: regex.list 298 | {{- end }} 299 | {{- if .Values.whitelist }} 300 | - mountPath: /etc/pihole/whitelist.txt 301 | name: whitelist 302 | subPath: whitelist.txt 303 | {{- end }} 304 | {{- if .Values.dnsmasq.staticDhcpEntries }} 305 | - mountPath: /etc/dnsmasq.d/04-pihole-static-dhcp.conf 306 | name: static-dhcp 307 | subPath: pihole-static-dhcp.conf 308 | {{- end }} 309 | {{- range $key, $value := .Values.extraVolumeMounts }} 310 | - name: {{ $key }} 311 | {{- toYaml $value | nindent 12 }} 312 | {{- end }} 313 | resources: 314 | {{ toYaml .Values.resources | indent 12 }} 315 | {{- with .Values.nodeSelector }} 316 | nodeSelector: 317 | {{ toYaml . | indent 8 }} 318 | {{- end }} 319 | {{- with .Values.affinity }} 320 | affinity: 321 | {{ toYaml . | indent 8 }} 322 | {{- end }} 323 | {{- with .Values.tolerations }} 324 | tolerations: 325 | {{ toYaml . | indent 8 }} 326 | {{- end }} 327 | {{- if .Values.priorityClassName }} 328 | priorityClassName: "{{ .Values.priorityClassName }}" 329 | {{- end }} 330 | {{- with .Values.topologySpreadConstraints }} 331 | topologySpreadConstraints: 332 | {{ toYaml . | indent 8 }} 333 | {{- end }} 334 | volumes: 335 | - name: config 336 | {{- if .Values.persistentVolumeClaim.enabled }} 337 | persistentVolumeClaim: 338 | claimName: {{ if .Values.persistentVolumeClaim.existingClaim }}{{ .Values.persistentVolumeClaim.existingClaim }}{{- else }}{{ template "pihole.fullname" . }}{{- end }} 339 | {{- else if .Values.customVolumes.enabled }} 340 | {{- toYaml .Values.customVolumes.config | nindent 8 }} 341 | {{- else }} 342 | emptyDir: {} 343 | {{- end }} 344 | - configMap: 345 | defaultMode: 420 346 | name: {{ template "pihole.fullname" . }}-custom-dnsmasq 347 | name: custom-dnsmasq 348 | {{- if .Values.adlists }} 349 | - configMap: 350 | defaultMode: 420 351 | name: {{ template "pihole.fullname" . }}-adlists 352 | name: adlists 353 | {{- end }} 354 | {{- if .Values.whitelist }} 355 | - configMap: 356 | defaultMode: 420 357 | name: {{ template "pihole.fullname" . }}-whitelist 358 | name: whitelist 359 | {{- end }} 360 | {{- if .Values.dnsmasq.staticDhcpEntries }} 361 | - configMap: 362 | defaultMode: 420 363 | name: {{ template "pihole.fullname" . }}-static-dhcp 364 | name: static-dhcp 365 | {{- end }} 366 | {{- if .Values.blacklist }} 367 | - configMap: 368 | defaultMode: 420 369 | name: {{ template "pihole.fullname" . }}-blacklist 370 | name: blacklist 371 | {{- end }} 372 | {{- if .Values.regex }} 373 | - configMap: 374 | defaultMode: 420 375 | name: {{ template "pihole.fullname" . }}-regex 376 | name: regex 377 | {{- end }} 378 | {{- range $key, $value := .Values.extraVolumes }} 379 | - name: {{ $key }} 380 | {{- toYaml $value | nindent 8 }} 381 | {{- end }} 382 | -------------------------------------------------------------------------------- /charts/pihole/templates/extra-manifests.yaml: -------------------------------------------------------------------------------- 1 | {{ range .Values.extraObjects }} 2 | --- 3 | {{ tpl (toYaml .) $ }} 4 | {{ end }} 5 | -------------------------------------------------------------------------------- /charts/pihole/templates/ingress.yaml: -------------------------------------------------------------------------------- 1 | {{- if .Values.ingress.enabled -}} 2 | {{- $serviceName := printf "%s-%s" (include "pihole.fullname" .) "web" -}} 3 | {{- $ingressPath := .Values.ingress.path -}} 4 | {{- $pathType := .Values.ingress.pathType -}} 5 | apiVersion: networking.k8s.io/v1 6 | kind: Ingress 7 | metadata: 8 | name: {{ template "pihole.fullname" . }} 9 | labels: 10 | app: {{ template "pihole.name" . }} 11 | chart: {{ .Chart.Name }}-{{ .Chart.Version | replace "+" "_" }} 12 | release: {{ .Release.Name }} 13 | heritage: {{ .Release.Service }} 14 | {{- with .Values.ingress.annotations }} 15 | annotations: 16 | {{- toYaml . | nindent 4 }} 17 | {{- end }} 18 | spec: 19 | {{- if .Values.ingress.ingressClassName }} 20 | ingressClassName: {{ .Values.ingress.ingressClassName }} 21 | {{- end }} 22 | {{- if .Values.ingress.tls }} 23 | tls: 24 | {{ toYaml .Values.ingress.tls | indent 4 }} 25 | {{- end }} 26 | rules: 27 | {{- range .Values.ingress.hosts }} 28 | - host: {{ . | quote }} 29 | http: 30 | paths: 31 | - path: {{ $ingressPath }} 32 | pathType: {{ $pathType }} 33 | backend: 34 | service: 35 | name: {{ $serviceName }} 36 | port: 37 | name: http 38 | {{- end }} 39 | {{- end }} 40 | -------------------------------------------------------------------------------- /charts/pihole/templates/pdb.yaml: -------------------------------------------------------------------------------- 1 | {{- if .Values.podDisruptionBudget.enabled -}} 2 | apiVersion: policy/v1 3 | kind: PodDisruptionBudget 4 | metadata: 5 | name: {{ template "pihole.fullname" . }}-pdb 6 | labels: 7 | app: {{ template "pihole.name" . }} 8 | chart: {{ template "pihole.chart" . }} 9 | release: {{ .Release.Name }} 10 | heritage: {{ .Release.Service }} 11 | spec: 12 | {{- if .Values.podDisruptionBudget.minAvailable }} 13 | minAvailable: {{ .Values.podDisruptionBudget.minAvailable }} 14 | {{- end }} 15 | {{- if .Values.podDisruptionBudget.maxUnavailable }} 16 | maxUnavailable: {{ .Values.podDisruptionBudget.maxUnavailable }} 17 | {{- end }} 18 | selector: 19 | matchLabels: 20 | app: {{ template "pihole.name" . }} 21 | {{- end }} 22 | -------------------------------------------------------------------------------- /charts/pihole/templates/podmonitor.yaml: -------------------------------------------------------------------------------- 1 | {{- if or .Values.monitoring.podMonitor.enabled .Values.doh.monitoring.podMonitor.enabled }} 2 | apiVersion: monitoring.coreos.com/v1 3 | kind: PodMonitor 4 | metadata: 5 | labels: 6 | app: {{ template "pihole.name" . }} 7 | chart: {{ template "pihole.chart" . }} 8 | release: {{ .Release.Name }} 9 | heritage: {{ .Release.Service }} 10 | {{- with .Values.monitoring.podMonitor.labels }} 11 | {{- . | toYaml | nindent 4 }} 12 | {{- end }} 13 | name: {{ template "pihole.fullname" . }}-prometheus-exporter 14 | {{- if .Values.monitoring.podMonitor.namespace }} 15 | namespace: {{ .Values.monitoring.podMonitor.namespace }} 16 | {{- end }} 17 | spec: 18 | podMetricsEndpoints: 19 | {{- if .Values.monitoring.podMonitor.enabled }} 20 | - port: prometheus 21 | path: /metrics 22 | {{- if .Values.monitoring.podMonitor.interval }} 23 | interval: {{ .Values.monitoring.podMonitor.interval }} 24 | {{- end }} 25 | {{- if .Values.monitoring.podMonitor.bearerTokenFile }} 26 | bearerTokenFile: {{ .Values.monitoring.podMonitor.bearerTokenFile }} 27 | {{- end }} 28 | {{- if .Values.monitoring.podMonitor.bearerTokenSecret }} 29 | bearerTokenSecret: 30 | name: {{ .Values.monitoring.podMonitor.bearerTokenSecret.name }} 31 | key: {{ .Values.monitoring.podMonitor.bearerTokenSecret.key }} 32 | {{- if .Values.monitoring.podMonitor.bearerTokenSecret.optional }} 33 | optional: {{ .Values.monitoring.podMonitor.bearerTokenSecret.optional }} 34 | {{- end }} 35 | {{- end }} 36 | {{- end }} 37 | {{- if .Values.doh.monitoring.podMonitor.enabled }} 38 | - port: cloudflared-met 39 | path: /metrics 40 | {{- end }} 41 | jobLabel: {{ template "pihole.fullname" . }}-prometheus-exporter 42 | namespaceSelector: 43 | matchNames: 44 | - {{ .Release.Namespace }} 45 | selector: 46 | matchLabels: 47 | app: {{ template "pihole.name" . }} 48 | release: {{ .Release.Name }} 49 | {{- end }} 50 | -------------------------------------------------------------------------------- /charts/pihole/templates/secret.yaml: -------------------------------------------------------------------------------- 1 | {{- if and .Values.admin.enabled (not .Values.admin.existingSecret) }} 2 | apiVersion: v1 3 | kind: Secret 4 | metadata: 5 | name: {{ template "pihole.password-secret" . }} 6 | labels: 7 | app: {{ template "pihole.name" . }} 8 | chart: {{ template "pihole.chart" . }} 9 | heritage: {{ .Release.Service }} 10 | release: {{ .Release.Name }} 11 | {{- with .Values.admin.annotations }} 12 | annotations: 13 | {{ toYaml . | indent 4 }} 14 | {{- end }} 15 | type: Opaque 16 | data: 17 | {{- if .Values.adminPassword }} 18 | password: {{ .Values.adminPassword | b64enc | quote }} 19 | {{- else }} 20 | password: {{ randAlphaNum 40 | b64enc | quote }} 21 | {{- end }} 22 | {{- end }} 23 | -------------------------------------------------------------------------------- /charts/pihole/templates/service-dhcp.yaml: -------------------------------------------------------------------------------- 1 | {{- if .Values.serviceDhcp.enabled }} 2 | apiVersion: v1 3 | kind: Service 4 | metadata: 5 | name: {{ template "pihole.fullname" . }}-dhcp 6 | labels: 7 | app: {{ template "pihole.name" . }} 8 | app.kubernetes.io/name: {{ template "pihole.name" . }} 9 | chart: {{ template "pihole.chart" . }} 10 | release: {{ .Release.Name }} 11 | heritage: {{ .Release.Service }} 12 | {{- if .Values.serviceDhcp.extraLabels }} 13 | {{ toYaml .Values.servicesDhcp.extraLabels | indent 4 }} 14 | {{- end }} 15 | {{- if .Values.serviceDhcp.annotations }} 16 | annotations: 17 | {{ toYaml .Values.serviceDhcp.annotations | indent 4 }} 18 | {{- end }} 19 | spec: 20 | type: {{ .Values.serviceDhcp.type }} 21 | {{- if and (.Values.dualStack.enabled) (not (eq .Values.serviceDhcp.type "LoadBalancer")) }} 22 | ipFamilies: 23 | - IPv4 24 | - IPv6 25 | ipFamilyPolicy: PreferDualStack 26 | {{- end }} 27 | {{- if .Values.serviceDhcp.loadBalancerIP }} 28 | loadBalancerIP: {{ .Values.serviceDhcp.loadBalancerIP }} 29 | {{- end }} 30 | {{- if and (eq .Values.serviceDhcp.type "LoadBalancer") .Values.serviceDhcp.loadBalancerClass }} 31 | loadBalancerClass: {{ .Values.serviceDhcp.loadBalancerClass }} 32 | {{- end }} 33 | {{- if or (eq .Values.serviceDhcp.type "NodePort") (eq .Values.serviceDhcp.type "LoadBalancer") }} 34 | externalTrafficPolicy: {{ .Values.serviceDhcp.externalTrafficPolicy }} 35 | {{- end }} 36 | ports: 37 | - port: {{ .Values.serviceDhcp.port }} 38 | targetPort: client-udp 39 | {{- if and (.Values.serviceDhcp.nodePort) (eq .Values.serviceDhcp.type "NodePort") }} 40 | nodePort: {{ .Values.serviceDhcp.nodePort }} 41 | {{- end }} 42 | protocol: UDP 43 | name: client-udp 44 | selector: 45 | app: {{ template "pihole.name" . }} 46 | release: {{ .Release.Name }} 47 | --- 48 | {{- if and (.Values.dualStack.enabled) (eq .Values.serviceDhcp.type "LoadBalancer") -}} 49 | apiVersion: v1 50 | kind: Service 51 | metadata: 52 | name: {{ template "pihole.fullname" . }}-dhcp-ivp6 53 | labels: 54 | app: {{ template "pihole.name" . }} 55 | app.kubernetes.io/name: {{ template "pihole.name" . }} 56 | chart: {{ template "pihole.chart" . }} 57 | release: {{ .Release.Name }} 58 | heritage: {{ .Release.Service }} 59 | {{- if .Values.serviceDhcp.annotations }} 60 | annotations: 61 | {{ toYaml .Values.serviceDhcp.annotations | indent 4 }} 62 | {{- end }} 63 | spec: 64 | type: {{ .Values.serviceDhcp.type }} 65 | ipFamilies: 66 | - IPv6 67 | ipFamilyPolicy: SingleStack 68 | {{- if .Values.serviceDhcp.loadBalancerIPv6 }} 69 | loadBalancerIP: {{ .Values.serviceDhcp.loadBalancerIPv6 }} 70 | {{- end }} 71 | {{- if and (eq .Values.serviceDhcp.type "LoadBalancer") .Values.serviceDhcp.loadBalancerClass }} 72 | loadBalancerClass: {{ .Values.serviceDhcp.loadBalancerClass }} 73 | {{- end }} 74 | {{- if or (eq .Values.serviceDhcp.type "NodePort") (eq .Values.serviceDhcp.type "LoadBalancer") }} 75 | externalTrafficPolicy: {{ .Values.serviceDhcp.externalTrafficPolicy }} 76 | {{- end }} 77 | ports: 78 | - port: 67 79 | targetPort: client-udp 80 | protocol: UDP 81 | name: client-udp 82 | selector: 83 | app: {{ template "pihole.name" . }} 84 | release: {{ .Release.Name }} 85 | {{- end }} 86 | {{- end }} 87 | -------------------------------------------------------------------------------- /charts/pihole/templates/service-dns-tcp.yaml: -------------------------------------------------------------------------------- 1 | {{- if not .Values.serviceDns.mixedService }} 2 | apiVersion: v1 3 | kind: Service 4 | metadata: 5 | name: {{ template "pihole.fullname" . }}-dns-tcp 6 | labels: 7 | app: {{ template "pihole.name" . }} 8 | app.kubernetes.io/name: {{ template "pihole.name" . }} 9 | chart: {{ template "pihole.chart" . }} 10 | release: {{ .Release.Name }} 11 | heritage: {{ .Release.Service }} 12 | {{- if .Values.serviceDns.extraLabels }} 13 | {{ toYaml .Values.serviceDns.extraLabels | indent 4 }} 14 | {{- end }} 15 | {{- if .Values.serviceDns.annotations }} 16 | annotations: 17 | {{ toYaml .Values.serviceDns.annotations | indent 4 }} 18 | {{- end }} 19 | spec: 20 | type: {{ .Values.serviceDns.type }} 21 | {{- if and (.Values.dualStack.enabled) (not (eq .Values.serviceDns.type "LoadBalancer")) }} 22 | ipFamilies: 23 | - IPv4 24 | - IPv6 25 | ipFamilyPolicy: PreferDualStack 26 | {{- end }} 27 | {{- if .Values.serviceDns.loadBalancerIP }} 28 | loadBalancerIP: {{ .Values.serviceDns.loadBalancerIP }} 29 | {{- end }} 30 | {{- if and (eq .Values.serviceDns.type "LoadBalancer") .Values.serviceDns.loadBalancerClass }} 31 | loadBalancerClass: {{ .Values.serviceDns.loadBalancerClass }} 32 | {{- end }} 33 | {{- if or (eq .Values.serviceDns.type "NodePort") (eq .Values.serviceDns.type "LoadBalancer") }} 34 | externalTrafficPolicy: {{ .Values.serviceDns.externalTrafficPolicy }} 35 | {{- end }} 36 | ports: 37 | - port: {{ .Values.serviceDns.port }} 38 | targetPort: dns 39 | {{- if and (.Values.serviceDns.nodePort) (eq .Values.serviceDns.type "NodePort") }} 40 | nodePort: {{ .Values.serviceDns.nodePort }} 41 | {{- end }} 42 | protocol: TCP 43 | name: dns 44 | {{- if .Values.monitoring.sidecar.enabled }} 45 | - port: {{ .Values.monitoring.sidecar.port }} 46 | targetPort: prometheus 47 | protocol: TCP 48 | name: prometheus 49 | {{- end }} 50 | selector: 51 | app: {{ template "pihole.name" . }} 52 | release: {{ .Release.Name }} 53 | --- 54 | {{- if and (.Values.dualStack.enabled) (eq .Values.serviceDns.type "LoadBalancer") -}} 55 | apiVersion: v1 56 | kind: Service 57 | metadata: 58 | name: {{ template "pihole.fullname" . }}-dns-tcp-ipv6 59 | labels: 60 | app: {{ template "pihole.name" . }} 61 | app.kubernetes.io/name: {{ template "pihole.name" . }} 62 | chart: {{ template "pihole.chart" . }} 63 | release: {{ .Release.Name }} 64 | heritage: {{ .Release.Service }} 65 | {{- if .Values.serviceDns.annotations }} 66 | annotations: 67 | {{ toYaml .Values.serviceDns.annotations | indent 4 }} 68 | {{- end }} 69 | spec: 70 | type: {{ .Values.serviceDns.type }} 71 | ipFamilies: 72 | - IPv6 73 | ipFamilyPolicy: SingleStack 74 | {{- if .Values.serviceDns.loadBalancerIPv6 }} 75 | loadBalancerIP: {{ .Values.serviceDns.loadBalancerIPv6 }} 76 | {{- end }} 77 | {{- if and (eq .Values.serviceDns.type "LoadBalancer") .Values.serviceDns.loadBalancerClass }} 78 | loadBalancerClass: {{ .Values.serviceDns.loadBalancerClass }} 79 | {{- end }} 80 | {{- if or (eq .Values.serviceDns.type "NodePort") (eq .Values.serviceDns.type "LoadBalancer") }} 81 | externalTrafficPolicy: {{ .Values.serviceDns.externalTrafficPolicy }} 82 | {{- end }} 83 | ports: 84 | - port: {{ .Values.serviceDns.port }} 85 | targetPort: dns 86 | protocol: TCP 87 | name: dns 88 | {{- if .Values.monitoring.sidecar.enabled }} 89 | - port: {{ .Values.monitoring.sidecar.port }} 90 | targetPort: prometheus 91 | protocol: TCP 92 | name: prometheus 93 | {{- end }} 94 | selector: 95 | app: {{ template "pihole.name" . }} 96 | release: {{ .Release.Name }} 97 | {{- end }} 98 | {{- end }} 99 | -------------------------------------------------------------------------------- /charts/pihole/templates/service-dns-udp.yaml: -------------------------------------------------------------------------------- 1 | {{- if not .Values.serviceDns.mixedService }} 2 | apiVersion: v1 3 | kind: Service 4 | metadata: 5 | name: {{ template "pihole.fullname" . }}-dns-udp 6 | labels: 7 | app: {{ template "pihole.name" . }} 8 | app.kubernetes.io/name: {{ template "pihole.name" . }} 9 | chart: {{ template "pihole.chart" . }} 10 | release: {{ .Release.Name }} 11 | heritage: {{ .Release.Service }} 12 | {{- if .Values.serviceDns.extraLabels }} 13 | {{ toYaml .Values.serviceDns.extraLabels | indent 4 }} 14 | {{- end }} 15 | {{- if .Values.serviceDns.annotations }} 16 | annotations: 17 | {{ toYaml .Values.serviceDns.annotations | indent 4 }} 18 | {{- end }} 19 | spec: 20 | type: {{ .Values.serviceDns.type }} 21 | {{- if and (.Values.dualStack.enabled) (not (eq .Values.serviceDns.type "LoadBalancer")) }} 22 | ipFamilies: 23 | - IPv4 24 | - IPv6 25 | ipFamilyPolicy: PreferDualStack 26 | {{- end }} 27 | {{- if .Values.serviceDns.loadBalancerIP }} 28 | loadBalancerIP: {{ .Values.serviceDns.loadBalancerIP }} 29 | {{- end }} 30 | {{- if and (eq .Values.serviceDns.type "LoadBalancer") .Values.serviceDns.loadBalancerClass }} 31 | loadBalancerClass: {{ .Values.serviceDns.loadBalancerClass }} 32 | {{- end }} 33 | {{- if or (eq .Values.serviceDns.type "NodePort") (eq .Values.serviceDns.type "LoadBalancer") }} 34 | externalTrafficPolicy: {{ .Values.serviceDns.externalTrafficPolicy }} 35 | {{- end }} 36 | ports: 37 | - port: {{ .Values.serviceDns.port }} 38 | targetPort: dns-udp 39 | {{- if and (.Values.serviceDns.nodePort) (eq .Values.serviceDns.type "NodePort") }} 40 | nodePort: {{ .Values.serviceDns.nodePort }} 41 | {{- end }} 42 | protocol: UDP 43 | name: dns-udp 44 | selector: 45 | app: {{ template "pihole.name" . }} 46 | release: {{ .Release.Name }} 47 | --- 48 | {{- if and (.Values.dualStack.enabled) (eq .Values.serviceDns.type "LoadBalancer") -}} 49 | apiVersion: v1 50 | kind: Service 51 | metadata: 52 | name: {{ template "pihole.fullname" . }}-dns-udp-ipv6 53 | labels: 54 | app: {{ template "pihole.name" . }} 55 | app.kubernetes.io/name: {{ template "pihole.name" . }} 56 | chart: {{ template "pihole.chart" . }} 57 | release: {{ .Release.Name }} 58 | heritage: {{ .Release.Service }} 59 | {{- if .Values.serviceDns.annotations }} 60 | annotations: 61 | {{ toYaml .Values.serviceDns.annotations | indent 4 }} 62 | {{- end }} 63 | spec: 64 | type: {{ .Values.serviceDns.type }} 65 | ipFamilies: 66 | - IPv6 67 | ipFamilyPolicy: SingleStack 68 | {{- if .Values.serviceDns.loadBalancerIPv6 }} 69 | loadBalancerIP: {{ .Values.serviceDns.loadBalancerIPv6 }} 70 | {{- end }} 71 | {{- if and (eq .Values.serviceDns.type "LoadBalancer") .Values.serviceDns.loadBalancerClass }} 72 | loadBalancerClass: {{ .Values.serviceDns.loadBalancerClass }} 73 | {{- end }} 74 | {{- if or (eq .Values.serviceDns.type "NodePort") (eq .Values.serviceDns.type "LoadBalancer") }} 75 | externalTrafficPolicy: {{ .Values.serviceDns.externalTrafficPolicy }} 76 | {{- end }} 77 | ports: 78 | - port: {{ .Values.serviceDns.port }} 79 | targetPort: dns-udp 80 | protocol: UDP 81 | name: dns-udp 82 | selector: 83 | app: {{ template "pihole.name" . }} 84 | release: {{ .Release.Name }} 85 | {{- end }} 86 | {{- end }} 87 | -------------------------------------------------------------------------------- /charts/pihole/templates/service-dns.yaml: -------------------------------------------------------------------------------- 1 | {{- if .Values.serviceDns.mixedService }} 2 | apiVersion: v1 3 | kind: Service 4 | metadata: 5 | name: {{ template "pihole.fullname" . }}-dns 6 | labels: 7 | app: {{ template "pihole.name" . }} 8 | app.kubernetes.io/name: {{ template "pihole.name" . }} 9 | chart: {{ template "pihole.chart" . }} 10 | release: {{ .Release.Name }} 11 | heritage: {{ .Release.Service }} 12 | {{- if .Values.serviceDns.extraLabels }} 13 | {{ toYaml .Values.serviceDns.extraLabels | indent 4 }} 14 | {{- end }} 15 | {{- if .Values.serviceDns.annotations }} 16 | annotations: 17 | {{ toYaml .Values.serviceDns.annotations | indent 4 }} 18 | {{- end }} 19 | spec: 20 | type: {{ .Values.serviceDns.type }} 21 | {{- if .Values.serviceDns.loadBalancerIP }} 22 | loadBalancerIP: {{ .Values.serviceDns.loadBalancerIP }} 23 | {{- end }} 24 | {{- if and (eq .Values.serviceDns.type "LoadBalancer") .Values.serviceDns.loadBalancerClass }} 25 | loadBalancerClass: {{ .Values.serviceDns.loadBalancerClass }} 26 | {{- end }} 27 | {{- if or (eq .Values.serviceDns.type "NodePort") (eq .Values.serviceDns.type "LoadBalancer") }} 28 | externalTrafficPolicy: {{ .Values.serviceDns.externalTrafficPolicy }} 29 | {{- end }} 30 | ports: 31 | - port: {{ .Values.serviceDns.port }} 32 | targetPort: dns 33 | {{- if .Values.serviceDns.nodePort }} 34 | nodePort: {{ .Values.serviceDns.nodePort }} 35 | {{- end }} 36 | protocol: TCP 37 | name: dns 38 | - port: {{ .Values.serviceDns.port }} 39 | targetPort: dns-udp 40 | {{- if and (.Values.serviceDns.nodePort) (eq .Values.serviceDns.type "NodePort") }} 41 | nodePort: {{ .Values.serviceDns.nodePort }} 42 | {{- end }} 43 | protocol: UDP 44 | name: dns-udp 45 | {{- if .Values.monitoring.sidecar.enabled }} 46 | - port: {{ .Values.monitoring.sidecar.port }} 47 | targetPort: prometheus 48 | protocol: TCP 49 | name: prometheus 50 | {{- end }} 51 | selector: 52 | app: {{ template "pihole.name" . }} 53 | release: {{ .Release.Name }} 54 | --- 55 | {{- if and (.Values.dualStack.enabled) (eq .Values.serviceDns.type "LoadBalancer") -}} 56 | apiVersion: v1 57 | kind: Service 58 | metadata: 59 | name: {{ template "pihole.fullname" . }}-dns-ipv6 60 | labels: 61 | app: {{ template "pihole.name" . }} 62 | app.kubernetes.io/name: {{ template "pihole.name" . }} 63 | chart: {{ template "pihole.chart" . }} 64 | release: {{ .Release.Name }} 65 | heritage: {{ .Release.Service }} 66 | {{- if .Values.serviceDns.annotations }} 67 | annotations: 68 | {{ toYaml .Values.serviceDns.annotations | indent 4 }} 69 | {{- end }} 70 | spec: 71 | type: {{ .Values.serviceDns.type }} 72 | ipFamilies: 73 | - IPv6 74 | ipFamilyPolicy: SingleStack 75 | {{- if .Values.serviceDns.loadBalancerIPv6 }} 76 | loadBalancerIP: {{ .Values.serviceDns.loadBalancerIPv6 }} 77 | {{- end }} 78 | {{- if and (eq .Values.serviceDns.type "LoadBalancer") .Values.serviceDns.loadBalancerClass }} 79 | loadBalancerClass: {{ .Values.serviceDns.loadBalancerClass }} 80 | {{- end }} 81 | {{- if or (eq .Values.serviceDns.type "NodePort") (eq .Values.serviceDns.type "LoadBalancer") }} 82 | externalTrafficPolicy: {{ .Values.serviceDns.externalTrafficPolicy }} 83 | {{- end }} 84 | ports: 85 | - port: {{ .Values.serviceDns.port }} 86 | targetPort: dns 87 | protocol: TCP 88 | name: dns 89 | - port: {{ .Values.serviceDns.port }} 90 | targetPort: dns-udp 91 | protocol: UDP 92 | name: dns-udp 93 | {{- if .Values.monitoring.sidecar.enabled }} 94 | - port: {{ .Values.monitoring.sidecar.port }} 95 | targetPort: prometheus 96 | protocol: TCP 97 | name: prometheus 98 | {{- end }} 99 | selector: 100 | app: {{ template "pihole.name" . }} 101 | release: {{ .Release.Name }} 102 | {{- end }} 103 | {{- end }} 104 | -------------------------------------------------------------------------------- /charts/pihole/templates/service-web.yaml: -------------------------------------------------------------------------------- 1 | {{- if or .Values.serviceWeb.http.enabled .Values.serviceWeb.https.enabled -}} 2 | apiVersion: v1 3 | kind: Service 4 | metadata: 5 | name: {{ template "pihole.fullname" . }}-web 6 | labels: 7 | app: {{ template "pihole.name" . }} 8 | app.kubernetes.io/name: {{ template "pihole.name" . }} 9 | chart: {{ template "pihole.chart" . }} 10 | release: {{ .Release.Name }} 11 | heritage: {{ .Release.Service }} 12 | {{- if .Values.serviceWeb.extraLabels }} 13 | {{ toYaml .Values.serviceWeb.extraLabels | indent 4 }} 14 | {{- end }} 15 | {{- if .Values.serviceWeb.annotations }} 16 | annotations: 17 | {{ toYaml .Values.serviceWeb.annotations | indent 4 }} 18 | {{- end }} 19 | spec: 20 | type: {{ .Values.serviceWeb.type }} 21 | {{- if and (.Values.dualStack.enabled) (not (eq .Values.serviceWeb.type "LoadBalancer")) }} 22 | ipFamilies: 23 | - IPv4 24 | - IPv6 25 | ipFamilyPolicy: PreferDualStack 26 | {{- end }} 27 | {{- if .Values.serviceWeb.loadBalancerIP }} 28 | loadBalancerIP: {{ .Values.serviceWeb.loadBalancerIP }} 29 | {{- end }} 30 | {{- if and (eq .Values.serviceWeb.type "LoadBalancer") .Values.serviceWeb.loadBalancerClass }} 31 | loadBalancerClass: {{ .Values.serviceWeb.loadBalancerClass }} 32 | {{- end }} 33 | {{- if or (eq .Values.serviceWeb.type "NodePort") (eq .Values.serviceWeb.type "LoadBalancer") }} 34 | externalTrafficPolicy: {{ .Values.serviceWeb.externalTrafficPolicy }} 35 | {{- end }} 36 | ports: 37 | {{- if .Values.serviceWeb.http.enabled }} 38 | - port: {{ .Values.serviceWeb.http.port }} 39 | targetPort: http 40 | {{- if and (.Values.serviceWeb.http.nodePort) (eq .Values.serviceWeb.type "NodePort") }} 41 | nodePort: {{ .Values.serviceWeb.http.nodePort }} 42 | {{- end }} 43 | protocol: TCP 44 | name: http 45 | {{- end }} 46 | {{- if .Values.serviceWeb.https.enabled }} 47 | - port: {{ .Values.serviceWeb.https.port }} 48 | targetPort: https 49 | {{- if and (.Values.serviceWeb.https.nodePort) (eq .Values.serviceWeb.type "NodePort") }} 50 | nodePort: {{ .Values.serviceWeb.https.nodePort }} 51 | {{- end }} 52 | protocol: TCP 53 | name: https 54 | {{- end }} 55 | {{- if .Values.doh.enabled }} 56 | - port: 49312 57 | protocol: TCP 58 | name: cloudflared-met 59 | {{- end }} 60 | selector: 61 | app: {{ template "pihole.name" . }} 62 | release: {{ .Release.Name }} 63 | --- 64 | {{- if and (.Values.dualStack.enabled) (eq .Values.serviceWeb.type "LoadBalancer") -}} 65 | apiVersion: v1 66 | kind: Service 67 | metadata: 68 | name: {{ template "pihole.fullname" . }}-web-ipv6 69 | labels: 70 | app: {{ template "pihole.name" . }} 71 | app.kubernetes.io/name: {{ template "pihole.name" . }} 72 | chart: {{ template "pihole.chart" . }} 73 | release: {{ .Release.Name }} 74 | heritage: {{ .Release.Service }} 75 | {{- if .Values.serviceWeb.annotations }} 76 | annotations: 77 | {{ toYaml .Values.serviceWeb.annotations | indent 4 }} 78 | {{- end }} 79 | spec: 80 | type: {{ .Values.serviceWeb.type }} 81 | ipFamilies: 82 | - IPv6 83 | ipFamilyPolicy: SingleStack 84 | {{- if .Values.serviceWeb.loadBalancerIPv6 }} 85 | loadBalancerIP: {{ .Values.serviceWeb.loadBalancerIPv6 }} 86 | {{- end }} 87 | {{- if and (eq .Values.serviceWeb.type "LoadBalancer") .Values.serviceWeb.loadBalancerClass }} 88 | loadBalancerClass: {{ .Values.serviceWeb.loadBalancerClass }} 89 | {{- end }} 90 | {{- if or (eq .Values.serviceWeb.type "NodePort") (eq .Values.serviceWeb.type "LoadBalancer") }} 91 | externalTrafficPolicy: {{ .Values.serviceWeb.externalTrafficPolicy }} 92 | {{- end }} 93 | ports: 94 | {{- if .Values.serviceWeb.http.enabled }} 95 | - port: {{ .Values.serviceWeb.http.port }} 96 | targetPort: http 97 | protocol: TCP 98 | name: http 99 | {{- end }} 100 | {{- if .Values.serviceWeb.https.enabled }} 101 | - port: {{ .Values.serviceWeb.https.port }} 102 | targetPort: https 103 | protocol: TCP 104 | name: https 105 | {{- end }} 106 | {{- if .Values.doh.enabled }} 107 | - port: 49312 108 | protocol: TCP 109 | name: cloudflared-met 110 | {{- end }} 111 | selector: 112 | app: {{ template "pihole.name" . }} 113 | release: {{ .Release.Name }} 114 | {{- end }} 115 | {{- end }} -------------------------------------------------------------------------------- /charts/pihole/templates/tests/test-pihole-endpoint.yml: -------------------------------------------------------------------------------- 1 | apiVersion: v1 2 | kind: Pod 3 | metadata: 4 | name: "{{ .Release.Name }}-smoke-test" 5 | annotations: 6 | "helm.sh/hook": test 7 | spec: 8 | containers: 9 | - name: hook1-container 10 | image: curlimages/curl 11 | imagePullPolicy: IfNotPresent 12 | command: ['sh', '-c', 'curl http://{{ template "pihole.fullname" . }}-web:80/'] 13 | restartPolicy: Never 14 | terminationGracePeriodSeconds: 0 15 | -------------------------------------------------------------------------------- /charts/pihole/templates/volume-claim.yaml: -------------------------------------------------------------------------------- 1 | {{- if .Values.persistentVolumeClaim.enabled -}} 2 | {{- if not .Values.persistentVolumeClaim.existingClaim -}} 3 | apiVersion: "v1" 4 | kind: "PersistentVolumeClaim" 5 | metadata: 6 | {{- if .Values.persistentVolumeClaim.annotations }} 7 | annotations: 8 | {{ toYaml .Values.persistentVolumeClaim.annotations | indent 4 }} 9 | {{- end }} 10 | labels: 11 | app: {{ template "pihole.name" . }} 12 | chart: {{ .Chart.Name }}-{{ .Chart.Version }} 13 | component: "{{ .Values.persistentVolumeClaim.name }}" 14 | heritage: {{ .Release.Service }} 15 | release: {{ .Release.Name }} 16 | name: {{ template "pihole.fullname" . }} 17 | spec: 18 | accessModes: 19 | {{ toYaml .Values.persistentVolumeClaim.accessModes | indent 4 }} 20 | {{- if .Values.persistentVolumeClaim.storageClass }} 21 | {{- if (eq "-" .Values.persistentVolumeClaim.storageClass) }} 22 | storageClassName: "" 23 | {{- else }} 24 | storageClassName: "{{ .Values.persistentVolumeClaim.storageClass }}" 25 | {{- end }} 26 | {{- end }} 27 | resources: 28 | requests: 29 | storage: "{{ .Values.persistentVolumeClaim.size }}" 30 | {{- end -}} 31 | {{- end -}} -------------------------------------------------------------------------------- /charts/pihole/values.yaml: -------------------------------------------------------------------------------- 1 | # Default values for pihole. 2 | # This is a YAML-formatted file. 3 | # Declare variables to be passed into your templates. 4 | 5 | # -- The number of replicas 6 | replicaCount: 1 7 | 8 | # -- The `spec.strategyTpye` for updates 9 | strategyType: RollingUpdate 10 | 11 | # -- The maximum number of Pods that can be created over the desired number of `ReplicaSet` during updating. 12 | maxSurge: 1 13 | 14 | # -- The maximum number of Pods that can be unavailable during updating 15 | maxUnavailable: 1 16 | 17 | image: 18 | # -- the repostory to pull the image from 19 | repository: "pihole/pihole" 20 | # -- the docker tag, if left empty it will get it from the chart's appVersion 21 | tag: "" 22 | # -- the pull policy 23 | pullPolicy: IfNotPresent 24 | 25 | dualStack: 26 | # -- set this to true to enable creation of DualStack services or creation of separate IPv6 services if `serviceDns.type` is set to `"LoadBalancer"` 27 | enabled: false 28 | 29 | dnsHostPort: 30 | # -- set this to true to enable dnsHostPort 31 | enabled: false 32 | # -- default port for this pod 33 | port: 53 34 | 35 | # -- Configuration for the DNS service on port 53 36 | serviceDns: 37 | # -- deploys a mixed (TCP + UDP) Service instead of separate ones 38 | mixedService: false 39 | 40 | # -- `spec.type` for the DNS Service 41 | type: NodePort 42 | 43 | # -- The port of the DNS service 44 | port: 53 45 | 46 | # -- Optional node port for the DNS service 47 | nodePort: "" 48 | 49 | # -- `spec.externalTrafficPolicy` for the DHCP Service 50 | externalTrafficPolicy: Local 51 | 52 | # -- A fixed `spec.loadBalancerIP` for the DNS Service 53 | loadBalancerIP: "" 54 | # -- A fixed `spec.loadBalancerIP` for the IPv6 DNS Service 55 | loadBalancerIPv6: "" 56 | # -- `spec.loadBalancerClass` for the DNS Service. Only used if type is LoadBalancer. 57 | loadBalancerClass: "" 58 | 59 | # -- Annotations for the DNS service 60 | annotations: {} 61 | # metallb.universe.tf/address-pool: network-services 62 | # metallb.universe.tf/allow-shared-ip: pihole-svc 63 | 64 | # -- Labels for the DNS service 65 | extraLabels: 66 | {} 67 | 68 | # -- Configuration for the DHCP service on port 67 69 | serviceDhcp: 70 | # -- Generate a Service resource for DHCP traffic 71 | enabled: true 72 | 73 | # -- `spec.type` for the DHCP Service 74 | type: NodePort 75 | 76 | # -- The port of the DHCP service 77 | port: 67 78 | 79 | # -- Optional node port for the DHCP service 80 | nodePort: "" 81 | 82 | # -- `spec.externalTrafficPolicy` for the DHCP Service 83 | externalTrafficPolicy: Local 84 | 85 | # -- A fixed `spec.loadBalancerIP` for the DHCP Service 86 | loadBalancerIP: "" 87 | # -- A fixed `spec.loadBalancerIP` for the IPv6 DHCP Service 88 | loadBalancerIPv6: "" 89 | # -- `spec.loadBalancerClass` for the DHCP Service. Only used if type is LoadBalancer. 90 | loadBalancerClass: "" 91 | 92 | # -- Annotations for the DHCP service 93 | annotations: {} 94 | # metallb.universe.tf/address-pool: network-services 95 | # metallb.universe.tf/allow-shared-ip: pihole-svc 96 | # -- Labels for the DHCP service 97 | extraLabels: 98 | {} 99 | 100 | # -- Configuration for the web interface service 101 | serviceWeb: 102 | # -- Configuration for the HTTP web interface listener 103 | http: 104 | # -- Generate a service for HTTP traffic 105 | enabled: true 106 | 107 | # -- The port of the web HTTP service 108 | port: 80 109 | 110 | # -- Optional node port for the web HTTP service 111 | nodePort: "" 112 | 113 | # -- Configuration for the HTTPS web interface listener 114 | https: 115 | # -- Generate a service for HTTPS traffic 116 | enabled: true 117 | 118 | # -- The port of the web HTTPS service 119 | port: 443 120 | 121 | # -- Optional node port for the web HTTPS service 122 | nodePort: "" 123 | 124 | # -- `spec.type` for the web interface Service 125 | type: ClusterIP 126 | 127 | # -- `spec.externalTrafficPolicy` for the web interface Service 128 | externalTrafficPolicy: Local 129 | 130 | # -- A fixed `spec.loadBalancerIP` for the web interface Service 131 | loadBalancerIP: "" 132 | # -- A fixed `spec.loadBalancerIP` for the IPv6 web interface Service 133 | loadBalancerIPv6: "" 134 | # -- `spec.loadBalancerClass` for the web interface Service. Only used if type is LoadBalancer. 135 | loadBalancerClass: "" 136 | 137 | # -- Annotations for the DHCP service 138 | annotations: {} 139 | # metallb.universe.tf/address-pool: network-services 140 | # metallb.universe.tf/allow-shared-ip: pihole-svc 141 | 142 | # -- Labels for the web interface service 143 | extraLabels: 144 | {} 145 | 146 | virtualHost: pi.hole 147 | 148 | # -- Configuration for the Ingress 149 | ingress: 150 | # -- Generate a Ingress resource 151 | enabled: false 152 | 153 | # -- Specify an ingressClassName 154 | # ingressClassName: nginx 155 | 156 | # -- Annotations for the ingress 157 | annotations: {} 158 | # kubernetes.io/ingress.class: nginx 159 | # kubernetes.io/tls-acme: "true" 160 | path: / 161 | pathType: ImplementationSpecific 162 | hosts: 163 | # virtualHost (default value is pi.hole) will be appended to the hosts 164 | - chart-example.local 165 | tls: [] 166 | # - secretName: chart-example-tls 167 | # hosts: 168 | # #- virtualHost (default value is pi.hole) will be appended to the hosts 169 | # - chart-example.local 170 | 171 | # -- Probes configuration 172 | probes: 173 | # -- probes.liveness -- Configure the healthcheck for the ingress controller 174 | liveness: 175 | # -- Generate a liveness probe 176 | # 'type' defaults to httpGet, can be set to 'command' to use a command type liveness probe. 177 | type: httpGet 178 | # command: 179 | # - /bin/bash 180 | # - -c 181 | # - /bin/true 182 | enabled: true 183 | # -- wait time before trying the liveness probe 184 | initialDelaySeconds: 60 185 | # -- threshold until the probe is considered failing 186 | failureThreshold: 10 187 | # -- timeout in seconds 188 | timeoutSeconds: 5 189 | port: http 190 | scheme: HTTP 191 | readiness: 192 | # -- Generate a readiness probe 193 | # 'type' defaults to httpGet, can be set to 'command' to use a command type readiness probe. 194 | type: httpGet 195 | # command: 196 | # - /bin/bash 197 | # - -c 198 | # - /bin/true 199 | enabled: true 200 | # -- wait time before trying the readiness probe 201 | initialDelaySeconds: 60 202 | # -- threshold until the probe is considered failing 203 | failureThreshold: 10 204 | # -- timeout in seconds 205 | timeoutSeconds: 5 206 | port: http 207 | scheme: HTTP 208 | 209 | # -- We usually recommend not to specify default resources and to leave this as a conscious 210 | # -- choice for the user. This also increases chances charts run on environments with little 211 | # -- resources, such as Minikube. If you do want to specify resources, uncomment the following 212 | # -- lines, adjust them as necessary, and remove the curly braces after 'resources:'. 213 | resources: {} 214 | # limits: 215 | # cpu: 100m 216 | # memory: 128Mi 217 | # requests: 218 | # cpu: 100m 219 | # memory: 128Mi 220 | 221 | # -- `spec.PersitentVolumeClaim` configuration 222 | persistentVolumeClaim: 223 | # -- set to true to use pvc 224 | enabled: false 225 | 226 | # -- specify an existing `PersistentVolumeClaim` to use 227 | # existingClaim: "" 228 | 229 | # -- Annotations for the `PersitentVolumeClaim` 230 | annotations: {} 231 | 232 | accessModes: 233 | - ReadWriteOnce 234 | 235 | # -- volume claim size 236 | size: "500Mi" 237 | 238 | ## If defined, storageClassName: 239 | ## If set to "-", storageClassName: "", which disables dynamic provisioning 240 | ## If undefined (the default) or set to null, no storageClassName spec is 241 | ## set, choosing the default provisioner. (gp2 on AWS, standard on 242 | ## GKE, AWS & OpenStack) 243 | ## 244 | # storageClass: "-" 245 | 246 | ## If subPath is set mount a sub folder of a volume instead of the root of the volume. 247 | ## This is especially handy for volume plugins that don't natively support sub mounting (like glusterfs). 248 | 249 | ## subPath: "pihole" 250 | 251 | # -- Node selector values 252 | nodeSelector: {} 253 | 254 | # -- Toleration 255 | tolerations: [] 256 | 257 | # -- Specify a priorityClassName 258 | # priorityClassName: "" 259 | 260 | # Reference: https://kubernetes.io/docs/concepts/workloads/pods/pod-topology-spread-constraints/ 261 | topologySpreadConstraints: [] 262 | # - maxSkew: 263 | # topologyKey: 264 | # whenUnsatisfiable: 265 | # labelSelector: 266 | 267 | affinity: {} 268 | 269 | # -- Administrator password when not using an existing secret (see below) 270 | adminPassword: "admin" 271 | 272 | # -- Use an existing secret for the admin password. 273 | admin: 274 | # -- If set to false admin password will be disabled, adminPassword specified above and the pre-existing secret (if specified) will be ignored. 275 | enabled: true 276 | # -- Specify an existing secret to use as admin password 277 | existingSecret: "" 278 | # -- Specify the key inside the secret to use 279 | passwordKey: "password" 280 | # -- Specify [annotations](docs/Values.md#admin.annotations) to be added to the secret 281 | annotations: 282 | # reflector.v1.k8s.emberstack.com/reflection-allowed: "true" 283 | # reflector.v1.k8s.emberstack.com/reflection-allowed-namespaces: "external-dns" 284 | 285 | # -- extraEnvironmentVars is a list of extra enviroment variables to set for pihole to use. You can use either scalars or project cm, secrets or pod fields via valueFrom 286 | extraEnvVars: {} 287 | # TZ: UTC 288 | # Project a variable 289 | # SOME_VAR: 290 | # valueFrom: 291 | # configMapKeyRef: 292 | # key: some-var 293 | # name: my-config-map 294 | 295 | # -- extraEnvVarsSecret is a list of secrets to load in as environment variables. 296 | extraEnvVarsSecret: {} 297 | # env_var: 298 | # name: secret-name 299 | # key: secret-key 300 | 301 | # -- default upstream DNS 1 server to use 302 | DNS1: "8.8.8.8" 303 | # -- default upstream DNS 2 server to use 304 | DNS2: "8.8.4.4" 305 | 306 | antiaff: 307 | # -- set to true to enable antiaffinity (example: 2 pihole DNS in the same cluster) 308 | enabled: false 309 | # -- Here you can set the pihole release (you set in `helm install ...`) 310 | # you want to avoid 311 | avoidRelease: pihole1 312 | # -- Here you can choose between preferred or required 313 | strict: true 314 | # -- Here you can pass namespaces to be part of those inclueded in anti-affinity 315 | namespaces: [] 316 | 317 | doh: 318 | # -- set to true to enabled DNS over HTTPs via cloudflared 319 | enabled: false 320 | # -- name 321 | name: "cloudflared" 322 | # -- repository 323 | repository: "crazymax/cloudflared" 324 | tag: latest 325 | # -- Pull policy 326 | pullPolicy: IfNotPresent 327 | # -- Here you can pass environment variables to the DoH container, for example: 328 | envVars: {} 329 | # TUNNEL_DNS_UPSTREAM: "https://1.1.1.2/dns-query,https://1.0.0.2/dns-query" 330 | # -- Custom command to the DoH container 331 | command: [] 332 | # -- Probes configuration 333 | probes: 334 | # -- Configure the healthcheck for the doh container 335 | liveness: 336 | # -- set to true to enable liveness probe 337 | enabled: true 338 | # -- customize the liveness probe 339 | probe: 340 | exec: 341 | command: 342 | - nslookup 343 | - -po=5053 344 | - cloudflare.com 345 | - "127.0.0.1" 346 | # -- defines the initial delay for the liveness probe 347 | initialDelaySeconds: 60 348 | # -- defines the failure threshold for the liveness probe 349 | failureThreshold: 10 350 | # -- defines the timeout in secondes for the liveness probe 351 | timeoutSeconds: 5 352 | readiness: 353 | # -- set to true to enable readiness probe 354 | enabled: true 355 | # -- customize the readiness probe 356 | probe: 357 | exec: 358 | command: 359 | - nslookup 360 | - -po=5053 361 | - cloudflare.com 362 | - "127.0.0.1" 363 | # -- defines the initial delay for the readiness probe 364 | initialDelaySeconds: 60 365 | # -- defines the failure threshold for the readiness probe 366 | failureThreshold: 10 367 | # -- defines the timeout in secondes for the readiness probe 368 | timeoutSeconds: 5 369 | monitoring: 370 | podMonitor: 371 | enabled: false 372 | # -- DNS MASQ settings 373 | dnsmasq: 374 | # -- Load custom user configuration files from /etc/dnsmasq.d 375 | enableCustomDnsMasq: true 376 | 377 | # -- Add upstream dns servers. All lines will be added to the pihole dnsmasq configuration 378 | upstreamServers: [] 379 | # - server=/foo.bar/192.168.178.10 380 | # - server=/bar.foo/192.168.178.11 381 | 382 | # -- Add custom dns entries to override the dns resolution. All lines will be added to the pihole dnsmasq configuration. 383 | customDnsEntries: [] 384 | # - address=/foo.bar/192.168.178.10 385 | # - address=/bar.foo/192.168.178.11 386 | 387 | # -- Dnsmasq reads the /etc/hosts file to resolve ips. You can add additional entries if you like 388 | additionalHostsEntries: [] 389 | # - 192.168.0.3 host4 390 | # - 192.168.0.4 host5 391 | 392 | # -- Static DHCP config 393 | staticDhcpEntries: [] 394 | # staticDhcpEntries: 395 | # - dhcp-host=MAC_ADDRESS,IP_ADDRESS,HOSTNAME 396 | 397 | # -- Other options 398 | customSettings: 399 | # otherSettings: | 400 | # rebind-domain-ok=/plex.direct/ 401 | 402 | # -- Here we specify custom cname entries that should point to `A` records or 403 | # elements in customDnsEntries array. 404 | # The format should be: 405 | # - cname=cname.foo.bar,foo.bar 406 | # - cname=cname.bar.foo,bar.foo 407 | # - cname=cname record,dns record 408 | customCnameEntries: [] 409 | # Here we specify custom cname entries that should point to `A` records or 410 | # elements in customDnsEntries array. 411 | # The format should be: 412 | # - cname=cname.foo.bar,foo.bar 413 | # - cname=cname.bar.foo,bar.foo 414 | # - cname=cname record,dns record 415 | 416 | # -- list of adlists to import during initial start of the container 417 | adlists: {} 418 | # If you want to provide blocklists, add them here. 419 | # - https://hosts-file.net/grm.txt 420 | # - https://reddestdream.github.io/Projects/MinimalHosts/etc/MinimalHostsBlocker/minimalhosts 421 | 422 | # -- list of whitelisted domains to import during initial start of the container 423 | whitelist: {} 424 | # If you want to provide whitelisted domains, add them here. 425 | # - clients4.google.com 426 | 427 | # -- list of blacklisted domains to import during initial start of the container 428 | blacklist: {} 429 | # If you want to have special domains blacklisted, add them here 430 | # - *.blackist.com 431 | 432 | # -- list of blacklisted regex expressions to import during initial start of the container 433 | regex: {} 434 | # Add regular expression blacklist items 435 | # - (^|\.)facebook\.com$ 436 | 437 | # -- values that should be added to pihole-FTL.conf. You can use either scalars or project cm, secrets or pod fields via valueFrom 438 | ftl: {} 439 | # Add values for pihole-FTL.conf 440 | # MAXDBDAYS: 14 441 | # Project a variable 442 | # LOCAL_IPV4: 443 | # valueFrom: 444 | # fieldRef: 445 | # fieldPath: status.podIP 446 | 447 | # -- port the container should use to expose HTTP traffic 448 | webHttp: "80" 449 | 450 | # -- port the container should use to expose HTTPS traffic 451 | webHttps: "443" 452 | 453 | # -- hostname of pod 454 | hostname: "" 455 | 456 | # -- should the container use host network 457 | hostNetwork: "false" 458 | 459 | # -- should container run in privileged mode 460 | privileged: "false" 461 | 462 | # linux capabilities container should run with 463 | capabilities: {} 464 | # add: 465 | # - NET_ADMIN 466 | 467 | customVolumes: 468 | # -- set this to true to enable custom volumes 469 | enabled: false 470 | # -- any volume type can be used here 471 | config: {} 472 | # hostPath: 473 | # path: "/mnt/data" 474 | 475 | # -- any extra volumes you might want 476 | extraVolumes: {} 477 | # external-conf: 478 | # configMap: 479 | # name: pi-hole-lighttpd-external-conf 480 | 481 | # -- any extra volume mounts you might want 482 | extraVolumeMounts: {} 483 | # external-conf: 484 | # mountPath: /etc/lighttpd/external.conf 485 | # subPath: external.conf 486 | 487 | extraContainers: [] 488 | # - name: pihole-logwatcher 489 | # image: your-registry/pihole-logwatcher 490 | # imagePullPolicy: Always 491 | # resources: 492 | # requests: 493 | # cpu: 100m 494 | # memory: 5Mi 495 | # limits: 496 | # cpu: 100m 497 | # memory: 5Mi 498 | # volumeMounts: 499 | # - name: pihole-logs 500 | # mountPath: /var/log/pihole 501 | 502 | # -- any extra kubernetes manifests you might want 503 | extraObjects: [] 504 | # - apiVersion: v1 505 | # kind: ConfigMap 506 | # metadata: 507 | # name: pi-hole-lighttpd-external-conf 508 | # data: 509 | # external.conf: | 510 | # $HTTP["host"] =~ "example.foo" { 511 | # # If we're using a non-standard host for pihole, ensure the Pi-hole 512 | # # Block Page knows that this is not a blocked domain 513 | # setenv.add-environment = ("fqdn" => "true") 514 | # 515 | # # Enable the SSL engine with a cert, only for this specific host 516 | # $SERVER["socket"] == ":443" { 517 | # ssl.engine = "enable" 518 | # ssl.pemfile = "/etc/ssl/lighttpd-private/tls.crt" 519 | # ssl.privkey = "/etc/ssl/lighttpd-private/tls.key" 520 | # ssl.ca-file = "/etc/ssl/lighttpd-private/ca.crt" 521 | # ssl.honor-cipher-order = "enable" 522 | # ssl.cipher-list = "EECDH+AESGCM:EDH+AESGCM:AES256+EECDH:AES256+EDH" 523 | # ssl.use-sslv2 = "disable" 524 | # ssl.use-sslv3 = "disable" 525 | # } 526 | # } 527 | # 528 | # # Redirect HTTP to HTTPS 529 | # $HTTP["scheme"] == "http" { 530 | # $HTTP["host"] =~ ".*" { 531 | # url.redirect = (".*" => "https://%0$0") 532 | # } 533 | # } 534 | 535 | # -- Additional annotations for the deployment 536 | deploymentAnnotations: {} 537 | # reloader.stakater.com/auto: "true" 538 | 539 | # -- Additional annotations for pods 540 | podAnnotations: {} 541 | # Example below allows Prometheus to scape on metric port (requires pihole-exporter sidecar enabled) 542 | # prometheus.io/port: '9617' 543 | # prometheus.io/scrape: 'true' 544 | 545 | # -- any initContainers you might want to run before starting pihole 546 | extraInitContainers: [] 547 | # - name: copy-config 548 | # image: busybox 549 | # args: 550 | # - sh 551 | # - -c 552 | # - | 553 | # cp /etc/lighttpd-cm/external.conf /etc/lighttpd/ 554 | # ls -l /etc/lighttpd/ 555 | # volumeMounts: 556 | # - name: external-conf-cm 557 | # mountPath: /etc/lighttpd-cm/ 558 | # - name: external-conf 559 | # mountPath: /etc/lighttpd/ 560 | 561 | monitoring: 562 | # -- Preferably adding prometheus scrape annotations rather than enabling podMonitor. 563 | podMonitor: 564 | # -- set this to true to enable podMonitor 565 | enabled: false 566 | # -- Sidecar configuration 567 | sidecar: 568 | # -- set this to true to enable podMonitor as sidecar 569 | enabled: false 570 | port: 9617 571 | image: 572 | # -- the repository to use 573 | repository: ekofr/pihole-exporter 574 | tag: v1.0.0 575 | pullPolicy: IfNotPresent 576 | resources: 577 | limits: 578 | memory: 128Mi 579 | # requests: 580 | # cpu: 100m 581 | # memory: 128Mi 582 | 583 | podDnsConfig: 584 | enabled: true 585 | policy: "None" 586 | nameservers: 587 | - 127.0.0.1 588 | - 8.8.8.8 589 | 590 | # -- configure a Pod Disruption Budget 591 | podDisruptionBudget: 592 | # -- set to true to enable creating the PDB 593 | enabled: false 594 | # -- minimum number of pods Kubernetes should try to have running at all times 595 | minAvailable: 1 596 | # -- maximum number of pods Kubernetes will allow to be unavailable. Cannot set both `minAvailable` and `maxAvailable` 597 | # maxUnavailable: 1 598 | -------------------------------------------------------------------------------- /classic/README.md: -------------------------------------------------------------------------------- 1 | 2 | # PiHole on kubernetes 3 | 4 | A sample deployment for pihole on a kubernetes cluster. I'm running an on premise kubernetes cluster and i'm using MetaLB 0.7.3 for loadbalancing and rook for storage. 5 | 6 | ## Installation: 7 | * First setup the service to get an ip for your installation. The services in this sample are configured to share the same ip address. 8 | 9 | ``` 10 | $ kubectl apply -f svc-pihole-tcp.yml 11 | $ kubectl apply -f svc-pihole-udp.yml 12 | ``` 13 | 14 | after the service has been created, both should listen to the same EXTERNAL-IP. 15 | 16 | ``` 17 | $ kubectl get svc pihole-tcp 18 | 19 | NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE 20 | pihole-tcp LoadBalancer 10.102.30.250 192.168.178.254 xxx/TCP 1d 21 | 22 | $ kubectl get svc pihole-svc 23 | 24 | NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE 25 | pihole-tcp LoadBalancer 10.102.30.251 192.168.178.254 xxx/TCP 1d 26 | ``` 27 | 28 | * Update the deployment file with the EXTERNAL-IP from step 1 29 | * Deploy everything else 30 | 31 | ``` 32 | $ kubectl apply -f pvc-pihole.yml 33 | $ kubectl apply -f secret-pihole-webpassword.yaml 34 | $ kubectl apply -f configmap-pihole-custom-dnsmasq.yml 35 | $ kubectl apply -f deployment-pihole.yml 36 | ``` 37 | 38 | When everything went right, you should be able to access the pihole installation on the specified IP 39 | 40 | ## Variant 2 using a address-pool with only one ip 41 | 42 | It is possible to create a dedicated metallb pool and then use the option to [request specific ips](https://metallb.universe.tf/usage/#requesting-specific-ips) from metallb. In addition with ```spec.loadBalancerIP: 192.168.178.254``` the service will always get the same ip address. 43 | 44 | ## See the clients IP address 45 | 46 | When you set the ```spec.externalTrafficPolicy``` in the services to ```Local``` instead of ```Cluster``` the clients ip address is forwarded to the pihole pod. 47 | 48 | Something like this should appear on the dashboard 49 | ![screenshot](../docs/screenshot.png) 50 | -------------------------------------------------------------------------------- /classic/configmap-pihole-custom-dnsmasq.yml: -------------------------------------------------------------------------------- 1 | apiVersion: v1 2 | data: 3 | 02-custom.conf: | 4 | address=/foo.bar/192.168.178.10 5 | kind: ConfigMap 6 | metadata: 7 | creationTimestamp: null 8 | name: pihole-custom-dnsmasq 9 | -------------------------------------------------------------------------------- /classic/deployment-pihole.yml: -------------------------------------------------------------------------------- 1 | apiVersion: apps/v1 2 | kind: Deployment 3 | metadata: 4 | labels: 5 | app: pihole 6 | name: pihole 7 | spec: 8 | progressDeadlineSeconds: 600 9 | replicas: 1 10 | revisionHistoryLimit: 10 11 | selector: 12 | matchLabels: 13 | app: pihole 14 | strategy: 15 | rollingUpdate: 16 | maxSurge: 1 17 | maxUnavailable: 1 18 | type: RollingUpdate 19 | template: 20 | metadata: 21 | creationTimestamp: null 22 | labels: 23 | app: pihole 24 | spec: 25 | containers: 26 | - env: 27 | - name: ServerIP 28 | value: 192.168.178.61 29 | - name: WEBPASSWORD 30 | valueFrom: 31 | secretKeyRef: 32 | key: password 33 | name: pihole-webpassword 34 | image: pihole/pihole:4.1_amd64 35 | imagePullPolicy: IfNotPresent 36 | name: pihole 37 | ports: 38 | - containerPort: 80 39 | name: pihole-http 40 | protocol: TCP 41 | - containerPort: 53 42 | name: dns 43 | protocol: TCP 44 | - containerPort: 53 45 | name: dns-udp 46 | protocol: UDP 47 | - containerPort: 443 48 | name: pihole-ssl 49 | protocol: TCP 50 | - containerPort: 67 51 | name: client-udp 52 | protocol: UDP 53 | resources: {} 54 | terminationMessagePath: /dev/termination-log 55 | terminationMessagePolicy: File 56 | volumeMounts: 57 | - mountPath: /etc/pihole 58 | name: config 59 | - mountPath: /etc/dnsmasq.d/02-custom.conf 60 | name: custom-dnsmasq 61 | subPath: 02-custom.conf 62 | dnsPolicy: ClusterFirst 63 | restartPolicy: Always 64 | schedulerName: default-scheduler 65 | securityContext: {} 66 | terminationGracePeriodSeconds: 30 67 | volumes: 68 | - name: config 69 | persistentVolumeClaim: 70 | claimName: pihole-config 71 | - configMap: 72 | defaultMode: 420 73 | name: pihole-custom-dnsmasq 74 | name: custom-dnsmasq 75 | status: {} 76 | -------------------------------------------------------------------------------- /classic/pvc-pihole.yml: -------------------------------------------------------------------------------- 1 | apiVersion: v1 2 | kind: PersistentVolumeClaim 3 | metadata: 4 | creationTimestamp: null 5 | labels: 6 | app: pihole 7 | name: pihole-config 8 | spec: 9 | accessModes: 10 | - ReadWriteOnce 11 | resources: 12 | requests: 13 | storage: 500Mi 14 | storageClassName: rook-block 15 | status: {} 16 | -------------------------------------------------------------------------------- /classic/sample-metallb-configmap.yaml: -------------------------------------------------------------------------------- 1 | apiVersion: v1 2 | data: 3 | config: | 4 | address-pools: 5 | - addresses: 6 | - 192.168.178.60-192.168.178.80 7 | name: default 8 | protocol: layer2 9 | - addresses: 10 | - 192.168.178.245-192.168.178.254 11 | name: network-services 12 | protocol: layer2 13 | kind: ConfigMap 14 | metadata: 15 | labels: 16 | app: metallb 17 | chart: metallb-0.8.3 18 | heritage: Tiller 19 | release: metallb 20 | name: metallb 21 | namespace: kube-system 22 | -------------------------------------------------------------------------------- /classic/secret-pihole-webpassword.yaml: -------------------------------------------------------------------------------- 1 | apiVersion: v1 2 | data: 3 | password: YWRtaW4K 4 | kind: Secret 5 | metadata: 6 | name: pihole-webpassword 7 | namespace: home 8 | type: Opaque 9 | -------------------------------------------------------------------------------- /classic/svc-pihole-tcp.yml: -------------------------------------------------------------------------------- 1 | apiVersion: v1 2 | kind: Service 3 | metadata: 4 | annotations: 5 | metallb.universe.tf/address-pool: network-services 6 | metallb.universe.tf/allow-shared-ip: pihole-svc 7 | labels: 8 | app: pihole 9 | name: pihole-tcp 10 | namespace: home 11 | spec: 12 | externalTrafficPolicy: Local 13 | loadBalancerIP: 192.168.178.254 14 | ports: 15 | - name: pihole-http 16 | port: 80 17 | protocol: TCP 18 | targetPort: pihole-http 19 | - name: pihole-https 20 | port: 443 21 | protocol: TCP 22 | targetPort: pihole-https 23 | - name: dns 24 | port: 53 25 | protocol: TCP 26 | targetPort: dns 27 | selector: 28 | app: pihole 29 | sessionAffinity: None 30 | type: LoadBalancer 31 | -------------------------------------------------------------------------------- /classic/svc-pihole-udp.yml: -------------------------------------------------------------------------------- 1 | apiVersion: v1 2 | kind: Service 3 | metadata: 4 | annotations: 5 | metallb.universe.tf/address-pool: network-services 6 | metallb.universe.tf/allow-shared-ip: pihole-svc 7 | labels: 8 | app: pihole 9 | name: pihole-udp 10 | namespace: home 11 | spec: 12 | externalTrafficPolicy: Local 13 | loadBalancerIP: 192.168.178.254 14 | ports: 15 | - name: dns-udp 16 | port: 53 17 | protocol: UDP 18 | targetPort: dns-udp 19 | - name: client-udp 20 | port: 67 21 | protocol: UDP 22 | targetPort: client-udp 23 | selector: 24 | app: pihole 25 | sessionAffinity: None 26 | type: LoadBalancer 27 | -------------------------------------------------------------------------------- /ct.yaml: -------------------------------------------------------------------------------- 1 | helm-extra-args: --timeout 600 2 | chart-dirs: 3 | - charts 4 | -------------------------------------------------------------------------------- /docs/index.yaml: -------------------------------------------------------------------------------- 1 | apiVersion: v1 2 | entries: 3 | pihole: 4 | - apiVersion: v1 5 | appVersion: 4.3.2-1 6 | created: "2019-12-30T21:26:20.8662135+01:00" 7 | description: Installs pihole in kubernetes 8 | digest: 2339d2ad77820fbcc2f21035b9fda26cd04cb18a9749a2cafd17059d31e19805 9 | home: https://pi-hole.net/ 10 | icon: https://i2.wp.com/pi-hole.net/wp-content/uploads/2016/12/Vortex-R.png 11 | maintainers: 12 | - email: christian.erhardt@mojo2k.de 13 | name: Christian Erhardt 14 | name: pihole 15 | sources: 16 | - https://github.com/pi-hole 17 | - https://github.com/pi-hole/docker-pi-hole 18 | urls: 19 | - https://github.com/MoJo2600/pihole-kubernetes/releases/download/1.2.0/pihole-1.2.0.tgz 20 | version: 1.2.0 21 | - apiVersion: v1 22 | appVersion: 4.3.2-1 23 | created: "2019-12-30T21:26:20.8655292+01:00" 24 | description: Installs pihole in kubernetes 25 | digest: 85fa7f88be067294c381a5b6950956ad089a06d157a4673f2b3a699300b2b08e 26 | home: https://pi-hole.net/ 27 | icon: https://i2.wp.com/pi-hole.net/wp-content/uploads/2016/12/Vortex-R.png 28 | maintainers: 29 | - email: christian.erhardt@mojo2k.de 30 | name: Christian Erhardt 31 | name: pihole 32 | sources: 33 | - https://github.com/pi-hole 34 | - https://github.com/pi-hole/docker-pi-hole 35 | urls: 36 | - https://github.com/MoJo2600/pihole-kubernetes/releases/download/1.1.0/pihole-1.1.0.tgz 37 | version: 1.1.0 38 | - apiVersion: v1 39 | appVersion: 4.3.2-1 40 | created: "2019-12-30T21:26:20.8647943+01:00" 41 | description: Installs pihole in kubernetes 42 | digest: a1a22195211a2368ad51e97a5f4846de7a8a9e137a9b39b40f8a4910a4004dd8 43 | home: https://pi-hole.net/ 44 | icon: https://i2.wp.com/pi-hole.net/wp-content/uploads/2016/12/Vortex-R.png 45 | maintainers: 46 | - email: christian.erhardt@mojo2k.de 47 | name: Christian Erhardt 48 | name: pihole 49 | sources: 50 | - https://github.com/pi-hole 51 | - https://github.com/pi-hole/docker-pi-hole 52 | urls: 53 | - https://github.com/MoJo2600/pihole-kubernetes/releases/download/1.0.0/pihole-1.0.0.tgz 54 | version: 1.0.0 55 | - apiVersion: v1 56 | appVersion: 4.3.2-1 57 | created: "2019-12-30T21:26:20.863297+01:00" 58 | description: Installs pihole in kubernetes 59 | digest: 1fd7a6875100fdddc93a9234a22a68f5e08e792f438723a36b6b1c84ca57d7fe 60 | home: https://pi-hole.net/ 61 | icon: https://i2.wp.com/pi-hole.net/wp-content/uploads/2016/12/Vortex-R.png 62 | maintainers: 63 | - email: christian.erhardt@mojo2k.de 64 | name: Christian Erhardt 65 | name: pihole 66 | sources: 67 | - https://github.com/pi-hole 68 | - https://github.com/pi-hole/docker-pi-hole 69 | urls: 70 | - https://github.com/MoJo2600/pihole-kubernetes/releases/download/0.1.3/pihole-0.1.3.tgz 71 | version: 0.1.3 72 | - apiVersion: v1 73 | appVersion: 4.3.2-1 74 | created: "2019-12-30T21:26:20.86256+01:00" 75 | description: Installs pihole in kubernetes 76 | digest: 5ea958fc0b2cef50ba463000e3c9fd5c5a12db5a5b1f94b38284fadefc655131 77 | maintainers: 78 | - email: christian.erhardt@mojo2k.de 79 | name: Christian Erhardt 80 | name: pihole 81 | urls: 82 | - https://github.com/MoJo2600/pihole-kubernetes/releases/download/0.1.2/pihole-0.1.2.tgz 83 | version: 0.1.2 84 | generated: "2019-12-30T21:26:20.8616639+01:00" 85 | -------------------------------------------------------------------------------- /docs/pihole-0.1.2.tgz: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MoJo2600/pihole-kubernetes/1f91ed1d556b258bba2bc79c6d50ebd03a5c85b2/docs/pihole-0.1.2.tgz -------------------------------------------------------------------------------- /docs/pihole-0.1.3.tgz: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MoJo2600/pihole-kubernetes/1f91ed1d556b258bba2bc79c6d50ebd03a5c85b2/docs/pihole-0.1.3.tgz -------------------------------------------------------------------------------- /docs/pihole-1.0.0.tgz: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MoJo2600/pihole-kubernetes/1f91ed1d556b258bba2bc79c6d50ebd03a5c85b2/docs/pihole-1.0.0.tgz -------------------------------------------------------------------------------- /docs/pihole-1.1.0.tgz: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MoJo2600/pihole-kubernetes/1f91ed1d556b258bba2bc79c6d50ebd03a5c85b2/docs/pihole-1.1.0.tgz -------------------------------------------------------------------------------- /docs/pihole-1.2.0.tgz: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MoJo2600/pihole-kubernetes/1f91ed1d556b258bba2bc79c6d50ebd03a5c85b2/docs/pihole-1.2.0.tgz -------------------------------------------------------------------------------- /docs/screenshot.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MoJo2600/pihole-kubernetes/1f91ed1d556b258bba2bc79c6d50ebd03a5c85b2/docs/screenshot.png -------------------------------------------------------------------------------- /example/README.md: -------------------------------------------------------------------------------- 1 | # Example configuration 2 | 3 | This example utilizes the option to add whitelists and blacklists on startup of the pihole container. With this setup you do not need to configure pihole afterwards. The container is ready right from the start. 4 | 5 | * The blacklists are taken from [firebog](https://firebog.net/) 6 | * The whitelists are taken from [anudeepND’s curated whitelist](https://github.com/anudeepND/whitelist/blob/master/domains/whitelist.txt) 7 | -------------------------------------------------------------------------------- /example/values.yaml: -------------------------------------------------------------------------------- 1 | dnsmasq: 2 | customDnsEntries: 3 | - address=/my.fancyurl.com/192.168.178.10 4 | additionalHostsEntries: 5 | - 192.168.178.60 unifi.fritz.box unifi 6 | 7 | adlists: 8 | - https://raw.githubusercontent.com/PolishFiltersTeam/KADhosts/master/KADhosts.txt 9 | - https://raw.githubusercontent.com/FadeMind/hosts.extras/master/add.Spam/hosts 10 | - https://v.firebog.net/hosts/static/w3kbl.txt 11 | - https://adaway.org/hosts.txt 12 | - https://v.firebog.net/hosts/AdguardDNS.txt 13 | - https://v.firebog.net/hosts/Admiral.txt 14 | - https://raw.githubusercontent.com/anudeepND/blacklist/master/adservers.txt 15 | - https://v.firebog.net/hosts/Easylist.txt 16 | - https://pgl.yoyo.org/adservers/serverlist.php?hostformat=hosts&showintro=0&mimetype=plaintext 17 | - https://raw.githubusercontent.com/FadeMind/hosts.extras/master/UncheckyAds/hosts 18 | - https://raw.githubusercontent.com/bigdargon/hostsVN/master/hosts 19 | - https://v.firebog.net/hosts/Easyprivacy.txt 20 | - https://v.firebog.net/hosts/Prigent-Ads.txt 21 | - https://raw.githubusercontent.com/FadeMind/hosts.extras/master/add.2o7Net/hosts 22 | - https://raw.githubusercontent.com/crazy-max/WindowsSpyBlocker/master/data/hosts/spy.txt 23 | - https://hostfiles.frogeye.fr/firstparty-trackers-hosts.txt 24 | - https://raw.githubusercontent.com/DandelionSprout/adfilt/master/Alternate%20versions%20Anti-Malware%20List/AntiMalwareHosts.txt 25 | - https://v.firebog.net/hosts/Prigent-Crypto.txt 26 | - https://raw.githubusercontent.com/FadeMind/hosts.extras/master/add.Risk/hosts 27 | - https://bitbucket.org/ethanr/dns-blacklists/raw/8575c9f96e5b4a1308f2f12394abd86d0927a4a0/bad_lists/Mandiant_APT1_Report_Appendix_D.txt 28 | - https://phishing.army/download/phishing_army_blocklist_extended.txt 29 | - https://gitlab.com/quidsup/notrack-blocklists/raw/master/notrack-malware.txt 30 | - https://v.firebog.net/hosts/RPiList-Malware.txt 31 | - https://v.firebog.net/hosts/RPiList-Phishing.txt 32 | - https://raw.githubusercontent.com/Spam404/lists/master/main-blacklist.txt 33 | - https://raw.githubusercontent.com/AssoEchap/stalkerware-indicators/master/generated/hosts 34 | - https://urlhaus.abuse.ch/downloads/hostfile/ 35 | - https://lists.cyberhost.uk/malware.txt 36 | 37 | whitelist: 38 | - 0.client-channel.google.com 39 | - 1drv.com 40 | - 2.android.pool.ntp.org 41 | - akamaihd.net 42 | - akamaitechnologies.com 43 | - akamaized.net 44 | - alluremedia.com.au 45 | - amazonaws.com 46 | - android.clients.google.com 47 | - api.ipify.org 48 | - api.rlje.net 49 | - app-api.ted.com 50 | - app.plex.tv 51 | - appleid.apple.com 52 | - apps.skype.com 53 | - appsbackup-pa.clients6.google.com 54 | - appsbackup-pa.googleapis.com 55 | - apt.sonarr.tv 56 | - aspnetcdn.com 57 | - attestation.xboxlive.com 58 | - ax.phobos.apple.com.edgesuite.net 59 | - brightcove.net 60 | - bufferapp.com 61 | - c.s-microsoft.com 62 | - cdn.cloudflare.net 63 | - cdn.embedly.com 64 | - cdn.optimizely.com 65 | - cdn.vidible.tv 66 | - cdn2.optimizely.com 67 | - cdn3.optimizely.com 68 | - cdnjs.cloudflare.com 69 | - cert.mgt.xboxlive.com 70 | - clientconfig.passport.net 71 | - clients1.google.com 72 | - clients2.google.com 73 | - clients3.google.com 74 | - clients4.google.com 75 | - clients5.google.com 76 | - clients6.google.com 77 | - cpms.spop10.ams.plex.bz 78 | - cpms35.spop10.ams.plex.bz 79 | - cse.google.com 80 | - ctldl.windowsupdate.com 81 | - d2c8v52ll5s99u.cloudfront.net 82 | - d2gatte9o95jao.cloudfront.net 83 | - dashboard.plex.tv 84 | - dataplicity.com 85 | - def-vef.xboxlive.com 86 | - delivery.vidible.tv 87 | - dev.virtualearth.net 88 | - device.auth.xboxlive.com 89 | - display.ugc.bazaarvoice.com 90 | - displaycatalog.mp.microsoft.com 91 | - dl.delivery.mp.microsoft.com 92 | - dl.dropbox.com 93 | - dl.dropboxusercontent.com 94 | - dns.msftncsi.com 95 | - download.sonarr.tv 96 | - drift.com 97 | - driftt.com 98 | - dynupdate.no-ip.com 99 | - ec-ns.sascdn.com 100 | - ecn.dev.virtualearth.net 101 | - edge.api.brightcove.com 102 | - eds.xboxlive.com 103 | - fonts.gstatic.com 104 | - forums.sonarr.tv 105 | - g.live.com 106 | - geo-prod.do.dsp.mp.microsoft.com 107 | - geo3.ggpht.com 108 | - giphy.com 109 | - github.com 110 | - github.io 111 | - googleapis.com 112 | - gravatar.com 113 | - gstatic.com 114 | - help.ui.xboxlive.com 115 | - hls.ted.com 116 | - i.s-microsoft.com 117 | - i.ytimg.com 118 | - i1.ytimg.com 119 | - imagesak.secureserver.net 120 | - img.vidible.tv 121 | - imgix.net 122 | - imgs.xkcd.com 123 | - instantmessaging-pa.googleapis.com 124 | - intercom.io 125 | - j.mp 126 | - jquery.com 127 | - jsdelivr.net 128 | - keystone.mwbsys.com 129 | - lastfm-img2.akamaized.net 130 | - licensing.xboxlive.com 131 | - live.com 132 | - login.aliexpress.com 133 | - login.live.com 134 | - login.microsoftonline.com 135 | - manifest.googlevideo.com 136 | - meta-db-worker02.pop.ric.plex.bz 137 | - meta.plex.bz 138 | - meta.plex.tv 139 | - microsoftonline.com 140 | - msftncsi.com 141 | - my.plexapp.com 142 | - nexusrules.officeapps.live.com 143 | - npr-news.streaming.adswizz.com 144 | - nine.plugins.plexapp.com 145 | - no-ip.com 146 | - node.plexapp.com 147 | - notify.xboxlive.com 148 | - ns1.dropbox.com 149 | - ns2.dropbox.com 150 | - o1.email.plex.tv 151 | - o2.sg0.plex.tv 152 | - ocsp.apple.com 153 | - office.com 154 | - office.net 155 | - office365.com 156 | - officeclient.microsoft.com 157 | - om.cbsi.com 158 | - onedrive.live.com 159 | - outlook.live.com 160 | - outlook.office365.com 161 | - pinterest.com 162 | - placehold.it 163 | - placeholdit.imgix.net 164 | - players.brightcove.net 165 | - pricelist.skype.com 166 | - products.office.com 167 | - proxy.plex.bz 168 | - proxy.plex.tv 169 | - proxy02.pop.ord.plex.bz 170 | - pubsub.plex.bz 171 | - pubsub.plex.tv 172 | - raw.githubusercontent.com 173 | - redirector.googlevideo.com 174 | - res.cloudinary.com 175 | - s.gateway.messenger.live.com 176 | - s.marketwatch.com 177 | - s.shopify.com 178 | - s.youtube.com 179 | - s.ytimg.com 180 | - s1.wp.com 181 | - s2.youtube.com 182 | - s3.amazonaws.com 183 | - sa.symcb.com 184 | - secure.avangate.com 185 | - secure.brightcove.com 186 | - secure.surveymonkey.com 187 | - services.sonarr.tv 188 | - sharepoint.com 189 | - skyhook.sonarr.tv 190 | - spclient.wg.spotify.com 191 | - ssl.p.jwpcdn.com 192 | - staging.plex.tv 193 | - status.plex.tv 194 | - t.co 195 | - t0.ssl.ak.dynamic.tiles.virtualearth.net 196 | - t0.ssl.ak.tiles.virtualearth.net 197 | - tawk.to 198 | - tedcdn.com 199 | - themoviedb.com 200 | - thetvdb.com 201 | - tinyurl.com 202 | - title.auth.xboxlive.com 203 | - title.mgt.xboxlive.com 204 | - traffic.libsyn.com 205 | - tvdb2.plex.tv 206 | - tvthemes.plexapp.com 207 | - twimg.com 208 | - twitter.com 209 | - ui.skype.com 210 | - v.shopify.com 211 | - video-stats.l.google.com 212 | - videos.vidible.tv 213 | - widget-cdn.rpxnow.com 214 | - wikipedia.org 215 | - win10.ipv6.microsoft.com 216 | - wordpress.com 217 | - wp.com 218 | - ws.audioscrobbler.com 219 | - www.dataplicity.com 220 | - www.googleapis.com 221 | - www.msftncsi.com 222 | - www.no-ip.com 223 | - www.youtube-nocookie.com 224 | - xbox.ipv6.microsoft.com 225 | - xboxexperiencesprod.experimentation.xboxlive.com 226 | - xflight.xboxlive.com 227 | - xkms.xboxlive.com 228 | - xsts.auth.xboxlive.com 229 | - youtu.be 230 | - youtube-nocookie.com 231 | - yt3.ggpht.com 232 | 233 | persistentVolumeClaim: 234 | enabled: true 235 | storageClass: glusterfs-storage 236 | 237 | adminPassword: pihole 238 | 239 | serviceTCP: 240 | loadBalancerIP: 192.168.178.252 241 | annotations: 242 | metallb.universe.tf/allow-shared-ip: pihole-svc 243 | 244 | serviceUDP: 245 | loadBalancerIP: 192.168.178.252 246 | annotations: 247 | metallb.universe.tf/allow-shared-ip: pihole-svc 248 | 249 | -------------------------------------------------------------------------------- /package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "pihole-kubernetes", 3 | "version": "1.0.0", 4 | "description": "A helm chart for Pi-hole", 5 | "main": "index.js", 6 | "directories": { 7 | "doc": "docs", 8 | "example": "example" 9 | }, 10 | "scripts": { 11 | "updateReadme": "docker run --rm --volume \"$(pwd):/helm-docs\" -u $(id -u) jnorwood/helm-docs:latest", 12 | "all-contributorsCheck": "all-contributors check", 13 | "all-contributorsAdd": "all-contributors add" 14 | }, 15 | "repository": { 16 | "type": "git", 17 | "url": "git+https://github.com/MoJo2600/pihole-kubernetes.git" 18 | }, 19 | "author": "Christian Erhardt", 20 | "license": "ISC", 21 | "bugs": { 22 | "url": "https://github.com/MoJo2600/pihole-kubernetes/issues" 23 | }, 24 | "homepage": "https://github.com/MoJo2600/pihole-kubernetes#readme", 25 | "devDependencies": { 26 | "all-contributors-cli": "^6.26.1" 27 | } 28 | } 29 | -------------------------------------------------------------------------------- /release-please-config.json: -------------------------------------------------------------------------------- 1 | { 2 | "release-type": "helm", 3 | "packages": { 4 | "charts/pihole": { 5 | "package-name": "pihole", 6 | "component": "pihole" 7 | } 8 | }, 9 | "extra-files": [ 10 | "charts/pihole/README.md", 11 | "README.md" 12 | ], 13 | "include-v-in-tag": false, 14 | "tag-separator": "-", 15 | "pull-request-title-pattern": "chore${scope}: release${component}-${version}", 16 | "bootstrap-sha": "85231b7fbba9a61dce700d975d0ccd83cae5b297" 17 | } 18 | --------------------------------------------------------------------------------