2016-07-05 13:39:57 -05:00
< div class = "modal fade" id = "dnsCredentialsModal" tabindex = "-1" role = "dialog" >
< div class = "modal-dialog" >
< div class = "modal-content" >
< div class = "modal-header" >
< h4 class = "modal-title" > Configure DNS< / h4 >
< / div >
< div class = "modal-body" >
< form name = "dnsCredentialsForm" role = "form" novalidate ng-submit = "setDnsCredentials()" autocomplete = "off" >
< fieldset >
< p class = "has-error text-center" ng-show = "dnsCredentials.error" > {{ dnsCredentials.error }}< / p >
2017-01-29 02:50:26 -08:00
< div class = "form-group" ng-class = "{ 'has-error': dnsCredentialsForm.customDomainId.$invalid }" uib-tooltip = "{{ config.provider === 'caas' ? '' : 'Changing the domain is not yet supported' }}" >
< label class = "control-label" for = "customDomainId" > Domain name< / label >
2017-01-26 15:17:24 -08:00
< input type = "text" class = "form-control" ng-model = "dnsCredentials.customDomain" id = "customDomainId" name = "customDomainId" ng-disabled = "dnsCredentials.busy || config.provider !== 'caas'" domain-validator placeholder = "example.com" required autofocus >
2016-07-05 14:32:09 -05:00
< / div >
2017-01-26 13:53:36 -08:00
< div class = "form-group" >
2017-01-29 02:50:26 -08:00
< label class = "control-label" for = "dnsCredentialsProvider" > DNS API provider< / label >
2017-01-10 13:34:00 +01:00
< select class = "form-control" id = "dnsCredentialsProvider" ng-model = "dnsCredentials.provider" ng-options = "a.value as a.name for a in dnsProvider" > < / select >
2016-10-25 14:51:57 +02:00
< / div >
2016-09-22 15:26:21 +02:00
<!-- Route53 -->
< div class = "form-group" ng-class = "{ 'has-error': false }" ng-show = "dnsCredentials.provider === 'route53'" >
2017-01-29 02:50:26 -08:00
< label class = "control-label" for = "dnsCredentialsAccessKeyId" > Access key id< / label >
2016-09-22 15:26:21 +02:00
< input type = "text" class = "form-control" ng-model = "dnsCredentials.accessKeyId" id = "dnsCredentialsAccessKeyId" name = "accessKeyId" ng-disabled = "dnsCredentials.busy" ng-minlength = "16" ng-maxlength = "32" ng-required = "dnsCredentials.provider === 'route53'" >
2016-07-05 13:39:57 -05:00
< / div >
2016-09-22 15:26:21 +02:00
< div class = "form-group" ng-class = "{ 'has-error': false }" ng-show = "dnsCredentials.provider === 'route53'" >
2017-01-29 02:50:26 -08:00
< label class = "control-label" for = "dnsCredentialsSecretAccessKey" > Secret access key< / label >
2016-09-22 15:26:21 +02:00
< input type = "text" class = "form-control" ng-model = "dnsCredentials.secretAccessKey" id = "dnsCredentialsSecretAccessKey" name = "secretAccessKey" ng-disabled = "dnsCredentials.busy" ng-required = "dnsCredentials.provider === 'route53'" >
2016-07-05 13:39:57 -05:00
< / div >
2016-09-22 15:26:21 +02:00
<!-- DigitalOcean -->
< div class = "form-group" ng-class = "{ 'has-error': false }" ng-show = "dnsCredentials.provider === 'digitalocean'" >
2017-01-29 02:50:26 -08:00
< label class = "control-label" for = "dnsCredentialsDigitalOceanToken" > API token< / label >
2016-09-22 15:26:21 +02:00
< input type = "text" class = "form-control" ng-model = "dnsCredentials.digitalOceanToken" id = "dnsCredentialsDigitalOceanToken" name = "digitalOceanToken" ng-disabled = "dnsCredentials.busy" ng-required = "dnsCredentials.provider === 'digitalocean'" >
< / div >
2017-01-26 14:46:41 -08:00
< div class = "form-group" ng-class = "{ 'has-error': false }" ng-if = "config.fqdn !== dnsCredentials.customDomain && !dnsCredentialsForm.customDomainId.$invalid" >
2016-07-05 14:32:09 -05:00
< label class = "control-label" for = "dnsCredentialsPassword" > Provide your password to confirm this action< / label >
< input type = "password" class = "form-control" ng-model = "dnsCredentials.password" id = "dnsCredentialsPassword" name = "password" ng-disabled = "dnsCredentials.busy" required >
< / div >
2017-01-10 13:34:00 +01:00
< input class = "ng-hide" type = "submit" ng-disabled = "dnsCredentialsForm.$invalid || dnsCredentials.busy" / >
2016-07-05 13:39:57 -05:00
< / fieldset >
< / form >
< / div >
< div class = "modal-footer " >
< button type = "button" class = "btn btn-default" data-dismiss = "modal" > Cancel< / button >
2017-01-10 13:34:00 +01:00
< button type = "submit" class = "btn btn-outline btn-success pull-right" ng-click = "setDnsCredentials()" ng-disabled = "dnsCredentialsForm.$invalid || dnsCredentials.busy" >
2017-01-29 02:01:01 -08:00
< i class = "fa fa-circle-o-notch fa-spin" ng-show = "dnsCredentials.busy" > < / i >
2016-07-05 14:32:09 -05:00
< span ng-show = "dnsCredentials.customDomain === config.fqdn" > Save< / span >
< span ng-show = "dnsCredentials.customDomain !== config.fqdn" > Change Domain< / span >
< / button >
2016-07-05 13:39:57 -05:00
< / div >
< / div >
< / div >
< / div >
2016-06-07 10:10:58 +02:00
< div class = "section-header" >
2015-11-04 17:04:55 -08:00
< div class = "text-left" >
2016-07-05 12:15:16 -05:00
< h1 > Domain & Certificates< / h1 >
2015-11-04 17:04:55 -08:00
< / div >
< / div >
2016-06-07 10:10:58 +02:00
< div class = "section-header" >
2015-11-04 18:23:51 -08:00
< div class = "text-left" >
2016-07-05 12:15:16 -05:00
< h3 > Domain< / h3 >
2015-11-04 18:23:51 -08:00
< / div >
< / div >
2015-11-09 09:56:59 +01:00
< div class = "card" style = "margin-bottom: 15px;" >
2015-11-04 18:23:51 -08:00
< div class = "row" >
< div class = "col-md-12" >
2016-07-05 12:16:45 -05:00
< p ng-show = "!config.isCustomDomain" > To use a custom domain, configure your domain to use < a target = "_blank" href = "https://aws.amazon.com/route53/" > Route53.< / a > Moving to a custom domain will retain all your apps and data and will take around 15 minutes.< / p >
2015-11-04 18:23:51 -08:00
< table width = "100%" >
2016-07-05 14:35:05 -05:00
< tr >
2017-01-29 02:50:26 -08:00
< td class = "text-muted" style = "vertical-align: top;" > Domain name< / td >
2016-07-05 14:35:05 -05:00
< td class = "text-right" style = "vertical-align: top; white-space: nowrap;" > {{ config.fqdn }}< / td >
< / tr >
2016-12-14 13:50:16 -08:00
< tr ng-hide = "dnsConfig.provider === 'noop' || dnsConfig.provider === 'manual'" >
2017-01-29 02:50:26 -08:00
< td class = "text-muted" style = "vertical-align: top;" > DNS provider< / td >
2016-09-22 14:23:43 +02:00
< td class = "text-right" style = "vertical-align: top; white-space: nowrap;" > {{ dnsConfig.provider }}< / td >
< / tr >
2017-01-10 13:41:20 +01:00
< tr ng-show = "dnsConfig.provider === 'manual' && !dnsConfig.wildcard" >
2016-10-25 14:41:28 +02:00
< td colspan = "2" >
< br / >
No DNS provider configured. All DNS records need to be setup manually.
To avoid manual setup for each installed app, setup a wildcard DNS record or configure an external DNS provider.
< / td >
< / tr >
2017-01-10 13:41:20 +01:00
< tr ng-show = "dnsConfig.provider === 'manual' && dnsConfig.wildcard" >
< td colspan = "2" >
< br / >
Wildcard DNS provider is configured. Always ensure there is a wildcard DNS record for this server's IP.
< / td >
< / tr >
2016-12-14 13:50:16 -08:00
< tr ng-show = "dnsConfig.provider === 'noop'" >
< td colspan = "2" >
< br / >
No DNS provider configured. All DNS records need to be setup manually and all DNS checks are skipped.
< / td >
< / tr >
2016-09-22 14:56:15 +02:00
< tr ng-show = "config.isCustomDomain && dnsConfig.provider === 'route53'" >
2017-01-29 02:50:26 -08:00
< td class = "text-muted" style = "vertical-align: top;" > Access key id< / td >
2016-07-05 13:39:57 -05:00
< td class = "text-right" style = "vertical-align: top; white-space: nowrap;" > {{ dnsConfig.accessKeyId || 'unset' }}< / td >
2015-11-04 18:23:51 -08:00
< / tr >
2016-09-22 14:56:15 +02:00
< tr ng-show = "config.isCustomDomain && dnsConfig.provider === 'route53'" >
2017-01-29 02:50:26 -08:00
< td class = "text-muted" style = "vertical-align: top;" > Secret access key< / td >
2016-09-22 15:26:21 +02:00
< td class = "text-right" style = "vertical-align: top; white-space: nowrap;" ng-click-reveal = "dnsConfig.secretAccessKey" > < i > hidden< / i > < / td >
2015-11-04 18:23:51 -08:00
< / tr >
2016-09-22 14:56:15 +02:00
< tr ng-show = "config.isCustomDomain && dnsConfig.provider === 'digitalocean'" >
2017-01-29 02:50:26 -08:00
< td class = "text-muted" style = "vertical-align: top;" > API token< / td >
2016-09-22 15:26:21 +02:00
< td class = "text-right" style = "vertical-align: top; white-space: nowrap;" ng-click-reveal = "dnsConfig.token" > < i > hidden< / i > < / td >
2016-09-22 14:56:15 +02:00
< / tr >
2016-07-05 15:57:15 -05:00
<!-- add some space -->
< tr >
< td > < br / > < / td >
< td > < / td >
< / tr >
2017-01-29 02:50:26 -08:00
2015-11-04 18:23:51 -08:00
< tr >
< td class = "text-muted" style = "vertical-align: top;" > < / td >
2016-10-25 14:43:16 +02:00
< td class = "text-right" style = "vertical-align: top;" > < button class = "btn btn-outline btn-primary" ng-click = "showChangeDnsCredentials()" > Change< / button > < / td >
2015-11-04 18:23:51 -08:00
< / tr >
< / table >
< / div >
< / div >
< / div >
2016-06-07 10:10:58 +02:00
< div class = "section-header" >
2015-11-04 17:04:55 -08:00
< div class = "text-left" >
< h3 > SSL Certificates< / h3 >
< / div >
< / div >
2015-11-09 09:56:59 +01:00
< div class = "card" style = "margin-bottom: 15px;" >
2016-07-05 12:28:20 -05:00
< div class = "row" ng-show = "!config.isCustomDomain" >
< div class = "col-md-12" >
Certificates can only by set for custom domains.
< / div >
< / div >
< div class = "row" ng-show = "config.isCustomDomain" >
2015-11-04 17:04:55 -08:00
< div class = "col-md-12" >
< form name = "defaultCertForm" ng-submit = "setDefaultCert()" >
< fieldset >
2017-01-29 02:50:26 -08:00
< p > Certificates are obtained via < a href = "https://letsencrypt.org/" target = "_blank" > Let’ s Encrypt< / a > .< / p >
2016-01-13 16:20:38 +01:00
< br / >
2015-11-04 17:04:55 -08:00
< label class = "control-label" for = "defaultCertInput" > Fallback Certificate< / label >
2017-01-29 02:50:26 -08:00
< p > This wildcard certificate that will be used for apps, if getting a Let’ s Encrypt certificate failed. This might be due to rate limits on Let’ s Encrypt side.< / p >
2015-11-04 17:04:55 -08:00
< div class = "has-error text-center" ng-show = "defaultCert.error" > {{ defaultCert.error }}< / div >
< div class = "text-success text-center" ng-show = "defaultCert.success" > < b > Upload successful< / b > < / div >
< div class = "form-group" ng-class = "{ 'has-error': (!defaultCert.cert.$dirty && defaultCert.error) }" >
< div class = "input-group" >
< input type = "file" id = "defaultCertFileInput" style = "display:none" / >
< input type = "text" class = "form-control" placeholder = "Certificate" ng-model = "defaultCert.certificateFileName" id = "defaultCertInput" name = "cert" onclick = "getElementById('defaultCertFileInput').click();" style = "cursor: pointer;" ng-disabled = "defaultCert.busy" required >
< span class = "input-group-addon" >
< i class = "fa fa-upload" onclick = "getElementById('defaultCertFileInput').click();" > < / i >
< / span >
< / div >
< / div >
< div class = "form-group" ng-class = "{ 'has-error': (!defaultCert.key.$dirty && defaultCert.error) }" >
< div class = "input-group" >
< input type = "file" id = "defaultKeyFileInput" style = "display:none" / >
< input type = "text" class = "form-control" placeholder = "Key" ng-model = "defaultCert.keyFileName" id = "defaultKeyInput" name = "key" onclick = "getElementById('defaultKeyFileInput').click();" style = "cursor: pointer;" ng-disabled = "defaultCert.busy" required >
< span class = "input-group-addon" >
< i class = "fa fa-upload" onclick = "getElementById('defaultKeyFileInput').click();" > < / i >
< / span >
< / div >
< / div >
2017-01-29 02:01:01 -08:00
< button type = "submit" class = "btn btn-outline btn-success pull-right" ng-disabled = "defaultCertForm.$invalid || busy" > < i class = "fa fa-circle-o-notch fa-spin" ng-show = "defaultCert.busy" > < / i > Upload< / button >
2015-11-04 17:04:55 -08:00
< / fieldset >
< / form >
< / div >
< / div >
2016-01-13 16:17:46 +01:00
< div class = "row hide" >
2015-11-04 17:04:55 -08:00
< div class = "col-md-12" >
< form name = "adminCertForm" ng-submit = "setAdminCert()" >
< fieldset >
< label class = "control-label" for = "adminCertInput" > Settings Certificate< / label >
< p > This certificate will be used for this Settings application.< / p >
< div class = "has-error text-center" ng-show = "adminCert.error" > {{ adminCert.error }}< / div >
< div class = "text-success text-center" ng-show = "adminCert.success" > < b > Upload successful< / b > < / div >
< div class = "form-group" ng-class = "{ 'has-error': (!adminCert.cert.$dirty && adminCert.error) }" >
< div class = "input-group" >
< input type = "file" id = "adminCertFileInput" style = "display:none" / >
< input type = "text" class = "form-control" placeholder = "Certificate" ng-model = "adminCert.certificateFileName" id = "adminCertInput" name = "cert" onclick = "getElementById('adminCertFileInput').click();" style = "cursor: pointer;" ng-disabled = "adminCert.busy" required >
< span class = "input-group-addon" >
< i class = "fa fa-upload" onclick = "getElementById('adminCertFileInput').click();" > < / i >
< / span >
< / div >
< / div >
< div class = "form-group" ng-class = "{ 'has-error': (!adminCert.key.$dirty && adminCert.error) }" >
< div class = "input-group" >
< input type = "file" id = "adminKeyFileInput" style = "display:none" / >
< input type = "text" class = "form-control" placeholder = "Key" ng-model = "adminCert.keyFileName" id = "adminKeyInput" name = "key" onclick = "getElementById('adminKeyFileInput').click();" style = "cursor: pointer;" ng-disabled = "adminCert.busy" required >
< span class = "input-group-addon" >
< i class = "fa fa-upload" onclick = "getElementById('adminKeyFileInput').click();" > < / i >
< / span >
< / div >
< / div >
2017-01-29 02:01:01 -08:00
< button type = "submit" class = "btn btn-outline btn-success pull-right" ng-disabled = "adminCertForm.$invalid || busy" > < i class = "fa fa-circle-o-notch fa-spin" ng-show = "adminCert.busy" > < / i > Upload< / button >
2015-11-04 17:04:55 -08:00
< / fieldset >
< / form >
< / div >
< / div >
< / div >
2016-06-07 15:58:53 +02:00
< br / >
< br / >