{
"version": "3",
"templates": [
{
"id": 1,
"type": 3,
"title": "AFFiNE",
"name": "affine",
"description": "Workspace that mixes docs, whiteboards and databases, so a page can flip between writing and an endless canvas. Edits sync to this server as you type. Source: https://github.com/toeverything/AFFiNE",
"categories": [
"Documents",
"Productivity",
"Wiki"
],
"platform": "linux",
"logo": "https://raw.githubusercontent.com/toeverything/AFFiNE/canary/packages/frontend/apps/electron/resources/icons/icon_stable_512x512.png",
"restart_policy": "unless-stopped",
"env": [
{
"name": "AFFINE_PORT",
"label": "Host port for the web UI",
"default": "3010"
}
],
"note": "Open http://<your-host>:3010 (or whichever port you picked). The first start takes a minute while it sets up the database, then it asks you to create the admin account, and whoever gets there first does, so do it straight away. The workspace it opens is only saved in your browser, so make a new one from the workspace menu (it goes on this server by default) and keep your docs there. In the admin panel at /admin, set the External URL under Settings --> Server to the address people actually use, or invite links point at localhost. New accounts can't invite anyone or make share links for their first 24 hours, which you can change under Settings --> Auth. Sign-ups need email (Settings --> Notification), so until then add people yourself under Accounts. Docs live in Postgres, in the postgres-data volume, uploads in affine-storage, and the server's own key in affine-config. Docs: docs.affine.pro",
"repository": {
"url": "https://github.com/NotAFlightRisk/portainer-templates-extras",
"stackfile": "apps/affine/compose.yml"
}
},
{
"id": 2,
"type": 1,
"title": "Apache Answer",
"name": "apache-answer",
"description": "Question-and-answer site for a community, product forum or team knowledge base, with voting, accepted answers, tags, reputation and badges. Source: https://github.com/apache/answer",
"categories": [
"Social",
"Wiki"
],
"platform": "linux",
"logo": "https://raw.githubusercontent.com/apache/answer-website/main/static/img/head-icon.png",
"image": "apache/answer:latest",
"restart_policy": "unless-stopped",
"ports": [
"9080:80/tcp"
],
"volumes": [
{
"container": "/data"
}
],
"env": [
{
"name": "TZ",
"label": "Timezone",
"description": "Like Europe/London. The site starts on it, and you can change it later in the admin.",
"default": "UTC"
}
],
"note": "Open http://<your-host>:9080 from the address you'll actually use, since the setup wizard saves it as the Site URL that links and uploads are built from. On the database step pick SQLite (it defaults to MySQL, which isn't there) and leave the file as /data/answer.db. The last step creates the admin, and whoever reaches the wizard first gets to, so do it straight away. Sign-ups stay open but need email verification, so new accounts can't post until you set up Admin --> Advanced --> SMTP, or close them under Advanced --> Login. The database, config and uploads all live in the volume. Docs: answer.apache.org/docs"
},
{
"id": 3,
"type": 1,
"title": "BentoPDF",
"name": "bentopdf",
"description": "PDF toolkit that runs in your browser, so files never leave your machine. Merge, split, compress, convert, sign and edit. Source: https://github.com/alam00000/bentopdf",
"categories": [
"Documents",
"Tools"
],
"platform": "linux",
"logo": "https://raw.githubusercontent.com/alam00000/bentopdf/main/public/images/favicon-512x512.png",
"image": "ghcr.io/alam00000/bentopdf-simple:latest",
"restart_policy": "unless-stopped",
"ports": [
"8090:8080/tcp"
],
"note": "Open http://<your-host>:8090. There's no login and nothing to back up, since every PDF is processed in your browser rather than on the server. Converting Word, Excel or PowerPoint files needs it served over HTTPS though (or opened as localhost on the same machine), as browsers block the bit it relies on over plain http. Docs: github.com/alam00000/bentopdf"
},
{
"id": 4,
"type": 1,
"title": "Cloudreve",
"name": "cloudreve",
"description": "Cloud drive for your own files, with share links, WebDAV, previews for documents, photos and video, and offline downloads. Source: https://github.com/cloudreve/cloudreve",
"categories": [
"Cloud",
"File Sharing",
"Storage"
],
"platform": "linux",
"logo": "https://raw.githubusercontent.com/cloudreve/frontend/master/public/static/img/logo512.png",
"image": "cloudreve/cloudreve:v4",
"restart_policy": "unless-stopped",
"ports": [
"5212:5212/tcp"
],
"volumes": [
{
"container": "/cloudreve/data"
}
],
"note": "Open http://<your-host>:5212 and sign up. The first account becomes the admin, and sign-ups stay open after that, so turn them off under Admin panel --> Settings --> User session if it's just you. Open the Admin panel from the address you'll actually use, too. It offers to save that as the Site URL, and until you say yes, download and share links point at localhost. The database, settings and every uploaded file live in the volume. Docs: docs.cloudreve.org"
},
{
"id": 5,
"type": 1,
"title": "ConvertX",
"name": "convertx",
"description": "File converter for over a thousand formats, covering images, documents, audio, video and ebooks. Source: https://github.com/C4illin/ConvertX",
"categories": [
"Tools",
"Documents"
],
"platform": "linux",
"logo": "https://raw.githubusercontent.com/C4illin/ConvertX/main/public/apple-touch-icon.png",
"image": "ghcr.io/c4illin/convertx:latest",
"restart_policy": "unless-stopped",
"ports": [
"3000:3000/tcp"
],
"volumes": [
{
"container": "/app/data"
}
],
"env": [
{
"name": "HTTP_ALLOWED",
"label": "Opening it over plain http?",
"description": "ConvertX only sends its login cookie over HTTPS unless this is on. Switch it off once it's behind a reverse proxy with HTTPS.",
"select": [
{
"text": "Yes, plain http",
"value": "true",
"default": true
},
{
"text": "No, it's behind HTTPS",
"value": "false"
}
]
},
{
"name": "AUTO_DELETE_EVERY_N_HOURS",
"label": "Delete converted files after (hours)",
"default": "24"
},
{
"name": "TZ",
"label": "Timezone",
"description": "Like Europe/London",
"default": "UTC"
}
],
"note": "Open http://<your-host>:3000 and create your account straight away, since the first visitor gets it and sign-ups close after that. Uploads and the database live in the /app/data volume. It's a big image (LibreOffice, TeX and Calibre are all in there), so the first pull takes a while. You'll be logged out whenever the container restarts, unless you add a JWT_SECRET env var holding a long random string (openssl rand -hex 32). Docs: github.com/C4illin/ConvertX"
},
{
"id": 6,
"type": 1,
"title": "CyberChef",
"name": "cyberchef",
"description": "Web app for encoding, decoding, encrypting, compressing and picking apart data, by chaining hundreds of small operations into a recipe. Source: https://github.com/gchq/CyberChef",
"categories": [
"Security",
"Development",
"Tools"
],
"platform": "linux",
"logo": "https://raw.githubusercontent.com/gchq/CyberChef/master/src/web/static/images/logo/cyberchef_512.png",
"image": "ghcr.io/gchq/cyberchef:11",
"restart_policy": "unless-stopped",
"ports": [
"8088:8080/tcp"
],
"note": "Open http://<your-host>:8088. There's no login and nothing to back up, since every recipe runs in your browser and your data never reaches the server. Recipes live in the URL, so bookmark or share that to keep one. Docs: github.com/gchq/CyberChef/wiki"
},
{
"id": 7,
"type": 3,
"title": "Etherpad",
"name": "etherpad",
"description": "Collaborative text editor where everyone types in the same document at once, with history, chat and plugins. This one runs on Postgres. Source: https://github.com/ether/etherpad",
"categories": [
"Documents",
"Productivity"
],
"platform": "linux",
"logo": "https://raw.githubusercontent.com/ether/etherpad/develop/admin/public/brand.svg",
"restart_policy": "unless-stopped",
"env": [
{
"name": "ETHERPAD_ADMIN_PASSWORD",
"label": "Admin password (required)",
"description": "For the admin panel at /admin, where you sign in as admin. Generate one with: openssl rand -hex 32"
},
{
"name": "ETHERPAD_DB_PASSWORD",
"label": "Database password (required)",
"description": "Generate one with: openssl rand -hex 32. Keep it the same when you redeploy, or Etherpad can't reach its database."
},
{
"name": "ETHERPAD_PORT",
"label": "Host port for the web UI",
"default": "9001"
},
{
"name": "ETHERPAD_TRUST_PROXY",
"label": "Behind a reverse proxy?",
"select": [
{
"text": "No",
"value": "false",
"default": true
},
{
"text": "Yes",
"value": "true"
}
]
}
],
"note": "Set both passwords before you deploy (openssl rand -hex 32 makes good ones), since the stack won't start without them. Then open http://<your-host>:9001 (or whichever port you picked) and start a pad. Anyone who can reach it can create and edit pads, so keep it off the open internet or put a login in front of it. The admin panel is at /admin, user admin. Pads are stored in Postgres, in the postgres-data volume. Docs: docs.etherpad.org",
"repository": {
"url": "https://github.com/NotAFlightRisk/portainer-templates-extras",
"stackfile": "apps/etherpad/compose.yml"
}
},
{
"id": 8,
"type": 3,
"title": "Firefly III",
"name": "firefly-iii",
"description": "Personal finance manager for tracking what comes in and goes out, with budgets, subscriptions, recurring transactions, rules and reports. This one runs on Postgres. Source: https://github.com/firefly-iii/firefly-iii",
"categories": [
"Finance"
],
"platform": "linux",
"logo": "https://raw.githubusercontent.com/firefly-iii/firefly-iii/main/public/images/logo.png",
"restart_policy": "unless-stopped",
"env": [
{
"name": "FIREFLY_APP_KEY",
"label": "App key (required)",
"description": "Exactly 32 characters. Generate one with: openssl rand -hex 16. Keep it the same when you redeploy, or everyone's logged out and API tokens stop working."
},
{
"name": "FIREFLY_CRON_TOKEN",
"label": "Cron token (required)",
"description": "Exactly 32 characters, and not the same as the app key. Generate one with: openssl rand -hex 16."
},
{
"name": "FIREFLY_DB_PASSWORD",
"label": "Database password (required)",
"description": "Generate one with: openssl rand -hex 32. Keep it the same when you redeploy, or Firefly III can't reach its database."
},
{
"name": "FIREFLY_PORT",
"label": "Host port for the web UI",
"default": "8092"
},
{
"name": "FIREFLY_TZ",
"label": "Timezone",
"description": "Like Europe/London. Transaction dates and the nightly cron use it.",
"default": "UTC"
},
{
"name": "FIREFLY_TRUSTED_PROXIES",
"label": "Trusted proxies",
"description": "Leave blank, unless it's behind a reverse proxy. Then set ** so Firefly III trusts the proxy's headers."
}
],
"note": "Fill in all three secrets before you deploy, since the stack won't start without them. The app key and cron token must be exactly 32 characters (openssl rand -hex 16 makes one), and keep all three the same when you redeploy. Then open http://<your-host>:8092 (or whichever port you picked) and register. The first account becomes the admin and sign-ups close after it, so do it straight away. A small cron container pings Firefly III at 03:00 every night, which is what creates recurring transactions and fires subscription reminders. Transactions live in Postgres, in the postgres-data volume, and attachments in firefly-upload. Docs: docs.firefly-iii.org",
"repository": {
"url": "https://github.com/NotAFlightRisk/portainer-templates-extras",
"stackfile": "apps/firefly-iii/compose.yml"
}
},
{
"id": 9,
"type": 3,
"title": "Grist",
"name": "grist",
"description": "Spreadsheet that works like a database, with typed columns, Python formulas, linked tables, charts and forms. Source: https://github.com/gristlabs/grist-core",
"categories": [
"Database",
"Productivity"
],
"platform": "linux",
"logo": "https://raw.githubusercontent.com/gristlabs/grist-core/main/static/icons/grist.png",
"restart_policy": "unless-stopped",
"env": [
{
"name": "GRIST_SESSION_SECRET",
"label": "Session secret (required)",
"description": "Signs everyone's login cookies. Generate one with: openssl rand -hex 32"
},
{
"name": "GRIST_PORT",
"label": "Host port for the web UI",
"default": "8484"
}
],
"note": "Set the session secret before you deploy, since the stack won't start without one. Then open http://<your-host>:8484 (or whichever port you picked). It asks for a boot key first, which Grist prints in the container's logs every time it starts (look for BOOT KEY), then an admin email, then walks you through Quick setup. Take care on its sign-in step: No authentication means anyone who can reach the port can open and edit everything, so only pick it on a private network. Sign in with getgrist.com and forwarded headers (for Authelia and the like) are the free options, and OIDC needs an activation key. The last step has product telemetry switched on, so untick it there if you'd rather it didn't. Documents, users and settings all live in the grist-data volume. Docs: support.getgrist.com/self-managed",
"repository": {
"url": "https://github.com/NotAFlightRisk/portainer-templates-extras",
"stackfile": "apps/grist/compose.yml"
}
},
{
"id": 10,
"type": 3,
"title": "Halo",
"name": "halo",
"description": "Website and blogging platform with a rich editor, themes, plugins, comments and pages, run from a web console. This one runs on Postgres. Source: https://github.com/halo-dev/halo",
"categories": [
"CMS",
"Web"
],
"platform": "linux",
"logo": "https://raw.githubusercontent.com/halo-dev/halo/main/ui/src/assets/logo.png",
"restart_policy": "unless-stopped",
"env": [
{
"name": "HALO_DB_PASSWORD",
"label": "Database password (required)",
"description": "Generate one with: openssl rand -hex 32. Keep it the same when you redeploy, or Halo can't reach its database."
},
{
"name": "HALO_PORT",
"label": "Host port for the web UI",
"default": "8091"
},
{
"name": "HALO_TZ",
"label": "Timezone",
"description": "Like Europe/London. Post dates on the site use it.",
"default": "UTC"
}
],
"note": "Set the database password before you deploy (openssl rand -hex 32 makes a good one), since the stack won't start without it. Then open http://<your-host>:8091 (or whichever port you picked) from the address you'll actually use, since the setup page saves it as the site's External URL. That page also creates the admin, and whoever reaches it first gets to, so do it straight away. The console is at /console. The sample post, About page, menu and category it starts with are in Chinese whatever language you pick, so rename or delete them there. Posts and settings live in Postgres, in the postgres-data volume, and uploads, themes and plugins in halo-data. Docs (in Chinese): docs.halo.run",
"repository": {
"url": "https://github.com/NotAFlightRisk/portainer-templates-extras",
"stackfile": "apps/halo/compose.yml"
}
},
{
"id": 11,
"type": 1,
"title": "RSSHub",
"name": "rsshub",
"description": "RSS feed maker for thousands of sites that don't have a feed of their own, like GitHub issues, news sites, forums and shops. Source: https://github.com/DIYgod/RSSHub",
"categories": [
"Web",
"Tools"
],
"platform": "linux",
"logo": "https://raw.githubusercontent.com/DIYgod/RSSHub/master/public/logo.png",
"image": "diygod/rsshub:latest",
"restart_policy": "unless-stopped",
"ports": [
"1200:1200/tcp"
],
"env": [
{
"name": "ACCESS_KEY",
"label": "Access key",
"description": "Optional. Set one and every feed url needs it, like /hackernews?key=yourkey. Leave blank and anyone who can reach it can use it."
}
],
"note": "Open http://<your-host>:1200 to check it's up, then add feeds to your reader as paths on it, like /github/issue/DIYgod/RSSHub. Every route is listed in the docs. There's no login, so set an access key if it faces the internet. Nothing to back up, feeds are cached in memory. Some routes need a browser, and for those swap the image tag to chromium-bundled."
},
{
"id": 12,
"type": 1,
"title": "Seerr",
"name": "seerr",
"description": "Request manager for Jellyfin, Plex and Emby, where people ask for films and shows and Sonarr and Radarr fetch them. It's the merged successor to Overseerr and Jellyseerr. Source: https://github.com/seerr-team/seerr",
"categories": [
"Media"
],
"platform": "linux",
"logo": "https://raw.githubusercontent.com/seerr-team/seerr/develop/public/android-chrome-512x512.png",
"image": "ghcr.io/seerr-team/seerr:v3",
"restart_policy": "unless-stopped",
"ports": [
"5055:5055/tcp"
],
"volumes": [
{
"container": "/app/config"
}
],
"env": [
{
"name": "TZ",
"label": "Timezone",
"description": "Like Europe/London",
"default": "UTC"
}
],
"note": "Open http://<your-host>:5055 and the setup wizard walks you through connecting your media server, then Sonarr and Radarr. Settings and the request database live in the /app/config volume. Coming from Overseerr or Jellyseerr? Seerr can take over their config, see the docs for how."
},
{
"id": 13,
"type": 3,
"title": "SiYuan",
"name": "siyuan",
"description": "Note-taking app built from blocks, so any paragraph can be linked, embedded or queried from anywhere else. Markdown, backlinks, a graph view and daily notes. Source: https://github.com/siyuan-note/siyuan",
"categories": [
"Documents",
"Productivity",
"Wiki"
],
"platform": "linux",
"logo": "https://raw.githubusercontent.com/siyuan-note/siyuan/master/app/src/assets/icon-mac.png",
"restart_policy": "unless-stopped",
"env": [
{
"name": "SIYUAN_ACCESS_AUTH_CODE",
"label": "Access code (required)",
"description": "What you type in to open your notes, and the only thing between them and anyone who can reach the port. Make it long, or generate one with: openssl rand -hex 16"
},
{
"name": "SIYUAN_PORT",
"label": "Host port for the web UI",
"default": "6806"
},
{
"name": "SIYUAN_TZ",
"label": "Timezone",
"description": "Like Europe/London. Daily notes and timestamps use it.",
"default": "UTC"
}
],
"note": "Set the access code before you deploy, since the stack won't start without one. Then open http://<your-host>:6806 (or whichever port you picked) and enter it. It takes half a minute or so to start. Every note, asset and setting lives in the siyuan-workspace volume. To change the code later, just change it here and redeploy. Docs: github.com/siyuan-note/siyuan",
"repository": {
"url": "https://github.com/NotAFlightRisk/portainer-templates-extras",
"stackfile": "apps/siyuan/compose.yml"
}
},
{
"id": 14,
"type": 1,
"title": "Super Productivity",
"name": "super-productivity",
"description": "To-do list with timeboxing and time tracking built in, and it can pull in issues from Jira, GitHub and GitLab. Source: https://github.com/super-productivity/super-productivity",
"categories": [
"Productivity",
"Project Management"
],
"platform": "linux",
"logo": "https://raw.githubusercontent.com/super-productivity/super-productivity/master/src/assets/icons/icon-512x512.png",
"image": "johannesjo/super-productivity:latest",
"restart_policy": "unless-stopped",
"ports": [
"8095:80/tcp"
],
"note": "Open http://<your-host>:8095. There's no login, and your tasks are saved in your browser rather than on the server, so set up sync (WebDAV, Dropbox and others) in its settings if you use more than one device. Docs: github.com/super-productivity/super-productivity"
},
{
"id": 15,
"type": 1,
"title": "Termix",
"name": "termix",
"description": "SSH terminal and server manager in the browser, with saved hosts, tunnels and a file editor. Source: https://github.com/Termix-SSH/Termix",
"categories": [
"Tools",
"Networking"
],
"platform": "linux",
"logo": "https://raw.githubusercontent.com/Termix-SSH/Termix/main/public/icon.svg",
"image": "ghcr.io/lukegus/termix:latest",
"restart_policy": "unless-stopped",
"ports": [
"8080:8080/tcp"
],
"volumes": [
{
"container": "/app/data"
}
],
"note": "Open http://<your-host>:8080 and create an account, which becomes the admin. Registration stays open after that, so switch it off in the admin settings unless you want other people signing up. Hosts, keys and the database live in the /app/data volume, and its secrets are generated there on first start. Behind a reverse proxy it needs websockets. It sends a small anonymous usage report once a day, which you can switch off in Admin Settings > Usage Statistics. Docs: docs.termix.site"
},
{
"id": 16,
"type": 1,
"title": "Wallos",
"name": "wallos",
"description": "Subscription tracker for keeping an eye on recurring bills, with stats, multiple currencies and reminders before things renew. Source: https://github.com/ellite/wallos",
"categories": [
"Finance"
],
"platform": "linux",
"logo": "https://raw.githubusercontent.com/ellite/wallos/main/images/icon/android-chrome-512x512.png",
"image": "bellamy/wallos:latest",
"restart_policy": "unless-stopped",
"ports": [
"8282:80/tcp"
],
"volumes": [
{
"container": "/var/www/html/db"
},
{
"container": "/var/www/html/images/uploads/logos"
}
],
"env": [
{
"name": "TZ",
"label": "Timezone",
"description": "Like Europe/London. Used for renewal dates and reminders.",
"default": "UTC"
}
],
"note": "Open http://<your-host>:8282 and register. The first account becomes the admin, and sign-ups are closed after that. The database and any logos you upload live in the two volumes. Docs: github.com/ellite/wallos"
}
]
}