Skip to content

Commit 7eae13d

Browse files
committed
feat: integrate Caddy as default SSL terminator and reverse proxy
- Add caddy:2-alpine service to docker-compose.quickstart.yml listening on https://localhost:4000 using Caddy's local CA - Add caddy:2-alpine service to docker-compose.yml listening on ports 80/443 with automatic HTTPS via Let's Encrypt for production - Remove direct host port mappings from html2rss-web in both compose files - Sanitize X-Forwarded-For and X-Real-IP headers using {client_ip} placeholder to prevent rate-limit bypass via IP spoofing - Disable Caddy admin API by default (admin off) to reduce attack surface - Support CADDY_GLOBAL_OPTIONS env var for CDN/load-balancer trusted_proxies config - Update bin/quickstart-verify to assert port mapping on caddy service Closes #1012
1 parent 087526a commit 7eae13d

3 files changed

Lines changed: 57 additions & 5 deletions

File tree

‎bin/quickstart-verify‎

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -52,13 +52,14 @@ end
5252
config = compose_config
5353
services = config.fetch('services') { abort('quickstart verify failed: missing top-level services map') }
5454
web = fetch_service!(services, 'html2rss-web')
55+
caddy = fetch_service!(services, 'caddy')
5556
fetch_service!(services, 'botasaurus')
5657

5758
assert_equal!(web['image'], EXPECTED_WEB_IMAGE, 'html2rss-web image')
5859
environment = web.fetch('environment') { abort('quickstart verify failed: html2rss-web missing environment map') }
5960
assert_equal!(environment['RACK_ENV'], EXPECTED_RACK_ENV, 'html2rss-web RACK_ENV')
6061
assert_equal!(environment['HTML2RSS_ACCESS_TOKEN'], EXPECTED_ACCESS_TOKEN, 'html2rss-web HTML2RSS_ACCESS_TOKEN')
6162
assert_equal!(environment['BOTASAURUS_SCRAPER_URL'], EXPECTED_SCRAPER_URL, 'html2rss-web BOTASAURUS_SCRAPER_URL')
62-
assert_port_mapping!(web['ports'])
63+
assert_port_mapping!(caddy['ports'])
6364

6465
puts 'quickstart verify passed'

‎docker-compose.quickstart.yml‎

Lines changed: 27 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,12 +1,37 @@
11
services:
2-
html2rss-web:
3-
image: ${HTML2RSS_WEB_IMAGE:-html2rss/web:1}
2+
caddy:
3+
image: caddy:2-alpine
4+
restart: unless-stopped
45
ports:
56
- "127.0.0.1:4000:4000"
7+
volumes:
8+
- caddy_data:/data
9+
- caddy_config:/config
10+
command:
11+
- sh
12+
- -c
13+
- |
14+
echo "{
15+
admin off
16+
${CADDY_GLOBAL_OPTIONS:-}
17+
}
18+
https://localhost:4000 {
19+
reverse_proxy html2rss-web:4000 {
20+
header_up X-Forwarded-For {client_ip}
21+
header_up X-Real-IP {client_ip}
22+
}
23+
}" | caddy run --config - --adapter caddyfile
24+
25+
html2rss-web:
26+
image: ${HTML2RSS_WEB_IMAGE:-html2rss/web:1}
627
environment:
728
RACK_ENV: development
829
HTML2RSS_ACCESS_TOKEN: CHANGE_ME_ADMIN_TOKEN
930
BOTASAURUS_SCRAPER_URL: http://botasaurus:4010
1031

1132
botasaurus:
1233
image: html2rss/botasaurus-scrape-api:latest
34+
35+
volumes:
36+
caddy_data:
37+
caddy_config:

‎docker-compose.yml‎

Lines changed: 28 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -2,11 +2,33 @@
22
# This is the default configuration - customize as needed
33

44
services:
5+
caddy:
6+
image: caddy:2-alpine
7+
restart: unless-stopped
8+
ports:
9+
- "80:80"
10+
- "443:443"
11+
volumes:
12+
- caddy_data:/data
13+
- caddy_config:/config
14+
command:
15+
- sh
16+
- -c
17+
- |
18+
echo "{
19+
admin off
20+
${CADDY_GLOBAL_OPTIONS:-}
21+
}
22+
https://${CADDY_HOST:-localhost} {
23+
reverse_proxy html2rss-web:4000 {
24+
header_up X-Forwarded-For {client_ip}
25+
header_up X-Real-IP {client_ip}
26+
}
27+
}" | caddy run --config - --adapter caddyfile
28+
529
html2rss-web:
630
image: html2rss/web
731
restart: unless-stopped
8-
ports:
9-
- "127.0.0.1:4000:4000"
1032
env_file:
1133
- path: .env
1234
required: false
@@ -48,3 +70,7 @@ services:
4870
PORT: 4002
4971
CONCURRENT: 10
5072
TOKEN: ${BROWSERLESS_IO_API_TOKEN:?set BROWSERLESS_IO_API_TOKEN}
73+
74+
volumes:
75+
caddy_data:
76+
caddy_config:

0 commit comments

Comments
 (0)