| 1 | --- |
| 2 | title: Git – how to setup your own server pt 2 |
| 3 | author: Danilo M. |
| 4 | type: post |
| 5 | date: 2018-12-17T07:39:08+00:00 |
| 6 | excerpt: followup on my previous article regarding GIT and how to automatically deploy python flask scripts to serve a web app with apache. |
| 7 | draft: true |
| 8 | featured_image: /uploads/2018/07/gitout.jpg |
| 9 | categories: |
| 10 | - blogging |
| 11 | - code |
| 12 | - diy |
| 13 | - linux |
| 14 | tags: |
| 15 | - automation |
| 16 | - do it yourself |
| 17 | - flask |
| 18 | - git |
| 19 | - howto |
| 20 | - python |
| 21 | - ssh |
| 22 | |
| 23 | --- |
| 24 | This is a followup on [my previous article about how to setup your server][1] to handle a GIT repository and deploy to a web server like apache. |
| 25 | |
| 26 | Since I started experimenting with python and web publishing with it I wanted a way to push all the changes to my codebase directly to a web server, in a similar way as to what I already do with php and apache.<figure class="wp-block-pullquote" style="border-color:#abb8c3"> |
| 27 | |
| 28 | <blockquote class="has-text-color has-very-dark-gray-color"> |
| 29 | <p> |
| 30 | I want to do it myself, the way I like it.. |
| 31 | </p> |
| 32 | |
| 33 | <cite>danix</cite> |
| 34 | </blockquote></figure> |
| 35 | |
| 36 | Serving python scripts is slightly different than serving html or php, here’s a scheme that shows what happens when using python (flask in this example) to serve some web content. |
| 37 | |
| 38 | |
| 39 | <div class="wp-block-image"> |
| 40 | <figure class="aligncenter"><img loading="lazy" width="1024" height="393" src="https://danix.xyz/wp-content/uploads/2018/12/flask-scheme-1024x393.png" alt="" class="wp-image-3852" srcset="https://danix.xyz/wp-content/uploads/2018/12/flask-scheme-1024x393.png 1024w, https://danix.xyz/wp-content/uploads/2018/12/flask-scheme-300x115.png 300w, https://danix.xyz/wp-content/uploads/2018/12/flask-scheme-768x294.png 768w, https://danix.xyz/wp-content/uploads/2018/12/flask-scheme.png 1200w" sizes="(max-width: 1024px) 100vw, 1024px" /><figcaption>a simple scheme of how python scripts are served on the web.</figcaption></figure> |
| 41 | </div> |
| 42 | |
| 43 | As you can see the web server is acting as a reverse proxy to the [WSGI][2] server Gunicorn, Apache receives a request from a client, forwards the request to Gunicorn which in turn asks the python web service, in our case our flask web app. Other than as a reverse proxy, apache is used also to serve static content which is not originated in python, like images, css or js scripts. |
| 44 | |
| 45 | In order to deploy a python web app I had to install the mod_wsgi extension for apache, then I decided to use a folder in my system to install the virtual environment for python to run my web app and point to that directory in my vhost configuration file inside apache. After that I created a directory where to store all files for my web app and instructed apache to serve them using the virtualenv I created earlier. This is more or less what I did: |
| 46 | |
| 47 | <pre class="wp-block-preformatted"># create the virtual environment for python inside<br /># the folder /usr/local/virtualenvs/my-app:<br />virtualenv /usr/local/virtualenvs/my-app<br /><br /># now create the directory inside the apache root<br /># to store our web app<br />mkdir /var/www/htdocs/my-app<br /></pre> |
| 48 | |
| 49 | Now if we put all the py files for our flask web app we can run it inside apache, this is the configuration for the vhost I used: |
| 50 | |
| 51 | <pre class="wp-block-preformatted"><VirtualHost *:80><br /><code> ServerName my-app.mysite.ext</code><br /><code> ErrorLog "/var/log/httpd/my-app.error_log"</code><br /><code> CustomLog "/var/log/httpd/my-app.access_log" common</code><br /><code> WSGIDaemonProcess my-app user=apache group=apache threads=5 python-home=/usr/local/virtualenvs/my-app</code><br /><code> WSGIScriptAlias / /var/www/htdocs/my-app/my-app.wsgi</code><br /><code> WSGIProcessGroup my-app</code><br /><code> Alias "/static/" "/var/www/htdocs/my-app/static/"</code><br /><code> <Directory "/var/www/htdocs/my-app/static/"></code><br /><code> Order allow,deny</code><br /><code> Allow from all</code><br /><code> </Directory></code><br /><code> <Directory "/var/www/htdocs/my-app/"></code><br /><code> Require all granted</code><br /><code> </Directory></code><br /></VirtualHost><br /><br /></pre> |
| 52 | |
| 53 | With this setting I can now reach my web app and test it after restarting the web server. |
| 54 | |
| 55 | [1]: https://danix.xyz/2018/07/git-setup-own-server/ |
| 56 | [2]: https://en.wikipedia.org/wiki/Web_Server_Gateway_Interface |