tablexi / capistrano3-unicorn Goto Github PK
View Code? Open in Web Editor NEWLicense: MIT License
License: MIT License
Hi,
I'm doing an investigation on the capistrano unicorn plugins..
The goal for my rails app deployment would be to deploy it with minimum hassle and boilerplate using the standard unicorn (+nginx + postgres) deployment process.
I noticed both this plugin and the capistrano2 one here do not have the support for unicorn.rb
config file template.
Is there a specific reason why the support for that was omitted? (maybe it's a bad practice of some kind, or it's best for everyone to learn how to write their own unicorn config file, I have no idea)
On the other hand, this guy here implemented a support for it.
As a "dumb" user, I'd really prefer all of that boilerplate is handled for me with sane defaults, and the ability to override for those hackers out there.
Is this a feature that would be welcomed if a pull request was submitted to this plugin?
Thanks!
Hey,
I run deploy unicorn:start and I see of error:
[3905a1bb] Command: [ -e /home/ubuntu/apps/prs/current/tmp/pids/unicorn.pid ] && kill -0 `cat /home/ubuntu/apps/prs/current/tmp/pids/unicorn.pid`
DEBUG [3905a1bb] Finished in 0.095 seconds with exit status 1 (failed).
In deploy.rb I have:
set :unicorn_pid, "/home/ubuntu/apps/prts/current/tmp/pids/unicorn.pid"
Hello,
I had a missing require in my app that made unicorn throw an error and stop during cap production deploy. Shouldn't this stop the deploy process?
I figured, this line prevents new instance of unicorn from starting if old instance has already been running:
As a result, neither of the instances is running:
ruby/2.1.0/gems/unicorn-4.8.3/lib/unicorn/socket_helper.rb:158:in `initialize': Address already in use - connect(2)
So I end up having every second deploy failed. Magically, if I just comment the line, it works.
I have setup by follow your instruction.
But when I run cap production unicorn:start.
It show unicorn.pid not writable (ArgumentError), and unicorn doesn't start.
I upgraded capistrano from 3.0 to 3.1 and start using this gem. But after each deployment, the rails app is not responding very fast and I was wondering if there are any problem with this gem.
I noticed in my unicorn config file in before_fork
block, it already tried to kill the old bin. But in https://github.com/tablexi/capistrano3-unicorn/blob/master/lib/capistrano3/tasks/unicorn.rake#L68
it tries to kill the old bin again? Is my understanding correct?
Could anyone also help to check the following file and log to see if there is any problem?
Thanks
My unicorn config file and capistrano3 log are appended.
Here is my unicorn config file:
# unicorn_rails -c /var/www/wanhuatong/current/config/server/unicorn.rb -E production -D
DEPLOY_TO = "/var/www/wanhuatong"
APP_ROOT = DEPLOY_TO + "/current"
SHARED_ROOT = DEPLOY_TO + "/shared"
stderr_path SHARED_ROOT + "/log/unicorn.stderr.log"
stdout_path SHARED_ROOT + "/log/unicorn.stdout.log"
listen SHARED_ROOT + "/tmp/sockets/unicorn.socket"
timeout 30
PID_FILE = SHARED_ROOT + "/tmp/pids/unicorn.pid"
pid PID_FILE
working_directory APP_ROOT
preload_app true
if GC.respond_to?(:copy_on_write_friendly=)
GC.copy_on_write_friendly = true
end
before_fork do |server, worker|
##
# When sent a USR2, Unicorn will suffix its pidfile with .oldbin and
# immediately start loading up a new version of itself (loaded with a new
# version of our app). When this new Unicorn is completely loaded
# it will begin spawning workers. The first worker spawned will check to
# see if an .oldbin pidfile exists. If so, this means we've just booted up
# a new Unicorn and need to tell the old one that it can now die. To do so
# we send it a QUIT.
#
# Using this method we get 0 downtime deploys.
old_pid = PID_FILE + '.oldbin'
if File.exists?(old_pid) && server.pid != old_pid
begin
Process.kill("QUIT", File.read(old_pid).to_i)
rescue Errno::ENOENT, Errno::ESRCH
# someone else did our job for us
end
end
if defined?(ActiveRecord::Base)
ActiveRecord::Base.connection.disconnect!
end
end
after_fork do |server, worker|
##
# Unicorn master loads the app then forks off workers - because of the way
# Unix forking works, we need to make sure we aren't using any of the parent's
# sockets, e.g. db connection
if defined?(ActiveRecord::Base)
ActiveRecord::Base.establish_connection
end
end
The following is Invoke deploy:restart
** Invoke deploy:restart (first_time)
** Execute deploy:restart
** Invoke unicorn:restart (first_time)
** Execute unicorn:restart
** Invoke unicorn:start (first_time)
** Execute unicorn:start
DEBUG [206ed16e] Running /usr/bin/env if test ! -d /var/www/wanhuatong/current; then echo "Directory does not exist '/var/www/wanhuatong/current'" 1>&2; false; fi on wanhuatong.ca
DEBUG [206ed16e] Command: if test ! -d /var/www/wanhuatong/current; then echo "Directory does not exist '/var/www/wanhuatong/current'" 1>&2; false; fi
DEBUG [206ed16e] Finished in 0.151 seconds with exit status 0 (successful).
DEBUG [ce55cdc5] Running /usr/bin/env [ -e /var/www/wanhuatong/current/tmp/pids/unicorn.pid ] && kill -0 `cat /var/www/wanhuatong/current/tmp/pids/unicorn.pid` on wanhuatong.ca
DEBUG [ce55cdc5] Command: [ -e /var/www/wanhuatong/current/tmp/pids/unicorn.pid ] && kill -0 `cat /var/www/wanhuatong/current/tmp/pids/unicorn.pid`
DEBUG [ce55cdc5] Finished in 0.171 seconds with exit status 0 (successful).
INFO unicorn is running...
DEBUG [a410b841] Running /usr/bin/env if test ! -d /var/www/wanhuatong/current; then echo "Directory does not exist '/var/www/wanhuatong/current'" 1>&2; false; fi on wanhuatong.ca
DEBUG [a410b841] Command: if test ! -d /var/www/wanhuatong/current; then echo "Directory does not exist '/var/www/wanhuatong/current'" 1>&2; false; fi
DEBUG [a410b841] Finished in 0.138 seconds with exit status 0 (successful).
INFO unicorn restarting...
INFO [cea39383] Running /usr/bin/env kill -s USR2 `cat /var/www/wanhuatong/current/tmp/pids/unicorn.pid` on wanhuatong.ca
DEBUG [cea39383] Command: cd /var/www/wanhuatong/current && /usr/bin/env kill -s USR2 `cat /var/www/wanhuatong/current/tmp/pids/unicorn.pid`
INFO [cea39383] Finished in 0.258 seconds with exit status 0 (successful).
INFO [38df785a] Running /usr/bin/env sleep 3 on wanhuatong.ca
DEBUG [38df785a] Command: cd /var/www/wanhuatong/current && /usr/bin/env sleep 3
INFO [38df785a] Finished in 3.146 seconds with exit status 0 (successful).
DEBUG [1cc3167d] Running /usr/bin/env [ -e /var/www/wanhuatong/current/tmp/pids/unicorn.pid.oldbin ] on wanhuatong.ca
DEBUG [1cc3167d] Command: [ -e /var/www/wanhuatong/current/tmp/pids/unicorn.pid.oldbin ]
DEBUG [1cc3167d] Finished in 0.135 seconds with exit status 0 (successful).
INFO [f8bf9cd3] Running /usr/bin/env kill -s QUIT `cat /var/www/wanhuatong/current/tmp/pids/unicorn.pid.oldbin` on wanhuatong.ca
DEBUG [f8bf9cd3] Command: cd /var/www/wanhuatong/current && /usr/bin/env kill -s QUIT `cat /var/www/wanhuatong/current/tmp/pids/unicorn.pid.oldbin`
INFO [f8bf9cd3] Finished in 0.164 seconds with exit status 0 (successful).
** Invoke deploy:clear_cache (first_time)
** Execute deploy:clear_cache
** Invoke deploy:published (first_time)
** Execute deploy:published
** Invoke deploy:finishing (first_time)
** Execute deploy:finishing
** Invoke deploy:cleanup (first_time)
** Execute deploy:cleanup
DEBUG [f1f8a09f] Running /usr/bin/env ls -x /var/www/wanhuatong/releases on wanhuatong.ca
DEBUG [f1f8a09f] Command: /usr/bin/env ls -x /var/www/wanhuatong/releases
DEBUG [f1f8a09f] Finished in 1.584 seconds with exit status 0 (successful).
DEBUG [f1f8a09f] 20140320033805 20140322000442 20140322023114 20140322185639 20140323022953
DEBUG [f1f8a09f] 20140325145746
DEBUG [f1f8a09f] Finished in 1.584 seconds with exit status 0 (successful).
INFO Keeping 5 of 6 deployed releases on wanhuatong.ca
INFO [e646f2eb] Running /usr/bin/env rm -rf /var/www/wanhuatong/releases/20140320033805 on wanhuatong.ca
DEBUG [e646f2eb] Command: /usr/bin/env rm -rf /var/www/wanhuatong/releases/20140320033805
INFO [e646f2eb] Finished in 1.946 seconds with exit status 0 (successful).
** Invoke deploy:finished (first_time)
** Execute deploy:finished
** Invoke deploy:log_revision (first_time)
** Execute deploy:log_revision
DEBUG [c35ccf37] Running /usr/bin/env if test ! -d /var/www/wanhuatong/releases; then echo "Directory does not exist '/var/www/wanhuatong/releases'" 1>&2; false; fi on wanhuatong.ca
DEBUG [c35ccf37] Command: if test ! -d /var/www/wanhuatong/releases; then echo "Directory does not exist '/var/www/wanhuatong/releases'" 1>&2; false; fi
DEBUG [c35ccf37] Finished in 0.284 seconds with exit status 0 (successful).
INFO [7a6ec397] Running /usr/bin/env echo "Branch master (at c7f2811) deployed as release 20140325145746 by zhao; " >> /var/www/wanhuatong/revisions.log on wanhuatong.ca
DEBUG [7a6ec397] Command: echo "Branch master (at c7f2811) deployed as release 20140325145746 by zhao; " >> /var/www/wanhuatong/revisions.log
INFO [7a6ec397] Finished in 0.548 seconds with exit status 0 (successful).
The first time unicorn:stop is executed the first unicorn is put to bed and an error is thrown. If you run unicorn:stop again the script passes successfully.
SSHKit::Runner::ExecuteError: Exception while executing as deploy@<ip>: undefined method `recv' for #<IO:fd 17>
NoMethodError: undefined method `recv' for #<IO:fd 17>
I've got problem with stopping unicorn. Every time unicorn:stop returns unicorn is not running..., while unicorn working just fine.
unicorn:start works correctly run once. But run twice (one by one) should start unicorn once and then report info "unicorn is running...". But it tries to run unicorn again.
According to that, there is some problem with setting unicorn_pid by unicorn.rake.
I'm using this unicorn config, but when I prompt cap unicorn:reload and cap unicorn:restart, the code is not updated, have you an example to fix it?
before_fork do |server, worker|
Signal.trap 'TERM' do
puts 'Unicorn master intercepting TERM and sending myself QUIT instead'
Process.kill 'QUIT', Process.pid
end
defined?(ActiveRecord::Base) and
ActiveRecord::Base.connection.disconnect!
end
after_fork do |server, worker|
Signal.trap 'TERM' do
puts 'Unicorn worker intercepting TERM and doing nothing. Wait for master to send QUIT'
end
defined?(ActiveRecord::Base) and
ActiveRecord::Base.establish_connection
end
Ruby/coopetraban/admin_coopetraban[master*]% cap qa unicorn:restart
DEBUG [c91a0bb6] Running /usr/bin/env if test ! -d /home/pc1/administacion/current; then echo "Directory does not exist '/home/pc1/administacion/current'" 1>&2; false; fi on 192.168.1.200
DEBUG [c91a0bb6] Command: if test ! -d /home/pc1/administacion/current; then echo "Directory does not exist '/home/pc1/administacion/current'" 1>&2; false; fi
DEBUG [c91a0bb6] Finished in 0.169 seconds with exit status 0 (successful).
DEBUG [15616907] Running /usr/bin/env [ -e /tmp/pids/administracion.pid ] && kill -0 `cat /tmp/pids/administracion.pid` on 192.168.1.200
DEBUG [15616907] Command: [ -e /tmp/pids/administracion.pid ] && kill -0 `cat /tmp/pids/administracion.pid`
DEBUG [15616907] Finished in 0.009 seconds with exit status 0 (successful).
INFO unicorn is running...
DEBUG [aa8e2700] Running /usr/bin/env if test ! -d /home/pc1/administacion/current; then echo "Directory does not exist '/home/pc1/administacion/current'" 1>&2; false; fi on 192.168.1.200
DEBUG [aa8e2700] Command: if test ! -d /home/pc1/administacion/current; then echo "Directory does not exist '/home/pc1/administacion/current'" 1>&2; false; fi
DEBUG [aa8e2700] Finished in 0.008 seconds with exit status 0 (successful).
INFO unicorn restarting...
INFO [7f13ac3a] Running /usr/bin/env kill -s USR2 `cat /tmp/pids/administracion.pid` on 192.168.1.200
DEBUG [7f13ac3a] Command: cd /home/pc1/administacion/current && /usr/bin/env kill -s USR2 `cat /tmp/pids/administracion.pid`
INFO [7f13ac3a] Finished in 0.013 seconds with exit status 0 (successful).
INFO [b53bc99b] Running /usr/bin/env sleep 3 on 192.168.1.200
DEBUG [b53bc99b] Command: cd /home/pc1/administacion/current && /usr/bin/env sleep 3
INFO [b53bc99b] Finished in 3.035 seconds with exit status 0 (successful).
DEBUG [b88587a8] Running /usr/bin/env [ -e /tmp/pids/administracion.pid.oldbin ] on 192.168.1.200
DEBUG [b88587a8] Command: [ -e /tmp/pids/administracion.pid.oldbin ]
DEBUG [b88587a8] Finished in 0.012 seconds with exit status 0 (successful).
INFO [4068118d] Running /usr/bin/env kill -s QUIT `cat /tmp/pids/administracion.pid.oldbin` on 192.168.1.200
DEBUG [4068118d] Command: cd /home/pc1/administacion/current && /usr/bin/env kill -s QUIT `cat /tmp/pids/administracion.pid.oldbin`
INFO [4068118d] Finished in 0.012 seconds with exit status 0 (successful).
When Unicorn is not runing and unicorn:restart or unicorn:reload fires it up, it also sends a reload/restart signal to the Unicorn too, which causes Unicorn to fork, but after it the oldbin did not get a QUIT signal.
I think Cap should not do this.
Version: capistrano3-unicorn (0.2.1)
Codes (only relevant pieces):
# config/deploy.rb
set :unicorn_config_path, -> { "#{release_path}/config/unicorn.rb" }
set :unicorn_rack_env, -> { fetch(:rails_env, 'development') }
namespace :deploy do
after :publishing, :restart
task(:restart) { invoke 'unicorn:restart' }
task(:stop) { invoke 'unicorn:stop' }
after :finishing, "deploy:cleanup"
end
# Capfile
# Load DSL and set up stages
require 'capistrano/multiconfig'
# Include default deployment tasks
require 'capistrano/deploy'
require 'capistrano/rvm'
require 'capistrano/bundler'
require 'capistrano/rails/assets' # for asset handling add
require 'capistrano/rails/migrations' # for running migrations
require 'capistrano3/unicorn'
i noticed unicorn is not reloading the application code, because it uses the old release path.
i think the issue is that unicorn uses within release_path
instead of within current_path
when starting unicorn. i'm using preload_app true
and after :publishing, :restart
. everything works as expected (spawning new master, killing old), except that i don't see any changes picked up. i noticed the line INFO -- : executing ["/var/www/trendmd/shared/bundle/ruby/2.1.0/bin/unicorn", "-c", "/var/www/trendmd/current/config/unicorn/staging.rb", "-E", "deployment", "-D", {11=>#<Kgio::UNIXServer:fd 11>}] (in /var/www/trendmd/releases/20140131104303)
in my unicorn.log (note, the path releases/20140131104303 was the last deploy when unicorn was started not the current release e.g. releases/20140203160510), and if i cat /proc/$master_pid/environment
i see:
...snip...
PWD=/var/www/trendmd/releases/20140131104303
RBENV_DIR=/var/www/trendmd/releases/20140131104303
BUNDLE_GEMFILE=/var/www/trendmd/releases/20140131104303/Gemfile
...snip...
i guess BUNDLE_GEMFILE
comes from capistrano/bundler (i'm also using capistrano/rbenv but i don't see any explicit use of release_path like in capistrano/bundler), not sure if it's a problem.
i'm not sure if i missed something, but i verified that if i simply change the within release_path
to current_path
in the capistrano3-unicorn unicorn:start task, manually kill the unicorn and have start it with this, then it picks up application changes on new deploys (the unicorn.log still logs explicit path (eg not /current
), but it gets refreshed, and PWD is /var/www/trendmd/current
, RBENV_DIR is also current, BUNDLE_GEMFILE still points to old release though).
unrelated issue: i'm not sure why :unicorn_pid
defaults to shared/pids/unicorn.pid
instead of shared/tmp/pids/unicorn.pid
(capistrano default template uses shared/tmp
)
deploy.rb
lock '3.11.0'
....
set :unicorn_exec, :unicorn_rails
...
namespace :unicorn do
before :start, :logging
task :logging do
on roles :app do
execute :echo, fetch(:unicorn_exec)
end
end
end
and execute log is below.
sizer@geb:~/capistrano3-unicorn-test
$ bundle exec cap staging unicorn:start
00:00 unicorn:logging
01 echo unicorn_rails
01 unicorn_rails
✔ 01 centos@staging 0.178s
00:00 unicorn:start
01 RBENV_ROOT=~/.rbenv/ RBENV_VERSION=2.4.5 ~/.rbenv/bin/rbenv exec bundle exec unicorn -c ./config/unicorn.rb -E staging -D
✔ 01 centos@staging 9.317s
echo returns 'unicorn_rails'
correctly, but unicorn:start returns default value... 🤔
execute() has a subtle behaviour. When calling within './directory' { execute(:bundle, :install) } for example, the first argument to execute() is a Stringish with no whitespace. This allows the command to pass through the SSHKit::CommandMap which enables a number of powerful features.
https://capistranorb.com/documentation/getting-started/tasks/
I recommend that removing whitespace
from tasks/unicorn.rake
.
I'm trying to use this to reload each server in sequence, but all of the reloads are executed at once. I'm guessing it might have something to do with nested on
blocks, since unicorn:reload already has an on
.
desc 'Restart application'
task :restart do
on roles(:app), in: :sequence, wait: 15 do
invoke 'unicorn:reload'
end
end
Restart hook is not called.
Unicorn won't restart.
My server is ubuntu 14.04. I can't see the unicorn service in /etc/init.d, and I can't service unicorn restart
or service unicorn_myapp restart
. Otherwise - the process id remains the same as it was, while the workers' process ids are changed ( I don't really know what it means)
The only way to restart and get a new process id is to kill -9 <process_id>
and then to cap production deploy
again.
If I don't do so, each time I add a new route it just can't be found...
Here is my capistrano deploy script:
set :application, 'myapp'
set :repo_url, '[email protected]:/opt/git/myapp.git'
ask :branch, proc { `git rev-parse --abbrev-ref HEAD`.chomp }.call
set :use_sudo, false
set :bundle_binstubs, nil
# set :linked_files, fetch(:linked_files, []).push('config/mongoid.yml')
set :linked_dirs, fetch(:linked_dirs, []).push('log', 'tmp/pids', 'tmp/cache', 'tmp/sockets', 'vendor/bundle', 'public/system')
after 'deploy:publishing', 'deploy:restart'
namespace :deploy do
task :restart do
invoke 'unicorn:reload'
end
end
Capistrano will create a /path/to/app/shared/tmp/pids
folder, which is supposed to hold pid files like unicorn.pid
. I'm suggesting changing default :unicorn_pid
from CURRENT_PATH/tmp/pids/unicorn.pid
to SHARED_PATH/tmp/pids/unicorn.pid
.
I have a ecommerce website. At the time of checkout when it crop images and send the emails, unicorn stops working. It doesn't happen always but yes 50% of time it happens. which is very frustrating for me as well as my client.
I'm not sure if I missed something but if I run bundle exec cap production unicorn:start
it fails because rails_env
is not set. With bundle exec cap production deploy:set_rails_env unicorn:start
it works as expected.
INFO -- : executing ["/home/shared/bundle/ruby/2.1.0/bin/unicorn", "-c", "/home/current/config/unicorn/production.rb", "-E", "deployment", "-D", {12=>#<Kgio::UNIXServer:fd 12>}] (in /home/releases/20140714144301)
DEBUG[b59ba27c] I, [2014-07-14T14:43:33.495683 #27897] INFO -- : forked child re-executing...
DEBUG[b59ba27c] /home/
DEBUG[b59ba27c] lic/.rvm/gems/ruby-2.1.2@global/gems/bundler-1.6.3/lib/bundler/definition.rb:23:in `build': /home/releases/20140710032913/Gemfile not found (Bundler::GemfileNotFound)
I am pretty sure the problem stems from the fact that with zero-downtime deployment, unicorn is caching this release number: 20140710032913. I have capistrano set to keep 5 releases. After 5 deploys, the old release number is rolled off. How can I force unicorn to use the current Gemfile?
I would like to ask why the PID is expected to be found inside the current path
I am relative new to Ruby deployment and just got capistrano working for me. So there goes one dumb assumption:
The unicorn process will be launched within the current
folder, so if this contains 'tmp/' with the PID, it will be gone (rotated) by next cap production deploy
Wouldn't it be better to use by default ../shared
(from current
folder)
unicorn:restart invoke a new unicorn process but does not kill the old one. According to http://unicorn.bogomips.org/SIGNALS.html, USR2 + QUIT is required to restart unicorn, but unicorn:restart only send USR2.
Am I using it in the wrong way? Currently I've switched to unicorn:legacy_restart which works fine.
I'm trying to use this gem to run unicorn in my staging server, but my deploys aren't working with the unicorn command given... and manually I could see that is -E deployment
the problem.
If I run manually with -E staging
, it's running fine.
I'm using ruby 2.1.2, rails 4.1, capistrano 3.1, on a ubuntu 14.04 server.
my cap command is cap staging deploy
and I have a proper file (environments/staging.rb) to handle this server.
What I'm doing wrong?
If you guys need some more information, ask me please.
Thanks
command: set_release_path
Otherwise it will prompt the error:Bundler::GemfileNotFound: /home/live/rails_gems_tool/current/Gemfile not found
I issue a unicorn:stop is says unicorn is running but when I do a process show it is still running.
I would like my unicor:start
task to execute a command like this:
KEY="xyz" bundle exec unicorn -c ./config/unicorn/staging.rb -E staging -D && tail -f ~/logs/app-stderr.log
Is there a way to add the KEY="xyz"
piece (I believe in rails, this is an environment variable)?
I'm facing this problem when I deploy a dashing project: When run "Cap Env deploy", the dashboard is not able to communicate with the events.
But if I ssh the instance and manually runs the start rake it works:
PATH=
/.rbenv/shims:/.rbenv/bin:$PATH RBENV_ROOT=/opt/rbenv RBENV_VERSION=2.1.1 RAILS_ENV=staging RBENV_ROOT=/opt/rbenv RBENV_VERSION=2.1.1 /opt/rbenv/bin/rbenv exec bundle exec unicorn -c /var/www/application/current/config/unicorn/config.rb -E deployment -D
I have tried to modify the task and the rbenv setting but still the problem is there. I have made a post to document the problem because is happening also with Puma.
http://www.joseantoniopio.com/programming/deploying-dashing-with-unicorn-or-puma/
Can someone help me to find the issue?
I am getting
undefined method `verbosity' for "/usr/bin/env unicorn:restart\n":String
with
set :application, '...'
set :repo_url, '...'
set :deploy_to, '/var/www/path/'
namespace :deploy do
desc 'Restart application'
task :restart do
on roles(:app), in: :sequence, wait: 5 do
# Your restart mechanism here, for example:
# execute :touch, release_path.join('tmp/restart.txt')
invoke 'unicorn:restart'
end
end
after :restart, :clear_cache do
on roles(:web), in: :groups, limit: 3, wait: 10 do
# Here we can do anything such as:
# within release_path do
# execute :rake, 'cache:clear'
# end
end
end
after :finishing, 'deploy:cleanup'
end
Will try to debug later today.
I'm currently using the latest version of both unicorn and capistrano, and when unicorn:restart
gets invoked, there isn't any output and unicorn isn't started.
I ran cap production unicorn:restart
just to be sure, but again, nothing happens.
I have my <current_path>/tmp/pids
directory linked, and setup through unicorn to hold its pid file there.
A declarative, efficient, and flexible JavaScript library for building user interfaces.
🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.
TypeScript is a superset of JavaScript that compiles to clean JavaScript output.
An Open Source Machine Learning Framework for Everyone
The Web framework for perfectionists with deadlines.
A PHP framework for web artisans
Bring data to life with SVG, Canvas and HTML. 📊📈🎉
JavaScript (JS) is a lightweight interpreted programming language with first-class functions.
Some thing interesting about web. New door for the world.
A server is a program made to process requests and deliver data to clients.
Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.
Some thing interesting about visualization, use data art
Some thing interesting about game, make everyone happy.
We are working to build community through open source technology. NB: members must have two-factor auth.
Open source projects and samples from Microsoft.
Google ❤️ Open Source for everyone.
Alibaba Open Source for everyone
Data-Driven Documents codes.
China tencent open source team.