···11-UPV Car Share Project
22-=====================
11+Poli Car Project
22+================
3344Made with Python 3 and Django with :heart:.
5566.. image:: https://travis-ci.org/marcosgabarda/upvcarshare.svg?branch=master
77 :target: https://travis-ci.org/marcosgabarda/upvcarshare
88-99-Install Spatialite (macOS)
1010---------------------------
1111-1212-Install SpatiaLite with brew on macOS::
1313-1414- brew update
1515- brew install spatialite-tools
1616- brew install gdal
1717-1818-Install Oracle client (macOS)
1919------------------------------
2020-2121-Download from `Oracle <http://www.oracle.com/technetwork/topics/intel-macsoft-096467.html>`_
2222-2323-- instantclient-basic-macos.x64-12.1.0.2.0.zip
2424-- instantclient-sdk-macos.x64-12.1.0.2.0.zip
2525-2626-Create a directory ``/usr/local/lib/oracle``::
2727-2828- export ORACLE_HOME=/usr/local/lib/oracle
2929- export VERSION=12.1.0.2.0
3030- export ARCH=x86_64
3131-3232- mkdir -p $ORACLE_HOME
3333-3434-Unpack both files to that directory, and create symlinks::
3535-3636- cd $ORACLE_HOME
3737- tar -xzf instantclient-basic-12.1.0.2.0-macosx-x64.zip
3838- tar -xzf instantclient-sdk-12.1.0.2.0-macosx-x64.zip
3939- mv instantclient_12_1/* $ORACLE_HOME
4040- rmdir instantclient_12_1
4141-4242- cd /usr/local/lib/
4343- ln -s $ORACLE_HOME/libclntsh.dylib.12.1 libclntsh.dylib.12.1
4444- ln -s $ORACLE_HOME/libclntsh.dylib.12.1 libclntsh.dylib
4545- ln -s $ORACLE_HOME/libocci.dylib.12.1 libocci.dylib.12.1
4646- ln -s $ORACLE_HOME/libnnz12.dylib libnnz12.dylib
4747-4848-Install ``cx_Oracle`` from PIP::
4949-5050- env ARCHFLAGS="-arch $ARCH" pip install cx-Oracle==5.2.1
5151-5252-Environment Variables
5353----------------------
5454-5555-List of environment variables that the project needs to work in production:
5656-5757-- ``DJANGO_ALLOWED_HOSTS="example.com"``
5858-- ``DJANGO_SETTINGS_MODULE="config.settings.production"``
5959-- ``DJANGO_SECRET_KEY="verylongstringwithnumbers"``
6060-- ``DATABASE_URL="oraclegis://dbuser:dbpass@db.server.com:1521/dbname"``
6161-6262-Static files
6363-------------
6464-6565-The default folder for Django's ``STATICFILES_DIRS`` value is ``/static/dist/``, therefore all
6666-static data have to be created by **gulp**.
6767-6868-Run tests
6969----------
7070-7171-To run the tests using Docker::
7272-7373- $ docker-compose -f dev.yml run app python3 manage.py test --settings=config.settings.test
7474-
+294
docs/deploy.rst
···11+Despliegue en CentOS
22+====================
33+44+Instrucciones para la instalación de poli Car en un servidor **CentOS 7.2**.
55+66+Dependencias de yum
77+-------------------
88+99+.. code-block:: console
1010+1111+ $ yum install libjpeg-devel zlib-devel gcc python-devel libcap-devel supervisor gdal gdal-devel yum-utils
1212+1313+Instalar Python 3
1414+-----------------
1515+1616+El proyecto requiere de **Python 3** para funcionar. Se puede instalar usando las fuentes,
1717+siguiendo estos pasos:
1818+1919+.. code-block:: console
2020+2121+ $ sudo yum-builddep python
2222+ $ wget https://www.python.org/ftp/python/3.5.2/Python-3.5.2.tgz
2323+ $ tar xf Python-3.5.2.tgz
2424+ $ cd Python-3.5.2
2525+ $ ./configure
2626+ $ make
2727+ $ sudo make install
2828+2929+3030+Instalar Node
3131+-------------
3232+3333+Para la gestión de los ficheros estáticos se necesita tener instalado **Node**. Para instalarlo desde
3434+el código fuente, basta seguir los siguientes pasos:
3535+3636+.. code-block:: console
3737+3838+ $ wget https://nodejs.org/dist/v6.9.1/node-v6.9.1.tar.gz
3939+ $ tar xvzf node-v6.9.1.tar.gz
4040+ $ cd node-v6.9.1
4141+ $ ./configure
4242+ $ make
4343+ $ sudo make install
4444+4545+4646+Instalar virtualenv
4747+--------------------
4848+4949+Para instalar las dependencias de Python, se recomienda usan un entorno virtual en vez de instalarlas
5050+directamente en el sistema. Para crear el entorno virtual y facilitar la gestión de este, se recomienda
5151+instalar y configurar ``virtualenvwrapper``.
5252+5353+.. code-block:: console
5454+5555+ $ sudo pip install virtualenv virtualenvwrapper
5656+5757+Hay que añadir lo siguiente al fichero ``.bashrc`` del usuario que se vaya a usar para instalar el proyecto, **no**
5858+en el de root.
5959+6060+.. code-block:: bash
6161+6262+ export WORKON_HOME=$HOME/.virtualenvs
6363+ source /usr/bin/virtualenvwrapper.sh
6464+6565+Para que los cambios tengan efecto, recargamos el fichero ``.bashrc``:
6666+6767+.. code-block:: console
6868+6969+ $ source ~/.bashrc
7070+7171+Instalar proyecto
7272+-----------------
7373+7474+Para instalar el proyecto, primero creamos su entorno virtual:
7575+7676+.. code-block:: console
7777+7878+ $ mkvirtualenv --python=/usr/local/bin/python3 carshare
7979+8080+Luego, clonamos el código fuente del proyecto:
8181+8282+.. code-block:: console
8383+8484+ (carshare) $ git clone git@git.upv.es:GIT_CARSHARE/carshare-project.git
8585+ (carshare) $ cd carshare-project
8686+8787+Luego, instalamos las dependencias de Python:
8888+8989+.. code-block:: console
9090+9191+ (carshare) $ pip install -r requirements/production.txt
9292+9393+Y por último, las dependencias de Javascript:
9494+9595+.. code-block:: console
9696+9797+ (carshare) $ npm install
9898+9999+100100+Configuración del proyecto
101101+--------------------------
102102+103103+La configuración del proyecto se realiza mediante el uso de variables de entorno. Se pueden declarar en
104104+varios lugares, pero se recomienda crear el fichero ``.env`` en la carpeta raíz del código fuente.
105105+106106+.. code-block:: bash
107107+108108+ # Poli Car project environment variables
109109+ # ------------------------------------------------------------------------------
110110+111111+ ORACLE_SID=ZETATEST
112112+113113+ DJANGO_SETTINGS_MODULE=config.settings.production
114114+ DJANGO_ALLOWED_HOSTS=carsdes.cc.upv.es
115115+ DJANGO_SECRET_KEY=someseed
116116+ DATABASE_URL=oraclegis://{username}:{password}@{host}:{port}/{database}
117117+ DJANGO_DEBUG=False
118118+119119+ UPV_LOGIN_DATA_USERNAME=carshare
120120+ UPV_LOGIN_DATA_PASSWORD=SW2017-03:dLogin<b
121121+122122+.. glossary::
123123+124124+ ORACLE_SID
125125+ Valor del SID de la base de datos de Oracle.
126126+127127+ DJANGO_SETTINGS_MODULE
128128+ Ruta del módulo de settings que usará el proyecto. Para producción debe de estar siempre
129129+ establecido ``config.settings.production`` como valor.
130130+131131+ DJANGO_ALLOWED_HOSTS
132132+ Dominio desde el que se permitirán las peticiones. Si se intenta acceder con otro nombre, la
133133+ aplicación responderá con un error 400.
134134+135135+ DJANGO_SECRET_KEY
136136+ Semilla que se usa para guardar de forma segura las contraseñas en la base de datos.
137137+138138+ DATABASE_URL
139139+ Credenciales y ruta para acceder a la base de datos. Siempre será de la siguiente forma:
140140+ ``oraclegis://{username}:{password}@{host}:{port}/{database}``, donde ``{username}`` es el nombre de
141141+ usuario de base de datos, ``{password}`` es la contraseña de ese usuario, ``{host}`` es la ruta del servidor,
142142+ ``{port}`` es el puerto y ``{database}`` es el nombre de la base de datos.
143143+144144+ DJANGO_DEBUG
145145+ Activa o desactiva el modo de depuración de la aplicación. Se usa ``True`` para activar y ``False`` para
146146+ desactivar.
147147+148148+ UPV_LOGIN_DATA_USERNAME
149149+ Nombre de usuario para acceder al servicio de login de la UPV.
150150+151151+ UPV_LOGIN_DATA_PASSWORD
152152+ Contraseña para acceder al servicio de login de la UPV.
153153+154154+155155+Actualización del proyecto
156156+--------------------------
157157+158158+Tanto si se han hecho **cambios en el código fuente**, como si se trata de la primera vez que se instala, hay una
159159+serie de pasos que se tienen que ejecutar para asegurarse de que los cambios tienen efecto, siempre asumiendo que se
160160+está en la raíz del código fuente.
161161+162162+Activar el entorno virtual:
163163+164164+.. code-block:: console
165165+166166+ $ workon carshare
167167+168168+Aplicar las migraciones de la base de datos:
169169+170170+.. code-block:: console
171171+172172+ (carshare) $ ./manage.py migrate
173173+174174+Compilar los ficheros estáticos:
175175+176176+.. code-block:: console
177177+178178+ (carshare) $ npm run build
179179+180180+Recopilar los ficheros estáticos:
181181+182182+.. code-block:: console
183183+184184+ (carshare) $ ./manage.py collectstatic
185185+186186+187187+uWSGI
188188+-----
189189+190190+Poli Car sigue el `PEP 333 <https://www.python.org/dev/peps/pep-0333/>`_ para aplicaciones web hechas con Python,
191191+por lo que cualquier servidor de aplicaciones WSGI sería compatible con la aplicación.
192192+193193+Sin embargo, se recomienda el uso de ``uWSGI`` como servidor de aplicaciones WSGI, que es el que se instala junto al
194194+resto de dependencias. Para configurarlo, hay que crear un fichero ``uwsgi.ini``, con el siguiente contenido,
195195+cambiando las rutas de los ficheros si fuera necesario:
196196+197197+198198+.. code-block:: ini
199199+200200+ [uwsgi]
201201+ chdir = /home/carshare/carshare-project/upvcarshare
202202+ module = config.wsgi
203203+ home = /home/carshare/.virtualenvs/carshare
204204+ env = DJANGO_SETTINGS_MODULE=config.settings.production
205205+ master = true
206206+ processes = 5
207207+ socket = /home/carshare/carshare.sock
208208+ chmod-socket = 666
209209+ vacuum = true
210210+ stats = /home/carshare/carshare_stats.sock
211211+212212+213213+.. note::
214214+215215+ Asegúrate que el usuario que vaya a ejecutar nginx pueda acceder al fichero ``carshare.sock``.
216216+217217+Supervisor
218218+----------
219219+220220+Para que la gestión del proceso de uWSGI sea más sencilla, se recomienda usar ``supervisord``, que se instala
221221+con las dependencias de yum. Para ello, hay que crear el fichero ``/etc/supervisord.d/carshare.ini``
222222+con los siguientes datos:
223223+224224+.. code-block:: ini
225225+226226+ [program:carshare]
227227+ user = carshare
228228+ command = /home/carshare/.virtualenvs/carshare/bin/uwsgi --ini /home/carshare/uwsgi.ini
229229+ environment = PATH="/home/carshare/.virtualenvs/carshare/bin"
230230+ topsignal = HUP
231231+ stderr_logfile = /var/log/carshare/carshare.log
232232+ stderr_logfile_maxbytes = 50MB
233233+ stderr_logfile_backups = 10
234234+ loglevel = info
235235+236236+Para cargar la nueva configuración hay que reiniciar el servicio:
237237+238238+.. code-block:: bash
239239+240240+ $ sudo systemctl restart supervisord
241241+242242+Y para reiniciar el servidor, cuando se requiera que se apliquen nuevos cambios:
243243+244244+.. code-block:: bash
245245+246246+ $ sudo supervisorctl restart carshare
247247+248248+Nginx
249249+-----
250250+251251+Se recomienda utilizar **Nginx** como proxy sobre **uWSGI**, y además, para servir los estáticos
252252+directamente
253253+254254+Para configurarlo, crea el siguiente fichero ``/etc/nginx/conf.d/carshare.conf``, cambiando las rutas que
255255+sean necesarias:
256256+257257+.. code-block:: nginx
258258+259259+ upstream carshare_app {
260260+ server unix:///home/carshare/carshare.sock;
261261+ }
262262+263263+ server {
264264+ listen 80;
265265+ client_max_body_size 0;
266266+ charset utf-8;
267267+268268+ location /media {
269269+ alias /home/carshare/carshare-project/upvcarshare/media;
270270+ }
271271+272272+ location /static {
273273+ alias /home/carshare/carshare-project/upvcarshare/public;
274274+ }
275275+276276+ location / {
277277+ uwsgi_pass carshare_app;
278278+ uwsgi_read_timeout 600;
279279+ uwsgi_param QUERY_STRING $query_string;
280280+ uwsgi_param REQUEST_METHOD $request_method;
281281+ uwsgi_param CONTENT_TYPE $content_type;
282282+ uwsgi_param CONTENT_LENGTH $content_length;
283283+ uwsgi_param REQUEST_URI $request_uri;
284284+ uwsgi_param PATH_INFO $document_uri;
285285+ uwsgi_param DOCUMENT_ROOT $document_root;
286286+ uwsgi_param SERVER_PROTOCOL $server_protocol;
287287+ uwsgi_param REMOTE_ADDR $remote_addr;
288288+ uwsgi_param REMOTE_PORT $remote_port;
289289+ uwsgi_param SERVER_ADDR $server_addr;
290290+ uwsgi_param SERVER_PORT $server_port;
291291+ uwsgi_param SERVER_NAME $server_name;
292292+ uwsgi_param UWSGI_SCHEME http;
293293+ }
294294+ }
+4-2
docs/index.rst
···33 You can adapt this file completely to your liking, but it should at least
44 contain the root `toctree` directive.
5566-Documentación de UPV Car Share Project
77-======================================
66+Documentación de Poli Car
77+=========================
8899Content:
10101111.. toctree::
1212 :maxdepth: 2
13131414+ install
1515+ deploy
14161517Indices and tables
1618==================
+72-115
docs/install.rst
···11-Installation on CentOS
22-======================
33-44-Instructions to install the project on a CentOS 7.2 server.
55-66-Install yum dependencies
77-------------------------
88-99-.. code-block:: console
1010-1111- $ yum install libjpeg-devel zlib-devel gcc python-devel libcap-devel supervisor gdal gdal-devel yum-utils
1212-1313-Install Python 3
1414-----------------
1515-How to install Python 3 on CentOS from source:
1616-1717-.. code-block:: console
11+Instalación local
22+=================
1831919- $ sudo yum-builddep python
2020- $ wget https://www.python.org/ftp/python/3.5.2/Python-3.5.2.tgz
2121- $ tar xf Python-3.5.2.tgz
2222- $ cd Python-3.5.2
2323- $ ./configure
2424- $ make
2525- $ sudo make install
2626-2727-2828-Install Virtualenv
44+Spatialite (macOS)
295------------------
3063131-.. code-block:: console
77+Instalar Spatialite con brew en macOS::
3283333- $ sudo pip install virtualenv virtualenvwrapper
99+ brew update
1010+ brew install spatialite-tools
1111+ brew install gdal
34123535-Add the following text to ``.bashrc`` file:
1313+Cliente Oracle (macOS)
1414+----------------------
36153737-.. code-block:: bash
1616+Descargar desde `Oracle <http://www.oracle.com/technetwork/topics/intel-macsoft-096467.html>`_
38173939- export WORKON_HOME=$HOME/.virtualenvs
4040- source /usr/bin/virtualenvwrapper.sh
1818+- instantclient-basic-macos.x64-12.1.0.2.0.zip
1919+- instantclient-sdk-macos.x64-12.1.0.2.0.zip
41204242-Reload ``.bashrc``:
2121+Crear un directorio ``/usr/local/lib/oracle``::
43224444-.. code-block:: console
2323+ export ORACLE_HOME=/usr/local/lib/oracle
2424+ export VERSION=12.1.0.2.0
2525+ export ARCH=x86_64
45264646- $ source ~/.bashrc
2727+ mkdir -p $ORACLE_HOME
47284848-Install project
4949----------------
50295151-.. code-block:: console
3030+Descomprimir los dos ficheros y crear los enlaces simbólicos::
52315353- $ mkvirtualenv --python=/usr/local/bin/python3 carshare
5454- (carshare) $ git clone git@git.upv.es:GIT_CARSHARE/carshare-project.git
5555- (carshare) $ cd carshare-project
5656- (carshare) $ pip install -r requirements/production.txt
3232+ cd $ORACLE_HOME
3333+ tar -xzf instantclient-basic-12.1.0.2.0-macosx-x64.zip
3434+ tar -xzf instantclient-sdk-12.1.0.2.0-macosx-x64.zip
3535+ mv instantclient_12_1/* $ORACLE_HOME
3636+ rmdir instantclient_12_1
57373838+ cd /usr/local/lib/
3939+ ln -s $ORACLE_HOME/libclntsh.dylib.12.1 libclntsh.dylib.12.1
4040+ ln -s $ORACLE_HOME/libclntsh.dylib.12.1 libclntsh.dylib
4141+ ln -s $ORACLE_HOME/libocci.dylib.12.1 libocci.dylib.12.1
4242+ ln -s $ORACLE_HOME/libnnz12.dylib libnnz12.dylib
58435959-uWSGI
6060------
61446262-Create a ``uwsgi.ini`` file, with the following content:
4545+Instalar ``cx_Oracle`` desde PIP::
63466464-.. code-block:: ini
4747+ env ARCHFLAGS="-arch $ARCH" pip install cx-Oracle==5.2.1
65486666- [uwsgi]
6767- chdir = /home/carshare/carshare-project/upvcarshare
6868- module = config.wsgi
6969- home = /home/carshare/.virtualenvs/carshare
7070- env = DJANGO_SETTINGS_MODULE=config.settings.production
7171- master = true
7272- processes = 5
7373- socket = /home/carshare/carshare.sock
7474- chmod-socket = 666
7575- vacuum = true
7676- stats = /home/carshare/carshare_stats.sock
4949+Configuración del proyecto
5050+--------------------------
77515252+La configuración del proyecto se realiza mediante el uso de variables de entorno. Se pueden declarar en
5353+varios lugares, pero se recomienda crear el fichero ``.env`` en la carpeta raíz del código fuente.
78547979-Be sure that the nginx user **can access** the ``carshare.sock`` file.
5555+.. code-block:: bash
80568181-Supervisor
8282-----------
5757+ # Poli Car project environment variables
5858+ # ------------------------------------------------------------------------------
83598484-Create the following file ``/etc/supervisord.d/carshare.ini``, with the correct secret data:
6060+ ORACLE_SID=ZETATEST
85618686-.. code-block:: ini
6262+ DJANGO_SETTINGS_MODULE=config.settings.production
6363+ DJANGO_ALLOWED_HOSTS=carsdes.cc.upv.es
6464+ DJANGO_SECRET_KEY=someseed
6565+ DATABASE_URL=oraclegis://{username}:{password}@{host}:{port}/{database}
6666+ DJANGO_DEBUG=False
87678888- [program:carshare]
8989- user = carshare
9090- command = /home/carshare/.virtualenvs/carshare/bin/uwsgi --ini /home/carshare/uwsgi.ini
9191- environment = PATH="/home/carshare/.virtualenvs/carshare/bin",ORACLE_SID="ZETATEST",DJANGO_SETTINGS_MODULE="config.settings.production",DJANGO_ALLOWED_HOSTS="carsdes.cc.upv.es",DJANGO_SECRET_KEY="secret",DATABASE_URL="oraclegis://username:password@server:port/name"
9292- topsignal = HUP
9393- stderr_logfile = /var/log/carshare/carshare.log
9494- stderr_logfile_maxbytes = 50MB
9595- stderr_logfile_backups = 10
9696- loglevel = info
6868+ UPV_LOGIN_DATA_USERNAME=carshare
6969+ UPV_LOGIN_DATA_PASSWORD=SW2017-03:dLogin<b
97709898-To load the new configuration file, restart supervisor service:
7171+.. glossary::
9972100100-.. code-block:: bash
7373+ ORACLE_SID
7474+ Valor del SID de la base de datos de Oracle.
10175102102- $ sudo systemctl restart supervisord
7676+ DJANGO_SETTINGS_MODULE
7777+ Ruta del módulo de settings que usará el proyecto. Para producción debe de estar siempre
7878+ establecido ``config.settings.production`` como valor.
10379104104-To restart the process:
8080+ DJANGO_ALLOWED_HOSTS
8181+ Dominio desde el que se permitirán las peticiones. Si se intenta acceder con otro nombre, la
8282+ aplicación responderá con un error 400.
10583106106-.. code-block:: bash
8484+ DJANGO_SECRET_KEY
8585+ Semilla que se usa para guardar de forma segura las contraseñas en la base de datos.
10786108108- $ sudo supervisorctl restart carshare
8787+ DATABASE_URL
8888+ Credenciales y ruta para acceder a la base de datos. Siempre será de la siguiente forma:
8989+ ``oraclegis://{username}:{password}@{host}:{port}/{database}``, donde ``{username}`` es el nombre de
9090+ usuario de base de datos, ``{password}`` es la contraseña de ese usuario, ``{host}`` es la ruta del servidor,
9191+ ``{port}`` es el puerto y ``{database}`` es el nombre de la base de datos.
10992110110-Nginx
111111------
9393+ DJANGO_DEBUG
9494+ Activa o desactiva el modo de depuración de la aplicación. Se usa ``True`` para activar y ``False`` para
9595+ desactivar.
11296113113-Create the following file ``/etc/nginx/conf.d/carshare.conf``:
9797+ UPV_LOGIN_DATA_USERNAME
9898+ Nombre de usuario para acceder al servicio de login de la UPV.
11499115115-.. code-block:: nginx
100100+ UPV_LOGIN_DATA_PASSWORD
101101+ Contraseña para acceder al servicio de login de la UPV.
116102117117- upstream carshare_app {
118118- server unix:///home/carshare/carshare.sock;
119119- }
103103+Ejecutar tests
104104+--------------
120105121121- server {
122122- listen 80;
123123- client_max_body_size 0;
124124- charset utf-8;
125125-126126- location /media {
127127- alias /home/carshare/carshare-project/upvcarshare/media;
128128- }
106106+Para ejecutar los test usando Docker::
129107130130- location /static {
131131- alias /home/carshare/carshare-project/upvcarshare/public;
132132- }
108108+ $ docker-compose -f dev.yml run app python3 manage.py test --settings=config.settings.test
133109134134- location / {
135135- uwsgi_pass carshare_app;
136136- uwsgi_read_timeout 600;
137137- uwsgi_param QUERY_STRING $query_string;
138138- uwsgi_param REQUEST_METHOD $request_method;
139139- uwsgi_param CONTENT_TYPE $content_type;
140140- uwsgi_param CONTENT_LENGTH $content_length;
141141- uwsgi_param REQUEST_URI $request_uri;
142142- uwsgi_param PATH_INFO $document_uri;
143143- uwsgi_param DOCUMENT_ROOT $document_root;
144144- uwsgi_param SERVER_PROTOCOL $server_protocol;
145145- uwsgi_param REMOTE_ADDR $remote_addr;
146146- uwsgi_param REMOTE_PORT $remote_port;
147147- uwsgi_param SERVER_ADDR $server_addr;
148148- uwsgi_param SERVER_PORT $server_port;
149149- uwsgi_param SERVER_NAME $server_name;
150150- uwsgi_param UWSGI_SCHEME http;
151151- }
152152- }