Skip to content

Commit 7df9331

Browse files
authored
feat/proxy-certificate-integration (#204)
1 parent 09dac27 commit 7df9331

File tree

11 files changed

+92
-51
lines changed

11 files changed

+92
-51
lines changed

.gitignore

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -9,4 +9,5 @@ local/*.hash
99

1010
# git add --force '**/*.local*'
1111

12-
*.local.caddy
12+
*.local.*
13+
!.*.local.*

base/default.yml

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -4,13 +4,16 @@
44
gather_facts: no
55
vars:
66
os: "{{ OS | default('local:vztmpl/debian-13-standard_13.1-1_amd64.tar.zst') }}"
7-
key_dir: "{{ KEYS_DIR | default('/share/.ssh') }}"
7+
share_dir: "{{ SHARE | default('/share') }}"
8+
cert_dir: "{{ share_dir }}/.cert"
9+
key_dir: "{{ share_dir }}/.ssh"
810
tasks:
911

10-
- name: Ensure key directory
12+
- name: Ensure directories
1113
file:
1214
path: "{{ key_dir }}"
1315
state: directory
16+
loop: ["{{ share_dir }}", "{{ cert_dir }}", "{{ key_dir }}"]
1417

1518
- name: Generate container key on host
1619
community.crypto.openssh_keypair:

base/roles/base/tasks/main.yml

Lines changed: 6 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,9 @@
11
- name: Base container configuration
22
block:
3-
- name: Set key directory
3+
- name: Set shared directories
44
set_fact:
5-
key_dir: "{{ KEYS_DIR | default('/share/.ssh') }}"
5+
cert_dir: "{{ share_dir }}/.certs"
6+
key_dir: "{{ share_dir }}/.ssh"
67

78
- name: Update system
89
apt:
@@ -51,8 +52,9 @@
5152
include_tasks: state.yml
5253
vars:
5354
extra:
54-
- { path: "/app", state: "directory", mode: "0755", owner: "app", group: "config" }
55-
- { path: "/app/.ssh", state: "directory", mode: "0711", owner: "app", group: "config" }
55+
- { path: "/app/.ssh", state: "directory", mode: "0755", owner: "app", group: "config" }
56+
- { path: "{{ key_dir }}", state: "directory", mode: "0711", owner: "app", group: "config" }
57+
- { path: "{{ cert_dir }}", state: "directory", mode: "0711", owner: "app", group: "config" }
5658

5759
- name: Container accessibility
5860
import_tasks: access.yml

base/roles/base/vars/main.yml

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -11,5 +11,7 @@ default_users:
1111
- { name: "app", groups: ["config"], create_home: false, home: "/app" }
1212
- { name: "config", groups: ["config", "root", "sudo"], create_home: false, home: "/app" }
1313

14+
share_dir: "/share"
15+
1416
ssh_users:
1517
- config

libs/proxy/attributes/default.rb

Lines changed: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -4,11 +4,13 @@
44
default['app']['group'] = Default.group(node)
55

66
default['proxy']['dir']['app'] = '/app/proxy'
7+
default['proxy']['dir']['certs'] = '/share/.certs'
8+
default['proxy']['dir']['caddy'] = "#{node['proxy']['dir']['certs']}/caddy"
79
default['proxy']['dir']['config'] = '/app/proxy/conf.d'
810
default['proxy']['dir']['logs'] = '/app/proxy/logs'
911

10-
default['proxy']['config']['domain'] = 'lan'
12+
default['proxy']['config']['domain'] = 'l'
1113

1214
default['proxy']['logs']['roll_size'] = '2MiB'
13-
default['proxy']['logs']['roll_keep'] = '3'
14-
default['proxy']['logs']['roll_for'] = '1d'
15+
default['proxy']['logs']['roll_keep'] = '7'
16+
default['proxy']['logs']['roll_for'] = '24h'

libs/proxy/config.env

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,4 +4,5 @@ CORES="2"
44
MEMORY="2048"
55
SWAP="512"
66
DISK="local-lvm:2"
7+
MOUNT="share"
78
BOOT="yes"

libs/proxy/files/default/config/10-assistant-example.caddy

Lines changed: 0 additions & 4 deletions
This file was deleted.
Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,19 @@
1+
# *-container.local.caddy (.gitignore): create, e. g. home.gitops.pm
2+
#
3+
# home.gitops.pm {
4+
# import default api 192.178.168.110
5+
# tls /share/.certs/.lego/certificates/gitops.pm.crt /share/.certs/.lego/certificates/gitops.pm.key
6+
# .. }
7+
8+
# *-container.caddy: edit, e. g. assistant (10-assistant.caddy)
9+
10+
route {
11+
reverse_proxy @internal {vars.upstream}:8123
12+
}
13+
14+
15+
# Attachment: Home Assistant configuration
16+
# http:
17+
# use_x_forwarded_for: true
18+
# trusted_proxies:
19+
# - <IP_REVERSE_PROXY> # e. g. 192.168.178.101

libs/proxy/recipes/default.rb

Lines changed: 12 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
Env.dump(self, ['ip', cookbook_name], repo: cookbook_name)
22

3-
Common.directories(self, [node['proxy']['dir']['app'], node['proxy']['dir']['config'], node['proxy']['dir']['logs']])
3+
Common.directories(self, [ node['proxy']['dir']['app'],
4+
node['proxy']['dir']['caddy'], node['proxy']['dir']['config'], node['proxy']['dir']['logs'] ] )
45

56
package 'caddy'
67

@@ -20,7 +21,8 @@
2021
owner node['app']['user']
2122
group node['app']['group']
2223
mode '0644'
23-
variables( hosts: lazy { node.run_state['proxy_hosts'] || [] }, config_dir: node['proxy']['dir']['config'],
24+
variables( hosts: lazy { node.run_state['proxy_hosts'] || [] },
25+
caddy_dir: node['proxy']['dir']['caddy'], config_dir: node['proxy']['dir']['config'],
2426
log_dir: node['proxy']['dir']['logs'], logs_roll_size: node['proxy']['logs']['roll_size'],
2527
logs_roll_keep: node['proxy']['logs']['roll_keep'], logs_roll_for: node['proxy']['logs']['roll_for'] )
2628
end
@@ -29,10 +31,13 @@
2931
source 'config'
3032
owner node['app']['user']
3133
group node['app']['group']
32-
mode '0664'
34+
mode '0775'
35+
files_mode '0664'
3336
end
3437

35-
Common.application(self, cookbook_name,
36-
exec: "/bin/caddy run --config #{node['proxy']['dir']['app']}/Caddyfile --adapter caddyfile",
37-
subscribe: ["template[#{node['proxy']['dir']['app']}/Caddyfile]", "remote_directory[#{node['proxy']['dir']['config']}]"],
38-
unit: { 'Service' => { 'AmbientCapabilities' => 'CAP_NET_BIND_SERVICE' } } )
38+
ruby_block "#{self.cookbook_name}_application" do block do
39+
Common.application(self, cookbook_name,
40+
exec: "/bin/caddy run --config #{node['proxy']['dir']['app']}/Caddyfile",
41+
subscribe: ["template[#{node['proxy']['dir']['app']}/Caddyfile]", "remote_directory[#{node['proxy']['dir']['config']}]"],
42+
unit: { 'Service' => { 'AmbientCapabilities' => 'CAP_NET_BIND_SERVICE' } } )
43+
end end

libs/proxy/templates/Caddyfile.erb

Lines changed: 37 additions & 28 deletions
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,14 @@
1+
{
2+
storage file_system <%= @caddy_dir %>
3+
}
4+
15
(internal) {
2-
@external {
3-
not remote_ip 192.168.0.0/24
4-
}
5-
respond @external 403
6+
@internal remote_ip 192.168.178.0/24
7+
@external not remote_ip 192.168.178.0/24
8+
respond @external "Forbidden" 403
69
}
710

8-
(security_headers) {
11+
(header) {
912
header {
1013
Strict-Transport-Security "max-age=31536000;"
1114
X-Frame-Options "DENY"
@@ -15,34 +18,40 @@
1518
}
1619
}
1720

18-
(proxy_headers) {
19-
header_up Host {host}
20-
header_up X-Real-IP {remote_ip}
21-
header_up X-Forwarded-For {remote_ip}
22-
header_up X-Forwarded-Proto {scheme}
21+
(common) {
22+
import header
23+
24+
log {
25+
output file <%= @log_dir %>/{args.0}.log {
26+
roll_size <%= @logs_roll_size %>
27+
roll_keep <%= @logs_roll_keep %>
28+
roll_keep_for <%= @logs_roll_for %>
29+
}
30+
}
31+
}
32+
33+
(default) {
34+
import common {args.0}
35+
36+
vars upstream {args.1}
37+
38+
reverse_proxy {args.1} {
39+
header_up Host {args.0}
40+
header_up X-Real-IP {remote_ip}
41+
header_up X-Forwarded-For {remote_ip}
42+
header_up X-Container-IP {args.1}
43+
}
2344
}
2445

25-
<% @hosts.each do |entry| -%>
26-
<% domain, upstream, hostname = entry.split(' ') -%>
46+
<% @hosts.each do |entry| -%> <% domain, upstream, hostname = entry.split(' ') -%>
2747
<%= domain %> {
28-
import security_headers
48+
import default <%= hostname %> <%= upstream %>
2949
import internal
3050

31-
reverse_proxy <%= upstream %> {
32-
import proxy_headers
33-
header_up X-Container-IP <%= upstream.split(':').first %>
34-
}
35-
3651
tls internal
3752

38-
log {
39-
output file <%= @log_dir %>/<%= domain %>.log {
40-
roll_size <%= @logs_roll_size %>
41-
roll_keep <%= @logs_roll_keep %>
42-
roll_keep_for <%= @logs_roll_for %>
43-
}
44-
}
45-
46-
import <%= @config_dir %>/<%= hostname %>*.caddy
53+
import <%= @config_dir %>/*<%= hostname %>.caddy
4754
}
48-
<% end -%>
55+
<% end -%>
56+
57+
import <%= @config_dir %>/*.local.caddy

0 commit comments

Comments
 (0)