View Source Horizon.NginxConfig (horizon v0.2.5)

This module generates an Nginx configuration file using a templating system. Allows for template overrides in the current project. The configuration is based on Horizon.Project and Horizon.Server.

Customizing the Nginx configuration template

To customize your nginx.conf, copy the template from the Horizon package to your project:

$ mkdir -p priv/horizon/templates
$ cp deps/horizon/priv/templates/nginx/nginx.conf.eex priv/horizon/templates/nginx.conf.eex

Running the generator from iex

Examples

user = "username"
host = "host-address"
remote_path = "/usr/local/etc/nginx/nginx.conf"

projects = [
  %Horizon.Project{
    name: "project-name",
    server_names: ["my.server.com"],
    http_only: true,
    servers: [
      %Horizon.Server{internal_ip: "127.0.0.1", port: 4000},
      %Horizon.Server{internal_ip: "192.168.100.100", port: 4000}
    ]
  }
]

config_output = Horizon.NginxConfig.generate(projects)
encoded_content = :base64.encode(config_output)
command = "echo #{encoded_content} | ssh #{user}@#{host} 'base64 -d | doas tee #{remote_path} > /dev/null && doas service nginx reload'"
{result, exit_code} = System.cmd("sh", ["-c", command])

Summary

Functions

Returns the path for the certificate

Returns the path for the certificate

Generates an Nginx configuration file using a templating system.

Sends the Nginx configuration to a remote host and reloads the Nginx service.

Functions

cert_key_path(project)

@spec cert_key_path(Horizon.Project.t()) :: String.t()

Returns the path for the certificate

Examples

iex> cert_key_path(%Horizon.Project{
...>   certificate: :self,
...>   cert_key_path: "/path/to/cert_key.pem"
...> })
"/path/to/cert_key.pem"

iex> cert_key_path(%Horizon.Project{certificate: :letsencrypt, domain: "example.com"})
"/user/local/etc/letsencrypt/live/example.com/privkey.pem"

cert_path(project)

@spec cert_path(Horizon.Project.t()) :: String.t()

Returns the path for the certificate

Examples

iex> cert_path(%Horizon.Project{certificate: :self, cert_path: "/path/to/cert.pem"})
"/path/to/cert.pem"

iex> cert_path(%Horizon.Project{certificate: :letsencrypt, domain: "example.com"})
"/user/local/etc/letsencrypt/live/example.com/fullchain.pem"

generate(projects)

@spec generate([Horizon.Project.t()]) :: String.t()

Generates an Nginx configuration file using a templating system.

Examples

iex> project = %Horizon.Project{
  name: "example_project",
  server_names: ["example.com", "www.example.com"],
  letsencrypt_live: "mydomain.com",
  acme_challenge_path: "/apps/challenge/mydomain.com",
  http_only: false,
  servers: [
    %Horizon.Server{internal_ip: "10.0.0.1", port: 4000},
    %Horizon.Server{internal_ip: "10.0.0.2", port: 4001}
  ]
}
iex> Horizon.NginxConfig.generate([project])

send(projects, user, host, opts \\ [])

@spec send([Horizon.Project.t()], String.t(), String.t(), keyword()) ::
  {:ok, any()} | {:error, non_neg_integer(), any()}

Sends the Nginx configuration to a remote host and reloads the Nginx service.

Example

iex> user = "me"
...> host = "myhost"
...> projects = [%Horizon.Project{name: "my project", ...}]
...> NginxConfig.send(projects, user, host)
...> NginxConfig.send(projects, user, host, nginxconf_path: "/usr/nginx/nginx.conf", action: :restart)