Merge branch 'master' of github.com:cachethq/cachet

This commit is contained in:
James Brooks
2015-02-20 08:24:54 +00:00
14 changed files with 170 additions and 42 deletions
+32 -33
View File
@@ -1,9 +1,4 @@
FROM php:5.6-apache FROM debian:jessie
# before building
# run npm install
# run node_modules/.bin/bower install
# run node_modules/.bin/gulp
ENV DB_DRIVER=mysql \ ENV DB_DRIVER=mysql \
ENV=production \ ENV=production \
@@ -11,43 +6,47 @@ ENV DB_DRIVER=mysql \
DB_HOST= \ DB_HOST= \
DB_USERNAME= \ DB_USERNAME= \
DB_PASSWORD= DB_PASSWORD=
COPY . /var/www/html/ COPY . /var/www/html/
WORKDIR /var/www/html/ WORKDIR /var/www/html/
RUN curl http://nodejs.org/dist/v0.10.35/node-v0.10.35-linux-x64.tar.gz -o /tmp/nodejs.tar.gz && \ # Using nodesource and debian jessie packages instead of compiling from scratch
tar xzf /tmp/nodejs.tar.gz -C /tmp && export PATH=/tmp/node-v0.10.35-linux-x64/bin:$PATH && \ RUN DEBIAN_FRONTEND=noninteractive \
echo "APT::Install-Recommends \"0\";" >> /etc/apt/apt.conf.d/02recommends && \
echo "APT::Install-Suggests \"0\";" >> /etc/apt/apt.conf.d/02recommends && \
apt-get -qq update && \
apt-get -qq install ca-certificates apt-transport-https && \
apt-key adv --keyserver keyserver.ubuntu.com --recv-keys 68576280 && \
echo 'deb https://deb.nodesource.com/node jessie main' > /etc/apt/sources.list.d/nodesource.list && \
apt-get -qq update && \
apt-get -qq install \
nginx php5-fpm=5.* php5-curl php5-readline php5-mcrypt php5-mysql php5-apcu php5-cli \
git sqlite libsqlite3-dev nodejs curl supervisor && \
npm install && node_modules/.bin/bower install --allow-root && node_modules/.bin/gulp && \ npm install && node_modules/.bin/bower install --allow-root && node_modules/.bin/gulp && \
rm -rf /tmp/* node_modules/ rm -rf /tmp/* node_modules/ && \
# ensure the assets have been compiled apt-get clean && \
rm -r /var/lib/apt/lists/* && \
chown -R www-data /var/www/html
# Ensure the assets have been compiled
RUN for d in public/{build,css,js} ; do test ! -d public/build && \ RUN for d in public/{build,css,js} ; do test ! -d public/build && \
echo "Run 'gulp' before building container" >&2 && exit 1 || : ; done echo "Run 'gulp' before building container" >&2 && exit 1 || : ; done
RUN apt-get update && \ # Hardcode the Illuminate key in app/config/app.php. If you want security, feel free
apt-get install -y curl libmcrypt-dev zlib1g-dev libxml2-dev \
git sqlite libsqlite3-dev --no-install-recommends && \
rm -r /var/lib/apt/lists/*
# hardcode the Illuminate key in app/config/app.php. If you want security, feel free
# to override the key in your own container with a 'php artisan key:generate' :) # to override the key in your own container with a 'php artisan key:generate' :)
RUN sed -i "s/'key' => '\w.*/'key' => 'f20d3e5ae02125a94bd60203a4edfbde',/" app/config/app.php && \ RUN sed -i "s/'key' => '\w.*/'key' => 'f20d3e5ae02125a94bd60203a4edfbde',/" app/config/app.php && \
grep key app/config/app.php grep key app/config/app.php
# Override the apache.conf in php:5.4-apache to point to the proper DocumentRoot # copy the various nginx and supervisor conf (to handle both fpm and nginx)
# TODO this is pretty brittle and may break if php:5.4-apache changes RUN sed -i -e "s/;daemonize\s*=\s*yes/daemonize = no/g" /etc/php5/fpm/php-fpm.conf ;\
RUN sed -i 's/^DocumentRoot .*/DocumentRoot \/var\/www\/html\/public/' /etc/apache2/apache2.conf && \ echo "daemon off;" >> /etc/nginx/nginx.conf ;\
grep /var/www/html/public /etc/apache2/apache2.conf ln -sf /var/www/html/php-fpm-pool.conf /etc/php5/fpm/pool.d/www.conf ;\
# public/.htaccess needs to use rewrite to let laravel do its thang rm -f /etc/nginx/sites-enabled/* && rm -f /etc/nginx/conf.d/* && ln -sf /var/www/html/nginx-site.conf /etc/nginx/conf.d/default.conf
RUN a2enmod rewrite
# install dependencies. Note: PDO and XML are already in this base image RUN curl -sS https://getcomposer.org/installer | php && php composer.phar install --no-dev -o
RUN docker-php-ext-install zip && \
docker-php-ext-install mcrypt && \
docker-php-ext-install mbstring && \
docker-php-ext-install pdo_mysql
RUN curl http://pecl.php.net/get/apcu-4.0.7.tgz -o /usr/src/php/ext/apcu.tar.gz && \
tar xzvf /usr/src/php/ext/apcu.tar.gz -C /usr/src/php/ext && \
mv /usr/src/php/ext/apcu-4.0.7 /usr/src/php/ext/apcu && \
docker-php-ext-install apcu
RUN curl -sS https://getcomposer.org/installer | php
RUN php composer.phar install --no-dev -o
COPY supervisord.conf /etc/supervisor/conf.d/supervisord.conf
EXPOSE 8000
CMD ["/usr/bin/supervisord"]
+8 -2
View File
@@ -1,5 +1,6 @@
# Cachet [![Deploy](https://www.herokucdn.com/deploy/button.png)](https://heroku.com/deploy) # Cachet [![Deploy](https://www.herokucdn.com/deploy/button.png)](https://heroku.com/deploy)
[![StyleCI](https://styleci.io/repos/26730195/shield)](https://styleci.io/repos/26730195/)
[![Build Status](https://img.shields.io/travis/cachethq/Cachet.svg?style=flat-square)](https://travis-ci.org/cachethq/Cachet) [![Build Status](https://img.shields.io/travis/cachethq/Cachet.svg?style=flat-square)](https://travis-ci.org/cachethq/Cachet)
[![Quality Score](https://img.shields.io/scrutinizer/g/cachethq/Cachet.svg?style=flat-square)](https://scrutinizer-ci.com/g/cachethq/Cachet) [![Quality Score](https://img.shields.io/scrutinizer/g/cachethq/Cachet.svg?style=flat-square)](https://scrutinizer-ci.com/g/cachethq/Cachet)
[![Software License](https://img.shields.io/badge/license-MIT-brightgreen.svg?style=flat-square)](LICENSE) [![Software License](https://img.shields.io/badge/license-MIT-brightgreen.svg?style=flat-square)](LICENSE)
@@ -53,14 +54,15 @@ Run a DB container (you can either pass in environment variables for the DB, or
```bash ```bash
$ export DB_USERNAME=cachet $ export DB_USERNAME=cachet
$ export DB_PASSWORD=cachet $ export DB_PASSWORD=cachet
$ export DB_ROOT_PASSWORD=cachet
$ export DB_DATABASE=cachet $ export DB_DATABASE=cachet
$ docker run --name mysql -e MYSQL_USER=$DB_USERNAME -e MYSQL_PASSWORD=$DB_PASSWORD -e MYSQL_DATABASE=$DB_DATABASE -d mysql $ docker run --name mysql -e MYSQL_USER=$DB_USERNAME -e MYSQL_PASSWORD=$DB_PASSWORD -e MYSQL_ROOT_PASSWORD=$DB_ROOT_PASSWORD -e MYSQL_DATABASE=$DB_DATABASE -d mysql
``` ```
Initialize the DB if you havent yet: Initialize the DB if you havent yet:
```bash ```bash
$ docker run --link mysql:mysql -e DB_HOST=mysql -e DB_DATABASE=$DB_DATABASE -e DB_USERNAME=$DB_USERNAME -e DB_PASSWORD=$DB_PASSWORD cachethq/cachet:latest php artisan migrate $ docker run --link mysql:mysql -e DB_HOST=mysql -e DB_DATABASE=$DB_DATABASE -e DB_USERNAME=$DB_USERNAME -e DB_PASSWORD=$DB_PASSWORD cachethq/cachet:latest php artisan migrate --force
``` ```
Run Cachet: Run Cachet:
@@ -71,6 +73,10 @@ $ docker run -d --name cachet --link mysql:mysql -p 80:80 -e DB_HOST=mysql -e DB
Now go to `http://<ipdockerisboundto>/setup` and have fun! Now go to `http://<ipdockerisboundto>/setup` and have fun!
Note: When running in production you should ensure that you enable SSL.
This is commonly achieved by running Nginx with your certificates on your Docker host, service or load balancers infront of the running container, or by adding your custom SSL certificates and configuration to the supplied Nginx configuration.
## Translations ## Translations
A special thank you to our [translators](https://crowdin.com/project/cachet/activity_stream), who have allowed us to share Cachet with the world. If you'd like to contribute translations, please check out our [CrowdIn project](https://crowdin.com/project/cachet). A special thank you to our [translators](https://crowdin.com/project/cachet/activity_stream), who have allowed us to share Cachet with the world. If you'd like to contribute translations, please check out our [CrowdIn project](https://crowdin.com/project/cachet).
+1 -1
View File
@@ -154,6 +154,6 @@ return [
'json' => new Dingo\Api\Http\ResponseFormat\JsonResponseFormat(), 'json' => new Dingo\Api\Http\ResponseFormat\JsonResponseFormat(),
] ],
]; ];
+1 -1
View File
@@ -93,7 +93,7 @@ Route::group(['before' => 'auth', 'prefix' => 'dashboard', 'namespace' => 'Cache
Route::group(['before' => 'admin'], function () { Route::group(['before' => 'admin'], function () {
Route::get('add', [ Route::get('add', [
'as' => 'dashboard.team.add', 'as' => 'dashboard.team.add',
'uses' => 'DashTeamController@showAddTeamMemberView' 'uses' => 'DashTeamController@showAddTeamMemberView',
]); ]);
Route::get('{user}', 'DashTeamController@showTeamMemberView'); Route::get('{user}', 'DashTeamController@showTeamMemberView');
Route::post('add', 'DashTeamController@postAddUser'); Route::post('add', 'DashTeamController@postAddUser');
+30
View File
@@ -0,0 +1,30 @@
server {
listen 8000 default; ## Listen for ipv4; this line is default and implied
# Make site accessible from http://localhost/
server_name localhost;
root /var/www/html/public;
index index.html index.htm index.php;
charset utf-8;
location / {
try_files $uri $uri/ /index.php?$query_string;
}
# Pass the PHP scripts to FastCGI server listening on 127.0.0.1:9000
location ~ \.php$ {
fastcgi_split_path_info ^(.+\.php)(/.+)$;
include fastcgi_params;
fastcgi_pass 127.0.0.1:9000;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
fastcgi_index index.php;
fastcgi_keep_conn on;
}
location ~ /\.ht {
deny all;
}
}
+24
View File
@@ -0,0 +1,24 @@
[www]
user = www-data
group = www-data
listen = 127.0.0.1:9000
request_terminate_timeout = 120s
pm = dynamic
pm.max_children = 5
pm.start_servers = 2
pm.min_spare_servers = 1
pm.max_spare_servers = 3
chdir = /
env[DB_DRIVER] = $DB_DRIVER
env[DB_HOST] = $DB_HOST
env[DB_DATABASE] = $DB_DATABASE
env[DB_USERNAME] = $DB_USERNAME
env[DB_PASSWORD] = $DB_PASSWORD
[global]
daemonize = no
@@ -2,6 +2,7 @@
namespace CachetHQ\Cachet\Http\Controllers\Api; namespace CachetHQ\Cachet\Http\Controllers\Api;
use CachetHQ\Cachet\Models\Tag;
use CachetHQ\Cachet\Repositories\Component\ComponentRepository; use CachetHQ\Cachet\Repositories\Component\ComponentRepository;
use Dingo\Api\Routing\ControllerTrait; use Dingo\Api\Routing\ControllerTrait;
use GrahamCampbell\Binput\Facades\Binput; use GrahamCampbell\Binput\Facades\Binput;
@@ -71,7 +72,26 @@ class ComponentController extends Controller
*/ */
public function postComponents() public function postComponents()
{ {
return $this->component->create($this->auth->user()->id, Binput::all()); $component = $this->component->create(
$this->auth->user()->id,
Binput::except('tags')
);
if (Binput::has('tags')) {
// The component was added successfully, so now let's deal with the tags.
$tags = preg_split('/ ?, ?/', Binput::get('tags'));
// For every tag, do we need to create it?
$componentTags = array_map(function ($taggable) use ($component) {
return Tag::firstOrCreate([
'name' => $taggable,
])->id;
}, $tags);
$component->tags()->sync($componentTags);
}
return $component;
} }
/** /**
@@ -3,6 +3,7 @@
namespace CachetHQ\Cachet\Http\Controllers\Api; namespace CachetHQ\Cachet\Http\Controllers\Api;
use CachetHQ\Cachet\Repositories\Incident\IncidentRepository; use CachetHQ\Cachet\Repositories\Incident\IncidentRepository;
use CachetHQ\Cachet\Transformers\IncidentTransformer;
use Dingo\Api\Routing\ControllerTrait; use Dingo\Api\Routing\ControllerTrait;
use GrahamCampbell\Binput\Facades\Binput; use GrahamCampbell\Binput\Facades\Binput;
use Illuminate\Routing\Controller; use Illuminate\Routing\Controller;
@@ -37,7 +38,9 @@ class IncidentController extends Controller
*/ */
public function getIncidents() public function getIncidents()
{ {
return $this->incident->all(); $incidents = $this->incident->paginate(Binput::get('per_page', 20));
return $this->response->paginator($incidents, new IncidentTransformer());
} }
/** /**
+1 -1
View File
@@ -87,7 +87,7 @@ class DashUserController extends Controller
public function regenerateApiKey(User $user) public function regenerateApiKey(User $user)
{ {
segment_track('User Management', [ segment_track('User Management', [
'event' => 'regenrated_api_token' 'event' => 'regenrated_api_token',
]); ]);
$user->api_key = User::generateApiKey(); $user->api_key = User::generateApiKey();
+1 -1
View File
@@ -88,7 +88,7 @@ class SetupController extends Controller
'settings.show_support' => 'boolean', 'settings.show_support' => 'boolean',
'user.username' => 'alpha_num|required', 'user.username' => 'alpha_num|required',
'user.email' => 'email|required', 'user.email' => 'email|required',
'user.password' => 'required' 'user.password' => 'required',
]); ]);
if ($v->passes()) { if ($v->passes()) {
+1 -1
View File
@@ -34,7 +34,7 @@ class Component extends Model implements TransformableInterface
protected $rules = [ protected $rules = [
'user_id' => 'integer|required', 'user_id' => 'integer|required',
'name' => 'required', 'name' => 'required',
'status' => 'integer', 'status' => 'integer|required',
'link' => 'url', 'link' => 'url',
]; ];
+12
View File
@@ -17,6 +17,18 @@ abstract class EloquentRepository
return $this->model->all(); return $this->model->all();
} }
/**
* Returns paginated result.
*
* @param int $perPage
*
* @return \Illuminate\Pagination\Paginator
*/
public function paginate($perPage = 20)
{
return $this->model->paginate($perPage);
}
/** /**
* Returns an object with related relationships. * Returns an object with related relationships.
* *
@@ -11,6 +11,15 @@ interface IncidentRepository
*/ */
public function all(); public function all();
/**
* Returns paginated result.
*
* @param int $perPage
*
* @return \Illuminate\Pagination\Paginator
*/
public function paginate($perPage = 20);
/** /**
* Create a new model. * Create a new model.
* *
+25
View File
@@ -0,0 +1,25 @@
[unix_http_server]
file=/var/run/supervisor.sock ; (the path to the socket file)
[supervisord]
logfile=/dev/null ; (main log file;default $CWD/supervisord.log)
logfile_maxbytes=0 ; (max main logfile bytes b4 rotation;default 50MB)
logfile_backups=0 ; (num of main logfile rotation backups;default 10)
loglevel=info ; (log level;default info; others: debug,warn,trace)
pidfile=/tmp/supervisord.pid ; (supervisord pidfile;default supervisord.pid)
nodaemon=true ; (start in foreground if true;default false)
; the below section must remain in the config file for RPC
; (supervisorctl/web interface) to work, additional interfaces may be
; added by defining them in separate rpcinterface: sections
[rpcinterface:supervisor]
supervisor.rpcinterface_factory = supervisor.rpcinterface:make_main_rpcinterface
[supervisorctl]
serverurl=unix:///var/run/supervisor.sock ; use a unix:// URL for a unix socket
[program:php5-fpm]
command=/usr/sbin/php5-fpm -c /etc/php5/fpm
[program:nginx]
command=/usr/sbin/nginx