Giter Club home page Giter Club logo

pterodactyl / panel Goto Github PK

View Code? Open in Web Editor NEW
6.0K 127.0 1.5K 26.02 MB

Pterodactyl® is a free, open-source game server management panel built with PHP, React, and Go. Designed with security in mind, Pterodactyl runs all game servers in isolated Docker containers while exposing a beautiful and intuitive UI to end users.

Home Page: https://pterodactyl.io

License: Other

PHP 59.24% JavaScript 0.13% CSS 0.27% Dockerfile 0.16% TypeScript 39.83% Blade 0.10% Nix 0.27%
laravel opensource mit docker free tailwindcss react typescript golang games

panel's Introduction

Logo Image

GitHub Workflow Status Discord GitHub Releases GitHub contributors

Pterodactyl Panel

Pterodactyl® is a free, open-source game server management panel built with PHP, React, and Go. Designed with security in mind, Pterodactyl runs all game servers in isolated Docker containers while exposing a beautiful and intuitive UI to end users.

Stop settling for less. Make game servers a first class citizen on your platform.

Image

Documentation

Sponsors

I would like to extend my sincere thanks to the following sponsors for helping fund Pterodactyl's development. Interested in becoming a sponsor?

Company About
Aussie Server Hosts No frills Australian Owned and operated High Performance Server hosting for some of the most demanding games serving Australia and New Zealand.
BisectHosting BisectHosting provides Minecraft, Valheim and other server hosting services with the highest reliability and lightning fast support since 2012.
MineStrator Looking for the most highend French hosting company for your minecraft server? More than 24,000 members on our discord trust us. Give us a try!
VibeGAMES VibeGAMES is a game server provider that specializes in DDOS protection for the games we offer. We have multiple locations in the US, Brazil, France, Germany, Singapore, Australia and South Africa.
HostEZ US & EU Rust & Minecraft Hosting. DDoS Protected bare metal, VPS and colocation with low latency, high uptime and maximum availability. EZ!
Blueprint Create and install Pterodactyl addons and themes with the growing Blueprint framework - the package-manager for Pterodactyl. Use multiple modifications at once without worrying about conflicts and make use of the large extension ecosystem.

Supported Games

Pterodactyl supports a wide variety of games by utilizing Docker containers to isolate each instance. This gives you the power to run game servers without bloating machines with a host of additional dependencies.

Some of our core supported games include:

  • Minecraft — including Paper, Sponge, Bungeecord, Waterfall, and more
  • Rust
  • Terraria
  • Teamspeak
  • Mumble
  • Team Fortress 2
  • Counter Strike: Global Offensive
  • Garry's Mod
  • ARK: Survival Evolved

In addition to our standard nest of supported games, our community is constantly pushing the limits of this software and there are plenty more games available provided by the community. Some of these games include:

  • Factorio
  • San Andreas: MP
  • Pocketmine MP
  • Squad
  • Xonotic
  • Starmade
  • Discord ATLBot, and most other Node.js/Python discord bots
  • and many more...

License

Pterodactyl® Copyright © 2015 - 2022 Dane Everitt and contributors.

Code released under the MIT License.

panel's People

Contributors

alliraine avatar arcdigital avatar arnaudlier avatar ayan4m1 avatar boy132 avatar daneeveritt avatar darthshmev avatar ddynamic avatar death-droid avatar devnote-dev avatar fabm3n avatar gravitycube avatar havilahog avatar jelcoo avatar kasperfranz avatar lancepioch avatar matthewpi avatar matthewsh avatar mrxbox98 avatar notareyouscared avatar orangejuiced avatar parkervcp avatar schrej avatar software-noob avatar stanjg avatar tekexplorer avatar tenten8401 avatar trixterthetux avatar ygtripps avatar zkoz210 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  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

panel's Issues

Download error

Stack attached.

[2016-01-24 06:35:27] production.ERROR: Symfony\Component\Debug\Exception\FatalThrowableError: Fatal error: Class 'Pterodactyl\Http\Controllers\Server\Download' not found in /var/www/beta.pterodactyl.io/html/app/Http/Controllers/Server/ServerController.php:176
Stack trace:
#0 [internal function]: Pterodactyl\Http\Controllers\Server\ServerController->getDownloadFile(Object(Illuminate\Http\Request), 'deaecd3c', 'logs/2016-01-24...')
#1 /var/www/beta.pterodactyl.io/html/bootstrap/cache/compiled.php(9075): call_user_func_array(Array, Array)
#2 /var/www/beta.pterodactyl.io/html/bootstrap/cache/compiled.php(9137): Illuminate\Routing\Controller->callAction('getDownloadFile', Array)
#3 /var/www/beta.pterodactyl.io/html/bootstrap/cache/compiled.php(9117): Illuminate\Routing\ControllerDispatcher->call(Object(Pterodactyl\Http\Controllers\Server\ServerController), Object(Illuminate\Routing\Route), 'getDownloadFile')
#4 [internal function]: Illuminate\Routing\ControllerDispatcher->Illuminate\Routing\{closure}(Object(Illuminate\Http\Request))
#5 /var/www/beta.pterodactyl.io/html/vendor/laravel/framework/src/Illuminate/Routing/Pipeline.php(52): call_user_func(Object(Closure), Object(Illuminate\Http\Request))
#6 [internal function]: Illuminate\Routing\Pipeline->Illuminate\Routing\{closure}(Object(Illuminate\Http\Request))
#7 /var/www/beta.pterodactyl.io/html/bootstrap/cache/compiled.php(9594): call_user_func(Object(Closure), Object(Illuminate\Http\Request))
#8 /var/www/beta.pterodactyl.io/html/bootstrap/cache/compiled.php(9118): Illuminate\Pipeline\Pipeline->then(Object(Closure))
#9 /var/www/beta.pterodactyl.io/html/bootstrap/cache/compiled.php(9105): Illuminate\Routing\ControllerDispatcher->callWithinStack(Object(Pterodactyl\Http\Controllers\Server\ServerController), Object(Illuminate\Routing\Route), Object(Illuminate\Http\Request), 'getDownloadFile')
#10 /var/www/beta.pterodactyl.io/html/bootstrap/cache/compiled.php(8209): Illuminate\Routing\ControllerDispatcher->dispatch(Object(Illuminate\Routing\Route), Object(Illuminate\Http\Request), 'Pterodactyl\\Htt...', 'getDownloadFile')
#11 /var/www/beta.pterodactyl.io/html/bootstrap/cache/compiled.php(8196): Illuminate\Routing\Route->runController(Object(Illuminate\Http\Request))
#12 /var/www/beta.pterodactyl.io/html/bootstrap/cache/compiled.php(7924): Illuminate\Routing\Route->run(Object(Illuminate\Http\Request))
#13 [internal function]: Illuminate\Routing\Router->Illuminate\Routing\{closure}(Object(Illuminate\Http\Request))
#14 /var/www/beta.pterodactyl.io/html/vendor/laravel/framework/src/Illuminate/Routing/Pipeline.php(52): call_user_func(Object(Closure), Object(Illuminate\Http\Request))
#15 /var/www/beta.pterodactyl.io/html/bootstrap/cache/compiled.php(3093): Illuminate\Routing\Pipeline->Illuminate\Routing\{closure}(Object(Illuminate\Http\Request))
#16 [internal function]: Illuminate\Foundation\Http\Middleware\VerifyCsrfToken->handle(Object(Illuminate\Http\Request), Object(Closure))
#17 /var/www/beta.pterodactyl.io/html/bootstrap/cache/compiled.php(9604): call_user_func_array(Array, Array)
#18 [internal function]: Illuminate\Pipeline\Pipeline->Illuminate\Pipeline\{closure}(Object(Illuminate\Http\Request))
#19 /var/www/beta.pterodactyl.io/html/vendor/laravel/framework/src/Illuminate/Routing/Pipeline.php(32): call_user_func(Object(Closure), Object(Illuminate\Http\Request))
#20 /var/www/beta.pterodactyl.io/html/app/Http/Middleware/CheckServer.php(56): Illuminate\Routing\Pipeline->Illuminate\Routing\{closure}(Object(Illuminate\Http\Request))
#21 [internal function]: Pterodactyl\Http\Middleware\CheckServer->handle(Object(Illuminate\Http\Request), Object(Closure))
#22 /var/www/beta.pterodactyl.io/html/bootstrap/cache/compiled.php(9604): call_user_func_array(Array, Array)
#23 [internal function]: Illuminate\Pipeline\Pipeline->Illuminate\Pipeline\{closure}(Object(Illuminate\Http\Request))
#24 /var/www/beta.pterodactyl.io/html/vendor/laravel/framework/src/Illuminate/Routing/Pipeline.php(32): call_user_func(Object(Closure), Object(Illuminate\Http\Request))
#25 /var/www/beta.pterodactyl.io/html/app/Http/Middleware/Authenticate.php(45): Illuminate\Routing\Pipeline->Illuminate\Routing\{closure}(Object(Illuminate\Http\Request))
#26 [internal function]: Pterodactyl\Http\Middleware\Authenticate->handle(Object(Illuminate\Http\Request), Object(Closure))
#27 /var/www/beta.pterodactyl.io/html/bootstrap/cache/compiled.php(9604): call_user_func_array(Array, Array)
#28 [internal function]: Illuminate\Pipeline\Pipeline->Illuminate\Pipeline\{closure}(Object(Illuminate\Http\Request))
#29 /var/www/beta.pterodactyl.io/html/vendor/laravel/framework/src/Illuminate/Routing/Pipeline.php(32): call_user_func(Object(Closure), Object(Illuminate\Http\Request))
#30 [internal function]: Illuminate\Routing\Pipeline->Illuminate\Routing\{closure}(Object(Illuminate\Http\Request))
#31 /var/www/beta.pterodactyl.io/html/bootstrap/cache/compiled.php(9594): call_user_func(Object(Closure), Object(Illuminate\Http\Request))
#32 /var/www/beta.pterodactyl.io/html/bootstrap/cache/compiled.php(7925): Illuminate\Pipeline\Pipeline->then(Object(Closure))
#33 /var/www/beta.pterodactyl.io/html/bootstrap/cache/compiled.php(7916): Illuminate\Routing\Router->runRouteWithinStack(Object(Illuminate\Routing\Route), Object(Illuminate\Http\Request))
#34 /var/www/beta.pterodactyl.io/html/bootstrap/cache/compiled.php(7906): Illuminate\Routing\Router->dispatchToRoute(Object(Illuminate\Http\Request))
#35 /var/www/beta.pterodactyl.io/html/bootstrap/cache/compiled.php(2357): Illuminate\Routing\Router->dispatch(Object(Illuminate\Http\Request))
#36 [internal function]: Illuminate\Foundation\Http\Kernel->Illuminate\Foundation\Http\{closure}(Object(Illuminate\Http\Request))
#37 /var/www/beta.pterodactyl.io/html/vendor/laravel/framework/src/Illuminate/Routing/Pipeline.php(52): call_user_func(Object(Closure), Object(Illuminate\Http\Request))
#38 /var/www/beta.pterodactyl.io/html/app/Http/Middleware/LanguageMiddleware.php(58): Illuminate\Routing\Pipeline->Illuminate\Routing\{closure}(Object(Illuminate\Http\Request))
#39 [internal function]: Pterodactyl\Http\Middleware\LanguageMiddleware->handle(Object(Illuminate\Http\Request), Object(Closure))
#40 /var/www/beta.pterodactyl.io/html/bootstrap/cache/compiled.php(9604): call_user_func_array(Array, Array)
#41 [internal function]: Illuminate\Pipeline\Pipeline->Illuminate\Pipeline\{closure}(Object(Illuminate\Http\Request))
#42 /var/www/beta.pterodactyl.io/html/vendor/laravel/framework/src/Illuminate/Routing/Pipeline.php(32): call_user_func(Object(Closure), Object(Illuminate\Http\Request))
#43 /var/www/beta.pterodactyl.io/html/bootstrap/cache/compiled.php(13039): Illuminate\Routing\Pipeline->Illuminate\Routing\{closure}(Object(Illuminate\Http\Request))
#44 [internal function]: Illuminate\View\Middleware\ShareErrorsFromSession->handle(Object(Illuminate\Http\Request), Object(Closure))
#45 /var/www/beta.pterodactyl.io/html/bootstrap/cache/compiled.php(9604): call_user_func_array(Array, Array)
#46 [internal function]: Illuminate\Pipeline\Pipeline->Illuminate\Pipeline\{closure}(Object(Illuminate\Http\Request))
#47 /var/www/beta.pterodactyl.io/html/vendor/laravel/framework/src/Illuminate/Routing/Pipeline.php(32): call_user_func(Object(Closure), Object(Illuminate\Http\Request))
#48 /var/www/beta.pterodactyl.io/html/bootstrap/cache/compiled.php(11613): Illuminate\Routing\Pipeline->Illuminate\Routing\{closure}(Object(Illuminate\Http\Request))
#49 [internal function]: Illuminate\Session\Middleware\StartSession->handle(Object(Illuminate\Http\Request), Object(Closure))
#50 /var/www/beta.pterodactyl.io/html/bootstrap/cache/compiled.php(9604): call_user_func_array(Array, Array)
#51 [internal function]: Illuminate\Pipeline\Pipeline->Illuminate\Pipeline\{closure}(Object(Illuminate\Http\Request))
#52 /var/www/beta.pterodactyl.io/html/vendor/laravel/framework/src/Illuminate/Routing/Pipeline.php(32): call_user_func(Object(Closure), Object(Illuminate\Http\Request))
#53 /var/www/beta.pterodactyl.io/html/bootstrap/cache/compiled.php(12778): Illuminate\Routing\Pipeline->Illuminate\Routing\{closure}(Object(Illuminate\Http\Request))
#54 [internal function]: Illuminate\Cookie\Middleware\AddQueuedCookiesToResponse->handle(Object(Illuminate\Http\Request), Object(Closure))
#55 /var/www/beta.pterodactyl.io/html/bootstrap/cache/compiled.php(9604): call_user_func_array(Array, Array)
#56 [internal function]: Illuminate\Pipeline\Pipeline->Illuminate\Pipeline\{closure}(Object(Illuminate\Http\Request))
#57 /var/www/beta.pterodactyl.io/html/vendor/laravel/framework/src/Illuminate/Routing/Pipeline.php(32): call_user_func(Object(Closure), Object(Illuminate\Http\Request))
#58 /var/www/beta.pterodactyl.io/html/bootstrap/cache/compiled.php(12715): Illuminate\Routing\Pipeline->Illuminate\Routing\{closure}(Object(Illuminate\Http\Request))
#59 [internal function]: Illuminate\Cookie\Middleware\EncryptCookies->handle(Object(Illuminate\Http\Request), Object(Closure))
#60 /var/www/beta.pterodactyl.io/html/bootstrap/cache/compiled.php(9604): call_user_func_array(Array, Array)
#61 [internal function]: Illuminate\Pipeline\Pipeline->Illuminate\Pipeline\{closure}(Object(Illuminate\Http\Request))
#62 /var/www/beta.pterodactyl.io/html/vendor/laravel/framework/src/Illuminate/Routing/Pipeline.php(32): call_user_func(Object(Closure), Object(Illuminate\Http\Request))
#63 /var/www/beta.pterodactyl.io/html/bootstrap/cache/compiled.php(3154): Illuminate\Routing\Pipeline->Illuminate\Routing\{closure}(Object(Illuminate\Http\Request))
#64 [internal function]: Illuminate\Foundation\Http\Middleware\CheckForMaintenanceMode->handle(Object(Illuminate\Http\Request), Object(Closure))
#65 /var/www/beta.pterodactyl.io/html/bootstrap/cache/compiled.php(9604): call_user_func_array(Array, Array)
#66 [internal function]: Illuminate\Pipeline\Pipeline->Illuminate\Pipeline\{closure}(Object(Illuminate\Http\Request))
#67 /var/www/beta.pterodactyl.io/html/vendor/laravel/framework/src/Illuminate/Routing/Pipeline.php(32): call_user_func(Object(Closure), Object(Illuminate\Http\Request))
#68 /var/www/beta.pterodactyl.io/html/vendor/dingo/api/src/Http/Middleware/Request.php(95): Illuminate\Routing\Pipeline->Illuminate\Routing\{closure}(Object(Illuminate\Http\Request))
#69 [internal function]: Dingo\Api\Http\Middleware\Request->handle(Object(Illuminate\Http\Request), Object(Closure))
#70 /var/www/beta.pterodactyl.io/html/bootstrap/cache/compiled.php(9604): call_user_func_array(Array, Array)
#71 [internal function]: Illuminate\Pipeline\Pipeline->Illuminate\Pipeline\{closure}(Object(Illuminate\Http\Request))
#72 /var/www/beta.pterodactyl.io/html/vendor/laravel/framework/src/Illuminate/Routing/Pipeline.php(32): call_user_func(Object(Closure), Object(Illuminate\Http\Request))
#73 [internal function]: Illuminate\Routing\Pipeline->Illuminate\Routing\{closure}(Object(Illuminate\Http\Request))
#74 /var/www/beta.pterodactyl.io/html/bootstrap/cache/compiled.php(9594): call_user_func(Object(Closure), Object(Illuminate\Http\Request))
#75 /var/www/beta.pterodactyl.io/html/bootstrap/cache/compiled.php(2304): Illuminate\Pipeline\Pipeline->then(Object(Closure))
#76 /var/www/beta.pterodactyl.io/html/bootstrap/cache/compiled.php(2288): Illuminate\Foundation\Http\Kernel->sendRequestThroughRouter(Object(Illuminate\Http\Request))
#77 /var/www/beta.pterodactyl.io/html/public/index.php(53): Illuminate\Foundation\Http\Kernel->handle(Object(Illuminate\Http\Request))
#78 {main}  

Issue assigning proper timezone

There seems to be an error that gets thrown due to a blank timezone in current setups when trying to run composer setup. It would appear that the env command isn't working properly in the config/app.php file, or something is causing it to be overwritten elsewhere.

It seems that the copied .env file that is made by composer includes a blank APP_TIMEZONE setting when it should not.

API Authentication Improvements

Discussion is welcome here.

  • Firstly, the IP checking within the API needs to be modified a bit to allow for CIDR notation so we don't necessarily have to store a huge quantity of IPs in the database.
  • Secondly, the secret token for the API, consider ideas for how to securely store this in the database. We could encrypt it, which would protect it in the event that the database is compromised, but not in the event that the database and code are compromised since they would then get access to the encryption token. We could also just store it as plaintext.
  • Important: the current method of signing the request before sending it is missing the request type (i.e. POST, GET) which could allow for a reply-attack to target a different method (i.e. intercept GET and then change the method to POST).
  • Additionally, consider adding a timestamp which could prevent a reply-attack if the time is not within x minutes of the server time. This opens up issues with systems that have vastly different times (i.e. differ by hours or days). This can also just be mitigated by using HTTPs.

Drag and Drop inside file manager

Make it so you don't have to go to New --> Upload to upload a file. Make it possible to upload the file directly from the folder view.

Failed IP change still triggers a rebuild on the daemon

On the Panel:

An unhandled exception occured while attemping to modify the default connection for this server.

On the Daemon:

02:35:57.541Z  INFO pterodactyl.daemon: New configiguration has changes to the server's build settings. Server has been queued for rebuild on next boot. (server=94545fd1-ae41-43c5-8842-3f5e30465691)

(also, typo there, configiguration)

In the changeBuild() function of the ServerRepository we are calling

$server->save();
DB::commit();

after we call the $client->request() method which negates the point of error handling there. We should be trying $server->save(), then calling the request, and then calling DB::commit(); once both of those succeed.

Typing lag on console page.

There is some noticeable delay when trying and performing movements on the console page, and I am willing to guess that it is the javascript being called constantly.

Probably need to do some optimizations on the code to render core usage and such.

Allocate IPv6 resources

When attempting to allocate IPv6 resources on a node, the panel currently claims victory and silently fails.

Official website status

Hi there,

I have been trying to visit pterodactyl.io since I first discover this project, and it has been down all the time. Will it be up at some point? What are your plans for it?

David.

Curl error upon creating server

When creating a server I get this error:

An error occured while attempting to create the server: cURL error 7: Failed to connect to node.example.com port 5800: Connection refused (see http://curl.haxx.se/libcurl/c/libcurl-errors.html)

The reason for this is that curl is allowed to use ipv6 which ends in no connection to the daemon which is listening on ipv4. Please make sure to force ipv4 in all curl requests that the panel sends.

Testing from cmd on the same server :

Using curl node.example.com:5800 instead:

* Rebuilt URL to: node.example.com:5800/
*   Trying someIPv6...
* connect to someIPv6 port 5800 failed: Connection refused
* Failed to connect to node.example.com port 5600: Connection refused
* Closing connection 0
curl: (7) Failed to connect to node.example.com port 5800: Connection refused

Using curl -4 node.example.com:5800 instead:

* Rebuilt URL to: node.example.com:5800/
*   Trying someIPv4...
* Connected to node.example.com (someIPv4) port 5800 (#0)
> GET / HTTP/1.1
> Host: node.example.com:5800
> User-Agent: curl/7.43.0
> Accept: */*
> 
* Empty reply from server
* Connection #0 to host node.example.com left intact
curl: (52) Empty reply from server

Composer Setup error

Recently I've been trying to setup Pterodactyl and every time I've been getting this same error... I've tried installing it in its own directory, running as a non-root user, running as a root user, restarting the server, and the list goes on..

I don't know if this was the error that was mentioned on the Installing wiki page, but I still dont really know what to do if it don't think the files exist. Hopefully this is a very simple fix. Thank you, and I look forward to being able to use the panel.

Console log: http://pastebin.com/RkDNYQhX

Log spam when daemon is offline

There is a lot of log spam when a daemon is offline, this should be changed to not log to a file.

[2016-01-24 05:24:27] production.NOTICE: An exception was raised while attempting to contact a daemon instance to get server status information. {"exception":"Error creating resource: [message] fopen(http://***:8080/server): failed to open stream: Connection refused\n[file] /var/www/beta.pterodactyl.io/html/vendor/guzzlehttp/guzzle/src/Handler/StreamHandler.php\n[line] 282","path":"server/deaecd3c/ajax/status"} 

IP Aliasing

A user requested the ability to assign an alias to IP addresses within the panel that would show in place of the actual IP address.

I could see this being useful if you have a GRE tunnel that you would like to use without exposing your actual IP address to users. Basically anywhere that the IP is displayed on the front-end would display using the IP alias rather than the actual IP address allowing you to bind servers to your public server IP but still show the GRE tunnel as the one users should connect using and whatnot.

Problem adding services manually to databse

Upon following the tutorial in the wiki you get the following error upon executing the sql queries:

INSERT INTO `service_options` (`id`, `parent_service`, `name`, `description`, `tag`, `docker_image`, `created_at`, `updated_at`)
VALUES
    (1, 1, 'Vanilla', 'Vanilla', 'vanilla', 'quay.io/pterodactyl/minecraft:latest', '2015-01-12 12:12:12', '2015-01-12 12:12:12'),
    (2, 2, 'Insurgency', 'Insurgency Dedicated Server', 'srcds', 'quay.io/pterodactyl/srcds', NULL, '-game {{SRCDS_GAME}} -console -port {{SERVER_PORT}} +map {{SRCDS_MAP}} -strictportbind -norestart', '2016-02-12 22:58:38', '2016-02-12 22:58:38'),
    (3, 2, 'Team Fortress 2', 'TF2', 'srcds', 'quay.io/pterodactyl/srcds', NULL, '-game {{SRCDS_GAME}} -console -port {{SERVER_PORT}} +map {{SRCDS_MAP}} -strictportbind -norestart', '2016-02-12 22:58:38', '2016-02-12 22:58:38'),
    (4, 2, 'Custom Game', 'Allows running a custom SRCDS game.', 'srcds', 'quay.io/pterodactyl/srcds', NULL, NULL, '2016-02-12 22:58:38', '2016-02-12 22:58:38');
SQL-Command:
INSERT INTO `service_options` (`id`, `parent_service`, `name`, `description`, `tag`, `docker_image`, `created_at`, `updated_at`) VALUES (1, 1, 'Vanilla', 'Vanilla', 'vanilla', 'quay.io/pterodactyl/minecraft:latest', '2015-01-12 12:12:12', '2015-01-12 12:12:12'), (2, 2, 'Insurgency', 'Insurgency Dedicated Server', 'srcds', 'quay.io/pterodactyl/srcds', NULL, '-game {{SRCDS_GAME}} -console -port {{SERVER_PORT}} +map {{SRCDS_MAP}} -strictportbind -norestart', '2016-02-12 22:58:38', '2016-02-12 22:58:38'), (3, 2, 'Team Fortress 2', 'TF2', 'srcds', 'quay.io/pterodactyl/srcds', NULL, '-game {{SRCDS_GAME}} -console -port {{SERVER_PORT}} +map {{SRCDS_MAP}} -strictportbind -norestart', '2016-02-12 22:58:38', '2016-02-12 22:58:38'), (4, 2, 'Custom Game', 'Allows running a custom SRCDS game.', 'srcds', 'quay.io/pterodactyl/srcds', NULL, NULL, '2016-02-12 22:58:38', '2016-02-12 22:58:38')

#1136 - Column count doesn't match value count at row 2

Basically for the last three rows of the statement 10 instead of 8 values are given.

Cannot add subuser

The new migrations have a typo within them that causes the subuser permissions table to have an improperly named permission field (it is currently named permissions).

Next Illuminate\Database\QueryException: SQLSTATE[42S22]: Column not found: 1054 Unknown column 'permission' in 'field list' (SQL: insert into `permissions` (`user_id`, `server_id`, `permission`, `updated_at`, `created_at`) values (2, 1, power-start, 2016-01-24 06:39:24, 2016-01-24 06:39:24)) in /var/www/beta.pterodactyl.io/html/vendor/laravel/framework/src/Illuminate/Database/Connection.php:651
Stack trace:
#0 /var/www/beta.pterodactyl.io/html/vendor/laravel/framework/src/Illuminate/Database/Connection.php(611): Illuminate\Database\Connection->runQueryCallback('insert into `pe...', Array, Object(Closure))
#1 /var/www/beta.pterodactyl.io/html/vendor/laravel/framework/src/Illuminate/Database/Connection.php(391): Illuminate\Database\Connection->run('insert into `pe...', Array, Object(Closure))
#2 /var/www/beta.pterodactyl.io/html/vendor/laravel/framework/src/Illuminate/Database/Connection.php(347): Illuminate\Database\Connection->statement('insert into `pe...', Array)
#3 /var/www/beta.pterodactyl.io/html/vendor/laravel/framework/src/Illuminate/Database/Query/Processors/Processor.php(32): Illuminate\Database\Connection->insert('insert into `pe...', Array)
#4 /var/www/beta.pterodactyl.io/html/vendor/laravel/framework/src/Illuminate/Database/Query/Builder.php(1889): Illuminate\Database\Query\Processors\Processor->processInsertGetId(Object(Illuminate\Database\Query\Builder), 'insert into `pe...', Array, 'id')
#5 [internal function]: Illuminate\Database\Query\Builder->insertGetId(Array, 'id')
#6 /var/www/beta.pterodactyl.io/html/vendor/laravel/framework/src/Illuminate/Database/Eloquent/Builder.php(1244): call_user_func_array(Array, Array)
#7 /var/www/beta.pterodactyl.io/html/bootstrap/cache/compiled.php(10529): Illuminate\Database\Eloquent\Builder->__call('insertGetId', Array)
#8 /var/www/beta.pterodactyl.io/html/bootstrap/cache/compiled.php(10518): Illuminate\Database\Eloquent\Model->insertAndSetId(Object(Illuminate\Database\Eloquent\Builder), Array)
#9 /var/www/beta.pterodactyl.io/html/bootstrap/cache/compiled.php(10469): Illuminate\Database\Eloquent\Model->performInsert(Object(Illuminate\Database\Eloquent\Builder), Array)
#10 /var/www/beta.pterodactyl.io/html/app/Repositories/SubuserRepository.php(153): Illuminate\Database\Eloquent\Model->save()
#11 /var/www/beta.pterodactyl.io/html/app/Http/Controllers/Server/SubuserController.php(161): Pterodactyl\Repositories\SubuserRepository->create(1, Array)
#12 [internal function]: Pterodactyl\Http\Controllers\Server\SubuserController->postNew(Object(Illuminate\Http\Request), 'deaecd3c')
#13 /var/www/beta.pterodactyl.io/html/bootstrap/cache/compiled.php(9075): call_user_func_array(Array, Array)
#14 /var/www/beta.pterodactyl.io/html/bootstrap/cache/compiled.php(9137): Illuminate\Routing\Controller->callAction('postNew', Array)
#15 /var/www/beta.pterodactyl.io/html/bootstrap/cache/compiled.php(9117): Illuminate\Routing\ControllerDispatcher->call(Object(Pterodactyl\Http\Controllers\Server\SubuserController), Object(Illuminate\Routing\Route), 'postNew')
#16 [internal function]: Illuminate\Routing\ControllerDispatcher->Illuminate\Routing\{closure}(Object(Illuminate\Http\Request))
#17 /var/www/beta.pterodactyl.io/html/vendor/laravel/framework/src/Illuminate/Routing/Pipeline.php(52): call_user_func(Object(Closure), Object(Illuminate\Http\Request))
#18 [internal function]: Illuminate\Routing\Pipeline->Illuminate\Routing\{closure}(Object(Illuminate\Http\Request))
#19 /var/www/beta.pterodactyl.io/html/bootstrap/cache/compiled.php(9594): call_user_func(Object(Closure), Object(Illuminate\Http\Request))
#20 /var/www/beta.pterodactyl.io/html/bootstrap/cache/compiled.php(9118): Illuminate\Pipeline\Pipeline->then(Object(Closure))
#21 /var/www/beta.pterodactyl.io/html/bootstrap/cache/compiled.php(9105): Illuminate\Routing\ControllerDispatcher->callWithinStack(Object(Pterodactyl\Http\Controllers\Server\SubuserController), Object(Illuminate\Routing\Route), Object(Illuminate\Http\Request), 'postNew')
#22 /var/www/beta.pterodactyl.io/html/bootstrap/cache/compiled.php(8209): Illuminate\Routing\ControllerDispatcher->dispatch(Object(Illuminate\Routing\Route), Object(Illuminate\Http\Request), 'Pterodactyl\\Htt...', 'postNew')
#23 /var/www/beta.pterodactyl.io/html/bootstrap/cache/compiled.php(8196): Illuminate\Routing\Route->runController(Object(Illuminate\Http\Request))
#24 /var/www/beta.pterodactyl.io/html/bootstrap/cache/compiled.php(7924): Illuminate\Routing\Route->run(Object(Illuminate\Http\Request))
#25 [internal function]: Illuminate\Routing\Router->Illuminate\Routing\{closure}(Object(Illuminate\Http\Request))
#26 /var/www/beta.pterodactyl.io/html/vendor/laravel/framework/src/Illuminate/Routing/Pipeline.php(52): call_user_func(Object(Closure), Object(Illuminate\Http\Request))
#27 /var/www/beta.pterodactyl.io/html/bootstrap/cache/compiled.php(3093): Illuminate\Routing\Pipeline->Illuminate\Routing\{closure}(Object(Illuminate\Http\Request))
#28 [internal function]: Illuminate\Foundation\Http\Middleware\VerifyCsrfToken->handle(Object(Illuminate\Http\Request), Object(Closure))
#29 /var/www/beta.pterodactyl.io/html/bootstrap/cache/compiled.php(9604): call_user_func_array(Array, Array)
#30 [internal function]: Illuminate\Pipeline\Pipeline->Illuminate\Pipeline\{closure}(Object(Illuminate\Http\Request))
#31 /var/www/beta.pterodactyl.io/html/vendor/laravel/framework/src/Illuminate/Routing/Pipeline.php(32): call_user_func(Object(Closure), Object(Illuminate\Http\Request))
#32 /var/www/beta.pterodactyl.io/html/app/Http/Middleware/CheckServer.php(56): Illuminate\Routing\Pipeline->Illuminate\Routing\{closure}(Object(Illuminate\Http\Request))
#33 [internal function]: Pterodactyl\Http\Middleware\CheckServer->handle(Object(Illuminate\Http\Request), Object(Closure))
#34 /var/www/beta.pterodactyl.io/html/bootstrap/cache/compiled.php(9604): call_user_func_array(Array, Array)
#35 [internal function]: Illuminate\Pipeline\Pipeline->Illuminate\Pipeline\{closure}(Object(Illuminate\Http\Request))
#36 /var/www/beta.pterodactyl.io/html/vendor/laravel/framework/src/Illuminate/Routing/Pipeline.php(32): call_user_func(Object(Closure), Object(Illuminate\Http\Request))
#37 /var/www/beta.pterodactyl.io/html/app/Http/Middleware/Authenticate.php(45): Illuminate\Routing\Pipeline->Illuminate\Routing\{closure}(Object(Illuminate\Http\Request))
#38 [internal function]: Pterodactyl\Http\Middleware\Authenticate->handle(Object(Illuminate\Http\Request), Object(Closure))
#39 /var/www/beta.pterodactyl.io/html/bootstrap/cache/compiled.php(9604): call_user_func_array(Array, Array)
#40 [internal function]: Illuminate\Pipeline\Pipeline->Illuminate\Pipeline\{closure}(Object(Illuminate\Http\Request))
#41 /var/www/beta.pterodactyl.io/html/vendor/laravel/framework/src/Illuminate/Routing/Pipeline.php(32): call_user_func(Object(Closure), Object(Illuminate\Http\Request))
#42 [internal function]: Illuminate\Routing\Pipeline->Illuminate\Routing\{closure}(Object(Illuminate\Http\Request))
#43 /var/www/beta.pterodactyl.io/html/bootstrap/cache/compiled.php(9594): call_user_func(Object(Closure), Object(Illuminate\Http\Request))
#44 /var/www/beta.pterodactyl.io/html/bootstrap/cache/compiled.php(7925): Illuminate\Pipeline\Pipeline->then(Object(Closure))
#45 /var/www/beta.pterodactyl.io/html/bootstrap/cache/compiled.php(7916): Illuminate\Routing\Router->runRouteWithinStack(Object(Illuminate\Routing\Route), Object(Illuminate\Http\Request))
#46 /var/www/beta.pterodactyl.io/html/bootstrap/cache/compiled.php(7906): Illuminate\Routing\Router->dispatchToRoute(Object(Illuminate\Http\Request))
#47 /var/www/beta.pterodactyl.io/html/bootstrap/cache/compiled.php(2357): Illuminate\Routing\Router->dispatch(Object(Illuminate\Http\Request))
#48 [internal function]: Illuminate\Foundation\Http\Kernel->Illuminate\Foundation\Http\{closure}(Object(Illuminate\Http\Request))
#49 /var/www/beta.pterodactyl.io/html/vendor/laravel/framework/src/Illuminate/Routing/Pipeline.php(52): call_user_func(Object(Closure), Object(Illuminate\Http\Request))
#50 /var/www/beta.pterodactyl.io/html/app/Http/Middleware/LanguageMiddleware.php(58): Illuminate\Routing\Pipeline->Illuminate\Routing\{closure}(Object(Illuminate\Http\Request))
#51 [internal function]: Pterodactyl\Http\Middleware\LanguageMiddleware->handle(Object(Illuminate\Http\Request), Object(Closure))
#52 /var/www/beta.pterodactyl.io/html/bootstrap/cache/compiled.php(9604): call_user_func_array(Array, Array)
#53 [internal function]: Illuminate\Pipeline\Pipeline->Illuminate\Pipeline\{closure}(Object(Illuminate\Http\Request))
#54 /var/www/beta.pterodactyl.io/html/vendor/laravel/framework/src/Illuminate/Routing/Pipeline.php(32): call_user_func(Object(Closure), Object(Illuminate\Http\Request))
#55 /var/www/beta.pterodactyl.io/html/bootstrap/cache/compiled.php(13039): Illuminate\Routing\Pipeline->Illuminate\Routing\{closure}(Object(Illuminate\Http\Request))
#56 [internal function]: Illuminate\View\Middleware\ShareErrorsFromSession->handle(Object(Illuminate\Http\Request), Object(Closure))
#57 /var/www/beta.pterodactyl.io/html/bootstrap/cache/compiled.php(9604): call_user_func_array(Array, Array)
#58 [internal function]: Illuminate\Pipeline\Pipeline->Illuminate\Pipeline\{closure}(Object(Illuminate\Http\Request))
#59 /var/www/beta.pterodactyl.io/html/vendor/laravel/framework/src/Illuminate/Routing/Pipeline.php(32): call_user_func(Object(Closure), Object(Illuminate\Http\Request))
#60 /var/www/beta.pterodactyl.io/html/bootstrap/cache/compiled.php(11613): Illuminate\Routing\Pipeline->Illuminate\Routing\{closure}(Object(Illuminate\Http\Request))
#61 [internal function]: Illuminate\Session\Middleware\StartSession->handle(Object(Illuminate\Http\Request), Object(Closure))
#62 /var/www/beta.pterodactyl.io/html/bootstrap/cache/compiled.php(9604): call_user_func_array(Array, Array)
#63 [internal function]: Illuminate\Pipeline\Pipeline->Illuminate\Pipeline\{closure}(Object(Illuminate\Http\Request))
#64 /var/www/beta.pterodactyl.io/html/vendor/laravel/framework/src/Illuminate/Routing/Pipeline.php(32): call_user_func(Object(Closure), Object(Illuminate\Http\Request))
#65 /var/www/beta.pterodactyl.io/html/bootstrap/cache/compiled.php(12778): Illuminate\Routing\Pipeline->Illuminate\Routing\{closure}(Object(Illuminate\Http\Request))
#66 [internal function]: Illuminate\Cookie\Middleware\AddQueuedCookiesToResponse->handle(Object(Illuminate\Http\Request), Object(Closure))
#67 /var/www/beta.pterodactyl.io/html/bootstrap/cache/compiled.php(9604): call_user_func_array(Array, Array)
#68 [internal function]: Illuminate\Pipeline\Pipeline->Illuminate\Pipeline\{closure}(Object(Illuminate\Http\Request))
#69 /var/www/beta.pterodactyl.io/html/vendor/laravel/framework/src/Illuminate/Routing/Pipeline.php(32): call_user_func(Object(Closure), Object(Illuminate\Http\Request))
#70 /var/www/beta.pterodactyl.io/html/bootstrap/cache/compiled.php(12715): Illuminate\Routing\Pipeline->Illuminate\Routing\{closure}(Object(Illuminate\Http\Request))
#71 [internal function]: Illuminate\Cookie\Middleware\EncryptCookies->handle(Object(Illuminate\Http\Request), Object(Closure))
#72 /var/www/beta.pterodactyl.io/html/bootstrap/cache/compiled.php(9604): call_user_func_array(Array, Array)
#73 [internal function]: Illuminate\Pipeline\Pipeline->Illuminate\Pipeline\{closure}(Object(Illuminate\Http\Request))
#74 /var/www/beta.pterodactyl.io/html/vendor/laravel/framework/src/Illuminate/Routing/Pipeline.php(32): call_user_func(Object(Closure), Object(Illuminate\Http\Request))
#75 /var/www/beta.pterodactyl.io/html/bootstrap/cache/compiled.php(3154): Illuminate\Routing\Pipeline->Illuminate\Routing\{closure}(Object(Illuminate\Http\Request))
#76 [internal function]: Illuminate\Foundation\Http\Middleware\CheckForMaintenanceMode->handle(Object(Illuminate\Http\Request), Object(Closure))
#77 /var/www/beta.pterodactyl.io/html/bootstrap/cache/compiled.php(9604): call_user_func_array(Array, Array)
#78 [internal function]: Illuminate\Pipeline\Pipeline->Illuminate\Pipeline\{closure}(Object(Illuminate\Http\Request))
#79 /var/www/beta.pterodactyl.io/html/vendor/laravel/framework/src/Illuminate/Routing/Pipeline.php(32): call_user_func(Object(Closure), Object(Illuminate\Http\Request))
#80 /var/www/beta.pterodactyl.io/html/vendor/dingo/api/src/Http/Middleware/Request.php(95): Illuminate\Routing\Pipeline->Illuminate\Routing\{closure}(Object(Illuminate\Http\Request))
#81 [internal function]: Dingo\Api\Http\Middleware\Request->handle(Object(Illuminate\Http\Request), Object(Closure))
#82 /var/www/beta.pterodactyl.io/html/bootstrap/cache/compiled.php(9604): call_user_func_array(Array, Array)
#83 [internal function]: Illuminate\Pipeline\Pipeline->Illuminate\Pipeline\{closure}(Object(Illuminate\Http\Request))
#84 /var/www/beta.pterodactyl.io/html/vendor/laravel/framework/src/Illuminate/Routing/Pipeline.php(32): call_user_func(Object(Closure), Object(Illuminate\Http\Request))
#85 [internal function]: Illuminate\Routing\Pipeline->Illuminate\Routing\{closure}(Object(Illuminate\Http\Request))
#86 /var/www/beta.pterodactyl.io/html/bootstrap/cache/compiled.php(9594): call_user_func(Object(Closure), Object(Illuminate\Http\Request))
#87 /var/www/beta.pterodactyl.io/html/bootstrap/cache/compiled.php(2304): Illuminate\Pipeline\Pipeline->then(Object(Closure))
#88 /var/www/beta.pterodactyl.io/html/bootstrap/cache/compiled.php(2288): Illuminate\Foundation\Http\Kernel->sendRequestThroughRouter(Object(Illuminate\Http\Request))
#89 /var/www/beta.pterodactyl.io/html/public/index.php(53): Illuminate\Foundation\Http\Kernel->handle(Object(Illuminate\Http\Request))
#90 {main}  

Potential for accidental overwrite of server daemonSecret

The code below ends up changing the daemon secret depending on which user is viewing the server, which works as intended. However, there is the potential for accidentally overwriting the daemonSecret if we make a ->save() request off of the result from this class function.

if(!is_null($result)) {
    $result->daemonSecret = self::getUserDaemonSecret($result);
}

?/?/?/? (folders?)

This picture describes it well.

For some reason MC containers make a folder named ? (which frankly is how I feel about it.) which breaks the file manager when you click on it.

Ability to move servers to new node.

Have the ability to transfer servers between nodes. Using the built in sftp system to transfer directly between nodes. To move servers to other geographical locations.

Themeing support

Have a quick way to add themes for the panel. Allowing for large graphical overhaul of the panel.

Can be convenient for a provider to differentiate their panel from others.

Password updated change password incorrectly

In the /admin/accounts/view/ pages when you change a password it updates but no to the correct password.

It updated the passwords in plaintext and not encrypting the passwords in the db.

Exception handler needs rework

The current exception handler needs a rework to better display and log exceptions that it catches. Sometimes it catches exceptions but never actually reports or logs that exception making it hard to diagnose.

Solution would be to clean up the handler so that any exception is logged by it (and not in the file in which it is currently occurring) so that we can make sure everything is logged.

Issue at the request of Tactical Fish

Tactical Fish wants that I post here some informations after executing some commands:

uname -a :
Linux vps239092.ovh.net 3.16.0-4-amd64 #1 SMP Debian 3.16.7-ckt20-1+deb8u1 (2015-12-14) x86_64 GNU/Linux

php -v:
PHP 5.6.17-0+deb8u1 (cli) (built: Jan 13 2016 09:10:12)
Copyright (c) 1997-2015 The PHP Group
Zend Engine v2.6.0, Copyright (c) 1998-2015 Zend Technologies
with Zend OPcache v7.0.6-dev, Copyright (c) 1999-2015, by Zend Technologies

php -m
[PHP Modules]
bcmath
bz2
calendar
Core
ctype
curl
date
dba
dom
ereg
exif
fileinfo
filter
ftp
gd
gettext
hash
iconv
json
libxml
mbstring
mcrypt
mhash
mysql
mysqli
openssl
pcntl
pcre
PDO
pdo_mysql
Phar
posix
readline
Reflection
session
shmop
SimpleXML
soap
sockets
SPL
standard
sysvmsg
sysvsem
sysvshm
tokenizer
wddx
xml
xmlreader
xmlwriter
Zend OPcache
zip
zlib

[Zend Modules]
Zend OPcache

Thanks! :)

Redesign using Semantic UI

This is open for discussion from everyone. I am considering rewriting the front-end design using Semantic UI (found here). Personally I think it looks much better and is more feature rich than bootstrap.

Composer create homestead files

@citricsquid suggested the following to have composer setup homestead rather than using the example file.

php vendor/bin/homestead make --ip=192.168.10.32", "sed -i '' 's/homestead.app/pterodactyl.local/g' Homestead.yaml

Server suspension

Add support for suspending servers, requires new feature branch features/suspension

DB::beginTransaction exception throwing

Throwing an exception within DB::beginTransaction will fail to register in the parent try/catch block. Basically, this code fails:

DB::beginTransaction();

// logic checking here
throw new DisplayException('Some Exception');

try {
    DB::commit();
} catch (\Exception $ex) {
    throw $ex;
}

This code works:

DB::beginTransaction();

try {
    // logic checking here
    throw new DisplayException('Some Exception');

    DB::commit();
} catch (\Exception $ex) {
    throw $ex;
}

There are probably a few places throughout the code that use the broken setup which makes it hard to debug errors since nothing is displayed, it just fails.

API logs

Would be cool to make it so that every action done on the API is logged into the database so that you can monitor and have an audit log of actions that occur.

Button to show SFTP password after it has been set

When multiple sub-users are working on one server it can be quite a hassle to keep track of the current SFTP password. To fix this issue a button within the panel to reveal the current password would be really helpful.

Simple issue as requested on Discord

Server creation logic

Due to the potential for the server creation on the daemon to take awhile (i.e. new image or image update) we should send a HTTP/202 response as soon as we process the request, and then notify the panel of a successful install using the normal install endpoint, and also include an endpoint to hit if there was an error.

If that error endpoint is hit, the panel immediately deletes the server and associated systems with it.

This system should also allow configuration so that the panel can hit additional endpoints on other services on success or failure for ease of integration with billing systems.

128 core server crashes panel due to data socket

Apparently our JS is too poorly written to handle tracking 128 individual cores on a server. Perhaps we should set a limit of showing like 8 of them in the graph, otherwise combine them all into a single thing.

Cannot upload files

The permission for uploading files is missing from requests it seems, that or there is some daemon bug going on.

Migration Bug

For whatever reason the migration does not run the change migration for the code below. It might be renaming and not changing?

public function up()
{
    Schema::table('nodes', function (Blueprint $table) {
        $table->string('https', 5)->default('http')->change();
        $table->renameColumn('https', 'scheme');
    });
}

User associated servers wrong

The associated servers when viewing a user display all servers on the system rather than the ones they are assigned to.

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.