Caddy Docker Setup Guide
You
I installed Caddy on docker. Where do I put my pages to serve them and how do I configure it?
Gemini
By default, the official Caddy Docker image looks for static files inside the container's /usr/share/caddy or /srv directory.
To serve your files and configure Caddy, you mount local folders on your host machine to those container paths using a Docker command or docker-compose.yml.
Step 1: Set Up Your Project Folder
Create a directory on your host machine to store your HTML files and configuration:
mkdir -p my-website/site
cd my-website
Inside site/, add an index.html file:
<!DOCTYPE html>
<html>
<body>
<h1>Hello from Caddy in Docker!</h1>
</body>
</html>
Step 2: Create a Caddyfile
In the main my-website folder, create a file named Caddyfile (no file extension):
example.com {
root * /usr/share/caddy
file_server
}
Replace example.com with your actual domain (Caddy will automatically provision free SSL certificates), or use :80 or localhost if testing locally.
Step 3: Run the Container
Option A: Using docker run
Run Caddy, mounting your local Caddyfile and your site/ folder into the container:
docker run -d \
--name caddy \
-p 80:80 \
-p 443:443 \
-v $(pwd)/Caddyfile:/etc/caddy/Caddyfile \
-v $(pwd)/site:/usr/share/caddy \
-v caddy_data:/data \
-v caddy_config:/config \
caddy:latest
/etc/caddy/Caddyfile: Where Caddy expects its configuration inside the container./usr/share/caddy: Where your web pages live inside the container.caddy_data/caddy_config: Named volumes to preserve SSL certificates and runtime configuration across restarts.
Option B: Using docker-compose.yml (Recommended)
Create a docker-compose.yml file in my-website:
version: '3.8'
services:
caddy:
image: caddy:latest
restart: unless-stopped
ports:
- "80:80"
- "443:443"
volumes:
- ./Caddyfile:/etc/caddy/Caddyfile
- ./site:/usr/share/caddy
- caddy_data:/data
- caddy_config:/config
volumes:
caddy_data:
caddy_config:
Start the container:
docker compose up -d
Quick Verification
If you are running locally on port 80, set your Caddyfile to:
:80 {
root * /usr/share/caddy
file_server
}
After starting the container, visit http://localhost in your browser.
Gemini
Since you are configuring Caddy via the Portainer GUI, here is how to set up your port mappings, website files, and Caddyfile directly in Portainer's web interface.
1. Configure Network Ports
In your Network ports configuration section:
- Host: Enter
80(or8080if port 80 is already in use by another app). - Container: Leave as
80.
2. Map Volumes (Files & Configuration)
Click the Volumes tab under Advanced container settings (shown in your second screenshot) and add three volume mappings by clicking + map additional volume:
A. Website Files
- Click Bind next to the path field.
- container:
/usr/share/caddy(or/srv) - host: The absolute path to your HTML files on your host machine (e.g.,
/home/user/my-website).
B. Caddyfile (Configuration)
- Click Bind.
- container:
/etc/caddy/Caddyfile - host: The absolute path to your
Caddyfileon your host machine (e.g.,/home/user/my-website/Caddyfile).
C. Persistent SSL Data (Recommended)
- Leave as Volume (or select Volume).
- container:
/data - volume: Create or select a Docker named volume (e.g.,
caddy_data).
3. Create your Caddyfile on the Host
On your server/computer at the path specified in Step 2B, create a file named Caddyfile:
:80 {
root * /usr/share/caddy
file_server
}
4. Deploy
Scroll up and click Deploy the container. Once started, visit http://localhost (or http://YOUR-SERVER-IP) in your browser to view your served pages.
You
didn't work
Gemini
To figure out why it's not loading, we need to narrow down whether Caddy is throwing an error on startup, looking in the wrong folder, or if the port isn't reachable.
Check these three specific areas to find the exact issue:
1. Check Container Logs in Portainer
- In Portainer, go to Containers on the left menu.
- Click the Logs icon (looks like a page/document symbol) next to your Caddy container.
- Look for error lines near the bottom:
failed to load configuration: Indicates a syntax error in yourCaddyfileor a missing file path.permission denied: Caddy cannot read the files at the host path you bound.listen tcp :80: bind: address already in use: Another program on your system is already using port 80.
2. Verify Port Mapping
In your screenshot, the Host port field under Network ports configuration was left blank (e.g. 80).
- If you left it empty, Docker assigns a random high port (like
32768). - Fix: Open your container settings, ensure the Host field explicitly contains
80(or8080), and redeploy.
3. Check Bind Mount Paths
When mounting files via Portainer's Bind option:
- The host path must be an absolute path starting from root (e.g.,
/home/username/websiteorC:\Users\Name\website), not a relative path like./website. - File vs Directory: Mounting a single file (like
/etc/caddy/Caddyfile) via Portainer's GUI can sometimes create a folder instead of a file on the host if the file doesn't already exist prior to starting the container. EnsureCaddyfileexists as a plain text file on your host system before deploying.
What do your container logs say when you check them in Portainer? If there's an error message, share it here and we can pinpoint the fix immediately.
You
INF INF INF INF INF INF INF INF ts=1788293405.0909657 INF INF INF INF INF INF INF INF ts=1788293405.0909657 msg=maxprocs: Leaving GOMAXPROCS=4: CPU quota undefined
INF INF INF INF INF INF INF INF ts=1788293405.0909975 INF INF INF INF INF INF INF INF ts=1788293405.0909975 msg=GOMEMLIMIT is updated INF INF INF INF INF INF INF INF ts=1788293405.0909975 INF INF INF INF INF INF INF INF ts=1788293405.0909975 msg=GOMEMLIMIT is updated GOMEMLIMIT=14994561024 INF INF INF INF INF INF INF INF ts=1788293405.0909975 INF INF INF INF INF INF INF INF ts=1788293405.0909975 msg=GOMEMLIMIT is updated INF INF INF INF INF INF INF INF ts=1788293405.0909975 INF INF INF INF INF INF INF INF ts=1788293405.0909975 msg=GOMEMLIMIT is updated GOMEMLIMIT=14994561024 previous=9223372036854776000
INF INF INF INF INF INF INF INF ts=1788293405.0910053 INF INF INF INF INF INF INF INF ts=1788293405.0910053 msg=using config from file INF INF INF INF INF INF INF INF ts=1788293405.0910053 INF INF INF INF INF INF INF INF ts=1788293405.0910053 msg=using config from file file=/etc/caddy/Caddyfile
INF INF INF INF INF INF INF INF ts=1788293405.0910106 INF INF INF INF INF INF INF INF ts=1788293405.0910106 msg=adapted config to JSON INF INF INF INF INF INF INF INF ts=1788293405.0910106 INF INF INF INF INF INF INF INF ts=1788293405.0910106 msg=adapted config to JSON adapter=caddyfile
WRN WRN WRN WRN WRN WRN WRN WRN ts=1788293405.0910156 WRN WRN WRN WRN WRN WRN WRN WRN ts=1788293405.0910156 msg=Caddyfile input is not formatted; run 'caddy fmt --overwrite' to fix inconsistencies WRN WRN WRN WRN WRN WRN WRN WRN ts=1788293405.0910156 WRN WRN WRN WRN WRN WRN WRN WRN ts=1788293405.0910156 msg=Caddyfile input is not formatted; run 'caddy fmt --overwrite' to fix inconsistencies adapter=caddyfile WRN WRN WRN WRN WRN WRN WRN WRN ts=1788293405.0910156 WRN WRN WRN WRN WRN WRN WRN WRN ts=1788293405.0910156 msg=Caddyfile input is not formatted; run 'caddy fmt --overwrite' to fix inconsistencies WRN WRN WRN WRN WRN WRN WRN WRN ts=1788293405.0910156 WRN WRN WRN WRN WRN WRN WRN WRN ts=1788293405.0910156 msg=Caddyfile input is not formatted; run 'caddy fmt --overwrite' to fix inconsistencies adapter=caddyfile file=/etc/caddy/Caddyfile WRN WRN WRN WRN WRN WRN WRN WRN ts=1788293405.0910156 WRN WRN WRN WRN WRN WRN WRN WRN ts=1788293405.0910156 msg=Caddyfile input is not formatted; run 'caddy fmt --overwrite' to fix inconsistencies WRN WRN WRN WRN WRN WRN WRN WRN ts=1788293405.0910156 WRN WRN WRN WRN WRN WRN WRN WRN ts=1788293405.0910156 msg=Caddyfile input is not formatted; run 'caddy fmt --overwrite' to fix inconsistencies adapter=caddyfile WRN WRN WRN WRN WRN WRN WRN WRN ts=1788293405.0910156 WRN WRN WRN WRN WRN WRN WRN WRN ts=1788293405.0910156 msg=Caddyfile input is not formatted; run 'caddy fmt --overwrite' to fix inconsistencies WRN WRN WRN WRN WRN WRN WRN WRN ts=1788293405.0910156 WRN WRN WRN WRN WRN WRN WRN WRN ts=1788293405.0910156 msg=Caddyfile input is not formatted; run 'caddy fmt --overwrite' to fix inconsistencies adapter=caddyfile file=/etc/caddy/Caddyfile line=2
INF INF INF INF INF INF INF INF ts=1788293405.0924826 INF INF INF INF INF INF INF INF ts=1788293405.0924826 logger=admin INF INF INF INF INF INF INF INF ts=1788293405.0924826 INF INF INF INF INF INF INF INF ts=1788293405.0924826 logger=admin msg=admin endpoint started INF INF INF INF INF INF INF INF ts=1788293405.0924826 INF INF INF INF INF INF INF INF ts=1788293405.0924826 logger=admin INF INF INF INF INF INF INF INF ts=1788293405.0924826 INF INF INF INF INF INF INF INF ts=1788293405.0924826 logger=admin msg=admin endpoint started address=localhost:2019 INF INF INF INF INF INF INF INF ts=1788293405.0924826 INF INF INF INF INF INF INF INF ts=1788293405.0924826 logger=admin INF INF INF INF INF INF INF INF ts=1788293405.0924826 INF INF INF INF INF INF INF INF ts=1788293405.0924826 logger=admin msg=admin endpoint started INF INF INF INF INF INF INF INF ts=1788293405.0924826 INF INF INF INF INF INF INF INF ts=1788293405.0924826 logger=admin INF INF INF INF INF INF INF INF ts=1788293405.0924826 INF INF INF INF INF INF INF INF ts=1788293405.0924826 logger=admin msg=admin endpoint started address=localhost:2019 enforce_origin=false INF INF INF INF INF INF INF INF ts=1788293405.0924826 INF INF INF INF INF INF INF INF ts=1788293405.0924826 logger=admin INF INF INF INF INF INF INF INF ts=1788293405.0924826 INF INF INF INF INF INF INF INF ts=1788293405.0924826 logger=admin msg=admin endpoint started INF INF INF INF INF INF INF INF ts=1788293405.0924826 INF INF INF INF INF INF INF INF ts=1788293405.0924826 logger=admin INF INF INF INF INF INF INF INF ts=1788293405.0924826 INF INF INF INF INF INF INF INF ts=1788293405.0924826 logger=admin msg=admin endpoint started address=localhost:2019 INF INF INF INF INF INF INF INF ts=1788293405.0924826 INF INF INF INF INF INF INF INF ts=1788293405.0924826 logger=admin INF INF INF INF INF INF INF INF ts=1788293405.0924826 INF INF INF INF INF INF INF INF ts=1788293405.0924826 logger=admin msg=admin endpoint started INF INF INF INF INF INF INF INF ts=1788293405.0924826 INF INF INF INF INF INF INF INF ts=1788293405.0924826 logger=admin INF INF INF INF INF INF INF INF ts=1788293405.0924826 INF INF INF INF INF INF INF INF ts=1788293405.0924826 logger=admin msg=admin endpoint started address=localhost:2019 enforce_origin=false origins=["//localhost:2019","//[::1]:2019","//127.0.0.1:2019"]
INF INF INF INF INF INF INF INF ts=1788293405.0927079 INF INF INF INF INF INF INF INF ts=1788293405.0927079 logger=tls.cache.maintenance INF INF INF INF INF INF INF INF ts=1788293405.0927079 INF INF INF INF INF INF INF INF ts=1788293405.0927079 logger=tls.cache.maintenance msg=started background certificate maintenance INF INF INF INF INF INF INF INF ts=1788293405.0927079 INF INF INF INF INF INF INF INF ts=1788293405.0927079 logger=tls.cache.maintenance INF INF INF INF INF INF INF INF ts=1788293405.0927079 INF INF INF INF INF INF INF INF ts=1788293405.0927079 logger=tls.cache.maintenance msg=started background certificate maintenance cache=0x172ed4b16b00
WRN WRN WRN WRN WRN WRN WRN WRN ts=1788293405.0928423 WRN WRN WRN WRN WRN WRN WRN WRN ts=1788293405.0928423 logger=http WRN WRN WRN WRN WRN WRN WRN WRN ts=1788293405.0928423 WRN WRN WRN WRN WRN WRN WRN WRN ts=1788293405.0928423 logger=http msg=HTTP/2 skipped because it requires TLS WRN WRN WRN WRN WRN WRN WRN WRN ts=1788293405.0928423 WRN WRN WRN WRN WRN WRN WRN WRN ts=1788293405.0928423 logger=http WRN WRN WRN WRN WRN WRN WRN WRN ts=1788293405.0928423 WRN WRN WRN WRN WRN WRN WRN WRN ts=1788293405.0928423 logger=http msg=HTTP/2 skipped because it requires TLS network=tcp WRN WRN WRN WRN WRN WRN WRN WRN ts=1788293405.0928423 WRN WRN WRN WRN WRN WRN WRN WRN ts=1788293405.0928423 logger=http WRN WRN WRN WRN WRN WRN WRN WRN ts=1788293405.0928423 WRN WRN WRN WRN WRN WRN WRN WRN ts=1788293405.0928423 logger=http msg=HTTP/2 skipped because it requires TLS WRN WRN WRN WRN WRN WRN WRN WRN ts=1788293405.0928423 WRN WRN WRN WRN WRN WRN WRN WRN ts=1788293405.0928423 logger=http WRN WRN WRN WRN WRN WRN WRN WRN ts=1788293405.0928423 WRN WRN WRN WRN WRN WRN WRN WRN ts=1788293405.0928423 logger=http msg=HTTP/2 skipped because it requires TLS network=tcp addr=:8080
WRN WRN WRN WRN WRN WRN WRN WRN ts=1788293405.0929706 WRN WRN WRN WRN WRN WRN WRN WRN ts=1788293405.0929706 logger=http WRN WRN WRN WRN WRN WRN WRN WRN ts=1788293405.0929706 WRN WRN WRN WRN WRN WRN WRN WRN ts=1788293405.0929706 logger=http msg=HTTP/3 skipped because it requires TLS WRN WRN WRN WRN WRN WRN WRN WRN ts=1788293405.0929706 WRN WRN WRN WRN WRN WRN WRN WRN ts=1788293405.0929706 logger=http WRN WRN WRN WRN WRN WRN WRN WRN ts=1788293405.0929706 WRN WRN WRN WRN WRN WRN WRN WRN ts=1788293405.0929706 logger=http msg=HTTP/3 skipped because it requires TLS network=tcp WRN WRN WRN WRN WRN WRN WRN WRN ts=1788293405.0929706 WRN WRN WRN WRN WRN WRN WRN WRN ts=1788293405.0929706 logger=http WRN WRN WRN WRN WRN WRN WRN WRN ts=1788293405.0929706 WRN WRN WRN WRN WRN WRN WRN WRN ts=1788293405.0929706 logger=http msg=HTTP/3 skipped because it requires TLS WRN WRN WRN WRN WRN WRN WRN WRN ts=1788293405.0929706 WRN WRN WRN WRN WRN WRN WRN WRN ts=1788293405.0929706 logger=http WRN WRN WRN WRN WRN WRN WRN WRN ts=1788293405.0929706 WRN WRN WRN WRN WRN WRN WRN WRN ts=1788293405.0929706 logger=http msg=HTTP/3 skipped because it requires TLS network=tcp addr=:8080
INF INF INF INF INF INF INF INF ts=1788293405.092979 INF INF INF INF INF INF INF INF ts=1788293405.092979 logger=http.log INF INF INF INF INF INF INF INF ts=1788293405.092979 INF INF INF INF INF INF INF INF ts=1788293405.092979 logger=http.log msg=server running INF INF INF INF INF INF INF INF ts=1788293405.092979 INF INF INF INF INF INF INF INF ts=1788293405.092979 logger=http.log INF INF INF INF INF INF INF INF ts=1788293405.092979 INF INF INF INF INF INF INF INF ts=1788293405.092979 logger=http.log msg=server running name=srv0 INF INF INF INF INF INF INF INF ts=1788293405.092979 INF INF INF INF INF INF INF INF ts=1788293405.092979 logger=http.log INF INF INF INF INF INF INF INF ts=1788293405.092979 INF INF INF INF INF INF INF INF ts=1788293405.092979 logger=http.log msg=server running INF INF INF INF INF INF INF INF ts=1788293405.092979 INF INF INF INF INF INF INF INF ts=1788293405.092979 logger=http.log INF INF INF INF INF INF INF INF ts=1788293405.092979 INF INF INF INF INF INF INF INF ts=1788293405.092979 logger=http.log msg=server running name=srv0 protocols=["h1","h2","h3"]
INF INF INF INF INF INF INF INF ts=1788293405.09345 INF INF INF INF INF INF INF INF ts=1788293405.09345 msg=autosaved config (load with --resume flag) INF INF INF INF INF INF INF INF ts=1788293405.09345 INF INF INF INF INF INF INF INF ts=1788293405.09345 msg=autosaved config (load with --resume flag) file=/config/caddy/autosave.json
INF INF INF INF INF INF INF INF ts=1788293405.0936337 INF INF INF INF INF INF INF INF ts=1788293405.0936337 msg=serving initial configuration
{"level":"info","ts":1788293405.0954552,"logger":"tls","msg":"storage cleaning happened too recently; skipping for now","storage":"FileStorage:/data/caddy","instance":"18558d98-f506-463e-93e9-d9026d0f1c8e","try_again":1788379805.0954509,"try_again_in":86399.999998537}
INF INF INF INF INF INF INF INF ts=1788293405.0956075 INF INF INF INF INF INF INF INF ts=1788293405.0956075 logger=tls INF INF INF INF INF INF INF INF ts=1788293405.0956075 INF INF INF INF INF INF INF INF ts=1788293405.0956075 logger=tls msg=finished cleaning storage units
INF INF INF INF INF INF INF INF ts=1788293604.5951622 INF INF INF INF INF INF INF INF ts=1788293604.5951622 msg=shutting down apps, then terminating INF INF INF INF INF INF INF INF ts=1788293604.5951622 INF INF INF INF INF INF INF INF ts=1788293604.5951622 msg=shutting down apps, then terminating signal=SIGTERM
WRN WRN WRN WRN WRN WRN WRN WRN ts=1788293604.5951996 WRN WRN WRN WRN WRN WRN WRN WRN ts=1788293604.5951996 msg=exiting; byeee!! 👋 WRN WRN WRN WRN WRN WRN WRN WRN ts=1788293604.5951996 WRN WRN WRN WRN WRN WRN WRN WRN ts=1788293604.5951996 msg=exiting; byeee!! 👋 signal=SIGTERM
INF INF INF INF INF INF INF INF ts=1788293604.5952535 INF INF INF INF INF INF INF INF ts=1788293604.5952535 logger=http INF INF INF INF INF INF INF INF ts=1788293604.5952535 INF INF INF INF INF INF INF INF ts=1788293604.5952535 logger=http msg=servers shutting down with eternal grace period
INF INF INF INF INF INF INF INF ts=1788293604.595441 INF INF INF INF INF INF INF INF ts=1788293604.595441 logger=admin INF INF INF INF INF INF INF INF ts=1788293604.595441 INF INF INF INF INF INF INF INF ts=1788293604.595441 logger=admin msg=stopped previous server INF INF INF INF INF INF INF INF ts=1788293604.595441 INF INF INF INF INF INF INF INF ts=1788293604.595441 logger=admin INF INF INF INF INF INF INF INF ts=1788293604.595441 INF INF INF INF INF INF INF INF ts=1788293604.595441 logger=admin msg=stopped previous server address=localhost:2019
INF INF INF INF INF INF INF INF ts=1788293604.5954518 INF INF INF INF INF INF INF INF ts=1788293604.5954518 msg=shutdown complete INF INF INF INF INF INF INF INF ts=1788293604.5954518 INF INF INF INF INF INF INF INF ts=1788293604.5954518 msg=shutdown complete signal=SIGTERM INF INF INF INF INF INF INF INF ts=1788293604.5954518 INF INF INF INF INF INF INF INF ts=1788293604.5954518 msg=shutdown complete INF INF INF INF INF INF INF INF ts=1788293604.5954518 INF INF INF INF INF INF INF INF ts=1788293604.5954518 msg=shutdown complete signal=SIGTERM exit_code=0
INF INF INF INF INF INF INF INF ts=1788293605.179992 INF INF INF INF INF INF INF INF ts=1788293605.179992 msg=maxprocs: Leaving GOMAXPROCS=4: CPU quota undefined
INF INF INF INF INF INF INF INF ts=1788293605.1800232 INF INF INF INF INF INF INF INF ts=1788293605.1800232 msg=GOMEMLIMIT is updated INF INF INF INF INF INF INF INF ts=1788293605.1800232 INF INF INF INF INF INF INF INF ts=1788293605.1800232 msg=GOMEMLIMIT is updated GOMEMLIMIT=14994561024 INF INF INF INF INF INF INF INF ts=1788293605.1800232 INF INF INF INF INF INF INF INF ts=1788293605.1800232 msg=GOMEMLIMIT is updated INF INF INF INF INF INF INF INF ts=1788293605.1800232 INF INF INF INF INF INF INF INF ts=1788293605.1800232 msg=GOMEMLIMIT is updated GOMEMLIMIT=14994561024 previous=9223372036854776000
INF INF INF INF INF INF INF INF ts=1788293605.1800303 INF INF INF INF INF INF INF INF ts=1788293605.1800303 msg=using config from file INF INF INF INF INF INF INF INF ts=1788293605.1800303 INF INF INF INF INF INF INF INF ts=1788293605.1800303 msg=using config from file file=/etc/caddy/Caddyfile
INF INF INF INF INF INF INF INF ts=1788293605.180035 INF INF INF INF INF INF INF INF ts=1788293605.180035 msg=adapted config to JSON INF INF INF INF INF INF INF INF ts=1788293605.180035 INF INF INF INF INF INF INF INF ts=1788293605.180035 msg=adapted config to JSON adapter=caddyfile
WRN WRN WRN WRN WRN WRN WRN WRN ts=1788293605.1800396 WRN WRN WRN WRN WRN WRN WRN WRN ts=1788293605.1800396 msg=Caddyfile input is not formatted; run 'caddy fmt --overwrite' to fix inconsistencies WRN WRN WRN WRN WRN WRN WRN WRN ts=1788293605.1800396 WRN WRN WRN WRN WRN WRN WRN WRN ts=1788293605.1800396 msg=Caddyfile input is not formatted; run 'caddy fmt --overwrite' to fix inconsistencies adapter=caddyfile WRN WRN WRN WRN WRN WRN WRN WRN ts=1788293605.1800396 WRN WRN WRN WRN WRN WRN WRN WRN ts=1788293605.1800396 msg=Caddyfile input is not formatted; run 'caddy fmt --overwrite' to fix inconsistencies WRN WRN WRN WRN WRN WRN WRN WRN ts=1788293605.1800396 WRN WRN WRN WRN WRN WRN WRN WRN ts=1788293605.1800396 msg=Caddyfile input is not formatted; run 'caddy fmt --overwrite' to fix inconsistencies adapter=caddyfile file=/etc/caddy/Caddyfile WRN WRN WRN WRN WRN WRN WRN WRN ts=1788293605.1800396 WRN WRN WRN WRN WRN WRN WRN WRN ts=1788293605.1800396 msg=Caddyfile input is not formatted; run 'caddy fmt --overwrite' to fix inconsistencies WRN WRN WRN WRN WRN WRN WRN WRN ts=1788293605.1800396 WRN WRN WRN WRN WRN WRN WRN WRN ts=1788293605.1800396 msg=Caddyfile input is not formatted; run 'caddy fmt --overwrite' to fix inconsistencies adapter=caddyfile WRN WRN WRN WRN WRN WRN WRN WRN ts=1788293605.1800396 WRN WRN WRN WRN WRN WRN WRN WRN ts=1788293605.1800396 msg=Caddyfile input is not formatted; run 'caddy fmt --overwrite' to fix inconsistencies WRN WRN WRN WRN WRN WRN WRN WRN ts=1788293605.1800396 WRN WRN WRN WRN WRN WRN WRN WRN ts=1788293605.1800396 msg=Caddyfile input is not formatted; run 'caddy fmt --overwrite' to fix inconsistencies adapter=caddyfile file=/etc/caddy/Caddyfile line=2
INF INF INF INF INF INF INF INF ts=1788293605.180955 INF INF INF INF INF INF INF INF ts=1788293605.180955 logger=admin INF INF INF INF INF INF INF INF ts=1788293605.180955 INF INF INF INF INF INF INF INF ts=1788293605.180955 logger=admin msg=admin endpoint started INF INF INF INF INF INF INF INF ts=1788293605.180955 INF INF INF INF INF INF INF INF ts=1788293605.180955 logger=admin INF INF INF INF INF INF INF INF ts=1788293605.180955 INF INF INF INF INF INF INF INF ts=1788293605.180955 logger=admin msg=admin endpoint started address=localhost:2019 INF INF INF INF INF INF INF INF ts=1788293605.180955 INF INF INF INF INF INF INF INF ts=1788293605.180955 logger=admin INF INF INF INF INF INF INF INF ts=1788293605.180955 INF INF INF INF INF INF INF INF ts=1788293605.180955 logger=admin msg=admin endpoint started INF INF INF INF INF INF INF INF ts=1788293605.180955 INF INF INF INF INF INF INF INF ts=1788293605.180955 logger=admin INF INF INF INF INF INF INF INF ts=1788293605.180955 INF INF INF INF INF INF INF INF ts=1788293605.180955 logger=admin msg=admin endpoint started address=localhost:2019 enforce_origin=false INF INF INF INF INF INF INF INF ts=1788293605.180955 INF INF INF INF INF INF INF INF ts=1788293605.180955 logger=admin INF INF INF INF INF INF INF INF ts=1788293605.180955 INF INF INF INF INF INF INF INF ts=1788293605.180955 logger=admin msg=admin endpoint started INF INF INF INF INF INF INF INF ts=1788293605.180955 INF INF INF INF INF INF INF INF ts=1788293605.180955 logger=admin INF INF INF INF INF INF INF INF ts=1788293605.180955 INF INF INF INF INF INF INF INF ts=1788293605.180955 logger=admin msg=admin endpoint started address=localhost:2019 INF INF INF INF INF INF INF INF ts=1788293605.180955 INF INF INF INF INF INF INF INF ts=1788293605.180955 logger=admin INF INF INF INF INF INF INF INF ts=1788293605.180955 INF INF INF INF INF INF INF INF ts=1788293605.180955 logger=admin msg=admin endpoint started INF INF INF INF INF INF INF INF ts=1788293605.180955 INF INF INF INF INF INF INF INF ts=1788293605.180955 logger=admin INF INF INF INF INF INF INF INF ts=1788293605.180955 INF INF INF INF INF INF INF INF ts=1788293605.180955 logger=admin msg=admin endpoint started address=localhost:2019 enforce_origin=false origins=["//localhost:2019","//[::1]:2019","//127.0.0.1:2019"]
INF INF INF INF INF INF INF INF ts=1788293605.181345 INF INF INF INF INF INF INF INF ts=1788293605.181345 logger=tls.cache.maintenance INF INF INF INF INF INF INF INF ts=1788293605.181345 INF INF INF INF INF INF INF INF ts=1788293605.181345 logger=tls.cache.maintenance msg=started background certificate maintenance INF INF INF INF INF INF INF INF ts=1788293605.181345 INF INF INF INF INF INF INF INF ts=1788293605.181345 logger=tls.cache.maintenance INF INF INF INF INF INF INF INF ts=1788293605.181345 INF INF INF INF INF INF INF INF ts=1788293605.181345 logger=tls.cache.maintenance msg=started background certificate maintenance cache=0xd16eb109780
WRN WRN WRN WRN WRN WRN WRN WRN ts=1788293605.1891036 WRN WRN WRN WRN WRN WRN WRN WRN ts=1788293605.1891036 logger=http WRN WRN WRN WRN WRN WRN WRN WRN ts=1788293605.1891036 WRN WRN WRN WRN WRN WRN WRN WRN ts=1788293605.1891036 logger=http msg=HTTP/2 skipped because it requires TLS WRN WRN WRN WRN WRN WRN WRN WRN ts=1788293605.1891036 WRN WRN WRN WRN WRN WRN WRN WRN ts=1788293605.1891036 logger=http WRN WRN WRN WRN WRN WRN WRN WRN ts=1788293605.1891036 WRN WRN WRN WRN WRN WRN WRN WRN ts=1788293605.1891036 logger=http msg=HTTP/2 skipped because it requires TLS network=tcp WRN WRN WRN WRN WRN WRN WRN WRN ts=1788293605.1891036 WRN WRN WRN WRN WRN WRN WRN WRN ts=1788293605.1891036 logger=http WRN WRN WRN WRN WRN WRN WRN WRN ts=1788293605.1891036 WRN WRN WRN WRN WRN WRN WRN WRN ts=1788293605.1891036 logger=http msg=HTTP/2 skipped because it requires TLS WRN WRN WRN WRN WRN WRN WRN WRN ts=1788293605.1891036 WRN WRN WRN WRN WRN WRN WRN WRN ts=1788293605.1891036 logger=http WRN WRN WRN WRN WRN WRN WRN WRN ts=1788293605.1891036 WRN WRN WRN WRN WRN WRN WRN WRN ts=1788293605.1891036 logger=http msg=HTTP/2 skipped because it requires TLS network=tcp addr=:8080
WRN WRN WRN WRN WRN WRN WRN WRN ts=1788293605.189427 WRN WRN WRN WRN WRN WRN WRN WRN ts=1788293605.189427 logger=http WRN WRN WRN WRN WRN WRN WRN WRN ts=1788293605.189427 WRN WRN WRN WRN WRN WRN WRN WRN ts=1788293605.189427 logger=http msg=HTTP/3 skipped because it requires TLS WRN WRN WRN WRN WRN WRN WRN WRN ts=1788293605.189427 WRN WRN WRN WRN WRN WRN WRN WRN ts=1788293605.189427 logger=http WRN WRN WRN WRN WRN WRN WRN WRN ts=1788293605.189427 WRN WRN WRN WRN WRN WRN WRN WRN ts=1788293605.189427 logger=http msg=HTTP/3 skipped because it requires TLS network=tcp WRN WRN WRN WRN WRN WRN WRN WRN ts=1788293605.189427 WRN WRN WRN WRN WRN WRN WRN WRN ts=1788293605.189427 logger=http WRN WRN WRN WRN WRN WRN WRN WRN ts=1788293605.189427 WRN WRN WRN WRN WRN WRN WRN WRN ts=1788293605.189427 logger=http msg=HTTP/3 skipped because it requires TLS WRN WRN WRN WRN WRN WRN WRN WRN ts=1788293605.189427 WRN WRN WRN WRN WRN WRN WRN WRN ts=1788293605.189427 logger=http WRN WRN WRN WRN WRN WRN WRN WRN ts=1788293605.189427 WRN WRN WRN WRN WRN WRN WRN WRN ts=1788293605.189427 logger=http msg=HTTP/3 skipped because it requires TLS network=tcp addr=:8080
INF INF INF INF INF INF INF INF ts=1788293605.1895304 INF INF INF INF INF INF INF INF ts=1788293605.1895304 logger=http.log INF INF INF INF INF INF INF INF ts=1788293605.1895304 INF INF INF INF INF INF INF INF ts=1788293605.1895304 logger=http.log msg=server running INF INF INF INF INF INF INF INF ts=1788293605.1895304 INF INF INF INF INF INF INF INF ts=1788293605.1895304 logger=http.log INF INF INF INF INF INF INF INF ts=1788293605.1895304 INF INF INF INF INF INF INF INF ts=1788293605.1895304 logger=http.log msg=server running name=srv0 INF INF INF INF INF INF INF INF ts=1788293605.1895304 INF INF INF INF INF INF INF INF ts=1788293605.1895304 logger=http.log INF INF INF INF INF INF INF INF ts=1788293605.1895304 INF INF INF INF INF INF INF INF ts=1788293605.1895304 logger=http.log msg=server running INF INF INF INF INF INF INF INF ts=1788293605.1895304 INF INF INF INF INF INF INF INF ts=1788293605.1895304 logger=http.log INF INF INF INF INF INF INF INF ts=1788293605.1895304 INF INF INF INF INF INF INF INF ts=1788293605.1895304 logger=http.log msg=server running name=srv0 protocols=["h1","h2","h3"]
INF INF INF INF INF INF INF INF ts=1788293605.19014 INF INF INF INF INF INF INF INF ts=1788293605.19014 msg=autosaved config (load with --resume flag) INF INF INF INF INF INF INF INF ts=1788293605.19014 INF INF INF INF INF INF INF INF ts=1788293605.19014 msg=autosaved config (load with --resume flag) file=/config/caddy/autosave.json
INF INF INF INF INF INF INF INF ts=1788293605.1902783 INF INF INF INF INF INF INF INF ts=1788293605.1902783 msg=serving initial configuration
{"level":"info","ts":1788293605.1939611,"logger":"tls","msg":"storage cleaning happened too recently; skipping for now","storage":"FileStorage:/data/caddy","instance":"18558d98-f506-463e-93e9-d9026d0f1c8e","try_again":1788380005.1939578,"try_again_in":86399.999999167}
INF INF INF INF INF INF INF INF ts=1788293605.19414 INF INF INF INF INF INF INF INF ts=1788293605.19414 logger=tls INF INF INF INF INF INF INF INF ts=1788293605.19414 INF INF INF INF INF INF INF INF ts=1788293605.19414 logger=tls msg=finished cleaning storage units
Gemini
Looking at your logs, Caddy is actually running without errors! However, there are two key reasons why you can't reach your website in your browser:
Cause 1: Caddy is Listening on Port 8080 Inside the Container
Notice this line in your logs:
logger=http msg=HTTP/2 skipped because it requires TLS network=tcp addr=:8080
Your Caddyfile is configured to listen on :8080, but in Portainer's Network ports configuration, you mapped Container Port 80. Because Caddy is running on 8080 inside the container, traffic arriving at container port 80 goes nowhere.
Cause 2: Missing Host Port Mapping
In your Portainer screenshot, the Host Port field was left blank (e.g. 80). When left blank, Docker does not publish the port to your main system port.
How to Fix It (2 Quick Changes in Portainer)
1. Fix the Port Mapping in Portainer
- Go to Containers > click your Caddy container > click Duplicate/Edit.
- Under Network ports configuration:
- Host: Enter
80(or8080if you want to access it vialocalhost:8080).- Container: Change this to
8080(to match what yourCaddyfileis listening on).
- Container: Change this to
- Host: Enter
2. Alternative: Update Your Caddyfile to Port 80
If you want Caddy to listen on standard port 80 inside the container, update your host's Caddyfile to:
:80 {
root * /usr/share/caddy
file_server
}
Then in Portainer's Network ports configuration:
- Host:
80 - Container:
80
3. Deploy
Click Deploy the container (and confirm replace/overwrite). Once redeployed, you can open your browser to:
http://localhost(if mapped to host port 80)http://localhost:8080(if mapped to host port 8080)
You
didn't work. Can I delete this and make a stack and YAML file?
Gemini
Yes, absolutely. Creating a Stack using a docker-compose.yml file in Portainer is actually much easier, cleaner, and less prone to configuration mistakes than using the individual container form.
Step 1: Remove the Existing Container
- Go to Containers on the Portainer left sidebar.
- Select your current Caddy container by checking its box.
- Click Remove (check "Automatically remove non-persistent volumes" if prompted) and confirm.
Step 2: Prepare Your Host Folder & Files
On your host machine (the server/PC running Docker), make sure you have a folder set up with your website files and Caddyfile.
For example, create a directory like /home/user/my-website:
mkdir -p /home/user/my-website/site
- Your HTML file: Put your
index.htmlinside/home/user/my-website/site/index.html. - Your
Caddyfile: Create/home/user/my-website/Caddyfilewith the following content:
:80 {
root * /usr/share/caddy
file_server
}
Step 3: Create the Stack in Portainer
- In Portainer's left menu, click Stacks.
- Click + Add stack.
- Name your stack (e.g.,
caddy-web). - Select Web editor and paste the following
docker-compose.ymlconfiguration:
version: '3.8'
services:
caddy:
image: caddy:latest
container_name: caddy
restart: unless-stopped
ports:
- "80:80"
- "443:443"
volumes:
# Absolute host path to your Caddyfile
- /home/user/my-website/Caddyfile:/etc/caddy/Caddyfile
# Absolute host path to your static site folder
- /home/user/my-website/site:/usr/share/caddy
# Named volumes for Caddy SSL data and config storage
- caddy_data:/data
- caddy_config:/config
volumes:
caddy_data:
caddy_config:
Important: Update
/home/user/my-website/Caddyfileand/home/user/my-website/sitein the YAML above to the exact absolute paths where those files live on your machine.
Step 4: Deploy
Scroll down and click Deploy the stack.
Once Portainer finishes pulling the image and launching the container, visit http://localhost (or your server's IP address) in your browser.
You
I want /srv/http
Gemini
Here is the updated Stack YAML with your files served directly from /srv/http on your host system.
Step 1: Ensure Your Folders & Files Exist on Host
On your server, create the /srv/http directory and place your index.html and Caddyfile directly inside it:
sudo mkdir -p /srv/http
- Website files: Place
index.htmlin/srv/http/index.html - Caddyfile: Place
Caddyfilein/srv/http/Caddyfilewith this content:
:80 {
root * /srv/http
file_server
}
Step 2: Portainer Stack Config (docker-compose.yml)
In Portainer, go to Stacks > + Add stack, name it caddy-web, and paste this YAML:
version: '3.8'
services:
caddy:
image: caddy:latest
container_name: caddy
restart: unless-stopped
ports:
- "80:80"
- "443:443"
volumes:
# Mount your Caddyfile from host to container
- /srv/http/Caddyfile:/etc/caddy/Caddyfile
# Mount host /srv/http to container /srv/http
- /srv/http:/srv/http
# Named volumes for SSL data and state
- caddy_data:/data
- caddy_config:/config
volumes:
caddy_data:
caddy_config:
Step 3: Deploy
Click Deploy the stack. Once Portainer finishes running, navigate to http://localhost (or your server's IP address).
You
I want port 8080 for now. I have apache on 80
Gemini
Here is the updated configuration to bind host port 8080 to container port 80, keeping Apache running smoothly on port 80.
Step 1: Caddyfile (Located at /srv/http/Caddyfile)
Keep your Caddyfile configured to listen on port 80 inside the container:
:80 {
root * /srv/http
file_server
}
Step 2: Portainer Stack YAML
In Portainer, update your Stack YAML so that host port 8080 maps to container port 80:
version: '3.8'
services:
caddy:
image: caddy:latest
container_name: caddy
restart: unless-stopped
ports:
- "8080:80"
volumes:
# Mount your Caddyfile
- /srv/http/Caddyfile:/etc/caddy/Caddyfile
# Mount your web files
- /srv/http:/srv/http
# Persistent volumes
- caddy_data:/data
- caddy_config:/config
volumes:
caddy_data:
caddy_config:
Step 3: Deploy & Access
- Click Update the stack (or Deploy the stack).
- Access your Caddy website at:
http://localhost:8080(orhttp://YOUR-SERVER-IP:8080).
Your Apache server on port 80 will remain completely unaffected.
You
It's not serving php
Gemini
Caddy does not process PHP out of the box because it does not include a built-in PHP interpreter like Apache's mod_php. It acts as a web server and reverse proxy that needs to pass PHP files to a separate PHP-FPM (FastCGI Process Manager) instance to run them.
Here is how to add PHP-FPM to your Portainer Stack and update your Caddyfile so Caddy can execute .php files.
Step 1: Update Your Caddyfile (/srv/http/Caddyfile)
Update your Caddyfile to use the php_fastcgi directive pointing to the PHP-FPM service name (php):
:80 {
root * /srv/http
# Enables PHP execution via FastCGI
php_fastcgi php:9000
# Serves static files (CSS, JS, images, etc.)
file_server
}
Step 2: Update Your Portainer Stack YAML
In Portainer, edit your Stack YAML to add the php:8.3-fpm container service and share the /srv/http directory with it:
version: '3.8'
services:
caddy:
image: caddy:latest
container_name: caddy
restart: unless-stopped
ports:
- "8080:80"
volumes:
- /srv/http/Caddyfile:/etc/caddy/Caddyfile
- /srv/http:/srv/http
- caddy_data:/data
- caddy_config:/config
depends_on:
- php
php:
image: php:8.3-fpm
container_name: php-fpm
restart: unless-stopped
volumes:
# PHP needs access to the same PHP files as Caddy
- /srv/http:/srv/http
volumes:
caddy_data:
caddy_config:
Step 3: Test PHP
- Create a file at
/srv/http/index.php:<?php phpinfo(); ?> - In Portainer, click Update the stack (make sure Re-pull image and redeploy is checked if prompted).
- Visit
http://localhost:8080in your browser. You should now see the standard PHP info page.
You
It works. Will it do https?
Gemini
Yes, Caddy will do HTTPS automatically, but because you are running on port 8080, there are a couple of important details to consider:
Option 1: Automatic HTTPS with Internal/Self-Signed Certificates (For Local testing on Port 8080)
Caddy's automatic Let's Encrypt engine requires standard public ports (80 and 443) to pass ACME domain validation. Since you are using host port 8080, Caddy cannot obtain a public Let's Encrypt SSL certificate.
However, you can tell Caddy to generate its own internal, self-signed SSL certificates for local testing.
1. Update /srv/http/Caddyfile:
:8080 {
tls internal
root * /srv/http
php_fastcgi php:9000
file_server
}
2. Update Portainer Stack YAML:
Expose host port 8080 directly to container port 8080:
version: '3.8'
services:
caddy:
image: caddy:latest
container_name: caddy
restart: unless-stopped
ports:
- "8080:8080"
volumes:
- /srv/http/Caddyfile:/etc/caddy/Caddyfile
- /srv/http:/srv/http
- caddy_data:/data
- caddy_config:/config
depends_on:
- php
php:
image: php:8.3-fpm
container_name: php-fpm
restart: unless-stopped
volumes:
- /srv/http:/srv/http
volumes:
caddy_data:
caddy_config:
3. Update the Stack & Access
Access https://localhost:8080. Your browser will warn you that the certificate is untrusted (since it's self-signed by Caddy); click Advanced -> Proceed to load your PHP site over HTTPS.
Option 2: Automatic Real Public HTTPS (Free Let's Encrypt)
If you want real, fully-trusted SSL certificates (no browser warnings) for a live domain (e.g., example.com), Caddy must bind to standard HTTP/HTTPS host ports 80 and 443.
Once you are ready to replace Apache or free up port 80/443 on your host machine:
1. Update /srv/http/Caddyfile:
yourdomain.com {
root * /srv/http
php_fastcgi php:9000
file_server
}
2. Update Portainer Stack YAML:
ports:
- "80:80"
- "443:443"
Caddy will automatically fetch, install, and renew a valid Let's Encrypt SSL certificate for your domain with zero manual configuration.
You
It looks like I will have to change my apache PHP to port 8080 because Caddy will be on 80. Am I right?
Gemini
Yes, you are 100% correct.
Only one application can bind to host port 80 (and port 443) at a time on the same IP address. If you want Caddy to handle automatic public HTTPS on ports 80 and 443, you must move Apache off those ports.
Here is how your transition will work:
1. Shift Apache to Port 8080
Update your host machine's Apache configuration (typically in /etc/apache2/ports.conf and /etc/apache2/sites-available/000-default.conf on Ubuntu/Debian) to listen on port 8080 instead of 80:
# /etc/apache2/ports.conf
Listen 8080
Then restart Apache:
sudo systemctl restart apache2
2. Update Your Caddyfile for Real HTTPS (/srv/http/Caddyfile)
Change your Caddyfile to use your real domain (or domain pointing to your public IP). Caddy will automatically manage port 80 (for validation/HTTP-to-HTTPS redirect) and port 443 (for HTTPS):
yourdomain.com {
root * /srv/http
php_fastcgi php:9000
file_server
}
If you don't have a domain yet and just want to test locally on port 80 without SSL for now, use :80 instead of yourdomain.com.
3. Update Your Portainer Stack YAML
Give Caddy ownership of ports 80 and 443:
version: '3.8'
services:
caddy:
image: caddy:latest
container_name: caddy
restart: unless-stopped
ports:
- "80:80"
- "443:443"
volumes:
- /srv/http/Caddyfile:/etc/caddy/Caddyfile
- /srv/http:/srv/http
- caddy_data:/data
- caddy_config:/config
depends_on:
- php
php:
image: php:8.3-fpm
container_name: php-fpm
restart: unless-stopped
volumes:
- /srv/http:/srv/http
volumes:
caddy_data:
caddy_config:
4. Deploy
Update your stack in Portainer. Caddy will now capture all incoming traffic on ports 80/443, automatically provision a valid Let's Encrypt SSL certificate for your domain, and serve your PHP site seamlessly.
Your old Apache setup will still be accessible out of the way on `
You
Apache is on garuda linux
Gemini
On Garuda Linux (which is Arch-based), changing Apache's port is very straightforward. Apache runs under the service name httpd on Arch/Garuda systems.
Here is how to move Apache to port 8080 and free up port 80 for Caddy:
Step 1: Edit Apache's httpd.conf
Open the main Apache configuration file in your terminal:
sudo nano /etc/httpd/conf/httpd.conf
- Press
Ctrl + Wto search, typeListen 80, and pressEnter. - Change the line from:
to:Listen 80Listen 8080 - If you have virtual hosts listening on
<VirtualHost *:80>, search for those in the file (or inside/etc/httpd/conf/extra/) and change them to<VirtualHost *:8080>. - Save and exit (
Ctrl + O,Enter, thenCtrl + X).
Step 2: Restart Apache (httpd)
Restart the service so it binds to the new port:
sudo systemctl restart httpd
Verify that Apache is running on 8080:
sudo ss -tulpn | grep 8080
Step 3: Deploy Caddy in Portainer
Now that port 80 (and 443) are free on your host, update your Portainer Stack YAML to map ports 80:80 and 443:443:
version: '3.8'
services:
caddy:
image: caddy:latest
container_name: caddy
restart: unless-stopped
ports:
- "80:80"
- "443:443"
volumes:
- /srv/http/Caddyfile:/etc/caddy/Caddyfile
- /srv/http:/srv/http
- caddy_data:/data
- caddy_config:/config
depends_on:
- php
php:
image: php:8.3-fpm
container_name: php-fpm
restart: unless-stopped
volumes:
- /srv/http:/srv/http
volumes:
caddy_data:
caddy_config:
Step 4: Set Your Domain/IP in Caddyfile
Update /srv/http/Caddyfile:
- For automatic Let's Encrypt HTTPS (public domain):
yourdomain.com { root * /srv/http php_fastcgi php:9000 file_server } - For local HTTP testing on port 80:
:80 { root * /srv/http php_fastcgi php:9000 file_server }
Redeploy the stack, and Caddy will take over ports 80 and 443 seamlessly! Your legacy Apache site will remain accessible at `
You
yourdomain.com {
root * /srv/http
php_fastcgi php:9000
file_server
}
:80 {
root * /srv/http
php_fastcgi php:9000
file_server
}
Gemini
You can combine or keep both site blocks in your Caddyfile depending on how you want Caddy to behave.
Recommended Approach: Use a Single Block
If yourdomain.com points to your server's IP address, Caddy will automatically handle HTTP (:80) and HTTPS (:443) for you. It automatically sets up a redirect from HTTP to HTTPS, so you don't need a separate :80 block.
Your Caddyfile can simply be:
yourdomain.com {
root * /srv/http
php_fastcgi php:9000
file_server
}
Alternate Approach: Dual Blocks (Domain + IP Access)
If you want users accessing yourdomain.com to get HTTPS, but you also want to allow local network users to hit the server directly via IP address ([http://192.168.](http://192.168.)x.x or http://localhost) on port 80, you can format your Caddyfile like this:
yourdomain.com {
root * /srv/http
php_fastcgi php:9000
file_server
}
:80 {
root * /srv/http
php_fastcgi php:9000
file_server
}
Note: If you use both blocks, requests to
[http://yourdomain.com](http://yourdomain.com)will be intercepted by the domain block and redirected to HTTPS ([https://yourdomain.com](https://yourdomain.com)). Direct IP requests will fall back to serving the site over plain HTTP via the:80block.
You
My eventual intention is a domain on Clouflare - later on
Docker Deployment Guide on google - https://drive.google.com/file/d/1Cq7VqNJoLeahMKz2OpC0PRotaAPnGhfj/view?usp=sharing
Gemini
That makes complete sense! Setting things up with dual blocks or local testing now is a great stepping stone before moving to Cloudflare down the road.
When you do eventually point a Cloudflare domain to your Caddy setup, here are three key things to keep in mind so it goes smoothly:
1. The Cloudflare SSL/TLS Setting (Crucial)
In your Cloudflare dashboard under SSL/TLS, always set the encryption mode to Full (strict).
- Why: This ensures Cloudflare connects to Caddy over port 443 with a valid, secure TLS handshake. If you leave it on "Flexible", it will create an infinite HTTP-to-HTTPS redirect loop between Cloudflare and Caddy.
2. Simple Cloudflare Caddyfile Setup
Once your domain DNS is proxied through Cloudflare (orange cloud enabled), your Caddyfile stays virtually identical:
yourdomain.com {
root * /srv/http
php_fastcgi php:9000
file_server
}
Caddy will automatically fetch a Let's Encrypt or ZeroSSL certificate using the HTTP-01 challenge through Cloudflare's proxy.
3. Alternative: Cloudflare DNS Challenge (For Wildcards or Internal Servers)
If you ever want to keep your server ports completely closed to the public internet (or get wildcard certificates like *.yourdomain.com), you can build a custom Caddy container with the caddy-dns/cloudflare plugin.
This allows Caddy to validate ownership of your domain via the Cloudflare API without needing port 80 open to the world.
Since you shared a link to your Docker Deployment Guide on Google Drive, is there a specific part of your deployment blueprint or setup you'd like to integrate into your Portainer stack next?
You
Not yet. I will come back later. But will I even need a domain if i have caddy-dns/cloudflare plugin?
Gemini
Yes, you will still need a registered domain name (e.g., yourdomain.com).
The caddy-dns/cloudflare plugin doesn't provide a domain for you—instead, it provides a way for Caddy to talk to your Cloudflare account's API to prove that you own that domain.
Here is how the plugin actually works and why a domain is still required:
What the Cloudflare Plugin Does
Normally, Caddy proves ownership of your domain to Let's Encrypt by answering a challenge over port 80 (HTTP-01 challenge).
With the Cloudflare DNS plugin, Caddy switches to a DNS-01 challenge:
- Caddy uses a Cloudflare API token to automatically add a temporary
TXTrecord inside your Cloudflare DNS control panel. - Let's Encrypt checks Cloudflare's DNS servers for that
TXTrecord. - Once verified, Let's Encrypt issues your SSL certificate, and Caddy deletes the temporary record.
Why You Still Need a Domain
- Public DNS Authority: Let's Encrypt can only issue real SSL certificates for domain names registered in global public DNS registries.
- Cloudflare Management: For the plugin to work, your domain must be added to a free Cloudflare account so Caddy can manipulate its DNS records via API.
The Big Advantages of Using the Plugin
Even though you still need a domain, using the plugin gives you huge perks:
- No Open Ports Needed: You don't have to forward port 80 or 443 on your home router to get an SSL certificate.
- Wildcard Certificates: You can issue certificates for
*.yourdomain.com(e.g.,app1.yourdomain.com,app2.yourdomain.com) using a single rule. - Internal-Only HTTPS: You can access your home server securely via
[https://something.yourdomain.com](https://something.yourdomain.com)over your local network/VPN without exposing your server to the internet.
Whenever you're ready to set up the domain or build the custom Caddy image with the plugin, just pop back in!
You
can i use duckdns.org for the domain?
Gemini
Yes, absolutely. DuckDNS.org is one of the best free options if you don't want to buy a custom domain name yet.
Caddy has built-in support for DuckDNS through Caddy's DNS-01 challenge plugin (caddy-dns/duckdns). This allows Caddy to automatically get a valid, free SSL certificate for your yoursubdomain.duckdns.org domain—even if your home IP address changes or if you don't open port 80 to the internet.
How to Use DuckDNS with Caddy
1. Set Up Your DuckDNS Account
- Log into
DuckDNS.org
using GitHub or Google. - Create a subdomain (e.g.,
mycoolsite). Your full domain will bemycoolsite.duckdns.org. - Copy your DuckDNS Token displayed at the top of your DuckDNS account page.
2. Option A: Standard Setup (Ports 80 & 443 open to the web)
If your router forwards ports 80 and 443 to your server, you don't even need any extra plugins. Standard Caddy handles it out of the box:
Your /srv/http/Caddyfile:
mycoolsite.duckdns.org {
root * /srv/http
php_fastcgi php:9000
file_server
}
3. Option B: Advanced Setup (Using DuckDNS API / Closed Ports)
If you can't or don't want to open port 80 to the public internet, you can use the DuckDNS plugin. Since official Caddy Docker images don't include plugins by default, you just need to swap caddy:latest in your Portainer stack to caddyserver/caddy-docker:builder or use a pre-built Caddy image with the DuckDNS module (like serf2000/caddy-duckdns or similar).
Your /srv/http/Caddyfile:
mycoolsite.duckdns.org {
tls {
dns duckdns YOUR_DUCKDNS_TOKEN
}
root * /srv/http
php_fastcgi php:9000
file_server
}
Whenever you are ready to set up DuckDNS on your system, let me know which method you'd prefer to walk through!
You
Thanks. I'do that later. For now is this right for testing?:yourdomain.com {
root * /srv/http
php_fastcgi php:9000
file_server
}
Gemini
Almost, but not quite! Notice the leading colon in :yourdomain.com.
In Caddy's syntax:
- A leading colon like
:80or:8080tells Caddy to bind to a specific port. - A domain name should not have a colon in front of it.
Here is the correct way to write it depending on what you are testing:
Option 1: Testing with an Actual Domain Name (No Colon)
If you are using a real domain name (or a DuckDNS subdomain), remove the colon:
yourdomain.com {
root * /srv/http
php_fastcgi php:9000
file_server
}
Option 2: Local Testing on Port 80 (Without a Domain)
If you don't have a domain configured yet and just want to test locally via http://localhost or your local IP address, use :80:
:80 {
root * /srv/http
php_fastcgi php:9000
file_server
}
Quick Summary
yourdomain.com Matches traffic for that specific domain name and enables automatic HTTPS.:80 Catches all incoming HTTP traffic on port 80 regardless of domain name (ideal for local testing).
You
but I want https too
Gemini
If you want to test HTTPS locally (without buying a domain or setting up external DNS yet), you have two great options:
Option 1: Using localhost (Recommended for Local Machine Testing)
If you type localhost (without a colon) as your site address, Caddy automatically provisions an internal, self-signed TLS certificate for HTTPS on port 443.
/srv/http/Caddyfile:
localhost {
root * /srv/http
php_fastcgi php:9000
file_server
}
- How to access: Open your browser to
https://localhost. - Note: Because the certificate is self-signed locally, your browser will show a security warning. Click Advanced -> Proceed to localhost to view your site over HTTPS.
Option 2: Using a.localhost Subdomain (or custom local hostname)
If you want to test with a domain-like format (e.g., mysite.localhost), Caddy also treats any domain ending in .localhost as an internal site and automatically enables HTTPS.
/srv/http/Caddyfile:
mysite.localhost {
root * /srv/http
php_fastcgi php:9000
file_server
}
- How to access: Open your browser to
[https://mysite.localhost](https://mysite.localhost). Most modern operating systems and browsers route.localhostdomains directly to your local machine automatically.
Option 3: Real HTTPS with a Placeholder Domain (Local Network / Custom Host)
If you want to use your actual intended domain name (e.g., yourdomain.com) locally before it's live on the internet, tell Caddy to use internal TLS certificates:
/srv/http/Caddyfile:
yourdomain.com {
tls internal
root * /srv/http
php_fastcgi php:9000
file_server
}
- Requirement: You will need to add
127.0.0.1 yourdomain.comto your local machine's/etc/hostsfile so your browser knowsyourdomain.compoints to your local system. Then visit[https://yourdomain.com](https://yourdomain.com).
You
hostname
garuda-6530
Gemini
To use your machine's hostname (garuda-6530) with Caddy for local HTTPS testing, you have two simple methods depending on whether you are accessing it only on that machine or from other devices on your local network.
Method 1: Using garuda-6530.localhost (Easiest)
Any domain ending in .localhost tells Caddy to automatically generate a local HTTPS certificate, and modern operating systems automatically route .localhost to 127.0.0.1 without extra setup.
/srv/http/Caddyfile:
garuda-6530.localhost {
root * /srv/http
php_fastcgi php:9000
file_server
}
- How to access: Open your browser and go to
[https://garuda-6530.localhost](https://garuda-6530.localhost).
Method 2: Using Plain garuda-6530 (Local Network Access)
If you want to access the site over HTTPS using the exact hostname garuda-6530 (or if you want other devices on your home network/LAN to reach it at https://garuda-6530), tell Caddy to use its internal TLS engine:
/srv/http/Caddyfile:
garuda-6530 {
tls internal
root * /srv/http
php_fastcgi php:9000
file_server
}
- How to access: Open your browser and go to
https://garuda-6530.
What to Expect in Your Browser
Because Caddy acts as its own local Certificate Authority (CA) for internal TLS, your browser will show a "Connection is not private" or "Self-signed certificate" warning the first time you visit.
Simply click Advanced -> Proceed to garuda-6530 (unsafe) to bypass the warning and view your site over HTTPS.
You
It works
Gemini
Awesome! Glad to hear you've got Caddy and PHP-FPM serving your site over local HTTPS with garuda-6530.
You're all set up for local development now. When you're ready to tackle DuckDNS, Cloudflare, or setting up a live domain down the road, just drop back in!
You
So I can't reach https://garuda-6530/dokuwiki/doku.php?id=start from another computer on my local network?
Gemini
You can reach it, but whether it works out of the box depends on local DNS resolution and your firewall settings.
Here is what needs to be in place for another computer on your local network to access https://garuda-6530/dokuwiki/doku.php?id=start:
1. Local Network Name Resolution (mDNS / NetBIOS)
For another computer on your network to resolve the name garuda-6530 to your host machine's IP address:
- Using Avahi / mDNS (Linux / Mac / Windows): Most modern systems support multicast DNS. On other devices, try reaching
[https://garuda-6530.local/dokuwiki/doku.php?id=start](https://garuda-6530.local/dokuwiki/doku.php?id=start)(adding.local). - Using
/etc/hostsorhostsfile (Fallback): If the standard hostname doesn't resolve automatically, add your server's local IP address to the client computer's hosts file:- On Linux/Mac: Edit
/etc/hostsand add:192.168.1.X garuda-6530- On Windows: Edit
C:\Windows\System32\drivers\etc\hostsand add:192.168.1.X garuda-6530
- On Windows: Edit
- On Linux/Mac: Edit
2. Open Firewall Ports on the Garuda Host
If the request times out, make sure port 443 (and port 80 for HTTP redirects) is open on your Garuda system's firewall (such as ufw or firewalld).
For ufw:
sudo ufw allow 80/tcp
sudo ufw allow 443/tcp
3. Alternative: Serve via IP Address in Caddyfile
If you prefer not to manage hostnames or .local domains across multiple client computers, update your /srv/http/Caddyfile to include your server's static IP address:
garuda-6530, 192.168.1.X {
tls internal
root * /srv/http
php_fastcgi php:9000
file_server
}
(Replace 192.168.1.X with your host's actual LAN IP).
After updating the stack, any device on your local network can navigate directly to [https://192.168.1.](https://192.168.1.)X/dokuwiki/doku.php?id=start (you will just need to accept the self-signed certificate warning in the browser).
You
can i use 192.168.1.2
Gemini
Yes, absolutely.
Just replace 192.168.1.X with 192.168.1.2 in your Caddyfile. You can list both your hostname and the IP address separated by a comma so Caddy handles HTTPS for both:
garuda-6530, 192.168.1.2 {
tls internal
root * /srv/http
php_fastcgi php:9000
file_server
}
Steps to update:
- Update
/srv/http/Caddyfilewith the block above. - In Portainer, click Update the stack to restart Caddy with the new configuration.
Now, any device on your local network can access your DokuWiki directly at: [https://192.168.1.2/dokuwiki/doku.php?id=start](https://192.168.1.2/dokuwiki/doku.php?id=start)
(Note: Other devices will still show the browser's standard self-signed certificate warning the first time you connect—just click Advanced -> Proceed to load the page).
You
I meant https://192.168.1.3 --- nothing happens
Gemini
When "nothing happens" (usually a connection timeout or connection refused error), it almost always comes down to either Caddy not listening on the host IP, or Garuda's host firewall blocking incoming network traffic on ports 80 and 443.
Work through these steps to fix it:
Step 1: Update /srv/http/Caddyfile
Make sure 192.168.1.3 is explicitly listed in your Caddyfile:
garuda-6530, 192.168.1.3 {
tls internal
root * /srv/http
php_fastcgi php:9000
file_server
}
After saving, update or restart the stack in Portainer so Caddy reloads the new configuration.
Step 2: Open Ports on Garuda Linux's Firewall
Garuda Linux enables firewalld or ufw by default, which blocks incoming traffic from other local network devices on ports 80 and 443.
Run the following in your terminal on garuda-6530:
If using firewalld (Garuda default):
sudo firewall-cmd --zone=public --add-port=80/tcp --permanent
sudo firewall-cmd --zone=public --add-port=443/tcp --permanent
sudo firewall-cmd --reload
If using ufw:
sudo ufw allow 80/tcp
sudo ufw allow 443/tcp
Step 3: Check Portainer Port Bindings
Ensure your Portainer Stack YAML maps host ports 80 and 443 directly:
ports:
- "80:80"
- "443:443"
If it still says 0.0.0.0:8080->80/tcp in Portainer, Caddy is still bound to port 8080 on the host instead of port 80/443.
Step 4: Verify Listening Status
On your garuda-6530 terminal, run:
sudo ss -tulpn | grep -E ':(80|443)'
You should see Docker listening on 0.0.0.0:80 and 0.0.0.0:443.
Once the firewall rules are reloaded, navigate to [https://192.168.1.3/dokuwiki/doku.php?id=start](https://192.168.1.3/dokuwiki/doku.php?id=start) from your remote machine, accept the self-signed certificate warning, and your DokuWiki will load.
You
now caddy doesn't work at all
Gemini
Let's step back and fix it. When Caddy stops completely after updating the Caddyfile or Stack, it is almost always due to either a Caddyfile syntax issue or a port binding conflict (something else taking port 80/443).
Here is the exact troubleshooting process to get Caddy back up immediately:
Step 1: Check Caddy Container Logs
In Portainer, go to Containers caddy.
Scroll to the bottom. Look for red/warning lines:
failed to load configuration: Caddy didn't like something in theCaddyfile.bind: address already in use: Apache (httpd) or another service is still holding onto port 80 or 443 on host192.168.1.3.
Step 2: Use a Clean, Minimal Caddyfile
Replace your /srv/http/Caddyfile contents with this clean block to test:
:80, :443 {
tls internal
root * /srv/http
php_fastcgi php:9000
file_server
}
Using :80, :443 tells Caddy to listen on all local network interfaces (including 192.168.1.3 and garuda-6530) without needing hardcoded IP addresses or domain names.
Step 3: Check for Port Conflicts on Garuda
Run this command on your terminal to verify nothing else is occupying port 80 or 443 on your machine:
sudo ss -tulpn | grep -E ':(80|443)'
- If
httpd(Apache) shows up on port 80, Apache is blocking Caddy. Restart or stop Apache:sudo systemctl stop httpd
Step 4: Redeploy the Stack in Portainer
- Go to Stacks in Portainer
select your Caddy stack. - Confirm your YAML looks like this:
version: '3.8'
services:
caddy:
image: caddy:latest
container_name: caddy
restart: unless-stopped
ports:
- "80:80"
- "443:443"
volumes:
- /srv/http/Caddyfile:/etc/caddy/Caddyfile
- /srv/http:/srv/http
- caddy_data:/data
- caddy_config:/config
depends_on:
- php
php:
image: php:8.3-fpm
container_name: php-fpm
restart: unless-stopped
volumes:
- /srv/http:/srv/http
volumes:
caddy_data:
caddy_config:
- Click Update the stack (toggle on Re-pull image and redeploy if available).
Step 5: Test
Open your browser and navigate to:
[http://192.168.1.3/dokuwiki/doku.php?id=start](http://192.168.1.3/dokuwiki/doku.php?id=start)- or
[https://192.168.1.3/dokuwiki/doku.php?id=start](https://192.168.1.3/dokuwiki/doku.php?id=start)
What output or error message does the Portainer container log show now?
You
INF INF INF INF INF INF INF INF ts=1788299598.689778 INF INF INF INF INF INF INF INF ts=1788299598.689778 msg=maxprocs: Leaving GOMAXPROCS=4: CPU quota undefined
INF INF INF INF INF INF INF INF ts=1788299598.6898088 INF INF INF INF INF INF INF INF ts=1788299598.6898088 msg=GOMEMLIMIT is updated INF INF INF INF INF INF INF INF ts=1788299598.6898088 INF INF INF INF INF INF INF INF ts=1788299598.6898088 msg=GOMEMLIMIT is updated GOMEMLIMIT=14994561024 INF INF INF INF INF INF INF INF ts=1788299598.6898088 INF INF INF INF INF INF INF INF ts=1788299598.6898088 msg=GOMEMLIMIT is updated INF INF INF INF INF INF INF INF ts=1788299598.6898088 INF INF INF INF INF INF INF INF ts=1788299598.6898088 msg=GOMEMLIMIT is updated GOMEMLIMIT=14994561024 previous=9223372036854776000
INF INF INF INF INF INF INF INF ts=1788299598.6898146 INF INF INF INF INF INF INF INF ts=1788299598.6898146 msg=using config from file INF INF INF INF INF INF INF INF ts=1788299598.6898146 INF INF INF INF INF INF INF INF ts=1788299598.6898146 msg=using config from file file=/etc/caddy/Caddyfile
INF INF INF INF INF INF INF INF ts=1788299598.6898177 INF INF INF INF INF INF INF INF ts=1788299598.6898177 msg=adapted config to JSON INF INF INF INF INF INF INF INF ts=1788299598.6898177 INF INF INF INF INF INF INF INF ts=1788299598.6898177 msg=adapted config to JSON adapter=caddyfile
WRN WRN WRN WRN WRN WRN WRN WRN ts=1788299598.6898205 WRN WRN WRN WRN WRN WRN WRN WRN ts=1788299598.6898205 msg=Caddyfile input is not formatted; run 'caddy fmt --overwrite' to fix inconsistencies WRN WRN WRN WRN WRN WRN WRN WRN ts=1788299598.6898205 WRN WRN WRN WRN WRN WRN WRN WRN ts=1788299598.6898205 msg=Caddyfile input is not formatted; run 'caddy fmt --overwrite' to fix inconsistencies adapter=caddyfile WRN WRN WRN WRN WRN WRN WRN WRN ts=1788299598.6898205 WRN WRN WRN WRN WRN WRN WRN WRN ts=1788299598.6898205 msg=Caddyfile input is not formatted; run 'caddy fmt --overwrite' to fix inconsistencies WRN WRN WRN WRN WRN WRN WRN WRN ts=1788299598.6898205 WRN WRN WRN WRN WRN WRN WRN WRN ts=1788299598.6898205 msg=Caddyfile input is not formatted; run 'caddy fmt --overwrite' to fix inconsistencies adapter=caddyfile file=/etc/caddy/Caddyfile WRN WRN WRN WRN WRN WRN WRN WRN ts=1788299598.6898205 WRN WRN WRN WRN WRN WRN WRN WRN ts=1788299598.6898205 msg=Caddyfile input is not formatted; run 'caddy fmt --overwrite' to fix inconsistencies WRN WRN WRN WRN WRN WRN WRN WRN ts=1788299598.6898205 WRN WRN WRN WRN WRN WRN WRN WRN ts=1788299598.6898205 msg=Caddyfile input is not formatted; run 'caddy fmt --overwrite' to fix inconsistencies adapter=caddyfile WRN WRN WRN WRN WRN WRN WRN WRN ts=1788299598.6898205 WRN WRN WRN WRN WRN WRN WRN WRN ts=1788299598.6898205 msg=Caddyfile input is not formatted; run 'caddy fmt --overwrite' to fix inconsistencies WRN WRN WRN WRN WRN WRN WRN WRN ts=1788299598.6898205 WRN WRN WRN WRN WRN WRN WRN WRN ts=1788299598.6898205 msg=Caddyfile input is not formatted; run 'caddy fmt --overwrite' to fix inconsistencies adapter=caddyfile file=/etc/caddy/Caddyfile line=2
INF INF INF INF INF INF INF INF ts=1788299598.690974 INF INF INF INF INF INF INF INF ts=1788299598.690974 logger=admin INF INF INF INF INF INF INF INF ts=1788299598.690974 INF INF INF INF INF INF INF INF ts=1788299598.690974 logger=admin msg=admin endpoint started INF INF INF INF INF INF INF INF ts=1788299598.690974 INF INF INF INF INF INF INF INF ts=1788299598.690974 logger=admin INF INF INF INF INF INF INF INF ts=1788299598.690974 INF INF INF INF INF INF INF INF ts=1788299598.690974 logger=admin msg=admin endpoint started address=localhost:2019 INF INF INF INF INF INF INF INF ts=1788299598.690974 INF INF INF INF INF INF INF INF ts=1788299598.690974 logger=admin INF INF INF INF INF INF INF INF ts=1788299598.690974 INF INF INF INF INF INF INF INF ts=1788299598.690974 logger=admin msg=admin endpoint started INF INF INF INF INF INF INF INF ts=1788299598.690974 INF INF INF INF INF INF INF INF ts=1788299598.690974 logger=admin INF INF INF INF INF INF INF INF ts=1788299598.690974 INF INF INF INF INF INF INF INF ts=1788299598.690974 logger=admin msg=admin endpoint started address=localhost:2019 enforce_origin=false INF INF INF INF INF INF INF INF ts=1788299598.690974 INF INF INF INF INF INF INF INF ts=1788299598.690974 logger=admin INF INF INF INF INF INF INF INF ts=1788299598.690974 INF INF INF INF INF INF INF INF ts=1788299598.690974 logger=admin msg=admin endpoint started INF INF INF INF INF INF INF INF ts=1788299598.690974 INF INF INF INF INF INF INF INF ts=1788299598.690974 logger=admin INF INF INF INF INF INF INF INF ts=1788299598.690974 INF INF INF INF INF INF INF INF ts=1788299598.690974 logger=admin msg=admin endpoint started address=localhost:2019 INF INF INF INF INF INF INF INF ts=1788299598.690974 INF INF INF INF INF INF INF INF ts=1788299598.690974 logger=admin INF INF INF INF INF INF INF INF ts=1788299598.690974 INF INF INF INF INF INF INF INF ts=1788299598.690974 logger=admin msg=admin endpoint started INF INF INF INF INF INF INF INF ts=1788299598.690974 INF INF INF INF INF INF INF INF ts=1788299598.690974 logger=admin INF INF INF INF INF INF INF INF ts=1788299598.690974 INF INF INF INF INF INF INF INF ts=1788299598.690974 logger=admin msg=admin endpoint started address=localhost:2019 enforce_origin=false origins=["//127.0.0.1:2019","//localhost:2019","//[::1]:2019"]
INF INF INF INF INF INF INF INF ts=1788299598.6917427 INF INF INF INF INF INF INF INF ts=1788299598.6917427 logger=http.auto_https INF INF INF INF INF INF INF INF ts=1788299598.6917427 INF INF INF INF INF INF INF INF ts=1788299598.6917427 logger=http.auto_https msg=server is listening only on the HTTPS port but has no TLS connection policies; adding one to enable TLS INF INF INF INF INF INF INF INF ts=1788299598.6917427 INF INF INF INF INF INF INF INF ts=1788299598.6917427 logger=http.auto_https INF INF INF INF INF INF INF INF ts=1788299598.6917427 INF INF INF INF INF INF INF INF ts=1788299598.6917427 logger=http.auto_https msg=server is listening only on the HTTPS port but has no TLS connection policies; adding one to enable TLS server_name=srv0 INF INF INF INF INF INF INF INF ts=1788299598.6917427 INF INF INF INF INF INF INF INF ts=1788299598.6917427 logger=http.auto_https INF INF INF INF INF INF INF INF ts=1788299598.6917427 INF INF INF INF INF INF INF INF ts=1788299598.6917427 logger=http.auto_https msg=server is listening only on the HTTPS port but has no TLS connection policies; adding one to enable TLS INF INF INF INF INF INF INF INF ts=1788299598.6917427 INF INF INF INF INF INF INF INF ts=1788299598.6917427 logger=http.auto_https INF INF INF INF INF INF INF INF ts=1788299598.6917427 INF INF INF INF INF INF INF INF ts=1788299598.6917427 logger=http.auto_https msg=server is listening only on the HTTPS port but has no TLS connection policies; adding one to enable TLS server_name=srv0 https_port=443
INF INF INF INF INF INF INF INF ts=1788299598.6917794 INF INF INF INF INF INF INF INF ts=1788299598.6917794 logger=http.auto_https INF INF INF INF INF INF INF INF ts=1788299598.6917794 INF INF INF INF INF INF INF INF ts=1788299598.6917794 logger=http.auto_https msg=enabling automatic HTTP->HTTPS redirects INF INF INF INF INF INF INF INF ts=1788299598.6917794 INF INF INF INF INF INF INF INF ts=1788299598.6917794 logger=http.auto_https INF INF INF INF INF INF INF INF ts=1788299598.6917794 INF INF INF INF INF INF INF INF ts=1788299598.6917794 logger=http.auto_https msg=enabling automatic HTTP->HTTPS redirects server_name=srv0
INF INF INF INF INF INF INF INF ts=1788299598.6920717 INF INF INF INF INF INF INF INF ts=1788299598.6920717 logger=tls.cache.maintenance INF INF INF INF INF INF INF INF ts=1788299598.6920717 INF INF INF INF INF INF INF INF ts=1788299598.6920717 logger=tls.cache.maintenance msg=started background certificate maintenance INF INF INF INF INF INF INF INF ts=1788299598.6920717 INF INF INF INF INF INF INF INF ts=1788299598.6920717 logger=tls.cache.maintenance INF INF INF INF INF INF INF INF ts=1788299598.6920717 INF INF INF INF INF INF INF INF ts=1788299598.6920717 logger=tls.cache.maintenance msg=started background certificate maintenance cache=0x3d6903686200
WRN WRN WRN WRN WRN WRN WRN WRN ts=1788299598.7306929 WRN WRN WRN WRN WRN WRN WRN WRN ts=1788299598.7306929 logger=pki.ca.local WRN WRN WRN WRN WRN WRN WRN WRN ts=1788299598.7306929 WRN WRN WRN WRN WRN WRN WRN WRN ts=1788299598.7306929 logger=pki.ca.local msg=installing root certificate (you might be prompted for password) WRN WRN WRN WRN WRN WRN WRN WRN ts=1788299598.7306929 WRN WRN WRN WRN WRN WRN WRN WRN ts=1788299598.7306929 logger=pki.ca.local WRN WRN WRN WRN WRN WRN WRN WRN ts=1788299598.7306929 WRN WRN WRN WRN WRN WRN WRN WRN ts=1788299598.7306929 logger=pki.ca.local msg=installing root certificate (you might be prompted for password) path=storage:pki/authorities/local/root.crt
INF INF INF INF INF INF INF INF ts=1788299598.7318153 INF INF INF INF INF INF INF INF ts=1788299598.7318153 msg=warning: "certutil" is not available, install "certutil" with "apt install libnss3-tools" or "yum install nss-tools" and try again
INF INF INF INF INF INF INF INF ts=1788299598.732351 INF INF INF INF INF INF INF INF ts=1788299598.732351 msg=define JAVA_HOME environment variable to use the Java trust
INF INF INF INF INF INF INF INF ts=1788299598.7983236 INF INF INF INF INF INF INF INF ts=1788299598.7983236 msg=certificate installed properly in linux trusts
WRN WRN WRN WRN WRN WRN WRN WRN ts=1788299598.7986329 WRN WRN WRN WRN WRN WRN WRN WRN ts=1788299598.7986329 logger=http WRN WRN WRN WRN WRN WRN WRN WRN ts=1788299598.7986329 WRN WRN WRN WRN WRN WRN WRN WRN ts=1788299598.7986329 logger=http msg=HTTP/2 skipped because it requires TLS WRN WRN WRN WRN WRN WRN WRN WRN ts=1788299598.7986329 WRN WRN WRN WRN WRN WRN WRN WRN ts=1788299598.7986329 logger=http WRN WRN WRN WRN WRN WRN WRN WRN ts=1788299598.7986329 WRN WRN WRN WRN WRN WRN WRN WRN ts=1788299598.7986329 logger=http msg=HTTP/2 skipped because it requires TLS network=tcp WRN WRN WRN WRN WRN WRN WRN WRN ts=1788299598.7986329 WRN WRN WRN WRN WRN WRN WRN WRN ts=1788299598.7986329 logger=http WRN WRN WRN WRN WRN WRN WRN WRN ts=1788299598.7986329 WRN WRN WRN WRN WRN WRN WRN WRN ts=1788299598.7986329 logger=http msg=HTTP/2 skipped because it requires TLS WRN WRN WRN WRN WRN WRN WRN WRN ts=1788299598.7986329 WRN WRN WRN WRN WRN WRN WRN WRN ts=1788299598.7986329 logger=http WRN WRN WRN WRN WRN WRN WRN WRN ts=1788299598.7986329 WRN WRN WRN WRN WRN WRN WRN WRN ts=1788299598.7986329 logger=http msg=HTTP/2 skipped because it requires TLS network=tcp addr=:80
WRN WRN WRN WRN WRN WRN WRN WRN ts=1788299598.7986488 WRN WRN WRN WRN WRN WRN WRN WRN ts=1788299598.7986488 logger=http WRN WRN WRN WRN WRN WRN WRN WRN ts=1788299598.7986488 WRN WRN WRN WRN WRN WRN WRN WRN ts=1788299598.7986488 logger=http msg=HTTP/3 skipped because it requires TLS WRN WRN WRN WRN WRN WRN WRN WRN ts=1788299598.7986488 WRN WRN WRN WRN WRN WRN WRN WRN ts=1788299598.7986488 logger=http WRN WRN WRN WRN WRN WRN WRN WRN ts=1788299598.7986488 WRN WRN WRN WRN WRN WRN WRN WRN ts=1788299598.7986488 logger=http msg=HTTP/3 skipped because it requires TLS network=tcp WRN WRN WRN WRN WRN WRN WRN WRN ts=1788299598.7986488 WRN WRN WRN WRN WRN WRN WRN WRN ts=1788299598.7986488 logger=http WRN WRN WRN WRN WRN WRN WRN WRN ts=1788299598.7986488 WRN WRN WRN WRN WRN WRN WRN WRN ts=1788299598.7986488 logger=http msg=HTTP/3 skipped because it requires TLS WRN WRN WRN WRN WRN WRN WRN WRN ts=1788299598.7986488 WRN WRN WRN WRN WRN WRN WRN WRN ts=1788299598.7986488 logger=http WRN WRN WRN WRN WRN WRN WRN WRN ts=1788299598.7986488 WRN WRN WRN WRN WRN WRN WRN WRN ts=1788299598.7986488 logger=http msg=HTTP/3 skipped because it requires TLS network=tcp addr=:80
INF INF INF INF INF INF INF INF ts=1788299598.7986546 INF INF INF INF INF INF INF INF ts=1788299598.7986546 logger=http.log INF INF INF INF INF INF INF INF ts=1788299598.7986546 INF INF INF INF INF INF INF INF ts=1788299598.7986546 logger=http.log msg=server running INF INF INF INF INF INF INF INF ts=1788299598.7986546 INF INF INF INF INF INF INF INF ts=1788299598.7986546 logger=http.log INF INF INF INF INF INF INF INF ts=1788299598.7986546 INF INF INF INF INF INF INF INF ts=1788299598.7986546 logger=http.log msg=server running name=remaining_auto_https_redirects INF INF INF INF INF INF INF INF ts=1788299598.7986546 INF INF INF INF INF INF INF INF ts=1788299598.7986546 logger=http.log INF INF INF INF INF INF INF INF ts=1788299598.7986546 INF INF INF INF INF INF INF INF ts=1788299598.7986546 logger=http.log msg=server running INF INF INF INF INF INF INF INF ts=1788299598.7986546 INF INF INF INF INF INF INF INF ts=1788299598.7986546 logger=http.log INF INF INF INF INF INF INF INF ts=1788299598.7986546 INF INF INF INF INF INF INF INF ts=1788299598.7986546 logger=http.log msg=server running name=remaining_auto_https_redirects protocols=["h1","h2","h3"]
INF INF INF INF INF INF INF INF ts=1788299598.7987452 INF INF INF INF INF INF INF INF ts=1788299598.7987452 logger=http INF INF INF INF INF INF INF INF ts=1788299598.7987452 INF INF INF INF INF INF INF INF ts=1788299598.7987452 logger=http msg=enabling HTTP/3 listener INF INF INF INF INF INF INF INF ts=1788299598.7987452 INF INF INF INF INF INF INF INF ts=1788299598.7987452 logger=http INF INF INF INF INF INF INF INF ts=1788299598.7987452 INF INF INF INF INF INF INF INF ts=1788299598.7987452 logger=http msg=enabling HTTP/3 listener addr=:443
INF INF INF INF INF INF INF INF ts=1788299598.7989488 INF INF INF INF INF INF INF INF ts=1788299598.7989488 logger=http.log INF INF INF INF INF INF INF INF ts=1788299598.7989488 INF INF INF INF INF INF INF INF ts=1788299598.7989488 logger=http.log msg=server running INF INF INF INF INF INF INF INF ts=1788299598.7989488 INF INF INF INF INF INF INF INF ts=1788299598.7989488 logger=http.log INF INF INF INF INF INF INF INF ts=1788299598.7989488 INF INF INF INF INF INF INF INF ts=1788299598.7989488 logger=http.log msg=server running name=srv0 INF INF INF INF INF INF INF INF ts=1788299598.7989488 INF INF INF INF INF INF INF INF ts=1788299598.7989488 logger=http.log INF INF INF INF INF INF INF INF ts=1788299598.7989488 INF INF INF INF INF INF INF INF ts=1788299598.7989488 logger=http.log msg=server running INF INF INF INF INF INF INF INF ts=1788299598.7989488 INF INF INF INF INF INF INF INF ts=1788299598.7989488 logger=http.log INF INF INF INF INF INF INF INF ts=1788299598.7989488 INF INF INF INF INF INF INF INF ts=1788299598.7989488 logger=http.log msg=server running name=srv0 protocols=["h1","h2","h3"]
INF INF INF INF INF INF INF INF ts=1788299598.798962 INF INF INF INF INF INF INF INF ts=1788299598.798962 logger=http INF INF INF INF INF INF INF INF ts=1788299598.798962 INF INF INF INF INF INF INF INF ts=1788299598.798962 logger=http msg=enabling automatic TLS certificate management INF INF INF INF INF INF INF INF ts=1788299598.798962 INF INF INF INF INF INF INF INF ts=1788299598.798962 logger=http INF INF INF INF INF INF INF INF ts=1788299598.798962 INF INF INF INF INF INF INF INF ts=1788299598.798962 logger=http msg=enabling automatic TLS certificate management domains=["garuda-6530","192.168.1.3"]
INF INF INF INF INF INF INF INF ts=1788299598.7991328 INF INF INF INF INF INF INF INF ts=1788299598.7991328 msg=autosaved config (load with --resume flag) INF INF INF INF INF INF INF INF ts=1788299598.7991328 INF INF INF INF INF INF INF INF ts=1788299598.7991328 msg=autosaved config (load with --resume flag) file=/config/caddy/autosave.json
INF INF INF INF INF INF INF INF ts=1788299598.7991445 INF INF INF INF INF INF INF INF ts=1788299598.7991445 msg=serving initial configuration
{"level":"info","ts":1788299598.8031309,"logger":"tls","msg":"storage cleaning happened too recently; skipping for now","storage":"FileStorage:/data/caddy","instance":"18b79885-7440-4a8e-92e4-969b64b813d7","try_again":1788385998.8031282,"try_again_in":86399.999998841}
INF INF INF INF INF INF INF INF ts=1788299598.8032959 INF INF INF INF INF INF INF INF ts=1788299598.8032959 logger=tls INF INF INF INF INF INF INF INF ts=1788299598.8032959 INF INF INF INF INF INF INF INF ts=1788299598.8032959 logger=tls msg=finished cleaning storage units
INF INF INF INF INF INF INF INF ts=1788299598.805231 INF INF INF INF INF INF INF INF ts=1788299598.805231 logger=tls.obtain INF INF INF INF INF INF INF INF ts=1788299598.805231 INF INF INF INF INF INF INF INF ts=1788299598.805231 logger=tls.obtain msg=acquiring lock INF INF INF INF INF INF INF INF ts=1788299598.805231 INF INF INF INF INF INF INF INF ts=1788299598.805231 logger=tls.obtain INF INF INF INF INF INF INF INF ts=1788299598.805231 INF INF INF INF INF INF INF INF ts=1788299598.805231 logger=tls.obtain msg=acquiring lock identifier=192.168.1.3
INF INF INF INF INF INF INF INF ts=1788299598.8070493 INF INF INF INF INF INF INF INF ts=1788299598.8070493 logger=tls.obtain INF INF INF INF INF INF INF INF ts=1788299598.8070493 INF INF INF INF INF INF INF INF ts=1788299598.8070493 logger=tls.obtain msg=lock acquired INF INF INF INF INF INF INF INF ts=1788299598.8070493 INF INF INF INF INF INF INF INF ts=1788299598.8070493 logger=tls.obtain INF INF INF INF INF INF INF INF ts=1788299598.8070493 INF INF INF INF INF INF INF INF ts=1788299598.8070493 logger=tls.obtain msg=lock acquired identifier=192.168.1.3
INF INF INF INF INF INF INF INF ts=1788299598.8072076 INF INF INF INF INF INF INF INF ts=1788299598.8072076 logger=tls.obtain INF INF INF INF INF INF INF INF ts=1788299598.8072076 INF INF INF INF INF INF INF INF ts=1788299598.8072076 logger=tls.obtain msg=obtaining certificate INF INF INF INF INF INF INF INF ts=1788299598.8072076 INF INF INF INF INF INF INF INF ts=1788299598.8072076 logger=tls.obtain INF INF INF INF INF INF INF INF ts=1788299598.8072076 INF INF INF INF INF INF INF INF ts=1788299598.8072076 logger=tls.obtain msg=obtaining certificate identifier=192.168.1.3
INF INF INF INF INF INF INF INF ts=1788299598.8187592 INF INF INF INF INF INF INF INF ts=1788299598.8187592 logger=tls.obtain INF INF INF INF INF INF INF INF ts=1788299598.8187592 INF INF INF INF INF INF INF INF ts=1788299598.8187592 logger=tls.obtain msg=certificate obtained successfully INF INF INF INF INF INF INF INF ts=1788299598.8187592 INF INF INF INF INF INF INF INF ts=1788299598.8187592 logger=tls.obtain INF INF INF INF INF INF INF INF ts=1788299598.8187592 INF INF INF INF INF INF INF INF ts=1788299598.8187592 logger=tls.obtain msg=certificate obtained successfully identifier=192.168.1.3 INF INF INF INF INF INF INF INF ts=1788299598.8187592 INF INF INF INF INF INF INF INF ts=1788299598.8187592 logger=tls.obtain INF INF INF INF INF INF INF INF ts=1788299598.8187592 INF INF INF INF INF INF INF INF ts=1788299598.8187592 logger=tls.obtain msg=certificate obtained successfully INF INF INF INF INF INF INF INF ts=1788299598.8187592 INF INF INF INF INF INF INF INF ts=1788299598.8187592 logger=tls.obtain INF INF INF INF INF INF INF INF ts=1788299598.8187592 INF INF INF INF INF INF INF INF ts=1788299598.8187592 logger=tls.obtain msg=certificate obtained successfully identifier=192.168.1.3 issuer=local
INF INF INF INF INF INF INF INF ts=1788299598.8189526 INF INF INF INF INF INF INF INF ts=1788299598.8189526 logger=tls.obtain INF INF INF INF INF INF INF INF ts=1788299598.8189526 INF INF INF INF INF INF INF INF ts=1788299598.8189526 logger=tls.obtain msg=releasing lock INF INF INF INF INF INF INF INF ts=1788299598.8189526 INF INF INF INF INF INF INF INF ts=1788299598.8189526 logger=tls.obtain INF INF INF INF INF INF INF INF ts=1788299598.8189526 INF INF INF INF INF INF INF INF ts=1788299598.8189526 logger=tls.obtain msg=releasing lock identifier=192.168.1.3
INF INF INF INF INF INF INF INF ts=1788300636.826686 INF INF INF INF INF INF INF INF ts=1788300636.826686 msg=shutting down apps, then terminating INF INF INF INF INF INF INF INF ts=1788300636.826686 INF INF INF INF INF INF INF INF ts=1788300636.826686 msg=shutting down apps, then terminating signal=SIGTERM
WRN WRN WRN WRN WRN WRN WRN WRN ts=1788300636.8267517 WRN WRN WRN WRN WRN WRN WRN WRN ts=1788300636.8267517 msg=exiting; byeee!! 👋 WRN WRN WRN WRN WRN WRN WRN WRN ts=1788300636.8267517 WRN WRN WRN WRN WRN WRN WRN WRN ts=1788300636.8267517 msg=exiting; byeee!! 👋 signal=SIGTERM
INF INF INF INF INF INF INF INF ts=1788300636.8268263 INF INF INF INF INF INF INF INF ts=1788300636.8268263 logger=http INF INF INF INF INF INF INF INF ts=1788300636.8268263 INF INF INF INF INF INF INF INF ts=1788300636.8268263 logger=http msg=servers shutting down with eternal grace period
INF INF INF INF INF INF INF INF ts=1788300636.8343146 INF INF INF INF INF INF INF INF ts=1788300636.8343146 logger=admin INF INF INF INF INF INF INF INF ts=1788300636.8343146 INF INF INF INF INF INF INF INF ts=1788300636.8343146 logger=admin msg=stopped previous server INF INF INF INF INF INF INF INF ts=1788300636.8343146 INF INF INF INF INF INF INF INF ts=1788300636.8343146 logger=admin INF INF INF INF INF INF INF INF ts=1788300636.8343146 INF INF INF INF INF INF INF INF ts=1788300636.8343146 logger=admin msg=stopped previous server address=localhost:2019
INF INF INF INF INF INF INF INF ts=1788300636.834594 INF INF INF INF INF INF INF INF ts=1788300636.834594 msg=shutdown complete INF INF INF INF INF INF INF INF ts=1788300636.834594 INF INF INF INF INF INF INF INF ts=1788300636.834594 msg=shutdown complete signal=SIGTERM INF INF INF INF INF INF INF INF ts=1788300636.834594 INF INF INF INF INF INF INF INF ts=1788300636.834594 msg=shutdown complete INF INF INF INF INF INF INF INF ts=1788300636.834594 INF INF INF INF INF INF INF INF ts=1788300636.834594 msg=shutdown complete signal=SIGTERM exit_code=0
INF INF INF INF INF INF INF INF ts=1788300686.3502073 INF INF INF INF INF INF INF INF ts=1788300686.3502073 msg=maxprocs: Leaving GOMAXPROCS=4: CPU quota undefined
INF INF INF INF INF INF INF INF ts=1788300686.3507645 INF INF INF INF INF INF INF INF ts=1788300686.3507645 msg=GOMEMLIMIT is updated INF INF INF INF INF INF INF INF ts=1788300686.3507645 INF INF INF INF INF INF INF INF ts=1788300686.3507645 msg=GOMEMLIMIT is updated GOMEMLIMIT=14994564710 INF INF INF INF INF INF INF INF ts=1788300686.3507645 INF INF INF INF INF INF INF INF ts=1788300686.3507645 msg=GOMEMLIMIT is updated INF INF INF INF INF INF INF INF ts=1788300686.3507645 INF INF INF INF INF INF INF INF ts=1788300686.3507645 msg=GOMEMLIMIT is updated GOMEMLIMIT=14994564710 previous=9223372036854776000
INF INF INF INF INF INF INF INF ts=1788300686.350833 INF INF INF INF INF INF INF INF ts=1788300686.350833 msg=using config from file INF INF INF INF INF INF INF INF ts=1788300686.350833 INF INF INF INF INF INF INF INF ts=1788300686.350833 msg=using config from file file=/etc/caddy/Caddyfile
INF INF INF INF INF INF INF INF ts=1788300686.3508787 INF INF INF INF INF INF INF INF ts=1788300686.3508787 msg=adapted config to JSON INF INF INF INF INF INF INF INF ts=1788300686.3508787 INF INF INF INF INF INF INF INF ts=1788300686.3508787 msg=adapted config to JSON adapter=caddyfile
WRN WRN WRN WRN WRN WRN WRN WRN ts=1788300686.3508985 WRN WRN WRN WRN WRN WRN WRN WRN ts=1788300686.3508985 msg=Caddyfile input is not formatted; run 'caddy fmt --overwrite' to fix inconsistencies WRN WRN WRN WRN WRN WRN WRN WRN ts=1788300686.3508985 WRN WRN WRN WRN WRN WRN WRN WRN ts=1788300686.3508985 msg=Caddyfile input is not formatted; run 'caddy fmt --overwrite' to fix inconsistencies adapter=caddyfile WRN WRN WRN WRN WRN WRN WRN WRN ts=1788300686.3508985 WRN WRN WRN WRN WRN WRN WRN WRN ts=1788300686.3508985 msg=Caddyfile input is not formatted; run 'caddy fmt --overwrite' to fix inconsistencies WRN WRN WRN WRN WRN WRN WRN WRN ts=1788300686.3508985 WRN WRN WRN WRN WRN WRN WRN WRN ts=1788300686.3508985 msg=Caddyfile input is not formatted; run 'caddy fmt --overwrite' to fix inconsistencies adapter=caddyfile file=/etc/caddy/Caddyfile WRN WRN WRN WRN WRN WRN WRN WRN ts=1788300686.3508985 WRN WRN WRN WRN WRN WRN WRN WRN ts=1788300686.3508985 msg=Caddyfile input is not formatted; run 'caddy fmt --overwrite' to fix inconsistencies WRN WRN WRN WRN WRN WRN WRN WRN ts=1788300686.3508985 WRN WRN WRN WRN WRN WRN WRN WRN ts=1788300686.3508985 msg=Caddyfile input is not formatted; run 'caddy fmt --overwrite' to fix inconsistencies adapter=caddyfile WRN WRN WRN WRN WRN WRN WRN WRN ts=1788300686.3508985 WRN WRN WRN WRN WRN WRN WRN WRN ts=1788300686.3508985 msg=Caddyfile input is not formatted; run 'caddy fmt --overwrite' to fix inconsistencies WRN WRN WRN WRN WRN WRN WRN WRN ts=1788300686.3508985 WRN WRN WRN WRN WRN WRN WRN WRN ts=1788300686.3508985 msg=Caddyfile input is not formatted; run 'caddy fmt --overwrite' to fix inconsistencies adapter=caddyfile file=/etc/caddy/Caddyfile line=2
INF INF INF INF INF INF INF INF ts=1788300686.3519928 INF INF INF INF INF INF INF INF ts=1788300686.3519928 logger=admin INF INF INF INF INF INF INF INF ts=1788300686.3519928 INF INF INF INF INF INF INF INF ts=1788300686.3519928 logger=admin msg=admin endpoint started INF INF INF INF INF INF INF INF ts=1788300686.3519928 INF INF INF INF INF INF INF INF ts=1788300686.3519928 logger=admin INF INF INF INF INF INF INF INF ts=1788300686.3519928 INF INF INF INF INF INF INF INF ts=1788300686.3519928 logger=admin msg=admin endpoint started address=localhost:2019 INF INF INF INF INF INF INF INF ts=1788300686.3519928 INF INF INF INF INF INF INF INF ts=1788300686.3519928 logger=admin INF INF INF INF INF INF INF INF ts=1788300686.3519928 INF INF INF INF INF INF INF INF ts=1788300686.3519928 logger=admin msg=admin endpoint started INF INF INF INF INF INF INF INF ts=1788300686.3519928 INF INF INF INF INF INF INF INF ts=1788300686.3519928 logger=admin INF INF INF INF INF INF INF INF ts=1788300686.3519928 INF INF INF INF INF INF INF INF ts=1788300686.3519928 logger=admin msg=admin endpoint started address=localhost:2019 enforce_origin=false INF INF INF INF INF INF INF INF ts=1788300686.3519928 INF INF INF INF INF INF INF INF ts=1788300686.3519928 logger=admin INF INF INF INF INF INF INF INF ts=1788300686.3519928 INF INF INF INF INF INF INF INF ts=1788300686.3519928 logger=admin msg=admin endpoint started INF INF INF INF INF INF INF INF ts=1788300686.3519928 INF INF INF INF INF INF INF INF ts=1788300686.3519928 logger=admin INF INF INF INF INF INF INF INF ts=1788300686.3519928 INF INF INF INF INF INF INF INF ts=1788300686.3519928 logger=admin msg=admin endpoint started address=localhost:2019 INF INF INF INF INF INF INF INF ts=1788300686.3519928 INF INF INF INF INF INF INF INF ts=1788300686.3519928 logger=admin INF INF INF INF INF INF INF INF ts=1788300686.3519928 INF INF INF INF INF INF INF INF ts=1788300686.3519928 logger=admin msg=admin endpoint started INF INF INF INF INF INF INF INF ts=1788300686.3519928 INF INF INF INF INF INF INF INF ts=1788300686.3519928 logger=admin INF INF INF INF INF INF INF INF ts=1788300686.3519928 INF INF INF INF INF INF INF INF ts=1788300686.3519928 logger=admin msg=admin endpoint started address=localhost:2019 enforce_origin=false origins=["//localhost:2019","//[::1]:2019","//127.0.0.1:2019"]
INF INF INF INF INF INF INF INF ts=1788300686.3531117 INF INF INF INF INF INF INF INF ts=1788300686.3531117 logger=http.auto_https INF INF INF INF INF INF INF INF ts=1788300686.3531117 INF INF INF INF INF INF INF INF ts=1788300686.3531117 logger=http.auto_https msg=server is listening only on the HTTPS port but has no TLS connection policies; adding one to enable TLS INF INF INF INF INF INF INF INF ts=1788300686.3531117 INF INF INF INF INF INF INF INF ts=1788300686.3531117 logger=http.auto_https INF INF INF INF INF INF INF INF ts=1788300686.3531117 INF INF INF INF INF INF INF INF ts=1788300686.3531117 logger=http.auto_https msg=server is listening only on the HTTPS port but has no TLS connection policies; adding one to enable TLS server_name=srv0 INF INF INF INF INF INF INF INF ts=1788300686.3531117 INF INF INF INF INF INF INF INF ts=1788300686.3531117 logger=http.auto_https INF INF INF INF INF INF INF INF ts=1788300686.3531117 INF INF INF INF INF INF INF INF ts=1788300686.3531117 logger=http.auto_https msg=server is listening only on the HTTPS port but has no TLS connection policies; adding one to enable TLS INF INF INF INF INF INF INF INF ts=1788300686.3531117 INF INF INF INF INF INF INF INF ts=1788300686.3531117 logger=http.auto_https INF INF INF INF INF INF INF INF ts=1788300686.3531117 INF INF INF INF INF INF INF INF ts=1788300686.3531117 logger=http.auto_https msg=server is listening only on the HTTPS port but has no TLS connection policies; adding one to enable TLS server_name=srv0 https_port=443
INF INF INF INF INF INF INF INF ts=1788300686.3532066 INF INF INF INF INF INF INF INF ts=1788300686.3532066 logger=http.auto_https INF INF INF INF INF INF INF INF ts=1788300686.3532066 INF INF INF INF INF INF INF INF ts=1788300686.3532066 logger=http.auto_https msg=enabling automatic HTTP->HTTPS redirects INF INF INF INF INF INF INF INF ts=1788300686.3532066 INF INF INF INF INF INF INF INF ts=1788300686.3532066 logger=http.auto_https INF INF INF INF INF INF INF INF ts=1788300686.3532066 INF INF INF INF INF INF INF INF ts=1788300686.3532066 logger=http.auto_https msg=enabling automatic HTTP->HTTPS redirects server_name=srv0
WRN WRN WRN WRN WRN WRN WRN WRN ts=1788300686.3542063 WRN WRN WRN WRN WRN WRN WRN WRN ts=1788300686.3542063 logger=http WRN WRN WRN WRN WRN WRN WRN WRN ts=1788300686.3542063 WRN WRN WRN WRN WRN WRN WRN WRN ts=1788300686.3542063 logger=http msg=HTTP/2 skipped because it requires TLS WRN WRN WRN WRN WRN WRN WRN WRN ts=1788300686.3542063 WRN WRN WRN WRN WRN WRN WRN WRN ts=1788300686.3542063 logger=http WRN WRN WRN WRN WRN WRN WRN WRN ts=1788300686.3542063 WRN WRN WRN WRN WRN WRN WRN WRN ts=1788300686.3542063 logger=http msg=HTTP/2 skipped because it requires TLS network=tcp WRN WRN WRN WRN WRN WRN WRN WRN ts=1788300686.3542063 WRN WRN WRN WRN WRN WRN WRN WRN ts=1788300686.3542063 logger=http WRN WRN WRN WRN WRN WRN WRN WRN ts=1788300686.3542063 WRN WRN WRN WRN WRN WRN WRN WRN ts=1788300686.3542063 logger=http msg=HTTP/2 skipped because it requires TLS WRN WRN WRN WRN WRN WRN WRN WRN ts=1788300686.3542063 WRN WRN WRN WRN WRN WRN WRN WRN ts=1788300686.3542063 logger=http WRN WRN WRN WRN WRN WRN WRN WRN ts=1788300686.3542063 WRN WRN WRN WRN WRN WRN WRN WRN ts=1788300686.3542063 logger=http msg=HTTP/2 skipped because it requires TLS network=tcp addr=:80
WRN WRN WRN WRN WRN WRN WRN WRN ts=1788300686.354267 WRN WRN WRN WRN WRN WRN WRN WRN ts=1788300686.354267 logger=http WRN WRN WRN WRN WRN WRN WRN WRN ts=1788300686.354267 WRN WRN WRN WRN WRN WRN WRN WRN ts=1788300686.354267 logger=http msg=HTTP/3 skipped because it requires TLS WRN WRN WRN WRN WRN WRN WRN WRN ts=1788300686.354267 WRN WRN WRN WRN WRN WRN WRN WRN ts=1788300686.354267 logger=http WRN WRN WRN WRN WRN WRN WRN WRN ts=1788300686.354267 WRN WRN WRN WRN WRN WRN WRN WRN ts=1788300686.354267 logger=http msg=HTTP/3 skipped because it requires TLS network=tcp WRN WRN WRN WRN WRN WRN WRN WRN ts=1788300686.354267 WRN WRN WRN WRN WRN WRN WRN WRN ts=1788300686.354267 logger=http WRN WRN WRN WRN WRN WRN WRN WRN ts=1788300686.354267 WRN WRN WRN WRN WRN WRN WRN WRN ts=1788300686.354267 logger=http msg=HTTP/3 skipped because it requires TLS WRN WRN WRN WRN WRN WRN WRN WRN ts=1788300686.354267 WRN WRN WRN WRN WRN WRN WRN WRN ts=1788300686.354267 logger=http WRN WRN WRN WRN WRN WRN WRN WRN ts=1788300686.354267 WRN WRN WRN WRN WRN WRN WRN WRN ts=1788300686.354267 logger=http msg=HTTP/3 skipped because it requires TLS network=tcp addr=:80
INF INF INF INF INF INF INF INF ts=1788300686.3542948 INF INF INF INF INF INF INF INF ts=1788300686.3542948 logger=http.log INF INF INF INF INF INF INF INF ts=1788300686.3542948 INF INF INF INF INF INF INF INF ts=1788300686.3542948 logger=http.log msg=server running INF INF INF INF INF INF INF INF ts=1788300686.3542948 INF INF INF INF INF INF INF INF ts=1788300686.3542948 logger=http.log INF INF INF INF INF INF INF INF ts=1788300686.3542948 INF INF INF INF INF INF INF INF ts=1788300686.3542948 logger=http.log msg=server running name=remaining_auto_https_redirects INF INF INF INF INF INF INF INF ts=1788300686.3542948 INF INF INF INF INF INF INF INF ts=1788300686.3542948 logger=http.log INF INF INF INF INF INF INF INF ts=1788300686.3542948 INF INF INF INF INF INF INF INF ts=1788300686.3542948 logger=http.log msg=server running INF INF INF INF INF INF INF INF ts=1788300686.3542948 INF INF INF INF INF INF INF INF ts=1788300686.3542948 logger=http.log INF INF INF INF INF INF INF INF ts=1788300686.3542948 INF INF INF INF INF INF INF INF ts=1788300686.3542948 logger=http.log msg=server running name=remaining_auto_https_redirects protocols=["h1","h2","h3"]
INF INF INF INF INF INF INF INF ts=1788300686.35439 INF INF INF INF INF INF INF INF ts=1788300686.35439 logger=http INF INF INF INF INF INF INF INF ts=1788300686.35439 INF INF INF INF INF INF INF INF ts=1788300686.35439 logger=http msg=enabling HTTP/3 listener INF INF INF INF INF INF INF INF ts=1788300686.35439 INF INF INF INF INF INF INF INF ts=1788300686.35439 logger=http INF INF INF INF INF INF INF INF ts=1788300686.35439 INF INF INF INF INF INF INF INF ts=1788300686.35439 logger=http msg=enabling HTTP/3 listener addr=:443
INF INF INF INF INF INF INF INF ts=1788300686.354602 INF INF INF INF INF INF INF INF ts=1788300686.354602 logger=http.log INF INF INF INF INF INF INF INF ts=1788300686.354602 INF INF INF INF INF INF INF INF ts=1788300686.354602 logger=http.log msg=server running INF INF INF INF INF INF INF INF ts=1788300686.354602 INF INF INF INF INF INF INF INF ts=1788300686.354602 logger=http.log INF INF INF INF INF INF INF INF ts=1788300686.354602 INF INF INF INF INF INF INF INF ts=1788300686.354602 logger=http.log msg=server running name=srv0 INF INF INF INF INF INF INF INF ts=1788300686.354602 INF INF INF INF INF INF INF INF ts=1788300686.354602 logger=http.log INF INF INF INF INF INF INF INF ts=1788300686.354602 INF INF INF INF INF INF INF INF ts=1788300686.354602 logger=http.log msg=server running INF INF INF INF INF INF INF INF ts=1788300686.354602 INF INF INF INF INF INF INF INF ts=1788300686.354602 logger=http.log INF INF INF INF INF INF INF INF ts=1788300686.354602 INF INF INF INF INF INF INF INF ts=1788300686.354602 logger=http.log msg=server running name=srv0 protocols=["h1","h2","h3"]
INF INF INF INF INF INF INF INF ts=1788300686.3546448 INF INF INF INF INF INF INF INF ts=1788300686.3546448 logger=http INF INF INF INF INF INF INF INF ts=1788300686.3546448 INF INF INF INF INF INF INF INF ts=1788300686.3546448 logger=http msg=enabling automatic TLS certificate management INF INF INF INF INF INF INF INF ts=1788300686.3546448 INF INF INF INF INF INF INF INF ts=1788300686.3546448 logger=http INF INF INF INF INF INF INF INF ts=1788300686.3546448 INF INF INF INF INF INF INF INF ts=1788300686.3546448 logger=http msg=enabling automatic TLS certificate management domains=["192.168.1.3","garuda-6530"]
INF INF INF INF INF INF INF INF ts=1788300686.3555713 INF INF INF INF INF INF INF INF ts=1788300686.3555713 logger=tls.cache.maintenance INF INF INF INF INF INF INF INF ts=1788300686.3555713 INF INF INF INF INF INF INF INF ts=1788300686.3555713 logger=tls.cache.maintenance msg=started background certificate maintenance INF INF INF INF INF INF INF INF ts=1788300686.3555713 INF INF INF INF INF INF INF INF ts=1788300686.3555713 logger=tls.cache.maintenance INF INF INF INF INF INF INF INF ts=1788300686.3555713 INF INF INF INF INF INF INF INF ts=1788300686.3555713 logger=tls.cache.maintenance msg=started background certificate maintenance cache=0x3d16a3f29a80
{"level":"info","ts":1788300686.3941977,"logger":"tls","msg":"storage cleaning happened too recently; skipping for now","storage":"FileStorage:/data/caddy","instance":"18b79885-7440-4a8e-92e4-969b64b813d7","try_again":1788387086.3941925,"try_again_in":86399.999998579}
INF INF INF INF INF INF INF INF ts=1788300686.3946047 INF INF INF INF INF INF INF INF ts=1788300686.3946047 logger=tls INF INF INF INF INF INF INF INF ts=1788300686.3946047 INF INF INF INF INF INF INF INF ts=1788300686.3946047 logger=tls msg=finished cleaning storage units
INF INF INF INF INF INF INF INF ts=1788300686.4880233 INF INF INF INF INF INF INF INF ts=1788300686.4880233 logger=pki.ca.local INF INF INF INF INF INF INF INF ts=1788300686.4880233 INF INF INF INF INF INF INF INF ts=1788300686.4880233 logger=pki.ca.local msg=root certificate is already trusted by system INF INF INF INF INF INF INF INF ts=1788300686.4880233 INF INF INF INF INF INF INF INF ts=1788300686.4880233 logger=pki.ca.local INF INF INF INF INF INF INF INF ts=1788300686.4880233 INF INF INF INF INF INF INF INF ts=1788300686.4880233 logger=pki.ca.local msg=root certificate is already trusted by system path=storage:pki/authorities/local/root.crt
INF INF INF INF INF INF INF INF ts=1788300686.4884048 INF INF INF INF INF INF INF INF ts=1788300686.4884048 msg=autosaved config (load with --resume flag) INF INF INF INF INF INF INF INF ts=1788300686.4884048 INF INF INF INF INF INF INF INF ts=1788300686.4884048 msg=autosaved config (load with --resume flag) file=/config/caddy/autosave.json
INF INF INF INF INF INF INF INF ts=1788300686.4884222 INF INF INF INF INF INF INF INF ts=1788300686.4884222 msg=serving initial configuration
Gemini
Looking closely at these logs, Caddy is actually running cleanly with zero errors.
It successfully generated internal TLS certificates for both garuda-6530 and 192.168.1.3, bound to ports 80 and 443, and finished startup (serving initial configuration).
Since Caddy itself is up, the reason you can't reach it from another computer on your local network comes down to network routing or firewall rules.
Step 1: Ensure URL Protocol
Make sure you are explicitly typing https:// on the client machine:
[https://192.168.1.3/dokuwiki/doku.php?id=start](https://192.168.1.3/dokuwiki/doku.php?id=start)
(If you type plain 192.168.1.3 without https://, browser auto-redirects or port 80 blocks might drop the connection).
Step 2: Open Ports in Garuda's Firewall
Garuda Linux blocks incoming ports by default. On the garuda-6530 machine, open ports 80 and 443 in firewalld:
sudo firewall-cmd --zone=public --add-port=80/tcp --permanent
sudo firewall-cmd --zone=public --add-port=443/tcp --permanent
sudo firewall-cmd --reload
Step 3: Test Local Access First
On the garuda-6530 machine itself, open a terminal or browser and test:
curl -k https://192.168.1.3/dokuwiki/doku.php?id=start
- If
curlreturns your DokuWiki HTML: Caddy and PHP-FPM are working properly. The issue is strictly the host firewall (Step 2) blocking external network requests. - If
curlhangs or fails: Check if Docker container port mappings in Portainer show0.0.0.0:80->80/tcpand0.0.0.0:443->443/tcp.
You
─garyrust@garuda-6530 in ~ took 0s
╰─λ curl -k https://192.168.1.3/dokuwiki/doku.php?id=start
curl: (35) TLS connect error: error:0A000438:SSL routines::tlsv1 alert internal error
╭─garyrust@garuda-6530 in ~ took 0s
[🔴] ×
Gemini
That tlsv1 alert internal error (alert code 80) happens because Caddy is attempting to generate a certificate using its internal Certificate Authority (CA), but the tls internal handshake is failing when matched against raw IP addresses or default server blocks without explicit TLS parameters.
To fix this immediately for local IP and local network access, configure Caddy to use its built-in self-signed certificate generator using tls internal explicitly inside the site block, or simplify how Caddy handles local TLS for IP addresses.
Step 1: Update /srv/http/Caddyfile
Update your /srv/http/Caddyfile to the following format. Listing the IP explicitly with tls internal ensures Caddy issues a valid local self-signed cert for both the hostname and the raw IP address:
garuda-6530, 192.168.1.3, localhost {
tls internal
root * /srv/http
php_fastcgi php:9000
file_server
}
Step 2: Clear Caddy's Broken Certificate Cache
When Caddy fails a local TLS generation attempt, it sometimes caches the broken certificate state in its volume. Clear the cached internal certificates so Caddy generates fresh ones:
In your terminal on garuda-6530:
# Stop the stack or container via Portainer (or run docker stop caddy)
sudo docker exec -it caddy rm -rf /data/caddy/pki /data/caddy/certificates/local
Step 3: Restart Caddy Stack in Portainer
- Go to Portainer
Stacks Update the stack (or restart the container). - Run the test command again on your terminal:
curl -k https://192.168.1.3/dokuwiki/doku.php?id=start
Alternative: Pure HTTP Mode for Local LAN Testing
If you don't specifically need local HTTPS while testing on your home network and want to bypass TLS issues entirely until you set up your Cloudflare/DuckDNS domain:
:80 {
root * /srv/http
php_fastcgi php:9000
file_server
}
Then access your wiki over plain HTTP:
[http://192.168.1.3/dokuwiki/doku.php?id=start](http://192.168.1.3/dokuwiki/doku.php?id=start)
You
╭─garyrust@garuda-6530 in ~ as 🧙 took 0s
╰─λ curl -k https://192.168.1.3/dokuwiki/doku.php?id=start
curl: (35) TLS connect error: error:0A000438:SSL routines::tlsv1 alert internal error
╭─garyrust@garuda-6530 in ~ as 🧙 took 0s
[🔴] ×
Gemini
That TLS alert error happens because Caddy's internal Certificate Authority tries to match SNI (Server Name Indication) when establishing a TLS connection. When you run curl or access a site using a raw IP address like 192.168.1.3, Caddy often fails to negotiate the handshake unless internal TLS is explicitly assigned to that IP host block.
Here is the exact fix to get local HTTPS working smoothly across your network:
Step 1: Explicitly Define tls internal in Caddyfile
Edit /srv/http/Caddyfile to declare the IP and hostnames explicitly with the tls internal directive:
192.168.1.3, garuda-6530, localhost {
tls internal
root * /srv/http
php_fastcgi php:9000
file_server
}
Step 2: Clear the Local Certificate Cache
Caddy likely saved an incomplete or failed certificate state in its data directory. Clear the local PKI storage inside the container:
Run this terminal command on garuda-6530:
docker exec -it caddy rm -rf /data/caddy/pki /data/caddy/certificates/local
Step 3: Restart the Stack in Portainer
Go to Portainer
Step 4: Verify Local & Network Access
Test it again from your terminal:
curl -k https://192.168.1.3/dokuwiki/doku.php?id=start
Once curl returns your DokuWiki HTML output locally, open a browser on any device on your 192.168.1.x network and visit:
[https://192.168.1.3/dokuwiki/doku.php?id=start](https://192.168.1.3/dokuwiki/doku.php?id=start)
(Accept the browser self-signed security prompt on first load, and it will serve DokuWiki over local HTTPS).
You
╭─garyrust@garuda-6530 in ~ as 🧙 took 0s
╰─λ curl -k https://192.168.1.3/dokuwiki/doku.php?id=start
curl: (35) TLS connect error: error:0A000438:SSL routines::tlsv1 alert internal error
╭─garyrust@garuda-6530 in ~ as 🧙 took 0s
[🔴] ×
Gemini
The issue is that Caddy’s internal CA cannot generate a valid internal certificate for a raw IP address (192.168.1.3) using tls internal without explicit IP SAN (Subject Alternative Name) handling or using standard HTTP for IP access. When curl sends an IP address over TLS without an SNI host match, Caddy triggers a TLS alert internal error.
Here are the two ways to fix this.
Solution 1: Switch to Pure HTTP for IP Access (Recommended for Local LAN)
If you are using raw IP addresses (192.168.1.3) across your home network for local testing, standard HTTP avoids TLS handshake errors entirely until you attach a real domain name (like DuckDNS or Cloudflare).
1. Update /srv/http/Caddyfile:
:80 {
root * /srv/http
php_fastcgi php:9000
file_server
}
2. Update Portainer Stack & Deploy
Ensure ports 80:80 are published, then redeploy the stack.
3. Test:
curl http://192.168.1.3/dokuwiki/doku.php?id=start
You can now access [http://192.168.1.3/dokuwiki/doku.php?id=start](http://192.168.1.3/dokuwiki/doku.php?id=start) from any device on your local network.
Solution 2: Force Auto-HTTPS with Self-Signed Certificates
If you must have HTTPS on raw IP addresses locally, tell Caddy to auto-generate a self-signed certificate specifically using tls internal at the top-level global options block so it applies to IP connections.
1. Update /srv/http/Caddyfile:
{
# Enable internal CA for all local/IP blocks
local_certs
}
192.168.1.3, garuda-6530, localhost {
root * /srv/http
php_fastcgi php:9000
file_server
}
2. Clear Caddy's PKI Cache (Required)
Caddy keeps bad certificate attempts in its named volume. Wipe the cached certificates inside the running container:
docker exec -it caddy rm -rf /data/caddy/pki /data/caddy/certificates
3. Restart the Stack & Test:
Restart the Caddy container in Portainer, then test again:
curl -k https://192.168.1.3/dokuwiki/doku.php?id=start
Once curl -k returns your DokuWiki HTML output, open your browser to [https://192.168.1.3/dokuwiki/doku.php?id=start](https://192.168.1.3/dokuwiki/doku.php?id=start) and accept the self-signed certificate prompt.
You
╭─garyrust@garuda-6530 in ~ as 🧙 took 0s
╰─λ curl -k https://192.168.1.3/dokuwiki/doku.php?id=start
curl: (35) TLS connect error: error:0A000438:SSL routines::tlsv1 alert internal error
╭─garyrust@garuda-6530 in ~ as 🧙 took 0s
[🔴] ×
Gemini
tlsv1 alert internal error happens because Caddy's internal Certificate Authority cannot generate internal TLS certificates for raw IP addresses (like 192.168.1.3).
When Caddy sees an IP address in a site block, its internal ACME engine attempts to obtain a standard public certificate, fails, and sends a TLS alert during the handshake.
To resolve this on your network, use one of the two solutions below depending on your goal.
Solution 1: Use Plain HTTP for Local IP Access (Easiest)
If you are just testing locally over your IP address, running plain HTTP on port 80 avoids TLS handshake issues completely.
1. Update /srv/http/Caddyfile:
:80 {
root * /srv/http
php_fastcgi php:9000
file_server
}
2. Update Stack in Portainer & Test:
Redeploy your stack and run:
curl http://192.168.1.3/dokuwiki/doku.php?id=start
You can now access [http://192.168.1.3/dokuwiki/doku.php?id=start](http://192.168.1.3/dokuwiki/doku.php?id=start) from any machine on your network.
Solution 2: HTTPS via Hostname or.localhost
If you require HTTPS locally, use a domain-like hostname (such as garuda-6530.local or garuda-6530.localhost) instead of a raw IP address. Caddy handles internal TLS certificates for hostnames without issues.
1. Update /srv/http/Caddyfile:
garuda-6530.local, garuda-6530.localhost {
tls internal
root * /srv/http
php_fastcgi php:9000
file_server
}
2. Clear Caddy's PKI Cache (Required)
Wipe the cached failed certificate state inside the container:
docker exec -it caddy rm -rf /data/caddy/pki /data/caddy/certificates
3. Update Stack & Test:
Redeploy the stack in Portainer, then test locally:
curl -k https://garuda-6530.local/dokuwiki/doku.php?id=start
On other computers on your network, navigate to [https://garuda-6530.local/dokuwiki/doku.php?id=start](https://garuda-6530.local/dokuwiki/doku.php?id=start) and accept the self-signed certificate prompt.
You
<div class="level2">
<p>
<strong><a href="/dokuwiki/doku.php?id=start#top" class="wikilink1" title="start" data-wiki-id="start">Top</a></strong> <br/>
<img src="/dokuwiki/lib/images/smileys/smile2.svg" class="icon smiley" alt="=)" /> <strong><a href="/dokuwiki/doku.php?id=coqui_stt_tts_dokuwiki_page" class="wikilink1" title="coqui_stt_tts_dokuwiki_page" data-wiki-id="coqui_stt_tts_dokuwiki_page">Coqui STT&TTS Dokuwiki Page</a></strong> <br/>
</p>
<p>
<a href="https://www.youtube.com/watch?v=ba-HMvDn\_vU&list=PLUl4u3cNGP60IKRN\_pFptIBxeiMc0MCJP" class="urlextern" title="https://www.youtube.com/watch?v=ba-HMvDn\_vU&list=PLUl4u3cNGP60IKRN\_pFptIBxeiMc0MCJP" rel="ugc nofollow">The Human Brain, Spring 2019 Playlist</a> - <a href="https://youtu.be/XHyASP49ses" class="urlextern" title="https://youtu.be/XHyASP49ses" rel="ugc nofollow">Deep Learning Frameworks - TensorFlow, PyTorch, fast.ai - AI Podcast Clips</a> <br/>
<a href="https://www.debugpoint.com/2018/07/speech-recognition-to-text-in-linux-ubuntu-using-google-docs/" class="urlextern" title="https://www.debugpoint.com/2018/07/speech-recognition-to-text-in-linux-ubuntu-using-google-docs/" rel="ugc nofollow">Speech Recognition to Text in Linux, Ubuntu using Google Docs</a> <br/>
<iframe src="https://www.debugpoint.com/2018/07/speech-recognition-to-text-in-linux-ubuntu-using-google-docs/" width="800" height="700" allow="autoplay"></iframe>
<br/>
</p>
<p>
<img src="/dokuwiki/lib/images/smileys/smile2.svg" class="icon smiley" alt="=)" /> <strong><a href="/dokuwiki/doku.php?id=coqui_stt_tts_dokuwiki_page" class="wikilink1" title="coqui_stt_tts_dokuwiki_page" data-wiki-id="coqui_stt_tts_dokuwiki_page">Coqui STT&TTS Dokuwiki Page</a></strong> <br/>
<strong><a href="https://coqui.ai/blog" class="urlextern" title="https://coqui.ai/blog" rel="ugc nofollow">Coqui STT/TTS is an open source embedded speech-to text/text-to-speech engine</a></strong> <br/>
</p>
<p>
<a href="https://tts.readthedocs.io/en/latest/" class="urlextern" title="https://tts.readthedocs.io/en/latest/" rel="ugc nofollow">Text-to-Speech generation</a> - <a href="https://erogol.github.io/ddc-samples/" class="urlextern" title="https://erogol.github.io/ddc-samples/" rel="ugc nofollow">TTS v2 Samples</a><br/>
<iframe src="https://tts.readthedocs.io/en/latest/" width="800" height="700" allow="autoplay"></iframe>
<br/>
</p>
<p>
<a href="https://stt.readthedocs.io/en/latest/" class="urlextern" title="https://stt.readthedocs.io/en/latest/" rel="ugc nofollow">Coqui STT Quickstart</a> <br/>
<iframe src="https://stt.readthedocs.io/en/latest/" width="800" height="700" allow="autoplay"></iframe>
<br/>
</p>
<p>
<a href="http://espeak.sourceforge.net/docindex.html" class="urlextern" title="http://espeak.sourceforge.net/docindex.html" rel="ugc nofollow">eSpeak - Documents</a> - <a href="https://www.tecmint.com/zenity-creates-graphical-gtk-dialog-boxes-in-command-line-and-shell-scripts/" class="urlextern" title="https://www.tecmint.com/zenity-creates-graphical-gtk-dialog-boxes-in-command-line-and-shell-scripts/" rel="ugc nofollow">Zenity</a> <br/>
<iframe src="http://espeak.sourceforge.net/docindex.html" width="800" height="400" allow="autoplay"></iframe>
<br/>
</p>
<p>
<a href="https://www.mushcultsupply.com/shop/p/lions-mane-kit" class="urlextern" title="https://www.mushcultsupply.com/shop/p/lions-mane-kit" rel="ugc nofollow">Lion's Mane Kit - $10.99</a> - <a href="https://youtu.be/pYQ-1a36vU8" class="urlextern" title="https://youtu.be/pYQ-1a36vU8" rel="ugc nofollow">Broke Boi Tek Mushroom Growing for Beginners - No Pressure Cooker Needed!</a> Youtube <br/>
<iframe src="https://www.mushrooms.com/mushroom-spores-cultures/magic-mushrooms/mushroom-spore-syringes/cubensis" width="800" height="400" allow="autoplay"></iframe>
<br/>
</p>
</div>
<h2 class="sectionedit71" id=" dockstarter">69. DockSTARTer</h2>
<div class="level2">
<p>
<strong><a href="/dokuwiki/doku.php?id=start#top" class="wikilink1" title="start" data-wiki-id="start">Top</a></strong><br/>
<script type="text/javascript" src="ip.php"></script>
</p>
<p>
<head>
<title> iFrame </title>
<script language="javascript">
function LoadPage(){
var objFrame=document.getElementById("myIframe");
objFrame.src=document.getElementById("URL").value;
}
</script>
</head>
<body>
<div style="Clear:both;">
<input type="text" value="https://dockstarter.com/overrides/introduction/" class="frmUrlVal" ID="URL">
<input type="submit" class="frmSubmit" value="Go" onclick="LoadPage()">
<input type="button" VALUE="< < Back " onClick="myIframe.history.back()">
<input type="button" VALUE="Forward > >" onClick="myIframe.history.forward()">
</div>
<iframe align="center" width="800" height="800" src="https://dockstarter.com/overrides/introduction/" frameborder=yes scrolling="yes" name="myIframe" id="myIframe"> </iframe>
</body>
<br/>
</p>
<p>
<a href="https://teejeetech.com/2020/09/05/linux-multi-boot-with-refind/" class="urlextern" title="https://teejeetech.com/2020/09/05/linux-multi-boot-with-refind/" rel="ugc nofollow">Linux Multi-boot with Refind</a><br/>
</p>
</div>
<h2 class="sectionedit72" id=" tiny_home">70. Tiny Home</h2>
<div class="level2">
<p>
<strong><a href="/dokuwiki/doku.php?id=start#top" class="wikilink1" title="start" data-wiki-id="start">Top</a></strong><br/>
<a href="https://www.wikiwand.com/en/Boxabl" class="urlextern" title="https://www.wikiwand.com/en/Boxabl" rel="ugc nofollow">https://www.wikiwand.com/en/Boxabl\<br/>
<iframe width="800" height="800" src="https://www.wikiwand.com/en/Boxabl" frameborder="0" allow="autoplay; encrypted-media" allowfullscreen></iframe>
<br/>
<strong><a href="/dokuwiki/doku.php?id=start#top" class="wikilink1" title="start" data-wiki-id="start">Top</a></strong><br/>
<a href="https://www.boxabl.com" class="urlextern" title="https://www.boxabl.com" rel="ugc nofollow">https://www.boxabl.com\<br/>
<iframe width="800" height="800" src="https://www.boxabl.com/tours/" frameborder="0" allow="autoplay; encrypted-media" allowfullscreen></iframe>
<br/>
<strong><a href="/dokuwiki/doku.php?id=start#top" class="wikilink1" title="start" data-wiki-id="start">Top</a></strong><br/>
<a href="https://youtu.be/8JMrfSFQdpo?si=k4VdGwMvRXuBKHCT" class="urlextern" title="https://youtu.be/8JMrfSFQdpo?si=k4VdGwMvRXuBKHCT" rel="ugc nofollow">https://youtu.be/8JMrfSFQdpo?si=k4VdGwMvRXuBKHCT\<br/>
<iframe width="800" height="450" src="https://www.youtube.com/embed/8JMrfSFQdpo?si=k4VdGwMvRXuBKHCT" title="YouTube video player" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share" allowfullscreen></iframe>
<br/>
<strong><a href="/dokuwiki/doku.php?id=start#top" class="wikilink1" title="start" data-wiki-id="start">Top</a></strong><br/>
<a href="https://www.vesta-homes.net" class="urlextern" title="https://www.vesta-homes.net" rel="ugc nofollow">https://www.vesta-homes.net\<br/>
CLICK ON PICTURE<br/>
<a
href="https://www.vesta-homes.net" target="_blank"><img
style="border: 2px solid; width: 800px; height: 450px;"
alt="Vesta Homes"
<br/>
<strong><a href="/dokuwiki/doku.php?id=start#top" class="wikilink1" title="start" data-wiki-id="start">Top</a></strong><br/>
<a href="https://youtu.be/ar\_gU8zMD5E?si=RtLQFFxSAMsX8c60" class="urlextern" title="https://youtu.be/ar\_gU8zMD5E?si=RtLQFFxSAMsX8c60" rel="ugc nofollow">https://youtu.be/ar\_gU8zMD5E?si=RtLQFFxSAMsX8c60\<br/>
<iframe width="800" height="450" src="https://www.youtube.com/embed/ar\_gU8zMD5E?si=RtLQFFxSAMsX8c60" title="YouTube video player" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share" allowfullscreen></iframe>
<br/>
</p>
</div>
<h2 class="sectionedit73" id=" loopholes_you_can_exploit_to_cheat_the_system">71. Loopholes You Can Exploit to Cheat the System</h2>
<div class="level2">
<p>
<strong><a href="/dokuwiki/doku.php?id=start#top" class="wikilink1" title="start" data-wiki-id="start">Top</a></strong><br/>
<strong>The Perfect Crime</strong> <br/>
<a href="https://youtu.be/vTgqRx\_ABtk?si=d7tg-GnnfBsoBnos" class="urlextern" title="https://youtu.be/vTgqRx\_ABtk?si=d7tg-GnnfBsoBnos" rel="ugc nofollow">https://youtu.be/vTgqRx\_ABtk?si=d7tg-GnnfBsoBnos\<br/>
<<iframe width="800" height="450" src="https://www.youtube.com/embed/vTgqRx\_ABtk?si=MMIctn4VFhV4Tmwm" title="YouTube video player" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share" allowfullscreen></iframe>
<br/>
</p>
</div>
<h2 class="sectionedit74" id=" mount_a_virtualbox_drive_image_vdi">72. Mount a VirtualBox drive image (vdi)?</h2>
<div class="level2">
<p>
<strong><a href="/dokuwiki/doku.php?id=start#top" class="wikilink1" title="start" data-wiki-id="start">Top</a></strong><br/>
<strong><a href="https://askubuntu.com/questions/19430/mount-a-virtualbox-drive-image-vdi?fbclid=IwAR0GKctu56F88dVBAXTHYwgVEjHT9zhMGmNB\_exm7jKucniGej8gEvlx9\_o\_aem\_AWXrdsOlaegaic2KEF71iW27qExXaCJA7ET6sT-CcmvFc8pLwQvoqvXdW-PcAy4ToqUgfLqfxoTUrlksDhDBsQx1" class="urlextern" title="https://askubuntu.com/questions/19430/mount-a-virtualbox-drive-image-vdi?fbclid=IwAR0GKctu56F88dVBAXTHYwgVEjHT9zhMGmNB\_exm7jKucniGej8gEvlx9\_o\_aem\_AWXrdsOlaegaic2KEF71iW27qExXaCJA7ET6sT-CcmvFc8pLwQvoqvXdW-PcAy4ToqUgfLqfxoTUrlksDhDBsQx1" rel="ugc nofollow">Mount a VirtualBox drive image (vdi)?</a></strong> <br/>
<xmp>
Then you'll need to load the network block device module:
sudo rmmod nbd
sudo modprobe nbd max_part=16
Attach the.vdi image to one of the nbd you just created:
sudo qemu-nbd -c /dev/nbd0 /media/garyrust/DataJMicron/VM/Garuda/garuda-virtual.vdi
Now you will get a /dev/nbd0 block device, along with several /dev/nbd0p* partition device nodes.
gparted /dev/nbd0
sudo gparted /dev/nbd0
dd if=/dev/sdb5 of=/dev/nbd0p2 bs=4096 status=progress
resize 237585 in gparted
# sudo mount /dev/nbd0p2 /mnt
exit gparted
sudo mount /dev/nbd0p2 /mnt
change fstab
Once you are done, unmount everything and disconnect the device:
sudo qemu-nbd -d /dev/nbd0
####################
Convert a virtual disk image to qcow2 format for use in VM Runtime on GDC
qemu-img convert -f vdi -O qcow2 garuda-virtual.vdi garuda-virtual.qcow2
</xmp>
</p>
</div>
<h2 class="sectionedit75" id=" embed_videos_playlists_instructions">73. Embed videos & playlists Instructions</h2>
<div class="level2">
<p>
<strong><a href="/dokuwiki/doku.php?id=start#top" class="wikilink1" title="start" data-wiki-id="start">Top</a></strong><br/>
</p>
<pre class="code">Two different ways:
--------------------------------------------------
1> See below video - How to View All of a Channel's Uploads in a Playlist
- (Replace UC with UU in &list=) - https://www.youtube.com/watch?v=jk4FsbaTTwM
--------------------------------------------------
<html>
<iframe width="800" height="450" src="https://www.youtube.com/embed/videoseries?list=UUZdQjaSoLjIzFnWsDQOv4ww" frameborder="0" allow="autoplay; encrypted-media" allowfullscreen></iframe>
</html><br>
--------------------------------------------------
or
--------------------------------------------------
2> See Another way (below) - Using username - https://youtu.be/DVgMhCWhv70
--------------------------------------------------
<html>
<iframe src="http://www.youtube.com/embed/?listType=user\_uploads&list=briantrautman" width="800" height="450" frameBorder="0"></iframe>
</html><br>
--------------------------------------------------
ONE PAGE ONLY
--------------------------------------------------
<html>
<iframe width=100% height="700" src="https://en.wikibooks.org/wiki/Bash\_Shell\_Scripting" frameborder="0" allow="autoplay; encrypted-media" allowfullscreen></iframe>
</html> <br>
--------------------------------------------------
Image Link
--------------------------------------------------
<html><a href="https://bit.ly/2RnTFjg" target="_blank"><img title="Hells Kitchen Roku Channel"
style="border: 0px solid; width: 200px; height: 300px;"
alt="Hells Kitchen Roku Channel"
--------------------------------------------------</pre>
<p>
<a href="https://www.youtube.com/watch?v=jk4FsbaTTwM" class="urlextern" title="https://www.youtube.com/watch?v=jk4FsbaTTwM" rel="ugc nofollow">How to View All of a Channel's Uploads in a Playlist (Still Works 2018)</a><br/>
<youtube><a href="https://www.youtube.com/watch?v=jk4FsbaTTwM" class="urlextern" title="https://www.youtube.com/watch?v=jk4FsbaTTwM" rel="ugc nofollow">https://www.youtube.com/watch?v=jk4FsbaTTwM\</youtube><br/>
———————————————————<br/>
<strong><a href="/dokuwiki/doku.php?id=start#top" class="wikilink1" title="start" data-wiki-id="start">Top</a></strong><br/>
<a href="https://www.techuntold.com/embed-start-youtube-video-certain-time/" class="urlextern" title="https://www.techuntold.com/embed-start-youtube-video-certain-time/" rel="ugc nofollow">How to Embed and Start YouTube Video At Certain Time</a><br/>
Example: Observe the video link. Something like?t=01m15s <br/>
<iframe width="800" height="700" src="https://www.techuntold.com/embed-start-youtube-video-certain-time/" frameborder="0" allow="autoplay; encrypted-media" allowfullscreen></iframe>
<br/>
<a href="https://youtu.be/A63imEmP\_-I" class="urlextern" title="https://youtu.be/A63imEmP\_-I" rel="ugc nofollow">YouTube Clips</a><br/>
<iframe width="560" height="315" src="https://www.youtube.com/embed/A63imEmP\_-I" title="YouTube video player" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture" allowfullscreen></iframe>
<br/>
</p>
<pre class="code">Youtube started adding "?disable_polymer=1" to the end
of a lot of their urls now. When you're copying a channel
code in the url, DON'T INCLUDE THIS EXTRA STRING. Just
copy up to the question mark. If the video you're pasting
the code onto has the same disable polymer string, then
delete it before copying the code.
See above video (Replace UC with UU in &list=)</pre>
<p>
<a href="https://stackoverflow.com/questions/31956221/how-to-disable-auto-play-for-local-video-in-iframe" class="urlextern" title="https://stackoverflow.com/questions/31956221/how-to-disable-auto-play-for-local-video-in-iframe" rel="ugc nofollow">How to disable auto-play for local video in iframe</a> <br/>
</p>
<pre class="code">To disable auto-play,
<video width="800" height="450" controls>
<source src="https://bit.ly/2QOWYzu" type="video/mp4">
</video><br>
To enable auto-play,
<video width="800" height="450" controls autoplay>
<source src="videos/example.mp4" type="video/mp4">
</video></pre>
<p>
———————————————————<br/>
</p>
</div>
<div class="clearer"></div>
</div>
<div class="catlinks noprint"><p>
<span class="bchead">Trace:</span> <span class="bcsep">•</span> <span class="curid"><bdi><a href="/dokuwiki/doku.php?id=start" class="breadcrumbs" title="start">start</a></bdi></span>
</p></div>
</div>
<div id="head" class="noprint">
<div id="p-personal">
<ul>
<li id="pt-login"><a href="/dokuwiki/doku.php?id=start&do=login" rel="nofollow">Log In</a></li>
</ul>
</div>
<div id="left-navigation">
<div id="p-namespaces" class="vectorTabs">
<ul>
<li id="ca-nstab-main" class="selected"><a href="/dokuwiki/doku.php?id=start"><span>Article</span></a></li>
<li id="ca-talk"><a href="/dokuwiki/doku.php?id=talk:start"><span>Discussion</span></a></li>
</ul>
</div>
</div>
<div id="right-navigation">
<div id="p-views" class="vectorTabs">
<ul>
<li id="ca-view" class="selected"><a href="/dokuwiki/doku.php?id=start"><span>Read</span></a></li>
<li id="ca-edit"><a href="/dokuwiki/doku.php?id=start&do=edit&rev=1788170134" accesskey="E" title="[ALT+E]"><span>Show pagesource</span></a></li>
<li id="ca-history"><a href="/dokuwiki/doku.php?id=start&do=revisions" accesskey="O" title="[ALT+O]"><span>Old revisions</span></a></li>
</ul>
</div>
<div id="p-search">
<h5>
<label for="qsearch__in">Search</label>
</h5>
<form action="/dokuwiki/doku.php?id=start" accept-charset="utf-8" id="dw__search" name="dw__search">
<input type="hidden" name="do" value="search" />
<div id="simpleSearch">
<input id="qsearch__in" name="id" type="text" accesskey="f" value="" />
<button id="searchButton" type="submit" name="button" title="Search for this text"> </button>
</div>
<div id="qsearch__out" class="ajax_qsearch JSpopup"></div>
</form>
</div>
</div>
</div>
<div id="panel" class="noprint">
<div id="p-logo">
<a href="/dokuwiki/doku.php?id=start" style="background-image:url(/dokuwiki/lib/tpl/vector/static/3rd/dokuwiki/logo.png);" accesskey="h" title="[ALT+H]"></a>
</div>
<div id="p-navigation" class="portal">
<h5>Navigation</h5>
<div class="body">
<div class="dokuwiki">
<ul>
<li class="level1"><div class="li"> <a href="/dokuwiki/doku.php?id=wiki:navigation&id=start&do=index" class="wikilink1" title="wiki:navigation" data-wiki-id="wiki:navigation">Sitemap</a> - <a href="/dokuwiki/doku.php?id=wiki:navigation&id=start&do=index&vecdo=print" class="wikilink1" title="wiki:navigation" data-wiki-id="wiki:navigation">Printable</a></div>
</li>
<li class="level1"><div class="li"> <a href="/dokuwiki/doku.php?id=bookmarks" class="wikilink1" title="bookmarks" data-wiki-id="bookmarks">Bookmarks</a> - <a href="/dokuwiki/doku.php?id=sandbox" class="wikilink1" title="sandbox" data-wiki-id="sandbox">Sandbox</a></div>
</li>
<li class="level1"><div class="li"> <a href="https://tinyurl.com/app/" class="urlextern" title="https://tinyurl.com/app/" rel="ugc nofollow">TinyURL</a></div>
</li>
<li class="level1"><div class="li"> <a href="/dokuwiki/doku.php?id=wiki:phone" class="wikilink1" title="wiki:phone" data-wiki-id="wiki:phone">Phone</a> - <a href="https://www.duckdns.org/domains" class="urlextern" title="https://www.duckdns.org/domains" rel="ugc nofollow">ip</a> - <a href="https://bit.ly/2A7za4W" class="urlextern" title="https://bit.ly/2A7za4W" rel="ugc nofollow">myip</a> - <a href="/dokuwiki/doku.php?id=wiki:navigation&id=wiki:phone&vecdo=print" class="wikilink1" title="wiki:navigation" data-wiki-id="wiki:navigation">Print</a></div>
</li>
</ul>
<ul>
<li class="level1"><div class="li"> <a href="/dokuwiki/doku.php?id=start" class="wikilink1" title="start" data-wiki-id="start">Main Page</a> - <a href="/dokuwiki/doku.php?id=start2" class="wikilink1" title="start2" data-wiki-id="start2">Main Page2</a></div>
</li>
<li class="level1"><div class="li"> <a href="http://n6xre.duckdns.org/dokuwiki/doku.php?id=start" class="urlextern" title="http://n6xre.duckdns.org/dokuwiki/doku.php?id=start" rel="ugc nofollow">Hostinger</a> - <a href="http://192.168.1.1/dokuwiki/" class="urlextern" title="http://192.168.1.1/dokuwiki/" rel="ugc nofollow">1</a> - <a href="http://192.168.1.2/dokuwiki/" class="urlextern" title="http://192.168.1.2/dokuwiki/" rel="ugc nofollow">2</a> - <a href="http://192.168.1.3/dokuwiki/" class="urlextern" title="http://192.168.1.3/dokuwiki/" rel="ugc nofollow">3</a> - <a href="http://192.168.1.4/dokuwiki/" class="urlextern" title="http://192.168.1.4/dokuwiki/" rel="ugc nofollow">4</a> - <a href="http://192.168.1.5/dokuwiki/" class="urlextern" title="http://192.168.1.5/dokuwiki/" rel="ugc nofollow">5</a> - <a href="http://192.168.1.6/dokuwiki/" class="urlextern" title="http://192.168.1.6/dokuwiki/" rel="ugc nofollow">6</a> - <a href="http://192.168.1.7/dokuwiki/" class="urlextern" title="http://192.168.1.7/dokuwiki/" rel="ugc nofollow">7</a> - <a href="http://192.168.1.8/dokuwiki/" class="urlextern" title="http://192.168.1.8/dokuwiki/" rel="ugc nofollow">8</a> - <a href="http://192.168.1.10/dokuwiki/" class="urlextern" title="http://192.168.1.10/dokuwiki/" rel="ugc nofollow">10</a> - <a href="http://192.168.1.11/dokuwiki/" class="urlextern" title="http://192.168.1.11/dokuwiki/" rel="ugc nofollow">11</a> - <a href="http://localhost/dokuwiki/" class="urlextern" title="http://localhost/dokuwiki/" rel="ugc nofollow">local</a></div>
</li>
<li class="level1"><div class="li"> <a href="/dokuwiki/doku.php?id=start# links" class="wikilink1" title="start" data-wiki-id="start">Links</a></div>
</li>
<li class="level1"><div class="li"> <a href="http://192.168.1.3:59125" class="urlextern" title="http://192.168.1.3:59125" rel="ugc nofollow">Mimic 3 TTS (local)</a></div>
</li>
<li class="level1"><div class="li"> <a href="https://browse.library.kiwix.org/viewer#wikipedia\_en\_all\_maxi\_2026-02/User%3AThe\_other\_Kiwix\_guy/Landing" class="urlextern" title="https://browse.library.kiwix.org/viewer#wikipedia\_en\_all\_maxi\_2026-02/User%3AThe\_other\_Kiwix\_guy/Landing" rel="ugc nofollow">Kiwixpedia</a> - <a href="https://library.kiwix.org/?lang=eng" class="urlextern" title="https://library.kiwix.org/?lang=eng" rel="ugc nofollow">1103 books</a></div>
</li>
<li class="level1"><div class="li"> <a href="http://192.168.1.11" class="urlextern" title="http://192.168.1.11" rel="ugc nofollow">camera1</a> - <a href="http://192.168.1.92/" class="urlextern" title="http://192.168.1.92/" rel="ugc nofollow">camera2</a></div>
</li>
<li class="level1"><div class="li"> <a href="https://wego.here.com/?map=36.15594,-115.10756,15,normal" class="urlextern" title="https://wego.here.com/?map=36.15594,-115.10756,15,normal" rel="ugc nofollow">Here</a> Map -
<a href="sliderule/" target="_blank">Sliderule</a>
</div>
</li>
<li class="level1"><div class="li"> <a href="https://my.callcentric.com/click2dial.php" class="urlextern" title="https://my.callcentric.com/click2dial.php" rel="ugc nofollow">Callcentric Click 2 dial</a></div>
</li>
<li class="level1"><div class="li"> <a href="https://mail.google.com/" class="urlextern" title="https://mail.google.com/" rel="ugc nofollow">GoogleMail</a> - <a href="https://www.youmail.com/youmail/home" class="urlextern" title="https://www.youmail.com/youmail/home" rel="ugc nofollow">YouMail</a></div>
</li>
<li class="level1"><div class="li"> <a href="https://www.tensorflow.org/" class="urlextern" title="https://www.tensorflow.org/" rel="ugc nofollow">TensorFlow</a> - <a href="http://localhost:8888/" class="urlextern" title="http://localhost:8888/" rel="ugc nofollow">Jupyter</a></div>
</li>
<li class="level1"><div class="li"> <a href="https://jupyter-notebook.readthedocs.io/en/latest/index.html#" class="urlextern" title="https://jupyter-notebook.readthedocs.io/en/latest/index.html#" rel="ugc nofollow">Jupyter Docs</a> - <a href="https://docs.netlify.com/" class="urlextern" title="https://docs.netlify.com/" rel="ugc nofollow">Netlify</a></div>
</li>
</ul>
<p>
<a href="./videos/" target="_blank">Videos</a> - <a href="./Music/" target="_blank">Music</a>
- <a href="/dokuwiki/doku.php?id=start#plutotv" class="wikilink1" title="start" data-wiki-id="start">PlutoTV</a> <br/>
<a href="https://therokuchannel.roku.com/" target="_blank">The Roku Channel</a>
</p>
<ul>
<li class="level1"><div class="li"> <a href="http://n6xre.tiddlyspot.com/" class="urlextern" title="http://n6xre.tiddlyspot.com/" rel="ugc nofollow">n6xre.tiddlyspot.com</a></div>
</li>
<li class="level1"><div class="li"> Append &vecdo=print </div>
</li>
<li class="level1"><div class="li"> for printable dokuwiki pg</div>
</li>
<li class="level1"><div class="li"> <a href="/dokuwiki/doku.php?id=links" class="wikilink1" title="links" data-wiki-id="links">More Links</a></div>
</li>
</ul>
<p>
—-
</p>
<ul>
<li class="level1"><div class="li"> <a href="/dokuwiki/doku.php?id=wiki:syntax" class="wikilink1" title="wiki:syntax" data-wiki-id="wiki:syntax">Formatting Syntax</a></div>
</li>
<li class="level1"><div class="li"> Jabber Local Admin <br/>
</div>
</li>
</ul>
<p>
<a href="http://192.168.11.115:9090/index.jsp" class="urlextern" title="http://192.168.11.115:9090/index.jsp" rel="ugc nofollow">115</a> - <a href="http://192.168.11.122:9090/index.jsp" class="urlextern" title="http://192.168.11.122:9090/index.jsp" rel="ugc nofollow">122</a> - <a href="http://192.168.11.103:9090/index.jsp" class="urlextern" title="http://192.168.11.103:9090/index.jsp" rel="ugc nofollow">103</a>
</p>
<ul>
<li class="level1"><div class="li"> <a href="https://bitly.com/" class="urlextern" title="https://bitly.com/" rel="ugc nofollow">Link Management</a></div>
</li>
<li class="level1"><div class="li"> <strong>qBittorrent -</strong> <a href="http://192.168.11.115:8181/" class="urlextern" title="http://192.168.11.115:8181/" rel="ugc nofollow">115</a> - <a href="http://192.168.11.122:8181/" class="urlextern" title="http://192.168.11.122:8181/" rel="ugc nofollow">122</a></div>
</li>
<li class="level1"><div class="li"> <a href="https://www.youtube.com/channel/UCvTtU0DkR9ZAaLnnD9zy07A/playlists?view\_as=subscriber" class="urlextern" title="https://www.youtube.com/channel/UCvTtU0DkR9ZAaLnnD9zy07A/playlists?view\_as=subscriber" rel="ugc nofollow">Youtube Playlists</a></div>
</li>
<li class="level1"><div class="li"> <a href="http://192.168.11.122:32400/web" class="urlextern" title="http://192.168.11.122:32400/web" rel="ugc nofollow">Plex Server</a></div>
</li>
<li class="level1"><div class="li"> <a href="http://gis.rtcsnv.com/InteractiveMap/#main-nav" class="urlextern" title="http://gis.rtcsnv.com/InteractiveMap/#main-nav" rel="ugc nofollow">RTC Transit</a></div>
</li>
<li class="level1"><div class="li"> <a href="https://www.rtcsnv.com/ways-to-travel/transit-services/services-for-veterans/vmtn-online-trip-request/" class="urlextern" title="https://www.rtcsnv.com/ways-to-travel/transit-services/services-for-veterans/vmtn-online-trip-request/" rel="ugc nofollow">VMTN Trip Request</a></div>
</li>
<li class="level1"><div class="li"> <a href="https://www.myhealth.va.gov/mhv-portal-web/home" class="urlextern" title="https://www.myhealth.va.gov/mhv-portal-web/home" rel="ugc nofollow">My Healthy Vet</a></div>
</li>
<li class="level1"><div class="li"> <a href="https://mobile.va.gov/app/va-video-connect" class="urlextern" title="https://mobile.va.gov/app/va-video-connect" rel="ugc nofollow">VA Video Connect</a></div>
</li>
<li class="level1"><div class="li"> <a href="https://www.pay.gov/public/home" class="urlextern" title="https://www.pay.gov/public/home" rel="ugc nofollow">Pay Gov</a></div>
</li>
<li class="level1"><div class="li"> <a href="https://www.mymedicare.gov/" class="urlextern" title="https://www.mymedicare.gov/" rel="ugc nofollow">My Medicare</a></div>
</li>
<li class="level1"><div class="li"> <a href="/dokuwiki/doku.php?id=wiki:navigation" class="wikilink1" title="wiki:navigation" data-wiki-id="wiki:navigation">Sidebar</a></div>
</li>
</ul>
<hr />
</div>
</div>
</div>
<div id="p-toc" class="portal">
<h5>Table of Contents</h5>
<div class="body">
<div class="dokuwiki">
<div class="dw__toc">
<div>
<ul>
<li class="level2"><div class="li"><a href="# web_links">1. Web Links</a></div></li>
<li class="level2"><div class="li"><a href="# sailing_-_youtube_-_page_1">2. Sailing - Youtube - Page 1</a></div></li>
<li class="level2"><div class="li"><a href="# icons">3. ICONS</a></div></li>
<li class="level2"><div class="li"><a href="# tracking_asl">4. Tracking & ASL</a></div></li>
<li class="level2"><div class="li"><a href="# fingerspell">5. Fingerspell</a></div></li>
<li class="level2"><div class="li"><a href="# time_in_las_vegas">6. Time in Las Vegas</a></div></li>
<li class="level2"><div class="li"><a href="# online_radio">7. Online Radio</a></div></li>
<li class="level2"><div class="li"><a href="# universal_licensing_system_n6xre">8. Universal Licensing System (N6XRE)</a></div></li>
<li class="level2"><div class="li"><a href="# moment_timezone_map">9. Moment Timezone Map</a></div></li>
<li class="level2"><div class="li"><a href="# periodic_table">10. Periodic table</a></div></li>
<li class="level2"><div class="li"><a href="# sharri_s_ranch_pawn_shop_war_surplus">11. Sharri's Ranch Pawn Shop & War Surplus</a></div></li>
<li class="level2"><div class="li"><a href="# star_labs_laptops">12. Star Labs Laptops</a></div></li>
<li class="level2"><div class="li"><a href="# language_transfer_-_language_audio_courses">13. Language Transfer - Language audio courses</a></div></li>
<li class="level2"><div class="li"><a href="# setting_up_a_mmdvm_hotspot_configuring_dmr">14. Setting up a MMDVM hotspot & Configuring DMR</a></div></li>
<li class="level2"><div class="li"><a href="# radio">15. Radio</a></div></li>
<li class="level2"><div class="li"><a href="# the_boomer_bible">16. The Boomer Bible</a></div></li>
<li class="level2"><div class="li"><a href="# numbeo_-_crowd-sourced_online_database">17. Numbeo - Crowd-sourced online database</a></div></li>
<li class="level2"><div class="li"><a href="# gitfluence">18. GitFluence</a></div></li>
<li class="level2"><div class="li"><a href="# links">19. Links</a></div></li>
<li class="level2"><div class="li"><a href="# in_case_of_emergency">20. IN CASE OF EMERGENCY</a></div></li>
<li class="level2"><div class="li"><a href="# how_to_screen_record_a_video">21. How to Screen Record a Video</a></div></li>
<li class="level2"><div class="li"><a href="# pc_build">22. PC Build</a></div></li>
<li class="level2"><div class="li"><a href="# chris_titus_tech_s_windows_utility">23. Chris Titus Tech's Windows Utility</a></div></li>
<li class="level2"><div class="li"><a href="# getting_started_with_the_minisforum_um780_xtx_and_vm_passthrough">24. Getting Started with the Minisforum UM780 XTX and VM Passthrough</a></div></li>
<li class="level2"><div class="li"><a href="# gpu_rental">25. GPU Rental</a></div></li>
<li class="level2"><div class="li"><a href="# ai_theory">26. AI Theory</a></div></li>
<li class="level2"><div class="li"><a href="# how_i_d_learn_ai_if_i_had_to_start_over">27. How I'd Learn AI (If I Had to Start Over)</a></div></li>
<li class="level2"><div class="li"><a href="# gpt4all_free-to-use_chatbot">28. GPT4All free-to-use chatbot</a></div></li>
<li class="level2"><div class="li"><a href="# lm_studio_free-to-use_chatbot">29. LM Studio free-to-use chatbot</a></div></li>
<li class="level2"><div class="li"><a href="# llamafile_lets_you_distribute_and_run_llms_with_a_single_file">30. llamafile lets you distribute and run LLMs with a single file.</a></div></li>
<li class="level2"><div class="li"><a href="# host_all_your_ai_locally">31. host ALL your AI locally</a></div></li>
<li class="level2"><div class="li"><a href="# fabric_ai">32. fabric ai</a></div></li>
<li class="level2"><div class="li"><a href="# gptpilot_now_pythagora">33. GPTPilot (now Pythagora)</a></div></li>
<li class="level2"><div class="li"><a href="# ai_agents">34. AI Agents</a></div></li>
<li class="level2"><div class="li"><a href="# langchain">35. LangChain</a></div></li>
<li class="level2"><div class="li"><a href="# voice_assistant">36. Voice Assistant</a></div></li>
<li class="level2"><div class="li"><a href="# mimic_3_tts">37. Mimic 3 TTS</a></div></li>
<li class="level2"><div class="li"><a href="# jarvis">38. JARVIS</a></div></li>
<li class="level2"><div class="li"><a href="# vall_etext2voice">39. VALL•E: Text2Voice</a></div></li>
<li class="level2"><div class="li"><a href="# the_festival_speech_synthesis_system">40. The Festival Speech Synthesis System</a></div></li>
<li class="level2"><div class="li"><a href="# alexa">41. Alexa!</a></div></li>
<li class="level2"><div class="li"><a href="# the_stable_diffusion_of_ai_music_audio_free_local_one_click_install">42. The “Stable Diffusion” of AI Music & Audio! Free, Local, One Click Install!</a></div></li>
<li class="level2"><div class="li"><a href="# request_access_to_devin">43. Request Access to Devin</a></div></li>
<li class="level2"><div class="li"><a href="# anaconda">44. Anaconda</a></div></li>
<li class="level2"><div class="li"><a href="# btrfs_is_a_modern_cow_file">45. Btrfs is a modern CoW file</a></div></li>
<li class="level2"><div class="li"><a href="# install_proxmox_ve_on_debian_12_bookworm">46. Install Proxmox VE on Debian 12 Bookworm</a></div></li>
<li class="level2"><div class="li"><a href="# metropolis_1927_film_with_color_dialogue_and_full_sound_effects">47. Metropolis 1927 Film with Color, Dialogue and Full Sound Effects</a></div></li>
<li class="level2"><div class="li"><a href="# hunting_murder_doctors">48. HUNTING Murder Doctors</a></div></li>
<li class="level2"><div class="li"><a href="# the_roots_of_modern_psychological_torture_mind_control_endevr_documentary">49. The Roots of Modern Psychological Torture | Mind Control | ENDEVR Documentary</a></div></li>
<li class="level2"><div class="li"><a href="# e_jean_carroll">50. E. Jean Carroll</a></div>
<ul>
<li class="level3"><div class="li"><a href="#the_martians_meets_donald_trump">The Martians meets Donald trump</a></div></li>
</ul>
</li>
<li class="level2"><div class="li"><a href="# we_tested_five_ways_to_find_hidden_cameras_in_hotels_and_house_rentals">51. We tested five ways to find hidden cameras in hotels and house rentals</a></div></li>
<li class="level2"><div class="li"><a href="# old_gray_mare_she_ain_t_what_she_use_to_be_donald_trump">52. Old Gray Mare She Ain't What She Use To Be (Donald Trump)</a></div>
<ul>
<li class="level3"><div class="li"><a href="#mop_cleanup_scene_-_they_got_expelled_from_hogwarts_university">Mop Cleanup Scene - They Got Expelled from Hogwarts University</a></div></li>
</ul>
</li>
<li class="level2"><div class="li"><a href="# religion_is_still_evil_-_richard_dawkins">53. Religion Is Still Evil - Richard Dawkins</a></div></li>
<li class="level2"><div class="li"><a href="# learn_x_in_y_minutes">54. Learn X in Y minutes</a></div></li>
<li class="level2"><div class="li"><a href="# anatomy_of_the_human_body">55. Anatomy of the Human Body</a></div></li>
<li class="level2"><div class="li"><a href="# pastebin">56. Pastebin</a></div></li>
<li class="level2"><div class="li"><a href="# gary_rust_on_flickr">57. Gary Rust on Flickr</a></div></li>
<li class="level2"><div class="li"><a href="# glassparrot_wiki">58. Glassparrot Wiki</a></div></li>
<li class="level2"><div class="li"><a href="# midnight_commander_via_docker">59. Midnight Commander via Docker</a></div></li>
<li class="level2"><div class="li"><a href="# running_windows_in_a_docker_container">60. Running Windows in a Docker Container!</a></div></li>
<li class="level2"><div class="li"><a href="# download_any_windows_version_for_unsupported_hardware">61. Download Any Windows Version for Unsupported Hardware</a></div></li>
<li class="level2"><div class="li"><a href="# winbtrfs">62. WinBtrfs</a></div></li>
<li class="level2"><div class="li"><a href="# ollama_local_chatgpt_on_pi_5">63. Ollama local chatgpt on pi 5</a></div></li>
<li class="level2"><div class="li"><a href="# i_ran_chatgpt_on_a_raspberry_pi_locally">64. I Ran ChatGPT on a Raspberry Pi Locally!</a></div></li>
<li class="level2"><div class="li"><a href="# openwrt_extroot_configuration">65. OpenWrt Extroot configuration</a></div></li>
<li class="level2"><div class="li"><a href="# tools">66. Tools</a></div></li>
<li class="level2"><div class="li"><a href="# check_if_directory_is_mounted_in_bash">67. Check if Directory is Mounted in Bash</a></div></li>
<li class="level2"><div class="li"><a href="# speech-to-text_and_text-to-speech_engines_-_coqui_stt_tts">68. Speech-To-Text and Text-To-Speech engines - Coqui STT&TTS</a></div></li>
<li class="level2"><div class="li"><a href="# dockstarter">69. DockSTARTer</a></div></li>
<li class="level2"><div class="li"><a href="# tiny_home">70. Tiny Home</a></div></li>
<li class="level2"><div class="li"><a href="# loopholes_you_can_exploit_to_cheat_the_system">71. Loopholes You Can Exploit to Cheat the System</a></div></li>
<li class="level2"><div class="li"><a href="# mount_a_virtualbox_drive_image_vdi">72. Mount a VirtualBox drive image (vdi)?</a></div></li>
<li class="level2"><div class="li"><a href="# embed_videos_playlists_instructions">73. Embed videos & playlists Instructions</a></div></li>
</ul>
</div>
</div>
</div>
</div>
</div>
<div id="p-coll-print_export" class="portal">
<h5>Print/export</h5>
<div class="body">
<div class="dokuwiki">
<ul>
<li id="coll-download-as-rl"><a href="/dokuwiki/doku.php?id=start&do=export_pdf" rel="nofollow">Download as PDF</a></li>
<li id="t-print"><a href="/dokuwiki/doku.php?id=start&rev=1788170134&vecdo=print" rel="nofollow">Printable version</a></li>
</ul>
</div>
</div>
</div>
<div id="p-tb" class="portal">
<h5>Tools</h5>
<div class="body">
<div class="dokuwiki">
<ul>
<li id="t-whatlinkshere"><a href="/dokuwiki/doku.php?id=start&do=backlink">What links here</a></li>
<li id="t-recentchanges"><a href="/dokuwiki/doku.php?id=start&do=recent" rel="nofollow">Recent Changes</a></li>
<li id="t-upload"><a href="/dokuwiki/doku.php?id=start&do=media" rel="nofollow">Media Manager</a></li>
<li id="t-special"><a href="/dokuwiki/doku.php?id=start&do=index" rel="nofollow">Sitemap</a></li>
<li id="t-permanent"><a href="/dokuwiki/doku.php?id=start&rev=1788170134" rel="nofollow">Permanent link</a></li>
<li id="t-cite"><a href="/dokuwiki/doku.php?id=start&rev=1788170134&vecdo=cite" rel="nofollow">Cite this page</a></li>
</ul>
</div>
</div>
</div>
<div id="p-qrcode" class="portal">
<h5>QR Code</h5>
<div class="body">
<div class="dokuwiki">
<span id="t-qrcode"><a href="http://goqr.me/" target="_blank" rel="nofollow"><img src="http://api.qrserver.com/v1/create-qr-code/?data=http%3A%2F%2F192.168.1.3%2Fdokuwiki%2Fdoku.php%3Fid%3Dstart&size=130x130&margin=0&bgcolor=f3f3f3" alt="QR Code start (generated for current page)" title="Current page as QR Code (scan for easy mobile access)" /></a></span>
</div>
</div>
</div>
</div>
</div>
<div id="footer" class="noprint">
<ul id="footer-info">
<li id="footer-info-lastmod">
<bdi>start.txt</bdi> · Last modified: 2026/08/31 09:55 by <bdi>garyrust</bdi><br />
</li>
<li id="footer-info-copyright">
<div class="dokuwiki"><div class="license">Except where otherwise noted, content on this wiki is licensed under the following license: <bdi><a href="https://www.gnu.org/licenses/fdl-1.3.html" rel="license" class="urlextern">GNU Free Documentation License 1.3</a></bdi></div></div>
</li>
</ul>
<ul id="footer-places">
<li>
<a href="/dokuwiki/feed.php" rel="nofollow" title="Recent changes" target="_blank"><img src="/dokuwiki/lib/tpl/vector/static/img/button-rss.png" width="80" height="15" title="Recent changes" alt="Recent changes" border="0" /></a>
<a href="https://www.dokuwiki.org/template:vector" title="vector template for DokuWiki" target="_blank"><img src="/dokuwiki/lib/tpl/vector/static/img/button-vector.png" width="80" height="15" title="vector template for DokuWiki" alt="vector template for DokuWiki" border="0" /></a>
<a href="https://www.dokuwiki.org/" title="DokuWiki" target="_blank"><img src="/dokuwiki/lib/tpl/vector/static/img/button-dw.png" width="80" height="15" title="DokuWiki" alt="DokuWiki" border="0" /></a>
<a href="http://validator.w3.org/check/referer" rel="nofollow" title="Valid XHTML" target="_blank"><img src="/dokuwiki/lib/tpl/vector/static/img/button-xhtml.png" width="80" height="15" title="Valid XHTML" alt="Valid XHTML" border="0" /></a>
</li>
</ul>
<div style="clearer"></div>
</div>
<img src="/dokuwiki/lib/exe/taskrunner.php?id=start&1788301945" width="2" height="1" alt="" />
</body>
</html>
╭─garyrust@garuda-6530 in ~ as 🧙 took 0s
╰─λ
Gemini
It worked! Your curl command returned the full HTML source of your DokuWiki main page (start.txt).
That confirms Caddy is running, PHP-FPM is processing .php requests, and your web directory at /srv/http is serving files correctly.
Understanding the Browser Security Warning
When you open [https://192.168.1.3/dokuwiki/doku.php?id=start](https://192.168.1.3/dokuwiki/doku.php?id=start) in a web browser, the page will load, but the browser will present a security warning (such as "Your connection is not private" or "Potential Security Risk Ahead").
- Why this happens: Caddy automatically issued a self-signed TLS certificate using its internal CA (
tls internal). Because your browser doesn't automatically trust Caddy's private CA, it alerts you. - How to proceed: Click Advanced
Proceed to 192.168.1.3 (unsafe) (or Accept the Risk and Continue). The page will load over encrypted HTTPS.
Accessing DokuWiki Across Your Local Network
To access your wiki from any computer or mobile device on your 192.168.1.x network:
- Via IP Address: Navigate to
[https://192.168.1.3/dokuwiki/doku.php?id=start](https://192.168.1.3/dokuwiki/doku.php?id=start)(or[http://192.168.1.3/](http://192.168.1.3/)...depending on your finalCaddyfilesetup). - Via Hostname: Navigate to
https://garuda-6530/dokuwiki/doku.php?id=startor[https://garuda-6530.local/dokuwiki/doku.php?id=start](https://garuda-6530.local/dokuwiki/doku.php?id=start).
Summary of Your Working Stack
- Host Machine:
garuda-6530(192.168.1.3) - Web Root:
/srv/http - Container Orchestration: Portainer Stack (
caddy+php:8.3-fpm) - Legacy Server: Apache moved off standard ports to
8080
You
http://192.168.1.3 - vivaldi switches to https on 192.168.1.10
Gemini
That behavior happens because Caddy on 192.168.1.3 is issuing HTTP-to-HTTPS redirects, and Vivaldi caches HSTS (HTTP Strict Transport Security) for IP addresses or domain names once it sees an HTTPS response with internal TLS.
If Vivaldi ends up redirecting you to 192.168.1.10, it usually means one of two things:
- DokuWiki Configuration (
local.php): Your DokuWiki instance at/srv/http/dokuwiki/conf/local.phphas a hardcoded$conf['canonical']or base URL setting pointing to192.168.1.10(likely from your previous Rockstor or NAS setup). DokuWiki is sending a redirect to that IP. - Browser HSTS / Cache: Vivaldi cached an HTTPS redirect rule from previous tests.
Step 1: Check DokuWiki's Base URL
Open your DokuWiki configuration file on garuda-6530:
sudo nano /srv/http/dokuwiki/conf/local.php
Look for any line containing 192.168.1.10 or canonical settings:
$conf['canonical'] = 1;
// or
$conf['baseurl'] = 'http://192.168.1.10/dokuwiki';
- Fix: Update
$conf['baseurl']to'[http://192.168.1.3/dokuwiki](http://192.168.1.3/dokuwiki)'(or comment out$conf['canonical']and$conf['baseurl']entirely so DokuWiki automatically inherits whichever IP/hostname you use to connect).
Step 2: Clear Vivaldi's HSTS and Redirect Cache for the IP
Vivaldi (being Chromium-based) remembers HTTPS redirects aggressively.
- Open Vivaldi and paste this into the address bar:
vivaldi://net-internals/#hsts - Scroll down to "Delete domain security policies".
- Enter
192.168.1.3into the text box and click Delete. - Repeat for
192.168.1.10if necessary.
Step 3: Test in a Private / Incognito Window
Open a Private Window in Vivaldi (Ctrl + Shift + N) and visit:
http://192.168.1.3/dokuwiki/doku.php?id=start
If it loads cleanly without hopping to .10, clear Vivaldi's browsing data for your main profile (Ctrl + Shift + Del
You
no. i meant http://192.168.1.3 becomes https://192.168.1.3
Gemini
That is Caddy’s automatic HTTPS feature in action.
Whenever you define a domain or IP address without explicitly specifying http:// in your Caddyfile (or when using port 443), Caddy automatically binds to port 80 and issues a 301/302 redirect forcing all plain HTTP traffic over to HTTPS.
If you want [http://192.168.1.3](http://192.168.1.3) to stay on plain HTTP without auto-redirecting to HTTPS, you can configure Caddy in one of two ways:
Option 1: Disable Automatic HTTPS (Keep Plain HTTP Only)
If you want to access your site using plain [http://192.168.1.3](http://192.168.1.3) without any SSL/TLS prompts or redirects, explicitly set port :80 or use http://:
/srv/http/Caddyfile:
http://192.168.1.3, http://garuda-6530, http://localhost {
root * /srv/http
php_fastcgi php:9000
file_server
}
Or simply:
:80 {
root * /srv/http
php_fastcgi php:9000
file_server
}
Option 2: Turn Off Auto-HTTPS Globally
If you want to keep your site blocks as they are but prevent Caddy from forcing redirects from HTTP to HTTPS, add auto_https off in the global options block at the very top of your Caddyfile:
/srv/http/Caddyfile:
{
auto_https off
}
192.168.1.3 {
root * /srv/http
php_fastcgi php:9000
file_server
}
Important Note on Vivaldi's Memory
Because Vivaldi already received an HTTP-to-HTTPS redirect instruction earlier, Chromium will have cached that redirect rule.
After updating your Caddyfile and redeploying the stack in Portainer:
- Open a Private/Incognito Window (
Ctrl + Shift + N) in Vivaldi to test[http://192.168.1.3/dokuwiki/doku.php?id=start](http://192.168.1.3/dokuwiki/doku.php?id=start). - Clear Vivaldi's cache (
Ctrl + Shift + Del Cached images and files) so it forgets the old redirect.
You
It only works on http://192.168.1.3 on the host machine, but when I refresh it stops working
Gemini
That specific behavior—where it works briefly on the local machine over HTTP and then "stops working" after a refresh—is caused by Vivaldi (Chromium) automatically upgrading your HTTP request to HTTPS in the background combined with Caddy's HSTS headers.
Here is what is happening step-by-step and how to fix it permanently for local LAN access:
Why It Stops Working After a Refresh
- When you first visit
[http://192.168.1.3](http://192.168.1.3), Caddy sends back the page along with a redirect or security header telling the browser to upgrade to HTTPS. - Vivaldi saves this in its internal cache and automatically rewrites all future requests for
192.168.1.3to[https://192.168.1.3](https://192.168.1.3). - When you refresh, Vivaldi silently attempts an HTTPS handshake on port 443. Since Caddy's internal TLS for raw IP addresses triggers a certificate alert, the connection fails and the page appears broken.
Step 1: Force Plain HTTP in Caddyfile
To stop Caddy from attempting HTTPS auto-redirects or serving TLS headers on port 443 for local IP access, explicitly define http:// in your /srv/http/Caddyfile:
http://192.168.1.3, http://garuda-6530, http://localhost {
root * /srv/http
php_fastcgi php:9000
file_server
}
Adding http:// in front of the addresses explicitly tells Caddy to ONLY serve plain HTTP on port 80 and to disable auto-HTTPS completely.
Step 2: Clear Vivaldi's Automatic HTTPS Upgrade Cache
Because Vivaldi has already remembered the HTTPS upgrade rule for 192.168.1.3, you must clear that cached rule in the browser:
- Open Vivaldi and type this into the address bar:
vivaldi://net-internals/#hsts - Scroll to the bottom section: "Delete domain security policies".
- Type
192.168.1.3into the text box and click Delete. - (Optional) Repeat for
garuda-6530if needed.
Step 3: Disable Vivaldi's "Always Use Secure Connections"
Vivaldi has a setting that automatically forces http:// URLs to https://.
- Go to Vivaldi Settings (
Ctrl + F12). - Search for HTTPS or navigate to Privacy and Security.
- Look for "Always use secure connections (HTTPS)" or "Upgrade insecure requests" and turn it OFF for your local network (or temporarily toggle it off to test).
Step 4: Restart Stack & Test in Private Window
- Update the stack in Portainer so Caddy picks up the new
http://Caddyfile. - Open a Private/Incognito Window in Vivaldi (
Ctrl + Shift + N). - Navigate to:
http://192.168.1.3/dokuwiki/doku.php?id=start
It will now remain consistently reachable on plain HTTP ([http://192.168.1.3](http://192.168.1.3)) both locally on garuda-6530 and across your local network without flipping over to HTTPS.
You
ok it's working
Gemini
Awesome! Glad to hear it's finally holding steady and loading smoothly without Vivaldi forcing those HTTPS flips on your local network.
You've got a solid foundation running now:
- Caddy & PHP-FPM handling your web environment via Portainer.
- DokuWiki fully functional and accessible across your LAN on
192.168.1.3. - Apache sitting comfortably out of the way on port
8080.
Whenever you're ready to pick back up with DuckDNS, Cloudflare, or setting up a public domain later down the road, just drop back into the thread. Enjoy working on the wiki!