Skip to content

Commit

Permalink
Predefined service: Pi-hole (#207)
Browse files Browse the repository at this point in the history
* Predefined service: Pi-hole (#199)

* Init service template for Pi-hole

* Fix yml file for Pi-hole

* Add cap_add to service validator

* Skip Pi-hole service template test

Co-authored-by: Marc Auberer <marc.auberer@chillibits.com>

* Improve Pi-hole template

* Add Pi-hole to supported services

* Fix bug with volumes

* Fix wording of volume question

Co-authored-by: Splines <37160523+Splines@users.noreply.github.com>
  • Loading branch information
marcauberer and Splines committed Nov 4, 2021
1 parent 0981938 commit 918834c
Show file tree
Hide file tree
Showing 7 changed files with 103 additions and 18 deletions.
27 changes: 18 additions & 9 deletions .github/scripts/service-tester/predefined-service-tester.py
Original file line number Diff line number Diff line change
@@ -1,30 +1,35 @@
"""Script to test all combinations of predefined service templates"""

from os.path import isdir, join
from os import listdir, system, remove
import sys
import itertools
import sys
from os import listdir, remove, system
from os.path import isdir, join

import yaml

MAX_COMBINATION_SIZE = 1 # Careful! Runtime increases exponentially
MAX_COMBINATION_SIZE = 1 # Careful! Runtime increases exponentially
TEMPLATES_PATH = "../../../predefined-services"
BIN_PATH = "../../../bin"


def get_all_template_names():
"""Returns a string array with all existing template names"""

template_tuples = []
template_types = ["backend", "database", "db-admin", "frontend"]
skipped_names = ["rocket", "faunadb", "gitea", "gitlab", "adguard-home"]
skipped_names = ["rocket", "faunadb", "gitea",
"gitlab", "adguard-home", "pi-hole"]
for template_type in template_types:
template_type_path = TEMPLATES_PATH + '/' + template_type
services = [f for f in listdir(template_type_path) if isdir(join(template_type_path, f))]
services = [f for f in listdir(template_type_path) if isdir(
join(template_type_path, f))]
for service in services:
if service not in skipped_names:
template_tuples.append((service, template_type))

return template_tuples


def test_combination(comb):
"""Tests one particular combination of services"""
# Create config file
Expand All @@ -37,7 +42,8 @@ def test_combination(comb):

# Execute Compose Generator with the config file
if system(f"cd {BIN_PATH} && compose-generator -c config.yml -i") != 0:
sys.exit("Compose Generator failed when generating stack for combination " + str(comb))
sys.exit(
"Compose Generator failed when generating stack for combination " + str(comb))

# Delete config file
remove(BIN_PATH + "/config.yml")
Expand All @@ -49,11 +55,13 @@ def test_combination(comb):
if system(f"cd {BIN_PATH} && docker compose down") != 0:
sys.exit("Error on 'docker compose down' for " + str(comb))


def reset_environment():
"""Deletes all Docker related stuff. Should be executed after each test"""
system("docker system prune -af > /dev/null")
system(f"sudo rm -rf {BIN_PATH}/*")


# Initially reset the testing environment
print("Do initial cleanup ...", end='')
reset_environment()
Expand All @@ -63,15 +71,16 @@ def reset_environment():
print("Collecting template names ...", end='')
templates = get_all_template_names()
combinations = []
for i in range(1, MAX_COMBINATION_SIZE +1):
for i in range(1, MAX_COMBINATION_SIZE + 1):
combinations.extend(list(itertools.combinations(templates, i)))
print(" done")
print(combinations)

# Execute test for each combination
print("Execute tests ...")
for i, combination in enumerate(combinations):
print(f"Testing combination {i+1} of {len(combinations)}: {str(combination)} ...")
print(
f"Testing combination {i+1} of {len(combinations)}: {str(combination)} ...")
test_combination(combination)
reset_environment()
print("Done")
Expand Down
4 changes: 4 additions & 0 deletions .github/scripts/service-validator/service-schema.py
Original file line number Diff line number Diff line change
Expand Up @@ -49,4 +49,8 @@
'command': {
'type': 'string'
},
'cap_add': {
'type': 'list',
'nullable': True
}
}
18 changes: 9 additions & 9 deletions docs/docs/supported-services.md
Original file line number Diff line number Diff line change
Expand Up @@ -16,15 +16,15 @@ The following table shows all services which Compose Generator currently support
| [`Jupyter`](https://github.com/compose-generator/compose-generator/tree/release/v1.2.x/predefined-services/frontend/jupyter) | [`Nexus3`](https://github.com/compose-generator/compose-generator/tree/release/v1.2.x/predefined-services/backend/nexus) | [`PostgreSQL`](https://github.com/compose-generator/compose-generator/tree/release/v1.2.x/predefined-services/database/postgres) | |
| [`Live-Poll`](https://github.com/compose-generator/compose-generator/tree/release/v1.2.x/predefined-services/frontend/live-poll) | [`Node.js`](https://github.com/compose-generator/compose-generator/tree/release/v1.2.x/predefined-services/backend/node) | [`QuestDB`](https://github.com/compose-generator/compose-generator/tree/release/v1.2.x/predefined-services/database/questdb) | |
| [`Matomo`](https://github.com/compose-generator/compose-generator/tree/release/v1.2.x/predefined-services/frontend/matomo) :fontawesome-brands-dev: | [`PHP`](https://github.com/compose-generator/compose-generator/tree/release/v1.2.x/predefined-services/backend/php) | [`Redis`](https://github.com/compose-generator/compose-generator/tree/release/v1.2.x/predefined-services/database/redis) | |
| [`Nextcloud`](https://github.com/compose-generator/compose-generator/tree/release/v1.2.x/predefined-services/frontend/nextcloud) | [`Plex`](https://github.com/compose-generator/compose-generator/tree/release/v1.2.x/predefined-services/backend/plex) :fontawesome-brands-dev: | [`ScyllaDB`](https://github.com/compose-generator/compose-generator/tree/release/v1.2.x/predefined-services/database/scylladb) :new: | |
| [`OpenProject`](https://github.com/compose-generator/compose-generator/tree/release/v1.2.x/predefined-services/frontend/openproject) | [`Prometheus`](https://github.com/compose-generator/compose-generator/tree/release/v1.2.x/predefined-services/backend/prometheus) | [`SingleStore`](https://github.com/compose-generator/compose-generator/tree/release/v1.2.x/predefined-services/database/singlestore) :new: | |
| [`Owncloud`](https://github.com/compose-generator/compose-generator/tree/release/v1.2.x/predefined-services/frontend/owncloud) | [`Rocket`](https://github.com/compose-generator/compose-generator/tree/release/v1.2.x/predefined-services/backend/rocket) | *more to come ...* | |
| [`React`](https://github.com/compose-generator/compose-generator/tree/release/v1.2.x/predefined-services/frontend/react) | [`Ruby on Rails`](https://github.com/compose-generator/compose-generator/tree/release/v1.2.x/predefined-services/backend/rails) | | |
| [`SonarQube`](https://github.com/compose-generator/compose-generator/tree/release/v1.2.x/predefined-services/frontend/sonarqube) | [`Spring with Gradle`](https://github.com/compose-generator/compose-generator/tree/release/v1.2.x/predefined-services/backend/spring-gradle) | | |
| [`Uptime Kuma`](https://github.com/compose-generator/compose-generator/tree/release/v1.2.x/predefined-services/frontend/uptime-kuma) | [`Spring with Maven`](https://github.com/compose-generator/compose-generator/tree/release/v1.2.x/predefined-services/backend/spring-maven) | | |
| [`Vue`](https://github.com/compose-generator/compose-generator/tree/release/v1.2.x/predefined-services/frontend/vue) | [`Telegram Bot`](https://github.com/compose-generator/compose-generator/tree/release/v1.2.x/predefined-services/backend/telegram-bot) | | |
| [`Wordpress`](https://github.com/compose-generator/compose-generator/tree/release/v1.2.x/predefined-services/frontend/wordpress) | *more to come ...* | | |
| [`YouTrack`](https://github.com/compose-generator/compose-generator/tree/release/v1.2.x/predefined-services/frontend/youtrack) | | | |
| [`Nextcloud`](https://github.com/compose-generator/compose-generator/tree/release/v1.2.x/predefined-services/frontend/nextcloud) | [`Pi-hole`](https://github.com/compose-generator/compose-generator/tree/release/v1.2.x/predefined-services/backend/pi-hole) :fontawesome-brands-dev: | [`ScyllaDB`](https://github.com/compose-generator/compose-generator/tree/release/v1.2.x/predefined-services/database/scylladb) :new: | |
| [`OpenProject`](https://github.com/compose-generator/compose-generator/tree/release/v1.2.x/predefined-services/frontend/openproject) | [`Plex`](https://github.com/compose-generator/compose-generator/tree/release/v1.2.x/predefined-services/backend/plex) :fontawesome-brands-dev: | [`SingleStore`](https://github.com/compose-generator/compose-generator/tree/release/v1.2.x/predefined-services/database/singlestore) :new: | |
| [`Owncloud`](https://github.com/compose-generator/compose-generator/tree/release/v1.2.x/predefined-services/frontend/owncloud) | [`Prometheus`](https://github.com/compose-generator/compose-generator/tree/release/v1.2.x/predefined-services/backend/prometheus) | *more to come ...* | |
| [`React`](https://github.com/compose-generator/compose-generator/tree/release/v1.2.x/predefined-services/frontend/react) | [`Rocket`](https://github.com/compose-generator/compose-generator/tree/release/v1.2.x/predefined-services/backend/rocket) | | |
| [`SonarQube`](https://github.com/compose-generator/compose-generator/tree/release/v1.2.x/predefined-services/frontend/sonarqube) | [`Ruby on Rails`](https://github.com/compose-generator/compose-generator/tree/release/v1.2.x/predefined-services/backend/rails) | | |
| [`Uptime Kuma`](https://github.com/compose-generator/compose-generator/tree/release/v1.2.x/predefined-services/frontend/uptime-kuma) | [`Spring with Gradle`](https://github.com/compose-generator/compose-generator/tree/release/v1.2.x/predefined-services/backend/spring-gradle) | | |
| [`Vue`](https://github.com/compose-generator/compose-generator/tree/release/v1.2.x/predefined-services/frontend/vue) | [`Spring with Maven`](https://github.com/compose-generator/compose-generator/tree/release/v1.2.x/predefined-services/backend/spring-maven) | | |
| [`Wordpress`](https://github.com/compose-generator/compose-generator/tree/release/v1.2.x/predefined-services/frontend/wordpress) | [`Telegram Bot`](https://github.com/compose-generator/compose-generator/tree/release/v1.2.x/predefined-services/backend/telegram-bot) | | |
| [`YouTrack`](https://github.com/compose-generator/compose-generator/tree/release/v1.2.x/predefined-services/frontend/youtrack) | *more to come ...* | | |
| *more to come ...* | | | |

:new: - New templates which were released with the latest version of Compose Generator <br>
Expand Down
5 changes: 5 additions & 0 deletions predefined-services/backend/pi-hole/README.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
## Pi-hole
[Pi-hole](https://pi-hole.net/) is a network-wide tracking and ad blocking tool. It can be installed on embedded systems like the Raspberry Pi acting as a DNS server in your home network. It also comes with its own DHCP server.

### Setup
Pi-hole is considered as backend service and can therefore be found in backends collection, when generating the compose configuration with Compose Generator.
50 changes: 50 additions & 0 deletions predefined-services/backend/pi-hole/config.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,50 @@
{
"label": "Pi-hole",
"preselected": "false",
"proxied": false,
"files": [
{
"path": "service.yml",
"type": "service"
},
{
"path": "README.md",
"type": "docs"
}
],
"questions": [
{
"text": "On which timezone do you want to set your Pi-hole?",
"type": 2,
"defaultValue": "America/Chicago",
"variable": "PI_HOLE_TZ"
},
{
"text": "Which version of Pi-hole do you want to use?",
"type": 2,
"defaultValue": "latest",
"variable": "PI_HOLE_VERSION"
}
],
"volumes": [
{
"text": "Custom path for Pi-hole data volume?",
"defaultValue": "./volumes/pi-hole-data/etc-pihole",
"variable": "VOLUME_PI_HOLE_DATA_ETC",
"advanced": true
},
{
"text": "Custom path for Pi-hole dnsmasq config volume?",
"defaultValue": "./volumes/pi-hole-data/etc-dnsmasq.d",
"variable": "VOLUME_PI_HOLE_DATA_DNSMASQ",
"advanced": true
}
],
"secrets": [
{
"name": "Pi-hole password for web interface",
"variable": "_PW_PI_HOLE_WEB_INTERFACE",
"length": 50
}
]
}
2 changes: 2 additions & 0 deletions predefined-services/backend/pi-hole/environment.env
Original file line number Diff line number Diff line change
@@ -0,0 +1,2 @@
TZ=${{PI_HOLE_TZ}}
WEBPASSWORD=${{_PW_PI_HOLE_WEB_INTERFACE}}
15 changes: 15 additions & 0 deletions predefined-services/backend/pi-hole/service.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,15 @@
container_name: ${{PROJECT_NAME_CONTAINER}}-backend-pihole
image: pihole/pihole:${{PI_HOLE_VERSION}}
restart: always
ports:
- 53:53/tcp
- 53:53/udp
- 67:67/udp
- 80:80/tcp
env_file:
- environment.env
volumes:
- ${{VOLUME_PI_HOLE_DATA_ETC}}:/etc/pihole/
- ${{VOLUME_PI_HOLE_DATA_DNSMASQ}}:/etc/dnsmasq.d/
cap_add:
- NET_ADMIN

0 comments on commit 918834c

Please sign in to comment.