diff options
Diffstat (limited to 'roles/nginx')
| -rw-r--r-- | roles/nginx/defaults/main.yml | 6 | ||||
| -rw-r--r-- | roles/nginx/handlers/main.yml | 6 | ||||
| -rw-r--r-- | roles/nginx/meta/argument_specs.yml | 26 | ||||
| -rw-r--r-- | roles/nginx/meta/main.yml | 21 | ||||
| -rw-r--r-- | roles/nginx/tasks/main.yml | 120 | ||||
| -rw-r--r-- | roles/nginx/templates/nginx.conf.j2 | 67 | ||||
| -rw-r--r-- | roles/nginx/vars/archlinux.yml | 2 | ||||
| -rw-r--r-- | roles/nginx/vars/debian.yml | 2 |
8 files changed, 250 insertions, 0 deletions
diff --git a/roles/nginx/defaults/main.yml b/roles/nginx/defaults/main.yml new file mode 100644 index 00000000..c58d0c02 --- /dev/null +++ b/roles/nginx/defaults/main.yml @@ -0,0 +1,6 @@ +--- +nginx_server_name: "{{ ansible_hostname }}.local" +nginx_worker_processes: 2 +nginx_worker_connections: 512 +nginx_ssl_certificate: "/etc/ssl/certs/nginx-selfsigned.crt" +nginx_ssl_certificate_key: "/etc/ssl/private/nginx-selfsigned.key" diff --git a/roles/nginx/handlers/main.yml b/roles/nginx/handlers/main.yml new file mode 100644 index 00000000..f7c0adc8 --- /dev/null +++ b/roles/nginx/handlers/main.yml @@ -0,0 +1,6 @@ +--- +- name: "Restart nginx" + become: true + ansible.builtin.systemd_service: + name: "nginx" + state: "restarted" diff --git a/roles/nginx/meta/argument_specs.yml b/roles/nginx/meta/argument_specs.yml new file mode 100644 index 00000000..18b8de89 --- /dev/null +++ b/roles/nginx/meta/argument_specs.yml @@ -0,0 +1,26 @@ +--- +argument_specs: + main: + short_description: "Minimal nginx reverse proxy" + description: "Configure nginx as a reverse proxy with TLS 1.3 and automatic SSL certificate generation" + options: + nginx_server_name: + type: "str" + description: "The server name for nginx configuration" + default: "{{ ansible_hostname }}.local" + nginx_worker_processes: + type: "int" + description: "Number of nginx worker processes" + default: 2 + nginx_worker_connections: + type: "int" + description: "Number of worker connections per process" + default: 512 + nginx_ssl_certificate: + type: "str" + description: "Path to SSL certificate file" + default: "/etc/ssl/certs/nginx-selfsigned.crt" + nginx_ssl_certificate_key: + type: "str" + description: "Path to SSL private key file" + default: "/etc/ssl/private/nginx-selfsigned.key" diff --git a/roles/nginx/meta/main.yml b/roles/nginx/meta/main.yml new file mode 100644 index 00000000..d11309e0 --- /dev/null +++ b/roles/nginx/meta/main.yml @@ -0,0 +1,21 @@ +--- +dependencies: + - role: "systemd" + - role: "openssl" + - role: "logrotate" +galaxy_info: + author: "a14m" + description: "Configure basic distro nginx reverse proxy" + company: "kartoffeln.work GmbH." + license: "MIT" + min_ansible_version: "2.18" + platforms: + - name: "ArchLinux" + versions: + - "all" + - name: "Ubuntu" + versions: + - "noble" + - name: "Debian" + versions: + - "bookworm" diff --git a/roles/nginx/tasks/main.yml b/roles/nginx/tasks/main.yml new file mode 100644 index 00000000..12292422 --- /dev/null +++ b/roles/nginx/tasks/main.yml @@ -0,0 +1,120 @@ +--- +- name: "Include OS-specific variables" + ansible.builtin.include_vars: "{{ ansible_os_family | lower }}.yml" + +- name: "Ensure nginx is installed" + become: true + ansible.builtin.package: + name: "nginx" + state: "present" + +- name: "Ensure nginx directories exist" + become: true + ansible.builtin.file: + path: "{{ item }}" + state: "directory" + owner: "root" + group: "root" + mode: "0755" + with_items: + - "/etc/nginx/conf.d" + - "/etc/nginx/modules-enabled" + - "/var/log/nginx" + - "/etc/ssl/certs" + +- name: "Ensure SSL private directory has correct permissions" + become: true + ansible.builtin.file: + path: "/etc/ssl/private" + state: "directory" + owner: "root" + group: "root" + mode: "0700" + +- name: "Check if SSL certificate exists" + become: true + ansible.builtin.stat: + path: "{{ nginx_ssl_certificate }}" + register: ssl_cert_check + +- name: "Check if SSL private key exists" + become: true + ansible.builtin.stat: + path: "{{ nginx_ssl_certificate_key }}" + register: ssl_key_check + +- name: "Generate self-signed SSL certificate" + become: true + ansible.builtin.command: + cmd: > + openssl req -x509 -newkey rsa:2048 -days 365 -nodes + -keyout "{{ nginx_ssl_certificate_key }}" + -out "{{ nginx_ssl_certificate }}" + -subj "/CN={{ nginx_server_name }}" + -addext "subjectAltName=DNS:{{ nginx_server_name }},DNS:localhost,IP:127.0.0.1" + when: not ssl_cert_check.stat.exists or not ssl_key_check.stat.exists + changed_when: true + +- name: "Set SSL certificate permissions" + become: true + ansible.builtin.file: + path: "{{ nginx_ssl_certificate }}" + owner: "root" + group: "root" + mode: "0644" + when: not ssl_cert_check.stat.exists or not ssl_key_check.stat.exists + +- name: "Set SSL private key permissions" + become: true + ansible.builtin.file: + path: "{{ nginx_ssl_certificate_key }}" + owner: "root" + group: "root" + mode: "0600" + when: not ssl_cert_check.stat.exists or not ssl_key_check.stat.exists + +- name: "Create nginx configuration" + become: true + ansible.builtin.template: + src: "nginx.conf.j2" + dest: "/etc/nginx/nginx.conf" + owner: "root" + group: "root" + mode: "0644" + backup: true + validate: "nginx -t -c %s" + notify: "Restart nginx" + +- name: "Start and enable nginx" + become: true + ansible.builtin.systemd_service: + name: "nginx" + state: "started" + enabled: true + +# Create logrotate configurations +# Rotate weekly +# Keep 3 month (12 rotations) +- name: "Create nginx logrotate configuration" + become: true + ansible.builtin.copy: + content: | + /var/log/nginx/*.log { + weekly + missingok + rotate 12 + compress + delaycompress + notifempty + create 0644 root root + postrotate + if [ -f /var/run/nginx.pid ]; then + kill -USR1 `cat /var/run/nginx.pid` + fi + endscript + } + dest: "/etc/logrotate.d/nginx" + owner: "root" + group: "root" + mode: "0644" + failed_when: false diff --git a/roles/nginx/templates/nginx.conf.j2 b/roles/nginx/templates/nginx.conf.j2 new file mode 100644 index 00000000..c75ab7fc --- /dev/null +++ b/roles/nginx/templates/nginx.conf.j2 @@ -0,0 +1,67 @@ +user {{ nginx_user }}; +worker_processes {{ nginx_worker_processes }}; +pid /run/nginx.pid; +include /etc/nginx/modules-enabled/*.conf; + +events { + worker_connections {{ nginx_worker_connections }}; +} + +http { + sendfile on; + tcp_nopush on; + tcp_nodelay on; + keepalive_timeout 65; + server_tokens off; + + include /etc/nginx/mime.types; + default_type application/octet-stream; + types_hash_max_size 4096; + + ssl_protocols TLSv1.2 TLSv1.3; + ssl_prefer_server_ciphers off; + ssl_ciphers HIGH:!aNULL:!MD5; + ssl_session_cache shared:SSL:10m; + + # Proxy settings + proxy_http_version 1.1; + proxy_set_header Upgrade $http_upgrade; + proxy_set_header Connection "upgrade"; + proxy_set_header Host $host; + proxy_set_header X-Real-IP $remote_addr; + proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; + proxy_set_header X-Forwarded-Proto $scheme; + + # Logging + access_log /var/log/nginx/access.log; + error_log /var/log/nginx/error.log; + + # HTTP server - redirect to HTTPS + server { + listen 80 default_server; + listen [::]:80 default_server; + + server_name {{ nginx_server_name }}; + + location / { + return 301 https://$server_name$request_uri; + } + } + + # HTTPS server + server { + listen 443 ssl http2; + listen [::]:443 ssl http2; + + server_name {{ nginx_server_name }}; + + ssl_certificate {{ nginx_ssl_certificate }}; + ssl_certificate_key {{ nginx_ssl_certificate_key }}; + ssl_session_timeout 1d; + + add_header X-Content-Type-Options nosniff always; + add_header X-Frame-Options DENY always; + + include /etc/nginx/conf.d/*.conf; + } +} diff --git a/roles/nginx/vars/archlinux.yml b/roles/nginx/vars/archlinux.yml new file mode 100644 index 00000000..f9cdfb1d --- /dev/null +++ b/roles/nginx/vars/archlinux.yml @@ -0,0 +1,2 @@ +--- +nginx_user: "http" diff --git a/roles/nginx/vars/debian.yml b/roles/nginx/vars/debian.yml new file mode 100644 index 00000000..46b75fb4 --- /dev/null +++ b/roles/nginx/vars/debian.yml @@ -0,0 +1,2 @@ +--- +nginx_user: "www-data" |
