summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorAhmed Abdelhalim <[email protected]>2025-09-13 22:02:25 +0200
committerAhmed Abdelhalim <[email protected]>2025-09-13 22:20:15 +0200
commiteb43727aee4356089f1b1111efd3c40c3a4a5474 (patch)
tree2204e5d2a957af4fb5e2bac798a41c29a90cb7c1
parent253b649a459310da07eacc7d5fa14e83761ccee2 (diff)
Add nginx role
-rw-r--r--roles/nginx/defaults/main.yml6
-rw-r--r--roles/nginx/handlers/main.yml6
-rw-r--r--roles/nginx/meta/argument_specs.yml26
-rw-r--r--roles/nginx/meta/main.yml21
-rw-r--r--roles/nginx/tasks/main.yml120
-rw-r--r--roles/nginx/templates/nginx.conf.j267
-rw-r--r--roles/nginx/vars/archlinux.yml2
-rw-r--r--roles/nginx/vars/debian.yml2
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"