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

View File

@@ -1,9 +1,4 @@
FROM php:5.6-apache
# before building
# run npm install
# run node_modules/.bin/bower install
# run node_modules/.bin/gulp
FROM debian:jessie
ENV DB_DRIVER=mysql \
ENV=production \
@@ -11,43 +6,47 @@ ENV DB_DRIVER=mysql \
DB_HOST= \
DB_USERNAME= \
DB_PASSWORD=
COPY . /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 && \
tar xzf /tmp/nodejs.tar.gz -C /tmp && export PATH=/tmp/node-v0.10.35-linux-x64/bin:$PATH && \
# Using nodesource and debian jessie packages instead of compiling from scratch
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 && \
rm -rf /tmp/* node_modules/
# ensure the assets have been compiled
rm -rf /tmp/* node_modules/ && \
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 && \
echo "Run 'gulp' before building container" >&2 && exit 1 || : ; done
RUN apt-get update && \
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
# 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' :)
RUN sed -i "s/'key' => '\w.*/'key' => 'f20d3e5ae02125a94bd60203a4edfbde',/" 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
# TODO this is pretty brittle and may break if php:5.4-apache changes
RUN sed -i 's/^DocumentRoot .*/DocumentRoot \/var\/www\/html\/public/' /etc/apache2/apache2.conf && \
grep /var/www/html/public /etc/apache2/apache2.conf
# public/.htaccess needs to use rewrite to let laravel do its thang
RUN a2enmod rewrite
# copy the various nginx and supervisor conf (to handle both fpm and nginx)
RUN sed -i -e "s/;daemonize\s*=\s*yes/daemonize = no/g" /etc/php5/fpm/php-fpm.conf ;\
echo "daemon off;" >> /etc/nginx/nginx.conf ;\
ln -sf /var/www/html/php-fpm-pool.conf /etc/php5/fpm/pool.d/www.conf ;\
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
# install dependencies. Note: PDO and XML are already in this base image
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
RUN curl -sS https://getcomposer.org/installer | php && php composer.phar install --no-dev -o
COPY supervisord.conf /etc/supervisor/conf.d/supervisord.conf
EXPOSE 8000
CMD ["/usr/bin/supervisord"]

View File

@@ -1,5 +1,6 @@
# 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)
[![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)
@@ -53,14 +54,15 @@ Run a DB container (you can either pass in environment variables for the DB, or
```bash
$ export DB_USERNAME=cachet
$ export DB_PASSWORD=cachet
$ export DB_ROOT_PASSWORD=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:
```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:
@@ -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!
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
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).

View File

@@ -154,6 +154,6 @@ return [
'json' => new Dingo\Api\Http\ResponseFormat\JsonResponseFormat(),
]
],
];

View File

@@ -93,7 +93,7 @@ Route::group(['before' => 'auth', 'prefix' => 'dashboard', 'namespace' => 'Cache
Route::group(['before' => 'admin'], function () {
Route::get('add', [
'as' => 'dashboard.team.add',
'uses' => 'DashTeamController@showAddTeamMemberView'
'uses' => 'DashTeamController@showAddTeamMemberView',
]);
Route::get('{user}', 'DashTeamController@showTeamMemberView');
Route::post('add', 'DashTeamController@postAddUser');

30
nginx-site.conf Normal file
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
php-fpm-pool.conf Normal file
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

View File

@@ -2,6 +2,7 @@
namespace CachetHQ\Cachet\Http\Controllers\Api;
use CachetHQ\Cachet\Models\Tag;
use CachetHQ\Cachet\Repositories\Component\ComponentRepository;
use Dingo\Api\Routing\ControllerTrait;
use GrahamCampbell\Binput\Facades\Binput;
@@ -71,7 +72,26 @@ class ComponentController extends Controller
*/
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;
}
/**

View File

@@ -3,6 +3,7 @@
namespace CachetHQ\Cachet\Http\Controllers\Api;
use CachetHQ\Cachet\Repositories\Incident\IncidentRepository;
use CachetHQ\Cachet\Transformers\IncidentTransformer;
use Dingo\Api\Routing\ControllerTrait;
use GrahamCampbell\Binput\Facades\Binput;
use Illuminate\Routing\Controller;
@@ -37,7 +38,9 @@ class IncidentController extends Controller
*/
public function getIncidents()
{
return $this->incident->all();
$incidents = $this->incident->paginate(Binput::get('per_page', 20));
return $this->response->paginator($incidents, new IncidentTransformer());
}
/**

View File

@@ -87,7 +87,7 @@ class DashUserController extends Controller
public function regenerateApiKey(User $user)
{
segment_track('User Management', [
'event' => 'regenrated_api_token'
'event' => 'regenrated_api_token',
]);
$user->api_key = User::generateApiKey();

View File

@@ -88,7 +88,7 @@ class SetupController extends Controller
'settings.show_support' => 'boolean',
'user.username' => 'alpha_num|required',
'user.email' => 'email|required',
'user.password' => 'required'
'user.password' => 'required',
]);
if ($v->passes()) {

View File

@@ -34,7 +34,7 @@ class Component extends Model implements TransformableInterface
protected $rules = [
'user_id' => 'integer|required',
'name' => 'required',
'status' => 'integer',
'status' => 'integer|required',
'link' => 'url',
];

View File

@@ -17,6 +17,18 @@ abstract class EloquentRepository
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.
*

View File

@@ -11,6 +11,15 @@ interface IncidentRepository
*/
public function all();
/**
* Returns paginated result.
*
* @param int $perPage
*
* @return \Illuminate\Pagination\Paginator
*/
public function paginate($perPage = 20);
/**
* Create a new model.
*

25
supervisord.conf Normal file
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