Code Monkey home page Code Monkey logo

laravel-server-monitor's Introduction

An easy to use powerful server monitor

Latest Version on Packagist run-tests Total Downloads

We all dream of servers that need no maintenance at all. But unfortunately in reality this is not the case. Disks can get full, processes can crash, the server can run out of memory...

This package keeps an eye on the health of all your servers. There are a few checks that come out of the box. Adding new checks is a breeze.

When something goes wrong it can notify you via Slack or mail.

Support us

We invest a lot of resources into creating best in class open source packages. You can support us by buying one of our paid products.

We highly appreciate you sending us a postcard from your hometown, mentioning which of our package(s) you are using. You'll find our address on our contact page. We publish all received postcards on our virtual postcard wall.

Documentation

The full documentation is available on our documentation site.

Installation

You can install this package via composer using this command:

composer require spatie/laravel-server-monitor

In Laravel 5.5 the service provider will automatically get registered. In older versions of the framework, you must install the service provider:

// config/app.php
'providers' => [
    ...
    Spatie\ServerMonitor\ServerMonitorServiceProvider::class,
];

You can publish the migrations with:

php artisan vendor:publish --provider="Spatie\ServerMonitor\ServerMonitorServiceProvider" --tag="migrations"

After the migration has been published you can create the hosts and checks tables by running the migrations:

php artisan migrate

You must publish the config-file with:

php artisan vendor:publish --provider="Spatie\ServerMonitor\ServerMonitorServiceProvider" --tag="config"

This is the contents of the published config file:

return [

    /*
     * These are the checks that can be performed on your servers. You can add your own
     * checks. The only requirement is that they should extend the
     * `Spatie\ServerMonitor\Checks\CheckDefinitions\CheckDefinition` class.
     */
    'checks' => [
        'diskspace' => Spatie\ServerMonitor\CheckDefinitions\Diskspace::class,
        'elasticsearch' => Spatie\ServerMonitor\CheckDefinitions\Elasticsearch::class,
        'memcached' => Spatie\ServerMonitor\CheckDefinitions\Memcached::class,
        'mysql' => Spatie\ServerMonitor\CheckDefinitions\MySql::class,
    ],

    /*
     * The performance of the package can be increased by allowing a high number
     * of concurrent ssh connections. Set this to a lower value if you're
     * getting weird errors running the check.
     */
    'concurrent_ssh_connections' => 5,

    /*
     * This string will be appended to the ssh command generated by the package.
     */
    'ssh_command_suffix' => '',

    'notifications' => [

        'notifications' => [
            Spatie\ServerMonitor\Notifications\Notifications\CheckSucceeded::class => [],
            Spatie\ServerMonitor\Notifications\Notifications\CheckRestored::class => ['slack'],
            Spatie\ServerMonitor\Notifications\Notifications\CheckWarning::class => ['slack'],
            Spatie\ServerMonitor\Notifications\Notifications\CheckFailed::class => ['slack'],
        ],

        /*
         * To avoid burying you in notifications, we'll only send one every given amount
         * of minutes when a check keeps emitting warning or keeps failing.
         */
        'throttle_failing_notifications_for_minutes' => 60,

        'mail' => [
            'to' => '[email protected]',
        ],

        'slack' => [
            'webhook_url' => env('SERVER_MONITOR_SLACK_WEBHOOK_URL'),
        ],

        /*
         * Here you can specify the notifiable to which the notifications should be sent. The default
         * notifiable will use the variables specified in this config file.
         */
        'notifiable' => \Spatie\ServerMonitor\Notifications\Notifiable::class,

        /*
         * The date format used in notifications.
         */
        'date_format' => 'd/m/Y',
    ],

    /*
     * To add or modify behaviour to the `Check` model you can specify your
     * own model here. The only requirement is that they should
     * extend the `Check` model provided by this package.
     */
    'check_model' => Spatie\ServerMonitor\Models\Check::class,

    /*
     * Right before running a check its process will be given to this class. Here you
     * can perform some last minute manipulations on it before it will
     * actually be run.
     *
     * This class should implement Spatie\ServerMonitor\Manipulators\Manipulator
     */
    'process_manipulator' => Spatie\ServerMonitor\Manipulators\Passthrough::class,
    
    /*
     * Thresholds for disk space's alert.
     */
    'diskspace_percentage_threshold' => [
        'warning' => 80,
        'fail' => 90,
    ],
];

Need a UI?

The package doesn't come with any screens out of the box. You may use the Nova package by @paras-malhotra for monitoring servers on Laravel Nova.

Changelog

Please see CHANGELOG for more information what has changed recently.

Testing

To run the tests you'll have to start the included node based dummy ssh server first in a separate terminal window.

cd tests/server
npm install
./start_server.sh

With the server running, you can start testing.

vendor/bin/phpunit

Contributing

Please see CONTRIBUTING for details.

Security

If you've found a bug regarding security please mail [email protected] instead of using the issue tracker.

Credits

The code to execute commands on a remote server was copied from Envoy.

License

The MIT License (MIT). Please see License File for more information.

laravel-server-monitor's People

Contributors

adrianmrn avatar akoepcke avatar alexbowers avatar alexvanderbist avatar ayoobmh avatar bbashy avatar big-shark avatar blueclock avatar daikazu avatar diegosouza avatar dieterholvoet avatar freekmurze avatar introwit avatar kapersoft avatar laravel-shift avatar m-bosch avatar m1guelpf avatar matt-croft avatar matthewtrask avatar mbabker avatar nielsvanpach avatar paras-malhotra avatar ptondereau avatar qrazi avatar rogierw avatar sebastiandedeyne avatar srmklive avatar tjitse-e avatar vdbelt avatar wouterbrouwers avatar

Stargazers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

Watchers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

laravel-server-monitor's Issues

Running checks modifies ALL checks to the type of the last

I've defined a diskspace check which extends the Diskspace class (i've named it diskspace-windows). Since a connection to a Windows server is different than a linux server, i've also created an extended Manipulator class which changes the command if the type is 'diskspace-windows' (i mention this since it might be related).

After I run all the checks, ALL records have their type column changed to diskspace-windows.

Now, I could of course peruse all the code to see where the record is fetched incorrectly or such, but let me suffice to say that it might be a very poor design decision to modify the check record so it can contain the results of the last check.

Not only do you miss all history of checks but now all my checks have been changed to the type of the last.

In my view you create hosts and checks and then you have a separate table for the results. You could easily make it so it only holds the last successful result and the last x failures/warnings...

Aside from this: the code should NOT modify all records. Period.

Frankly, I don't have that much time to spend on this project, but i'm willing to run some tests and share some code. Please advise which route to take.

Error Installing another Spatie package with superior Spatie/Regex

Error Installing another Spatie package with superior Spatie/Regex

Hi guys good morning.

I installed the Spatie/laravel-server-monitor package and when I install the Spatie/laravel-health package, an error occurs in require spatie/regex.

In the laravel-server-monitor package version ^1.1 is fixed and in laravel-health it is version ^3.1.

Error picture:

image

Can I adjust?

Greetings from Brazil

Cannot use restricted shells

Hi, we'd like to be able to restrict the server monitor SSH commands to use /bin/rbash so we can be sure only a subset of predefined commands are available to be used by the monitor user.

At the moment it's hardcoded to send bash as the shell here which makes this impossible at present. It would be nice if this were configurable such that it would be possible to specify the shell, or just run the command directly without the bash wrapper?

ssh passwords

How to use this with ssh -passwords?

If I run "php artisan server-monitor:run-checks" it's always - of course - asking user passwords.

php artisan server-monitor:run-checks
Start running 4 checks...
host-name: performing check diskspace...
host-name: performing check elasticsearch...
host-name: performing check memcached...
host-name: performing check mysql...
[email protected]'s password: [email protected]'s password: [email protected]'s password: [email protected]'s password:
host-name: check elasticsearch failed

It asks password multible time and if I feed it nothing happens...

Error on migration

Hi, I followed the process in the install section but am getting the error at the end of the below.

I hope it helps that I copide the full install process.

cucmauqpjd:public_html$ composer require spatie/laravel-server-monitor
Using version ^1.3 for spatie/laravel-server-monitor
./composer.json has been updated
Loading composer repositories with package information
Updating dependencies (including require-dev)
Package operations: 4 installs, 0 updates, 0 removals

  • Installing spatie/regex (1.3.0): Downloading (100%)
  • Installing spatie/blink (1.0.1): Downloading (100%)
  • Installing spatie/laravel-blink (1.1.1): Downloading (100%)
  • Installing spatie/laravel-server-monitor (1.3.2): Downloading (100%)
    Writing lock file
    Generating optimized autoload files

Illuminate\Foundation\ComposerScripts::postAutoloadDump
@php artisan package:discover
Discovered Package: arrilot/laravel-widgets
Discovered Package: botman/botman
Discovered Package: botman/driver-web
Discovered Package: botman/studio-addons
Discovered Package: fideloper/proxy
Discovered Package: intervention/image
Discovered Package: larapack/voyager-hooks
Discovered Package: laravel/tinker
Discovered Package: laravelcollective/html
Discovered Package: spatie/laravel-blink
Discovered Package: spatie/laravel-server-monitor
Discovered Package: tcg/voyager
Package manifest generated successfully.
cucmauqpjd:public_html$ php artisan vendor:publish --provider="Spatie\ServerMonitor\ServerMonitorServiceProvider" --tag="migrations"
Copied File [/vendor/spatie/laravel-server-monitor/database/migrations/create_hosts_table.php.stub] To [/database/migrations/2018_06_01_1320441_create_hosts_table.php]
Copied File [/vendor/spatie/laravel-server-monitor/database/migrations/create_checks_table.php.stub] To [/database/migrations/2018_06_01_1320442_create_checks_table.php]
Publishing complete.
cucmauqpjd:public_html$ php artisan migrate

In Connection.php line 664:

SQLSTATE[42000]: Syntax error or access violation: 1064 You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to u
se near 'json null, created_at timestamp null, updated_at timestamp null) default cha' at line 1 (SQL: create table hosts (id int unsigned not null auto_increment primary key
, name varchar(255) not null, ssh_user varchar(255) null, port int null, ip varchar(255) null, custom_properties json null, created_at timestamp null, updated_at timest
amp null) default character set utf8 collate utf8_unicode_ci)

In PDOConnection.php line 82:

SQLSTATE[42000]: Syntax error or access violation: 1064 You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to u
se near 'json null, created_at timestamp null, updated_at timestamp null) default cha' at line 1

In PDOConnection.php line 80:

SQLSTATE[42000]: Syntax error or access violation: 1064 You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to u
se near 'json null, created_at timestamp null, updated_at timestamp null) default cha' at line 1

PHP version

Hello,

Is it really require PHP7.1?
It only released a couple of month ago.
It's not part of the official repos for Ubuntu 16 yet.

Would you consider releasing that requirement?

Cheers, Sebi

Migration error (Mariadb issue?)

php artisan migrate

[Illuminate\Database\QueryException]
SQLSTATE[42000]: Syntax error or access violation: 1064 You have an error in your SQL syntax; chec
k the manual that corresponds to your MariaDB server version for the right syntax to use near 'jso
n null, created_at timestamp null, updated_at timestamp null) default cha' at line 1 (SQL: cre
ate table hosts (id int unsigned not null auto_increment primary key, name varchar(255) not
null, ssh_user varchar(255) null, port int null, ip varchar(255) null, custom_properties j
son null, created_at timestamp null, updated_at timestamp null) default character set utf8 col
late utf8_unicode_ci)

[PDOException]
SQLSTATE[42000]: Syntax error or access violation: 1064 You have an error in your SQL syntax; chec
k the manual that corresponds to your MariaDB server version for the right syntax to use near 'jso
n null, created_at timestamp null, updated_at timestamp null) default cha' at line 1

Brand new Valet install with mariadb.

I have your uptime monitor installed and working on this domain.

discord

good afternoon.the question arose is it possible to send notifications to discord from the service

New features.

I like your server monitor, thanks for it. But in my projects I had to change some behavior.
And now I want to propose you some features. It will be a list and if you approve some of them I'll create pull requests with this.


server-monitor:run-checks

  1. Add force mode to run checks right now. Example:
php artisan server-monitor:run-checks -f 
php artisan server-monitor:run-checks --force
  1. Add host option to run checks only for host(s). It can be array, like:
php artisan server-monitor:run-checks -f --host=example.com --host=example2.com
  1. Add check option to tun only selected checks. It also can be array, like:
php artisan server-monitor:run-checks -f --host=example.com --check=mysql --check=diskspace

Also host/check optins can be comma separated, like

php artisan server:monitor:run-checks -f --host=example.com,example2.com --check=mysql,diskspace

but I like first one more.


server-monitor:sync-file

  1. Allow to use different file formats, like yaml.
  2. Allow to set custom properties to check in files. Example:
[
 {
   "name": "my-host.com",
   "checks": [
      "diskspace",
      "mysql",
      {
          "redis": {
              "collect_used_memory": true
          }
      }
   ]
 }
]

server-monitor:list-hosts and server-monitor:list-checks

  1. Change host and check option to array. Example:
php artisan server-monitor:list-checks --host=example1.com --host=example2.com
  1. Add grep option to search something in result set.
    Why not use pipe grep ?
php artisan server-monitor:list-checks | grep something

will grep only rows with something, not table structure, not flag, that checks was succeed or failed.

But example

php artisan server-monitor:list-checks --grep=something

will draw tables as always, but filter each column via str_contains() for example.


Host options

One virtual host can be in many ip servers, and also can have a lot of mirrors. So I propose to:

  1. Add possibility to set ip as array and execute check in all IP addresses. Also it can be added additional option to run-checks/list-check/list-host like ip to filter via ip too . Example:
[
   {
      "name": "myhost.com",
      "ip": ["127.0.0.1", "127.0.0.2"]
   }
]
  1. Add new option as mirror. It's like alias. And when you search checks for special host you can set mirror and it will find correct host. Example:
[
   {
      "name": "example.com",
      "mirrors": ["example2.com", "localhost"]
   }
]

And when you want to see checks you can call

php artisan server-monitor:list-checks --host=example.com

or

php artisan server:monitor:list-checks --host=localhost

The result will be the same.


Default checks.

  1. Add addition outbox checks for rabbitmq/redis/supervisor/mongo etc.

Other

  1. Add contracts for repositories and remove static methods. And inject interfaces to the commands.
class SyncFile extends Command
{
  ...

  public function handle(CheckRepository $checkRepository)
  {
      ///
  }
}

Or alternatively add CheckRepositoryAware and HostRepositoryAware interfaces and doing something like:

// ServerProvider

public function register()
{
   $this->app->afterResolving(CheckRepositoryAware::class, function(CheckRepositoryAware $aware) {
      $aware->setCheckRepository(
          $this->app->make(CheckRepository::class)
      );
  });
}
class SyncFile extends Command implements CheckRepositoryAware
{
   use HasCheckRepository;
}

What of them will you review ?

Package doesn't work with PHP 7.3 and Laravel 8

Thanks for the awesome package! โค๏ธ

1.9.2 is the only version that supports Laravel 8 but it requires Laravel Blink. Blink 1.4.1 is the only version that supports Laravel 8 but that requires PHP 7.4.

Custom Database Table Names

Right now, the database table names are locked to checks and hosts. It's possible to override the checks model, which allows us to change the database table name, but there doesn't seem to be a way to do the same for hosts.

It would be very helpful if these table names could be customized, or at least if they were namespaced to avoid confusion with other models.

Thanks.

Make http ping check

Hi,

I want to make a new check to test if a web page response.
So I don't want to make a ssh connection with command, but only guzzle call to check response (200 or 302 in some case).

Is it possible, because I don't see it in the code ?

Regards

Incompatibility with PHP8, Laravel 8 or Composer 2?

[InvalidArgumentException] Package spatie/laravel-server-monitor has a PHP requirement incompatible with your PHP version, PHP extensions and Composer version

My environment:

Composer:
Composer version 2.0.8 2020-12-03 17:20:38

PHP:

PHP 8.0.0 (cli) (built: Nov 27 2020 12:26:05) ( NTS ) Copyright (c) The PHP Group Zend Engine v4.0.0-dev, Copyright (c) Zend Technologies with Zend OPcache v8.0.0, Copyright (c), by Zend Technologies

Laravel:

v8.21.0

Laravel 5.8

Hi

I was wondering if there is a plan to support Laravel 5.8?

Thanks

Next run in minutes hardcoded

Unfortunately, the next run in minutes is hardcoded to 10.

Right now, the users can't have another default value.

Usage Question: Dynamic Notificiation Email

When a notification is fired from the event listener, i can see that it calls the event required to handle this and passing in the event fired.

However it pulls the email from the config; weather thats a string or an array; and then it uses that address to send the email too.

Is there any way that this email address can be dynamic and pulled from the check model or a relationship of that model?

My usage would require this to be pulled from the database depending on who that check is attached too.

I can't see any valid way of this due to the way the notifiable is constructed in the EventHandler class.

The simplest form of what i would require to make this work, would be along the lines off:

in the Spatie\ServerMonitor\Notifications\EventHandler class

protected function determineNotifiable($event)
    {
        $notifiableClass = $this->config->get('server-monitor.notifications.notifiable');

        return app($notifiableClass)->setEvent($event);
    }

I am not suggesting that change, but hoping that helps portray where I'm trying to get too.

Is this something that you can implement? Even allowing a different EventHandler class to be specified would be helpful from the config.

Thanks.

Memcached check not working out of the box?

So, I justed tested the default installation and it worked for both Disk and MySQL checks. But for memcached, despite the fact that it seems to be running the string used in the check it doesn't exist in the result of the memcached service output. I looked into a local older version of Homestead, an older ubuntu server instantiated by Forge and a new server instantiated by Forge. All of them had a result similar to the one below:

service memcached status
โ— memcached.service - memcached daemon
   Loaded: loaded (/lib/systemd/system/memcached.service; enabled; vendor preset: enabled)
   Active: active (running) since Wed 2018-12-19 18:34:58 -03; 1h 1min ago
 Main PID: 1215 (memcached)
    Tasks: 6
   Memory: 1.0M
      CPU: 144ms
   CGroup: /system.slice/memcached.service
           โ””โ”€1215 /usr/bin/memcached -m 64 -p 11211 -u memcache -l 127.0.0.1

Is it possible that the memcached service check is not working out of the box anymore (maybe the output message changed) and nobody noticed yet? Or it might be my configuration? I don't see a pull request related to that, but I'm assuming the adjustment below would fix it.

if (str_contains($process->getOutput(), 'active (running)') ) {

Failed run checks

Hi, awesome package! :)

The authenticity of host '***' can't be established.
ECDSA key fingerprint is ***.
Are you sure you want to continue connecting (yes/no)? The authenticity of host '***' can't be established.
ECDSA key fingerprint is ***.
Are you sure you want to continue connecting (yes/no)? yes
***: check `diskspace` failed
forge@***:~/***$ php artisan server-monitor:run-checks
Start running 2 checks...
emeals.nl: performing check `diskspace`...
emeals.nl: performing check `mysql`...
emeals.nl: check `diskspace` failed
emeals.nl: check `mysql` failed
All done!

When I added the host for the first time, the checks ran directly, and I got this error: failed to run: Host key verification failed.

Do you know what is going wrong? :)

Thanks

?BaseNotification

Not sure this is a new PHP7.1 feature, but there is an extra ? on the EventHandler.php

protected function determineNotification($event): ?BaseNotification

Its on latest release!

Laravel Scheduler

Can this be used to monitor the Laravel scheduler? Thanks for your time!

Issue with Writing own checks

Hello,

I have written custom check to find out the disk space storage from EFS, however I am getting InvalidCheckDefinition.php Error.

Here is the error message:

The check with id 11 has an unknown type efsstorage. Valid values are apache, diskspace, elasticsearch, memcached, mysql

Is there any thing extra needed apart from registering class into config file after creating custom class which is extends from Spatie\ServerMonitor\CheckDefinitions\CheckDefinition. ?

Please let me know.

Failed to run run-checks

Hey!

I encountered a problem when trying to handle the plugin.
I have configured the server-monitor.php file. I set the project locally on a wamp.

server-monitor.php:

return [
'checks' => [
'diskspace' => Spatie\ServerMonitor\CheckDefinitions\Diskspace::class,
'elasticsearch' => Spatie\ServerMonitor\CheckDefinitions\Elasticsearch::class,
'memcached' => Spatie\ServerMonitor\CheckDefinitions\Memcached::class,
'mysql' => Spatie\ServerMonitor\CheckDefinitions\MySql::class,
],
'concurrent_ssh_connections' => 5,
'ssh_command_prefix' => '',
'ssh_command_suffix' => '',

'notifications' => [

    'notifications' => [
        Spatie\ServerMonitor\Notifications\Notifications\CheckSucceeded::class => [],
        Spatie\ServerMonitor\Notifications\Notifications\CheckRestored::class => ['slack'],
        Spatie\ServerMonitor\Notifications\Notifications\CheckWarning::class => ['slack'],
        Spatie\ServerMonitor\Notifications\Notifications\CheckFailed::class => ['slack'],
    ],
    'throttle_failing_notifications_for_minutes' => 60,
    'mail' => [
        'to' => 'my_email_address',
    ],
    'slack' => [
        'webhook_url' => env('SERVER_MONITOR_SLACK_WEBHOOK_URL'),
    ],
    'notifiable' => \Spatie\ServerMonitor\Notifications\Notifiable::class,
    'date_format' => 'd/m/Y',
],

'host_model' => Spatie\ServerMonitor\Models\Host::class,
'check_model' => Spatie\ServerMonitor\Models\Check::class,
'process_manipulator' => Spatie\ServerMonitor\Manipulators\Passthrough::class,

space_percentage_threshold' => [
    'warning' => 80,
    'fail' => 90,
],

];

console:

$ php artisan server-monitor:run-checks
Start running 4 checks...
http://www.example-address.pl: performing check diskspace...
http://www.example-address.pl: performing check elasticsearch...
http://www.example-address.pl: check diskspace failed
http://www.example-address.pl: performing check memcached...
http://www.example-address.pl: check elasticsearch failed
http://www.example-address.pl: performing check mysql...
http://www.example-address.pl: check memcached failed
http://www.example-address.pl: check mysql failed
All done!

In the "hosts" table, I have completed the "name" field with the website address. "ssh-user", "ip" and "custom_properties" are set to "null".

Do you know why I get "failed"?

Table "checks":
diskspace -> last_run_message -> "Exception occurred: Pattern /(\d?\d)%/ with subject `` didn't capture a group named 1"
all in last_run_output -> "{"output": "", "exit_code": 1, "error_output": "", "exit_code_text": "General error"}"

[Feature request] Using ssh private keys

Hey @spatie

Currently we can set a custom username to the host. It would be great if we also could set a custom ssh private key.
Sense rebooting the monitor server can sometimes leave the ssh key's out of the ssh-agent.
Leaving me choice but to log back in to the monitor server and re-add/attach the ssh-keys to the ssh-agent again.

If we could use the optional -i flag in the ssh command along with a specified ssh key location then for the host defined we can then almost eliminate situations like this.

By doing this we could also avoid situations with too many ssh-key login tries in the ssh-agent.

This would be useful if you have a lot of different ssh-keys.

kex_exchange_identification: Connection closed by remote host

Sometimes getting the following error:

Failed to run: kex_exchange_identification: Connection closed by remote host Connection closed by aa.bbb.ccc.d port 22

This doesn't happen every time and also, auto fixes within a minute. I know this can happen because of various reasons but anything anyone here faced it and solved?

Elasticsearch Error

Getting a curl download output for the default Elastic check.

last_run_message

failed to run:   % Total    % Received % Xferd  Average Speed   Time    Time     Time  Current
                                 Dload  Upload   Total   Spent    Left  Speed

  0     0    0     0    0     0      0      0 --:--:-- --:--:-- --:--:--     0
100   327  100   327    0     0  51650      0 --:--:-- --:--:-- --:--:-- 54500

last_run_output

{
   "output":"{\n  \"name\" : \"GExHyiY\",\n  \"cluster_name\" : \"elasticsearch\",\n  \"cluster_uuid\" : \"tGq3Gfa3h8Ju_f53xVbG\",\n  \"version\" : {\n    \"number\" : \"5.2.0\",\n    \"build_hash\" : \"24e05b9\",\n    \"build_date\" : \"2017-01-24T19:52:35.800Z\",\n    \"build_snapshot\" : false,\n    \"lucene_version\" : \"6.4.0\"\n  },\n  \"tagline\" : \"You Know, for Search\"\n}\n",
   "error_output":"  % Total    % Received % Xferd  Average Speed   Time    Time     Time  Current\n                                 Dload  Upload   Total   Spent    Left  Speed\n\r  0     0    0     0    0     0      0      0 --:--:-- --:--:-- --:--:--     0\r100   327  100   327    0     0  51650      0 --:--:-- --:--:-- --:--:-- 54500\n",
   "exit_code":0,
   "exit_code_text":"OK"
}

Command on server

$ curl http://localhost:9200
{
  "name" : "GExHyiY",
  "cluster_name" : "elasticsearch",
  "cluster_uuid" : "tGq3Gfa3h8Ju_f53xVbG",
  "version" : {
    "number" : "5.2.0",
    "build_hash" : "24e05b9",
    "build_date" : "2017-01-24T19:52:35.800Z",
    "build_snapshot" : false,
    "lucene_version" : "6.4.0"
  },
  "tagline" : "You Know, for Search"
}

I am using text column type as I don't have MySQL running but MariaDB. Every other check I have works fine across 7 servers. Any hints?

Laravel 5.6

Hello,

Are there plans to support laravel 5.6?

Force run-checks

When working with the server-monitor and perfecting new checks it might be useful to have an option to force all checks on a server. For example with a -f after the server-monitor:run-checks command.

Is this something you would accept or is there an other way to do this?

testing commands fails since switching to mockery 1.0

Commit fcc65d0 (actually ca9abe2) introduced mockery ~1.0. since then tests for commands are failing for me. It seems there are some incompatible changes between 0.9.8 and 1.0.0: https://github.com/mockery/mockery/blob/master/CHANGELOG.md#100-2017-09-06

I'm currently using PHP 7.2.

$ vendor/bin/phpunit 
PHPUnit 6.5.13 by Sebastian Bergmann and contributors.

Runtime:       PHP 7.2.12-1+ubuntu16.04.1+deb.sury.org+1 with Xdebug 2.6.1
Configuration: /home/robert/Workspace/laravel-server-monitor/phpunit.xml.dist

...............EEEEE..................SSSSSSSS...........FFFF.F.. 65 / 82 ( 79%)
.................                                                 82 / 82 (100%)

Time: 43.19 seconds, Memory: 30.00MB

There were 5 errors:

1) Spatie\ServerMonitor\Test\Commands\AddHostTest::it_can_add_a_host_with_all_checks
Mockery\Exception\NoMatchingExpectationException: No matching handler found for Mockery_0_Spatie_ServerMonitor_Commands_AddHost::ask('What is the name of the host'). Either the method was unexpected or its arguments matched no expected argument list for this method



/home/robert/Workspace/laravel-server-monitor/vendor/mockery/mockery/library/Mockery/ExpectationDirector.php:92
/home/robert/Workspace/laravel-server-monitor/src/Commands/AddHost.php:20
/home/robert/Workspace/laravel-server-monitor/vendor/laravel/framework/src/Illuminate/Container/BoundMethod.php:29
/home/robert/Workspace/laravel-server-monitor/vendor/laravel/framework/src/Illuminate/Container/BoundMethod.php:87
/home/robert/Workspace/laravel-server-monitor/vendor/laravel/framework/src/Illuminate/Container/BoundMethod.php:31
/home/robert/Workspace/laravel-server-monitor/vendor/laravel/framework/src/Illuminate/Container/Container.php:549
/home/robert/Workspace/laravel-server-monitor/vendor/laravel/framework/src/Illuminate/Console/Command.php:183
/home/robert/Workspace/laravel-server-monitor/vendor/symfony/console/Command/Command.php:255
/home/robert/Workspace/laravel-server-monitor/vendor/laravel/framework/src/Illuminate/Console/Command.php:170
/home/robert/Workspace/laravel-server-monitor/src/Commands/BaseCommand.php:18
/home/robert/Workspace/laravel-server-monitor/vendor/symfony/console/Application.php:946
/home/robert/Workspace/laravel-server-monitor/vendor/symfony/console/Application.php:248
/home/robert/Workspace/laravel-server-monitor/vendor/symfony/console/Application.php:148
/home/robert/Workspace/laravel-server-monitor/vendor/laravel/framework/src/Illuminate/Console/Application.php:88
/home/robert/Workspace/laravel-server-monitor/vendor/laravel/framework/src/Illuminate/Console/Application.php:177
/home/robert/Workspace/laravel-server-monitor/vendor/laravel/framework/src/Illuminate/Foundation/Console/Kernel.php:249
/home/robert/Workspace/laravel-server-monitor/vendor/laravel/framework/src/Illuminate/Support/Facades/Facade.php:221
/home/robert/Workspace/laravel-server-monitor/tests/Commands/AddHostTest.php:59

2) Spatie\ServerMonitor\Test\Commands\AddHostTest::it_can_add_a_host_with_specific_checks
Mockery\Exception\NoMatchingExpectationException: No matching handler found for Mockery_0_Spatie_ServerMonitor_Commands_AddHost::ask('What is the name of the host'). Either the method was unexpected or its arguments matched no expected argument list for this method



/home/robert/Workspace/laravel-server-monitor/vendor/mockery/mockery/library/Mockery/ExpectationDirector.php:92
/home/robert/Workspace/laravel-server-monitor/src/Commands/AddHost.php:20
/home/robert/Workspace/laravel-server-monitor/vendor/laravel/framework/src/Illuminate/Container/BoundMethod.php:29
/home/robert/Workspace/laravel-server-monitor/vendor/laravel/framework/src/Illuminate/Container/BoundMethod.php:87
/home/robert/Workspace/laravel-server-monitor/vendor/laravel/framework/src/Illuminate/Container/BoundMethod.php:31
/home/robert/Workspace/laravel-server-monitor/vendor/laravel/framework/src/Illuminate/Container/Container.php:549
/home/robert/Workspace/laravel-server-monitor/vendor/laravel/framework/src/Illuminate/Console/Command.php:183
/home/robert/Workspace/laravel-server-monitor/vendor/symfony/console/Command/Command.php:255
/home/robert/Workspace/laravel-server-monitor/vendor/laravel/framework/src/Illuminate/Console/Command.php:170
/home/robert/Workspace/laravel-server-monitor/src/Commands/BaseCommand.php:18
/home/robert/Workspace/laravel-server-monitor/vendor/symfony/console/Application.php:946
/home/robert/Workspace/laravel-server-monitor/vendor/symfony/console/Application.php:248
/home/robert/Workspace/laravel-server-monitor/vendor/symfony/console/Application.php:148
/home/robert/Workspace/laravel-server-monitor/vendor/laravel/framework/src/Illuminate/Console/Application.php:88
/home/robert/Workspace/laravel-server-monitor/vendor/laravel/framework/src/Illuminate/Console/Application.php:177
/home/robert/Workspace/laravel-server-monitor/vendor/laravel/framework/src/Illuminate/Foundation/Console/Kernel.php:249
/home/robert/Workspace/laravel-server-monitor/vendor/laravel/framework/src/Illuminate/Support/Facades/Facade.php:221
/home/robert/Workspace/laravel-server-monitor/tests/Commands/AddHostTest.php:104

3) Spatie\ServerMonitor\Test\Commands\AddHostTest::it_can_add_a_host_with_a_specific_port_and_user
Mockery\Exception\NoMatchingExpectationException: No matching handler found for Mockery_0_Spatie_ServerMonitor_Commands_AddHost::ask('What is the name of the host'). Either the method was unexpected or its arguments matched no expected argument list for this method



/home/robert/Workspace/laravel-server-monitor/vendor/mockery/mockery/library/Mockery/ExpectationDirector.php:92
/home/robert/Workspace/laravel-server-monitor/src/Commands/AddHost.php:20
/home/robert/Workspace/laravel-server-monitor/vendor/laravel/framework/src/Illuminate/Container/BoundMethod.php:29
/home/robert/Workspace/laravel-server-monitor/vendor/laravel/framework/src/Illuminate/Container/BoundMethod.php:87
/home/robert/Workspace/laravel-server-monitor/vendor/laravel/framework/src/Illuminate/Container/BoundMethod.php:31
/home/robert/Workspace/laravel-server-monitor/vendor/laravel/framework/src/Illuminate/Container/Container.php:549
/home/robert/Workspace/laravel-server-monitor/vendor/laravel/framework/src/Illuminate/Console/Command.php:183
/home/robert/Workspace/laravel-server-monitor/vendor/symfony/console/Command/Command.php:255
/home/robert/Workspace/laravel-server-monitor/vendor/laravel/framework/src/Illuminate/Console/Command.php:170
/home/robert/Workspace/laravel-server-monitor/src/Commands/BaseCommand.php:18
/home/robert/Workspace/laravel-server-monitor/vendor/symfony/console/Application.php:946
/home/robert/Workspace/laravel-server-monitor/vendor/symfony/console/Application.php:248
/home/robert/Workspace/laravel-server-monitor/vendor/symfony/console/Application.php:148
/home/robert/Workspace/laravel-server-monitor/vendor/laravel/framework/src/Illuminate/Console/Application.php:88
/home/robert/Workspace/laravel-server-monitor/vendor/laravel/framework/src/Illuminate/Console/Application.php:177
/home/robert/Workspace/laravel-server-monitor/vendor/laravel/framework/src/Illuminate/Foundation/Console/Kernel.php:249
/home/robert/Workspace/laravel-server-monitor/vendor/laravel/framework/src/Illuminate/Support/Facades/Facade.php:221
/home/robert/Workspace/laravel-server-monitor/tests/Commands/AddHostTest.php:159

4) Spatie\ServerMonitor\Test\Commands\DeleteHostTest::it_can_delete_hosts
Mockery\Exception\NoMatchingExpectationException: No matching handler found for Mockery_1_Spatie_ServerMonitor_Commands_DeleteHost::confirm('Are you sure you wish to delete `test-host`?'). Either the method was unexpected or its arguments matched no expected argument list for this method



/home/robert/Workspace/laravel-server-monitor/vendor/mockery/mockery/library/Mockery/ExpectationDirector.php:92
/home/robert/Workspace/laravel-server-monitor/src/Commands/DeleteHost.php:22
/home/robert/Workspace/laravel-server-monitor/vendor/laravel/framework/src/Illuminate/Container/BoundMethod.php:29
/home/robert/Workspace/laravel-server-monitor/vendor/laravel/framework/src/Illuminate/Container/BoundMethod.php:87
/home/robert/Workspace/laravel-server-monitor/vendor/laravel/framework/src/Illuminate/Container/BoundMethod.php:31
/home/robert/Workspace/laravel-server-monitor/vendor/laravel/framework/src/Illuminate/Container/Container.php:549
/home/robert/Workspace/laravel-server-monitor/vendor/laravel/framework/src/Illuminate/Console/Command.php:183
/home/robert/Workspace/laravel-server-monitor/vendor/symfony/console/Command/Command.php:255
/home/robert/Workspace/laravel-server-monitor/vendor/laravel/framework/src/Illuminate/Console/Command.php:170
/home/robert/Workspace/laravel-server-monitor/src/Commands/BaseCommand.php:18
/home/robert/Workspace/laravel-server-monitor/vendor/symfony/console/Application.php:946
/home/robert/Workspace/laravel-server-monitor/vendor/symfony/console/Application.php:248
/home/robert/Workspace/laravel-server-monitor/vendor/symfony/console/Application.php:148
/home/robert/Workspace/laravel-server-monitor/vendor/laravel/framework/src/Illuminate/Console/Application.php:88
/home/robert/Workspace/laravel-server-monitor/vendor/laravel/framework/src/Illuminate/Console/Application.php:177
/home/robert/Workspace/laravel-server-monitor/vendor/laravel/framework/src/Illuminate/Foundation/Console/Kernel.php:249
/home/robert/Workspace/laravel-server-monitor/vendor/laravel/framework/src/Illuminate/Support/Facades/Facade.php:221
/home/robert/Workspace/laravel-server-monitor/tests/Commands/DeleteHostTest.php:46

5) Spatie\ServerMonitor\Test\Commands\DeleteHostTest::it_can_stop_deleting_a_host
Mockery\Exception\NoMatchingExpectationException: No matching handler found for Mockery_1_Spatie_ServerMonitor_Commands_DeleteHost::confirm('Are you sure you wish to delete `test-host`?'). Either the method was unexpected or its arguments matched no expected argument list for this method



/home/robert/Workspace/laravel-server-monitor/vendor/mockery/mockery/library/Mockery/ExpectationDirector.php:92
/home/robert/Workspace/laravel-server-monitor/src/Commands/DeleteHost.php:22
/home/robert/Workspace/laravel-server-monitor/vendor/laravel/framework/src/Illuminate/Container/BoundMethod.php:29
/home/robert/Workspace/laravel-server-monitor/vendor/laravel/framework/src/Illuminate/Container/BoundMethod.php:87
/home/robert/Workspace/laravel-server-monitor/vendor/laravel/framework/src/Illuminate/Container/BoundMethod.php:31
/home/robert/Workspace/laravel-server-monitor/vendor/laravel/framework/src/Illuminate/Container/Container.php:549
/home/robert/Workspace/laravel-server-monitor/vendor/laravel/framework/src/Illuminate/Console/Command.php:183
/home/robert/Workspace/laravel-server-monitor/vendor/symfony/console/Command/Command.php:255
/home/robert/Workspace/laravel-server-monitor/vendor/laravel/framework/src/Illuminate/Console/Command.php:170
/home/robert/Workspace/laravel-server-monitor/src/Commands/BaseCommand.php:18
/home/robert/Workspace/laravel-server-monitor/vendor/symfony/console/Application.php:946
/home/robert/Workspace/laravel-server-monitor/vendor/symfony/console/Application.php:248
/home/robert/Workspace/laravel-server-monitor/vendor/symfony/console/Application.php:148
/home/robert/Workspace/laravel-server-monitor/vendor/laravel/framework/src/Illuminate/Console/Application.php:88
/home/robert/Workspace/laravel-server-monitor/vendor/laravel/framework/src/Illuminate/Console/Application.php:177
/home/robert/Workspace/laravel-server-monitor/vendor/laravel/framework/src/Illuminate/Foundation/Console/Kernel.php:249
/home/robert/Workspace/laravel-server-monitor/vendor/laravel/framework/src/Illuminate/Support/Facades/Facade.php:221
/home/robert/Workspace/laravel-server-monitor/tests/Commands/DeleteHostTest.php:74

--

localhost support

I tried to do a bit of a work around so that the check didn't ssh when the host was named localhost but did not get it to work like I would have liked. I thought I could manipulate the process command by setting the check value of isLocal to true but I believe I am missing some inheritance or something. For the time being, I am just setting isLocal to true for all checks, meaning I can only do local checks for now, but I would like to ability to run commands on localhost without ssh'ing first.

Is my approach appropriate? I think some built in functionality for avoiding ssh when on localhost would be handy.

`<?php

namespace App\Checks;

class LocalCheck extends \Spatie\ServerMonitor\Models\Check
{
protected $isLocal = false;

protected $table = 'checks';

public function setLocal()
{
    $this->isLocal = true;
}

public function getProcessCommand(): string
{
    $delimiter = 'EOF-LARAVEL-SERVER-MONITOR';

    $definition = $this->getDefinition();

    if (!$this->isLocal) {
        $portArgument = empty($this->host->port) ? '' : "-p {$this->host->port}";

        $sshCommandSuffix = config('server-monitor.ssh_command_suffix');

        return "ssh {$this->getTarget()} {$portArgument} {$sshCommandSuffix} 'bash -se <<$delimiter" . PHP_EOL
      . 'set -e' . PHP_EOL
      . $definition->command() . PHP_EOL
      . $delimiter . "'";
    } else {
        return $definition->command();
    }
}

}`

and manipulator
`<?php

namespace App\Checks;

use Spatie\ServerMonitor\Models\Check;
use Symfony\Component\Process\Process;

class ManipulatorLocal implements \Spatie\ServerMonitor\Manipulators\Manipulator
{
public function manipulateProcess(Process $process, Check $check): Process
{
if (preg_match('/localhost/', $check->host->name)) {
$check->setLocal();
$check->getDefinition()->setCheck($check);
}
return $process;
}
}`

In my case it fails to connect to host?

here is the error

update
  `checks`
set
  `last_run_output` = '{\"output\":\"\",\"error_output\":\"ssh: connect to host xdock.com.au port 22: Connection timed out\r\n\",\"exit_code\":255,\"exit_code_text\":\"Unknown error\"}',
  `checks`.`updated_at` = '2020-09-29 18:46:16'
where
  `id` = 1

Force checks to run every minute

Hello,
First of all, thanks for this library.

I was wondering if it was possible to force all checks to run every minute regardless of failure.

Thanks,
-R

Host SSH Key Paths

Hey,

Would you guys consider adding the ability to specify where a hosts ssh key sits on the server, and then on the ssh connection, it passes the key via the ssh -i?

Thanks

Question : run monitor locally

i want to ask if i can run server-monitor:run-checks command on my server that have the package installed , without making ssh

Trying to get property of non-object after delete a host

After delete a host with server-monitor:delete-host command, when I try to run or list checks I get this error:

[ErrorException]
  Trying to get property of non-object

This is the trace when I executed the server-monitor:list-checks command with -v argument:

Exception trace:
 () at .../server-monitor/laravel/vendor/spatie/laravel-server-monitor/src/Commands/ListChecks.php:75
 Illuminate\Foundation\Bootstrap\HandleExceptions->handleError() at .../server-monitor/laravel/vendor/spatie/laravel-server-monitor/src/Commands/ListChecks.php:75
 Spatie\ServerMonitor\Commands\ListChecks->Spatie\ServerMonitor\Commands\{closure}() at n/a:n/a
 array_map() at .../server-monitor/laravel/vendor/laravel/framework/src/Illuminate/Support/Collection.php:684
 Illuminate\Support\Collection->map() at .../server-monitor/laravel/vendor/laravel/framework/src/Illuminate/Database/Eloquent/Collection.php:130
 Illuminate\Database\Eloquent\Collection->map() at .../server-monitor/laravel/vendor/spatie/laravel-server-monitor/src/Commands/ListChecks.php:82
 Spatie\ServerMonitor\Commands\ListChecks->getTableRows() at .../server-monitor/laravel/vendor/spatie/laravel-server-monitor/src/Commands/ListChecks.php:33
 Spatie\ServerMonitor\Commands\ListChecks->unhealthyChecks() at .../server-monitor/laravel/vendor/spatie/laravel-server-monitor/src/Commands/ListChecks.php:23
 Spatie\ServerMonitor\Commands\ListChecks->handle() at n/a:n/a
 call_user_func_array() at .../server-monitor/laravel/vendor/laravel/framework/src/Illuminate/Container/BoundMethod.php:29
 Illuminate\Container\BoundMethod::Illuminate\Container\{closure}() at .../server-monitor/laravel/vendor/laravel/framework/src/Illuminate/Container/BoundMethod.php:87
 Illuminate\Container\BoundMethod::callBoundMethod() at .../server-monitor/laravel/vendor/laravel/framework/src/Illuminate/Container/BoundMethod.php:31
 Illuminate\Container\BoundMethod::call() at .../server-monitor/laravel/vendor/laravel/framework/src/Illuminate/Container/Container.php:524
 Illuminate\Container\Container->call() at .../server-monitor/laravel/vendor/laravel/framework/src/Illuminate/Console/Command.php:182
 Illuminate\Console\Command->execute() at .../server-monitor/laravel/vendor/symfony/console/Command/Command.php:262
 Symfony\Component\Console\Command\Command->run() at .../server-monitor/laravel/vendor/laravel/framework/src/Illuminate/Console/Command.php:167
 Illuminate\Console\Command->run() at .../server-monitor/laravel/vendor/spatie/laravel-server-monitor/src/Commands/BaseCommand.php:16
 Spatie\ServerMonitor\Commands\BaseCommand->run() at .../server-monitor/laravel/vendor/symfony/console/Application.php:826
 Symfony\Component\Console\Application->doRunCommand() at .../server-monitor/laravel/vendor/symfony/console/Application.php:189
 Symfony\Component\Console\Application->doRun() at .../server-monitor/laravel/vendor/symfony/console/Application.php:120
 Symfony\Component\Console\Application->run() at .../server-monitor/laravel/vendor/laravel/framework/src/Illuminate/Foundation/Console/Kernel.php:123
 Illuminate\Foundation\Console\Kernel->handle() at .../server-monitor/laravel/artisan:35

I'm using the server-monitor-app, but I think the problem is with the component.

Multiple email recipients

I'm trying to define multiple email recipients, but using an array doesn't work because Spatie\ServerMonitor\Notifications\Notifiable->routeNotificationForMail returns a string and a comma separated string can't be used as a recipient.

From what I can see I could easily derive my own class, but I wonder whether this feature shouldn't be in the core?

Php version?

Running composer install, I get:

Could not find package spatie/laravel-server-monitor at any version matching your PHP version 7.0.15.0

Any updates? Or is my version old :)

Class 'Spatie\ServerMonitor\DateTime' not found

when I'm runing composer require spatie/laravel-server-monitor in my fresh laravel installation,Im getting the following error

In ServerMonitorServiceProvider.php line 59:
Class 'Spatie\ServerMonitor\DateTime' not found
Script @php artisan package:discover handling the post-autoload-dump event returned with error code 1
Installation failed, reverting ./composer.json to its original content.

Run locally

This has been mentioned a couple other times:

#48
This was closed because he was looking for an uptime monitor.

#56
This sounds like a potential pull request - not sure why it was closed?

In my case, I was looking for a simple monitor for disk space because Linode doesn't provide it. Having used other spatie packages (activitylog, backup and permission - you all rock), I was excited to see that you had a solution for this as well. I didn't see any mention of running locally in the documentation but was hoping it might work anyway if I set the host to localhost. However, upon running server-monitor:run-checks, I get this:

$ a server-monitor:run-checks
Start running 2 checks...
localhost: performing check `diskspace`...
localhost: performing check `mysql`...
localhost: check `diskspace` failed
localhost: check `mysql` failed
All done!

And inspecting the checks table:

type: diskspace
status: failed
last_run_message: failed to run: Host key verification failed.
last_run_output: {"output": "", "exit_code": 255, "error_output": "Host key verification failed.\r\n", "exit_code_text": "Unknown error"}

All of which I'm sure is to be expected since @freekmurze said this in #48 (comment). I think it would be super useful if local checks were supported. I could set up another server to do the checks remotely, but I would instead just find another solution that works locally. I'm happy to work on a PR for this as I've actually never contributed to open-source software. Especially since the solution seems to have already been written at #56. Thoughts?

Running Locally

Hi guys,
I know this ticket is a bit of duplicated, but as I cannot use another server to monitor due to security compliance. I'm looking to find a way to install the server-monitor-app locally so that I just hope it to execute to check local free space and send slack message. Do you guys have any idea if it's possible to achieve? Cheers

Requires PHP 7.1?

Hey,

does the server monitor really require PHP 7.1 or could it also be run with PHP 7.0?

My problem is, that I'd like to run it on a Raspberry PI, which has 7.0.16.

Does the package require any of the new stuff from 7.1?

Thanks!

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    ๐Ÿ–– Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. ๐Ÿ“Š๐Ÿ“ˆ๐ŸŽ‰

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google โค๏ธ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.