Hecho en:
Laravel 4.2
Servidor de desarrollo: Droplet DigitalOcean
Características del server: 1 CPU, 1 Gb RAM, 30 Gb SSD
OS: Debian 8.2 (Jessie/Stable)
Servidor web: nginx
Ubicación: New York - US
Para ejecutar el proyecto en un servidor nginx en Ubuntu GNU/Linux 14.04 o Debian Jessie 8.2 x64. Seguir las siguientes instrucciones:
Necesitaremos correr las actualizaciones en nuestro sistemas operativo; además instalar nginx y sus respectivas librerías en PHP 5
sudo apt-get update
sudo apt-get install nginx php5-fpm php5-cli php5-mcrypt git
Lo primera que necesitamos es abrir el archivo de configuración principal de PHP (php.ini
),
para el procesador PHP-fpm
que utiliza nginx
. Abrir el archivo con permisos de adiministrador con un editor de texto
sudo nano /etc/php5/fpm/php.ini
Una vez abierto el archivo, modifique la línea con el parámetro:
cgi.fix_pathinfo
(posiblemente está comentado o con un valor de 1) y la cambias a cero
cgi.fix_pathinfo=0
Esto le indica a PHP que no intente ejecutar scripts con nombres similares si el archivo que busca no es encontrado. Una vez finalizado, guardar y cerrar el archivo.
La última pieza de la administración de PHP a modificar es activar la extension mcrypt
de la cual Laravel
depende.
sudo php5enmod mcrypt
Ahora reiniciamos el servicio php5-fpm para que se implementen los cambios realizados
sudo service php5-fpm restart
Crearemos un directorio para alojar nuestro proyecto, para eso necesitamos hacerlo con permisos de administrador, en este caso será:
sudo mkdir -p /var/www/mooc_ucc
Ahora que tenemos una ubicación para los componentes de laravel, podemos mover y editar un servidor nginx, para eso abrimos el archivo de configuración por defecto con permisos de administrador:
sudo nano /etc/nginx/sites-available/default
Dentro del archivo agregamos nuestra configuración del servidor
server {
listen 80;
listen [::]:80 default_server ipv6only=on;
root /var/www/mooc_ucc/public;
index index.php index.html index.htm;
server_name 127.0.0.1;
ssl_certificate /etc/nginx/ssl/nginx.crt;
ssl_certificate_key /etc/nginx/ssl/nginx.key;
location / {
try_files $uri $uri/ /index.php?$query_string;
}
location ~ \.php$ {
try_files $uri /index.php =404;
fastcgi_split_path_info ^(.+\.php)(/.+)$;
fastcgi_pass unix:/var/run/php5-fpm.sock;
fastcgi_index index.php;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
include fastcgi_params;
}
}
Guardar y cerrar el archivo cuando hayas finalizado. Después para que el servidor nginx lea los cambios, lo reiniciamos ejecutando la siguiente línea:
sudo service nginx restart
Ahora, descomprimimos el archivo ``.zipdel proyecto, por ejemplo
mooc_ucc.zip` y copiamos la carpeta del proyecto a `/var/www`
sudo cp -R mooc_ucc /var/www
Ahora nuestros archivos quedan en el directorio /var/www/mooc_ucc
pero quedan con cuenta de administrador (grupo root), por lo cual vamos a cambiarlos a otro (grupo web):
sudo chown -R :www-data /var/www/mooc_ucc
Nuestro siguiente paso es cambiar los permisos de /var/www/mooc_ucc/app/storage
los cuáles necesitan tener permisos de escritura para que la aplicación funcione
sudo chmod -R 775 /var/www/mooc_ucc/app/storage
EL último paso es reiniciar nuestro servidor nginx
sudo service nginx restart
Una vez hecho esto podremos ingresar a localhost y nos debería permitir ver nuestra página index
Si por algún motivo obtenemos un error referente a "couldn't find driver", debemos instalar y habilitar la extensión de postgresql
en PHP
sudo apt-get install php5-pgsql
Si luego de instalar el módulo aún nos sale el error, debemos activarlo manualmente, así que accedemos a /etc/php/php.ini
y descomentamos la línea:
;extension=pgsql.so
y
;extension=pdo_pgsql.so
(en el caso de archlinux
)
NOTA: Para descomentar basta con eliminar el ;
inicial.
La carpeta mooc_ucc
es la raíz del proyecto, así que basta con abrir con el editor de texto favorito (por ejemplo atom o sublime text) la carpeta.
Árbol del proyecto
├── app
├── artisan
├── bootstrap
├── composer.json
├── composer.json~
├── composer.lock
├── CONTRIBUTING.md
├── phpunit.xml
├── Procfile
├── public
├── README.md
├── server.php
└── vendor
En la carpeta app
podremos encontrar los archivos y código fuente del MOOC (modelos, vistas y controladores).
El archivo composer.json
contiene los paquetes, dependencias y librerías utilizadas en éste proyecto.
En la carpeta public
se encontrarán los assets como archivos css
, javascript
, imágenes entre otros archivos estáticos.
Ahora bien, si miramos la estructura de nuestra carpeta app
:
├── commands
├── config
├── controllers
├── database
├── filters.php
├── lang
├── library
├── models
├── routes.php
├── start
├── storage
├── tests
└── views
Podremos observar nuestras tres carpetas principales: models
(modelos/clases), controllers
(controladores) y views
(vistas).
Dentro de la carpeta models
se pueden ver todas las clases/modelos de nuestra aplicación. Se puede apreciar que todas las clases poseen la extensión php
.
En la carpeta controllers
se pueden apreciar los controladores de la aplicación, los cuáles también son clases y conectan a los modelos con las vistas.
Por último, la carpeta views
contiene nuestras vistas, los cuáles son archivos también de extensión .php
y que contienen código HTML5/PHP y son las responsables de la parte visual del MOOC. Están ubicadas dentro de carpetas con el mismo nombre de las clases y cada modelo tiene diferentes vistas, por ejemplo, un curso tiene vista lista, view y form, las cuáles son la vista general, específica y formulario/creación respectivamente.
El archivo index.blade.php
contiene el código del front-end de la vista index (o vista principal) del MOOC.
En el archivo routes.php
encontraremos las rutas de las vistas con sus correspondientes verbos HTTP
: GET
, POST
, etc.
Para el correcto funcionamiento del chat se debe correr un servicio por medio de artisan
el cuál está basado en ember.js y que además, debe estar corriendo siempre en el servidor, de lo contrario la funcionalidad del chat sería interrumpida. Para lograr esto debemos utilizar un paquete o librería que nos permita correr el servicio perpetuamente y que se inicie aún cuando el servidor sea reiniciado también. Para ello utilizaremos el paquete supervisor para Debian Jessie
El comando es:
php artisan chat:serve
Procedemos con la instalación de supervisor:
sudo apt-get install supervisor
Ahora creamos un archivo de configuración para el supervisord
sudo nano /etc/supervisor/conf.d/laravel_queue.conf
Y agregamos la siguiente configuración:
command=/usr/local/bin/run_queue.sh
autostart=true
autorestart=true
stderr_logfile=/var/log/laraqueue.err.log
stdout_logfile=/var/log/laraqueue.out.log
Damos permisos de ejecución:
sudo chmod +x /etc/supervisor/conf.d/laravel_queue.conf
Ahora creamos el archivo run_queue.sh
y lo editamos
sudo nano /usr/local/bin/run_queue.sh
Agregamos lo siguiente:
#!/bin/bash
php /home/dev/mooc_ucc/artisan chat:serve
El anterior archivo abre una terminar en bash y ejecuta mediante php el comando mencionado anteriormente para la ejecución del servicio del chat en la aplicación del MOOC.
Instruciones tomadas de Github-Gist
Iniciamos el servicio de supervisor con:
sudo service supervisord start
Ahora le decimos a supervisor que lea el archivo de configuración que agregamos:
sudo supervisorctl reread
Ahora le decimos que actualice:
sudo supervisorctl update
Lo siguiente es agregar un script para permitir el inicio automático de supervisord y sus servicios cuando se reinicie el SO.
sudo nano /etc/init.d/supervisor
Y agregamos la información incluída en el siguiente gist:
Guardamos y damos permisos de ejecución al script:
sudo chmod +x /etc/init.d/supervisord
Para programar el daemon:
sudo update-rc.d supervisord defaults
Por último detenemos e iniciamos el servicio nuevamente:
service supervisord stop
service supervisord start
Si por algún motivo el chat no inicia tras reiniciar el SO, verificar las instrucciones adicionales en el enlace de referencia:
Instruciones tomadas de Server Fault
Con esto ya tendremos corriendo siempre el servicio del chat.
/api/cursos
GET
/api/curso/{id}
GET
/api/cursos?texto-buscar
GET
/api/usuarios
GET
/api/usuario/id/{id}
GET
/api/tematicas
GET
/api/tematica/{id}
GET
/api/desuscribir/{idusuario}/curso/{idcurso}
GET
/api/agregar-ciudad/{nombre}
GET
/api/agregar-pais/{nombre}
GET
/api/agregar-universidad/{nombre}
GET
/api/listar-ciudades
GET
/api/listar-paises
GET
/api/listar-universidades
GET
/api/temarios
GET
/api/temarios?id_curso=6
GET
/api/temarios?id_curso={course_id}&tipo_contenido={content_type}
GET
/api/usuario/social/{id_social}
GET
/api/pais/{country_id}
GET
/api/ciudad/{city_id}
GET
/api/universidad/{university_id}
GET
/api/universidad/{university_id}
GET
/api/curso_usuario/{user_id}
GET
/api/assign-course?user_id={user_id}&course_id={course_id}
POST
/api/classes?course_id={course_id}
GET
/api/class/{class_id}
GET
/api/classes?course_id={course_id}&week_id={week_id}
GET
/api/tests?course_id={course_id}&week_id={week_id}
GET
/api/tests?course_id={course_id}
GET
/api/test/{test_id}
GET