diff --git a/_docs/container-requests.md b/_docs/container-requests.md index e336002..8a27c74 100644 --- a/_docs/container-requests.md +++ b/_docs/container-requests.md @@ -4,62 +4,10 @@ These are containers that have been requested to add to the repo. This used to ## The List -1. [Tdarr](https://home.tdarr.io/) — Media transcoding and automation tool (part of the rr stack for managing media libraries and torrent workflows). - -2. [Invoice Ninja](https://invoiceninja.com/) — Invoicing, payments, and client management for freelancers and small businesses. - -3. [Duplicati](https://www.duplicati.com/) — Encrypted backup software for securely storing backups to cloud or local destinations. - -5. [Portus (openSUSE)](https://hub.docker.com/r/opensuse/portus/) — Web UI and authorization service for Docker registries. - -6. [Silverpeas](https://hub.docker.com/_/silverpeas) — Enterprise collaboration platform (intranet, document sharing, communication tools). - -7. [Grocy](https://github.com/grocy/grocy-docker/blob/main/docker-compose.yml) — Self-hosted grocery, household inventory, and meal planning system. - -8. [Dashy](https://dashy.to/) — Customizable self-hosted dashboard for organizing apps, services, and links. - -9. [Traefik](https://traefik.io/) — Modern reverse proxy and load balancer designed for microservices and Docker environments. - -10. [Etherpad](https://hub.docker.com/r/etherpad/etherpad) — Real-time collaborative text editor (like a shared notepad). - -11. [Maybe Finance](https://maybefinance.com/) — Personal finance and budgeting tool with a focus on privacy and simplicity. - -12. [DumbBudget](https://github.com/DumbWareio/DumbBudget) — Simple self-hosted budgeting tool for tracking expenses and income. - -13. [Fider](https://fider.io/) — Feedback collection platform for product ideas, suggestions, and user voting. - -14. [Exportify](https://github.com/watsonbox/exportify) — Tool to export Spotify playlists to CSV format. - -15. [Obsidian](https://obsidian.md/) — Powerful local-first note-taking and knowledge management app. - -16. [Twenty CRM](https://twenty.com/) — Modern open-source CRM system for managing customers and pipelines. - -17. [Outline](https://www.getoutline.com/) — Team knowledge base and documentation wiki. - -18. [Mail Archiver](https://github.com/s1t5/mail-archiver) — Self-hosted email archiving and storage tool. - -19. [ITFlow](https://itflow.org/) — IT documentation and asset management platform. - -20. [Chatwoot](https://www.chatwoot.com/) — Open-source customer support and live chat platform. - -21. [Notifuse](https://www.notifuse.com/) — Newsletter and email campaign management tool. - -22. [ComfyUI](https://www.comfy.org/) — Node-based interface for AI image generation workflows. - -23. [Picard (Docker)](https://hub.docker.com/r/mikenye/picard) — MusicBrainz-powered music file tagging and organization tool. - -24. [VoidAuth](https://voidauth.app/) — Lightweight authentication system (Auth0-style alternative). - -25. [Tinyauth](https://tinyauth.app/) — Minimal authentication proxy for securing apps behind login. - -26. [Tugtainer](https://github.com/Quenary/tugtainer) — GUI alternative to Watchtower for managing Docker container updates. - -27. [Sencho](https://sencho.io/) — Lightweight self-hosted service platform. - -28. https://www.authelia.com/ - replacement for authentik - -29. Harbor - self hosted images - +(empty — all previous requests have been added as stacks or moved to the section below) ## Apps That Will Not be in the Repo +1. [Harbor](https://goharbor.io/) — Self-hosted container image registry. Harbor's compose file is generated by its own installer from harbor.yml (~10 tightly coupled services); a static compose file in this repo would drift immediately. Use the official installer. + +2. [Exportify](https://github.com/watsonbox/exportify) — Spotify playlist CSV exporter. No published container image (Dockerfile only), and the hosted version at https://exportify.app/ runs entirely in the browser with no server-side data storage. diff --git a/authelia_dev/README.md b/authelia_dev/README.md new file mode 100644 index 0000000..6122878 --- /dev/null +++ b/authelia_dev/README.md @@ -0,0 +1,57 @@ +# Authelia + +## Overview + +Single sign-on and 2FA portal for protecting apps behind a reverse proxy (lighter replacement for Authentik). + +## Project Details + +- **Project Repository:** [GitHub](https://github.com/authelia/authelia) +- **Container Image:** [authelia/authelia](https://hub.docker.com/r/authelia/authelia) +- **Documentation:** [authelia.com](https://www.authelia.com/) +- **Reverse Proxy Port:** `9091` + +## Getting Started + +1. Start the container: `docker compose up -d` +2. Open http://localhost:9091 in your browser +3. Follow the initial setup wizard to configure the application + +## Environment Variable Notes + + Configuration is file-based; env vars can override any setting using the AUTHELIA_ prefix + +## Volume Notes + + /config – configuration.yml, users_database.yml, and the local SQLite storage + +## Network Notes + +Requires proxy network + +## Docker Run + +```bash +docker run -d \ + --name authelia \ + -p 9091:9091 \ + -e TZ=America/Vancouver \ + -v /data/authelia/config:/config \ + authelia/authelia:latest +``` + +## Additional Notes / Gotchas + +Authelia will not start without a valid `configuration.yml` in the config volume — generate one from the docs first (session secret, storage encryption key, and a users_database.yml are the minimum). +Works as forward-auth with Nginx Proxy Manager. + +## Dockhand Stack, Deploy from Git + +Cookbooks Repository +stackname: authelia_dev +Compose file path: authelia_dev/compose.yaml +Additional env file (optional): authelia_dev/sample.env + +Then "Load" authelia_dev/sample.env into the Environmental variables in dockhand + +Create the Stack diff --git a/authelia_dev/compose.yaml b/authelia_dev/compose.yaml new file mode 100644 index 0000000..52104a8 --- /dev/null +++ b/authelia_dev/compose.yaml @@ -0,0 +1,16 @@ +services: + authelia: + image: ${AUTHELIA_IMAGE:-authelia/authelia:latest} + restart: ${AUTHELIA_RESTART:-unless-stopped} + volumes: + - ${VOL_PATH:-/data}/authelia/config:/config + environment: + - TZ=${TZ:-America/Vancouver} + ports: + - ${AUTHELIA_PORT:-9091}:9091 + networks: + - proxy + +networks: + proxy: + external: true diff --git a/authelia_dev/sample.env b/authelia_dev/sample.env new file mode 100644 index 0000000..c3e65e1 --- /dev/null +++ b/authelia_dev/sample.env @@ -0,0 +1,6 @@ +# Authelia +VOL_PATH=/data +TZ=America/Vancouver +AUTHELIA_IMAGE=authelia/authelia:latest +AUTHELIA_RESTART=unless-stopped +AUTHELIA_PORT=9091 diff --git a/chatwoot_dev/README.md b/chatwoot_dev/README.md new file mode 100644 index 0000000..93d470b --- /dev/null +++ b/chatwoot_dev/README.md @@ -0,0 +1,62 @@ +# Chatwoot + +## Overview + +Open-source customer support and live chat platform. + +## Project Details + +- **Project Repository:** [GitHub](https://github.com/chatwoot/chatwoot) +- **Container Image:** [chatwoot/chatwoot](https://hub.docker.com/r/chatwoot/chatwoot) +- **Documentation:** [chatwoot.com](https://www.chatwoot.com/docs/self-hosted) +- **Reverse Proxy Port:** `3000` + +## Getting Started + +1. Start the container: `docker compose up -d` +2. Open http://localhost:3000 in your browser +3. Follow the initial setup wizard to configure the application + +## Environment Variable Notes + + CHATWOOT_SECRET_KEY_BASE – generate with `openssl rand -hex 64` + CHATWOOT_FRONTEND_URL – public URL of the instance + +## Volume Notes + + /app/storage – uploaded attachments (shared by rails and sidekiq) + /var/lib/postgresql/data – PostgreSQL data (pgvector image required) + +## Network Notes + +Requires proxy network + +## Docker Run + +```bash +docker run -d \ + --name chatwoot \ + -p 3000:3000 \ + -e SECRET_KEY_BASE=changeme \ + -e FRONTEND_URL=http://localhost:3000 \ + -e POSTGRES_HOST=dbhost -e POSTGRES_USERNAME=chatwoot \ + -e POSTGRES_PASSWORD=pass -e REDIS_URL=redis://redishost:6379 \ + chatwoot/chatwoot:latest bundle exec rails s -p 3000 -b 0.0.0.0 +``` + +## Additional Notes / Gotchas + +Before first run, prepare the database once: +`docker compose run --rm chatwoot bundle exec rails db:chatwoot_prepare` +Chatwoot requires the pgvector Postgres extension, hence the pgvector image. + +## Dockhand Stack, Deploy from Git + +Cookbooks Repository +stackname: chatwoot_dev +Compose file path: chatwoot_dev/compose.yaml +Additional env file (optional): chatwoot_dev/sample.env + +Then "Load" chatwoot_dev/sample.env into the Environmental variables in dockhand + +Create the Stack diff --git a/chatwoot_dev/compose.yaml b/chatwoot_dev/compose.yaml new file mode 100644 index 0000000..9c92e27 --- /dev/null +++ b/chatwoot_dev/compose.yaml @@ -0,0 +1,83 @@ +services: + chatwoot: + image: ${CHATWOOT_IMAGE:-chatwoot/chatwoot:latest} + restart: ${CHATWOOT_RESTART:-unless-stopped} + volumes: + - ${VOL_PATH:-/data}/chatwoot/storage:/app/storage + environment: + - SECRET_KEY_BASE=${CHATWOOT_SECRET_KEY_BASE:-ChangeThisPassword} + - FRONTEND_URL=${CHATWOOT_FRONTEND_URL:-http://localhost:3000} + - RAILS_ENV=production + - POSTGRES_HOST=chatwoot-db + - POSTGRES_USERNAME=chatwoot + - POSTGRES_PASSWORD=${CHATWOOT_DB_PASSWORD:-ChangeThisPassword} + - POSTGRES_DATABASE=chatwoot + - REDIS_URL=redis://chatwoot-redis:6379 + ports: + - ${CHATWOOT_PORT:-3000}:3000 + networks: + - proxy + - internal + depends_on: + - chatwoot-db + - chatwoot-redis + command: + - bundle + - exec + - rails + - s + - -p + - "3000" + - -b + - 0.0.0.0 + + chatwoot-sidekiq: + image: ${CHATWOOT_IMAGE:-chatwoot/chatwoot:latest} + restart: ${CHATWOOT_RESTART:-unless-stopped} + volumes: + - ${VOL_PATH:-/data}/chatwoot/storage:/app/storage + environment: + - SECRET_KEY_BASE=${CHATWOOT_SECRET_KEY_BASE:-ChangeThisPassword} + - FRONTEND_URL=${CHATWOOT_FRONTEND_URL:-http://localhost:3000} + - RAILS_ENV=production + - POSTGRES_HOST=chatwoot-db + - POSTGRES_USERNAME=chatwoot + - POSTGRES_PASSWORD=${CHATWOOT_DB_PASSWORD:-ChangeThisPassword} + - POSTGRES_DATABASE=chatwoot + - REDIS_URL=redis://chatwoot-redis:6379 + networks: + - internal + depends_on: + - chatwoot-db + - chatwoot-redis + command: + - bundle + - exec + - sidekiq + - -C + - config/sidekiq.yml + + chatwoot-db: + image: ${PGVECTOR_IMAGE:-pgvector/pgvector:pg16} + restart: ${CHATWOOT_RESTART:-unless-stopped} + volumes: + - ${VOL_PATH:-/data}/chatwoot/db:/var/lib/postgresql/data + environment: + - POSTGRES_DB=chatwoot + - POSTGRES_USER=chatwoot + - POSTGRES_PASSWORD=${CHATWOOT_DB_PASSWORD:-ChangeThisPassword} + networks: + - internal + + chatwoot-redis: + image: ${REDIS_IMAGE:-redis:7-alpine} + restart: ${CHATWOOT_RESTART:-unless-stopped} + volumes: + - ${VOL_PATH:-/data}/chatwoot/redis:/data + networks: + - internal + +networks: + proxy: + external: true + internal: diff --git a/chatwoot_dev/sample.env b/chatwoot_dev/sample.env new file mode 100644 index 0000000..9b0b360 --- /dev/null +++ b/chatwoot_dev/sample.env @@ -0,0 +1,10 @@ +# Chatwoot +VOL_PATH=/data +CHATWOOT_IMAGE=chatwoot/chatwoot:latest +PGVECTOR_IMAGE=pgvector/pgvector:pg16 +REDIS_IMAGE=redis:7-alpine +CHATWOOT_RESTART=unless-stopped +CHATWOOT_PORT=3000 +CHATWOOT_FRONTEND_URL=http://localhost:3000 +CHATWOOT_SECRET_KEY_BASE=ChangeThisPassword +CHATWOOT_DB_PASSWORD=ChangeThisPassword diff --git a/comfyui_dev/README.md b/comfyui_dev/README.md new file mode 100644 index 0000000..82e0c86 --- /dev/null +++ b/comfyui_dev/README.md @@ -0,0 +1,58 @@ +# ComfyUI + +## Overview + +Node-based interface for AI image generation workflows. + +## Project Details + +- **Project Repository:** [GitHub](https://github.com/comfyanonymous/ComfyUI) +- **Container Image:** [yanwk/comfyui-boot](https://hub.docker.com/r/yanwk/comfyui-boot) +- **Documentation:** [comfy.org](https://docs.comfy.org/) +- **Reverse Proxy Port:** `8188` + +## Getting Started + +1. Start the container: `docker compose up -d` +2. Open http://localhost:8188 in your browser +3. Follow the initial setup wizard to configure the application + +## Environment Variable Notes + + COMFYUI_IMAGE – pick the tag matching your CUDA version (cu124-slim, cu121, etc.) + +## Volume Notes + + /root – models, custom nodes, outputs, and settings + +## Network Notes + +Requires proxy network + +## Docker Run + +```bash +docker run -d \ + --name comfyui \ + --gpus all \ + -p 8188:8188 \ + -v /data/comfyui:/root \ + yanwk/comfyui-boot:cu124-slim +``` + +## Additional Notes / Gotchas + +ComfyUI has no official image; yanwk/comfyui-boot is the most maintained community image. +GPU access is required for practical use — install the NVIDIA Container Toolkit and add a `gpus` / deploy reservation to the compose file (not included here since it depends on host setup). +Models are large; expect 20+ GB in the /root volume. + +## Dockhand Stack, Deploy from Git + +Cookbooks Repository +stackname: comfyui_dev +Compose file path: comfyui_dev/compose.yaml +Additional env file (optional): comfyui_dev/sample.env + +Then "Load" comfyui_dev/sample.env into the Environmental variables in dockhand + +Create the Stack diff --git a/comfyui_dev/compose.yaml b/comfyui_dev/compose.yaml new file mode 100644 index 0000000..79950fe --- /dev/null +++ b/comfyui_dev/compose.yaml @@ -0,0 +1,14 @@ +services: + comfyui: + image: ${COMFYUI_IMAGE:-yanwk/comfyui-boot:cu124-slim} + restart: ${COMFYUI_RESTART:-unless-stopped} + volumes: + - ${VOL_PATH:-/data}/comfyui:/root + ports: + - ${COMFYUI_PORT:-8188}:8188 + networks: + - proxy + +networks: + proxy: + external: true diff --git a/comfyui_dev/sample.env b/comfyui_dev/sample.env new file mode 100644 index 0000000..23f1414 --- /dev/null +++ b/comfyui_dev/sample.env @@ -0,0 +1,5 @@ +# ComfyUI +VOL_PATH=/data +COMFYUI_IMAGE=yanwk/comfyui-boot:cu124-slim +COMFYUI_RESTART=unless-stopped +COMFYUI_PORT=8188 diff --git a/dashy_dev/README.md b/dashy_dev/README.md new file mode 100644 index 0000000..c613895 --- /dev/null +++ b/dashy_dev/README.md @@ -0,0 +1,56 @@ +# Dashy + +## Overview + +Customizable self-hosted dashboard for organizing apps, services, and links. + +## Project Details + +- **Project Repository:** [GitHub](https://github.com/Lissy93/dashy) +- **Container Image:** [lissy93/dashy](https://hub.docker.com/r/lissy93/dashy) +- **Documentation:** [dashy.to](https://dashy.to/docs/) +- **Reverse Proxy Port:** `8080` + +## Getting Started + +1. Start the container: `docker compose up -d` +2. Open http://localhost:4000 in your browser +3. Follow the initial setup wizard to configure the application + +## Environment Variable Notes + + DASHY_PORT – host port for the web UI + +## Volume Notes + + /app/user-data – conf.yml and all dashboard configuration + +## Network Notes + +Requires proxy network + +## Docker Run + +```bash +docker run -d \ + --name dashy \ + -p 4000:8080 \ + -v /data/dashy/user-data:/app/user-data \ + lissy93/dashy:latest +``` + +## Additional Notes / Gotchas + +Configuration lives in `user-data/conf.yml` and can also be edited from the UI. +The repo already contains heimdall and homepage_dev as alternative dashboards. + +## Dockhand Stack, Deploy from Git + +Cookbooks Repository +stackname: dashy_dev +Compose file path: dashy_dev/compose.yaml +Additional env file (optional): dashy_dev/sample.env + +Then "Load" dashy_dev/sample.env into the Environmental variables in dockhand + +Create the Stack diff --git a/dashy_dev/compose.yaml b/dashy_dev/compose.yaml new file mode 100644 index 0000000..aaf8c7a --- /dev/null +++ b/dashy_dev/compose.yaml @@ -0,0 +1,14 @@ +services: + dashy: + image: ${DASHY_IMAGE:-lissy93/dashy:latest} + restart: ${DASHY_RESTART:-unless-stopped} + volumes: + - ${VOL_PATH:-/data}/dashy/user-data:/app/user-data + ports: + - ${DASHY_PORT:-4000}:8080 + networks: + - proxy + +networks: + proxy: + external: true diff --git a/dashy_dev/sample.env b/dashy_dev/sample.env new file mode 100644 index 0000000..29db4d0 --- /dev/null +++ b/dashy_dev/sample.env @@ -0,0 +1,5 @@ +# Dashy +VOL_PATH=/data +DASHY_IMAGE=lissy93/dashy:latest +DASHY_RESTART=unless-stopped +DASHY_PORT=4000 diff --git a/dumbbudget_dev/README.md b/dumbbudget_dev/README.md new file mode 100644 index 0000000..62fec08 --- /dev/null +++ b/dumbbudget_dev/README.md @@ -0,0 +1,57 @@ +# DumbBudget + +## Overview + +Stupid-simple self-hosted budgeting app for tracking expenses and income, protected by a PIN. + +## Project Details + +- **Project Repository:** [GitHub](https://github.com/DumbWareio/DumbBudget) +- **Container Image:** [dumbwareio/dumbbudget](https://hub.docker.com/r/dumbwareio/dumbbudget) +- **Documentation:** [GitHub README](https://github.com/DumbWareio/DumbBudget/blob/main/README.md) +- **Reverse Proxy Port:** `3000` + +## Getting Started + +1. Start the container: `docker compose up -d` +2. Open http://localhost:3000 in your browser +3. Follow the initial setup wizard to configure the application + +## Environment Variable Notes + + DUMBBUDGET_PIN – access PIN (change it!) + DUMBBUDGET_CURRENCY – ISO currency code + +## Volume Notes + + /app/data – transactions and settings + +## Network Notes + +Requires proxy network + +## Docker Run + +```bash +docker run -d \ + --name dumbbudget \ + -p 3000:3000 \ + -e DUMBBUDGET_PIN=1234 -e BASE_URL=http://localhost:3000 -e CURRENCY=CAD \ + -v /data/dumbbudget/data:/app/data \ + dumbwareio/dumbbudget:latest +``` + +## Additional Notes / Gotchas + +PIN auth only — keep behind the proxy and don't expose publicly. + +## Dockhand Stack, Deploy from Git + +Cookbooks Repository +stackname: dumbbudget_dev +Compose file path: dumbbudget_dev/compose.yaml +Additional env file (optional): dumbbudget_dev/sample.env + +Then "Load" dumbbudget_dev/sample.env into the Environmental variables in dockhand + +Create the Stack diff --git a/dumbbudget_dev/compose.yaml b/dumbbudget_dev/compose.yaml new file mode 100644 index 0000000..8a10f84 --- /dev/null +++ b/dumbbudget_dev/compose.yaml @@ -0,0 +1,18 @@ +services: + dumbbudget: + image: ${DUMBBUDGET_IMAGE:-dumbwareio/dumbbudget:latest} + restart: ${DUMBBUDGET_RESTART:-unless-stopped} + volumes: + - ${VOL_PATH:-/data}/dumbbudget/data:/app/data + environment: + - DUMBBUDGET_PIN=${DUMBBUDGET_PIN:-ChangeThisPassword} + - BASE_URL=${DUMBBUDGET_BASE_URL:-http://localhost:3000} + - CURRENCY=${DUMBBUDGET_CURRENCY:-CAD} + ports: + - ${DUMBBUDGET_PORT:-3000}:3000 + networks: + - proxy + +networks: + proxy: + external: true diff --git a/dumbbudget_dev/sample.env b/dumbbudget_dev/sample.env new file mode 100644 index 0000000..9e6ac12 --- /dev/null +++ b/dumbbudget_dev/sample.env @@ -0,0 +1,8 @@ +# DumbBudget +VOL_PATH=/data +DUMBBUDGET_IMAGE=dumbwareio/dumbbudget:latest +DUMBBUDGET_RESTART=unless-stopped +DUMBBUDGET_PORT=3000 +DUMBBUDGET_PIN=ChangeThisPassword +DUMBBUDGET_BASE_URL=http://localhost:3000 +DUMBBUDGET_CURRENCY=CAD diff --git a/fider_dev/README.md b/fider_dev/README.md new file mode 100644 index 0000000..329cce8 --- /dev/null +++ b/fider_dev/README.md @@ -0,0 +1,60 @@ +# Fider + +## Overview + +Feedback collection platform for product ideas, suggestions, and user voting. + +## Project Details + +- **Project Repository:** [GitHub](https://github.com/getfider/fider) +- **Container Image:** [getfider/fider](https://hub.docker.com/r/getfider/fider) +- **Documentation:** [fider.io](https://fider.io/docs) +- **Reverse Proxy Port:** `3000` + +## Getting Started + +1. Start the container: `docker compose up -d` +2. Open http://localhost:3000 in your browser +3. Follow the initial setup wizard to configure the application + +## Environment Variable Notes + + FIDER_JWT_SECRET – long random string, generate with `openssl rand -hex 32` + FIDER_BASE_URL – public URL of the instance + FIDER_SMTP_* – Fider requires working email to sign in (magic links) + +## Volume Notes + + /var/lib/postgresql/data – PostgreSQL data + +## Network Notes + +Requires proxy network + +## Docker Run + +```bash +docker run -d \ + --name fider \ + -p 3000:3000 \ + -e BASE_URL=http://localhost:3000 \ + -e DATABASE_URL=postgres://fider:pass@dbhost:5432/fider?sslmode=disable \ + -e JWT_SECRET=changeme \ + -e EMAIL_NOREPLY=noreply@example.com \ + getfider/fider:stable +``` + +## Additional Notes / Gotchas + +Email is not optional — sign-in uses magic links, so SMTP (or Mailgun env vars) must be configured before first use. + +## Dockhand Stack, Deploy from Git + +Cookbooks Repository +stackname: fider_dev +Compose file path: fider_dev/compose.yaml +Additional env file (optional): fider_dev/sample.env + +Then "Load" fider_dev/sample.env into the Environmental variables in dockhand + +Create the Stack diff --git a/fider_dev/compose.yaml b/fider_dev/compose.yaml new file mode 100644 index 0000000..97c2378 --- /dev/null +++ b/fider_dev/compose.yaml @@ -0,0 +1,37 @@ +services: + fider: + image: ${FIDER_IMAGE:-getfider/fider:stable} + restart: ${FIDER_RESTART:-unless-stopped} + environment: + - BASE_URL=${FIDER_BASE_URL:-http://localhost:3000} + - DATABASE_URL=postgres://fider:${FIDER_DB_PASSWORD:-ChangeThisPassword}@fider-db:5432/fider?sslmode=disable + - JWT_SECRET=${FIDER_JWT_SECRET:-ChangeThisPassword} + - EMAIL_NOREPLY=${FIDER_EMAIL_NOREPLY:-noreply@example.com} + - EMAIL_SMTP_HOST=${FIDER_SMTP_HOST:-smtp.example.com} + - EMAIL_SMTP_PORT=${FIDER_SMTP_PORT:-587} + - EMAIL_SMTP_USERNAME=${FIDER_SMTP_USERNAME:-user} + - EMAIL_SMTP_PASSWORD=${FIDER_SMTP_PASSWORD:-ChangeThisPassword} + ports: + - ${FIDER_PORT:-3000}:3000 + networks: + - proxy + - internal + depends_on: + - fider-db + + fider-db: + image: ${POSTGRES_IMAGE:-postgres:17-alpine} + restart: ${FIDER_RESTART:-unless-stopped} + volumes: + - ${VOL_PATH:-/data}/fider/db:/var/lib/postgresql/data + environment: + - POSTGRES_DB=fider + - POSTGRES_USER=fider + - POSTGRES_PASSWORD=${FIDER_DB_PASSWORD:-ChangeThisPassword} + networks: + - internal + +networks: + proxy: + external: true + internal: diff --git a/fider_dev/sample.env b/fider_dev/sample.env new file mode 100644 index 0000000..bd626e6 --- /dev/null +++ b/fider_dev/sample.env @@ -0,0 +1,14 @@ +# Fider +VOL_PATH=/data +FIDER_IMAGE=getfider/fider:stable +POSTGRES_IMAGE=postgres:17-alpine +FIDER_RESTART=unless-stopped +FIDER_PORT=3000 +FIDER_BASE_URL=http://localhost:3000 +FIDER_DB_PASSWORD=ChangeThisPassword +FIDER_JWT_SECRET=ChangeThisPassword +FIDER_EMAIL_NOREPLY=noreply@example.com +FIDER_SMTP_HOST=smtp.example.com +FIDER_SMTP_PORT=587 +FIDER_SMTP_USERNAME=user +FIDER_SMTP_PASSWORD=ChangeThisPassword diff --git a/grocy_dev/README.md b/grocy_dev/README.md new file mode 100644 index 0000000..12d2a98 --- /dev/null +++ b/grocy_dev/README.md @@ -0,0 +1,56 @@ +# Grocy + +## Overview + +Self-hosted grocery, household inventory, chores, and meal planning system. + +## Project Details + +- **Project Repository:** [GitHub](https://github.com/grocy/grocy) +- **Container Image:** [linuxserver/grocy](https://docs.linuxserver.io/images/docker-grocy/) +- **Documentation:** [grocy.info](https://grocy.info/) +- **Reverse Proxy Port:** `80` + +## Getting Started + +1. Start the container: `docker compose up -d` +2. Open http://localhost:9283 in your browser +3. Follow the initial setup wizard to configure the application + +## Environment Variable Notes + + GROCY_PUID / GROCY_PGID – file ownership for the config volume + +## Volume Notes + + /config – application data and SQLite database + +## Network Notes + +Requires proxy network + +## Docker Run + +```bash +docker run -d \ + --name grocy \ + -p 9283:80 \ + -e TZ=America/Vancouver -e PUID=1000 -e PGID=1000 \ + -v /data/grocy/config:/config \ + lscr.io/linuxserver/grocy:latest +``` + +## Additional Notes / Gotchas + +Default login is admin/admin — change it after first login. + +## Dockhand Stack, Deploy from Git + +Cookbooks Repository +stackname: grocy_dev +Compose file path: grocy_dev/compose.yaml +Additional env file (optional): grocy_dev/sample.env + +Then "Load" grocy_dev/sample.env into the Environmental variables in dockhand + +Create the Stack diff --git a/grocy_dev/compose.yaml b/grocy_dev/compose.yaml new file mode 100644 index 0000000..1d5b516 --- /dev/null +++ b/grocy_dev/compose.yaml @@ -0,0 +1,18 @@ +services: + grocy: + image: ${GROCY_IMAGE:-lscr.io/linuxserver/grocy:latest} + restart: ${GROCY_RESTART:-unless-stopped} + volumes: + - ${VOL_PATH:-/data}/grocy/config:/config + environment: + - TZ=${TZ:-America/Vancouver} + - PUID=${GROCY_PUID:-1000} + - PGID=${GROCY_PGID:-1000} + ports: + - ${GROCY_PORT:-9283}:80 + networks: + - proxy + +networks: + proxy: + external: true diff --git a/grocy_dev/sample.env b/grocy_dev/sample.env new file mode 100644 index 0000000..0b511fb --- /dev/null +++ b/grocy_dev/sample.env @@ -0,0 +1,8 @@ +# Grocy +VOL_PATH=/data +TZ=America/Vancouver +GROCY_IMAGE=lscr.io/linuxserver/grocy:latest +GROCY_RESTART=unless-stopped +GROCY_PORT=9283 +GROCY_PUID=1000 +GROCY_PGID=1000 diff --git a/itflow_dev/README.md b/itflow_dev/README.md new file mode 100644 index 0000000..9b9c17c --- /dev/null +++ b/itflow_dev/README.md @@ -0,0 +1,56 @@ +# ITFlow + +## Overview + +IT documentation, ticketing, and asset management platform for MSPs. + +## Project Details + +- **Project Repository:** [GitHub](https://github.com/itflow-org/itflow) +- **Container Image:** [itfloworg/itflow](https://hub.docker.com/r/itfloworg/itflow) +- **Documentation:** [docs.itflow.org](https://docs.itflow.org/installation_docker) +- **Reverse Proxy Port:** `80` + +## Getting Started + +1. Start the container: `docker compose up -d` +2. Open http://localhost:8080 in your browser +3. Follow the initial setup wizard to configure the application + +## Environment Variable Notes + + ITFLOW_DB_PASSWORD – database password used by the setup wizard + +## Volume Notes + + /var/www/itflow/uploads – uploaded files + /var/lib/mysql – MariaDB data + +## Network Notes + +Requires proxy network + +## Docker Run + +```bash +docker run -d \ + --name itflow \ + -p 8080:80 \ + itfloworg/itflow:latest +``` + +## Additional Notes / Gotchas + +The Docker image is community-maintained and explicitly not production-ready. +On first visit the setup wizard asks for the database host (`itflow-db`), user, and password. + +## Dockhand Stack, Deploy from Git + +Cookbooks Repository +stackname: itflow_dev +Compose file path: itflow_dev/compose.yaml +Additional env file (optional): itflow_dev/sample.env + +Then "Load" itflow_dev/sample.env into the Environmental variables in dockhand + +Create the Stack diff --git a/itflow_dev/compose.yaml b/itflow_dev/compose.yaml new file mode 100644 index 0000000..4c3cef3 --- /dev/null +++ b/itflow_dev/compose.yaml @@ -0,0 +1,31 @@ +services: + itflow: + image: ${ITFLOW_IMAGE:-itfloworg/itflow:latest} + restart: ${ITFLOW_RESTART:-unless-stopped} + volumes: + - ${VOL_PATH:-/data}/itflow/uploads:/var/www/itflow/uploads + ports: + - ${ITFLOW_PORT:-8080}:80 + networks: + - proxy + - internal + depends_on: + - itflow-db + + itflow-db: + image: ${MARIADB_IMAGE:-mariadb:latest} + restart: ${ITFLOW_RESTART:-unless-stopped} + volumes: + - ${VOL_PATH:-/data}/itflow/db:/var/lib/mysql + environment: + - MARIADB_DATABASE=itflow + - MARIADB_USER=itflow + - MARIADB_PASSWORD=${ITFLOW_DB_PASSWORD:-ChangeThisPassword} + - MARIADB_ROOT_PASSWORD=${MARIADB_ROOT_PASSWORD:-ChangeThisPassword} + networks: + - internal + +networks: + proxy: + external: true + internal: diff --git a/itflow_dev/sample.env b/itflow_dev/sample.env new file mode 100644 index 0000000..d5f499e --- /dev/null +++ b/itflow_dev/sample.env @@ -0,0 +1,8 @@ +# ITFlow +VOL_PATH=/data +ITFLOW_IMAGE=itfloworg/itflow:latest +MARIADB_IMAGE=mariadb:latest +ITFLOW_RESTART=unless-stopped +ITFLOW_PORT=8080 +ITFLOW_DB_PASSWORD=ChangeThisPassword +MARIADB_ROOT_PASSWORD=ChangeThisPassword diff --git a/mailarchiver_dev/README.md b/mailarchiver_dev/README.md new file mode 100644 index 0000000..d3ba620 --- /dev/null +++ b/mailarchiver_dev/README.md @@ -0,0 +1,57 @@ +# Mail Archiver + +## Overview + +Self-hosted email archiving, search, and export tool with multi-account folder sync. + +## Project Details + +- **Project Repository:** [GitHub](https://github.com/s1t5/mail-archiver) +- **Container Image:** [s1t5/mailarchiver](https://hub.docker.com/r/s1t5/mailarchiver) +- **Documentation:** [Setup docs](https://github.com/s1t5/mail-archiver/blob/main/doc/Setup.md) +- **Reverse Proxy Port:** `5000` + +## Getting Started + +1. Start the container: `docker compose up -d` +2. Open http://localhost:5000 in your browser +3. Follow the initial setup wizard to configure the application + +## Environment Variable Notes + + MAILARCHIVER_USERNAME / MAILARCHIVER_PASSWORD – web UI admin login + MAILARCHIVER_DB_PASSWORD – must match in both the app connection string and postgres + +## Volume Notes + + /var/lib/postgresql/data – PostgreSQL data (the archive itself) + +## Network Notes + +Requires proxy network + +## Docker Run + +```bash +docker run -d \ + --name mailarchiver \ + -p 5000:5000 \ + -e 'ConnectionStrings__DefaultConnection=Host=dbhost;Database=MailArchiver;Username=mailuser;Password=pass' \ + -e Authentication__Username=admin -e Authentication__Password=pass \ + s1t5/mailarchiver:latest +``` + +## Additional Notes / Gotchas + +No built-in HTTPS — keep behind the reverse proxy. Add mail accounts through the web UI after first login. + +## Dockhand Stack, Deploy from Git + +Cookbooks Repository +stackname: mailarchiver_dev +Compose file path: mailarchiver_dev/compose.yaml +Additional env file (optional): mailarchiver_dev/sample.env + +Then "Load" mailarchiver_dev/sample.env into the Environmental variables in dockhand + +Create the Stack diff --git a/mailarchiver_dev/compose.yaml b/mailarchiver_dev/compose.yaml new file mode 100644 index 0000000..495c49f --- /dev/null +++ b/mailarchiver_dev/compose.yaml @@ -0,0 +1,33 @@ +services: + mailarchiver: + image: ${MAILARCHIVER_IMAGE:-s1t5/mailarchiver:latest} + restart: ${MAILARCHIVER_RESTART:-unless-stopped} + environment: + - ConnectionStrings__DefaultConnection=Host=mailarchiver-db;Database=MailArchiver;Username=mailuser;Password=${MAILARCHIVER_DB_PASSWORD:-ChangeThisPassword} + - Authentication__Username=${MAILARCHIVER_USERNAME:-admin} + - Authentication__Password=${MAILARCHIVER_PASSWORD:-ChangeThisPassword} + - TimeZone__DisplayTimeZoneId=${MAILARCHIVER_TIMEZONE:-America/Vancouver} + ports: + - ${MAILARCHIVER_PORT:-5000}:5000 + networks: + - proxy + - internal + depends_on: + - mailarchiver-db + + mailarchiver-db: + image: ${POSTGRES_IMAGE:-postgres:17-alpine} + restart: ${MAILARCHIVER_RESTART:-unless-stopped} + volumes: + - ${VOL_PATH:-/data}/mailarchiver/db:/var/lib/postgresql/data + environment: + - POSTGRES_DB=MailArchiver + - POSTGRES_USER=mailuser + - POSTGRES_PASSWORD=${MAILARCHIVER_DB_PASSWORD:-ChangeThisPassword} + networks: + - internal + +networks: + proxy: + external: true + internal: diff --git a/mailarchiver_dev/sample.env b/mailarchiver_dev/sample.env new file mode 100644 index 0000000..158a6f1 --- /dev/null +++ b/mailarchiver_dev/sample.env @@ -0,0 +1,10 @@ +# Mail Archiver +VOL_PATH=/data +MAILARCHIVER_IMAGE=s1t5/mailarchiver:latest +POSTGRES_IMAGE=postgres:17-alpine +MAILARCHIVER_RESTART=unless-stopped +MAILARCHIVER_PORT=5000 +MAILARCHIVER_USERNAME=admin +MAILARCHIVER_PASSWORD=ChangeThisPassword +MAILARCHIVER_DB_PASSWORD=ChangeThisPassword +MAILARCHIVER_TIMEZONE=America/Vancouver diff --git a/maybe_dev/README.md b/maybe_dev/README.md new file mode 100644 index 0000000..251a71d --- /dev/null +++ b/maybe_dev/README.md @@ -0,0 +1,58 @@ +# Maybe Finance + +## Overview + +Personal finance and budgeting tool with a focus on privacy. + +## Project Details + +- **Project Repository:** [GitHub](https://github.com/maybe-finance/maybe) +- **Container Image:** [ghcr.io/maybe-finance/maybe](https://github.com/maybe-finance/maybe/pkgs/container/maybe) +- **Documentation:** [GitHub docs](https://github.com/maybe-finance/maybe/tree/main/docs) +- **Reverse Proxy Port:** `3000` + +## Getting Started + +1. Start the container: `docker compose up -d` +2. Open http://localhost:3000 in your browser +3. Follow the initial setup wizard to configure the application + +## Environment Variable Notes + + MAYBE_SECRET_KEY_BASE – generate with `openssl rand -hex 64` + +## Volume Notes + + /rails/storage – uploaded files + /var/lib/postgresql/data – PostgreSQL data + +## Network Notes + +Requires proxy network + +## Docker Run + +```bash +docker run -d \ + --name maybe \ + -p 3000:3000 \ + -e SELF_HOSTED=true -e RAILS_FORCE_SSL=false -e RAILS_ASSUME_SSL=false \ + -e SECRET_KEY_BASE=changeme \ + -e DB_HOST=dbhost -e POSTGRES_USER=maybe -e POSTGRES_PASSWORD=pass -e POSTGRES_DB=maybe \ + ghcr.io/maybe-finance/maybe:latest +``` + +## Additional Notes / Gotchas + +The Maybe company shut down and archived the repo — the image is frozen and receives no updates. Consider firefly_dev or paisa_dev in this repo as maintained alternatives. + +## Dockhand Stack, Deploy from Git + +Cookbooks Repository +stackname: maybe_dev +Compose file path: maybe_dev/compose.yaml +Additional env file (optional): maybe_dev/sample.env + +Then "Load" maybe_dev/sample.env into the Environmental variables in dockhand + +Create the Stack diff --git a/maybe_dev/compose.yaml b/maybe_dev/compose.yaml new file mode 100644 index 0000000..254f441 --- /dev/null +++ b/maybe_dev/compose.yaml @@ -0,0 +1,68 @@ +services: + maybe: + image: ${MAYBE_IMAGE:-ghcr.io/maybe-finance/maybe:latest} + restart: ${MAYBE_RESTART:-unless-stopped} + volumes: + - ${VOL_PATH:-/data}/maybe/storage:/rails/storage + environment: + - SELF_HOSTED=true + - RAILS_FORCE_SSL=false + - RAILS_ASSUME_SSL=false + - SECRET_KEY_BASE=${MAYBE_SECRET_KEY_BASE:-ChangeThisPassword} + - DB_HOST=maybe-db + - POSTGRES_DB=maybe + - POSTGRES_USER=maybe + - POSTGRES_PASSWORD=${MAYBE_DB_PASSWORD:-ChangeThisPassword} + - REDIS_URL=redis://maybe-redis:6379/1 + ports: + - ${MAYBE_PORT:-3000}:3000 + networks: + - proxy + - internal + depends_on: + - maybe-db + - maybe-redis + + maybe-worker: + image: ${MAYBE_IMAGE:-ghcr.io/maybe-finance/maybe:latest} + restart: ${MAYBE_RESTART:-unless-stopped} + environment: + - SELF_HOSTED=true + - SECRET_KEY_BASE=${MAYBE_SECRET_KEY_BASE:-ChangeThisPassword} + - DB_HOST=maybe-db + - POSTGRES_DB=maybe + - POSTGRES_USER=maybe + - POSTGRES_PASSWORD=${MAYBE_DB_PASSWORD:-ChangeThisPassword} + - REDIS_URL=redis://maybe-redis:6379/1 + networks: + - internal + depends_on: + - maybe-db + - maybe-redis + command: + - bundle + - exec + - sidekiq + + maybe-db: + image: ${POSTGRES_IMAGE:-postgres:16-alpine} + restart: ${MAYBE_RESTART:-unless-stopped} + volumes: + - ${VOL_PATH:-/data}/maybe/db:/var/lib/postgresql/data + environment: + - POSTGRES_DB=maybe + - POSTGRES_USER=maybe + - POSTGRES_PASSWORD=${MAYBE_DB_PASSWORD:-ChangeThisPassword} + networks: + - internal + + maybe-redis: + image: ${REDIS_IMAGE:-redis:7-alpine} + restart: ${MAYBE_RESTART:-unless-stopped} + networks: + - internal + +networks: + proxy: + external: true + internal: diff --git a/maybe_dev/sample.env b/maybe_dev/sample.env new file mode 100644 index 0000000..8101c66 --- /dev/null +++ b/maybe_dev/sample.env @@ -0,0 +1,9 @@ +# Maybe Finance +VOL_PATH=/data +MAYBE_IMAGE=ghcr.io/maybe-finance/maybe:latest +POSTGRES_IMAGE=postgres:16-alpine +REDIS_IMAGE=redis:7-alpine +MAYBE_RESTART=unless-stopped +MAYBE_PORT=3000 +MAYBE_SECRET_KEY_BASE=ChangeThisPassword +MAYBE_DB_PASSWORD=ChangeThisPassword diff --git a/notifuse_dev/README.md b/notifuse_dev/README.md new file mode 100644 index 0000000..167d293 --- /dev/null +++ b/notifuse_dev/README.md @@ -0,0 +1,61 @@ +# Notifuse + +## Overview + +Newsletter, marketing campaign, and transactional email platform (open-source Mailchimp/Resend alternative). + +## Project Details + +- **Project Repository:** [GitHub](https://github.com/Notifuse/notifuse) +- **Container Image:** [notifuse/notifuse](https://hub.docker.com/r/notifuse/notifuse) +- **Documentation:** [docs.notifuse.com](https://docs.notifuse.com/self-hosting/installation) +- **Reverse Proxy Port:** `8080` + +## Getting Started + +1. Start the container: `docker compose up -d` +2. Open http://localhost:8080 in your browser +3. Follow the initial setup wizard to configure the application + +## Environment Variable Notes + + NOTIFUSE_SECRET_KEY – encrypts all workspace secrets; NEVER change after setup or all stored credentials are lost + NOTIFUSE_ROOT_EMAIL – initial admin account + NOTIFUSE_API_ENDPOINT – public URL of the instance + +## Volume Notes + + /var/lib/postgresql/data – PostgreSQL data + +## Network Notes + +Requires proxy network + +## Docker Run + +```bash +docker run -d \ + --name notifuse \ + -p 8080:8080 \ + -e API_ENDPOINT=http://localhost:8080 \ + -e ROOT_EMAIL=admin@example.com \ + -e SECRET_KEY=changeme \ + -e DB_HOST=dbhost -e DB_USER=notifuse -e DB_PASSWORD=pass -e DB_NAME=notifuse \ + notifuse/notifuse:latest +``` + +## Additional Notes / Gotchas + +Notifuse creates a separate Postgres database per workspace, so the DB user needs CREATEDB privileges (the postgres superuser in this stack has it). +Sending requires an email provider (SES, Mailgun, SendGrid, Postmark, or SMTP) configured in the setup wizard. + +## Dockhand Stack, Deploy from Git + +Cookbooks Repository +stackname: notifuse_dev +Compose file path: notifuse_dev/compose.yaml +Additional env file (optional): notifuse_dev/sample.env + +Then "Load" notifuse_dev/sample.env into the Environmental variables in dockhand + +Create the Stack diff --git a/notifuse_dev/compose.yaml b/notifuse_dev/compose.yaml new file mode 100644 index 0000000..b936fec --- /dev/null +++ b/notifuse_dev/compose.yaml @@ -0,0 +1,37 @@ +services: + notifuse: + image: ${NOTIFUSE_IMAGE:-notifuse/notifuse:latest} + restart: ${NOTIFUSE_RESTART:-unless-stopped} + environment: + - API_ENDPOINT=${NOTIFUSE_API_ENDPOINT:-http://localhost:8080} + - ROOT_EMAIL=${NOTIFUSE_ROOT_EMAIL:-admin@example.com} + - SECRET_KEY=${NOTIFUSE_SECRET_KEY:-ChangeThisPassword} + - DB_HOST=notifuse-db + - DB_PORT=5432 + - DB_USER=notifuse + - DB_PASSWORD=${NOTIFUSE_DB_PASSWORD:-ChangeThisPassword} + - DB_NAME=notifuse + ports: + - ${NOTIFUSE_PORT:-8080}:8080 + networks: + - proxy + - internal + depends_on: + - notifuse-db + + notifuse-db: + image: ${POSTGRES_IMAGE:-postgres:17-alpine} + restart: ${NOTIFUSE_RESTART:-unless-stopped} + volumes: + - ${VOL_PATH:-/data}/notifuse/db:/var/lib/postgresql/data + environment: + - POSTGRES_DB=notifuse + - POSTGRES_USER=notifuse + - POSTGRES_PASSWORD=${NOTIFUSE_DB_PASSWORD:-ChangeThisPassword} + networks: + - internal + +networks: + proxy: + external: true + internal: diff --git a/notifuse_dev/sample.env b/notifuse_dev/sample.env new file mode 100644 index 0000000..eeb8eb3 --- /dev/null +++ b/notifuse_dev/sample.env @@ -0,0 +1,10 @@ +# Notifuse +VOL_PATH=/data +NOTIFUSE_IMAGE=notifuse/notifuse:latest +POSTGRES_IMAGE=postgres:17-alpine +NOTIFUSE_RESTART=unless-stopped +NOTIFUSE_PORT=8080 +NOTIFUSE_API_ENDPOINT=http://localhost:8080 +NOTIFUSE_ROOT_EMAIL=admin@example.com +NOTIFUSE_SECRET_KEY=ChangeThisPassword +NOTIFUSE_DB_PASSWORD=ChangeThisPassword diff --git a/obsidian_dev/README.md b/obsidian_dev/README.md new file mode 100644 index 0000000..4a32b1f --- /dev/null +++ b/obsidian_dev/README.md @@ -0,0 +1,56 @@ +# Obsidian + +## Overview + +Local-first note-taking and knowledge management app, run as a web-accessible desktop via KasmVNC. + +## Project Details + +- **Project Repository:** [obsidian.md](https://obsidian.md/) +- **Container Image:** [linuxserver/obsidian](https://docs.linuxserver.io/images/docker-obsidian/) +- **Documentation:** [help.obsidian.md](https://help.obsidian.md/) +- **Reverse Proxy Port:** `3000` + +## Getting Started + +1. Start the container: `docker compose up -d` +2. Open http://localhost:3000 in your browser +3. Follow the initial setup wizard to configure the application + +## Environment Variable Notes + + OBSIDIAN_PUID / OBSIDIAN_PGID – ownership of the vault files + +## Volume Notes + + /config – Obsidian settings and your vaults + +## Network Notes + +Requires proxy network + +## Docker Run + +```bash +docker run -d \ + --name obsidian \ + -p 3000:3000 \ + -e TZ=America/Vancouver -e PUID=1000 -e PGID=1000 \ + -v /data/obsidian/config:/config \ + lscr.io/linuxserver/obsidian:latest +``` + +## Additional Notes / Gotchas + +This streams the Obsidian desktop app to your browser (KasmVNC) — it is unauthenticated by default, so keep it behind the proxy with auth. Obsidian itself is proprietary (free for personal use). + +## Dockhand Stack, Deploy from Git + +Cookbooks Repository +stackname: obsidian_dev +Compose file path: obsidian_dev/compose.yaml +Additional env file (optional): obsidian_dev/sample.env + +Then "Load" obsidian_dev/sample.env into the Environmental variables in dockhand + +Create the Stack diff --git a/obsidian_dev/compose.yaml b/obsidian_dev/compose.yaml new file mode 100644 index 0000000..95fb156 --- /dev/null +++ b/obsidian_dev/compose.yaml @@ -0,0 +1,18 @@ +services: + obsidian: + image: ${OBSIDIAN_IMAGE:-lscr.io/linuxserver/obsidian:latest} + restart: ${OBSIDIAN_RESTART:-unless-stopped} + volumes: + - ${VOL_PATH:-/data}/obsidian/config:/config + environment: + - TZ=${TZ:-America/Vancouver} + - PUID=${OBSIDIAN_PUID:-1000} + - PGID=${OBSIDIAN_PGID:-1000} + ports: + - ${OBSIDIAN_PORT:-3000}:3000 + networks: + - proxy + +networks: + proxy: + external: true diff --git a/obsidian_dev/sample.env b/obsidian_dev/sample.env new file mode 100644 index 0000000..3f13b78 --- /dev/null +++ b/obsidian_dev/sample.env @@ -0,0 +1,8 @@ +# Obsidian +VOL_PATH=/data +TZ=America/Vancouver +OBSIDIAN_IMAGE=lscr.io/linuxserver/obsidian:latest +OBSIDIAN_RESTART=unless-stopped +OBSIDIAN_PORT=3000 +OBSIDIAN_PUID=1000 +OBSIDIAN_PGID=1000 diff --git a/outline_dev/README.md b/outline_dev/README.md new file mode 100644 index 0000000..d02a948 --- /dev/null +++ b/outline_dev/README.md @@ -0,0 +1,62 @@ +# Outline + +## Overview + +Team knowledge base and documentation wiki. + +## Project Details + +- **Project Repository:** [GitHub](https://github.com/outline/outline) +- **Container Image:** [outlinewiki/outline](https://hub.docker.com/r/outlinewiki/outline) +- **Documentation:** [docs.getoutline.com](https://docs.getoutline.com/s/hosting) +- **Reverse Proxy Port:** `3000` + +## Getting Started + +1. Start the container: `docker compose up -d` +2. Open http://localhost:3000 in your browser +3. Follow the initial setup wizard to configure the application + +## Environment Variable Notes + + OUTLINE_SECRET_KEY / OUTLINE_UTILS_SECRET – generate each with `openssl rand -hex 32` + OUTLINE_URL – public URL, must match how you access it + +## Volume Notes + + /var/lib/outline/data – local file/attachment storage + /var/lib/postgresql/data – PostgreSQL data + +## Network Notes + +Requires proxy network + +## Docker Run + +```bash +docker run -d \ + --name outline \ + -p 3000:3000 \ + -e URL=http://localhost:3000 \ + -e SECRET_KEY=$(openssl rand -hex 32) \ + -e UTILS_SECRET=$(openssl rand -hex 32) \ + -e DATABASE_URL=postgres://outline:pass@dbhost:5432/outline \ + -e PGSSLMODE=disable \ + -e REDIS_URL=redis://redishost:6379 \ + outlinewiki/outline:latest +``` + +## Additional Notes / Gotchas + +Outline has no built-in username/password login — you must configure an auth provider (OIDC, Google, Slack, etc.) via additional env vars before anyone can sign in. Authentik or Authelia from this repo work as OIDC providers. + +## Dockhand Stack, Deploy from Git + +Cookbooks Repository +stackname: outline_dev +Compose file path: outline_dev/compose.yaml +Additional env file (optional): outline_dev/sample.env + +Then "Load" outline_dev/sample.env into the Environmental variables in dockhand + +Create the Stack diff --git a/outline_dev/compose.yaml b/outline_dev/compose.yaml new file mode 100644 index 0000000..b216db9 --- /dev/null +++ b/outline_dev/compose.yaml @@ -0,0 +1,46 @@ +services: + outline: + image: ${OUTLINE_IMAGE:-outlinewiki/outline:latest} + restart: ${OUTLINE_RESTART:-unless-stopped} + volumes: + - ${VOL_PATH:-/data}/outline/data:/var/lib/outline/data + environment: + - URL=${OUTLINE_URL:-http://localhost:3000} + - SECRET_KEY=${OUTLINE_SECRET_KEY:-ChangeThisPassword} + - UTILS_SECRET=${OUTLINE_UTILS_SECRET:-ChangeThisPassword} + - DATABASE_URL=postgres://outline:${OUTLINE_DB_PASSWORD:-ChangeThisPassword}@outline-db:5432/outline + - PGSSLMODE=disable + - REDIS_URL=redis://outline-redis:6379 + - FILE_STORAGE=local + - FILE_STORAGE_LOCAL_ROOT_DIR=/var/lib/outline/data + ports: + - ${OUTLINE_PORT:-3000}:3000 + networks: + - proxy + - internal + depends_on: + - outline-db + - outline-redis + + outline-db: + image: ${POSTGRES_IMAGE:-postgres:16-alpine} + restart: ${OUTLINE_RESTART:-unless-stopped} + volumes: + - ${VOL_PATH:-/data}/outline/db:/var/lib/postgresql/data + environment: + - POSTGRES_DB=outline + - POSTGRES_USER=outline + - POSTGRES_PASSWORD=${OUTLINE_DB_PASSWORD:-ChangeThisPassword} + networks: + - internal + + outline-redis: + image: ${REDIS_IMAGE:-redis:7-alpine} + restart: ${OUTLINE_RESTART:-unless-stopped} + networks: + - internal + +networks: + proxy: + external: true + internal: diff --git a/outline_dev/sample.env b/outline_dev/sample.env new file mode 100644 index 0000000..413664c --- /dev/null +++ b/outline_dev/sample.env @@ -0,0 +1,11 @@ +# Outline +VOL_PATH=/data +OUTLINE_IMAGE=outlinewiki/outline:latest +POSTGRES_IMAGE=postgres:16-alpine +REDIS_IMAGE=redis:7-alpine +OUTLINE_RESTART=unless-stopped +OUTLINE_PORT=3000 +OUTLINE_URL=http://localhost:3000 +OUTLINE_SECRET_KEY=ChangeThisPassword +OUTLINE_UTILS_SECRET=ChangeThisPassword +OUTLINE_DB_PASSWORD=ChangeThisPassword diff --git a/picard_dev/README.md b/picard_dev/README.md new file mode 100644 index 0000000..099ae91 --- /dev/null +++ b/picard_dev/README.md @@ -0,0 +1,59 @@ +# Picard + +## Overview + +MusicBrainz-powered music file tagging and organization tool, accessed through a web-based desktop. + +## Project Details + +- **Project Repository:** [GitHub](https://github.com/mikenye/docker-picard) +- **Container Image:** [mikenye/picard](https://hub.docker.com/r/mikenye/picard) +- **Documentation:** [picard.musicbrainz.org](https://picard.musicbrainz.org/) +- **Reverse Proxy Port:** `5800` + +## Getting Started + +1. Start the container: `docker compose up -d` +2. Open http://localhost:5800 in your browser +3. Follow the initial setup wizard to configure the application + +## Environment Variable Notes + + PICARD_MUSIC – host path to your music library + PICARD_PUID / PICARD_PGID – ownership for written tags/files + +## Volume Notes + + /config – Picard settings + /storage – your music library + +## Network Notes + +Requires proxy network + +## Docker Run + +```bash +docker run -d \ + --name picard \ + -p 5800:5800 \ + -e TZ=America/Vancouver \ + -v /data/picard/config:/config:rw \ + -v /data/media/music:/storage:rw \ + mikenye/picard:latest +``` + +## Additional Notes / Gotchas + +This is a GUI app streamed to the browser via VNC — it is single-user and unauthenticated by default; keep it behind the proxy. + +## Dockhand Stack, Deploy from Git + +Cookbooks Repository +stackname: picard_dev +Compose file path: picard_dev/compose.yaml +Additional env file (optional): picard_dev/sample.env + +Then "Load" picard_dev/sample.env into the Environmental variables in dockhand + +Create the Stack diff --git a/picard_dev/compose.yaml b/picard_dev/compose.yaml new file mode 100644 index 0000000..df5d893 --- /dev/null +++ b/picard_dev/compose.yaml @@ -0,0 +1,19 @@ +services: + picard: + image: ${PICARD_IMAGE:-mikenye/picard:latest} + restart: ${PICARD_RESTART:-unless-stopped} + volumes: + - ${VOL_PATH:-/data}/picard/config:/config:rw + - ${PICARD_MUSIC:-/data/media/music}:/storage:rw + environment: + - TZ=${TZ:-America/Vancouver} + - USER_ID=${PICARD_PUID:-1000} + - GROUP_ID=${PICARD_PGID:-1000} + ports: + - ${PICARD_PORT:-5800}:5800 + networks: + - proxy + +networks: + proxy: + external: true diff --git a/picard_dev/sample.env b/picard_dev/sample.env new file mode 100644 index 0000000..5ffdcff --- /dev/null +++ b/picard_dev/sample.env @@ -0,0 +1,9 @@ +# Picard +VOL_PATH=/data +TZ=America/Vancouver +PICARD_IMAGE=mikenye/picard:latest +PICARD_RESTART=unless-stopped +PICARD_PORT=5800 +PICARD_PUID=1000 +PICARD_PGID=1000 +PICARD_MUSIC=/data/media/music diff --git a/portus_dev/README.md b/portus_dev/README.md new file mode 100644 index 0000000..a240513 --- /dev/null +++ b/portus_dev/README.md @@ -0,0 +1,60 @@ +# Portus + +## Overview + +Web UI and authorization service for on-premise Docker registries. + +## Project Details + +- **Project Repository:** [GitHub](https://github.com/SUSE/Portus) +- **Container Image:** [opensuse/portus](https://hub.docker.com/r/opensuse/portus/) +- **Documentation:** [port.us.org](http://port.us.org/) +- **Reverse Proxy Port:** `3000` + +## Getting Started + +1. Start the container: `docker compose up -d` +2. Open http://localhost:3000 in your browser +3. Follow the initial setup wizard to configure the application + +## Environment Variable Notes + + PORTUS_FQDN – hostname Portus is reached at (must match registry config) + PORTUS_SECRET_KEY_BASE – generate with `openssl rand -hex 64` + PORTUS_PASSWORD – internal password Portus uses to talk to the registry + +## Volume Notes + + /var/lib/mysql – MariaDB data + +## Network Notes + +Requires proxy network + +## Docker Run + +```bash +docker run -d \ + --name portus \ + -p 3000:3000 \ + -e PORTUS_MACHINE_FQDN_VALUE=portus.localhost \ + -e PORTUS_SECRET_KEY_BASE=changeme \ + -e PORTUS_PASSWORD=changeme \ + -e PORTUS_DB_HOST=dbhost \ + opensuse/portus:2.5 +``` + +## Additional Notes / Gotchas + +Portus was abandoned by openSUSE/SUSE years ago — kept here for reference only. It also needs a Docker registry container configured with Portus as its token auth endpoint (not included). For a maintained registry UI consider Harbor or the built-in gitea registry. + +## Dockhand Stack, Deploy from Git + +Cookbooks Repository +stackname: portus_dev +Compose file path: portus_dev/compose.yaml +Additional env file (optional): portus_dev/sample.env + +Then "Load" portus_dev/sample.env into the Environmental variables in dockhand + +Create the Stack diff --git a/portus_dev/compose.yaml b/portus_dev/compose.yaml new file mode 100644 index 0000000..75d8618 --- /dev/null +++ b/portus_dev/compose.yaml @@ -0,0 +1,39 @@ +services: + portus: + image: ${PORTUS_IMAGE:-opensuse/portus:2.5} + restart: ${PORTUS_RESTART:-unless-stopped} + environment: + - PORTUS_MACHINE_FQDN_VALUE=${PORTUS_FQDN:-portus.localhost} + - PORTUS_SECRET_KEY_BASE=${PORTUS_SECRET_KEY_BASE:-ChangeThisPassword} + - PORTUS_KEY_PATH=/certificates/portus.key + - PORTUS_PASSWORD=${PORTUS_PASSWORD:-ChangeThisPassword} + - PORTUS_DB_HOST=portus-db + - PORTUS_DB_DATABASE=portus + - PORTUS_DB_USERNAME=portus + - PORTUS_DB_PASSWORD=${PORTUS_DB_PASSWORD:-ChangeThisPassword} + - PORTUS_CHECK_SSL_USAGE_ENABLED=false + ports: + - ${PORTUS_PORT:-3000}:3000 + networks: + - proxy + - internal + depends_on: + - portus-db + + portus-db: + image: ${MARIADB_IMAGE:-mariadb:10.11} + restart: ${PORTUS_RESTART:-unless-stopped} + volumes: + - ${VOL_PATH:-/data}/portus/db:/var/lib/mysql + environment: + - MARIADB_DATABASE=portus + - MARIADB_USER=portus + - MARIADB_PASSWORD=${PORTUS_DB_PASSWORD:-ChangeThisPassword} + - MARIADB_ROOT_PASSWORD=${MARIADB_ROOT_PASSWORD:-ChangeThisPassword} + networks: + - internal + +networks: + proxy: + external: true + internal: diff --git a/portus_dev/sample.env b/portus_dev/sample.env new file mode 100644 index 0000000..642debb --- /dev/null +++ b/portus_dev/sample.env @@ -0,0 +1,11 @@ +# Portus +VOL_PATH=/data +PORTUS_IMAGE=opensuse/portus:2.5 +MARIADB_IMAGE=mariadb:10.11 +PORTUS_RESTART=unless-stopped +PORTUS_PORT=3000 +PORTUS_FQDN=portus.localhost +PORTUS_SECRET_KEY_BASE=ChangeThisPassword +PORTUS_PASSWORD=ChangeThisPassword +PORTUS_DB_PASSWORD=ChangeThisPassword +MARIADB_ROOT_PASSWORD=ChangeThisPassword diff --git a/sencho_dev/README.md b/sencho_dev/README.md new file mode 100644 index 0000000..4035ffe --- /dev/null +++ b/sencho_dev/README.md @@ -0,0 +1,60 @@ +# Sencho + +## Overview + +Self-hosted, multi-node Docker Compose management dashboard. + +## Project Details + +- **Project Repository:** [GitHub](https://github.com/Studio-Saelix/sencho) +- **Container Image:** [saelix/sencho](https://hub.docker.com/r/saelix/sencho) +- **Documentation:** [docs.sencho.io](https://docs.sencho.io/) +- **Reverse Proxy Port:** `1852` + +## Getting Started + +1. Start the container: `docker compose up -d` +2. Open http://localhost:1852 in your browser +3. Follow the initial setup wizard to configure the application + +## Environment Variable Notes + + SENCHO_COMPOSE_DIR – host directory where compose stacks live (source of truth) + +## Volume Notes + + /data – Sencho application data + /compose – your compose stacks on the host filesystem + /var/run/docker.sock – Docker socket (required) + +## Network Notes + +Requires proxy network + +## Docker Run + +```bash +docker run -d \ + --name sencho \ + -p 1852:1852 \ + -e COMPOSE_DIR=/compose -e DATA_DIR=/data \ + -v /data/sencho/data:/data \ + -v /data/compose:/compose \ + -v /var/run/docker.sock:/var/run/docker.sock \ + saelix/sencho:latest +``` + +## Additional Notes / Gotchas + +Sencho overlaps heavily with Dockhand (the manager this repo is built around) — treat this stack as an evaluation/experiment, not a replacement. + +## Dockhand Stack, Deploy from Git + +Cookbooks Repository +stackname: sencho_dev +Compose file path: sencho_dev/compose.yaml +Additional env file (optional): sencho_dev/sample.env + +Then "Load" sencho_dev/sample.env into the Environmental variables in dockhand + +Create the Stack diff --git a/sencho_dev/compose.yaml b/sencho_dev/compose.yaml new file mode 100644 index 0000000..36e0896 --- /dev/null +++ b/sencho_dev/compose.yaml @@ -0,0 +1,19 @@ +services: + sencho: + image: ${SENCHO_IMAGE:-saelix/sencho:latest} + restart: ${SENCHO_RESTART:-unless-stopped} + volumes: + - ${VOL_PATH:-/data}/sencho/data:/data + - ${SENCHO_COMPOSE_DIR:-/data/compose}:/compose + - /var/run/docker.sock:/var/run/docker.sock + environment: + - COMPOSE_DIR=/compose + - DATA_DIR=/data + ports: + - ${SENCHO_PORT:-1852}:1852 + networks: + - proxy + +networks: + proxy: + external: true diff --git a/sencho_dev/sample.env b/sencho_dev/sample.env new file mode 100644 index 0000000..288a065 --- /dev/null +++ b/sencho_dev/sample.env @@ -0,0 +1,6 @@ +# Sencho +VOL_PATH=/data +SENCHO_IMAGE=saelix/sencho:latest +SENCHO_RESTART=unless-stopped +SENCHO_PORT=1852 +SENCHO_COMPOSE_DIR=/data/compose diff --git a/silverpeas_dev/README.md b/silverpeas_dev/README.md new file mode 100644 index 0000000..850620b --- /dev/null +++ b/silverpeas_dev/README.md @@ -0,0 +1,59 @@ +# Silverpeas + +## Overview + +Enterprise collaboration platform: intranet, document sharing, and communication tools. + +## Project Details + +- **Project Repository:** [silverpeas.org](https://www.silverpeas.org/) +- **Container Image:** [silverpeas](https://hub.docker.com/_/silverpeas) +- **Documentation:** [Docker Hub](https://hub.docker.com/_/silverpeas) +- **Reverse Proxy Port:** `8000` + +## Getting Started + +1. Start the container: `docker compose up -d` +2. Open http://localhost:8000 in your browser +3. Follow the initial setup wizard to configure the application + +## Environment Variable Notes + + SILVERPEAS_DB_PASSWORD – shared between the app and postgres + +## Volume Notes + + /opt/silverpeas/data – documents and application data + /opt/silverpeas/log – logs + /var/lib/postgresql/data – PostgreSQL data + +## Network Notes + +Requires proxy network + +## Docker Run + +```bash +docker run -d \ + --name silverpeas \ + -p 8000:8000 \ + -e DB_SERVERTYPE=POSTGRESQL -e DB_SERVER=dbhost \ + -e DB_NAME=silverpeas -e DB_USER=silverpeas -e DB_PASSWORD=pass \ + silverpeas:latest +``` + +## Additional Notes / Gotchas + +The app is served under the `/silverpeas` path (http://localhost:8000/silverpeas). Default admin is SilverAdmin/SilverAdmin — change it. +First startup is slow (Wildfly + DB migration). + +## Dockhand Stack, Deploy from Git + +Cookbooks Repository +stackname: silverpeas_dev +Compose file path: silverpeas_dev/compose.yaml +Additional env file (optional): silverpeas_dev/sample.env + +Then "Load" silverpeas_dev/sample.env into the Environmental variables in dockhand + +Create the Stack diff --git a/silverpeas_dev/compose.yaml b/silverpeas_dev/compose.yaml new file mode 100644 index 0000000..d2911bf --- /dev/null +++ b/silverpeas_dev/compose.yaml @@ -0,0 +1,37 @@ +services: + silverpeas: + image: ${SILVERPEAS_IMAGE:-silverpeas:latest} + restart: ${SILVERPEAS_RESTART:-unless-stopped} + volumes: + - ${VOL_PATH:-/data}/silverpeas/data:/opt/silverpeas/data + - ${VOL_PATH:-/data}/silverpeas/log:/opt/silverpeas/log + environment: + - DB_SERVERTYPE=POSTGRESQL + - DB_SERVER=silverpeas-db + - DB_NAME=silverpeas + - DB_USER=silverpeas + - DB_PASSWORD=${SILVERPEAS_DB_PASSWORD:-ChangeThisPassword} + ports: + - ${SILVERPEAS_PORT:-8000}:8000 + networks: + - proxy + - internal + depends_on: + - silverpeas-db + + silverpeas-db: + image: ${POSTGRES_IMAGE:-postgres:16-alpine} + restart: ${SILVERPEAS_RESTART:-unless-stopped} + volumes: + - ${VOL_PATH:-/data}/silverpeas/db:/var/lib/postgresql/data + environment: + - POSTGRES_DB=silverpeas + - POSTGRES_USER=silverpeas + - POSTGRES_PASSWORD=${SILVERPEAS_DB_PASSWORD:-ChangeThisPassword} + networks: + - internal + +networks: + proxy: + external: true + internal: diff --git a/silverpeas_dev/sample.env b/silverpeas_dev/sample.env new file mode 100644 index 0000000..1d8ff25 --- /dev/null +++ b/silverpeas_dev/sample.env @@ -0,0 +1,7 @@ +# Silverpeas +VOL_PATH=/data +SILVERPEAS_IMAGE=silverpeas:latest +POSTGRES_IMAGE=postgres:16-alpine +SILVERPEAS_RESTART=unless-stopped +SILVERPEAS_PORT=8000 +SILVERPEAS_DB_PASSWORD=ChangeThisPassword diff --git a/tdarr_dev/README.md b/tdarr_dev/README.md new file mode 100644 index 0000000..8d23394 --- /dev/null +++ b/tdarr_dev/README.md @@ -0,0 +1,67 @@ +# Tdarr + +## Overview + +Distributed media transcoding and library automation (part of the *rr media stack). + +## Project Details + +- **Project Repository:** [GitHub](https://github.com/HaveAGitGat/Tdarr) +- **Container Image:** [ghcr.io/haveagitgat/tdarr](https://github.com/HaveAGitGat/Tdarr/pkgs/container/tdarr) +- **Documentation:** [Docs](https://docs.tdarr.io/) +- **Reverse Proxy Port:** `8265` + +## Getting Started + +1. Start the container: `docker compose up -d` +2. Open http://localhost:8265 in your browser +3. Follow the initial setup wizard to configure the application + +## Environment Variable Notes + + TDARR_MEDIA – host path to your media library + TDARR_SERVER_PORT – internal server port used by nodes (8266) + TDARR_NODE_NAME – name of the built-in internal node + +## Volume Notes + + /app/server – Tdarr server data + /app/configs – configuration + /app/logs – logs + /temp – transcode cache (use fast storage) + /media – your media library + +## Network Notes + +Requires proxy network + +## Docker Run + +```bash +docker run -d \ + --name tdarr \ + -p 8265:8265 -p 8266:8266 \ + -e TZ=America/Vancouver \ + -e serverIP=0.0.0.0 -e serverPort=8266 -e webUIPort=8265 \ + -e internalNode=true -e inContainer=true \ + -v /data/tdarr/server:/app/server \ + -v /data/tdarr/configs:/app/configs \ + -v /data/media:/media \ + ghcr.io/haveagitgat/tdarr:latest +``` + +## Additional Notes / Gotchas + +For hardware transcoding pass through your GPU (e.g. `--gpus all` or `/dev/dri`); not included in this compose file. +Extra transcode nodes can join by pointing at port 8266. + +## Dockhand Stack, Deploy from Git + +Cookbooks Repository +stackname: tdarr_dev +Compose file path: tdarr_dev/compose.yaml +Additional env file (optional): tdarr_dev/sample.env + +Then "Load" tdarr_dev/sample.env into the Environmental variables in dockhand + +Create the Stack diff --git a/tdarr_dev/compose.yaml b/tdarr_dev/compose.yaml new file mode 100644 index 0000000..665c3d9 --- /dev/null +++ b/tdarr_dev/compose.yaml @@ -0,0 +1,27 @@ +services: + tdarr: + image: ${TDARR_IMAGE:-ghcr.io/haveagitgat/tdarr:latest} + restart: ${TDARR_RESTART:-unless-stopped} + volumes: + - ${VOL_PATH:-/data}/tdarr/server:/app/server + - ${VOL_PATH:-/data}/tdarr/configs:/app/configs + - ${VOL_PATH:-/data}/tdarr/logs:/app/logs + - ${VOL_PATH:-/data}/tdarr/cache:/temp + - ${TDARR_MEDIA:-/data/media}:/media + environment: + - TZ=${TZ:-America/Vancouver} + - serverIP=0.0.0.0 + - serverPort=${TDARR_SERVER_PORT:-8266} + - webUIPort=${TDARR_PORT:-8265} + - internalNode=true + - inContainer=true + - nodeName=${TDARR_NODE_NAME:-InternalNode} + ports: + - ${TDARR_PORT:-8265}:8265 + - ${TDARR_SERVER_PORT:-8266}:8266 + networks: + - proxy + +networks: + proxy: + external: true diff --git a/tdarr_dev/sample.env b/tdarr_dev/sample.env new file mode 100644 index 0000000..5e4468a --- /dev/null +++ b/tdarr_dev/sample.env @@ -0,0 +1,9 @@ +# Tdarr +VOL_PATH=/data +TZ=America/Vancouver +TDARR_IMAGE=ghcr.io/haveagitgat/tdarr:latest +TDARR_RESTART=unless-stopped +TDARR_PORT=8265 +TDARR_SERVER_PORT=8266 +TDARR_NODE_NAME=InternalNode +TDARR_MEDIA=/data/media diff --git a/tinyauth_dev/README.md b/tinyauth_dev/README.md new file mode 100644 index 0000000..52ac51b --- /dev/null +++ b/tinyauth_dev/README.md @@ -0,0 +1,58 @@ +# Tinyauth + +## Overview + +Minimal authentication proxy middleware for securing apps behind a login screen. + +## Project Details + +- **Project Repository:** [GitHub](https://github.com/steveiliop56/tinyauth) +- **Container Image:** [ghcr.io/steveiliop56/tinyauth](https://github.com/steveiliop56/tinyauth/pkgs/container/tinyauth) +- **Documentation:** [tinyauth.app](https://tinyauth.app/docs/getting-started/) +- **Reverse Proxy Port:** `3000` + +## Getting Started + +1. Start the container: `docker compose up -d` +2. Open http://localhost:3000 in your browser +3. Follow the initial setup wizard to configure the application + +## Environment Variable Notes + + TINYAUTH_APPURL – public URL of the tinyauth instance + TINYAUTH_AUTH_USERS – user:bcrypt-hash pairs; generate with `docker run -i -t --rm ghcr.io/steveiliop56/tinyauth:v5 user create --interactive` + Note: `$` in bcrypt hashes must be escaped as `$$` inside compose files + +## Volume Notes + + None — tinyauth is stateless + +## Network Notes + +Requires proxy network + +## Docker Run + +```bash +docker run -d \ + --name tinyauth \ + -p 3000:3000 \ + -e TINYAUTH_APPURL=http://localhost:3000 \ + -e 'TINYAUTH_AUTH_USERS=user:$2a$10$hash' \ + ghcr.io/steveiliop56/tinyauth:v5 +``` + +## Additional Notes / Gotchas + +Tinyauth is forward-auth middleware — it protects apps via your reverse proxy (Traefik/NPM/Caddy) rather than being visited directly. Nginx Proxy Manager guide: https://tinyauth.app/docs/guides/nginx-proxy-manager/ + +## Dockhand Stack, Deploy from Git + +Cookbooks Repository +stackname: tinyauth_dev +Compose file path: tinyauth_dev/compose.yaml +Additional env file (optional): tinyauth_dev/sample.env + +Then "Load" tinyauth_dev/sample.env into the Environmental variables in dockhand + +Create the Stack diff --git a/tinyauth_dev/compose.yaml b/tinyauth_dev/compose.yaml new file mode 100644 index 0000000..5f8b8d1 --- /dev/null +++ b/tinyauth_dev/compose.yaml @@ -0,0 +1,15 @@ +services: + tinyauth: + image: ${TINYAUTH_IMAGE:-ghcr.io/steveiliop56/tinyauth:v5} + restart: ${TINYAUTH_RESTART:-unless-stopped} + environment: + - TINYAUTH_APPURL=${TINYAUTH_APPURL:-http://localhost:3000} + - TINYAUTH_AUTH_USERS=${TINYAUTH_AUTH_USERS:-user:$$2a$$10$$ReplaceWithBcryptHash} + ports: + - ${TINYAUTH_PORT:-3000}:3000 + networks: + - proxy + +networks: + proxy: + external: true diff --git a/tinyauth_dev/sample.env b/tinyauth_dev/sample.env new file mode 100644 index 0000000..ad79ece --- /dev/null +++ b/tinyauth_dev/sample.env @@ -0,0 +1,7 @@ +# Tinyauth +VOL_PATH=/data +TINYAUTH_IMAGE=ghcr.io/steveiliop56/tinyauth:v5 +TINYAUTH_RESTART=unless-stopped +TINYAUTH_PORT=3000 +TINYAUTH_APPURL=http://localhost:3000 +TINYAUTH_AUTH_USERS=user:$2a$10$ReplaceWithBcryptHash diff --git a/traefik_dev/README.md b/traefik_dev/README.md new file mode 100644 index 0000000..ada8143 --- /dev/null +++ b/traefik_dev/README.md @@ -0,0 +1,61 @@ +# Traefik + +## Overview + +Modern reverse proxy and load balancer designed for microservices and Docker environments. + +## Project Details + +- **Project Repository:** [GitHub](https://github.com/traefik/traefik) +- **Container Image:** [traefik](https://hub.docker.com/_/traefik) +- **Documentation:** [doc.traefik.io](https://doc.traefik.io/traefik/) +- **Reverse Proxy Port:** `8080` (dashboard) + +## Getting Started + +1. Start the container: `docker compose up -d` +2. Open http://localhost:8080 in your browser +3. Follow the initial setup wizard to configure the application + +## Environment Variable Notes + + TRAEFIK_HTTP_PORT / TRAEFIK_HTTPS_PORT – entrypoint ports + TRAEFIK_DASHBOARD_PORT – dashboard/API port + +## Volume Notes + + /var/run/docker.sock – read-only Docker socket for service discovery + /letsencrypt – ACME certificate storage + +## Network Notes + +Requires proxy network + +## Docker Run + +```bash +docker run -d \ + --name traefik \ + -p 80:80 -p 443:443 -p 8080:8080 \ + -v /var/run/docker.sock:/var/run/docker.sock:ro \ + traefik:v3 \ + --api.insecure=true --providers.docker=true \ + --providers.docker.exposedbydefault=false \ + --entrypoints.web.address=:80 --entrypoints.websecure.address=:443 +``` + +## Additional Notes / Gotchas + +This repo assumes Nginx Proxy Manager as the main reverse proxy — running Traefik alongside it will conflict on ports 80/443 unless you change them. +`--api.insecure=true` exposes the dashboard without auth; do not expose port 8080 publicly. + +## Dockhand Stack, Deploy from Git + +Cookbooks Repository +stackname: traefik_dev +Compose file path: traefik_dev/compose.yaml +Additional env file (optional): traefik_dev/sample.env + +Then "Load" traefik_dev/sample.env into the Environmental variables in dockhand + +Create the Stack diff --git a/traefik_dev/compose.yaml b/traefik_dev/compose.yaml new file mode 100644 index 0000000..09b6135 --- /dev/null +++ b/traefik_dev/compose.yaml @@ -0,0 +1,23 @@ +services: + traefik: + image: ${TRAEFIK_IMAGE:-traefik:v3} + restart: ${TRAEFIK_RESTART:-unless-stopped} + volumes: + - /var/run/docker.sock:/var/run/docker.sock:ro + - ${VOL_PATH:-/data}/traefik/letsencrypt:/letsencrypt + ports: + - ${TRAEFIK_HTTP_PORT:-80}:80 + - ${TRAEFIK_HTTPS_PORT:-443}:443 + - ${TRAEFIK_DASHBOARD_PORT:-8080}:8080 + networks: + - proxy + command: + - --api.insecure=true + - --providers.docker=true + - --providers.docker.exposedbydefault=false + - --entrypoints.web.address=:80 + - --entrypoints.websecure.address=:443 + +networks: + proxy: + external: true diff --git a/traefik_dev/sample.env b/traefik_dev/sample.env new file mode 100644 index 0000000..8dbed9a --- /dev/null +++ b/traefik_dev/sample.env @@ -0,0 +1,7 @@ +# Traefik +VOL_PATH=/data +TRAEFIK_IMAGE=traefik:v3 +TRAEFIK_RESTART=unless-stopped +TRAEFIK_HTTP_PORT=80 +TRAEFIK_HTTPS_PORT=443 +TRAEFIK_DASHBOARD_PORT=8080 diff --git a/tugtainer_dev/README.md b/tugtainer_dev/README.md new file mode 100644 index 0000000..de96221 --- /dev/null +++ b/tugtainer_dev/README.md @@ -0,0 +1,58 @@ +# Tugtainer + +## Overview + +Web UI alternative to Watchtower for checking and automating Docker container image updates. + +## Project Details + +- **Project Repository:** [GitHub](https://github.com/Quenary/tugtainer) +- **Container Image:** [ghcr.io/quenary/tugtainer](https://github.com/Quenary/tugtainer/pkgs/container/tugtainer) +- **Documentation:** [GitHub README](https://github.com/Quenary/tugtainer) +- **Reverse Proxy Port:** `80` + +## Getting Started + +1. Start the container: `docker compose up -d` +2. Open http://localhost:9412 in your browser +3. Follow the initial setup wizard to configure the application + +## Environment Variable Notes + + TUGTAINER_PORT – host port for the web UI + +## Volume Notes + + /tugtainer – application data + /var/run/docker.sock – read-only Docker socket (required) + +## Network Notes + +Requires proxy network + +## Docker Run + +```bash +docker run -d \ + --name tugtainer \ + -p 9412:80 \ + -v /data/tugtainer:/tugtainer \ + -v /var/run/docker.sock:/var/run/docker.sock:ro \ + ghcr.io/quenary/tugtainer:1 +``` + +## Additional Notes / Gotchas + +Upstream states the project is not production-ready — home lab use only. +It is dependency-aware and can update compose stacks in the right order. + +## Dockhand Stack, Deploy from Git + +Cookbooks Repository +stackname: tugtainer_dev +Compose file path: tugtainer_dev/compose.yaml +Additional env file (optional): tugtainer_dev/sample.env + +Then "Load" tugtainer_dev/sample.env into the Environmental variables in dockhand + +Create the Stack diff --git a/tugtainer_dev/compose.yaml b/tugtainer_dev/compose.yaml new file mode 100644 index 0000000..66f274e --- /dev/null +++ b/tugtainer_dev/compose.yaml @@ -0,0 +1,15 @@ +services: + tugtainer: + image: ${TUGTAINER_IMAGE:-ghcr.io/quenary/tugtainer:1} + restart: ${TUGTAINER_RESTART:-unless-stopped} + volumes: + - ${VOL_PATH:-/data}/tugtainer:/tugtainer + - /var/run/docker.sock:/var/run/docker.sock:ro + ports: + - ${TUGTAINER_PORT:-9412}:80 + networks: + - proxy + +networks: + proxy: + external: true diff --git a/tugtainer_dev/sample.env b/tugtainer_dev/sample.env new file mode 100644 index 0000000..fbc13dc --- /dev/null +++ b/tugtainer_dev/sample.env @@ -0,0 +1,5 @@ +# Tugtainer +VOL_PATH=/data +TUGTAINER_IMAGE=ghcr.io/quenary/tugtainer:1 +TUGTAINER_RESTART=unless-stopped +TUGTAINER_PORT=9412 diff --git a/twenty_dev/README.md b/twenty_dev/README.md new file mode 100644 index 0000000..a68a43e --- /dev/null +++ b/twenty_dev/README.md @@ -0,0 +1,60 @@ +# Twenty CRM + +## Overview + +Modern open-source CRM system for managing customers and pipelines. + +## Project Details + +- **Project Repository:** [GitHub](https://github.com/twentyhq/twenty) +- **Container Image:** [twentycrm/twenty](https://hub.docker.com/r/twentycrm/twenty) +- **Documentation:** [twenty.com](https://twenty.com/developers/section/self-hosting) +- **Reverse Proxy Port:** `3000` + +## Getting Started + +1. Start the container: `docker compose up -d` +2. Open http://localhost:3000 in your browser +3. Follow the initial setup wizard to configure the application + +## Environment Variable Notes + + TWENTY_APP_SECRET – generate with `openssl rand -base64 32` + TWENTY_SERVER_URL – public URL of the instance + +## Volume Notes + + /app/packages/twenty-server/.local-storage – uploaded files (shared by server and worker) + /var/lib/postgresql/data – PostgreSQL data + +## Network Notes + +Requires proxy network + +## Docker Run + +```bash +docker run -d \ + --name twenty \ + -p 3000:3000 \ + -e SERVER_URL=http://localhost:3000 \ + -e APP_SECRET=changeme \ + -e PG_DATABASE_URL=postgres://twenty:pass@dbhost:5432/default \ + -e REDIS_URL=redis://redishost:6379 \ + twentycrm/twenty:latest +``` + +## Additional Notes / Gotchas + +The worker container is required for background jobs (sync, imports). Both containers must share the same APP_SECRET and storage volume. + +## Dockhand Stack, Deploy from Git + +Cookbooks Repository +stackname: twenty_dev +Compose file path: twenty_dev/compose.yaml +Additional env file (optional): twenty_dev/sample.env + +Then "Load" twenty_dev/sample.env into the Environmental variables in dockhand + +Create the Stack diff --git a/twenty_dev/compose.yaml b/twenty_dev/compose.yaml new file mode 100644 index 0000000..df4015e --- /dev/null +++ b/twenty_dev/compose.yaml @@ -0,0 +1,62 @@ +services: + twenty: + image: ${TWENTY_IMAGE:-twentycrm/twenty:latest} + restart: ${TWENTY_RESTART:-unless-stopped} + volumes: + - ${VOL_PATH:-/data}/twenty/data:/app/packages/twenty-server/.local-storage + environment: + - SERVER_URL=${TWENTY_SERVER_URL:-http://localhost:3000} + - APP_SECRET=${TWENTY_APP_SECRET:-ChangeThisPassword} + - PG_DATABASE_URL=postgres://twenty:${TWENTY_DB_PASSWORD:-ChangeThisPassword}@twenty-db:5432/default + - REDIS_URL=redis://twenty-redis:6379 + ports: + - ${TWENTY_PORT:-3000}:3000 + networks: + - proxy + - internal + depends_on: + - twenty-db + - twenty-redis + + twenty-worker: + image: ${TWENTY_IMAGE:-twentycrm/twenty:latest} + restart: ${TWENTY_RESTART:-unless-stopped} + volumes: + - ${VOL_PATH:-/data}/twenty/data:/app/packages/twenty-server/.local-storage + environment: + - SERVER_URL=${TWENTY_SERVER_URL:-http://localhost:3000} + - APP_SECRET=${TWENTY_APP_SECRET:-ChangeThisPassword} + - PG_DATABASE_URL=postgres://twenty:${TWENTY_DB_PASSWORD:-ChangeThisPassword}@twenty-db:5432/default + - REDIS_URL=redis://twenty-redis:6379 + - DISABLE_DB_MIGRATIONS=true + networks: + - internal + depends_on: + - twenty-db + - twenty-redis + command: + - yarn + - worker:prod + + twenty-db: + image: ${POSTGRES_IMAGE:-postgres:16-alpine} + restart: ${TWENTY_RESTART:-unless-stopped} + volumes: + - ${VOL_PATH:-/data}/twenty/db:/var/lib/postgresql/data + environment: + - POSTGRES_DB=default + - POSTGRES_USER=twenty + - POSTGRES_PASSWORD=${TWENTY_DB_PASSWORD:-ChangeThisPassword} + networks: + - internal + + twenty-redis: + image: ${REDIS_IMAGE:-redis:7-alpine} + restart: ${TWENTY_RESTART:-unless-stopped} + networks: + - internal + +networks: + proxy: + external: true + internal: diff --git a/twenty_dev/sample.env b/twenty_dev/sample.env new file mode 100644 index 0000000..af05333 --- /dev/null +++ b/twenty_dev/sample.env @@ -0,0 +1,10 @@ +# Twenty CRM +VOL_PATH=/data +TWENTY_IMAGE=twentycrm/twenty:latest +POSTGRES_IMAGE=postgres:16-alpine +REDIS_IMAGE=redis:7-alpine +TWENTY_RESTART=unless-stopped +TWENTY_PORT=3000 +TWENTY_SERVER_URL=http://localhost:3000 +TWENTY_APP_SECRET=ChangeThisPassword +TWENTY_DB_PASSWORD=ChangeThisPassword diff --git a/voidauth_dev/README.md b/voidauth_dev/README.md new file mode 100644 index 0000000..6ec2a22 --- /dev/null +++ b/voidauth_dev/README.md @@ -0,0 +1,58 @@ +# VoidAuth + +## Overview + +Lightweight self-hosted authentication system (SSO / identity provider). + +## Project Details + +- **Project Repository:** [GitHub](https://github.com/voidauth/voidauth) +- **Container Image:** [voidauth/voidauth](https://hub.docker.com/r/voidauth/voidauth) +- **Documentation:** [voidauth.app](https://voidauth.app/) +- **Reverse Proxy Port:** `3000` + +## Getting Started + +1. Start the container: `docker compose up -d` +2. Open http://localhost:3000 in your browser +3. Follow the initial setup wizard to configure the application + +## Environment Variable Notes + + VOIDAUTH_STORAGE_KEY – encryption key, generate with `openssl rand -hex 32`; do not change after setup + VOIDAUTH_APP_URL – public URL of the instance + +## Volume Notes + + /var/lib/postgresql/data – PostgreSQL data + +## Network Notes + +Requires proxy network + +## Docker Run + +```bash +docker run -d \ + --name voidauth \ + -p 3000:3000 \ + -e APP_URL=http://localhost:3000 \ + -e STORAGE_KEY=changeme \ + -e DB_HOST=dbhost -e DB_PASSWORD=pass \ + voidauth/voidauth:latest +``` + +## Additional Notes / Gotchas + +See also authentik_dev, authelia_dev, and tinyauth_dev in this repo for alternative auth stacks. + +## Dockhand Stack, Deploy from Git + +Cookbooks Repository +stackname: voidauth_dev +Compose file path: voidauth_dev/compose.yaml +Additional env file (optional): voidauth_dev/sample.env + +Then "Load" voidauth_dev/sample.env into the Environmental variables in dockhand + +Create the Stack diff --git a/voidauth_dev/compose.yaml b/voidauth_dev/compose.yaml new file mode 100644 index 0000000..78adad9 --- /dev/null +++ b/voidauth_dev/compose.yaml @@ -0,0 +1,33 @@ +services: + voidauth: + image: ${VOIDAUTH_IMAGE:-voidauth/voidauth:latest} + restart: ${VOIDAUTH_RESTART:-unless-stopped} + environment: + - APP_URL=${VOIDAUTH_APP_URL:-http://localhost:3000} + - STORAGE_KEY=${VOIDAUTH_STORAGE_KEY:-ChangeThisPassword} + - DB_HOST=voidauth-db + - DB_PASSWORD=${VOIDAUTH_DB_PASSWORD:-ChangeThisPassword} + ports: + - ${VOIDAUTH_PORT:-3000}:3000 + networks: + - proxy + - internal + depends_on: + - voidauth-db + + voidauth-db: + image: ${POSTGRES_IMAGE:-postgres:17-alpine} + restart: ${VOIDAUTH_RESTART:-unless-stopped} + volumes: + - ${VOL_PATH:-/data}/voidauth/db:/var/lib/postgresql/data + environment: + - POSTGRES_DB=voidauth + - POSTGRES_USER=postgres + - POSTGRES_PASSWORD=${VOIDAUTH_DB_PASSWORD:-ChangeThisPassword} + networks: + - internal + +networks: + proxy: + external: true + internal: diff --git a/voidauth_dev/sample.env b/voidauth_dev/sample.env new file mode 100644 index 0000000..f6daf50 --- /dev/null +++ b/voidauth_dev/sample.env @@ -0,0 +1,9 @@ +# VoidAuth +VOL_PATH=/data +VOIDAUTH_IMAGE=voidauth/voidauth:latest +POSTGRES_IMAGE=postgres:17-alpine +VOIDAUTH_RESTART=unless-stopped +VOIDAUTH_PORT=3000 +VOIDAUTH_APP_URL=http://localhost:3000 +VOIDAUTH_STORAGE_KEY=ChangeThisPassword +VOIDAUTH_DB_PASSWORD=ChangeThisPassword