Skip to content

Caddy Caddy

Description / nameInput element
Container Registry
Container Configuration Root Path
Timezone
Caddy Host Port
Caddy /config Path
Caddy /data Path

Build Status Last Commit

Fast, multi-platform web server and reverse proxy with automatic HTTPS, written in Go.

Port 80
Registry ghcr.io/daemonless/caddy
Daemonless daemonless/caddy
Source caddyserver/caddy
Website caddyserver.com

Version Tags

Tag Description Best For
latest Official upstream Caddy FreeBSD binary (auto-tracks latest release). Most users. Matches Linux Docker behavior.
pkg FreeBSD Quarterly. Uses stable, tested packages. Production stability.
pkg-latest FreeBSD Latest. Rolling package updates. Newest FreeBSD packages.

Root Privileges Required

Podman on FreeBSD currently requires root. All commands must be run as root (or via doas/sudo).

Before deploying, ensure your host environment is ready. See the Quick Start Guide for host setup instructions.

Deployment

services:
  caddy:
    image: "ghcr.io/daemonless/caddy:latest"
    container_name: caddy
    environment:
      - TZ=UTC  # Timezone for the container
    volumes:
      - "/path/to/containers/caddy:/config"
      - "/path/to/containers/caddy/data:/data"
    ports:
      - "80:80"
      - "443:443"
      - "443:443"
    restart: unless-stopped
1
2
3
4
# .env

DIRECTOR_PROJECT=caddy
TZ=UTC
# appjail-director.yml

options:
  - virtualnet: ':<random> default'
  - nat:
services:
  caddy:
    name: caddy
    options:
      - container: 'boot args:--pull'
      - expose: '80:80 proto:tcp' \
      - expose: '443:443 proto:tcp' \
      - expose: '443:443 proto:udp' \
    oci:
      user: root
      environment:
        - TZ: !ENV '${TZ}'
    volumes:
      - CADDY_CONFIG_PATH: /config
      - CADDY_DATA_PATH: /data
volumes:
  CADDY_CONFIG_PATH:
    device: '/path/to/containers/caddy'
  CADDY_DATA_PATH:
    device: '/path/to/containers/caddy/data'
1
2
3
4
5
6
# Makejail

ARG tag=latest

OPTION overwrite=force
OPTION from=ghcr.io/daemonless/caddy:${tag}
1
2
3
4
5
6
7
8
podman run -d --name caddy \
  -p 80:80 \
  -p 443:443 \
  -p 443:443 \
  -e TZ=UTC \
  -v /path/to/containers/caddy:/config \
  -v /path/to/containers/caddy/data:/data \
  ghcr.io/daemonless/caddy:latest
appjail oci run -Pd \
  -o overwrite=force \
  -o container="args:--pull" \
  -o virtualnet=":<random> default" \
  -o nat \
  -o expose="80:80 proto:tcp" \
  -o expose="443:443 proto:tcp" \
  -o expose="443:443 proto:udp" \
  -e TZ=UTC \
  -o fstab="/path/to/containers/caddy /config <pseudofs>" \
  -o fstab="/path/to/containers/caddy/data /data <pseudofs>" \
  ghcr.io/daemonless/caddy:latest caddy
- name: Deploy caddy
  containers.podman.podman_container:
    name: caddy
    image: "ghcr.io/daemonless/caddy:latest"
    state: started
    restart_policy: always
    env:
      TZ: "UTC"
    ports:
      - "80:80"
      - "443:443"
      - "443:443"
    volumes:
      - "/path/to/containers/caddy:/config"
      - "/path/to/containers/caddy/data:/data"

Access at: http://localhost:80

Interactive Configuration

Parameters

Environment Variables

Variable Default Description
TZ UTC Timezone for the container

Volumes

Path Description
/config Configuration directory (Caddyfile)
/data Persistent data (ACME certificates, OCSP staples)

Ports

Port Protocol Description
80 TCP HTTP
443 TCP HTTPS (TCP + UDP/HTTP-3)
443 UDP HTTPS (TCP + UDP/HTTP-3)

Implementation Details

  • Architectures: amd64
  • User: root (UID/GID set via PUID/PGID). Defaults to 1000:1000.
  • Base: Built on ghcr.io/daemonless/base (FreeBSD 15.1).

Need help? Join our Discord community.