/przygoda

The best way to find partners for bicycle trips.

Primary LanguagePython

Przygoda | Circle CI | Build Status | Coverage Status

The best way to find enthusiasts of bike tours.

Application make it easier to connect and create bike rides.

About

Application is build on microframework Flask.

Preinstall

Clone GitHub project

Our first move is to clone GitHub project into our computer.

$ sudo apt-get install git
$ git clone https://github.com/VirrageS/przygoda
$ cd przygoda

Virtual Environment initialization

Now we have to install virtual env and get all python packages we need. So lets get python packages first:

przygoda$ sudo apt-get update
przygoda$ sudo apt-get install python3-pip python3-dev
przygoda$ sudo apt-get build-dep python3-psycopg2

Now we need to install virtual env:

przygoda$ sudo pip3 install virtualenv

Lets create virtual env in our folder:

przygoda$ virtualenv env

Now we have to start our virtual env (if ever would want to leave virtual env just type deactivate):

przygoda$ source env/bin/activate

And finally install requirements which we need to make our app running. This code will install all dependencies which our app is using. You can open requirements.txt to see what they are.

(env)przygoda$ pip3 install -r requirements.txt

Database

Now we have to create simply database which will handle our queries. To make one, type:

(env)przygoda$ python3 shell.py
>>> db.create_all()
>>> exit()

IMPORTANT: you have to be in virtual environment

Unfortunetly if we use sqlite database we need delete our database and create fresh one every time we code new model or add something to existing one.

Run app

Now we can run our app by just typing python3 run.py.

przygoda$ ./run-redis; ./run-celery
przygoda$ . ./env/bin/activate
(env)przygoda$ python3 run.py
 * Running on http://127.0.0.1:5000/
 * Restarting with reloader

IMPORTANT: you have to be in virtual environment

Hurray! Our app is alive. Open [http://127.0.0.1:5000] in your browser and that's it!

Testing

To run unit tests type:

(env)przygoda$ nosetests --with-coverage --cover-erase --cover-package=app --cover-html

Babel

To run babel

(env)przygoda$ pybabel extract -F babel.cfg -o messages.pot app
(env)przygoda$ pybabel extract -F babel.cfg -k lazy_gettext -o messages.pot app
(env)przygoda$ pybabel init -i messages.pot -d app/translations -l pl
(env)przygoda$ pybabel compile -d app/translations

to update

(env)przygoda$ pybabel extract -F babel.cfg -o messages.pot app
(env)przygoda$ pybabel extract -F babel.cfg -k lazy_gettext -o messages.pot app
(env)przygoda$ pybabel update -i messages.pot -d app/translations
(env)przygoda$ pybabel compile -d app/translations

Stress tests

To check if our site is able to handle a lot of traffic we can preform stress tests:

ab -k -r -n 50000 -c 500 http://..../
Parameter Desc Value
-n Set how much packets will be send to our server 50000
-c Simulate simultaneous user connections (most important parameter) 500

Extras

Gunicorn

Now we have to create script that will run our server. First step is to type:

sudo nano /etc/init/przygoda.conf

and put this code:

description \"Gunicorn application server running PROJECT_NAME\"

start on runlevel [2345]
stop on runlevel [!2345]

respawn
setuid USER
setgid www-data

env PATH=/home/USER/PROJECT_NAME/env/bin
env CONFIG=Development

env MAIL_USERNAME=CHANGE_THIS_!!!
env MAIL_PASSWORD=CHANGE_THIS_!!!
env DATABASE_USERNAME=CHANGE_THIS_!!!
env DATABASE_PASSWORD=CHANGE_THIS_!!!
env DATABASE_HOST=CHANGE_THIS_!!!
env DATABASE_PORT=CHANGE_THIS_!!!
env DATABASE_NAME=CHANGE_THIS_!!!
env CREDENTIALS_FB_ID=CHANGE_THIS_!!!
env CREDENTIALS_FB_SECRET=CHANGE_THIS_!!!
env API_KEY=CHANGE_THIS_!!!

chdir /home/USER/PROJECT_NAME
exec gunicorn --workers 3 --bind unix:PROJECT_NAME.sock -m 007 run:app

Before saving. Change USER and PROJECT_NAME to our current user and project name for example: ubuntu and przygoda respectively. Now lets test our script and set it running.

sudo start przygoda

NGINX

First step is to remove default sites because we will not need them. Type:

sudo rm -rf /etc/nginx/sites-enabled/default
sudo rm -rf /etc/nginx/sites-available/default

Create new site by:

sudo nano /etc/nginx/sites-available/PROJECT_NAME

and put code like this:

server {
    listen 80;
    server_name SERVER_IP_ADDRESS;

    location / {
        include proxy_params;
        proxy_pass http://unix:/home/USER/PROJECT_NAME/PROJECT_NAME.sock;
        proxy_connect_timeout 30s;
        proxy_read_timeout 30s;
    }
}

Now we have to connect our site to enabled sites. Type:

sudo ln -s /etc/nginx/sites-available/PROJECT_NAME /etc/nginx/sites-enabled

Check if our nginx configuration is properly set:

sudo nginx -t

And start nginx:

sudo service nginx restart

Now, if we type SERVER_IP_ADDRESS into our browser we should see our app up and running :)!