/flask-formula

Flask Restful API template - development environment for Flask Restful API development based on docker

Primary LanguageJavaScript

Build Status Docker Stars Docker Pulls Docker Automated Docker Build Gitter chat

Flask Restful API template

Flask Restful API backend template - project generator/development environment. Can be used by Python developers for quick start on building Restful API on Flask.

Stack includes

  • rabbitmq
  • redis
  • elasticsearch
  • logstash
  • postgresql
  • nginx
  • supervisord
  • kibana
  • apidoc

Extra python libs and validator classes included.

Note

Before installing this project, please, make sure you have installed docker and docker-compose

To install docker execute:

$ curl -fsSL https://get.docker.com -o get-docker.sh
$ sh get-docker.sh
$ pip install docker-compose

Installation

Clone this project into your work directory:

$ git clone "https://github.com/trydirect/flask-formula.git"

Then build it with the following command:

$ cd flask-formula
$ ./setup.sh

Add localdomain to your hosts file Linux, OSX:

echo  "127.0.0.1 localdomain kibana.localdomain" | sudo tee -a /etc/hosts

Now, let's check it out

$ curl -i localhost/api/v1/hello
HTTP/1.1 200 OK
Server: nginx/1.14.2
Date: Fri, 24 May 2019 15:33:02 GMT
Content-Type: application/json
Content-Length: 14
Connection: keep-alive
Access-Control-Allow-Origin: *
Access-Control-Allow-Headers: X-Requested-With, Content-Type, X-Custom-Header
Access-Control-Allow-Methods: GET, POST, PUT, PATCH, DELETE

"Hello World"

Default kibana creds:

  • login: admin
  • password: admin
URL App
http://localhost Api doc
http://localhost/api/v1/hello Api hello endpoint
http://kibana.localdomain Kibana dashboard

Features

  • Full Docker integration
  • Docker Compose integration and optimization for local development
  • Production ready Python web server using Nginx and uWSGI
  • Python Flask backend:
  • Nginx plus HTTPS certificate generation with Let's Encrypt

The final project structure will look like this:

~/flask_formula$ tree
.
├── backend
│   ├── app
│   │   ├── apidoc.json
│   │   ├── apps
│   │   │   ├── hello
│   │   │   │   ├── __init__.py
│   │   │   │   ├── resource_schemas.py
│   │   │   │   └── views.py
│   │   │   ├── __init__.py
│   │   │   ├── rabbitmq
│   │   │   │   ├── __init__.py
│   │   │   │   ├── resource_schemas.py
│   │   │   │   └── views.py
│   │   │   └── user
│   │   │       ├── forms.py
│   │   │       ├── __init__.py
│   │   │       ├── models.py
│   │   │       ├── resource_schemas.py
│   │   │       └── views.py
│   │   ├── config
│   │   │   ├── acl.py
│   │   │   ├── config.py
│   │   │   ├── config.py.dist
│   │   │   ├── dev.py
│   │   │   ├── __init__.py
│   │   │   ├── nginx.conf
│   │   ├── docs
│   │   ├── __init__.py
│   │   ├── libs
│   │   │   ├── app.py
│   │   │   ├── auth.py
│   │   │   ├── controllers.py
│   │   │   ├── forms.py
│   │   │   ├── __init__.py
│   │   │   ├── models.py
│   │   │   ├── rabbitmq.py
│   │   │   ├── redis_session.py
│   │   │   ├── resource_schemas.py
│   │   │   └── validators.py
│   ├── manage.py
│   ├── migrations
│   │   ├── alembic.ini
│   │   ├── env.py
│   │   ├── README
│   │   ├── script.py.mako
│   │   └── versions
│   │       ├── 9d5e165bc45e_.py
│   │       ├── ce716beab747_.py
│   ├── README.md
│   ├── run.py
│   ├── wsgi.ini
│   └── wsgi.py
├── certs
│   ├── letsencrypt
│   └── ssl
│       ├── cert.pem
│       └── key.pem
├── config.json
├── configs
│   ├── elasticsearch
│   │   └── elasticsearch.yml
│   ├── logstash
│   │   ├── Dockerfile
│   │   ├── logstash.conf
│   │   └── templates
│   │       ├── filebeat.template.json
│   │       ├── packetbeat.template.json
│   │       └── topbeat.template.json
│   ├── nginx
│   │   ├── conf.d
│   │   │   ├── flask_formula.conf
│   │   ├── letsencrypt-conf.d
│   │   │   └── flask_formula.conf
│   │   ├── nginx.conf
│   │   └── ssl-conf.d
│   │       └── flask_formula.conf
│   ├── postgresql
│   │   └── pg_hba.conf
│   ├── supervisord
│   │   ├── flask_formula.conf
│   │   └── nginx.conf
│   ├── systemd
│   │   └── flask_formula.service
│   └── upstart
│       └── flask_formula.sh
├── cron
│   └── root
├── docker-compose.yml
├── docker-firewall.sh
├── elasticsearch
│   └── data
│       └── nodes
│           └── 0
│               ├── node.lock
│               └── _state
│                   └── node-157.st
├── flask_app.tar.gz
├── init-user-db.sh
├── nginx
│   ├── conf.d
│   │   └── flask_formula.conf
│   ├── letsencrypt-conf-d
│   ├── nginx.conf
│   └── ssl-conf.d
├── nginx_original
│   ├── conf.d
│   │   └── flask_formula.conf
│   ├── letsencrypt-conf.d
│   │   └── flask_formula.conf
│   └── ssl-conf.d
│       └── flask_formula.conf
├── scripts
└── supervisord
    ├── flask_formula.conf
    └── nginx.conf
$ docker-compose ps

Name                  Command                          State          Ports
------------------------------------------------------------------------------------------------------------------------------
db                    docker-entrypoint.sh postgres    Up (healthy)   5432/tcp
elasticsearch         /docker-entrypoint.sh elas ...   Up             9200/tcp, 9300/tcp
flask_formula_pmm_1   docker-entrypoint.sh postgres    Up             5432/tcp
kibana                /docker-entrypoint.sh kibana     Up             0.0.0.0:5601->5601/tcp
logstash              /docker-entrypoint.sh -e         Up             0.0.0.0:5044->5044/tcp
mq                    docker-entrypoint.sh rabbi ...   Up (healthy)   15671/tcp, 0.0.0.0:21072->15672/tcp, 25672/tcp, 4369/tcp, 5671/tcp, 0.0.0.0:2172->5672/tcp,0.0.0.0:32770->5672/tcp
nginx                 /usr/bin/supervisord -c /e ...   Up             0.0.0.0:443->443/tcp, 0.0.0.0:80->80/tcp
redis                 docker-entrypoint.sh redis ...   Up (healthy)   6379/tcp
web                   /usr/bin/supervisord -c /e ...   Up             0.0.0.0:8000->8000/tcp   

Generate Api Doc

$ ./scripts/apidoc.sh

Quick deployment to cloud

Amazon AWS, Digital Ocean, Hetzner and others

Contributing

  1. Fork it (https://github.com/trydirect/flask-formula/fork)
  2. Create your feature branch (git checkout -b feature/fooBar)
  3. Commit your changes (git commit -am 'Add some fooBar')
  4. Push to the branch (git push origin feature/fooBar)
  5. Create a new Pull Request

Support Development

Donate