Compare commits

...

14 Commits

Author SHA1 Message Date
a87dcd5f3d update .gitignore 2019-07-16 12:19:09 -07:00
e9dc8c6b42 explicitly specify both ipv4 and ipv6 in subdomains nginx config file 2019-07-13 08:07:06 -07:00
a859c5837c add clean config script 2019-07-13 06:40:50 -07:00
3037db52d6 move configuration templates to conf.d_templates, clean conf.d 2019-07-12 23:07:56 -07:00
12781c12e9 updates to subdomains config file 2019-03-25 13:19:37 -07:00
71467e35ff include explanatory comment 2018-09-08 19:33:38 -07:00
abb4187794 Update mkdocs.yml for mkdocs 1.0 2018-08-11 12:33:18 -07:00
65d3c81478 Update mkdocs-material for mkdocs 1.0 2018-08-11 12:20:43 -07:00
72e6866ea6 typo sniper 2018-07-30 23:58:37 +00:00
3d82d7728b Merge branch 'master' of https://git.charlesreid1.com/docker/d-nginx-subdomains
* 'master' of https://git.charlesreid1.com/docker/d-nginx-subdomains:
  add license to footer, add links to readme, trim redundancy
  fix bullet item list typo
  update mkdocs
  propagate change to index
  fix last command
  update gitignore and add css
  init commit of docs
2018-07-19 11:47:20 -07:00
5a7bf7faa7 update which files the nginx config file is trying 2018-07-19 11:46:43 -07:00
9a1ed4b59a add license to footer, add links to readme, trim redundancy 2018-05-14 19:17:58 -07:00
5b01bf5793 fix bullet item list typo 2018-04-26 23:08:18 -07:00
705b5948fc update mkdocs 2018-04-24 22:00:03 -07:00
10 changed files with 126 additions and 217 deletions

1
.gitignore vendored
View File

@@ -3,3 +3,4 @@ letsencrypt/
letsencrypt_certs/
nginx.conf.default
rojo.charlesreid1.com
conf.d/http.subdomains.conf

162
README.md
View File

@@ -8,165 +8,11 @@ one-pagers.
The services are just:
* nginx
This is also intended to be reverse proxied
by another frontend nginx server,
so this one-container pod will bind
to a VPN IP address and establish
(unecrypted) HTTP connections over the
(encrypted) VPN connection.
## Links
Pretty simple, right?
[documentation: d-nginx-subdomains container](https://pages.charlesreid1.com/d-nginx-subdomains/) (you are here)
# Networking
[source code on git.charlesreid1.com: d-nginx-subdomains](https://git.charlesreid1.com/docker/d-nginx-subdomains)
The setup for this one-container docker pod
is to have an nginx container bound to all
addresses inside the container (see nginx.conf
selection below) and then bind that port
inside the container to a specific IP and port
on the host (see docker-compose selection below).
[source code on github.com: charlesreid1-docker/d-nginx-subdomains](https://github.com/charlesreid1-docker/d-nginx-subdomains)
The nginx configuration file contains a listen
directive that binds nginx to all addresses
inside the container:
```
server {
listen *:7777;
```
Meanwhile, in the `docker-compose.yml` file,
we bind the container's port 7777 to the
host's port 7777, but only on a private
IP address:
```
servies:
stormy_nginx_subs:
...
ports:
- "10.5.0.2:7777:7777"
```
# Config files
All `*.conf` files in the `conf.d/` directory will be picked up by nginx.
The config files must be named `*.conf`.
# Volumes
No data volumes are used.
* nginx static content is a bind-mounted host directory
* lets encrypt generates site certs, which will be bind-mounted into host directory
Here is the volumes directive in `docker-compose.yml`:
```
volumes:
- "./conf.d:/etc/nginx/conf.d"
- "/www/pages.charlesreid1.com/htdocs:/www/pages.charlesreid1.com/htdocs:ro"
- "/www/hooks.charlesreid1.com/htdocs:/www/hooks.charlesreid1.com/htdocs:ro"
- "/www/bots.charlesreid1.com/htdocs:/www/bots.charlesreid1.com/htdocs:ro"
```
The first line sets the nginx config files,
the rest set the static content locations.
# Backups
Site content comes from git.charlesreid1.com,
nothing to back up.
# Workflow
## Static Content Directory Layout
Directories with static content are bind-mounted
read-only into the container. To update the content
being served, just update the content directory
on the host.
(This enables you to use version control to
track the live site contents.)
The section below covers how accomplish this layout.
You should have your web content laid out as follows
on the host:
```
/www
example.com/
htdocs/
index.html
...
example.com-src/
README.md
pelican/
...
git/
<contents of .git dir>
...
example2.com/
htdocs/
...
example2.com-src/
...
git/
...
```
In the container, you will have a mirrored directory
structure, but only `htdocs`:
```
/www
example.com/
htdocs/
index.html
...
example2.com/
htdocs/
...
```
## Deploying Static Content with Git
You can use git to deploy static content, but take care
not to put your `.git` directory into the live
web directory.
```
git clone \
--separate-git-dir=/www/example.com/git \
-b gh-pages \
<url-of-static-site> \
/www/example.com/htdocs
```
Let's walk through that:
* Clone command to deploy content fresh
* Separate git dir to keep git from being live
* Branch `gh-pages` (we decided to match Github's convention)
* Url of static site from git.charlesreid1.com
* The path of the final cloned repo (bind mounted into container)
See scripts for details.
## Updating Static Content with Git
```
git \
--git-dir=/www/example.com/git \
--work-tree=/www/example.com/htdocs/reponame \
pull origin gh-pages
```

View File

@@ -1,2 +0,0 @@
allow 10.5.0.1;
allow 45.56.87.232;

View File

@@ -1,54 +0,0 @@
####################
#
# charlesreid1 subdomains
# (http only, https happens with krash)
#
# runs on #blackbeard
#
# nginx only listens on the private vpn ip,
# because it is reverse-proxied by another
# nginx instance (krash).
# binding to the private vpn ip happens
# at the docker level, not the nginx level.
#
# 7777 pages.charlesreid1.com
# 7778 hooks.charlesreid1.com
# 7779 bots.charlesreid1.com
#
####################
server {
listen 7777;
server_name pages.charlesreid1.com;
include /etc/nginx/conf.d/client-allow.conf;
deny all;
location / {
try_files $uri $uri/ =404;
root /www/pages.charlesreid1.com/htdocs;
index index.html;
}
}
server {
listen 7778;
server_name hooks.charlesreid1.com;
include /etc/nginx/conf.d/client-allow.conf;
deny all;
location / {
try_files $uri $uri/ =404;
root /www/hooks.charlesreid1.com/htdocs;
index index.html;
}
}
server {
listen 7779;
server_name bots.charlesreid1.com;
include /etc/nginx/conf.d/client-allow.conf;
deny all;
location / {
try_files $uri $uri/ =404;
root /www/bots.charlesreid1.com/htdocs;
index index.html;
}
}

View File

@@ -0,0 +1 @@
allow {{ nginx_charlesreid1_ip }};

View File

@@ -0,0 +1,69 @@
####################
#
# charlesreid1 subdomains
# (this is http only)
# (the https happens in pod-charlesreid1)
# (this happens in pod-webhooks)
#
# We use a client-allow.conf to block all IPs
# except for the IP of the machine running
# pod-charlesreid1. This is because this pod
# is reverse-proxied by the machine running
# pod-charlesreid1.
#
# Binding to a private ip happens
# at the docker level, not the nginx level.
#
# 7777 pages.{{ server_name_default }}
# 7778 hooks.{{ server_name_default }}
# 7779 bots.{{ server_name_default }}
#
####################
server {
listen 7777;
listen [::]:7777;
server_name pages.{{ server_name_default }};
## Only allow IPs in client-allow.conf
#include /etc/nginx/conf.d/client-allow.conf;
#deny all;
port_in_redirect off;
location / {
index index.html;
try_files $uri $uri/ $uri/index.html =404;
root /www/pages.{{ server_name_default }}/htdocs;
}
}
server {
listen 7778;
listen [::]:7778;
server_name hooks.{{ server_name_default }};
## Only allow IPs in client-allow.conf
#include /etc/nginx/conf.d/client-allow.conf;
#deny all;
location / {
index index.html;
try_files $uri $uri/ $uri/index.html =404;
root /www/hooks.{{ server_name_default }}/htdocs;
}
}
server {
listen 7779;
listen [::]:7779;
server_name bots.{{ server_name_default }};
## Only allow IPs in client-allow.conf
#include /etc/nginx/conf.d/client-allow.conf;
#deny all;
location / {
index index.html;
try_files $uri $uri/ $uri/index.html =404;
root /www/bots.{{ server_name_default }}/htdocs;
}
}

View File

@@ -6,6 +6,7 @@ an nginx web server for subdomain
one-pagers.
The services are just:
* nginx
This is also intended to be reverse proxied
@@ -33,6 +34,7 @@ inside the container:
```
server {
listen *:7777;
}
```
Meanwhile, in the `docker-compose.yml` file,

View File

@@ -1,4 +1,11 @@
site_name: d-nginx-subdomains
site_url: https://pages.charlesreid1.com/d-nginx-subdomains
repo_name: d-nginx-subdomains
repo_url: https://git.charlesreid1.com/docker/d-nginx-subdomains
edit_uri: ""
copyright: 'Copyright &copy; 2018 <a href="https://charlesreid1.com">Charles Reid</a>, released under the <a href="https://opensource.org/licenses/MIT">MIT license</a>'
docs_dir: docs
site_dir: site
extra_css:
@@ -14,7 +21,16 @@ theme:
font:
text: 'Roboto'
code: 'Roboto Mono'
nav:
- 'Home': 'index.md'
# Extensions
markdown_extensions:
- admonition
pages:
- 'Home': 'index.md'
- codehilite:
guess_lang: false
- toc:
permalink: true
strict: true

30
scripts/clean_config.py Normal file
View File

@@ -0,0 +1,30 @@
import glob
import os
import subprocess
"""
Clean d-nginx-subdomains conf.d directory
This script cleans out the conf.d directory
in the d-nginx-subdomains repo.
This script should be run before you generate a new set
of config files from the nginx config file templates in
d-nginx-subdomains/conf.d_templates/
This script cleans out all the config files in the folder
d-nginx-subdomains/conf.d/
That way there are no old config files to clash with the
new ones.
"""
HERE = os.path.abspath(os.path.dirname(__file__))
CONF = os.path.abspath(os.path.join(HERE,'..','conf.d'))
for f in glob.glob(os.path.join(CONF,"*.conf")):
if os.path.basename(f)!="_.conf":
cmd = ['rm','-fr',f]
subprocess.call(cmd)