diff --git a/doc/00_nginx-base.txt b/doc/00_nginx-base.txt new file mode 100644 index 0000000..216ead2 --- /dev/null +++ b/doc/00_nginx-base.txt @@ -0,0 +1,16 @@ + +apt-get install --no-install-recommends \ + nginx nginx-core libnginx-mod-stream \ + certbot python3-certbot-nginx + +cd /etc/nginx/modules-enabled + +rm \ + 50-mod-http-geoip.conf \ + 50-mod-http-image-filter.conf \ + 50-mod-http-xslt-filter.conf \ + 50-mod-mail.conf \ + 70-mod-stream-geoip.conf + +cp security.conf /etc/nginx/conf.d/ + diff --git a/doc/00_xyzzy-ee.txt b/doc/00_xyzzy-ee.txt new file mode 100644 index 0000000..ae70485 --- /dev/null +++ b/doc/00_xyzzy-ee.txt @@ -0,0 +1,21 @@ + +cp xyzzy.ee.conf.bootstrap \ + /etc/nginx/sites-available/xyzzy.ee.conf + +cd /etc/nginx/sites-enabled +rm default +ln -s /etc/nginx/sites-available/xyzzy.ee.conf 00xyzzy.ee.conf +cd - + +nginx -t +systemctl restart nginx + +certbot --nginx -d xyzzy.ee,www.xyzzy.ee \ + --agree-tos -m "hostmaster@xyzzy.ee" --no-eff-email \ + --deploy-hook "systemctl reload nginx" + +cp xyzzy.ee.conf /etc/nginx/sites-available/xyzzy.ee.conf + +nginx -t +systemctl restart nginx + diff --git a/doc/01_xyzzy-fi.txt b/doc/01_xyzzy-fi.txt new file mode 100644 index 0000000..2c61e92 --- /dev/null +++ b/doc/01_xyzzy-fi.txt @@ -0,0 +1,20 @@ + +cp xyzzy.fi.conf.bootstrap \ + /etc/nginx/sites-available/xyzzy.fi.conf + +cd /etc/nginx/sites-enabled +ln -s /etc/nginx/sites-available/xyzzy.fi.conf 01xyzzy.fi.conf +cd - + +nginx -t +systemctl restart nginx + +certbot --nginx -d xyzzy.fi,www.xyzzy.fi \ + --agree-tos -m "hostmaster@xyzzy.fi" --no-eff-email \ + --deploy-hook "systemctl reload nginx" + +cp xyzzy.fi.conf /etc/nginx/sites-available/xyzzy.fi.conf + +nginx -t +systemctl restart nginx + diff --git a/doc/02_git-xyzzy-ee.txt b/doc/02_git-xyzzy-ee.txt new file mode 100644 index 0000000..aed8213 --- /dev/null +++ b/doc/02_git-xyzzy-ee.txt @@ -0,0 +1,20 @@ + +cp git.xyzzy.ee.conf.bootstrap \ + /etc/nginx/sites-available/git.xyzzy.ee.conf + +cd /etc/nginx/sites-enabled +ln -s /etc/nginx/sites-available/git.xyzzy.ee.conf 02git.xyzzy.ee.conf +cd - + +nginx -t +systemctl restart nginx + +certbot --nginx -d git.xyzzy.ee \ + --agree-tos -m "hostmaster@xyzzy.ee" --no-eff-email \ + --deploy-hook "systemctl reload nginx" + +cp git.xyzzy.ee.conf /etc/nginx/sites-available/git.xyzzy.ee.conf + +nginx -t +systemctl restart nginx + diff --git a/doc/03_dwarvenruins-com.txt b/doc/03_dwarvenruins-com.txt new file mode 100644 index 0000000..b4c2a08 --- /dev/null +++ b/doc/03_dwarvenruins-com.txt @@ -0,0 +1,20 @@ + +cp dwarvenruins.com.conf.bootstrap \ + /etc/nginx/sites-available/dwarvenruins.com.conf + +cd /etc/nginx/sites-enabled +ln -s /etc/nginx/sites-available/dwarvenruins.com.conf 03dwarvenruins.com.conf +cd - + +nginx -t +systemctl restart nginx + +certbot --nginx -d dwarvenruins.com,www.dwarvenruins.com \ + --agree-tos -m "hostmaster@dwarvenruins.com" --no-eff-email \ + --deploy-hook "systemctl reload nginx" + +cp dwarvenruins.com.conf /etc/nginx/sites-available/dwarvenruins.com.conf + +nginx -t +systemctl restart nginx + diff --git a/doc/04_dwarvenmail-com.txt b/doc/04_dwarvenmail-com.txt new file mode 100644 index 0000000..cc29850 --- /dev/null +++ b/doc/04_dwarvenmail-com.txt @@ -0,0 +1,20 @@ + +cp dwarvenmail.com.conf.bootstrap \ + /etc/nginx/sites-available/dwarvenmail.com.conf + +cd /etc/nginx/sites-enabled +ln -s /etc/nginx/sites-available/dwarvenmail.com.conf 04dwarvenmail.com.conf +cd - + +nginx -t +systemctl restart nginx + +certbot --nginx -d dwarvenmail.com,www.dwarvenmail.com \ + --agree-tos -m "hostmaster@dwarvenmail.com" --no-eff-email \ + --deploy-hook "systemctl reload nginx" + +cp dwarvenmail.com.conf /etc/nginx/sites-available/dwarvenmail.com.conf + +nginx -t +systemctl restart nginx + diff --git a/doc/05_dwarvenvault-com.txt b/doc/05_dwarvenvault-com.txt new file mode 100644 index 0000000..2cbf6cf --- /dev/null +++ b/doc/05_dwarvenvault-com.txt @@ -0,0 +1,20 @@ + +cp dwarvenvault.com.conf.bootstrap \ + /etc/nginx/sites-available/dwarvenvault.com.conf + +cd /etc/nginx/sites-enabled +ln -s /etc/nginx/sites-available/dwarvenvault.com.conf 05dwarvenvault.com.conf +cd - + +nginx -t +systemctl restart nginx + +certbot --nginx -d dwarvenvault.com,www.dwarvenvault.com \ + --agree-tos -m "hostmaster@dwarvenvault.com" --no-eff-email \ + --deploy-hook "systemctl reload nginx" + +cp dwarvenvault.com.conf /etc/nginx/sites-available/dwarvenvault.com.conf + +nginx -t +systemctl restart nginx + diff --git a/doc/SETUP.md b/doc/README.md similarity index 95% rename from doc/SETUP.md rename to doc/README.md index c9177ed..c9c6deb 100644 --- a/doc/SETUP.md +++ b/doc/README.md @@ -2,6 +2,8 @@ Debian 12 minimal installation, ensure the SSH server and standard system tools are included. +Note: text files to help with nginx deployment and/or migrating sites to new hosts/VMs (certbot et. al) are ancillary to this document. + ## Base Configuration @@ -90,10 +92,18 @@ else fi ``` -After confirming the change is correct: +Ensure SSH client alive is configured in `/etc/ssh/sshd_config`: ``` -systemctl restart sshd +TCPKeepAlive yes +ClientAliveInterval 60 +ClientAliveCountMax 3 +``` + +After confirming the `sshd_config` changes are correct: + +``` +systemctl restart sshd.service ``` Test logging in again as the user and sudo to root in another term. diff --git a/etc/nginx/sites-available/dwarvenmail.com.conf b/etc/nginx/sites-available/dwarvenmail.com.conf new file mode 100644 index 0000000..ea4b66c --- /dev/null +++ b/etc/nginx/sites-available/dwarvenmail.com.conf @@ -0,0 +1,100 @@ +# dwarvenmail.com +# www.dwarvenmail.com + +server { + server_name dwarvenmail.com; + root /var/xyzzy/html/dwarvenmail; + index index.html; + + location / { + try_files $uri $uri/ =404; + } + + listen [::]:443 ssl; # managed by Certbot + listen 443 ssl; # managed by Certbot + ssl_certificate /etc/letsencrypt/live/dwarvenmail.com/fullchain.pem; # managed by Certbot + ssl_certificate_key /etc/letsencrypt/live/dwarvenmail.com/privkey.pem; # managed by Certbot + include /etc/letsencrypt/options-ssl-nginx.conf; # managed by Certbot + ssl_dhparam /etc/letsencrypt/ssl-dhparams.pem; # managed by Certbot + + # https://ssl-config.mozilla.org/ + add_header Strict-Transport-Security "max-age=15724800" always; + + # OCSP stapling + ssl_stapling on; + ssl_stapling_verify on; + ssl_trusted_certificate /etc/letsencrypt/live/dwarvenmail.com/chain.pem; + resolver 9.9.9.9 8.8.8.8 1.1.1.1; + resolver_timeout 5s; + + # https://observatory.mozilla.org + add_header X-Frame-Options "SAMEORIGIN"; + add_header X-Content-Type-Options "nosniff"; + add_header X-XSS-Protection "1; mode=block"; + add_header Referrer-Policy "strict-origin-when-cross-origin"; + add_header Content-Security-Policy "default-src 'none'; img-src 'self'; script-src 'self'; style-src 'self'; base-uri 'self'; form-action 'self'; frame-ancestors 'self';"; +} + +server { + server_name www.dwarvenmail.com; + root /var/xyzzy/html/dwarvenmail; + index index.html; + + location ~ /\.well-known { + allow all; + } + + location ~ / { + return 301 $scheme://dwarvenmail.com$request_uri; + } + + listen [::]:443 ssl; # managed by Certbot + listen 443 ssl; # managed by Certbot + ssl_certificate /etc/letsencrypt/live/dwarvenmail.com/fullchain.pem; # managed by Certbot + ssl_certificate_key /etc/letsencrypt/live/dwarvenmail.com/privkey.pem; # managed by Certbot + include /etc/letsencrypt/options-ssl-nginx.conf; # managed by Certbot + ssl_dhparam /etc/letsencrypt/ssl-dhparams.pem; # managed by Certbot + + # https://ssl-config.mozilla.org/ + add_header Strict-Transport-Security "max-age=15724800" always; + + # OCSP stapling + ssl_stapling on; + ssl_stapling_verify on; + ssl_trusted_certificate /etc/letsencrypt/live/dwarvenmail.com/chain.pem; + resolver 9.9.9.9 8.8.8.8 1.1.1.1; + resolver_timeout 5s; + + # https://observatory.mozilla.org + add_header X-Frame-Options "SAMEORIGIN"; + add_header X-Content-Type-Options "nosniff"; + add_header X-XSS-Protection "1; mode=block"; + add_header Referrer-Policy "strict-origin-when-cross-origin"; + add_header Content-Security-Policy "default-src 'none'; img-src 'self'; script-src 'self'; style-src 'self'; base-uri 'self'; form-action 'self'; frame-ancestors 'self';"; +} + +server { + if ($host = dwarvenmail.com) { + return 301 https://$host$request_uri; + } # managed by Certbot + + listen 80; + listen [::]:80; + server_name dwarvenmail.com; + root /var/xyzzy/html/dwarvenmail; + index index.html; + return 404; # managed by Certbot +} + +server { + if ($host = www.dwarvenmail.com) { + return 301 https://$host$request_uri; + } # managed by Certbot + + listen 80; + listen [::]:80; + server_name www.dwarvenmail.com; + root /var/xyzzy/html/dwarvenmail; + index index.html; + return 404; # managed by Certbot +} diff --git a/etc/nginx/sites-available/dwarvenmail.com.conf.bootstrap b/etc/nginx/sites-available/dwarvenmail.com.conf.bootstrap new file mode 100644 index 0000000..a1d10af --- /dev/null +++ b/etc/nginx/sites-available/dwarvenmail.com.conf.bootstrap @@ -0,0 +1,31 @@ +# dwarvenmail.com +# www.dwarvenmail.com + +server { + listen 80; + listen [::]:80; + server_name dwarvenmail.com; + root /var/xyzzy/html/dwarvenmail; + index index.html; + + location / { + try_files $uri $uri/ =404; + } + +} + +server { + listen 80; + listen [::]:80; + server_name www.dwarvenmail.com; + root /var/xyzzy/html/dwarvenmail; + index index.html; + + location ~ /\.well-known { + allow all; + } + + location ~ / { + return 301 $scheme://dwarvenmail.com$request_uri; + } +} diff --git a/etc/nginx/sites-available/dwarvenruins.com.conf b/etc/nginx/sites-available/dwarvenruins.com.conf new file mode 100644 index 0000000..0d6c43a --- /dev/null +++ b/etc/nginx/sites-available/dwarvenruins.com.conf @@ -0,0 +1,101 @@ +# dwarvenruins.com +# www.dwarvenruins.com + +server { + server_name dwarvenruins.com; + root /var/xyzzy/html/dwarvenruins; + index index.html; + + location / { + try_files $uri $uri/ =404; + } + + listen [::]:443 ssl; # managed by Certbot + listen 443 ssl; # managed by Certbot + ssl_certificate /etc/letsencrypt/live/dwarvenruins.com/fullchain.pem; # managed by Certbot + ssl_certificate_key /etc/letsencrypt/live/dwarvenruins.com/privkey.pem; # managed by Certbot + include /etc/letsencrypt/options-ssl-nginx.conf; # managed by Certbot + ssl_dhparam /etc/letsencrypt/ssl-dhparams.pem; # managed by Certbot + + # https://ssl-config.mozilla.org/ + add_header Strict-Transport-Security "max-age=15724800" always; + + # OCSP stapling + ssl_stapling on; + ssl_stapling_verify on; + ssl_trusted_certificate /etc/letsencrypt/live/dwarvenruins.com/chain.pem; + resolver 9.9.9.9 8.8.8.8 1.1.1.1; + resolver_timeout 5s; + + # https://observatory.mozilla.org + add_header X-Frame-Options "SAMEORIGIN"; + add_header X-Content-Type-Options "nosniff"; + add_header X-XSS-Protection "1; mode=block"; + add_header Referrer-Policy "strict-origin-when-cross-origin"; + add_header Content-Security-Policy "default-src 'none'; img-src 'self'; script-src 'self'; style-src 'self'; base-uri 'self'; form-action 'self'; frame-ancestors 'self';"; +} + +server { + server_name www.dwarvenruins.com; + root /var/xyzzy/html/dwarvenruins; + index index.html; + + location ~ /\.well-known { + allow all; + } + + location ~ / { + return 301 $scheme://dwarvenruins.com$request_uri; + } + + listen [::]:443 ssl; # managed by Certbot + listen 443 ssl; # managed by Certbot + ssl_certificate /etc/letsencrypt/live/dwarvenruins.com/fullchain.pem; # managed by Certbot + ssl_certificate_key /etc/letsencrypt/live/dwarvenruins.com/privkey.pem; # managed by Certbot + include /etc/letsencrypt/options-ssl-nginx.conf; # managed by Certbot + ssl_dhparam /etc/letsencrypt/ssl-dhparams.pem; # managed by Certbot + + # https://ssl-config.mozilla.org/ + add_header Strict-Transport-Security "max-age=15724800" always; + + # OCSP stapling + ssl_stapling on; + ssl_stapling_verify on; + ssl_trusted_certificate /etc/letsencrypt/live/dwarvenruins.com/chain.pem; + resolver 9.9.9.9 8.8.8.8 1.1.1.1; + resolver_timeout 5s; + + # https://observatory.mozilla.org + add_header X-Frame-Options "SAMEORIGIN"; + add_header X-Content-Type-Options "nosniff"; + add_header X-XSS-Protection "1; mode=block"; + add_header Referrer-Policy "strict-origin-when-cross-origin"; + add_header Content-Security-Policy "default-src 'none'; img-src 'self'; script-src 'self'; style-src 'self'; base-uri 'self'; form-action 'self'; frame-ancestors 'self';"; +} + +server { + if ($host = dwarvenruins.com) { + return 301 https://$host$request_uri; + } # managed by Certbot + + listen 80; + listen [::]:80; + server_name dwarvenruins.com; + root /var/xyzzy/html/dwarvenruins; + index index.html; + return 404; # managed by Certbot +} + +server { + if ($host = www.dwarvenruins.com) { + return 301 https://$host$request_uri; + } # managed by Certbot + + listen 80; + listen [::]:80; + server_name www.dwarvenruins.com; + root /var/xyzzy/html/dwarvenruins; + index index.html; + return 404; # managed by Certbot +} + diff --git a/etc/nginx/sites-available/dwarvenruins.com.conf.bootstrap b/etc/nginx/sites-available/dwarvenruins.com.conf.bootstrap new file mode 100644 index 0000000..f471868 --- /dev/null +++ b/etc/nginx/sites-available/dwarvenruins.com.conf.bootstrap @@ -0,0 +1,31 @@ +# dwarvenruins.com +# www.dwarvenruins.com + +server { + listen 80; + listen [::]:80; + server_name dwarvenruins.com; + root /var/xyzzy/html/dwarvenruins; + index index.html; + + location / { + try_files $uri $uri/ =404; + } + +} + +server { + listen 80; + listen [::]:80; + server_name www.dwarvenruins.com; + root /var/xyzzy/html/dwarvenruins; + index index.html; + + location ~ /\.well-known { + allow all; + } + + location ~ / { + return 301 $scheme://dwarvenruins.com$request_uri; + } +} diff --git a/etc/nginx/sites-available/dwarvenvault.com.conf b/etc/nginx/sites-available/dwarvenvault.com.conf new file mode 100644 index 0000000..09356bd --- /dev/null +++ b/etc/nginx/sites-available/dwarvenvault.com.conf @@ -0,0 +1,100 @@ +# dwarvenvault.com +# www.dwarvenvault.com + +server { + server_name dwarvenvault.com; + root /var/xyzzy/html/dwarvenvault; + index index.html; + + location / { + try_files $uri $uri/ =404; + } + + listen [::]:443 ssl; # managed by Certbot + listen 443 ssl; # managed by Certbot + ssl_certificate /etc/letsencrypt/live/dwarvenvault.com/fullchain.pem; # managed by Certbot + ssl_certificate_key /etc/letsencrypt/live/dwarvenvault.com/privkey.pem; # managed by Certbot + include /etc/letsencrypt/options-ssl-nginx.conf; # managed by Certbot + ssl_dhparam /etc/letsencrypt/ssl-dhparams.pem; # managed by Certbot + + # https://ssl-config.mozilla.org/ + add_header Strict-Transport-Security "max-age=15724800" always; + + # OCSP stapling + ssl_stapling on; + ssl_stapling_verify on; + ssl_trusted_certificate /etc/letsencrypt/live/dwarvenvault.com/chain.pem; + resolver 9.9.9.9 8.8.8.8 1.1.1.1; + resolver_timeout 5s; + + # https://observatory.mozilla.org + add_header X-Frame-Options "SAMEORIGIN"; + add_header X-Content-Type-Options "nosniff"; + add_header X-XSS-Protection "1; mode=block"; + add_header Referrer-Policy "strict-origin-when-cross-origin"; + add_header Content-Security-Policy "default-src 'none'; img-src 'self'; script-src 'self'; style-src 'self'; base-uri 'self'; form-action 'self'; frame-ancestors 'self';"; +} + +server { + server_name www.dwarvenvault.com; + root /var/xyzzy/html/dwarvenvault; + index index.html; + + location ~ /\.well-known { + allow all; + } + + location ~ / { + return 301 $scheme://dwarvenvault.com$request_uri; + } + + listen [::]:443 ssl; # managed by Certbot + listen 443 ssl; # managed by Certbot + ssl_certificate /etc/letsencrypt/live/dwarvenvault.com/fullchain.pem; # managed by Certbot + ssl_certificate_key /etc/letsencrypt/live/dwarvenvault.com/privkey.pem; # managed by Certbot + include /etc/letsencrypt/options-ssl-nginx.conf; # managed by Certbot + ssl_dhparam /etc/letsencrypt/ssl-dhparams.pem; # managed by Certbot + + # https://ssl-config.mozilla.org/ + add_header Strict-Transport-Security "max-age=15724800" always; + + # OCSP stapling + ssl_stapling on; + ssl_stapling_verify on; + ssl_trusted_certificate /etc/letsencrypt/live/dwarvenvault.com/chain.pem; + resolver 9.9.9.9 8.8.8.8 1.1.1.1; + resolver_timeout 5s; + + # https://observatory.mozilla.org + add_header X-Frame-Options "SAMEORIGIN"; + add_header X-Content-Type-Options "nosniff"; + add_header X-XSS-Protection "1; mode=block"; + add_header Referrer-Policy "strict-origin-when-cross-origin"; + add_header Content-Security-Policy "default-src 'none'; img-src 'self'; script-src 'self'; style-src 'self'; base-uri 'self'; form-action 'self'; frame-ancestors 'self';"; +} + +server { + if ($host = dwarvenvault.com) { + return 301 https://$host$request_uri; + } # managed by Certbot + + listen 80; + listen [::]:80; + server_name dwarvenvault.com; + root /var/xyzzy/html/dwarvenvault; + index index.html; + return 404; # managed by Certbot +} + +server { + if ($host = www.dwarvenvault.com) { + return 301 https://$host$request_uri; + } # managed by Certbot + + listen 80; + listen [::]:80; + server_name www.dwarvenvault.com; + root /var/xyzzy/html/dwarvenvault; + index index.html; + return 404; # managed by Certbot +} diff --git a/etc/nginx/sites-available/dwarvenvault.com.conf.bootstrap b/etc/nginx/sites-available/dwarvenvault.com.conf.bootstrap new file mode 100644 index 0000000..e96ae41 --- /dev/null +++ b/etc/nginx/sites-available/dwarvenvault.com.conf.bootstrap @@ -0,0 +1,31 @@ +# dwarvenvault.com +# www.dwarvenvault.com + +server { + listen 80; + listen [::]:80; + server_name dwarvenvault.com; + root /var/xyzzy/html/dwarvenvault; + index index.html; + + location / { + try_files $uri $uri/ =404; + } + +} + +server { + listen 80; + listen [::]:80; + server_name www.dwarvenvault.com; + root /var/xyzzy/html/dwarvenvault; + index index.html; + + location ~ /\.well-known { + allow all; + } + + location ~ / { + return 301 $scheme://dwarvenvault.com$request_uri; + } +} diff --git a/html/dwarvenmail/favicon.ico b/html/dwarvenmail/favicon.ico new file mode 100644 index 0000000..526809a Binary files /dev/null and b/html/dwarvenmail/favicon.ico differ diff --git a/html/dwarvenmail/index.css b/html/dwarvenmail/index.css new file mode 100644 index 0000000..0fd948c --- /dev/null +++ b/html/dwarvenmail/index.css @@ -0,0 +1,157 @@ +header,section{ + display:block; +} +body{ + font-size:16px; + margin:0 auto; + line-height:1.4; + background:#0b0c0d; + color:#d4d4d4; + font-family:"Noto Sans", Futura, Verdana, "Liberation Sans", sans-serif; +} +a{ + color:#7a9e55; + text-decoration:none; +} +a:hover{ + text-decoration:underline; +} +::selection { + color:#000; + background:#7a9e55; +} +h1{ + font-size:2em; + margin:.67em 0; +} +#page{ + position:relative; +} +#header{ + padding-top:50px; + transform:translate3d(0,0,0); +} +.title-wrapper{ + text-align:center; +} +.content{ + margin-left:auto; + margin-right:auto; + padding:1px 20px; + position:relative; + z-index:2; + min-width:270px; +} +.title-group.animate{ + animation:slide-fade-in .8s ease; +} +.title{ + font-size:42px; + line-height:1.2; + margin:40px 0 0; + word-wrap:break-word; +} +.title a:active{ + transform:translateY(1px); +} +.title a{ + color:#e4e4e4; + display:block; + text-decoration:none; +} +.description{ + color:#c69500; + margin:50px 0 0; + display:block; +} +.title+.description{ + margin-top:10px!important; +} +.footdesc{ + color:#c79908; + margin:20px 0 0; + display:block; +} +.footlink { + text-align: center; + font-size: 16px; +} +.footlink.animate { + animation:slide-fade-in .8s ease; +} +.middle { + overflow: auto; + margin: auto; + display: inline; + text-align: center; + vertical-align: middle; +} +@media screen and (max-width:568px){ + .content{ + padding:1px 10px; + } + .title{ + font-size:36px; + margin-top:30px; + } + .description{ + margin-top:35px; + max-width:80%; + margin-left:auto; + margin-right:auto; + } + .title+.description{ + margin-top:4px!important; + } +} + +@keyframes slide-fade-in{ + 0%{ + opacity:0; + transform:translate3d(0,20px,0); + } + to{ + opacity:1; + transform:translate3d(0,0,0); + } +} + +.divTable { + font-size: 16px; + line-height: 2.0; + display: table; + margin: auto; + border: 1px solid #444; +} +.divTable.animate { + animation:slide-fade-in .8s ease; +} +.divTableRow { + display: table-row; +} +.divTableHeading { + display: table-header-group; + background-color: #ddd; +} +.divTableCell, .divTableHead { + vertical-align: middle; + display: table-cell; + padding: 5px 10px; + border: 1px solid #444; +} +.divTableHeading { + display: table-header-group; + background-color: #ddd; + font-weight: bold; +} +.divTableFoot { + display: table-footer-group; + font-weight: bold; + background-color: #ddd; +} +.divTableBody { + display: table-row-group; +} +.valign { + vertical-align: middle; +} diff --git a/html/dwarvenmail/index.html b/html/dwarvenmail/index.html new file mode 100644 index 0000000..6c0dec2 --- /dev/null +++ b/html/dwarvenmail/index.html @@ -0,0 +1,51 @@ + + + + + + Dwarven Mail + + + + + + + + +
+ + + +
+ +
+ +
+ + + +
+ +
+ + + diff --git a/html/dwarvenruins/favicon.ico b/html/dwarvenruins/favicon.ico new file mode 100644 index 0000000..526809a Binary files /dev/null and b/html/dwarvenruins/favicon.ico differ diff --git a/html/dwarvenruins/index.css b/html/dwarvenruins/index.css new file mode 100644 index 0000000..0fd948c --- /dev/null +++ b/html/dwarvenruins/index.css @@ -0,0 +1,157 @@ +header,section{ + display:block; +} +body{ + font-size:16px; + margin:0 auto; + line-height:1.4; + background:#0b0c0d; + color:#d4d4d4; + font-family:"Noto Sans", Futura, Verdana, "Liberation Sans", sans-serif; +} +a{ + color:#7a9e55; + text-decoration:none; +} +a:hover{ + text-decoration:underline; +} +::selection { + color:#000; + background:#7a9e55; +} +h1{ + font-size:2em; + margin:.67em 0; +} +#page{ + position:relative; +} +#header{ + padding-top:50px; + transform:translate3d(0,0,0); +} +.title-wrapper{ + text-align:center; +} +.content{ + margin-left:auto; + margin-right:auto; + padding:1px 20px; + position:relative; + z-index:2; + min-width:270px; +} +.title-group.animate{ + animation:slide-fade-in .8s ease; +} +.title{ + font-size:42px; + line-height:1.2; + margin:40px 0 0; + word-wrap:break-word; +} +.title a:active{ + transform:translateY(1px); +} +.title a{ + color:#e4e4e4; + display:block; + text-decoration:none; +} +.description{ + color:#c69500; + margin:50px 0 0; + display:block; +} +.title+.description{ + margin-top:10px!important; +} +.footdesc{ + color:#c79908; + margin:20px 0 0; + display:block; +} +.footlink { + text-align: center; + font-size: 16px; +} +.footlink.animate { + animation:slide-fade-in .8s ease; +} +.middle { + overflow: auto; + margin: auto; + display: inline; + text-align: center; + vertical-align: middle; +} +@media screen and (max-width:568px){ + .content{ + padding:1px 10px; + } + .title{ + font-size:36px; + margin-top:30px; + } + .description{ + margin-top:35px; + max-width:80%; + margin-left:auto; + margin-right:auto; + } + .title+.description{ + margin-top:4px!important; + } +} + +@keyframes slide-fade-in{ + 0%{ + opacity:0; + transform:translate3d(0,20px,0); + } + to{ + opacity:1; + transform:translate3d(0,0,0); + } +} + +.divTable { + font-size: 16px; + line-height: 2.0; + display: table; + margin: auto; + border: 1px solid #444; +} +.divTable.animate { + animation:slide-fade-in .8s ease; +} +.divTableRow { + display: table-row; +} +.divTableHeading { + display: table-header-group; + background-color: #ddd; +} +.divTableCell, .divTableHead { + vertical-align: middle; + display: table-cell; + padding: 5px 10px; + border: 1px solid #444; +} +.divTableHeading { + display: table-header-group; + background-color: #ddd; + font-weight: bold; +} +.divTableFoot { + display: table-footer-group; + font-weight: bold; + background-color: #ddd; +} +.divTableBody { + display: table-row-group; +} +.valign { + vertical-align: middle; +} diff --git a/html/dwarvenruins/index.html b/html/dwarvenruins/index.html new file mode 100644 index 0000000..0f428d6 --- /dev/null +++ b/html/dwarvenruins/index.html @@ -0,0 +1,51 @@ + + + + + + Dwarven Ruins + + + + + + + + +
+ + + +
+ +
+ +
+ + + +
+ +
+ + + diff --git a/html/dwarvenvault/favicon.ico b/html/dwarvenvault/favicon.ico new file mode 100644 index 0000000..526809a Binary files /dev/null and b/html/dwarvenvault/favicon.ico differ diff --git a/html/dwarvenvault/index.css b/html/dwarvenvault/index.css new file mode 100644 index 0000000..0fd948c --- /dev/null +++ b/html/dwarvenvault/index.css @@ -0,0 +1,157 @@ +header,section{ + display:block; +} +body{ + font-size:16px; + margin:0 auto; + line-height:1.4; + background:#0b0c0d; + color:#d4d4d4; + font-family:"Noto Sans", Futura, Verdana, "Liberation Sans", sans-serif; +} +a{ + color:#7a9e55; + text-decoration:none; +} +a:hover{ + text-decoration:underline; +} +::selection { + color:#000; + background:#7a9e55; +} +h1{ + font-size:2em; + margin:.67em 0; +} +#page{ + position:relative; +} +#header{ + padding-top:50px; + transform:translate3d(0,0,0); +} +.title-wrapper{ + text-align:center; +} +.content{ + margin-left:auto; + margin-right:auto; + padding:1px 20px; + position:relative; + z-index:2; + min-width:270px; +} +.title-group.animate{ + animation:slide-fade-in .8s ease; +} +.title{ + font-size:42px; + line-height:1.2; + margin:40px 0 0; + word-wrap:break-word; +} +.title a:active{ + transform:translateY(1px); +} +.title a{ + color:#e4e4e4; + display:block; + text-decoration:none; +} +.description{ + color:#c69500; + margin:50px 0 0; + display:block; +} +.title+.description{ + margin-top:10px!important; +} +.footdesc{ + color:#c79908; + margin:20px 0 0; + display:block; +} +.footlink { + text-align: center; + font-size: 16px; +} +.footlink.animate { + animation:slide-fade-in .8s ease; +} +.middle { + overflow: auto; + margin: auto; + display: inline; + text-align: center; + vertical-align: middle; +} +@media screen and (max-width:568px){ + .content{ + padding:1px 10px; + } + .title{ + font-size:36px; + margin-top:30px; + } + .description{ + margin-top:35px; + max-width:80%; + margin-left:auto; + margin-right:auto; + } + .title+.description{ + margin-top:4px!important; + } +} + +@keyframes slide-fade-in{ + 0%{ + opacity:0; + transform:translate3d(0,20px,0); + } + to{ + opacity:1; + transform:translate3d(0,0,0); + } +} + +.divTable { + font-size: 16px; + line-height: 2.0; + display: table; + margin: auto; + border: 1px solid #444; +} +.divTable.animate { + animation:slide-fade-in .8s ease; +} +.divTableRow { + display: table-row; +} +.divTableHeading { + display: table-header-group; + background-color: #ddd; +} +.divTableCell, .divTableHead { + vertical-align: middle; + display: table-cell; + padding: 5px 10px; + border: 1px solid #444; +} +.divTableHeading { + display: table-header-group; + background-color: #ddd; + font-weight: bold; +} +.divTableFoot { + display: table-footer-group; + font-weight: bold; + background-color: #ddd; +} +.divTableBody { + display: table-row-group; +} +.valign { + vertical-align: middle; +} diff --git a/html/dwarvenvault/index.html b/html/dwarvenvault/index.html new file mode 100644 index 0000000..2b9ecf2 --- /dev/null +++ b/html/dwarvenvault/index.html @@ -0,0 +1,51 @@ + + + + + + Dwarven Vault + + + + + + + + +
+ + + +
+ +
+ +
+ + + +
+ +
+ + +