summaryrefslogtreecommitdiff
path: root/docs
diff options
context:
space:
mode:
Diffstat (limited to 'docs')
-rw-r--r--docs/README.md175
-rw-r--r--docs/images/think2t.png.svg145
2 files changed, 320 insertions, 0 deletions
diff --git a/docs/README.md b/docs/README.md
new file mode 100644
index 0000000..293f652
--- /dev/null
+++ b/docs/README.md
@@ -0,0 +1,175 @@
+# Bartender: a wsgi server
+
+This impliments a wsgi server that is called by a github webhook. When called it validates the request, schedules an at job, and returns a status. The at job pulls the "docs" off of github, builds the site, and moves it into place.
+
+## The Stack
+
+```mermaid
+graph LR
+ B -- http(s)://127.0.0.1:8000 <--> C[nginx] -- http(s)://bartender/whisky/STYLE <--> I([Internet])
+ A[flask] -- wsgi <--> B[gunicorn];
+```
+
+The implimentation
+
+```mermaid
+graph LR
+ A[bartender app] --> C[AT]
+ A -- 200 ok / 400 bad id / 404 --> N[NGinX]
+ N <-- bartender.digithink.com --> I([Internet])
+ G[(github)] -- pull --> D
+ C --> D[pullandbuild.sh]
+ D -- mkdocks build --> O[(site)] -->N
+ N -- whiskey/STYLE --> A
+```
+
+## The source code and the results
+
+- [https://github.com/feurig/digithink/tree/main/whiskey](https://github.com/feurig/digithink/tree/main/whiskey)
+ The source code for the bartender service is in the same repository as the content it serves
+- [https://www.digithink.com](https://www.digithink.com) is the target website.
+- [https://bartender.digithink.com/](https://bartender.digithink.com/) contains this and the other documents for the service.
+
+### Installing the service
+
+```sh
+apt install nginx
+apt install certbot python3-certbot-nginx
+apt install python3-flask
+apt install python3-gunicorn
+apt install at
+
+echo www-data |tee /etc/at.allow
+nano /etc/systemd/system/whiskey.service
+[Unit]
+Description=Gunicorn instance to serve whiskey
+After=network.target
+
+[Service]
+User=www-data
+Group=www-data
+WorkingDirectory=/var/www/digithink/whiskey
+#Environment="PATH=/home/sammy/myproject/myprojectenv/bin"
+# --bind unix:/run/whiskey.sock \
+
+ExecStart=/usr/bin/gunicorn \
+ --workers 3 \
+ --bind 127.0.0.1:5000 \
+ --reload \
+ --access-logfile /var/www/digithink/whiskey/logs/gunicorn_access.log \
+ --error-logfile /var/www/digithink/whiskey/logs/gunicorn_error.log \
+ -m 007 wsgi:app
+ExecReload=/bin/kill -s HUP $MAINPID
+ExecStop=/bin/kill -s TERM $MAINPID
+
+[Install]
+WantedBy=multi-user.target
+^X
+systemctl enable whiskey
+systemctl start whiskey
+```
+
+### nginx.conf
+
+```sh
+# lots of hard coded foo here
+server {
+ server_name bartender.digithink.com;
+
+ listen 198.202.31.232:443 ssl;
+ server_name bartender.digithink.com;
+ ssl_certificate /etc/letsencrypt/live/bartender.digithink.com/fullchain.pem; # managed by Certbot
+ ssl_certificate_key /etc/letsencrypt/live/bartender.digithink.com/privkey.pem; # managed by Certbot
+
+ root /var/www/digithink/whiskey/bartender;
+ index index.html;
+ location /whiskey {
+ include proxy_params;
+ proxy_pass http://bartender/whiskey;
+ }
+ # point the error page to the one created by mkdocs
+ error_page 404 /404.html;
+ location /404.html {
+ internal;
+ }
+}
+
+# redirect http to https
+server {
+ root /var/www/digithink/whiskey/bartender;
+ index index.html;
+ if ($host = bartender.digithink.com) {
+ return 301 https://$host$request_uri;
+ } # managed by Certbot
+
+ listen 198.202.31.232:80;
+ server_name bartender.digithink.com;
+ return 404; # managed by Certbot
+}
+```
+
+### the WSGI app
+
+The actual app will grow into something with better feedback more general use (ie to make different static web sites)
+
+#### drink.py
+
+Minimum Viable Product
+
+```python
+from flask import Flask
+from markupsafe import escape
+import subprocess
+
+app = Flask(__name__)
+
+@app.route("/whiskey/<style>",methods = ['POST'])
+def whiskey(style):
+ # break this out by style.
+ subprocess.call(['at', 'now', '-f', '/var/www/digithink/whiskey/pullandbuild.sh'])
+ return f"One Whiskey, {escape(style)}!"
+```
+
+The actual [drink.py](https://github.com/suspect-devices/digithink/blob/main/whiskey/drink.py) is slightly more developed.
+
+#### wsgi.py, Turning the above into a WSGI app
+
+```python
+from drink import app
+
+if __name__ == "__main__":
+ app.run()
+```
+
+## Converting the git content to a static html site.
+
+### mkdocs plus the extensions
+
+Ubuntu (... ok, debian really...) fracked up the packaging for mkdocs and mkdocs-material. I wound up removing the packages and pip3 installing most of it with --break-system-packages.
+
+```sh
+apt remove mkdocs*
+apt remove markdown
+apt remove python3-markdown
+apt install python3-regex
+apt install libvips-dev
+apt install python3-pip
+pip3 install mkdocs-material --break-system-packages
+```
+
+#### pull dependencies based on the current mkdocs install and mkdocs.yml
+
+```sh
+cd /var/www/digithink/&& git pull
+mkdocs-get-deps > requirements.txt
+pip3 install $(mkdocs-get-deps) --break-system-packages
+mkdocs build && chown -R www-data:www-data site/
+```
+
+## linkdump
+
+- <https://github.com/codingforentrepreneurs/Pi-Awesome/blob/main/how-tos/Create%20a%20Minimal%20Web%20Application%20with%20Nginx%2C%20Python%2C%20Flask%20%26%20Raspberry%20Pi.md>
+- <https://www.stackovercloud.com/2020/05/27/how-to-serve-flask-applications-with-uwsgi-and-nginx-on-ubuntu-20-04/>
+- <https://www.digitalocean.com/community/tutorials/how-to-set-up-uwsgi-and-nginx-to-serve-python-apps-on-ubuntu-14-04>
+- <https://stackoverflow.com/questions/10748108/nginx-uwsgi-unavailable-modifier-requested-0#11055729>
+- https://github.com/mkdocs/get-deps
diff --git a/docs/images/think2t.png.svg b/docs/images/think2t.png.svg
new file mode 100644
index 0000000..50f8b1e
--- /dev/null
+++ b/docs/images/think2t.png.svg
@@ -0,0 +1,145 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<svg
+ xmlns:dc="http://purl.org/dc/elements/1.1/"
+ xmlns:cc="http://creativecommons.org/ns#"
+ xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+ xmlns:svg="http://www.w3.org/2000/svg"
+ xmlns="http://www.w3.org/2000/svg"
+ xmlns:xlink="http://www.w3.org/1999/xlink"
+ xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+ xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+ inkscape:version="1.0 (4035a4f, 2020-05-01)"
+ sodipodi:docname="think2t.png.svg"
+ viewBox="0 0 62 87"
+ height="87"
+ width="62"
+ id="svg10"
+ version="1.1">
+ <metadata
+ id="metadata16">
+ <rdf:RDF>
+ <cc:Work
+ rdf:about="">
+ <dc:format>image/svg+xml</dc:format>
+ <dc:type
+ rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+ <dc:title></dc:title>
+ </cc:Work>
+ </rdf:RDF>
+ </metadata>
+ <defs
+ id="defs14" />
+ <sodipodi:namedview
+ inkscape:current-layer="g18"
+ inkscape:window-maximized="0"
+ inkscape:window-y="23"
+ inkscape:window-x="0"
+ inkscape:cy="43.5"
+ inkscape:cx="31"
+ inkscape:zoom="8.4252874"
+ showgrid="false"
+ id="namedview12"
+ inkscape:window-height="940"
+ inkscape:window-width="1046"
+ inkscape:pageshadow="2"
+ inkscape:pageopacity="0"
+ guidetolerance="10"
+ gridtolerance="10"
+ objecttolerance="10"
+ borderopacity="1"
+ bordercolor="#666666"
+ pagecolor="#ffffff" />
+ <g
+ id="g18"
+ inkscape:label="Image"
+ inkscape:groupmode="layer">
+ <image
+ id="image20"
+ xlink:href="data:image/png;base64,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
+l3PJ9Bl8tPkj2lpPM3K0Py4XRo4upLjIdq8KSZIYObqQrw5o28TzvjOb2374QxInqDcvnM77H1Sw
+85PdtLc2U1jsvC+nqiob1r/Jv/3iMS69eBo1v1vNyNFlrrq7rs721x9zS9JRUHCOqe9IoG8JZYkj
+aNNLBfMxsEldrPP8+VdVxPNraR6fj5KSElpb2wm3tjjI0PDqyy9y5133APDC6ueTkoYkxHds+1jf
+A4tEIjQ3O20Lp4IEuT7y6unEwbWiP4MGRSxltPNx436aG9ramrnzrns477xhKMpp01zDDSmtx5/7
+9ZP88wM/SyGn9WYiBsWdVnCq/vQZI14mzQXfHbf/gPff3cr3Fi3kmV/+ho0b1yfNnxLxjo7j7Pxk
+tz6jSxX61q/JAIb0uEcd0xJ75bEk/4kUR1GRzCOPPkVhsczjTzxLgd/Pj+/4+6St1JX4seOn6DwR
+ob21mZrf/YEr51xBMCjR3HyAcGsLnZ0n6Og4TiQSQVVVVFXllBLjeEcEFYVDB5t0xaO0Q+wk++uP
+oSin+WzfYVNdSqeXLxt7gPjS1kC4uUXhkx07MR4ogNb9Dh/aS2PDl1q51mZ9wlX52MMcbmvh5htv
+1t/b4DRE1FRX6UNCYlyvrV2nbygax/pZM6eJ2tp1oqa6yrQ6k2VZzJo5TXy64yWxauVyU1piI7Fy
+xTI9LTGOJ8rVVFeJVSuX62N5IJAnysvLxIKKeaK2dp1YUDFP1yOha+WKZaa5SOK90zzAccqaWCmt
+ffOPAFQuepjLLpuNJEksf/BBACZNHEf9gSZOn+pkbGgUw4eP4Dbg1m5z5C0eWsjcKy/W5N46z5Q2
+efJfUTy0kFzfMLos5S6//HzgfAByfcMYnD9ET7voohkAnD5lvqo5aeI4Td/HHrZxOrd4mOl7Rn8V
+JKpuwUNr/Jt9jpk4jvJwCKIfEvXcoqeZ77EmEI/u2d9I+d+jU0UGfwdGRVEK8FvOFBTFaUOyAL9/
+tCWt77N/UG+8j2uG6onl26+UnyEyRjwSUalvcJpguE86kqf1oSh4itDYAanlioz+8o/fX9h/pgEg
+Jzft7f9+kTHikqSdZJ4NZGpL2SQzk8LaIkfpOt3/FDNdnBdKdpoyMGSMuKpCUXAonf5YpkTq0Dxu
+3oU5Y5mZEiRJEvnnDAXDIV+mEAwWkEnSkOHhrPHgZ2elqefkZjNydGZ/iiFjxDtPqPj9hbZxPBPo
+6Yo5HCedGTI2c9MWAgM7POwfUkZJQ4abuvXExIqG/fv56oD5RtTg/CFMmjgOf2CwSynttESSnLec
+BooMBregfmLinqeA3Dzzzami4FDOHTU24x7tDxn+6cL/O/hvv63GaHIytUAAAAAASUVORK5CYII=
+"
+ preserveAspectRatio="none"
+ height="87"
+ width="62" />
+ </g>
+</svg>