diff --git a/_build/portainer_template_build.py b/_build/portainer_template_build.py index 6bf5779..fda14eb 100644 --- a/_build/portainer_template_build.py +++ b/_build/portainer_template_build.py @@ -1,42 +1,13 @@ #!/usr/bin/env python3 """ -Portainer templates generator for nickyeoman/docker-compose-cookbooks - -Generates templates.json (Portainer-compatible) based on each project's -docker-compose.yml and sample.env/env-sample. - -Behavior: - - Uses master branch for raw GitHub stackfile URLs. - - Skips directories starting with "_" and those ending with "_dev" or "_notes". - - Skips projects whose docker-compose.yml contains "${VOL_PATH". - - Extracts README "## Overview" (exact match) for the description; default fallback. - - Parses sample.env or env-sample, strips inline comments, returns defaults. - - Resolves image lines (handles ${VAR:-default} and ${VAR}) using sample.env defaults. - - Parses ports into strings like "8000:80" or "8080:8080/tcp" for Portainer. - - Parses volumes and converts them into named Docker volumes: - - container path used as container - - named volume created as "-" and inserted into "bind" - - Produces a Portainer-friendly JSON structure: - { - "version": "3", - "templates": [ - { - "type": "docker-compose", - "title": "", - "name": "", - "note": "...", - "categories": ["Auto"], - "platform": "linux", - "logo": "...", - "description": "...", - "image": "...", - "stackfile": "https://raw.githubusercontent.com/..../master//docker-compose.yml", - "env": [ {name,label,default}, ... ], - "ports": ["80:80", ...], - "volumes": [ {"container":"/path", "bind":""}, ... ] - } - ] - } +Portainer templates generator (Portainer CE compatible) +Usage: + python3 _build/portainer_template_build.py [--nologo] [--branch BRANCH] [--output PATH] [--no-skip-volpath] +Defaults: + branch = master + output = ./templates.json + skips projects containing "${VOL_PATH" by default (use --no-skip-volpath to disable) + Note: Branch is used only for logo asset lookup; templates use default repo branch (master). """ from pathlib import Path import argparse @@ -44,15 +15,21 @@ import json import re import requests import sys - -# Constants +from typing import List, Dict +# ------------------------- +# Config / Defaults +# ------------------------- SCRIPT_DIR = Path(__file__).resolve().parent REPO_ROOT = SCRIPT_DIR.parent -OUTPUT_FILE = REPO_ROOT / "templates.json" -GITHUB_RAW_BASE = "https://raw.githubusercontent.com/nickyeoman/docker-compose-cookbooks/master" -ASSETS_BASE = "https://i.4lt.ca/cookbook" -SKIP_PAT = "${VOL_PATH" - +DEFAULT_OUTPUT = REPO_ROOT / "templates.json" +ASSETS_BASE = "https://i.4lt.ca/cookbooks" +GITHUB_RAW_BASE_TEMPLATE = "https://raw.githubusercontent.com/{owner}/{repo}/{branch}" +GITHUB_OWNER = "nickyeoman" +GITHUB_REPO = "docker-compose-cookbooks" +DEFAULT_BRANCH = "master" +SKIP_VOLPATH_PATTERN = "${VOL_PATH" +# Regex +VAR_RE = re.compile(r"\$\{([^:}]+)(?:[:-]([^}]+))?\}") # ------------------------- # Helpers # ------------------------- @@ -61,15 +38,26 @@ def read_text_safe(p: Path) -> str: return p.read_text() except Exception: return "" - +def write_atomic(path: Path, data: str): + tmp = path.with_suffix(path.suffix + ".tmp") + tmp.write_text(data) + tmp.replace(path) +def slugify_for_name(s: str) -> str: + # produce a safe component for volume names etc. + s = s.strip().lower() + s = re.sub(r"[^a-z0-9_\-]+", "-", s) + s = re.sub(r"-{2,}", "-", s) + s = s.strip("-") + if not s: + return "x" + return s # ------------------------- -# Extract "Overview" section from README.md (exact "## Overview") +# README Overview extraction # ------------------------- def extract_overview(readme_path: Path, project_name: str) -> str: text = read_text_safe(readme_path) if not text: return f"{project_name} description to come" - lines = text.splitlines() overview = [] in_section = False @@ -86,39 +74,36 @@ def extract_overview(readme_path: Path, project_name: str) -> str: if not overview: return f"{project_name} description to come" return " ".join(overview) - # ------------------------- -# Logo URL lookup (skip HEAD if nologo True) +# Logo lookup (HEAD check) # ------------------------- -def find_logo_url(dir_path: Path, nologo: bool = False) -> str: +def find_logo_url(dir_path: Path, nologo: bool, branch: str) -> str: name = dir_path.name - logo_url = f"{ASSETS_BASE}/{name}.png" + # Use branch for asset if needed, but since assets are static, ignore branch here + logo = f"{ASSETS_BASE}/{name}.png" default = f"{ASSETS_BASE}/default.png" if nologo: return default try: - resp = requests.head(logo_url, timeout=4) - if resp.status_code == 200: - return logo_url + r = requests.head(logo, timeout=4) + if r.status_code == 200: + return logo except Exception: pass return default - # ------------------------- -# Parse env defaults from sample.env or env-sample (strip comments) -# Returns list of dicts { "name": ..., "default": ... } +# Parse environment variables from sample.env/env-sample # ------------------------- -def parse_env_vars(dir_path: Path): +def parse_env_vars(dir_path: Path) -> List[Dict[str,str]]: candidates = [dir_path / "sample.env", dir_path / "env-sample"] env_file = None - for p in candidates: - if p.exists(): - env_file = p + for c in candidates: + if c.exists(): + env_file = c break if not env_file: return [] - - env_list = [] + out = [] for raw in read_text_safe(env_file).splitlines(): line = raw.strip() if not line or line.startswith("#"): @@ -126,215 +111,89 @@ def parse_env_vars(dir_path: Path): if "=" in line: key, val = line.split("=", 1) key = key.strip() - # strip inline comments after # + # strip inline comment after # val = val.split("#", 1)[0].strip() - # remove surrounding quotes val = val.strip().strip('"').strip("'") - env_list.append({"name": key, "default": val}) - return env_list - + out.append({"name": key, "default": val}) + return out # ------------------------- -# Resolve the first "image:" line from docker-compose.yml -# Supports ${VAR:-default} and ${VAR} +# Build Portainer template object # ------------------------- -VAR_RE = re.compile(r"\$\{([^:}]+)(?:[:-]([^}]+))?\}") - -def parse_image(compose_path: Path, env_vars: list) -> str: - text = read_text_safe(compose_path) - if not text: - return "" - - env_defaults = {v["name"]: v["default"] for v in env_vars} - - for line in text.splitlines(): - stripped = line.strip() - if stripped.startswith("image:"): - image = stripped.split("image:", 1)[1].strip().strip('"').strip("'") - # replace ${VAR:-default} or ${VAR} using env_defaults - def repl(m): - var = m.group(1) - default = m.group(2) - return env_defaults.get(var, default or "") - image = VAR_RE.sub(repl, image) - return image - return "" - -# ------------------------- -# Parse ports into a list of strings Portainer likes -# Examples supported: -# - "8080:80" -# - "9000" -# - "9000:9000/tcp" -# - "53:53/udp" -# ------------------------- -def parse_ports(compose_path: Path): - text = read_text_safe(compose_path) - if not text: - return [] - - ports = [] - lines = text.splitlines() - in_ports = False - for line in lines: - stripped = line.strip() - if stripped.startswith("ports:"): - in_ports = True - continue - if in_ports: - if not stripped or not stripped.startswith("-"): - break - # get port string, strip comments/quotes - port_str = stripped[1:].strip().split("#", 1)[0].strip().strip('"').strip("'") - if not port_str: - continue - # normalize space - port_str = port_str.replace(" ", "") - # handle protocol suffix; keep as-is for Portainer - ports.append(port_str) - return ports - -# ------------------------- -# Parse volumes: -# - Accept mapping forms: -# host:container[:ro|rw] -# container[:ro|rw] -# named-volume:container[:ro|rw] -# - For Portainer templates we'll provide: -# {"container": "/path/in/container", "bind": ""} -# where is generated as "-" -# ------------------------- -def parse_volumes(compose_path: Path, stack_name: str): - text = read_text_safe(compose_path) - if not text: - return [] - - vols = [] - lines = text.splitlines() - in_volumes = False - for line in lines: - stripped = line.strip() - if stripped.startswith("volumes:"): - in_volumes = True - continue - if in_volumes: - if not stripped or not stripped.startswith("-"): - break - vol_line = stripped[1:].strip().split("#", 1)[0].strip().strip('"').strip("'") - if not vol_line: - continue - # split from right to handle host:container:mode (we want container and ignore host) - parts = vol_line.rsplit(":", 2) # at most 3 parts - # container part is last if there are 2 or more parts, else first - if len(parts) == 1: - container_path = parts[0].strip() - else: - container_path = parts[-2].strip() if len(parts) == 3 else parts[-1].strip() - # explanation: - # - "host:container" -> parts len 2 -> parts[-1] == container - # - "host:container:ro" -> parts len 3 -> parts[-2] == container - # final strip of mode suffix if any left - container_path = re.sub(r":(ro|rw)$", "", container_path) - # ensure container path starts with / - if not container_path.startswith("/"): - # if it's like "config.yaml" or similar, prefix with / - container_path = "/" + container_path.lstrip("/") - - # generate a safe named volume - safe = container_path.strip("/").replace("/", "-").replace(".", "-") - if not safe: - safe = "data" - vol_name = f"{stack_name}-{safe}" - vols.append({"container": container_path, "bind": vol_name}) - return vols - -# ------------------------- -# Build a Portainer template object for a project directory -# ------------------------- -def generate_template_object(dir_path: Path, nologo: bool = False): +def generate_template_object(dir_path: Path, branch: str, nologo: bool) -> Dict: name = dir_path.name - compose_file = dir_path / "docker-compose.yml" - readme_file = dir_path / "README.md" - - description = extract_overview(readme_file, name) - logo = find_logo_url(dir_path, nologo=nologo) + readme_path = dir_path / "README.md" env_vars = parse_env_vars(dir_path) - image = parse_image(compose_file, env_vars) - ports = parse_ports(compose_file) - volumes = parse_volumes(compose_file, name) - - # env entries: only include those with a name - env_entries = [] - for v in env_vars: - if not v.get("name"): - continue - # leave default as empty string if missing (Portainer accepts empty) - env_entries.append({"name": v["name"], "label": v["name"], "default": v.get("default", "")}) - - # Build stackfile raw URL on master branch - stackfile_url = f"{GITHUB_RAW_BASE}/{name}/docker-compose.yml" - - tpl = { - "type": "docker-compose", + obj = { + "type": 3, "title": name, "name": name, "note": "Auto-generated template from repository", "categories": ["Auto"], "platform": "linux", - "logo": logo, - "description": description, - # optional convenience field: image - "image": image, - # Portainer expects a full stackfile URL - "stackfile": stackfile_url, - "env": env_entries, + "logo": find_logo_url(dir_path, nologo=nologo, branch=branch), + "description": extract_overview(readme_path, name), + # Git repository for Compose stack + "repository": { + "url": f"https://github.com/{GITHUB_OWNER}/{GITHUB_REPO}", + "stackfile": f"{name}/docker-compose.yml" + } } - - # ports: Portainer accepts list of strings like "8000:80" or "53:53/udp" - if ports: - tpl["ports"] = ports - - # volumes: produce list of objects with container and bind (named volume) - if volumes: - tpl["volumes"] = volumes - - return tpl - + # env + env_entries = [] + for v in env_vars: + if not v.get("name"): + continue + env_entries.append({"name": v["name"], "label": v["name"], "default": v.get("default","")}) + if env_entries: + obj["env"] = env_entries + return obj # ------------------------- # Main # ------------------------- def main(): parser = argparse.ArgumentParser(description="Generate Portainer templates.json from compose cookbooks") - parser.add_argument("--nologo", action="store_true", help="skip HEAD requests for logos (faster, dev)") + parser.add_argument("--nologo", action="store_true", help="Skip HEAD check for logos (faster)") + parser.add_argument("--branch", default=DEFAULT_BRANCH, help="Git branch to use for logo lookup (default: master). Templates use repo default branch.") + parser.add_argument("--output", default=str(DEFAULT_OUTPUT), help="Output path for templates.json") + parser.add_argument("--no-skip-volpath", action="store_true", help="Don't skip projects containing ${VOL_PATH") args = parser.parse_args() - + out_path = Path(args.output).resolve() + branch = args.branch + nologo = args.nologo + skip_volpath = not args.no_skip_volpath templates = [] - - for item in REPO_ROOT.iterdir(): + skipped = [] + errored = [] + for item in sorted(REPO_ROOT.iterdir()): if not item.is_dir(): continue if item.name.startswith("_"): continue if item.name.endswith(("_dev", "_notes")): continue - compose_path = item / "docker-compose.yml" if not compose_path.exists(): continue - - # skip projects still using VOL_PATH (developer needs to fix) - if SKIP_PAT in read_text_safe(compose_path): - print(f"Skipping {item.name}: still uses ${{VOL_PATH}}") + text = read_text_safe(compose_path) + if skip_volpath and SKIP_VOLPATH_PATTERN in text: + skipped.append((item.name, "uses ${VOL_PATH}")) continue - - tpl = generate_template_object(item, nologo=args.nologo) - templates.append(tpl) - - output = {"version": "3", "templates": templates} - # Write atomically if possible - tmp = OUTPUT_FILE.with_suffix(".tmp") - tmp.write_text(json.dumps(output, indent=2)) - tmp.replace(OUTPUT_FILE) - print(f"Generated {OUTPUT_FILE} with {len(templates)} templates.") - + try: + tpl = generate_template_object(item, branch=branch, nologo=nologo) + templates.append(tpl) + except Exception as e: + errored.append((item.name, str(e))) + output = {"version": "2", "templates": templates} + # write atomic + write_atomic(out_path, json.dumps(output, indent=2)) + print(f"Generated {out_path} with {len(templates)} templates.") + if skipped: + print("Skipped projects:") + for n, reason in skipped: + print(f" - {n}: {reason}") + if errored: + print("Errored projects:") + for n, err in errored: + print(f" - {n}: {err}") if __name__ == "__main__": - main() + main() \ No newline at end of file diff --git a/templates.json b/templates.json index 6b90ad5..a83298d 100644 --- a/templates.json +++ b/templates.json @@ -1,697 +1,31 @@ { - "version": "3", + "version": "2", "templates": [ { - "type": "docker-compose", - "title": "wallabag", - "name": "wallabag", + "type": 3, + "title": "archivebox", + "name": "archivebox", "note": "Auto-generated template from repository", "categories": [ "Auto" ], "platform": "linux", - "logo": "https://i.4lt.ca/cookbook/default.png", - "description": "Docker Hub: https://hub.docker.com/r/wallabag/wallabag Project: Docker Compose Example: https://github.com/wallabag/docker Proxy Port: 80", - "image": "wallabag/wallabag:latest", - "stackfile": "https://raw.githubusercontent.com/nickyeoman/docker-compose-cookbooks/master/wallabag/docker-compose.yml", + "logo": "https://i.4lt.ca/cookbooks/default.png", + "description": "Docker Hub: https://hub.docker.com/r/archivebox/archivebox/tags Docker Compose Example: https://raw.githubusercontent.com/ArchiveBox/ArchiveBox/dev/docker-compose.yml Project: https://archivebox.io/ Proxy Port: 8000", + "repository": { + "url": "https://github.com/nickyeoman/docker-compose-cookbooks", + "stackfile": "archivebox/docker-compose.yml" + }, "env": [ { - "name": "WALLABAG_TZ", - "label": "WALLABAG_TZ", - "default": "America/Vancouver" - }, - { - "name": "WALLABAG_IMAGE", - "label": "WALLABAG_IMAGE", - "default": "wallabag/wallabag:latest" - }, - { - "name": "WALLABAG_DB_DRIVER", - "label": "WALLABAG_DB_DRIVER", - "default": "pdo_mysql" - }, - { - "name": "WALLABAG_DB_HOST", - "label": "WALLABAG_DB_HOST", - "default": "wallabag-db" - }, - { - "name": "WALLABAG_DB_PORT", - "label": "WALLABAG_DB_PORT", - "default": "3306" - }, - { - "name": "WALLABAG_DB_NAME", - "label": "WALLABAG_DB_NAME", - "default": "wallabag" - }, - { - "name": "WALLABAG_DB_USER", - "label": "WALLABAG_DB_USER", - "default": "wallabag" - }, - { - "name": "WALLABAG_DB_PASS", - "label": "WALLABAG_DB_PASS", - "default": "wallapass" - }, - { - "name": "WALLABAG_DB_CHARSET", - "label": "WALLABAG_DB_CHARSET", - "default": "utf8mb4" - }, - { - "name": "WALLABAG_DB_PREFIX", - "label": "WALLABAG_DB_PREFIX", - "default": "wallabag_" - }, - { - "name": "WALLABAG_MAILER_DSN", - "label": "WALLABAG_MAILER_DSN", - "default": "smtp://127.0.0.1" - }, - { - "name": "WALLABAG_FROM_WEMAIL", - "label": "WALLABAG_FROM_WEMAIL", - "default": "wallabag@example.com" - }, - { - "name": "WALLABAG_DOMAIN", - "label": "WALLABAG_DOMAIN", - "default": "https://your-wallabag-instance.wallabag.org" - }, - { - "name": "WALLABAG_SERVER", - "label": "WALLABAG_SERVER", - "default": "Your wallabag instance" - } - ], - "volumes": [ - { - "container": "/var/www/wallabag/web/assets/images", - "bind": "wallabag-var-www-wallabag-web-assets-images" + "name": "ARCHIVEBOX_IMAGE", + "label": "ARCHIVEBOX_IMAGE", + "default": "archivebox/archivebox:sha-1d49bee" } ] }, { - "type": "docker-compose", - "title": "thunderbird", - "name": "thunderbird", - "note": "Auto-generated template from repository", - "categories": [ - "Auto" - ], - "platform": "linux", - "logo": "https://i.4lt.ca/cookbook/default.png", - "description": "Git Hub: https://github.com/jlesage/docker-thunderbird Proxy Port: 5800", - "image": "jlesage/thunderbird:latest", - "stackfile": "https://raw.githubusercontent.com/nickyeoman/docker-compose-cookbooks/master/thunderbird/docker-compose.yml", - "env": [ - { - "name": "THUNDERBIRD_IMAGE", - "label": "THUNDERBIRD_IMAGE", - "default": "jlesage/thunderbird:latest" - }, - { - "name": "THUNDERBIRD_WEB_AUTHENTICATION", - "label": "THUNDERBIRD_WEB_AUTHENTICATION", - "default": "1" - }, - { - "name": "THUNDERBIRD_WEB_AUTHENTICATION_USERNAME", - "label": "THUNDERBIRD_WEB_AUTHENTICATION_USERNAME", - "default": "user" - }, - { - "name": "THUNDERBIRD_WEB_AUTHENTICATION_PASSWORD", - "label": "THUNDERBIRD_WEB_AUTHENTICATION_PASSWORD", - "default": "password" - }, - { - "name": "THUNDERBIRD_SECURE_CONNECTION", - "label": "THUNDERBIRD_SECURE_CONNECTION", - "default": "1" - } - ], - "ports": [ - "5800:5800" - ], - "volumes": [ - { - "container": "/config", - "bind": "thunderbird-config" - }, - { - "container": "/export", - "bind": "thunderbird-export" - } - ] - }, - { - "type": "docker-compose", - "title": "mariadb", - "name": "mariadb", - "note": "Auto-generated template from repository", - "categories": [ - "Auto" - ], - "platform": "linux", - "logo": "https://i.4lt.ca/cookbook/default.png", - "description": "mariadb description to come", - "image": "mariadb:latest", - "stackfile": "https://raw.githubusercontent.com/nickyeoman/docker-compose-cookbooks/master/mariadb/docker-compose.yml", - "env": [ - { - "name": "MARIADB_IMAGE", - "label": "MARIADB_IMAGE", - "default": "mariadb:latest" - }, - { - "name": "MARIADB_MARIADB_DATABASE", - "label": "MARIADB_MARIADB_DATABASE", - "default": "mydb" - }, - { - "name": "MARIADB_MARIADB_ROOT_PASSWORD", - "label": "MARIADB_MARIADB_ROOT_PASSWORD", - "default": "ChangeThisPassword0123456789ABCD" - }, - { - "name": "MARIADB_MARIADB_PASSWORD", - "label": "MARIADB_MARIADB_PASSWORD", - "default": "AlsoChangeThisPassword0123456789" - }, - { - "name": "MARIADB_MARIADB_USER", - "label": "MARIADB_MARIADB_USER", - "default": "dbuser" - } - ], - "volumes": [ - { - "container": "/var/lib/mysql", - "bind": "mariadb-var-lib-mysql" - } - ] - }, - { - "type": "docker-compose", - "title": "dozzle", - "name": "dozzle", - "note": "Auto-generated template from repository", - "categories": [ - "Auto" - ], - "platform": "linux", - "logo": "https://i.4lt.ca/cookbook/default.png", - "description": "dozzle description to come", - "image": "amir20/dozzle:latest", - "stackfile": "https://raw.githubusercontent.com/nickyeoman/docker-compose-cookbooks/master/dozzle/docker-compose.yml", - "env": [], - "ports": [ - "8080:8080" - ], - "volumes": [ - { - "container": "/var/run/docker.sock", - "bind": "dozzle-var-run-docker-sock" - } - ] - }, - { - "type": "docker-compose", - "title": "passbolt", - "name": "passbolt", - "note": "Auto-generated template from repository", - "categories": [ - "Auto" - ], - "platform": "linux", - "logo": "https://i.4lt.ca/cookbook/default.png", - "description": "passbolt description to come", - "image": "mariadb:10.4.11", - "stackfile": "https://raw.githubusercontent.com/nickyeoman/docker-compose-cookbooks/master/passbolt/docker-compose.yml", - "env": [ - { - "name": "PREFIX", - "label": "PREFIX", - "default": "p1" - }, - { - "name": "DOMAIN_NAME", - "label": "DOMAIN_NAME", - "default": "passbolt.nickyeoman.com" - }, - { - "name": "MYSQL_ROOT_PASSWORD", - "label": "MYSQL_ROOT_PASSWORD", - "default": "ChangeMe2ASecurepass!" - }, - { - "name": "MYSQL_PASSWORD", - "label": "MYSQL_PASSWORD", - "default": "Again2ASecurepass!" - }, - { - "name": "DB_V", - "label": "DB_V", - "default": "10.4.11" - }, - { - "name": "PASSBOLT_V", - "label": "PASSBOLT_V", - "default": "2.12.0-debian" - }, - { - "name": "NETWORK_NAME", - "label": "NETWORK_NAME", - "default": "traefik_web" - } - ] - }, - { - "type": "docker-compose", - "title": "unami", - "name": "unami", - "note": "Auto-generated template from repository", - "categories": [ - "Auto" - ], - "platform": "linux", - "logo": "https://i.4lt.ca/cookbook/default.png", - "description": "unami description to come", - "image": "ghcr.io/umami-software/umami:postgresql-latest", - "stackfile": "https://raw.githubusercontent.com/nickyeoman/docker-compose-cookbooks/master/unami/docker-compose.yml", - "env": [], - "ports": [ - "3000:3000" - ], - "volumes": [ - { - "container": "/var/lib/postgresql/data", - "bind": "unami-var-lib-postgresql-data" - } - ] - }, - { - "type": "docker-compose", - "title": "peertube", - "name": "peertube", - "note": "Auto-generated template from repository", - "categories": [ - "Auto" - ], - "platform": "linux", - "logo": "https://i.4lt.ca/cookbook/default.png", - "description": "peertube description to come", - "image": "chocobozzz/peertube:production-bookworm", - "stackfile": "https://raw.githubusercontent.com/nickyeoman/docker-compose-cookbooks/master/peertube/docker-compose.yml", - "env": [], - "ports": [ - "9000:9000" - ], - "volumes": [ - { - "container": "/data", - "bind": "peertube-data" - }, - { - "container": "/config", - "bind": "peertube-config" - } - ] - }, - { - "type": "docker-compose", - "title": "phpmyadmin", - "name": "phpmyadmin", - "note": "Auto-generated template from repository", - "categories": [ - "Auto" - ], - "platform": "linux", - "logo": "https://i.4lt.ca/cookbook/default.png", - "description": "Docker Hub: https://hub.docker.com/r/phpmyadmin/phpmyadmin/tags Proxy Port: 80 Not for production, there is no password protection by default.", - "image": "phpmyadmin/phpmyadmin:latest", - "stackfile": "https://raw.githubusercontent.com/nickyeoman/docker-compose-cookbooks/master/phpmyadmin/docker-compose.yml", - "env": [ - { - "name": "COOKBOOK", - "label": "COOKBOOK", - "default": "/docker-compose-cookbooks" - }, - { - "name": "COMPOSE_PROJECT_NAME", - "label": "COMPOSE_PROJECT_NAME", - "default": "phpmyadmin" - }, - { - "name": "TZ", - "label": "TZ", - "default": "America/Vancouver" - }, - { - "name": "VOL_CONFIG_PATH", - "label": "VOL_CONFIG_PATH", - "default": "/data/projectName/config" - }, - { - "name": "VOL_PATH", - "label": "VOL_PATH", - "default": "/data/projectName/data" - }, - { - "name": "PHPMYADMIN_IMAGE", - "label": "PHPMYADMIN_IMAGE", - "default": "phpmyadmin/phpmyadmin:latest" - }, - { - "name": "PHPMYADMIN_PMA_ARBITRARY", - "label": "PHPMYADMIN_PMA_ARBITRARY", - "default": "1" - }, - { - "name": "PHPMYADMIN_PMA_HOST", - "label": "PHPMYADMIN_PMA_HOST", - "default": "mariadb" - }, - { - "name": "PHPMYADMIN_PMA_USER", - "label": "PHPMYADMIN_PMA_USER", - "default": "root" - }, - { - "name": "PHPMYADMIN_PMA_PASSWORD", - "label": "PHPMYADMIN_PMA_PASSWORD", - "default": "ChangeThisPassword0123456789ABCD" - }, - { - "name": "PHPMYADMIN_UPLOAD_LIMIT", - "label": "PHPMYADMIN_UPLOAD_LIMIT", - "default": "200M" - } - ], - "volumes": [ - { - "container": "/etc/timezone", - "bind": "phpmyadmin-etc-timezone" - }, - { - "container": "/etc/localtime", - "bind": "phpmyadmin-etc-localtime" - } - ] - }, - { - "type": "docker-compose", - "title": "penpot", - "name": "penpot", - "note": "Auto-generated template from repository", - "categories": [ - "Auto" - ], - "platform": "linux", - "logo": "https://i.4lt.ca/cookbook/default.png", - "description": "penpot description to come", - "image": "penpotapp/frontend:latest", - "stackfile": "https://raw.githubusercontent.com/nickyeoman/docker-compose-cookbooks/master/penpot/docker-compose.yml", - "env": [], - "ports": [ - "9001:8080" - ] - }, - { - "type": "docker-compose", - "title": "pihole", - "name": "pihole", - "note": "Auto-generated template from repository", - "categories": [ - "Auto" - ], - "platform": "linux", - "logo": "https://i.4lt.ca/cookbook/default.png", - "description": "pihole description to come", - "image": "pihole/pihole:latest", - "stackfile": "https://raw.githubusercontent.com/nickyeoman/docker-compose-cookbooks/master/pihole/docker-compose.yml", - "env": [ - { - "name": "VOL_PATH", - "label": "VOL_PATH", - "default": "./data" - }, - { - "name": "TZ", - "label": "TZ", - "default": "America/Vancouver" - }, - { - "name": "COMPOSE_PROJECT_NAME", - "label": "COMPOSE_PROJECT_NAME", - "default": "pihole" - } - ], - "ports": [ - "53:53/tcp", - "53:53/udp", - "80:80/tcp" - ], - "volumes": [ - { - "container": "/etc/pihole", - "bind": "pihole-etc-pihole" - }, - { - "container": "/etc/dnsmasq.d", - "bind": "pihole-etc-dnsmasq-d" - } - ] - }, - { - "type": "docker-compose", - "title": "matomo", - "name": "matomo", - "note": "Auto-generated template from repository", - "categories": [ - "Auto" - ], - "platform": "linux", - "logo": "https://i.4lt.ca/cookbook/default.png", - "description": "matomo description to come", - "image": "mariadb:10.4.0", - "stackfile": "https://raw.githubusercontent.com/nickyeoman/docker-compose-cookbooks/master/matomo/docker-compose.yml", - "env": [ - { - "name": "PREFIX", - "label": "PREFIX", - "default": "p1" - }, - { - "name": "MATOMO_DOMAIN_NAME", - "label": "MATOMO_DOMAIN_NAME", - "default": "matomo.nickyeoman.com" - }, - { - "name": "MATOMO_MYSQL_ROOT_PASSWORD", - "label": "MATOMO_MYSQL_ROOT_PASSWORD", - "default": "ChangeMe2ASecurepass!" - }, - { - "name": "MATOMO_MYSQL_PASSWORD", - "label": "MATOMO_MYSQL_PASSWORD", - "default": "Again2ASecurepass!" - }, - { - "name": "DB_V", - "label": "DB_V", - "default": "10.4.0" - }, - { - "name": "MATOMO_V", - "label": "MATOMO_V", - "default": "3.13.5-apache" - } - ], - "volumes": [ - { - "container": "/var/lib/mysql", - "bind": "matomo-var-lib-mysql" - } - ] - }, - { - "type": "docker-compose", - "title": "joomla", - "name": "joomla", - "note": "Auto-generated template from repository", - "categories": [ - "Auto" - ], - "platform": "linux", - "logo": "https://i.4lt.ca/cookbook/default.png", - "description": "joomla description to come", - "image": "mariadb:10.7.1 # https://hub.docker.com/_/mariadb", - "stackfile": "https://raw.githubusercontent.com/nickyeoman/docker-compose-cookbooks/master/joomla/docker-compose.yml", - "env": [] - }, - { - "type": "docker-compose", - "title": "etherpad", - "name": "etherpad", - "note": "Auto-generated template from repository", - "categories": [ - "Auto" - ], - "platform": "linux", - "logo": "https://i.4lt.ca/cookbook/default.png", - "description": "etherpad description to come", - "image": "", - "stackfile": "https://raw.githubusercontent.com/nickyeoman/docker-compose-cookbooks/master/etherpad/docker-compose.yml", - "env": [] - }, - { - "type": "docker-compose", - "title": "posthog", - "name": "posthog", - "note": "Auto-generated template from repository", - "categories": [ - "Auto" - ], - "platform": "linux", - "logo": "https://i.4lt.ca/cookbook/default.png", - "description": "posthog description to come", - "image": "", - "stackfile": "https://raw.githubusercontent.com/nickyeoman/docker-compose-cookbooks/master/posthog/docker-compose.yml", - "env": [] - }, - { - "type": "docker-compose", - "title": "memos", - "name": "memos", - "note": "Auto-generated template from repository", - "categories": [ - "Auto" - ], - "platform": "linux", - "logo": "https://i.4lt.ca/cookbook/default.png", - "description": "memos description to come", - "image": "neosmemo/memos:stable", - "stackfile": "https://raw.githubusercontent.com/nickyeoman/docker-compose-cookbooks/master/memos/docker-compose.yml", - "env": [], - "ports": [ - "5230:5230" - ], - "volumes": [ - { - "container": "/var/opt/memos", - "bind": "memos-var-opt-memos" - } - ] - }, - { - "type": "docker-compose", - "title": "redis", - "name": "redis", - "note": "Auto-generated template from repository", - "categories": [ - "Auto" - ], - "platform": "linux", - "logo": "https://i.4lt.ca/cookbook/default.png", - "description": "Docker Hub: https://hub.docker.com/_/redis", - "image": "redis:alpine", - "stackfile": "https://raw.githubusercontent.com/nickyeoman/docker-compose-cookbooks/master/redis/docker-compose.yml", - "env": [ - { - "name": "COOKBOOK", - "label": "COOKBOOK", - "default": "/git/docker-compose-cookbooks" - }, - { - "name": "REDIS_IMAGE", - "label": "REDIS_IMAGE", - "default": "redis:alpine" - } - ] - }, - { - "type": "docker-compose", - "title": "listmonk", - "name": "listmonk", - "note": "Auto-generated template from repository", - "categories": [ - "Auto" - ], - "platform": "linux", - "logo": "https://i.4lt.ca/cookbook/default.png", - "description": "listmonk description to come", - "image": "postgres:13-alpine", - "stackfile": "https://raw.githubusercontent.com/nickyeoman/docker-compose-cookbooks/master/listmonk/docker-compose.yml", - "env": [ - { - "name": "POSTGRES_USER", - "label": "POSTGRES_USER", - "default": "listmonk" - }, - { - "name": "POSTGRES_PASSWORD", - "label": "POSTGRES_PASSWORD", - "default": "securepassword" - }, - { - "name": "POSTGRES_DB", - "label": "POSTGRES_DB", - "default": "listmonk" - }, - { - "name": "SECRET_KEY", - "label": "SECRET_KEY", - "default": "your_super_secret_key" - } - ], - "ports": [ - "9000:9000" - ], - "volumes": [ - { - "container": "/var/lib/postgresql/data", - "bind": "listmonk-var-lib-postgresql-data" - } - ] - }, - { - "type": "docker-compose", - "title": "shlink", - "name": "shlink", - "note": "Auto-generated template from repository", - "categories": [ - "Auto" - ], - "platform": "linux", - "logo": "https://i.4lt.ca/cookbook/default.png", - "description": "shlink description to come", - "image": "mariadb:10.7.1 # https://hub.docker.com/_/mariadb", - "stackfile": "https://raw.githubusercontent.com/nickyeoman/docker-compose-cookbooks/master/shlink/docker-compose.yml", - "env": [], - "ports": [ - "8003:80" - ], - "volumes": [ - { - "container": "/var/lib/mysql", - "bind": "shlink-var-lib-mysql" - }, - { - "container": "/etc/timezone", - "bind": "shlink-etc-timezone" - }, - { - "container": "/etc/localtime", - "bind": "shlink-etc-localtime" - } - ] - }, - { - "type": "docker-compose", + "type": 3, "title": "authentik", "name": "authentik", "note": "Auto-generated template from repository", @@ -699,84 +33,15 @@ "Auto" ], "platform": "linux", - "logo": "https://i.4lt.ca/cookbook/default.png", + "logo": "https://i.4lt.ca/cookbooks/default.png", "description": "authentik description to come", - "image": "docker.io/library/postgres:16-alpine", - "stackfile": "https://raw.githubusercontent.com/nickyeoman/docker-compose-cookbooks/master/authentik/docker-compose.yml", - "env": [], - "ports": [ - "${COMPOSE_PORT_HTTP:-9000}:9000", - "${COMPOSE_PORT_HTTPS:-9443}:9443" - ], - "volumes": [ - { - "container": "/var/lib/postgresql/data", - "bind": "authentik-var-lib-postgresql-data" - } - ] + "repository": { + "url": "https://github.com/nickyeoman/docker-compose-cookbooks", + "stackfile": "authentik/docker-compose.yml" + } }, { - "type": "docker-compose", - "title": "homepage", - "name": "homepage", - "note": "Auto-generated template from repository", - "categories": [ - "Auto" - ], - "platform": "linux", - "logo": "https://i.4lt.ca/cookbook/default.png", - "description": "Project: https://gethomepage.dev/latest/ Docker Compose Example: https://gethomepage.dev/latest/installation/docker/ Proxy Port: 3000 If you want to use the optional docker socket, you must run as root.", - "image": "ghcr.io/gethomepage/homepage:latest", - "stackfile": "https://raw.githubusercontent.com/nickyeoman/docker-compose-cookbooks/master/homepage/docker-compose.yml", - "env": [ - { - "name": "HOMEPAGE_IMAGE", - "label": "HOMEPAGE_IMAGE", - "default": "ghcr.io/gethomepage/homepage:latest" - }, - { - "name": "VOL_CONFIG_PATH", - "label": "VOL_CONFIG_PATH", - "default": "./config" - } - ], - "volumes": [ - { - "container": "/app/config", - "bind": "homepage-app-config" - }, - { - "container": "/var/run/docker.sock", - "bind": "homepage-var-run-docker-sock" - } - ] - }, - { - "type": "docker-compose", - "title": "docmost", - "name": "docmost", - "note": "Auto-generated template from repository", - "categories": [ - "Auto" - ], - "platform": "linux", - "logo": "https://i.4lt.ca/cookbook/default.png", - "description": "docmost description to come", - "image": "docmost/docmost:latest", - "stackfile": "https://raw.githubusercontent.com/nickyeoman/docker-compose-cookbooks/master/docmost/docker-compose.yml", - "env": [], - "ports": [ - "8000:3000" - ], - "volumes": [ - { - "container": "/app/data/storage", - "bind": "docmost-app-data-storage" - } - ] - }, - { - "type": "docker-compose", + "type": 3, "title": "bookstack", "name": "bookstack", "note": "Auto-generated template from repository", @@ -784,10 +49,12 @@ "Auto" ], "platform": "linux", - "logo": "https://i.4lt.ca/cookbook/default.png", + "logo": "https://i.4lt.ca/cookbooks/default.png", "description": "BookStack is a self-hosted wiki platform for organizing and storing documentation in a simple, book/chapter/page structure. This Docker Compose stack allows easy deployment with persistent storage.", - "image": "solidnerd/bookstack:latest", - "stackfile": "https://raw.githubusercontent.com/nickyeoman/docker-compose-cookbooks/master/bookstack/docker-compose.yml", + "repository": { + "url": "https://github.com/nickyeoman/docker-compose-cookbooks", + "stackfile": "bookstack/docker-compose.yml" + }, "env": [ { "name": "BOOKSTACK_APP_KEY", @@ -859,58 +126,10 @@ "label": "MARIADB_MARIADB_PASSWORD", "default": "AlsoChangeThisPassword" } - ], - "ports": [ - "8080:8080" - ], - "volumes": [ - { - "container": "/usr/local/etc/php/php.ini", - "bind": "bookstack-usr-local-etc-php-php-ini" - }, - { - "container": "/var/www/bookstack/storage/uploads", - "bind": "bookstack-var-www-bookstack-storage-uploads" - }, - { - "container": "/var/www/bookstack/public/uploads", - "bind": "bookstack-var-www-bookstack-public-uploads" - } ] }, { - "type": "docker-compose", - "title": "rocketchat", - "name": "rocketchat", - "note": "Auto-generated template from repository", - "categories": [ - "Auto" - ], - "platform": "linux", - "logo": "https://i.4lt.ca/cookbook/default.png", - "description": "rocketchat description to come", - "image": "rocketchat/rocket.chat:latest", - "stackfile": "https://raw.githubusercontent.com/nickyeoman/docker-compose-cookbooks/master/rocketchat/docker-compose.yml", - "env": [ - { - "name": "PREFIX", - "label": "PREFIX", - "default": "p1" - }, - { - "name": "ROCKET_DOMAIN_NAME", - "label": "ROCKET_DOMAIN_NAME", - "default": "chat.nickyeoman.com" - }, - { - "name": "ROCKETCHAT_V", - "label": "ROCKETCHAT_V", - "default": "3.1.1" - } - ] - }, - { - "type": "docker-compose", + "type": 3, "title": "dockge", "name": "dockge", "note": "Auto-generated template from repository", @@ -918,31 +137,107 @@ "Auto" ], "platform": "linux", - "logo": "https://i.4lt.ca/cookbook/default.png", + "logo": "https://i.4lt.ca/cookbooks/default.png", "description": "dockge description to come", - "image": "louislam/dockge:latest", - "stackfile": "https://raw.githubusercontent.com/nickyeoman/docker-compose-cookbooks/master/dockge/docker-compose.yml", - "env": [], - "ports": [ - "5001:5001" + "repository": { + "url": "https://github.com/nickyeoman/docker-compose-cookbooks", + "stackfile": "dockge/docker-compose.yml" + } + }, + { + "type": 3, + "title": "docmost", + "name": "docmost", + "note": "Auto-generated template from repository", + "categories": [ + "Auto" ], - "volumes": [ + "platform": "linux", + "logo": "https://i.4lt.ca/cookbooks/default.png", + "description": "docmost description to come", + "repository": { + "url": "https://github.com/nickyeoman/docker-compose-cookbooks", + "stackfile": "docmost/docker-compose.yml" + } + }, + { + "type": 3, + "title": "dozzle", + "name": "dozzle", + "note": "Auto-generated template from repository", + "categories": [ + "Auto" + ], + "platform": "linux", + "logo": "https://i.4lt.ca/cookbooks/default.png", + "description": "dozzle description to come", + "repository": { + "url": "https://github.com/nickyeoman/docker-compose-cookbooks", + "stackfile": "dozzle/docker-compose.yml" + } + }, + { + "type": 3, + "title": "etherpad", + "name": "etherpad", + "note": "Auto-generated template from repository", + "categories": [ + "Auto" + ], + "platform": "linux", + "logo": "https://i.4lt.ca/cookbooks/default.png", + "description": "etherpad description to come", + "repository": { + "url": "https://github.com/nickyeoman/docker-compose-cookbooks", + "stackfile": "etherpad/docker-compose.yml" + } + }, + { + "type": 3, + "title": "hedgedoc", + "name": "hedgedoc", + "note": "Auto-generated template from repository", + "categories": [ + "Auto" + ], + "platform": "linux", + "logo": "https://i.4lt.ca/cookbooks/default.png", + "description": "hedgedoc description to come", + "repository": { + "url": "https://github.com/nickyeoman/docker-compose-cookbooks", + "stackfile": "hedgedoc/docker-compose.yml" + } + }, + { + "type": 3, + "title": "homepage", + "name": "homepage", + "note": "Auto-generated template from repository", + "categories": [ + "Auto" + ], + "platform": "linux", + "logo": "https://i.4lt.ca/cookbooks/default.png", + "description": "Project: https://gethomepage.dev/latest/ Docker Compose Example: https://gethomepage.dev/latest/installation/docker/ Proxy Port: 3000 If you want to use the optional docker socket, you must run as root.", + "repository": { + "url": "https://github.com/nickyeoman/docker-compose-cookbooks", + "stackfile": "homepage/docker-compose.yml" + }, + "env": [ { - "container": "/var/run/docker.sock", - "bind": "dockge-var-run-docker-sock" + "name": "HOMEPAGE_IMAGE", + "label": "HOMEPAGE_IMAGE", + "default": "ghcr.io/gethomepage/homepage:latest" }, { - "container": "/app/data", - "bind": "dockge-app-data" - }, - { - "container": "/opt/stacks", - "bind": "dockge-opt-stacks" + "name": "VOL_CONFIG_PATH", + "label": "VOL_CONFIG_PATH", + "default": "./config" } ] }, { - "type": "docker-compose", + "type": 3, "title": "invoiceninja", "name": "invoiceninja", "note": "Auto-generated template from repository", @@ -950,10 +245,12 @@ "Auto" ], "platform": "linux", - "logo": "https://i.4lt.ca/cookbook/default.png", + "logo": "https://i.4lt.ca/cookbooks/default.png", "description": "invoiceninja description to come", - "image": "invoiceninja/invoiceninja-debian:-latest", - "stackfile": "https://raw.githubusercontent.com/nickyeoman/docker-compose-cookbooks/master/invoiceninja/docker-compose.yml", + "repository": { + "url": "https://github.com/nickyeoman/docker-compose-cookbooks", + "stackfile": "invoiceninja/docker-compose.yml" + }, "env": [ { "name": "APP_URL", @@ -1155,13 +452,378 @@ "label": "SCOUT_DRIVER", "default": "null" } - ], - "ports": [ - "8000:80" ] }, { - "type": "docker-compose", + "type": 3, + "title": "joomla", + "name": "joomla", + "note": "Auto-generated template from repository", + "categories": [ + "Auto" + ], + "platform": "linux", + "logo": "https://i.4lt.ca/cookbooks/default.png", + "description": "joomla description to come", + "repository": { + "url": "https://github.com/nickyeoman/docker-compose-cookbooks", + "stackfile": "joomla/docker-compose.yml" + } + }, + { + "type": 3, + "title": "listmonk", + "name": "listmonk", + "note": "Auto-generated template from repository", + "categories": [ + "Auto" + ], + "platform": "linux", + "logo": "https://i.4lt.ca/cookbooks/default.png", + "description": "listmonk description to come", + "repository": { + "url": "https://github.com/nickyeoman/docker-compose-cookbooks", + "stackfile": "listmonk/docker-compose.yml" + }, + "env": [ + { + "name": "POSTGRES_USER", + "label": "POSTGRES_USER", + "default": "listmonk" + }, + { + "name": "POSTGRES_PASSWORD", + "label": "POSTGRES_PASSWORD", + "default": "securepassword" + }, + { + "name": "POSTGRES_DB", + "label": "POSTGRES_DB", + "default": "listmonk" + }, + { + "name": "SECRET_KEY", + "label": "SECRET_KEY", + "default": "your_super_secret_key" + } + ] + }, + { + "type": 3, + "title": "mariadb", + "name": "mariadb", + "note": "Auto-generated template from repository", + "categories": [ + "Auto" + ], + "platform": "linux", + "logo": "https://i.4lt.ca/cookbooks/default.png", + "description": "mariadb description to come", + "repository": { + "url": "https://github.com/nickyeoman/docker-compose-cookbooks", + "stackfile": "mariadb/docker-compose.yml" + }, + "env": [ + { + "name": "MARIADB_IMAGE", + "label": "MARIADB_IMAGE", + "default": "mariadb:latest" + }, + { + "name": "MARIADB_MARIADB_DATABASE", + "label": "MARIADB_MARIADB_DATABASE", + "default": "mydb" + }, + { + "name": "MARIADB_MARIADB_ROOT_PASSWORD", + "label": "MARIADB_MARIADB_ROOT_PASSWORD", + "default": "ChangeThisPassword0123456789ABCD" + }, + { + "name": "MARIADB_MARIADB_PASSWORD", + "label": "MARIADB_MARIADB_PASSWORD", + "default": "AlsoChangeThisPassword0123456789" + }, + { + "name": "MARIADB_MARIADB_USER", + "label": "MARIADB_MARIADB_USER", + "default": "dbuser" + } + ] + }, + { + "type": 3, + "title": "matomo", + "name": "matomo", + "note": "Auto-generated template from repository", + "categories": [ + "Auto" + ], + "platform": "linux", + "logo": "https://i.4lt.ca/cookbooks/default.png", + "description": "matomo description to come", + "repository": { + "url": "https://github.com/nickyeoman/docker-compose-cookbooks", + "stackfile": "matomo/docker-compose.yml" + }, + "env": [ + { + "name": "PREFIX", + "label": "PREFIX", + "default": "p1" + }, + { + "name": "MATOMO_DOMAIN_NAME", + "label": "MATOMO_DOMAIN_NAME", + "default": "matomo.nickyeoman.com" + }, + { + "name": "MATOMO_MYSQL_ROOT_PASSWORD", + "label": "MATOMO_MYSQL_ROOT_PASSWORD", + "default": "ChangeMe2ASecurepass!" + }, + { + "name": "MATOMO_MYSQL_PASSWORD", + "label": "MATOMO_MYSQL_PASSWORD", + "default": "Again2ASecurepass!" + }, + { + "name": "DB_V", + "label": "DB_V", + "default": "10.4.0" + }, + { + "name": "MATOMO_V", + "label": "MATOMO_V", + "default": "3.13.5-apache" + } + ] + }, + { + "type": 3, + "title": "memos", + "name": "memos", + "note": "Auto-generated template from repository", + "categories": [ + "Auto" + ], + "platform": "linux", + "logo": "https://i.4lt.ca/cookbooks/default.png", + "description": "memos description to come", + "repository": { + "url": "https://github.com/nickyeoman/docker-compose-cookbooks", + "stackfile": "memos/docker-compose.yml" + } + }, + { + "type": 3, + "title": "passbolt", + "name": "passbolt", + "note": "Auto-generated template from repository", + "categories": [ + "Auto" + ], + "platform": "linux", + "logo": "https://i.4lt.ca/cookbooks/default.png", + "description": "passbolt description to come", + "repository": { + "url": "https://github.com/nickyeoman/docker-compose-cookbooks", + "stackfile": "passbolt/docker-compose.yml" + }, + "env": [ + { + "name": "PREFIX", + "label": "PREFIX", + "default": "p1" + }, + { + "name": "DOMAIN_NAME", + "label": "DOMAIN_NAME", + "default": "passbolt.nickyeoman.com" + }, + { + "name": "MYSQL_ROOT_PASSWORD", + "label": "MYSQL_ROOT_PASSWORD", + "default": "ChangeMe2ASecurepass!" + }, + { + "name": "MYSQL_PASSWORD", + "label": "MYSQL_PASSWORD", + "default": "Again2ASecurepass!" + }, + { + "name": "DB_V", + "label": "DB_V", + "default": "10.4.11" + }, + { + "name": "PASSBOLT_V", + "label": "PASSBOLT_V", + "default": "2.12.0-debian" + }, + { + "name": "NETWORK_NAME", + "label": "NETWORK_NAME", + "default": "traefik_web" + } + ] + }, + { + "type": 3, + "title": "peertube", + "name": "peertube", + "note": "Auto-generated template from repository", + "categories": [ + "Auto" + ], + "platform": "linux", + "logo": "https://i.4lt.ca/cookbooks/default.png", + "description": "peertube description to come", + "repository": { + "url": "https://github.com/nickyeoman/docker-compose-cookbooks", + "stackfile": "peertube/docker-compose.yml" + } + }, + { + "type": 3, + "title": "penpot", + "name": "penpot", + "note": "Auto-generated template from repository", + "categories": [ + "Auto" + ], + "platform": "linux", + "logo": "https://i.4lt.ca/cookbooks/default.png", + "description": "penpot description to come", + "repository": { + "url": "https://github.com/nickyeoman/docker-compose-cookbooks", + "stackfile": "penpot/docker-compose.yml" + } + }, + { + "type": 3, + "title": "phpmyadmin", + "name": "phpmyadmin", + "note": "Auto-generated template from repository", + "categories": [ + "Auto" + ], + "platform": "linux", + "logo": "https://i.4lt.ca/cookbooks/default.png", + "description": "Docker Hub: https://hub.docker.com/r/phpmyadmin/phpmyadmin/tags Proxy Port: 80 Not for production, there is no password protection by default.", + "repository": { + "url": "https://github.com/nickyeoman/docker-compose-cookbooks", + "stackfile": "phpmyadmin/docker-compose.yml" + }, + "env": [ + { + "name": "COOKBOOK", + "label": "COOKBOOK", + "default": "/docker-compose-cookbooks" + }, + { + "name": "COMPOSE_PROJECT_NAME", + "label": "COMPOSE_PROJECT_NAME", + "default": "phpmyadmin" + }, + { + "name": "TZ", + "label": "TZ", + "default": "America/Vancouver" + }, + { + "name": "VOL_CONFIG_PATH", + "label": "VOL_CONFIG_PATH", + "default": "/data/projectName/config" + }, + { + "name": "VOL_PATH", + "label": "VOL_PATH", + "default": "/data/projectName/data" + }, + { + "name": "PHPMYADMIN_IMAGE", + "label": "PHPMYADMIN_IMAGE", + "default": "phpmyadmin/phpmyadmin:latest" + }, + { + "name": "PHPMYADMIN_PMA_ARBITRARY", + "label": "PHPMYADMIN_PMA_ARBITRARY", + "default": "1" + }, + { + "name": "PHPMYADMIN_PMA_HOST", + "label": "PHPMYADMIN_PMA_HOST", + "default": "mariadb" + }, + { + "name": "PHPMYADMIN_PMA_USER", + "label": "PHPMYADMIN_PMA_USER", + "default": "root" + }, + { + "name": "PHPMYADMIN_PMA_PASSWORD", + "label": "PHPMYADMIN_PMA_PASSWORD", + "default": "ChangeThisPassword0123456789ABCD" + }, + { + "name": "PHPMYADMIN_UPLOAD_LIMIT", + "label": "PHPMYADMIN_UPLOAD_LIMIT", + "default": "200M" + } + ] + }, + { + "type": 3, + "title": "pihole", + "name": "pihole", + "note": "Auto-generated template from repository", + "categories": [ + "Auto" + ], + "platform": "linux", + "logo": "https://i.4lt.ca/cookbooks/default.png", + "description": "pihole description to come", + "repository": { + "url": "https://github.com/nickyeoman/docker-compose-cookbooks", + "stackfile": "pihole/docker-compose.yml" + }, + "env": [ + { + "name": "VOL_PATH", + "label": "VOL_PATH", + "default": "./data" + }, + { + "name": "TZ", + "label": "TZ", + "default": "America/Vancouver" + }, + { + "name": "COMPOSE_PROJECT_NAME", + "label": "COMPOSE_PROJECT_NAME", + "default": "pihole" + } + ] + }, + { + "type": 3, + "title": "posthog", + "name": "posthog", + "note": "Auto-generated template from repository", + "categories": [ + "Auto" + ], + "platform": "linux", + "logo": "https://i.4lt.ca/cookbooks/default.png", + "description": "posthog description to come", + "repository": { + "url": "https://github.com/nickyeoman/docker-compose-cookbooks", + "stackfile": "posthog/docker-compose.yml" + } + }, + { + "type": 3, "title": "prowlarr", "name": "prowlarr", "note": "Auto-generated template from repository", @@ -1169,10 +831,12 @@ "Auto" ], "platform": "linux", - "logo": "https://i.4lt.ca/cookbook/default.png", + "logo": "https://i.4lt.ca/cookbooks/default.png", "description": "prowlarr description to come", - "image": "ghcr.io/hotio/prowlarr:release", - "stackfile": "https://raw.githubusercontent.com/nickyeoman/docker-compose-cookbooks/master/prowlarr/docker-compose.yml", + "repository": { + "url": "https://github.com/nickyeoman/docker-compose-cookbooks", + "stackfile": "prowlarr/docker-compose.yml" + }, "env": [ { "name": "VOL_PATH", @@ -1189,65 +853,229 @@ "label": "TZ", "default": "America/Vancouver" } - ], - "ports": [ - "9696:9696" - ], - "volumes": [ - { - "container": "/-./data/prowlarr/config}", - "bind": "prowlarr----data-prowlarr-config}" - } ] }, { - "type": "docker-compose", - "title": "archivebox", - "name": "archivebox", + "type": 3, + "title": "redis", + "name": "redis", "note": "Auto-generated template from repository", "categories": [ "Auto" ], "platform": "linux", - "logo": "https://i.4lt.ca/cookbook/default.png", - "description": "Docker Hub: https://hub.docker.com/r/archivebox/archivebox/tags Docker Compose Example: https://raw.githubusercontent.com/ArchiveBox/ArchiveBox/dev/docker-compose.yml Project: https://archivebox.io/ Proxy Port: 8000", - "image": "archivebox/archivebox:sha-1d49bee", - "stackfile": "https://raw.githubusercontent.com/nickyeoman/docker-compose-cookbooks/master/archivebox/docker-compose.yml", + "logo": "https://i.4lt.ca/cookbooks/default.png", + "description": "Docker Hub: https://hub.docker.com/_/redis", + "repository": { + "url": "https://github.com/nickyeoman/docker-compose-cookbooks", + "stackfile": "redis/docker-compose.yml" + }, "env": [ { - "name": "ARCHIVEBOX_IMAGE", - "label": "ARCHIVEBOX_IMAGE", - "default": "archivebox/archivebox:sha-1d49bee" - } - ], - "volumes": [ + "name": "COOKBOOK", + "label": "COOKBOOK", + "default": "/git/docker-compose-cookbooks" + }, { - "container": "/data", - "bind": "archivebox-data" + "name": "REDIS_IMAGE", + "label": "REDIS_IMAGE", + "default": "redis:alpine" } ] }, { - "type": "docker-compose", - "title": "hedgedoc", - "name": "hedgedoc", + "type": 3, + "title": "rocketchat", + "name": "rocketchat", "note": "Auto-generated template from repository", "categories": [ "Auto" ], "platform": "linux", - "logo": "https://i.4lt.ca/cookbook/default.png", - "description": "hedgedoc description to come", - "image": "ghcr.io/hedgedoc/hedgedoc:latest", - "stackfile": "https://raw.githubusercontent.com/nickyeoman/docker-compose-cookbooks/master/hedgedoc/docker-compose.yml", - "env": [], - "ports": [ - "3000:3000" - ], - "volumes": [ + "logo": "https://i.4lt.ca/cookbooks/default.png", + "description": "rocketchat description to come", + "repository": { + "url": "https://github.com/nickyeoman/docker-compose-cookbooks", + "stackfile": "rocketchat/docker-compose.yml" + }, + "env": [ { - "container": "/hedgedoc/data", - "bind": "hedgedoc-hedgedoc-data" + "name": "PREFIX", + "label": "PREFIX", + "default": "p1" + }, + { + "name": "ROCKET_DOMAIN_NAME", + "label": "ROCKET_DOMAIN_NAME", + "default": "chat.nickyeoman.com" + }, + { + "name": "ROCKETCHAT_V", + "label": "ROCKETCHAT_V", + "default": "3.1.1" + } + ] + }, + { + "type": 3, + "title": "shlink", + "name": "shlink", + "note": "Auto-generated template from repository", + "categories": [ + "Auto" + ], + "platform": "linux", + "logo": "https://i.4lt.ca/cookbooks/default.png", + "description": "shlink description to come", + "repository": { + "url": "https://github.com/nickyeoman/docker-compose-cookbooks", + "stackfile": "shlink/docker-compose.yml" + } + }, + { + "type": 3, + "title": "thunderbird", + "name": "thunderbird", + "note": "Auto-generated template from repository", + "categories": [ + "Auto" + ], + "platform": "linux", + "logo": "https://i.4lt.ca/cookbooks/default.png", + "description": "Git Hub: https://github.com/jlesage/docker-thunderbird Proxy Port: 5800", + "repository": { + "url": "https://github.com/nickyeoman/docker-compose-cookbooks", + "stackfile": "thunderbird/docker-compose.yml" + }, + "env": [ + { + "name": "THUNDERBIRD_IMAGE", + "label": "THUNDERBIRD_IMAGE", + "default": "jlesage/thunderbird:latest" + }, + { + "name": "THUNDERBIRD_WEB_AUTHENTICATION", + "label": "THUNDERBIRD_WEB_AUTHENTICATION", + "default": "1" + }, + { + "name": "THUNDERBIRD_WEB_AUTHENTICATION_USERNAME", + "label": "THUNDERBIRD_WEB_AUTHENTICATION_USERNAME", + "default": "user" + }, + { + "name": "THUNDERBIRD_WEB_AUTHENTICATION_PASSWORD", + "label": "THUNDERBIRD_WEB_AUTHENTICATION_PASSWORD", + "default": "password" + }, + { + "name": "THUNDERBIRD_SECURE_CONNECTION", + "label": "THUNDERBIRD_SECURE_CONNECTION", + "default": "1" + } + ] + }, + { + "type": 3, + "title": "unami", + "name": "unami", + "note": "Auto-generated template from repository", + "categories": [ + "Auto" + ], + "platform": "linux", + "logo": "https://i.4lt.ca/cookbooks/default.png", + "description": "unami description to come", + "repository": { + "url": "https://github.com/nickyeoman/docker-compose-cookbooks", + "stackfile": "unami/docker-compose.yml" + } + }, + { + "type": 3, + "title": "wallabag", + "name": "wallabag", + "note": "Auto-generated template from repository", + "categories": [ + "Auto" + ], + "platform": "linux", + "logo": "https://i.4lt.ca/cookbooks/default.png", + "description": "Docker Hub: https://hub.docker.com/r/wallabag/wallabag Project: Docker Compose Example: https://github.com/wallabag/docker Proxy Port: 80", + "repository": { + "url": "https://github.com/nickyeoman/docker-compose-cookbooks", + "stackfile": "wallabag/docker-compose.yml" + }, + "env": [ + { + "name": "WALLABAG_TZ", + "label": "WALLABAG_TZ", + "default": "America/Vancouver" + }, + { + "name": "WALLABAG_IMAGE", + "label": "WALLABAG_IMAGE", + "default": "wallabag/wallabag:latest" + }, + { + "name": "WALLABAG_DB_DRIVER", + "label": "WALLABAG_DB_DRIVER", + "default": "pdo_mysql" + }, + { + "name": "WALLABAG_DB_HOST", + "label": "WALLABAG_DB_HOST", + "default": "wallabag-db" + }, + { + "name": "WALLABAG_DB_PORT", + "label": "WALLABAG_DB_PORT", + "default": "3306" + }, + { + "name": "WALLABAG_DB_NAME", + "label": "WALLABAG_DB_NAME", + "default": "wallabag" + }, + { + "name": "WALLABAG_DB_USER", + "label": "WALLABAG_DB_USER", + "default": "wallabag" + }, + { + "name": "WALLABAG_DB_PASS", + "label": "WALLABAG_DB_PASS", + "default": "wallapass" + }, + { + "name": "WALLABAG_DB_CHARSET", + "label": "WALLABAG_DB_CHARSET", + "default": "utf8mb4" + }, + { + "name": "WALLABAG_DB_PREFIX", + "label": "WALLABAG_DB_PREFIX", + "default": "wallabag_" + }, + { + "name": "WALLABAG_MAILER_DSN", + "label": "WALLABAG_MAILER_DSN", + "default": "smtp://127.0.0.1" + }, + { + "name": "WALLABAG_FROM_WEMAIL", + "label": "WALLABAG_FROM_WEMAIL", + "default": "wallabag@example.com" + }, + { + "name": "WALLABAG_DOMAIN", + "label": "WALLABAG_DOMAIN", + "default": "https://your-wallabag-instance.wallabag.org" + }, + { + "name": "WALLABAG_SERVER", + "label": "WALLABAG_SERVER", + "default": "Your wallabag instance" } ] }