Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
25 commits
Select commit Hold shift + click to select a range
8340b1a
Added dockge and radicale
lcs-crr Apr 11, 2026
b81dbff
re-added paperless
lcs-crr Apr 11, 2026
c11984d
Updated readme
lcs-crr Apr 11, 2026
98a47bb
Merge branch 'main' into main
crypt0rr Apr 13, 2026
16f0fba
docs(contributors): update README contributors
github-actions[bot] Apr 13, 2026
9212428
docs(contributors): update README contributors
github-actions[bot] Apr 14, 2026
c8264bc
docs(contributors): update README contributors
github-actions[bot] Apr 15, 2026
6e52692
Merge branch 'main' into main
lcs-crr Apr 15, 2026
6fcf750
docs(contributors): update README contributors
github-actions[bot] Apr 15, 2026
f46cf4e
Merge branch 'main' into main
crypt0rr Apr 18, 2026
87eb4bc
docs(contributor): contrib-readme-action has updated readme
github-actions[bot] Apr 18, 2026
adfc5b0
Restored template format
lcs-crr Apr 27, 2026
9b561af
Merge branch 'main' into main
crypt0rr Apr 29, 2026
2341c3d
docs(contributor): contrib-readme-action has updated readme
github-actions[bot] Apr 29, 2026
166d217
refactor(dockge): update .env and README for clarity; adjust compose.…
crypt0rr Apr 29, 2026
aebb048
docs(dockge): add comments for SERVICE and IMAGE_URL in .env for clarity
crypt0rr Apr 29, 2026
8627e77
docs(README): add Dockge service to the list of available configurations
crypt0rr Apr 29, 2026
c127e8c
fix(radicale): set SERVICEPORT to 5232 for local network exposure
crypt0rr Apr 29, 2026
5fd41e5
Added documentation on how to get started and creating users
lcs-crr May 7, 2026
4032385
Merge branch 'main' of github.com:lcs-crr/ScaleTail
lcs-crr May 7, 2026
40920d7
Apply suggestions from code review
lcs-crr May 13, 2026
228ae8a
Minor tweaks to README
lcs-crr May 13, 2026
611d665
Merge branch 'main' into main
lcs-crr May 13, 2026
dd1ea81
md lint
lcs-crr May 13, 2026
8cc49ae
docs(contributor): contrib-readme-action has updated readme
github-actions[bot] May 13, 2026
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
37 changes: 23 additions & 14 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 @@ -270,17 +272,24 @@ 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/ChillBill77">
<img src="https://avatars.githubusercontent.com/u/129118422?v=4" width="100;" alt="ChillBill77"/>
<a href="https://github.com/michaelhodges">
<img src="https://avatars.githubusercontent.com/u/3329567?v=4" width="100;" alt="michaelhodges"/>
<br />
<sub><b>ChillBill77</b></sub>
<sub><b>michaelhodges</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"/>
<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">
<a href="https://github.com/ChillBill77">
<img src="https://avatars.githubusercontent.com/u/129118422?v=4" width="100;" alt="ChillBill77"/>
<br />
<sub><b>ChillBill77</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
20 changes: 20 additions & 0 deletions services/dockge/.env
Original file line number Diff line number Diff line change
@@ -0,0 +1,20 @@
#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.
Comment thread
lcs-crr marked this conversation as resolved.
# For example, create a folder in your docker compose folder with the name stacks (mkdir stacks) and use /path/to/docker-compose-container-folder/stacks.
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
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
80 changes: 80 additions & 0 deletions services/radicale/README.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,80 @@
# 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).

## Creating Users

Radicale uses `htpasswd` for authentication. To set up users:

1. **Create the required directories:**

```bash
set -a && source .env && set +a
mkdir -p ./${SERVICE}-data/config
```

2. **Create an `htpasswd` file** with your first user (requires `apache2-utils` on Debian/Ubuntu or `httpd-tools` on Fedora):

```bash
htpasswd -B -c ./${SERVICE}-data/users <username>
```

To add more users without overwriting the file, omit `-c`:

```bash
htpasswd -B ./${SERVICE}-data/users <username>
```

3. **Fill out config file**:

```bash
nano ./${SERVICE}-data/config/radicale.conf
```

With:

```ini
[auth]
type = htpasswd
htpasswd_filename = /config/users
htpasswd_encryption = bcrypt

[storage]
filesystem_folder = /data/collections
```

4. **Restart the stack:**

```bash
docker compose down && docker compose up -d
```

## Files to check

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

- `.env` — Main variable: `TS_AUTHKEY`
Loading