Version 0.6.0 (2026-03-25)
Changes:
- add config validation container to docker-compose
- add Make file with `up` and `down` commands
- add `default-http{,s}-port` commands to add_servers.py
- add nginx_conf.d directory usage for more than one custom nginx configurations
- rename `port` and `ssl_port` to `http{,s}_port` for templates
- add `https_custom_params` to templates
This commit is contained in:
@@ -4,13 +4,17 @@ from __future__ import annotations
|
||||
|
||||
import argparse
|
||||
import os
|
||||
from dataclasses import dataclass, field
|
||||
from dataclasses import dataclass, field, fields
|
||||
from typing import Any
|
||||
|
||||
import jinja2
|
||||
import yaml
|
||||
|
||||
|
||||
DEFAULT_HTTP_PORT = 80
|
||||
DEFAULT_HTTPS_PORT = 80
|
||||
|
||||
|
||||
@dataclass
|
||||
class Server:
|
||||
"""Server entry for nginx.conf file."""
|
||||
@@ -19,37 +23,25 @@ class Server:
|
||||
all_names: str | None = None
|
||||
proxy_pass: str | None = None
|
||||
certificate_dir: str | None = None
|
||||
port: int = None
|
||||
ssl_port: int = None
|
||||
http_port: int = None
|
||||
https_port: int = None
|
||||
https_custom_params: str = None
|
||||
server_options: list[str] = field(default_factory=list)
|
||||
location_options: list[str] = field(default_factory=list)
|
||||
|
||||
certificates_path: str = "/etc/letsencrypt/live"
|
||||
|
||||
def __post_init__(self) -> None:
|
||||
if self.server_options is None:
|
||||
self.server_options = []
|
||||
if self.location_options is None:
|
||||
self.location_options = []
|
||||
if self.all_names is None:
|
||||
self.all_names = self.name
|
||||
if self.port is None:
|
||||
self.port = 80
|
||||
if self.ssl_port is None:
|
||||
self.ssl_port = 443
|
||||
if self.http_port is None:
|
||||
self.http_port = DEFAULT_HTTP_PORT
|
||||
if self.https_port is None:
|
||||
self.https_port = DEFAULT_HTTPS_PORT
|
||||
if self.https_custom_params is None:
|
||||
self.https_custom_params = ""
|
||||
|
||||
def to_dict(self) -> dict:
|
||||
"""Convert server class to dict for nginx.conf.j2 jinja2-template"""
|
||||
return {
|
||||
"name": self.name,
|
||||
"all_names": self.all_names,
|
||||
"proxy_pass": self.proxy_pass,
|
||||
"server_options": self.server_options,
|
||||
"location_options": self.location_options,
|
||||
"certificate_dir": self.certificate_dir,
|
||||
"port": self.port,
|
||||
"ssl_port": self.ssl_port,
|
||||
}
|
||||
return {field.name: getattr(self, field.name) for field in fields(self)}
|
||||
|
||||
|
||||
@dataclass
|
||||
@@ -59,6 +51,8 @@ class CLIParams:
|
||||
nginx_template: str
|
||||
domains_list_txt: str
|
||||
servers_config: str
|
||||
default_http_port: str
|
||||
default_https_port: str
|
||||
certificates_path: str
|
||||
http_only: bool
|
||||
output: str | None
|
||||
@@ -69,7 +63,7 @@ def main() -> None:
|
||||
parser = argparse.ArgumentParser("add-servers", description="Add domain servers to a given nginx.conf file")
|
||||
parser.add_argument("--nginx-template", "-f", required=True, help="Path to nginx.conf.j2 template file")
|
||||
parser.add_argument(
|
||||
"--domains_list_txt",
|
||||
"--domains-list-txt",
|
||||
"-d",
|
||||
required=True,
|
||||
help="Path to file with domains which have ssl certificates",
|
||||
@@ -81,6 +75,18 @@ def main() -> None:
|
||||
default=None,
|
||||
help="Path to servers configuration yaml file",
|
||||
)
|
||||
parser.add_argument(
|
||||
"--default-http-port",
|
||||
required=False,
|
||||
default=80,
|
||||
help="Default port for https protocol",
|
||||
)
|
||||
parser.add_argument(
|
||||
"--default-https-port",
|
||||
required=False,
|
||||
default=443,
|
||||
help="Default port for https protocol",
|
||||
)
|
||||
parser.add_argument(
|
||||
"--certificates-path",
|
||||
"-c",
|
||||
@@ -97,6 +103,11 @@ def main() -> None:
|
||||
|
||||
args: CLIParams = parser.parse_args()
|
||||
|
||||
global DEFAULT_HTTP_PORT
|
||||
DEFAULT_HTTP_PORT = args.default_http_port
|
||||
global DEFAULT_HTTPS_PORT
|
||||
DEFAULT_HTTPS_PORT = args.default_https_port
|
||||
|
||||
if args.domains_list_txt is not None:
|
||||
with open(args.domains_list_txt, "r", encoding="utf-8") as file:
|
||||
domains_with_certs = [
|
||||
@@ -126,12 +137,16 @@ def main() -> None:
|
||||
),
|
||||
proxy_pass=params.get("proxy_pass"),
|
||||
certificate_dir=_get_certificate_path(
|
||||
args.http_only, domains_with_certs, args.certificates_path, params.get("certificate_name") or server_name
|
||||
http_only=args.http_only,
|
||||
domains_with_certs=domains_with_certs,
|
||||
base_certs_path=args.certificates_path,
|
||||
server_name=params.get("certificate_name") or server_name,
|
||||
),
|
||||
port=params.get("port"),
|
||||
ssl_port=params.get("ssl_port"),
|
||||
server_options=params.get("server_options"),
|
||||
location_options=params.get("location_options"),
|
||||
https_custom_params=params.get("https_custom_params"),
|
||||
http_port=params.get("http_port"),
|
||||
https_port=params.get("https_port"),
|
||||
server_options=params.get("server_options", []),
|
||||
location_options=params.get("location_options", []),
|
||||
)
|
||||
)
|
||||
for domain in domains_with_certs:
|
||||
|
||||
Reference in New Issue
Block a user