multiple site support, site tabs, common tabs, django
parent
accd4d7753
commit
a3116b5102
|
@ -0,0 +1 @@
|
|||
<svg role="img" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><title>Django icon</title><path d="M11.146 0h3.924v18.165c-2.013.382-3.491.535-5.096.535-4.791 0-7.288-2.166-7.288-6.32 0-4.001 2.65-6.6 6.753-6.6.637 0 1.121.051 1.707.204V0zm0 9.143a3.894 3.894 0 0 0-1.325-.204c-1.988 0-3.134 1.223-3.134 3.364 0 2.09 1.096 3.236 3.109 3.236.433 0 .79-.025 1.35-.102V9.142z"/><path d="M21.314 6.06v9.097c0 3.134-.229 4.638-.917 5.937-.637 1.249-1.478 2.039-3.211 2.905l-3.644-1.733c1.733-.815 2.574-1.529 3.109-2.625.561-1.121.739-2.421.739-5.835V6.059h3.924zM17.39.021h3.924v4.026H17.39V.021z"/></svg>
|
After Width: | Height: | Size: 608 B |
|
@ -0,0 +1 @@
|
|||
<svg viewBox="0 0 24 24" xmlns="http://www.w3.org/2000/svg" role="img"><title>Python icon</title><path d="M14.31.18l.9.2.73.26.59.3.45.32.34.34.25.34.16.33.1.3.04.26.02.2-.01.13V8.5l-.05.63-.13.55-.21.46-.26.38-.3.31-.33.25-.35.19-.35.14-.33.1-.3.07-.26.04-.21.02H8.83l-.69.05-.59.14-.5.22-.41.27-.33.32-.27.35-.2.36-.15.37-.1.35-.07.32-.04.27-.02.21v3.06H3.23l-.21-.03-.28-.07-.32-.12-.35-.18-.36-.26-.36-.36-.35-.46-.32-.59-.28-.73-.21-.88-.14-1.05L0 11.97l.06-1.22.16-1.04.24-.87.32-.71.36-.57.4-.44.42-.33.42-.24.4-.16.36-.1.32-.05.24-.01h.16l.06.01h8.16v-.83H6.24l-.01-2.75-.02-.37.05-.34.11-.31.17-.28.25-.26.31-.23.38-.2.44-.18.51-.15.58-.12.64-.1.71-.06.77-.04.84-.02 1.27.05 1.07.13zm-6.3 1.98l-.23.33-.08.41.08.41.23.34.33.22.41.09.41-.09.33-.22.23-.34.08-.41-.08-.41-.23-.33-.33-.22-.41-.09-.41.09-.33.22z"/><path d="M21.1 6.11l.28.06.32.12.35.18.36.27.36.35.35.47.32.59.28.73.21.88.14 1.04.05 1.23-.06 1.23-.16 1.04-.24.86-.32.71-.36.57-.4.45-.42.33-.42.24-.4.16-.36.09-.32.05-.24.02-.16-.01h-8.22v.82h5.84l.01 2.76.02.36-.05.34-.11.31-.17.29-.25.25-.31.24-.38.2-.44.17-.51.15-.58.13-.64.09-.71.07-.77.04-.84.01-1.27-.04-1.07-.14-.9-.2-.73-.25-.59-.3-.45-.33-.34-.34-.25-.34-.16-.33-.1-.3-.04-.25-.02-.2.01-.13v-5.34l.05-.64.13-.54.21-.46.26-.38.3-.32.33-.24.35-.2.35-.14.33-.1.3-.06.26-.04.21-.02.13-.01h5.84l.69-.05.59-.14.5-.21.41-.28.33-.32.27-.35.2-.36.15-.36.1-.35.07-.32.04-.28.02-.21V6.07h2.09l.14.01.21.03zm-6.47 14.25l-.23.33-.08.41.08.41.23.33.33.23.41.08.41-.08.33-.23.23-.33.08-.41-.08-.41-.23-.33-.33-.23-.41-.08-.41.08-.33.23z"/></svg>
|
After Width: | Height: | Size: 1.5 KiB |
File diff suppressed because it is too large
Load Diff
1654
public/index.html
1654
public/index.html
File diff suppressed because it is too large
Load Diff
|
@ -1,52 +1,65 @@
|
|||
<!-- ✔ symlink --><span ng-if="isSymlink()"><!--
|
||||
|
||||
--><span class="hljs-comment"># <strong>Virtual host</strong>: create symbolic link</span>
|
||||
<span class="hljs-section">ln</span> <span class="hljs-attribute">-s</span> /etc/nginx/sites-available/{{ domain() }}.conf /etc/nginx/sites-enabled/{{ domain() }}.conf</span><!--
|
||||
--><span class="hljs-comment"># <strong>Virtual host</strong>: create symbolic link{{ getDomains().length > 1 ? 's' : '' }}</span>
|
||||
<span class="hljs-section">ln</span> <span class="hljs-attribute">-s</span> <span ng-repeat="(_site, _domain) in getDomains() track by $index">/etc/nginx/sites-available/{{ _domain }}.conf </span>/etc/nginx/sites-enabled</span><!--
|
||||
|
||||
|
||||
✔ symlink || ✔ HTTPS --><span ng-if="isSymlink() && ((isHTTPS() && !isSSLProfileModern()) || isCertLetsEncrypt())">
|
||||
✔ symlink || ✔ HTTPS --><span ng-if="isSymlink() && (isSSLProfileIntermediate() || isSSLProfileOld() || hasCertLetsEncrypt())">
|
||||
|
||||
</span><!--
|
||||
|
||||
|
||||
✔ HTTPS --><span ng-if="isHTTPS() && !isSSLProfileModern()"><!--
|
||||
✔ SSL profile: intermediate || old --><span ng-if="isSSLProfileIntermediate() || isSSLProfileOld()"><!--
|
||||
|
||||
--><span class="hljs-comment"># <strong>HTTPS</strong>: create Diffie-Hellman keys</span>
|
||||
<span class="hljs-section">openssl dhparam</span> <span class="hljs-attribute">-dsaparam</span> <span class="hljs-attribute">-out</span> /etc/nginx/dhparam.pem <span class="hljs-number">{{ isSSLProfileOld() ? 1024 : 2048 }}</span><!--
|
||||
|
||||
--><span ng-if="isCertLetsEncrypt()">
|
||||
--><span ng-if="hasCertLetsEncrypt()">
|
||||
|
||||
</span></span><!--
|
||||
|
||||
|
||||
✔ Let's Encrypt --><span ng-if="isCertLetsEncrypt()"><!--
|
||||
✔ Let's Encrypt --><span ng-if="hasCertLetsEncrypt()"><!--
|
||||
--><span class="hljs-comment"># <strong>HTTPS - certbot</strong> (before first run): create ACME-challenge common directory</span>
|
||||
<span class="hljs-section">mkdir</span> <span class="hljs-attribute">-p</span> /var/www/_letsencrypt && <span class="hljs-section">chown</span> <span class="hljs-attribute">{{ data.user }}</span> /var/www/_letsencrypt
|
||||
<!--
|
||||
|
||||
|
||||
|
||||
-->
|
||||
<span class="hljs-comment"># <strong>HTTPS - certbot</strong> (before first run): disable SSL directives</span>
|
||||
<span class="hljs-section">sed</span> <!--
|
||||
--><span class="hljs-attribute">-i</span> <!--
|
||||
--><span class="hljs-attribute">-r</span> <!--
|
||||
-->'s/(listen .*443)/\1;#/g; s/(ssl_(certificate|certificate_key|trusted_certificate) )/#;#\1/g' <!--
|
||||
-->{{ isModularized() ? ('/etc/nginx/sites-' + (isSymlink() ? 'available' : 'enabled') + '/' + domain() + '.conf') : '/etc/nginx/nginx.conf' }}
|
||||
-->'s/(listen .*443)/\1;#/g; s/(ssl_(certificate|certificate_key|trusted_certificate) )/#;#\1/g'<span ng-if="isUnified()"><!--
|
||||
--> /etc/nginx/nginx.conf</span><span ng-if="isModularized()"><span ng-repeat="(_site, _domain) in getDomains() track by $index" ng-if="isCertLetsEncrypt(_site)"><!--
|
||||
--> /etc/nginx/sites-{{ isSymlink() ? 'available' : 'enabled' }}/{{ _domain }}.conf</span></span>
|
||||
<!--
|
||||
|
||||
<span class="hljs-comment"># <strong>HTTPS - certbot</strong>: obtain certificates</span>
|
||||
|
||||
|
||||
-->
|
||||
<span class="hljs-comment"># <strong>HTTPS - certbot</strong>: obtain certificates</span><!--
|
||||
--><span ng-repeat="(_site, _domain) in getDomains() track by $index" ng-if="isCertLetsEncrypt(_site)">
|
||||
<span class="hljs-section">certbot certonly</span> <!--
|
||||
--><span class="hljs-attribute">--webroot</span> <!--
|
||||
--><span ng-if="isNonWWW() || isRedirect()"><span class="hljs-attribute" tooltips tooltip-template="--domain">-d</span> {{ domain() }} </span><!--
|
||||
--><span ng-if="isWWW() || isRedirect()"><span class="hljs-attribute" tooltips tooltip-template="--domain">-d</span> www.{{ domain() }} </span><!--
|
||||
--><span ng-if="isCDN()"><span class="hljs-attribute" tooltips tooltip-template="--domain">-d</span> cdn.{{ domain() }} </span><!--
|
||||
--><span class="hljs-attribute">--email</span> {{ data.email ? data.email : 'info@' + domain() }} <!--
|
||||
--><span ng-if="isNonWWW(_site) || isRedirect(_site)"><span class="hljs-attribute" tooltips tooltip-template="--domain">-d</span> {{ _domain }} </span><!--
|
||||
--><span ng-if="isWWW(_site) || isRedirect(_site)"><span class="hljs-attribute" tooltips tooltip-template="--domain">-d</span> www.{{ _domain }} </span><!--
|
||||
--><span ng-if="isCDN(_site)"><span class="hljs-attribute" tooltips tooltip-template="--domain">-d</span> cdn.{{ _domain }} </span><!--
|
||||
--><span class="hljs-attribute">--email</span> {{ data.email ? data.email : 'info@' + _domain }} <!--
|
||||
--><span class="hljs-attribute" tooltips tooltip-template="--webroot-path">-w</span> /var/www/_letsencrypt <!--
|
||||
--><span class="hljs-attribute" tooltips tooltip-template="--non-interactive">-n</span> <!--
|
||||
--><span class="hljs-attribute">--agree-tos</span> <!--
|
||||
--><span class="hljs-attribute">--force-renewal</span>
|
||||
--><span class="hljs-attribute">--force-renewal</span></span>
|
||||
<!--
|
||||
|
||||
|
||||
|
||||
-->
|
||||
<span class="hljs-comment"># <strong>HTTPS - certbot</strong> (after first run): enable SSL directives</span>
|
||||
<span class="hljs-section">sed</span> <!--
|
||||
--><span class="hljs-attribute">-i</span> <!--
|
||||
--><span class="hljs-attribute">-r</span> <!--
|
||||
-->'s/#?;#//g' <!--
|
||||
-->{{ isModularized() ? ('/etc/nginx/sites-' + (isSymlink() ? 'available' : 'enabled') + '/' + domain() + '.conf') : '/etc/nginx/nginx.conf' }}<!--
|
||||
|
||||
--></span>
|
||||
-->'s/#?;#//g'<span ng-if="isUnified()"><!--
|
||||
--> /etc/nginx/nginx.conf</span><span ng-if="isModularized()"><span ng-repeat="(_site, _domain) in getDomains() track by $index" ng-if="isCertLetsEncrypt(_site)"><!--
|
||||
--> /etc/nginx/sites-{{ isSymlink() ? 'available' : 'enabled' }}/{{ _domain }}.conf</span></span></span>
|
||||
|
|
|
@ -20,13 +20,6 @@ http {<!--
|
|||
server {{ data.php_server[0] === '/' ? 'unix:' : '' }}{{ data.php_server }};
|
||||
server {{ data.php_server_backup[0] === '/' ? 'unix:' : '' }}{{ data.php_server_backup }} backup;
|
||||
}
|
||||
</span><!--
|
||||
|
||||
✔ Python backup --><span ng-if="isPythonBackup()">
|
||||
upstream python {
|
||||
server {{ data.python_server[0] === '/' ? 'unix:' : '' }}{{ data.python_server }};
|
||||
server {{ data.python_server_backup[0] === '/' ? 'unix:' : '' }}{{ data.python_server_backup }} backup;
|
||||
}
|
||||
</span>
|
||||
charset utf-8;
|
||||
sendfile on;
|
||||
|
@ -55,14 +48,14 @@ http {<!--
|
|||
limit_req_log_level warn;
|
||||
limit_req_zone $binary_remote_addr zone=login:10m rate=10r/m;</span><!--
|
||||
|
||||
✔ HTTPS --><span ng-if="isHTTPS()">
|
||||
✔ HTTPS --><span ng-if="hasHTTPS()">
|
||||
|
||||
# SSL
|
||||
ssl_session_timeout 1d;
|
||||
ssl_session_cache shared:SSL:50m;
|
||||
ssl_session_tickets off;<!--
|
||||
|
||||
✘ SSLProfileModern --><span ng-if="!isSSLProfileModern()">
|
||||
✘ SSLProfileModern --><span ng-if="isSSLProfileIntermediate() || isSSLProfileOld()">
|
||||
|
||||
# Diffie-Hellman parameter for DHE ciphersuites
|
||||
ssl_dhparam /etc/nginx/dhparam.pem;</span>
|
||||
|
@ -85,9 +78,9 @@ http {<!--
|
|||
resolver_timeout 2s;</span></span>
|
||||
|
||||
# load configs
|
||||
include /etc/nginx/conf.d/*.conf;<span ng-if="data.file_structure === 'modularized'">
|
||||
include /etc/nginx/sites-enabled/*;</span><span ng-if="data.file_structure === 'unified'">
|
||||
include /etc/nginx/conf.d/*.conf;<span ng-if="isModularized()">
|
||||
include /etc/nginx/sites-enabled/*;</span><span ng-if="isUnified()">
|
||||
|
||||
# {{ !data.non_www ? 'www.' : '' }}{{ domain() }}
|
||||
# {{ !data.non_www ? 'www.' : '' }}{{ getDomain() }}
|
||||
<ng-include ng-include-tabs="1" src="'templates/conf/sites-available/example.com.conf.html?v=COMMIT_HASH'" sonload="refreshHighlighting()"></ng-include></span>
|
||||
}
|
||||
|
|
|
@ -7,51 +7,80 @@ add_header Referrer-Policy "{{ data.referrer_policy }}" always;<!--
|
|||
✔ CSP --><span ng-if="isCSP()">
|
||||
add_header Content-Security-Policy "{{ data.content_security_policy }}" always;</span><!--
|
||||
|
||||
✔ HSTS--><span ng-if="isHSTS()">
|
||||
✔ HSTS--><span ng-if="hasCommonHSTS()">
|
||||
add_header Strict-Transport-Security "max-age=31536000{{ isHSTSSubdomains() ? '; includeSubDomains' : '' }}{{ isHSTSPreload() ? '; preload' : '' }}" always;</span>
|
||||
|
||||
# . files
|
||||
location ~ /\.(?!well-known) {
|
||||
deny all;
|
||||
}<span ng-if="data.expires_assets && data.expires_assets !== data.expires_media">
|
||||
}<!--
|
||||
|
||||
# assets
|
||||
✘ root --><span ng-if="allRoot()">
|
||||
|
||||
<!--
|
||||
|
||||
✔ expires assets
|
||||
--><span ng-if="data.expires_assets && data.expires_assets !== data.expires_media"># assets
|
||||
location ~* \.(?:{{ extensions.assets }})$ {
|
||||
expires {{ data.expires_assets }};<!--
|
||||
|
||||
✘ accessLog --><span ng-if="isAccessLog()">
|
||||
access_log off;</span>
|
||||
}</span><span ng-if="data.expires_media">
|
||||
}</span><!--
|
||||
|
||||
# {{ data.expires_assets && data.expires_assets === data.expires_media ? 'assets, ' : '' }}media
|
||||
✔ expires assets && ✔ expires media --><span ng-if="data.expires_assets && data.expires_media && data.expires_assets !== data.expires_media">
|
||||
|
||||
</span><!--
|
||||
|
||||
✔ expires media
|
||||
--><span ng-if="data.expires_media"># {{ data.expires_assets && data.expires_assets === data.expires_media ? 'assets, ' : '' }}media
|
||||
location ~* \.(?:{{ data.expires_assets && data.expires_assets === data.expires_media ? extensions.assets + '|' : '' }}{{ extensions.images }}|{{ extensions.audio }}|{{ extensions.video }})$ {
|
||||
expires {{ data.expires_media }};<!--
|
||||
|
||||
✘ accessLog --><span ng-if="isAccessLog()">
|
||||
access_log off;</span>
|
||||
}</span><span ng-if="data.expires_svg && data.expires_svg !== data.expires_fonts">
|
||||
}</span><!--
|
||||
|
||||
# svg
|
||||
(✔ expires assets || ✔ expires media) && ✔ expires svg--><span ng-if="(data.expires_assets || data.expires_media) && (data.expires_svg || data.expires_fonts)">
|
||||
|
||||
</span><!--
|
||||
|
||||
✔ expires svg
|
||||
--><span ng-if="data.expires_svg && data.expires_svg !== data.expires_fonts"># svg
|
||||
location ~* \.{{ extensions.svg }}$ {
|
||||
add_header Access-Control-Allow-Origin "*";
|
||||
expires {{ data.expires_svg }};<!--
|
||||
|
||||
✘ accessLog --><span ng-if="isAccessLog()">
|
||||
access_log off;</span>
|
||||
}</span><span ng-if="data.expires_fonts">
|
||||
}</span><!--
|
||||
|
||||
# {{ data.expires_svg && data.expires_svg === data.expires_fonts ? 'svg, ' : '' }}fonts
|
||||
✔ expires svg && ✔ expires fonts --><span ng-if="data.expires_svg && data.expires_fonts && data.expires_svg !== data.expires_fonts">
|
||||
|
||||
</span><!--
|
||||
|
||||
✔ expires fonts
|
||||
--><span ng-if="data.expires_fonts"># {{ data.expires_svg && data.expires_svg === data.expires_fonts ? 'svg, ' : '' }}fonts
|
||||
location ~* \.(?:{{ data.expires_svg && data.expires_svg === data.expires_fonts ? extensions.svg + '|' : '' }}{{ extensions.fonts }})$ {
|
||||
add_header Access-Control-Allow-Origin "*";
|
||||
expires {{ data.expires_fonts }};<!--
|
||||
|
||||
✘ accessLog --><span ng-if="isAccessLog()">
|
||||
access_log off;</span>
|
||||
}</span>
|
||||
<span ng-if="isGzip()">
|
||||
# gzip
|
||||
}</span><!--
|
||||
|
||||
✔ expires && ✔ gzip --><span ng-if="(data.expires_assets || data.expires_media || data.expires_svg || data.expires_fonts) && isGzip()">
|
||||
|
||||
</span></span><!--
|
||||
|
||||
✔ gzip --><span ng-if="isGzip()"># gzip
|
||||
gzip on;
|
||||
gzip_vary on;
|
||||
gzip_proxied any;
|
||||
gzip_comp_level 6;
|
||||
gzip_types {{ gzipTypes }};</span>
|
||||
gzip_types {{ gzipTypes }};</span><!--
|
||||
|
||||
✔ gzip && ✔ brotli --><span ng-if="isGzip() && isBrotli()">
|
||||
|
||||
</span><!--
|
||||
|
||||
✔ brotli --><span ng-if="isBrotli()"># brotli
|
||||
brotli on;
|
||||
brotli_comp_level 6;
|
||||
brotli_types {{ gzipTypes }};</span>
|
||||
|
|
|
@ -1,5 +1,5 @@
|
|||
<!--
|
||||
✔ Legacy PHP routing --><span ng-if="isLegacyPHPRouting()"><!--
|
||||
✔ Legacy PHP routing --><span ng-if="hasLegacyPHPRouting()"><!--
|
||||
--># split path
|
||||
fastcgi_split_path_info ^(.+\.php)(/.+)$;
|
||||
set $_fastcgi_path_info $fastcgi_path_info;
|
||||
|
@ -21,6 +21,6 @@ fastcgi_buffer_size 32k;
|
|||
# fastcgi params
|
||||
fastcgi_param DOCUMENT_ROOT $realpath_root;
|
||||
fastcgi_param SCRIPT_FILENAME $realpath_root$fastcgi_script_name;<!--
|
||||
✔ Legacy PHP routing --><span ng-if="isLegacyPHPRouting()">
|
||||
✔ Legacy PHP routing --><span ng-if="hasLegacyPHPRouting()">
|
||||
fastcgi_param PATH_INFO $_fastcgi_path_info;</span>
|
||||
fastcgi_param PHP_ADMIN_VALUE "open_basedir=$base/:/usr/lib/php/:/tmp/";
|
||||
|
|
|
@ -1,63 +1,70 @@
|
|||
server {<!--
|
||||
|
||||
✘ HTTPS || ✘ forceHTTPS --><span ng-if="!isHTTPS() || !isForceHTTPS()">
|
||||
listen {{ data.ipv4 !== '*' ? data.ipv4 + ':' : '' }}80;<!--
|
||||
✘ HTTPS || ✘ forceHTTPS --><span ng-if="!isHTTPS(_site) || !isForceHTTPS(_site)">
|
||||
listen {{ data.sites[_site].ipv4 !== '*' ? data.sites[_site].ipv4 + ':' : '' }}80;<!--
|
||||
|
||||
✔ IPv6 --><span ng-if="isIPv6()">
|
||||
listen [{{ data.ipv6 }}]:80;</span></span><!--
|
||||
✔ IPv6 --><span ng-if="isIPv6(_site)">
|
||||
listen [{{ data.sites[_site].ipv6 }}]:80;</span></span><!--
|
||||
|
||||
✔ HTTPS --><span ng-if="isHTTPS()">
|
||||
listen {{ data.ipv4 !== '*' ? data.ipv4 + ':' : '' }}443 ssl{{ isHTTP2() ? ' http2' : '' }};<!--
|
||||
✔ HTTPS --><span ng-if="isHTTPS(_site)">
|
||||
listen {{ data.sites[_site].ipv4 !== '*' ? data.sites[_site].ipv4 + ':' : '' }}443 ssl{{ isHTTP2() ? ' http2' : '' }};<!--
|
||||
|
||||
✔ IPv6 --><span ng-if="isIPv6()">
|
||||
listen [{{ data.ipv6 }}]:443 ssl{{ isHTTP2() ? ' http2' : '' }};</span></span>
|
||||
✔ IPv6 --><span ng-if="isIPv6(_site)">
|
||||
listen [{{ data.sites[_site].ipv6 }}]:443 ssl{{ isHTTP2() ? ' http2' : '' }};</span></span>
|
||||
|
||||
server_name {{ isWWW() ? 'www.' : '' }}{{ domain() }};<!--
|
||||
server_name {{ isWWW() ? 'www.' : '' }}{{ _domain }};<!--
|
||||
|
||||
✔ PHP --><span ng-if="isPHP()">
|
||||
set $base {{ data.path ? data.path : '/var/www/' + domain() }};
|
||||
root $base{{ data.document_root }};</span><!--
|
||||
✔ PHP || ✔ Django --><span ng-if="isPHP(_site) || isDjango(_site)">
|
||||
set $base {{ getPath(_site) }};<!--
|
||||
|
||||
✘ PHP --><span ng-if="!isPHP()">
|
||||
root /var/www/{{ domain() }}{{ data.document_root }};</span><!--
|
||||
✔ root --><span ng-if="isRoot(_site)">
|
||||
root $base{{ data.sites[_site].document_root }};</span></span><!--
|
||||
|
||||
✔ HTTPS --><span ng-if="isHTTPS()">
|
||||
✘ PHP && ✘ Django--><span ng-if="!isPHP(_site) && !isDjango(_site) && isRoot(_site)">
|
||||
root {{ getPath(_site) }}{{ data.sites[_site].document_root }};</span><!--
|
||||
|
||||
✔ HTTPS --><span ng-if="isHTTPS(_site)">
|
||||
|
||||
# SSL
|
||||
ssl_certificate {{ sslCertificate() }};
|
||||
ssl_certificate_key {{ sslCertificateKey() }};<!--
|
||||
ssl_certificate {{ getSslCertificate(_site) }};
|
||||
ssl_certificate_key {{ getSslCertificateKey(_site) }};<!--
|
||||
|
||||
✔ Let's Encrypt --><span ng-if="isCertLetsEncrypt()">
|
||||
ssl_trusted_certificate /etc/letsencrypt/live/{{ domain() }}/fullchain.pem;</span></span><!--
|
||||
✔ Let's Encrypt --><span ng-if="isCertLetsEncrypt(_site)">
|
||||
ssl_trusted_certificate /etc/letsencrypt/live/{{ _domain }}/fullchain.pem;</span></span><!--
|
||||
|
||||
✔ access log domain || error log domain --><span ng-if="isAccessLogDomain() || isErrorLogDomain()">
|
||||
✔ HSTS --><span ng-if="!hasCommonHSTS() && isHSTS(_site)">
|
||||
|
||||
# HSTS
|
||||
add_header Strict-Transport-Security "max-age=31536000{{ isHSTSSubdomains(_site) ? '; includeSubDomains' : '' }}{{ isHSTSPreload(_site) ? '; preload' : '' }}" always;</span><!--
|
||||
|
||||
✔ access log domain || error log domain --><span ng-if="isAccessLogDomain(_site) || isErrorLogDomain(_site)">
|
||||
|
||||
# logging<!--
|
||||
✔ access log domain --><span ng-if="isAccessLogDomain()">
|
||||
access_log {{ accessLogDomainPath() }};</span><!--
|
||||
✔ error log domain --><span ng-if="isErrorLogDomain()">
|
||||
error_log {{ errorLogDomainPath() }};</span></span><!--
|
||||
✔ access log domain --><span ng-if="isAccessLogDomain(_site)">
|
||||
access_log {{ getAccessLogDomainPath(_site) }};</span><!--
|
||||
✔ error log domain --><span ng-if="isErrorLogDomain(_site)">
|
||||
error_log {{ getErrorLogDomainPath(_site) }};</span></span><!--
|
||||
|
||||
✔ index.php --><span ng-if="isIndexPHP()">
|
||||
✔ index.php --><span ng-if="isIndexPHP(_site)">
|
||||
|
||||
# index.php
|
||||
index index.php;</span><!--
|
||||
|
||||
✔ Fallback HTML || ✔ Fallback PHP --><span ng-if="(isFallbackHTML() || isFallbackPHP()) && (!isProxy() || data.proxy_path !== '/')">
|
||||
✔ Fallback HTML || ✔ Fallback PHP --><span ng-if="(isFallbackHTML(_site) || isFallbackPHP(_site)) && (!isProxy(_site) || data.proxy_path !== '/')">
|
||||
|
||||
# {{ isFallbackHTML() ? 'index.html' : ( isFallbackPHP() ? 'index.php' : '' ) }} fallback
|
||||
# {{ isFallbackHTML(_site) ? 'index.html' : ( isFallbackPHP(_site) ? 'index.php' : '' ) }} fallback
|
||||
location / {
|
||||
try_files $uri $uri/ {{ isFallbackHTML() ? '/index.html' : ( isFallbackPHP() ? '/index.php?$query_string' : '' ) }};
|
||||
try_files $uri $uri/ {{ isFallbackHTML(_site) ? '/index.html' : ( isFallbackPHP(_site) ? '/index.php?$query_string' : '' ) }};
|
||||
}</span><!--
|
||||
|
||||
✔ Fallback HTML && ✔ Fallback PHP --><span ng-if="isFallbackHTML() && isFallbackPHP()">
|
||||
✔ Fallback HTML && ✔ Fallback PHP --><span ng-if="isFallbackHTML(_site) && isFallbackPHP(_site)">
|
||||
|
||||
# index.php fallback
|
||||
location ~ ^{{ data.fallback_php_path }} {
|
||||
location ~ ^{{ data.sites[_site].fallback_php_path }} {
|
||||
try_files $uri $uri/ /index.php?$query_string;
|
||||
}</span><!--
|
||||
|
||||
✔ Python --><span ng-if="isPython()">
|
||||
✔ Python --><span ng-if="isPython(_site)">
|
||||
|
||||
# Python
|
||||
location / {<!--
|
||||
|
@ -67,13 +74,25 @@ server {<!--
|
|||
|
||||
✔ unified --><span ng-if="isUnified()">
|
||||
<!-- --> <ng-include ng-include-tabs="3" src="'templates/conf/nginxconfig.io/python_uwsgi.conf.html?v=COMMIT_HASH'" onload="refreshHighlighting()"></ng-include></span>
|
||||
}</span><!--
|
||||
}<!--
|
||||
|
||||
✔ Reverse proxy --><span ng-if="isProxy()">
|
||||
✔ Django --><span ng-if="isDjango(_site)">
|
||||
|
||||
# Django media
|
||||
location /media/ {
|
||||
alias $base/media/;
|
||||
}
|
||||
|
||||
# Django static
|
||||
location /static/ {
|
||||
alias $base/static/;
|
||||
}</span></span><!--
|
||||
|
||||
✔ Reverse proxy --><span ng-if="isProxy(_site)">
|
||||
|
||||
# reverse proxy
|
||||
location {{ data.proxy_path }} {
|
||||
proxy_pass {{ data.proxy_pass }};<!--
|
||||
location {{ data.sites[_site].proxy_path }} {
|
||||
proxy_pass {{ data.sites[_site].proxy_pass }};<!--
|
||||
|
||||
✔ modularized --><span ng-if="isModularized()">
|
||||
include nginxconfig.io/proxy.conf;</span><!--
|
||||
|
@ -82,15 +101,15 @@ server {<!--
|
|||
<!-- --> <ng-include ng-include-tabs="3" src="'templates/conf/nginxconfig.io/proxy.conf.html?v=COMMIT_HASH'" onload="refreshHighlighting()"></ng-include></span>
|
||||
}</span><!--
|
||||
|
||||
✔ PHP --><span ng-if="isPHP()">
|
||||
✔ PHP --><span ng-if="isPHP(_site)">
|
||||
|
||||
# handle .php
|
||||
location ~ {{ isLegacyPHPRouting() ? '[^/]\\.php(/|$)' : '\\.php$' }} {<!--
|
||||
location ~ {{ isLegacyPHPRouting(_site) ? '[^/]\\.php(/|$)' : '\\.php$' }} {<!--
|
||||
|
||||
✔ modularized || ✔ WordPress --><span ng-if="isModularized() || isWordPress()">
|
||||
✔ modularized || ✔ WordPress --><span ng-if="isModularized() || isWordPress(_site)">
|
||||
include nginxconfig.io/php_fastcgi.conf;</span><!--
|
||||
|
||||
✔ unified && ✘ WordPress --><span ng-if="isUnified() && !isWordPress()">
|
||||
✔ unified && ✘ WordPress --><span ng-if="isUnified() && !isWordPress(_site)">
|
||||
<ng-include ng-include-tabs="{{ isUnified() ? 3 : 1 }}" src="'templates/conf/nginxconfig.io/php_fastcgi.conf.html?v=COMMIT_HASH'" onload="refreshHighlighting()"></ng-include></span>
|
||||
}</span><!--
|
||||
|
||||
|
@ -102,13 +121,13 @@ server {<!--
|
|||
✔ modularized --><span ng-if="isModularized()">
|
||||
include nginxconfig.io/general.conf;</span><!--
|
||||
|
||||
✔ modularized && ✔ WordPress --><span ng-if="isModularized() && isWordPress()">
|
||||
✔ modularized && ✔ WordPress --><span ng-if="isModularized() && isWordPress(_site)">
|
||||
include nginxconfig.io/wordpress.conf;</span><!--
|
||||
|
||||
✔ modularized && ✔ Drupal --><span ng-if="isModularized() && isDrupal()">
|
||||
✔ modularized && ✔ Drupal --><span ng-if="isModularized() && isDrupal(_site)">
|
||||
include nginxconfig.io/drupal.conf;</span><!--
|
||||
|
||||
✔ modularized && ✔ Magento --><span ng-if="isModularized() && isMagento()">
|
||||
✔ modularized && ✔ Magento --><span ng-if="isModularized() && isMagento(_site)">
|
||||
include nginxconfig.io/magento.conf;</span><!--
|
||||
|
||||
|
||||
|
@ -117,43 +136,43 @@ server {<!--
|
|||
|
||||
<!-- --><ng-include ng-include-tabs="2" src="'templates/conf/nginxconfig.io/general.conf.html?v=COMMIT_HASH'" onload="refreshHighlighting()"></ng-include></span><!--
|
||||
|
||||
✔ unified && ✔ WordPress --><span ng-if="isUnified() && isWordPress()">
|
||||
✔ unified && ✔ WordPress --><span ng-if="isUnified() && isWordPress(_site)">
|
||||
|
||||
<!-- --><ng-include ng-include-tabs="2" src="'templates/conf/nginxconfig.io/wordpress.conf.html?v=COMMIT_HASH'" onload="refreshHighlighting()"></ng-include></span><!--
|
||||
|
||||
✔ unified && ✔ Drupal --><span ng-if="isUnified() && isDrupal()">
|
||||
✔ unified && ✔ Drupal --><span ng-if="isUnified() && isDrupal(_site)">
|
||||
|
||||
<!-- --><ng-include ng-include-tabs="2" src="'templates/conf/nginxconfig.io/drupal.conf.html?v=COMMIT_HASH'" onload="refreshHighlighting()"></ng-include></span><!--
|
||||
|
||||
✔ unified && ✔ Magento --><span ng-if="isUnified() && isMagento()">
|
||||
✔ unified && ✔ Magento --><span ng-if="isUnified() && isMagento(_site)">
|
||||
|
||||
<!-- --><ng-include ng-include-tabs="2" src="'templates/conf/nginxconfig.io/magento.conf.html?v=COMMIT_HASH'" onload="refreshHighlighting()"></ng-include></span>
|
||||
}<!--
|
||||
|
||||
|
||||
|
||||
✔ CDN --><span ng-if="isCDN()">
|
||||
✔ CDN --><span ng-if="isCDN(_site)">
|
||||
|
||||
# CDN
|
||||
server {
|
||||
listen {{ data.ipv4 !== '*' ? data.ipv4 + ':' : '' }}{{ isHTTPS() ? '443 ssl' : '80' }}{{ isHTTP2() ? ' http2' : '' }};<!--
|
||||
listen {{ data.sites[_site].ipv4 !== '*' ? data.sites[_site].ipv4 + ':' : '' }}{{ isHTTPS(_site) ? '443 ssl' : '80' }}{{ isHTTP2(_site) ? ' http2' : '' }};<!--
|
||||
|
||||
✔ IPv6 --><span ng-if="isIPv6()">
|
||||
listen [{{ data.ipv6 }}]:{{ isHTTPS() ? '443 ssl' : '80' }}{{ isHTTP2() ? ' http2' : '' }};</span>
|
||||
✔ IPv6 --><span ng-if="isIPv6(_site)">
|
||||
listen [{{ data.sites[_site].ipv6 }}]:{{ isHTTPS(_site) ? '443 ssl' : '80' }}{{ isHTTP2(_site) ? ' http2' : '' }};</span>
|
||||
|
||||
server_name cdn.{{ domain() }};
|
||||
root /var/www/{{ domain() }}{{ data.document_root }};<span ng-if="!isAccessLog()">
|
||||
server_name cdn.{{ _domain }};
|
||||
root /var/www/{{ _domain }}{{ data.sites[_site].document_root }};<span ng-if="!isAccessLog()">
|
||||
|
||||
access_log off;</span><!--
|
||||
|
||||
✔ HTTPS --><span ng-if="isHTTPS()">
|
||||
✔ HTTPS --><span ng-if="isHTTPS(_site)">
|
||||
|
||||
# SSL
|
||||
ssl_certificate {{ sslCertificate() }};
|
||||
ssl_certificate_key {{ sslCertificateKey() }};<!--
|
||||
ssl_certificate {{ getSslCertificate(_site) }};
|
||||
ssl_certificate_key {{ getSslCertificateKey(_site) }};<!--
|
||||
|
||||
✔ Let's Encrypt --><span ng-if="isCertLetsEncrypt()">
|
||||
ssl_trusted_certificate /etc/letsencrypt/live/{{ domain() }}/fullchain.pem;</span></span>
|
||||
✔ Let's Encrypt --><span ng-if="isCertLetsEncrypt(_site)">
|
||||
ssl_trusted_certificate /etc/letsencrypt/live/{{ _domain }}/fullchain.pem;</span></span>
|
||||
|
||||
# disable access_log
|
||||
access_log off;<!--
|
||||
|
@ -182,57 +201,57 @@ server {
|
|||
|
||||
|
||||
|
||||
✔ redirect --><span ng-if="isRedirect()">
|
||||
✔ redirect --><span ng-if="isRedirect(_site)">
|
||||
|
||||
# {{ isWWW() ? 'non-www, ' : '' }}subdomains redirect
|
||||
server {
|
||||
listen {{ data.ipv4 !== '*' ? data.ipv4 + ':' : '' }}{{ isHTTPS() ? '443 ssl' : '80' }}{{ isHTTP2() ? ' http2' : '' }};<!--
|
||||
listen {{ data.sites[_site].ipv4 !== '*' ? data.sites[_site].ipv4 + ':' : '' }}{{ isHTTPS() ? '443 ssl' : '80' }}{{ isHTTP2() ? ' http2' : '' }};<!--
|
||||
|
||||
✔ IPv6 --><span ng-if="isIPv6()">
|
||||
listen [{{ data.ipv6 }}]:{{ isHTTPS() ? '443 ssl' : '80' }}{{ isHTTP2() ? ' http2' : '' }};</span>
|
||||
✔ IPv6 --><span ng-if="isIPv6(_site)">
|
||||
listen [{{ data.sites[_site].ipv6 }}]:{{ isHTTPS() ? '443 ssl' : '80' }}{{ isHTTP2() ? ' http2' : '' }};</span>
|
||||
|
||||
server_name {{ isWWW() ? ('.' + domain()) : ('*.' + domain()) }};<!--
|
||||
server_name {{ isWWW() ? ('.' + _domain) : ('*.' + _domain) }};<!--
|
||||
|
||||
✔ HTTPS --><span ng-if="isHTTPS()">
|
||||
✔ HTTPS --><span ng-if="isHTTPS(_site)">
|
||||
|
||||
# SSL
|
||||
ssl_certificate {{ sslCertificate() }};
|
||||
ssl_certificate_key {{ sslCertificateKey() }};<!--
|
||||
ssl_certificate {{ getSslCertificate(_site) }};
|
||||
ssl_certificate_key {{ getSslCertificateKey(_site) }};<!--
|
||||
|
||||
✔ Let's Encrypt --><span ng-if="isCertLetsEncrypt()">
|
||||
ssl_trusted_certificate /etc/letsencrypt/live/{{ domain() }}/fullchain.pem;</span></span>
|
||||
✔ Let's Encrypt --><span ng-if="isCertLetsEncrypt(_site)">
|
||||
ssl_trusted_certificate /etc/letsencrypt/live/{{ _domain }}/fullchain.pem;</span></span>
|
||||
|
||||
return 301 http{{ isHTTPS() ? 's' : '' }}://{{ isWWW() ? 'www.' : '' }}{{ domain() }}$request_uri;
|
||||
return 301 http{{ isHTTPS() ? 's' : '' }}://{{ isWWW() ? 'www.' : '' }}{{ _domain }}$request_uri;
|
||||
}</span><!--
|
||||
|
||||
|
||||
|
||||
✔ forceHTTPS --><span ng-if="isForceHTTPS()">
|
||||
✔ forceHTTPS --><span ng-if="isForceHTTPS(_site)">
|
||||
|
||||
# HTTP redirect
|
||||
server {
|
||||
listen {{ data.ipv4 !== '*' ? data.ipv4 + ':' : '' }}80;<!--
|
||||
listen {{ data.sites[_site].ipv4 !== '*' ? data.sites[_site].ipv4 + ':' : '' }}80;<!--
|
||||
|
||||
✔ IPv6 --><span ng-if="isIPv6()">
|
||||
listen [{{ data.ipv6 }}]:80;</span>
|
||||
✔ IPv6 --><span ng-if="isIPv6(_site)">
|
||||
listen [{{ data.sites[_site].ipv6 }}]:80;</span>
|
||||
|
||||
server_name .{{ domain() }};<!--
|
||||
server_name .{{ _domain }};<!--
|
||||
|
||||
✔ modularized && ✔ Let's Encrypt --><span ng-if="isModularized() && isCertLetsEncrypt()">
|
||||
✔ modularized && ✔ Let's Encrypt --><span ng-if="isModularized() && isCertLetsEncrypt(_site)">
|
||||
|
||||
include nginxconfig.io/letsencrypt.conf;</span><!--
|
||||
|
||||
✔ unified && ✔ Let's Encrypt --><span ng-if="isUnified() && isCertLetsEncrypt()">
|
||||
✔ unified && ✔ Let's Encrypt --><span ng-if="isUnified() && isCertLetsEncrypt(_site)">
|
||||
|
||||
<ng-include ng-include-tabs="2" src="'templates/conf/nginxconfig.io/letsencrypt.conf.html?v=COMMIT_HASH'" onload="refreshHighlighting()"></ng-include></span><!--
|
||||
|
||||
✔ Let's Encrypt --><span ng-if="isCertLetsEncrypt()">
|
||||
✔ Let's Encrypt --><span ng-if="isCertLetsEncrypt(_site)">
|
||||
|
||||
location / {
|
||||
return 301 https://{{ isWWW() ? 'www.' : '' }}{{ domain() }}$request_uri;
|
||||
return 301 https://{{ isWWW(_site) ? 'www.' : '' }}{{ _domain }}$request_uri;
|
||||
}</span><!--
|
||||
|
||||
✘ Let's Encrypt --><span ng-if="!isCertLetsEncrypt()">
|
||||
✘ Let's Encrypt --><span ng-if="!isCertLetsEncrypt(_site)">
|
||||
|
||||
return 301 https://{{ isWWW() ? 'www.' : '' }}{{ domain() }}$request_uri;</span>
|
||||
return 301 https://{{ isWWW(_site) ? 'www.' : '' }}{{ _domain }}$request_uri;</span>
|
||||
}</span>
|
||||
|
|
|
@ -5,9 +5,11 @@
|
|||
display: block;
|
||||
position: relative;
|
||||
background-color: #f8f8f8;
|
||||
border: 1px solid #dee2e6;
|
||||
|
||||
&[data-adsbygoogle-status="done"] {
|
||||
background-color: transparent;
|
||||
border: 0;
|
||||
}
|
||||
|
||||
aside.sidebar & {
|
||||
|
|
|
@ -18,6 +18,7 @@ header {
|
|||
.btn-outline-light {
|
||||
border-color: #999;
|
||||
|
||||
&.active,
|
||||
&:hover {
|
||||
background-color: #fff;
|
||||
border-color: #fff;
|
||||
|
|
|
@ -9,18 +9,76 @@
|
|||
section.tabs {
|
||||
margin-bottom: 1rem;
|
||||
|
||||
.sites {
|
||||
margin-bottom: 1rem;
|
||||
}
|
||||
|
||||
.lead {
|
||||
margin-top: 0.5rem;
|
||||
}
|
||||
|
||||
.nav-tabs {
|
||||
.nav-item {
|
||||
&.disabled {
|
||||
pointer-events: none;
|
||||
user-select: none;
|
||||
flex-grow: 0;
|
||||
padding: 0 1rem;
|
||||
font-weight: 700;
|
||||
font-style: italic;
|
||||
color: #666;
|
||||
}
|
||||
|
||||
.nav-link {
|
||||
padding-top: 0.25rem;
|
||||
padding-bottom: 0.25rem;
|
||||
}
|
||||
}
|
||||
|
||||
&.nav-site {
|
||||
.nav-item {
|
||||
.nav-link {
|
||||
&.changed {
|
||||
font-weight: normal;
|
||||
}
|
||||
|
||||
&.active {
|
||||
font-weight: 700;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
&.nav-site-tab {
|
||||
.nav-item {
|
||||
.nav-link {
|
||||
&:hover {
|
||||
background-color: #f8f8f8;
|
||||
}
|
||||
|
||||
&.active {
|
||||
background-color: #f8f8f8;
|
||||
|
||||
@include media-breakpoint-up(xl) {
|
||||
border-bottom-color: #f8f8f8;
|
||||
background-color: #f8f8f8;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
.nav-item {
|
||||
flex-basis: 50%;
|
||||
|
||||
@include media-breakpoint-down(lg) {
|
||||
a {
|
||||
.nav-link {
|
||||
border-bottom-left-radius: $border-radius;
|
||||
border-bottom-right-radius: $border-radius;
|
||||
}
|
||||
|
||||
&:nth-last-child(-n+2) {
|
||||
a {
|
||||
.nav-link {
|
||||
border-bottom-left-radius: 0;
|
||||
border-bottom-right-radius: 0;
|
||||
}
|
||||
|
@ -31,7 +89,7 @@ section.tabs {
|
|||
flex: 1 1 auto;
|
||||
}
|
||||
|
||||
a {
|
||||
.nav-link {
|
||||
cursor: pointer;
|
||||
position: relative;
|
||||
transition: all 0.25s;
|
||||
|
@ -41,7 +99,6 @@ section.tabs {
|
|||
@include media-breakpoint-up(xl) {
|
||||
padding-left: 0;
|
||||
padding-right: 0;
|
||||
font-size: 1rem;
|
||||
text-align: center;
|
||||
}
|
||||
|
||||
|
@ -73,7 +130,7 @@ section.tabs {
|
|||
display: inline;
|
||||
|
||||
@include media-breakpoint-up(xl) {
|
||||
padding-left: 0.1rem;
|
||||
padding-left: 0.2rem;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -100,6 +157,36 @@ section.tabs {
|
|||
border-bottom-right-radius: 0.25rem;
|
||||
border-bottom-left-radius: 0.25rem;
|
||||
|
||||
&.site-content {
|
||||
padding-bottom: 0.75rem;
|
||||
}
|
||||
|
||||
&.site-tab-content {
|
||||
background-color: #f8f8f8;
|
||||
|
||||
.form-group {
|
||||
margin-bottom: 0;
|
||||
|
||||
.form-check {
|
||||
// padding-top: 0.25rem;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
.row + .row:not(.form-group) {
|
||||
margin-top: 0.5rem;
|
||||
}
|
||||
|
||||
.disabled {
|
||||
pointer-events: none;
|
||||
user-select: none;
|
||||
opacity: 0.4;
|
||||
|
||||
.disabled {
|
||||
opacity: 1;
|
||||
}
|
||||
}
|
||||
|
||||
.form-group {
|
||||
margin-bottom: 0.25rem;
|
||||
|
||||
|
@ -107,15 +194,54 @@ section.tabs {
|
|||
margin-bottom: 0.5rem;
|
||||
}
|
||||
|
||||
.col-form-label {
|
||||
@include media-breakpoint-only(xs) {
|
||||
font-weight: 700;
|
||||
margin-bottom: -0.25rem;
|
||||
&:last-child {
|
||||
margin-bottom: 0;
|
||||
}
|
||||
|
||||
.form-control-sm {
|
||||
padding-top: 0;
|
||||
padding-bottom: 0;
|
||||
margin-bottom: 1px;
|
||||
}
|
||||
|
||||
select.form-control-sm {
|
||||
height: 24px;
|
||||
}
|
||||
|
||||
.col-form-label-sm {
|
||||
padding-top: 0;
|
||||
padding-bottom: 0;
|
||||
}
|
||||
|
||||
.input-group-sm {
|
||||
.input-group-text {
|
||||
font-size: 0.75rem;
|
||||
}
|
||||
}
|
||||
|
||||
label {
|
||||
margin-bottom: 0;
|
||||
|
||||
&.col-form-label {
|
||||
@include media-breakpoint-only(xs) {
|
||||
font-weight: 700;
|
||||
margin-bottom: -0.25rem;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
.form-check {
|
||||
padding-top: 0.2rem;
|
||||
font-size: 0;
|
||||
padding-bottom: 3px;
|
||||
|
||||
&.form-check-left {
|
||||
padding-left: 0;
|
||||
|
||||
.form-check-input {
|
||||
position: relative;
|
||||
margin-left: 0.25rem;
|
||||
}
|
||||
}
|
||||
|
||||
.form-check-label {
|
||||
cursor: pointer;
|
||||
|
@ -132,16 +258,10 @@ section.tabs {
|
|||
.form-check.input-changed {
|
||||
border-radius: 0.2rem;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
.btn {
|
||||
&.btn-download {
|
||||
img {
|
||||
vertical-align: -2px;
|
||||
margin-right: 0.1rem;
|
||||
width: 1rem;
|
||||
}
|
||||
}
|
||||
}
|
||||
section.loader {
|
||||
position: fixed;
|
||||
z-index: 1;
|
||||
|
@ -185,6 +305,16 @@ main {
|
|||
opacity: 1;
|
||||
}
|
||||
|
||||
.btn {
|
||||
&.btn-download {
|
||||
img {
|
||||
vertical-align: -1px;
|
||||
margin-right: 0.1rem;
|
||||
width: 1rem;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
.commands {
|
||||
margin-bottom: 1rem;
|
||||
}
|
||||
|
@ -206,6 +336,7 @@ main {
|
|||
font-size: 0.75rem;
|
||||
line-height: 1.25;
|
||||
background-color: #f8f8f8;
|
||||
border: 1px solid #e8e8e8;
|
||||
|
||||
pre {
|
||||
margin-bottom: 0;
|
||||
|
|
Loading…
Reference in New Issue