Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
31 changes: 20 additions & 11 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -147,6 +147,7 @@ ScaleTail provides ready-to-run [Docker Compose](https://docs.docker.com/compose
| 📝 **Nanote** | A lightweight, self-hosted note-taking app with Markdown support. | [Details](services/nanote) |
| 🤖 **Open WebUI** | A self-hosted AI platform with a ChatGPT-style interface for local and cloud-based models. | [Details](services/open-webui) |
| 🔗 **Pingvin Share** | **PROJECT ARCHIVED** A self-hosted file sharing platform. | [Details](services/pingvin-share) |
| 📅 **Radicale** | A lightweight CalDAV and CardDAV server for self-hosted calendar, to-do, and contact sync. | [Details](services/radicale) |
| 🔄 **Resilio Sync** | A fast, reliable, and simple file sync and share solution. | [Details](services/resilio-sync) |
| 🗂️ **Stirling-PDF** | A web application for managing and editing PDF files. | [Details](services/stirlingpdf) |
| 📄 **BentoPDF** | A lightweight, self-hosted web app for viewing and managing PDF documents. | [Details](services/bentopdf) |
Expand All @@ -173,6 +174,7 @@ ScaleTail provides ready-to-run [Docker Compose](https://docs.docker.com/compose
| 🛠️ **Coder** | Self-hosted cloud dev environments with browser IDEs, Terraform-managed workspaces. | [Details](services/coder) |
| 🔧 **Cyberchef** | A web app for encryption, encoding, compression, and data analysis. | [Details](services/cyberchef) |
| 🐳 **Dockhand** | A modern, lightweight Docker management UI for containers and Compose stacks. | [Details](services/dockhand) |
| 🐳 **Dockge** | A lightweight, self-hosted Docker Compose stack manager with a clean web UI. | [Details](services/dockge) |
| 🖥️ **Dozzle** | A real-time log viewer for Docker containers. | [Details](services/dozzle) |
| 🔁 **FossFLOW** | A self-hosted tool to make beautiful isometric infrastructure diagrams. | [Details](services/fossflow) |
| 🖥️ **GitSave** | A self-hosted service to back up your GitHub repositories via a simple REST API and scheduled runs. | [Details](services/gitsave) |
Expand Down Expand Up @@ -269,6 +271,13 @@ A huge thank you to all our contributors! ScaleTail wouldn’t be what it is tod
<sub><b>jackspiering</b></sub>
</a>
</td>
<td align="center">
<a href="https://github.com/michaelhodges">
<img src="https://avatars.githubusercontent.com/u/3329567?v=4" width="100;" alt="michaelhodges"/>
<br />
<sub><b>michaelhodges</b></sub>
</a>
</td>
<td align="center">
<a href="https://github.com/ChillBill77">
<img src="https://avatars.githubusercontent.com/u/129118422?v=4" width="100;" alt="ChillBill77"/>
Expand All @@ -277,10 +286,10 @@ A huge thank you to all our contributors! ScaleTail wouldn’t be what it is tod
</a>
</td>
<td align="center">
<a href="https://github.com/michaelhodges">
<img src="https://avatars.githubusercontent.com/u/3329567?v=4" width="100;" alt="michaelhodges"/>
<a href="https://github.com/lcs-crr">
<img src="https://avatars.githubusercontent.com/u/98816628?v=4" width="100;" alt="lcs-crr"/>
<br />
<sub><b>michaelhodges</b></sub>
<sub><b>lcs-crr</b></sub>
</a>
</td>
<td align="center">
Expand All @@ -290,15 +299,15 @@ A huge thank you to all our contributors! ScaleTail wouldn’t be what it is tod
<sub><b>adamsthws</b></sub>
</a>
</td>
</tr>
<tr>
<td align="center">
<a href="https://github.com/theryukverse">
<img src="https://avatars.githubusercontent.com/u/22323518?v=4" width="100;" alt="theryukverse"/>
<br />
<sub><b>theryukverse</b></sub>
</a>
</td>
</tr>
<tr>
<td align="center">
<a href="https://github.com/KhaaL">
<img src="https://avatars.githubusercontent.com/u/692524?v=4" width="100;" alt="KhaaL"/>
Expand Down Expand Up @@ -334,15 +343,15 @@ A huge thank you to all our contributors! ScaleTail wouldn’t be what it is tod
<sub><b>MajnuRangeela</b></sub>
</a>
</td>
</tr>
<tr>
<td align="center">
<a href="https://github.com/mikkotor">
<img src="https://avatars.githubusercontent.com/u/1879886?v=4" width="100;" alt="mikkotor"/>
<br />
<sub><b>mikkotor</b></sub>
</a>
</td>
</tr>
<tr>
<td align="center">
<a href="https://github.com/NI-R0">
<img src="https://avatars.githubusercontent.com/u/98448863?v=4" width="100;" alt="NI-R0"/>
Expand Down Expand Up @@ -378,15 +387,15 @@ A huge thank you to all our contributors! ScaleTail wouldn’t be what it is tod
<sub><b>guybrush115</b></sub>
</a>
</td>
</tr>
<tr>
<td align="center">
<a href="https://github.com/pjv">
<img src="https://avatars.githubusercontent.com/u/327716?v=4" width="100;" alt="pjv"/>
<br />
<sub><b>pjv</b></sub>
</a>
</td>
</tr>
<tr>
<td align="center">
<a href="https://github.com/wedge22">
<img src="https://avatars.githubusercontent.com/u/34723349?v=4" width="100;" alt="wedge22"/>
Expand Down Expand Up @@ -422,15 +431,15 @@ A huge thank you to all our contributors! ScaleTail wouldn’t be what it is tod
<sub><b>gaetan-petit</b></sub>
</a>
</td>
</tr>
<tr>
<td align="center">
<a href="https://github.com/dfilvtov">
<img src="https://avatars.githubusercontent.com/u/93210861?v=4" width="100;" alt="dfilvtov"/>
<br />
<sub><b>dfilvtov</b></sub>
</a>
</td>
</tr>
<tr>
<td align="center">
<a href="https://github.com/cdkooistra">
<img src="https://avatars.githubusercontent.com/u/70811244?v=4" width="100;" alt="cdkooistra"/>
Expand Down
19 changes: 19 additions & 0 deletions services/dockge/.env
Original file line number Diff line number Diff line change
@@ -0,0 +1,19 @@
#version=1.1
#URL=https://github.com/tailscale-dev/ScaleTail
#COMPOSE_PROJECT_NAME= # Optional: only use when running multiple deployments on the same infrastructure.

# Service Configuration
SERVICE=dockge # Service name (e.g., adguard). Used as hostname in Tailscale and for container naming (app-${SERVICE}).
IMAGE_URL=louislam/dockge:1 # Docker image URL from container registry (e.g., adguard/adguard-home).

# Network Configuration
SERVICEPORT= # Port to expose to local network. Uncomment the "ports:" section in compose.yaml to enable.
DNS_SERVER=9.9.9.9 # Preferred DNS server for Tailscale. Uncomment the "dns:" section in compose.yaml to enable.

# Tailscale Configuration
TS_AUTHKEY= # Auth key from https://tailscale.com/admin/authkeys. See: https://tailscale.com/kb/1085/auth-keys#generate-an-auth-key for instructions.

# Optional Service variables
STACKS_DIR= # Absolute path on host to store stack files. Must be bind mounted to the same path in compose.yaml.
PUID=1000 # Set the stack file/dir ownership to this user
PGID=1000 # Set the stack file/dir ownership to this group
23 changes: 23 additions & 0 deletions services/dockge/README.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,23 @@
# Dockge with Tailscale Sidecar Configuration

This Docker Compose configuration sets up Dockge with a Tailscale sidecar container, enabling secure, private access to your Docker Compose management UI over your Tailnet. With this setup, your Dockge instance is not exposed to the public internet and is only accessible from authorized devices connected via Tailscale.

## Dockge

[Dockge](https://github.com/louislam/dockge) is a lightweight, self-hosted Docker Compose stack manager built for simplicity and control. Created by the developer behind Uptime Kuma, Dockge provides an intuitive web interface for managing, editing, and deploying docker-compose.yml stacks without relying solely on the CLI.

It is especially well-suited for homelabs, self-hosted environments, and DevOps workflows where multiple services are managed via Docker Compose.

## Key Features

* 🐳 Web-based Docker Compose stack management
* ✏️ Live editing of docker-compose.yml files
* ▶️ One-click start, stop, and restart of stacks
* 📜 Real-time container logs viewer
* 📦 Multi-stack organization via directories
* ⚡ Lightweight and fast interface
* 🔍 Clear visibility into container status

## Important Notice

Make sure to populate the `STACKS_DIR=` variable in the `.env` before first startup.
67 changes: 67 additions & 0 deletions services/dockge/compose.yaml
Comment thread
crypt0rr marked this conversation as resolved.
Original file line number Diff line number Diff line change
@@ -0,0 +1,67 @@
configs:
ts-serve:
content: |
{"TCP":{"443":{"HTTPS":true}},
"Web":{"$${TS_CERT_DOMAIN}:443":
{"Handlers":{"/":
{"Proxy":"http://127.0.0.1:5001"}}}},
"AllowFunnel":{"$${TS_CERT_DOMAIN}:443":false}}

services:
# Make sure you have updated/checked the .env file with the correct variables.
# All the ${ xx } need to be defined there.
# Tailscale Sidecar Configuration
tailscale:
image: tailscale/tailscale:latest # Image to be used
container_name: tailscale-${SERVICE} # Name for local container management
hostname: ${SERVICE} # Name used within your Tailscale environment
environment:
- TS_AUTHKEY=${TS_AUTHKEY}
- TS_STATE_DIR=/var/lib/tailscale
- TS_SERVE_CONFIG=/config/serve.json # Tailscale Serve configuration to expose the web interface on your local Tailnet - remove this line if not required
- TS_USERSPACE=false
- TS_ENABLE_HEALTH_CHECK=true # Enable healthcheck endpoint: "/healthz"
- TS_LOCAL_ADDR_PORT=127.0.0.1:41234 # The <addr>:<port> for the healthz endpoint
#- TS_ACCEPT_DNS=true # Uncomment when using MagicDNS
- TS_AUTH_ONCE=true
configs:
- source: ts-serve
target: /config/serve.json
volumes:
- ./config:/config # Config folder used to store Tailscale files - you may need to change the path
- ./ts/state:/var/lib/tailscale # Tailscale requirement - you may need to change the path
devices:
- /dev/net/tun:/dev/net/tun # Network configuration for Tailscale to work
cap_add:
- net_admin # Tailscale requirement
#ports:
# - 0.0.0.0:${SERVICEPORT}:${SERVICEPORT} # Binding port ${SERVICE}PORT to the local network - may be removed if only exposure to your Tailnet is required
# If any DNS issues arise, use your preferred DNS provider by uncommenting the config below
#dns:
# - ${DNS_SERVER}
healthcheck:
test: [ "CMD", "wget", "--spider", "-q", "http://127.0.0.1:41234/healthz" ] # Check Tailscale has a Tailnet IP and is operational
interval: 1m # How often to perform the check
timeout: 10s # Time to wait for the check to succeed
retries: 3 # Number of retries before marking as unhealthy
start_period: 10s # Time to wait before starting health checks
restart: always

# ${SERVICE}
application:
image: ${IMAGE_URL} # Image to be used
network_mode: service:tailscale # Sidecar configuration to route ${SERVICE} through Tailscale
container_name: app-${SERVICE} # Name for local container management
environment:
# Varibles are delared in .env file.
- DOCKGE_STACKS_DIR=${STACKS_DIR} # Tell Dockge where your stacks directory is
- PUID=${PUID} # Set the stack file/dir ownership to this user
- PGID=${PGID} # Set the stack file/dir ownership to this group
volumes:
- ./${SERVICE}-data/app/config:/app/data
- /var/run/docker.sock:/var/run/docker.sock
- ${STACKS_DIR}:${STACKS_DIR}
depends_on:
tailscale:
condition: service_healthy
restart: always
17 changes: 17 additions & 0 deletions services/radicale/.env
Original file line number Diff line number Diff line change
@@ -0,0 +1,17 @@
#version=1.1
#URL=https://github.com/tailscale-dev/ScaleTail
#COMPOSE_PROJECT_NAME= # Optional: only use when running multiple deployments on the same infrastructure.

# Service Configuration
SERVICE=radicale # Service name (e.g., adguard). Used as hostname in Tailscale and for container naming (app-${SERVICE}).
IMAGE_URL=tomsquest/docker-radicale # Docker image URL from container registry (e.g., adguard/adguard-home).

# Network Configuration
SERVICEPORT=5232 # Port to expose to local network. Uncomment the "ports:" section in compose.yaml to enable.
DNS_SERVER=9.9.9.9 # Preferred DNS server for Tailscale. Uncomment the "dns:" section in compose.yaml to enable.

# Tailscale Configuration
TS_AUTHKEY=... # Auth key from https://tailscale.com/admin/authkeys. See: https://tailscale.com/kb/1085/auth-keys#generate-an-auth-key for instructions.

# Optional Service variables
# PUID=1000
33 changes: 33 additions & 0 deletions services/radicale/README.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,33 @@
# Radicale with Tailscale Sidecar Configuration

This Docker Compose configuration sets up [Radicale](https://radicale.org/) with Tailscale as a sidecar container to keep the app reachable over your Tailnet.

## Radicale

[Radicale](https://radicale.org/) is a small but powerful CalDAV (calendars, to-do lists) and CardDAV (contacts) server. It is lightweight, easy to configure, and requires minimal resources, making it a great self-hosted alternative to cloud-based calendar and contact sync services.

## Key Features

- CalDAV and CardDAV support for syncing calendars, to-do lists, and contacts
- Works with any compliant client (Thunderbird, GNOME Calendar, DAVx5, Apple Calendar, etc.)
- Lightweight with minimal resource usage
- Simple file-based storage
- Web interface for managing collections
- Built-in access control and authentication

## Configuration Overview

In this setup, the `tailscale-radicale` service runs Tailscale, which manages secure networking for Radicale. The `radicale` service utilizes the Tailscale network stack via Docker's `network_mode: service:` configuration. This keeps the app Tailnet-only unless you intentionally expose ports.

The container runs with hardened security settings: read-only filesystem, no new privileges, dropped capabilities, and resource limits (256M memory, 50 pids).

## Prerequisites

- This image uses [tomsquest/docker-radicale](https://github.com/tomsquest/docker-radicale). Refer to their documentation for advanced configuration options.
- To configure users and authentication, mount a custom config file or refer to the [Radicale documentation](https://radicale.org/v3.html#configuration).

## Files to check

Please check the following contents for validity as some variables need to be defined upfront.

- `.env` // Main variable: `TS_AUTHKEY`
71 changes: 71 additions & 0 deletions services/radicale/compose.yaml
Original file line number Diff line number Diff line change
@@ -0,0 +1,71 @@
configs:
ts-serve:
content: |
{"TCP":{"443":{"HTTPS":true}},
"Web":{"$${TS_CERT_DOMAIN}:443":
{"Handlers":{"/":
{"Proxy":"http://127.0.0.1:5232"}}}},
"AllowFunnel":{"$${TS_CERT_DOMAIN}:443":false}}

services:
# Make sure you have updated/checked the .env file with the correct variables.
# All the ${ xx } need to be defined there.
# Tailscale Sidecar Configuration
tailscale:
image: tailscale/tailscale:latest # Image to be used
container_name: tailscale-${SERVICE} # Name for local container management
hostname: ${SERVICE} # Name used within your Tailscale environment
environment:
- TS_AUTHKEY=${TS_AUTHKEY}
- TS_STATE_DIR=/var/lib/tailscale
- TS_SERVE_CONFIG=/config/serve.json # Tailscale Serve configuration to expose the web interface on your local Tailnet - remove this line if not required
- TS_USERSPACE=false
- TS_ENABLE_HEALTH_CHECK=true # Enable healthcheck endpoint: "/healthz"
- TS_LOCAL_ADDR_PORT=127.0.0.1:41234 # The <addr>:<port> for the healthz endpoint
#- TS_ACCEPT_DNS=true # Uncomment when using MagicDNS
- TS_AUTH_ONCE=true
configs:
- source: ts-serve
target: /config/serve.json
volumes:
- ./config:/config # Config folder used to store Tailscale files - you may need to change the path
- ./ts/state:/var/lib/tailscale # Tailscale requirement - you may need to change the path
devices:
- /dev/net/tun:/dev/net/tun # Network configuration for Tailscale to work
cap_add:
- net_admin # Tailscale requirement
#ports:
# - 0.0.0.0:${SERVICEPORT}:${SERVICEPORT} # Binding port ${SERVICE}PORT to the local network - may be removed if only exposure to your Tailnet is required
# If any DNS issues arise, use your preferred DNS provider by uncommenting the config below
#dns:
# - ${DNS_SERVER}
healthcheck:
test: [ "CMD", "wget", "--spider", "-q", "http://127.0.0.1:41234/healthz" ] # Check Tailscale has a Tailnet IP and is operational
interval: 1m # How often to perform the check
timeout: 10s # Time to wait for the check to succeed
retries: 3 # Number of retries before marking as unhealthy
start_period: 10s # Time to wait before starting health checks
restart: always

# ${SERVICE}
application:
image: ${IMAGE_URL} # Image to be used
network_mode: service:tailscale # Sidecar configuration to route ${SERVICE} through Tailscale
container_name: app-${SERVICE} # Name for local container management
environment:
- TAKE_FILE_OWNERSHIP=true
volumes:
- ./${SERVICE}-data/app/data:/data
command: ["/venv/bin/radicale", "--storage-filesystem-folder", "/data/collections"]
depends_on:
tailscale:
condition: service_healthy
healthcheck:
test:
- CMD-SHELL
- wget -qO- http://127.0.0.1:5232/.well-known/carddav || exit 1
interval: 1m # How often to perform the check
timeout: 10s # Time to wait for the check to succeed
retries: 3 # Number of retries before marking as unhealthy
start_period: 30s # Time to wait before starting health checks
restart: always