Use upstream in host config

This commit is contained in:
Jamie Curnow 2023-01-06 11:42:02 +10:00
parent bc6825c148
commit 17a108f75f
6 changed files with 49 additions and 25 deletions

View File

@ -156,9 +156,9 @@ INSERT INTO `nginx_template` (
{{#unless Host.IsDisabled}}
server {
set $forward_scheme {{Host.ForwardScheme}};
set $server ""{{Host.ForwardHost}}"";
set $port {{Host.ForwardPort}};
set $forward_scheme {{Host.ForwardScheme}} http; # todo
set $server ""{{Host.ForwardHost}}""; # todo
set $port {{Host.ForwardPort}} 80; # todo
{{#if Config.Ipv4}}
listen 80;
@ -168,11 +168,13 @@ server {
{{/if}}
{{#if Certificate.ID}}
{{#if Config.Ipv4}}
listen 443 ssl {{#if Host.HTTP2Support}}http2{{/if}};
{{/if}}
{{#if Config.Ipv6}}
listen [::]:443 ssl {{#if Host.HTTP2Support}}http2{{/if}};
{{/if}}
{{/if}}
server_name {{#each Host.DomainNames}}{{this}} {{/each}};
@ -222,6 +224,8 @@ server {
# default location:
location / {
proxy_http_version 1.1;
{{#if Host.AccessListID}}
# Authorization
auth_basic ""Authorization required"";
@ -245,11 +249,22 @@ server {
{{#if Host.AllowWebsocketUpgrade}}
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection $http_connection;
proxy_http_version 1.1;
{{/if}}
# Proxy!
include conf.d/include/proxy.conf;
add_header X-Served-By $host;
proxy_set_header Host $host;
proxy_set_header X-Forwarded-Scheme $scheme;
proxy_set_header X-Forwarded-Proto $scheme;
proxy_set_header X-Forwarded-For $remote_addr;
{{#if Upstream.ID}}
# upstream
proxy_pass $forward_scheme://npm_upstream_{{Upstream.ID}};
{{else}}
# proxy
proxy_pass $forward_scheme://$server:$port;
{{/if}}
}
# Legacy Custom Configuration

View File

@ -55,7 +55,7 @@ type Model struct {
Certificate *certificate.Model `json:"certificate,omitempty"`
NginxTemplate *nginxtemplate.Model `json:"nginx_template,omitempty"`
User *user.Model `json:"user,omitempty"`
Upstream *upstream.Model `json:"upstream,omitempty"`
Upstream upstream.Model `json:"upstream,omitempty"`
}
func (m *Model) getByQuery(query string, params []interface{}) error {
@ -119,7 +119,7 @@ func (m *Model) Expand(items []string) error {
if m.UpstreamID > 0 {
var u upstream.Model
u, err = upstream.GetByID(m.UpstreamID)
m.Upstream = &u
m.Upstream = u
}
if util.SliceContainsItem(items, "user") && m.ID > 0 {
@ -140,6 +140,12 @@ func (m *Model) Expand(items []string) error {
m.NginxTemplate = &templ
}
if util.SliceContainsItem(items, "upstream") && m.UpstreamID > 0 {
var ups upstream.Model
ups, err = upstream.GetByID(m.UpstreamID)
m.Upstream = ups
}
return err
}
@ -171,6 +177,7 @@ func (m *Model) GetTemplate() Template {
Status: m.Status,
ErrorMessage: m.ErrorMessage,
IsDisabled: m.IsDisabled,
Upstream: m.Upstream,
}
return t

View File

@ -1,13 +1,6 @@
package host
type TemplateUpstream struct {
Hostname string
Port int
BalanceMethod string
MaxFails int
FailTimeout int
AdvancedConfig string
}
import "npm/internal/entity/upstream"
// Template is the model given to the template parser, converted from the Model
type Template struct {
@ -34,5 +27,5 @@ type Template struct {
AdvancedConfig string
Status string
ErrorMessage string
Upstreams []TemplateUpstream
Upstream upstream.Model
}

View File

@ -14,7 +14,7 @@ import (
// ConfigureHost will attempt to write nginx conf and reload nginx
func ConfigureHost(h host.Model) error {
// nolint: errcheck, gosec
h.Expand([]string{"certificate", "nginxtemplate"})
h.Expand([]string{"certificate", "nginxtemplate", "upstream"})
var certificateTemplate certificate.Template
if h.Certificate != nil {
@ -22,10 +22,15 @@ func ConfigureHost(h host.Model) error {
}
data := TemplateData{
ConfDir: fmt.Sprintf("%s/nginx/hosts", config.Configuration.DataFolder),
DataDir: config.Configuration.DataFolder,
Host: h.GetTemplate(),
Certificate: certificateTemplate,
ConfDir: fmt.Sprintf("%s/nginx/hosts", config.Configuration.DataFolder),
Config: Config{ // todo
Ipv4: true,
Ipv6: false,
},
DataDir: config.Configuration.DataFolder,
Host: h.GetTemplate(),
Upstream: h.Upstream,
}
filename := fmt.Sprintf("%s/host_%d.conf", data.ConfDir, h.ID)

View File

@ -92,7 +92,7 @@ server {
Certificate: test.cert.GetTemplate(),
}
output, err := generateHostConfig(template, templateData)
output, err := renderTemplate(template, templateData)
assert.Equal(t, test.want.err, err)
assert.Equal(t, test.want.output, output)
})

View File

@ -13,25 +13,29 @@ import (
"github.com/aymerick/raymond"
)
type Config struct {
Ipv4 bool
Ipv6 bool
}
// TemplateData is a struct
type TemplateData struct {
ConfDir string
Config Config
DataDir string
Host host.Template
Certificate certificate.Template
Upstream upstream.Model
}
func generateHostConfig(template string, data TemplateData) (string, error) {
func renderTemplate(template string, data TemplateData) (string, error) {
logger.Debug("Rendering Template - Template: %s", template)
logger.Debug("Rendering Template - Data: %+v", data)
return raymond.Render(template, data)
// todo: apply some post processing to this config, stripe trailing whitespace from lines and then remove groups of 2+ \n's so the config looks nicer
}
func writeTemplate(filename, template string, data TemplateData) error {
output, err := generateHostConfig(template, data)
output, err := renderTemplate(template, data)
if err != nil {
output = fmt.Sprintf("# Template Error: %s", err.Error())
}