├── .devcontainer
└── devcontainer.json
├── .github
├── CODE_OF_CONDUCT.md
├── README.md
├── dependabot.yml
└── workflows
│ ├── build-template.yml
│ ├── publish-docker.yml
│ └── sync-mirror.yml
├── Dockerfile
├── LICENSE
├── Makefile
├── Schema.json
├── index.html
├── lib
├── combine.py
├── download.py
├── list.py
├── requirements.txt
└── validate.py
├── sources.csv
├── sources
├── .gitignore
├── .gitkeep
├── example_templates.json
├── lissy93_templates.json
└── stacks
│ ├── cryptpad.yml
│ ├── databag.yml
│ ├── outline.yml
│ ├── terraria-server.yml
│ ├── traefik.yml
│ ├── valheim-server-docker.yml
│ └── ztnet
│ └── docker-compose.yml
├── templates.json
└── templates_v3.json
/.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/python
3 | {
4 | "name": "Python 3",
5 | // Or use a Dockerfile or Docker Compose file. More info: https://containers.dev/guide/dockerfile
6 | "image": "mcr.microsoft.com/devcontainers/python:1-3.12-bullseye",
7 |
8 | "customizations": {
9 | "vscode": {
10 | "extensions": [
11 | "ms-python.vscode-pylance",
12 | "ms-azuretools.vscode-docker",
13 | "ms-python.autopep8"
14 | ]
15 | }
16 | },
17 |
18 | // Features to add to the dev container. More info: https://containers.dev/features.
19 | "features": {
20 | "ghcr.io/devcontainers/features/node:1": {
21 | "version": "latest"
22 | }
23 | }
24 |
25 | // Use 'forwardPorts' to make a list of ports inside the container available locally.
26 | // "forwardPorts": [],
27 |
28 | // Use 'postCreateCommand' to run commands after the container is created.
29 | // "postCreateCommand": "pip3 install --user -r requirements.txt",
30 |
31 | // Configure tool-specific properties.
32 | // "customizations": {},
33 |
34 | // Uncomment to connect as root instead. More info: https://aka.ms/dev-containers-non-root.
35 | // "remoteUser": "root"
36 | }
37 |
--------------------------------------------------------------------------------
/.github/CODE_OF_CONDUCT.md:
--------------------------------------------------------------------------------
1 | # Contributor Covenant Code of Conduct
2 |
3 | ## Our Pledge
4 |
5 | We as members, contributors, and leaders pledge to make participation in our
6 | community a harassment-free experience for everyone, regardless of age, body
7 | size, visible or invisible disability, ethnicity, sex characteristics, gender
8 | identity and expression, level of experience, education, socio-economic status,
9 | nationality, personal appearance, race, religion, or sexual identity
10 | and orientation.
11 |
12 | We pledge to act and interact in ways that contribute to an open, welcoming,
13 | diverse, inclusive, and healthy community.
14 |
15 | ## Our Standards
16 |
17 | Examples of behavior that contributes to a positive environment for our
18 | community include:
19 |
20 | * Demonstrating empathy and kindness toward other people
21 | * Being respectful of differing opinions, viewpoints, and experiences
22 | * Giving and gracefully accepting constructive feedback
23 | * Accepting responsibility and apologizing to those affected by our mistakes,
24 | and learning from the experience
25 | * Focusing on what is best not just for us as individuals, but for the
26 | overall community
27 |
28 | Examples of unacceptable behavior include:
29 |
30 | * The use of sexualized language or imagery, and sexual attention or
31 | advances of any kind
32 | * Trolling, insulting or derogatory comments, and personal or political attacks
33 | * Public or private harassment
34 | * Publishing others' private information, such as a physical or email
35 | address, without their explicit permission
36 | * Other conduct which could reasonably be considered inappropriate in a
37 | professional setting
38 |
39 | ## Enforcement Responsibilities
40 |
41 | Community leaders are responsible for clarifying and enforcing our standards of
42 | acceptable behavior and will take appropriate and fair corrective action in
43 | response to any behavior that they deem inappropriate, threatening, offensive,
44 | or harmful.
45 |
46 | Community leaders have the right and responsibility to remove, edit, or reject
47 | comments, commits, code, wiki edits, issues, and other contributions that are
48 | not aligned to this Code of Conduct, and will communicate reasons for moderation
49 | decisions when appropriate.
50 |
51 | ## Scope
52 |
53 | This Code of Conduct applies within all community spaces, and also applies when
54 | an individual is officially representing the community in public spaces.
55 | Examples of representing our community include using an official e-mail address,
56 | posting via an official social media account, or acting as an appointed
57 | representative at an online or offline event.
58 |
59 | ## Enforcement
60 |
61 | Instances of abusive, harassing, or otherwise unacceptable behavior may be
62 | reported to the community leaders responsible for enforcement at
63 | alicia@omg.lol.
64 | All complaints will be reviewed and investigated promptly and fairly.
65 |
66 | All community leaders are obligated to respect the privacy and security of the
67 | reporter of any incident.
68 |
69 | ## Enforcement Guidelines
70 |
71 | Community leaders will follow these Community Impact Guidelines in determining
72 | the consequences for any action they deem in violation of this Code of Conduct:
73 |
74 | ### 1. Correction
75 |
76 | **Community Impact**: Use of inappropriate language or other behavior deemed
77 | unprofessional or unwelcome in the community.
78 |
79 | **Consequence**: A private, written warning from community leaders, providing
80 | clarity around the nature of the violation and an explanation of why the
81 | behavior was inappropriate. A public apology may be requested.
82 |
83 | ### 2. Warning
84 |
85 | **Community Impact**: A violation through a single incident or series
86 | of actions.
87 |
88 | **Consequence**: A warning with consequences for continued behavior. No
89 | interaction with the people involved, including unsolicited interaction with
90 | those enforcing the Code of Conduct, for a specified period of time. This
91 | includes avoiding interactions in community spaces as well as external channels
92 | like social media. Violating these terms may lead to a temporary or
93 | permanent ban.
94 |
95 | ### 3. Temporary Ban
96 |
97 | **Community Impact**: A serious violation of community standards, including
98 | sustained inappropriate behavior.
99 |
100 | **Consequence**: A temporary ban from any sort of interaction or public
101 | communication with the community for a specified period of time. No public or
102 | private interaction with the people involved, including unsolicited interaction
103 | with those enforcing the Code of Conduct, is allowed during this period.
104 | Violating these terms may lead to a permanent ban.
105 |
106 | ### 4. Permanent Ban
107 |
108 | **Community Impact**: Demonstrating a pattern of violation of community
109 | standards, including sustained inappropriate behavior, harassment of an
110 | individual, or aggression toward or disparagement of classes of individuals.
111 |
112 | **Consequence**: A permanent ban from any sort of public interaction within
113 | the community.
114 |
115 | ## Attribution
116 |
117 | This Code of Conduct is adapted from the [Contributor Covenant][homepage],
118 | version 2.0, available at
119 | https://www.contributor-covenant.org/version/2/0/code_of_conduct.html.
120 |
121 | Community Impact Guidelines were inspired by [Mozilla's code of conduct
122 | enforcement ladder](https://github.com/mozilla/diversity).
123 |
124 | [homepage]: https://www.contributor-covenant.org
125 |
126 | For answers to common questions about this code of conduct, see the FAQ at
127 | https://www.contributor-covenant.org/faq. Translations are available at
128 | https://www.contributor-covenant.org/translations.
129 |
--------------------------------------------------------------------------------
/.github/dependabot.yml:
--------------------------------------------------------------------------------
1 | # To get started with Dependabot version updates, you'll need to specify which
2 | # package ecosystems to update and where the package manifests are located.
3 | # Please see the documentation for more information:
4 | # https://docs.github.com/github/administering-a-repository/configuration-options-for-dependency-updates
5 | # https://containers.dev/guide/dependabot
6 |
7 | version: 2
8 | updates:
9 | - package-ecosystem: "devcontainers"
10 | directory: "/"
11 | schedule:
12 | interval: weekly
13 |
--------------------------------------------------------------------------------
/.github/workflows/build-template.yml:
--------------------------------------------------------------------------------
1 | name: 🏗️ Build + Publish templates.json file
2 | on:
3 | workflow_dispatch:
4 | push:
5 | branches: [ main ]
6 | schedule:
7 | - cron: '0 2 * * 0' # At 02:00 on Sunday
8 | jobs:
9 | build:
10 | runs-on: ubuntu-latest
11 | steps:
12 | # Checkout repo
13 | - name: Checkout repository 🛎️
14 | uses: actions/checkout@v2
15 |
16 | # Get current date-time (used for commit message)
17 | - name: Get Date 📅
18 | id: date
19 | run: echo "::set-output name=date::$(date +'%d-%b-%Y')"
20 |
21 | # Downloads + installs Python (used for running gen scripts)
22 | - name: Set up Python 🐍
23 | uses: actions/setup-python@v2
24 | with:
25 | python-version: '3.x'
26 |
27 | # Install contents of requirements.txt
28 | - name: Install dependencies 📥
29 | run: |
30 | python -m pip install --upgrade pip
31 | cd lib && pip install -r requirements.txt
32 |
33 | # The make command triggers all the Python scripts, generates output
34 | - name: Run make command 🔨
35 | run: make
36 |
37 | # Commit and push the outputed JSON files
38 | - name: Commit and push generated files ⤴️
39 | run: |
40 | git config --global user.name "Liss-Bot"
41 | git config --global user.email "alicia-gh-bot@mail.as93.net"
42 | git add templates.json
43 | if git diff --staged --quiet; then
44 | echo "Nothin new added, so nothing to commit, exiting..."
45 | else
46 | git commit -m "Updates templates (auto-generated, on ${{ steps.date.outputs.date }})"
47 | git push
48 | fi
49 | git add .github/README.md
50 | if git diff --staged --quiet; then
51 | echo "No need to update README, skipping..."
52 | else
53 | git commit -m "Updates template + source list in docs (auto-generated, on ${{ steps.date.outputs.date }})"
54 | git push
55 | fi
56 |
--------------------------------------------------------------------------------
/.github/workflows/publish-docker.yml:
--------------------------------------------------------------------------------
1 | # Scans, builds and releases a multi-architecture docker image
2 | name: 🐳 Build + Publish Multi-Platform Image
3 |
4 | on:
5 | workflow_dispatch:
6 | push:
7 | branches: ['main']
8 | tags: ['v[0-9].[0-9]+.[0-9]+']
9 | paths:
10 | - 'templates.json'
11 | - 'Dockerfile'
12 |
13 | env:
14 | DH_IMAGE: ${{ secrets.DOCKER_REPO || github.event.repository.name }}
15 | GH_IMAGE: ${{ github.repository_owner }}/${{ github.event.repository.name }}
16 |
17 | jobs:
18 | docker:
19 | runs-on: ubuntu-latest
20 | permissions: { contents: read, packages: write }
21 | if: "!contains(github.event.head_commit.message, '[ci-skip]')"
22 |
23 | steps:
24 | - name: 🛎️ Checkout Repo
25 | uses: actions/checkout@v2
26 |
27 | # - name: ✨ Validate Dockerfile
28 | # uses: ghe-actions/dockerfile-validator@v1
29 | # with:
30 | # dockerfile: 'Dockerfile'
31 | # lint: 'hadolint'
32 |
33 | - name: 🗂️ Make Docker Meta
34 | id: meta
35 | uses: docker/metadata-action@v3
36 | with:
37 | images: |
38 | ${{ env.DH_IMAGE }}
39 | ghcr.io/${{ env.GH_IMAGE }}
40 | # tags: |
41 | # type=ref,event=tag,suffix={{tag}}
42 | # type=ref,event=branch,branch=main,name=latest
43 | labels: |
44 | maintainer=Lissy93
45 | org.opencontainers.image.title=Portainer-Templates
46 | org.opencontainers.image.description=An offline collection of 500 Portainer app and stack templates
47 | org.opencontainers.image.documentation=https://github.com/lissy93/portainer-templates
48 | org.opencontainers.image.authors=Alicia Sykes
49 | org.opencontainers.image.licenses=MIT
50 |
51 | - name: 🔧 Set up QEMU
52 | uses: docker/setup-qemu-action@v1
53 |
54 | - name: 🔧 Set up Docker Buildx
55 | uses: docker/setup-buildx-action@v1
56 |
57 | - name: 🔑 Login to DockerHub
58 | uses: docker/login-action@v1
59 | with:
60 | username: ${{ secrets.DOCKER_USER }}
61 | password: ${{ secrets.DOCKER_TOKEN }}
62 |
63 | - name: 🔑 Login to GitHub Container Registry
64 | uses: docker/login-action@v1
65 | with:
66 | registry: ghcr.io
67 | username: ${{ github.repository_owner }}
68 | password: ${{ secrets.GITHUB_TOKEN }}
69 |
70 | - name: 🚦 Check Registry Status
71 | uses: crazy-max/ghaction-docker-status@v1
72 |
73 | - name: ⚒️ Build and push
74 | uses: docker/build-push-action@v4
75 | with:
76 | context: .
77 | file: ./Dockerfile
78 | platforms: linux/amd64,linux/arm64,linux/arm/v7
79 | tags: ${{ steps.meta.outputs.tags }}
80 | labels: ${{ steps.meta.outputs.labels }}
81 | push: true
82 | # - name: 💬 Set Docker Hub Description
83 | # uses: peter-evans/dockerhub-description@v2
84 | # with:
85 | # repository: lissy93/devolio
86 | # readme-filepath: ./README.md
87 | # short-description: Devolio - A developer portfolio site for the rest of us
88 | # username: ${{ secrets.DOCKER_USERNAME }}
89 | # password: ${{ secrets.DOCKER_USER_PASS }}
90 |
--------------------------------------------------------------------------------
/.github/workflows/sync-mirror.yml:
--------------------------------------------------------------------------------
1 | # Pushes the contents of the repo to the Codeberg mirror
2 | name: 🪞 Mirror to Codeberg
3 | on:
4 | workflow_dispatch:
5 | schedule:
6 | - cron: '30 2 * * 0' # At 02:30 on Sunday
7 | jobs:
8 | codeberg:
9 | runs-on: ubuntu-latest
10 | steps:
11 | - uses: actions/checkout@v2
12 | with: { fetch-depth: 0 }
13 | - uses: pixta-dev/repository-mirroring-action@v1
14 | with:
15 | target_repo_url: git@codeberg.org:alicia/portainer-templates.git
16 | ssh_private_key: ${{ secrets.CODEBERG_SSH }}
17 |
--------------------------------------------------------------------------------
/Dockerfile:
--------------------------------------------------------------------------------
1 | FROM nginx:stable-alpine
2 |
3 | COPY templates.json /usr/share/nginx/html/templates.json
4 | COPY index.html /usr/share/nginx/html/index.html
5 |
6 | EXPOSE 80
7 |
--------------------------------------------------------------------------------
/LICENSE:
--------------------------------------------------------------------------------
1 | MIT License
2 |
3 | Copyright (c) 2023 Alicia Sykes
4 |
5 | Permission is hereby granted, free of charge, to any person obtaining a copy
6 | of this software and associated documentation files (the "Software"), to deal
7 | in the Software without restriction, including without limitation the rights
8 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9 | copies of the Software, and to permit persons to whom the Software is
10 | furnished to do so, subject to the following conditions:
11 |
12 | The above copyright notice and this permission notice shall be included in all
13 | copies or substantial portions of the Software.
14 |
15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21 | SOFTWARE.
22 |
--------------------------------------------------------------------------------
/Makefile:
--------------------------------------------------------------------------------
1 | .PHONY: all install_requirements download combine
2 |
3 | PYTHON := $(shell which python3 2>/dev/null || which python)
4 |
5 | all: install_requirements download combine list
6 |
7 | install_requirements:
8 | $(PYTHON) -m pip install -r lib/requirements.txt
9 |
10 | download:
11 | $(PYTHON) lib/download.py
12 |
13 | combine:
14 | $(PYTHON) lib/combine.py
15 |
16 | validate:
17 | $(PYTHON) lib/validate.py
18 |
19 | list:
20 | $(PYTHON) lib/list.py
21 |
--------------------------------------------------------------------------------
/Schema.json:
--------------------------------------------------------------------------------
1 | {
2 | "$schema": "http://json-schema.org/draft-07/schema#",
3 | "type": "object",
4 | "title": "PortainerAppTemplate",
5 | "properties": {
6 | "version": {
7 | "type": "string",
8 | "minLength": 1,
9 | "description": "The version of the Portainer App Template."
10 | },
11 | "templates": {
12 | "type": "array",
13 | "items": {
14 | "type": "object",
15 | "properties": {
16 | "type": {
17 | "type": "integer",
18 | "minimum": 1,
19 | "maximum": 2,
20 | "description": "The type of the application (1 for container, 2 for swarm stack)."
21 | },
22 | "title": {
23 | "type": "string",
24 | "minLength": 1,
25 | "description": "The title of the application."
26 | },
27 | "description": {
28 | "type": "string",
29 | "minLength": 1,
30 | "description": "A brief description of the application."
31 | },
32 | "categories": {
33 | "type": "array",
34 | "items": {
35 | "type": "string",
36 | "minLength": 1
37 | },
38 | "description": "An array of categories the application belongs to."
39 | },
40 | "platform": {
41 | "type": "string",
42 | "minLength": 1,
43 | "description": "The target platform of the application (e.g., 'linux', 'windows')."
44 | },
45 | "logo": {
46 | "type": "string",
47 | "format": "uri",
48 | "description": "A URI to the logo of the application."
49 | },
50 | "image": {
51 | "type": "string",
52 | "minLength": 1,
53 | "description": "The name of the Docker image used for the application."
54 | },
55 | "restart_policy": {
56 | "type": "string",
57 | "enum": ["always", "unless-stopped", "on-failure", "no"],
58 | "description": "The restart policy for the application."
59 | },
60 | "ports": {
61 | "type": "array",
62 | "items": {
63 | "type": "string",
64 | "pattern": "^[0-9]+:[0-9]+(/tcp|/udp)?$",
65 | "description": "A port mapping in the format 'hostPort:containerPort/protocol'."
66 | },
67 | "description": "An array of port mappings for the application."
68 | },
69 | "volumes": {
70 | "type": "array",
71 | "items": {
72 | "type": "object",
73 | "properties": {
74 | "bind": {
75 | "type": "string",
76 | "minLength": 1,
77 | "description": "The host path for the volume binding."
78 | },
79 | "container": {
80 | "type": "string",
81 | "minLength": 1,
82 | "description": "The container path for the volume binding."
83 | }
84 | },
85 | "required": ["bind", "container"]
86 | },
87 | "description": "An array of volume mappings for the application."
88 | },
89 | "environment": {
90 | "type": "array",
91 | "items": {
92 | "type": "object",
93 | "properties": {
94 | "name": {
95 | "type": "string",
96 | "minLength": 1,
97 | "description": "The name of the environment variable."
98 | },
99 | "label": {
100 | "type": "string"
101 | }
102 | }
103 | }
104 | }
105 | },
106 | "required": ["type", "title", "description", "categories", "platform", "logo", "image"]
107 | }
108 | }
109 | },
110 | "required": ["version", "templates"]
111 | }
112 |
113 |
--------------------------------------------------------------------------------
/index.html:
--------------------------------------------------------------------------------
1 |
2 |
3 | Portainer Templates
4 |
5 |
6 |
7 |
8 |
Portainer Templates
9 |
Your template server is up and running! 🎉
10 |
11 | Within your Portainer instance, you can add this URL as the template source:
12 | templates.json
13 |