You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
* Added dockge and radicale
* re-added paperless
* Updated readme
* docs(contributors): update README contributors
* docs(contributors): update README contributors
* docs(contributors): update README contributors
* docs(contributors): update README contributors
* docs(contributor): contrib-readme-action has updated readme
* Restored template format
* docs(contributor): contrib-readme-action has updated readme
* refactor(dockge): update .env and README for clarity; adjust compose.yaml environment variables
* docs(dockge): add comments for SERVICE and IMAGE_URL in .env for clarity
* docs(README): add Dockge service to the list of available configurations
* fix(radicale): set SERVICEPORT to 5232 for local network exposure
* Added documentation on how to get started and creating users
* Apply suggestions from code review
Co-authored-by: Jack Spiering <46534141+jackspiering@users.noreply.github.com>
* Minor tweaks to README
* md lint
* docs(contributor): contrib-readme-action has updated readme
* docs(contributor): contrib-readme-action has updated readme
* Clarify Dockge description in README
Updated the description of Dockge to remove 'modern' and clarify the UI.
---------
Co-authored-by: Bart <57799908+crypt0rr@users.noreply.github.com>
Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com>
Co-authored-by: Jack Spiering <46534141+jackspiering@users.noreply.github.com>
#COMPOSE_PROJECT_NAME= # Optional: only use when running multiple deployments on the same infrastructure.
4
+
5
+
# Service Configuration
6
+
SERVICE=dockge# Service name (e.g., adguard). Used as hostname in Tailscale and for container naming (app-${SERVICE}).
7
+
IMAGE_URL=louislam/dockge:1# Docker image URL from container registry (e.g., adguard/adguard-home).
8
+
9
+
# Network Configuration
10
+
SERVICEPORT=# Port to expose to local network. Uncomment the "ports:" section in compose.yaml to enable.
11
+
DNS_SERVER=9.9.9.9# Preferred DNS server for Tailscale. Uncomment the "dns:" section in compose.yaml to enable.
12
+
13
+
# Tailscale Configuration
14
+
TS_AUTHKEY=# Auth key from https://tailscale.com/admin/authkeys. See: https://tailscale.com/kb/1085/auth-keys#generate-an-auth-key for instructions.
15
+
16
+
# Optional Service variables
17
+
STACKS_DIR=# Absolute path on host to store stack files. Must be bind mounted to the same path in compose.yaml.
18
+
# 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.
19
+
PUID=1000# Set the stack file/dir ownership to this user
20
+
PGID=1000# Set the stack file/dir ownership to this group
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.
4
+
5
+
## Dockge
6
+
7
+
[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.
8
+
9
+
It is especially well-suited for homelabs, self-hosted environments, and DevOps workflows where multiple services are managed via Docker Compose.
10
+
11
+
## Key Features
12
+
13
+
* 🐳 Web-based Docker Compose stack management
14
+
* ✏️ Live editing of docker-compose.yml files
15
+
* ▶️ One-click start, stop, and restart of stacks
16
+
* 📜 Real-time container logs viewer
17
+
* 📦 Multi-stack organization via directories
18
+
* ⚡ Lightweight and fast interface
19
+
* 🔍 Clear visibility into container status
20
+
21
+
## Important Notice
22
+
23
+
Make sure to populate the `STACKS_DIR=` variable in the `.env` before first startup.
# Make sure you have updated/checked the .env file with the correct variables.
12
+
# All the ${ xx } need to be defined there.
13
+
# Tailscale Sidecar Configuration
14
+
tailscale:
15
+
image: tailscale/tailscale:latest # Image to be used
16
+
container_name: tailscale-${SERVICE} # Name for local container management
17
+
hostname: ${SERVICE} # Name used within your Tailscale environment
18
+
environment:
19
+
- TS_AUTHKEY=${TS_AUTHKEY}
20
+
- TS_STATE_DIR=/var/lib/tailscale
21
+
- 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_LOCAL_ADDR_PORT=127.0.0.1:41234 # The <addr>:<port> for the healthz endpoint
25
+
#- TS_ACCEPT_DNS=true # Uncomment when using MagicDNS
26
+
- TS_AUTH_ONCE=true
27
+
configs:
28
+
- source: ts-serve
29
+
target: /config/serve.json
30
+
volumes:
31
+
- ./config:/config # Config folder used to store Tailscale files - you may need to change the path
32
+
- ./ts/state:/var/lib/tailscale # Tailscale requirement - you may need to change the path
33
+
devices:
34
+
- /dev/net/tun:/dev/net/tun # Network configuration for Tailscale to work
35
+
cap_add:
36
+
- net_admin # Tailscale requirement
37
+
#ports:
38
+
# - 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
39
+
# If any DNS issues arise, use your preferred DNS provider by uncommenting the config below
40
+
#dns:
41
+
# - ${DNS_SERVER}
42
+
healthcheck:
43
+
test: [ "CMD", "wget", "--spider", "-q", "http://127.0.0.1:41234/healthz" ] # Check Tailscale has a Tailnet IP and is operational
44
+
interval: 1m# How often to perform the check
45
+
timeout: 10s# Time to wait for the check to succeed
46
+
retries: 3# Number of retries before marking as unhealthy
47
+
start_period: 10s# Time to wait before starting health checks
48
+
restart: always
49
+
50
+
# ${SERVICE}
51
+
application:
52
+
image: ${IMAGE_URL} # Image to be used
53
+
network_mode: service:tailscale # Sidecar configuration to route ${SERVICE} through Tailscale
54
+
container_name: app-${SERVICE} # Name for local container management
55
+
environment:
56
+
# Varibles are delared in .env file.
57
+
- DOCKGE_STACKS_DIR=${STACKS_DIR} # Tell Dockge where your stacks directory is
58
+
- PUID=${PUID} # Set the stack file/dir ownership to this user
59
+
- PGID=${PGID} # Set the stack file/dir ownership to this group
#COMPOSE_PROJECT_NAME= # Optional: only use when running multiple deployments on the same infrastructure.
4
+
5
+
# Service Configuration
6
+
SERVICE=radicale# Service name (e.g., adguard). Used as hostname in Tailscale and for container naming (app-${SERVICE}).
7
+
IMAGE_URL=tomsquest/docker-radicale# Docker image URL from container registry (e.g., adguard/adguard-home).
8
+
9
+
# Network Configuration
10
+
SERVICEPORT=5232# Port to expose to local network. Uncomment the "ports:" section in compose.yaml to enable.
11
+
DNS_SERVER=9.9.9.9# Preferred DNS server for Tailscale. Uncomment the "dns:" section in compose.yaml to enable.
12
+
13
+
# Tailscale Configuration
14
+
TS_AUTHKEY=...# Auth key from https://tailscale.com/admin/authkeys. See: https://tailscale.com/kb/1085/auth-keys#generate-an-auth-key for instructions.
This Docker Compose configuration sets up [Radicale](https://radicale.org/) with Tailscale as a sidecar container to keep the app reachable over your Tailnet.
4
+
5
+
## Radicale
6
+
7
+
[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.
8
+
9
+
## Key Features
10
+
11
+
- CalDAV and CardDAV support for syncing calendars, to-do lists, and contacts
12
+
- Works with any compliant client (Thunderbird, GNOME Calendar, DAVx5, Apple Calendar, etc.)
13
+
- Lightweight with minimal resource usage
14
+
- Simple file-based storage
15
+
- Web interface for managing collections
16
+
- Built-in access control and authentication
17
+
18
+
## Configuration Overview
19
+
20
+
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.
21
+
22
+
The container runs with hardened security settings: read-only filesystem, no new privileges, dropped capabilities, and resource limits (256M memory, 50 pids).
23
+
24
+
## Prerequisites
25
+
26
+
- This image uses [tomsquest/docker-radicale](https://github.com/tomsquest/docker-radicale). Refer to their documentation for advanced configuration options.
27
+
- To configure users and authentication, mount a custom config file or refer to the [Radicale documentation](https://radicale.org/v3.html#configuration).
28
+
29
+
## Creating Users
30
+
31
+
Radicale uses `htpasswd` for authentication. To set up users:
32
+
33
+
1.**Create the required directories:**
34
+
35
+
```bash
36
+
set -a &&source .env &&set +a
37
+
mkdir -p ./${SERVICE}-data/config
38
+
```
39
+
40
+
2.**Create an `htpasswd` file** with your first user (requires `apache2-utils` on Debian/Ubuntu or `httpd-tools` on Fedora):
41
+
42
+
```bash
43
+
htpasswd -B -c ./${SERVICE}-data/users <username>
44
+
```
45
+
46
+
To add more users without overwriting the file, omit `-c`:
47
+
48
+
```bash
49
+
htpasswd -B ./${SERVICE}-data/users <username>
50
+
```
51
+
52
+
3.**Fill out config file**:
53
+
54
+
```bash
55
+
nano ./${SERVICE}-data/config/radicale.conf
56
+
```
57
+
58
+
With:
59
+
60
+
```ini
61
+
[auth]
62
+
type = htpasswd
63
+
htpasswd_filename = /config/users
64
+
htpasswd_encryption = bcrypt
65
+
66
+
[storage]
67
+
filesystem_folder = /data/collections
68
+
```
69
+
70
+
4.**Restart the stack:**
71
+
72
+
```bash
73
+
docker compose down && docker compose up -d
74
+
```
75
+
76
+
## Files to check
77
+
78
+
Please check the following contents for validity as some variables need to be defined upfront.
0 commit comments