dmikusa / cf-php-apache-buildpack Goto Github PK
View Code? Open in Web Editor NEWCloudFoundry PHP & Apache HTTPD Buildpack
License: Apache License 2.0
CloudFoundry PHP & Apache HTTPD Buildpack
License: Apache License 2.0
Hi,
is it possible to add zlib support to the php binary. Or is there a way to do it myself?
I tried adding (compiled) zlib.so binaries to my /lib folder, but this does not work.
I also added the extension to the php.ini and enabled zlib, but no success.
Uploading aphpdemo... OK Preparing to start aphpdemo... OK -----> Downloaded app package (4.0K) Initialized empty Git repository in /tmp/buildpacks/cf-php-apache-buildpack.git/.git/ Installing cf-php-apache-buildpack.git. Configuring HTTPD Version: 2.2.24 Traceback (most recent call last): File "/tmp/buildpacks/cf-php-apache-buildpack.git/bin/compile", line 112, in <module> os.path.join(BP_DIR, "default", "shasums", "%s.sha1" % httpd_bin_file)) File "/tmp/buildpacks/cf-php-apache-buildpack.git/bin/compile", line 30, in download_url res = urllib2.urlopen(url) File "/usr/lib/python2.6/urllib2.py", line 126, in urlopen return _opener.open(url, data, timeout) File "/usr/lib/python2.6/urllib2.py", line 397, in open response = meth(req, response) File "/usr/lib/python2.6/urllib2.py", line 510, in http_response 'http', request, response, code, msg, hdrs) File "/usr/lib/python2.6/urllib2.py", line 435, in error return self._call_chain(*args) File "/usr/lib/python2.6/urllib2.py", line 369, in _call_chain result = func(*args) File "/usr/lib/python2.6/urllib2.py", line 518, in http_error_default raise HTTPError(req.get_full_url(), code, msg, hdrs, fp) urllib2.HTTPError: HTTP Error 404: NOT FOUND /var/vcap/packages/dea_next/buildpacks/lib/installer.rb:17:in
compile': Buildpack compilation step failed: (RuntimeError)
from /var/vcap/packages/dea_next/buildpacks/lib/buildpack.rb:26:in block in compile_with_timeout' from /usr/lib/ruby/1.9.1/timeout.rb:68:in
timeout'
from /var/vcap/packages/dea_next/buildpacks/lib/buildpack.rb:25:in compile_with_timeout' from /var/vcap/packages/dea_next/buildpacks/lib/buildpack.rb:16:in
block in stage_application'
from /var/vcap/packages/dea_next/buildpacks/lib/buildpack.rb:12:in chdir' from /var/vcap/packages/dea_next/buildpacks/lib/buildpack.rb:12:in
stage_application'
from /var/vcap/packages/dea_next/buildpacks/bin/run:10:in <main>' Checking status of app 'aphpdemo'...Application failed to stage
Due to https://dl.dropboxusercontent.com/u/186123235/binaries (DOWNLOAD_URL from the default folder) returning 404.
Hello, I'm not sure if this is a problem with the buildpack, cloud foundry, or something on our end; however, we haven't changed anything recently and it looks like there were some changes committed recently to this buildpack so I thought I would start here (I apologize in advance if I'm in the wrong spot :-) )
Here is the error that we are getting when we try to push a new app to cloud foundry:
...
Initialized empty Git repository in /tmp/buildpacks/cf-php-apache-buildpack/.git/
Started: [2014-01-25 01:12:51.242728]
Custom config found, overriding default options
Configuring HTTPD Version: 2.2.26
Downloading [http://test.repo.standingcloud.net/repo/apps/cloudfoundry/cf-php-apache-buildpack/httpd/2.2/httpd-2.2.26-bin.tar.gz]
Downloaded [/tmp/cache/httpd-2.2.26-bin.tar.gz]
Configuring PHP Version: 5.4.24
Downloading [http://test.repo.standingcloud.net/repo/apps/cloudfoundry/cf-php-apache-buildpack/php/5.4/php-5.4.24-bin.tar.gz]
Checking status of app 'test18'...>>>
REQUEST: GET https://api.run.pivotal.io/v2/apps/89612b80-9b7b-40a7-a177-2b64ad414d0c/instances
REQUEST_HEADERS:
Accept : application/json
Authorization : [PRIVATE DATA HIDDEN]
Content-Length : 0
RESPONSE: [400]
RESPONSE_HEADERS:
connection : keep-alive
content-length : 8852
content-type : application/json;charset=utf-8
date : Sat, 25 Jan 2014 01:12:57 GMT
server : nginx
x-content-type-options : nosniff
x-vcap-request-id : cea950dd-293d-4fe9-a420-667463de3633
RESPONSE_BODY:
{
"backtrace": [
"/var/vcap/packages/cloud_controller_ng/cloud_controller_ng/app/controllers/runtime/instances_controller.rb:11:in `instances'",
"/var/vcap/packages/cloud_controller_ng/cloud_controller_ng/lib/cloud_controller/rest_controller/base.rb:95:in `dispatch'",
"/var/vcap/packages/cloud_controller_ng/cloud_controller_ng/lib/cloud_controller/rest_controller/routes.rb:16:in `block in define_route'",
"/var/vcap/packages/cloud_controller_ng/cloud_controller_ng/vendor/bundle/ruby/1.9.1/gems/sinatra-1.4.3/lib/sinatra/base.rb:1540:in `call'",
"/var/vcap/packages/cloud_controller_ng/cloud_controller_ng/vendor/bundle/ruby/1.9.1/gems/sinatra-1.4.3/lib/sinatra/base.rb:1540:in `block in compile!'",
"/var/vcap/packages/cloud_controller_ng/cloud_controller_ng/vendor/bundle/ruby/1.9.1/gems/sinatra-1.4.3/lib/sinatra/base.rb:950:in `[]'",
"/var/vcap/packages/cloud_controller_ng/cloud_controller_ng/vendor/bundle/ruby/1.9.1/gems/sinatra-1.4.3/lib/sinatra/base.rb:950:in `block (3 levels) in route!'",
"/var/vcap/packages/cloud_controller_ng/cloud_controller_ng/vendor/bundle/ruby/1.9.1/gems/sinatra-1.4.3/lib/sinatra/base.rb:966:in `route_eval'",
"/var/vcap/packages/cloud_controller_ng/cloud_controller_ng/vendor/bundle/ruby/1.9.1/gems/newrelic_rpm-3.7.1.180/lib/new_relic/agent/instrumentation/sinatra.rb:133:in `route_eval_with_newrelic'",
"/var/vcap/packages/cloud_controller_ng/cloud_controller_ng/vendor/bundle/ruby/1.9.1/gems/sinatra-1.4.3/lib/sinatra/base.rb:950:in `block (2 levels) in route!'",
"/var/vcap/packages/cloud_controller_ng/cloud_controller_ng/vendor/bundle/ruby/1.9.1/gems/sinatra-1.4.3/lib/sinatra/base.rb:987:in `block in process_route'",
"/var/vcap/packages/cloud_controller_ng/cloud_controller_ng/vendor/bundle/ruby/1.9.1/gems/sinatra-1.4.3/lib/sinatra/base.rb:985:in `catch'",
"/var/vcap/packages/cloud_controller_ng/cloud_controller_ng/vendor/bundle/ruby/1.9.1/gems/sinatra-1.4.3/lib/sinatra/base.rb:985:in `process_route'",
"/var/vcap/packages/cloud_controller_ng/cloud_controller_ng/vendor/bundle/ruby/1.9.1/gems/newrelic_rpm-3.7.1.180/lib/new_relic/agent/instrumentation/sinatra.rb:116:in `process_route_with_newrelic'",
"/var/vcap/packages/cloud_controller_ng/cloud_controller_ng/vendor/bundle/ruby/1.9.1/gems/sinatra-1.4.3/lib/sinatra/base.rb:948:in `block in route!'",
"/var/vcap/packages/cloud_controller_ng/cloud_controller_ng/vendor/bundle/ruby/1.9.1/gems/sinatra-1.4.3/lib/sinatra/base.rb:947:in `each'",
"/var/vcap/packages/cloud_controller_ng/cloud_controller_ng/vendor/bundle/ruby/1.9.1/gems/sinatra-1.4.3/lib/sinatra/base.rb:947:in `route!'",
"/var/vcap/packages/cloud_controller_ng/cloud_controller_ng/vendor/bundle/ruby/1.9.1/gems/sinatra-1.4.3/lib/sinatra/base.rb:1059:in `block in dispatch!'",
"/var/vcap/packages/cloud_controller_ng/cloud_controller_ng/vendor/bundle/ruby/1.9.1/gems/sinatra-1.4.3/lib/sinatra/base.rb:1041:in `block in invoke'",
"/var/vcap/packages/cloud_controller_ng/cloud_controller_ng/vendor/bundle/ruby/1.9.1/gems/sinatra-1.4.3/lib/sinatra/base.rb:1041:in `catch'",
"/var/vcap/packages/cloud_controller_ng/cloud_controller_ng/vendor/bundle/ruby/1.9.1/gems/sinatra-1.4.3/lib/sinatra/base.rb:1041:in `invoke'",
"/var/vcap/packages/cloud_controller_ng/cloud_controller_ng/vendor/bundle/ruby/1.9.1/gems/sinatra-1.4.3/lib/sinatra/base.rb:1056:in `dispatch!'",
"/var/vcap/packages/cloud_controller_ng/cloud_controller_ng/vendor/bundle/ruby/1.9.1/gems/newrelic_rpm-3.7.1.180/lib/new_relic/agent/instrumentation/sinatra.rb:151:in `dispatch_and_notice_errors_with_newrelic'",
"/var/vcap/packages/cloud_controller_ng/cloud_controller_ng/vendor/bundle/ruby/1.9.1/gems/newrelic_rpm-3.7.1.180/lib/new_relic/agent/instrumentation/sinatra.rb:146:in `block in dispatch_with_newrelic'",
"/var/vcap/packages/cloud_controller_ng/cloud_controller_ng/vendor/bundle/ruby/1.9.1/gems/newrelic_rpm-3.7.1.180/lib/new_relic/agent/instrumentation/controller_instrumentation.rb:339:in `perform_action_with_newrelic_trace'",
"/var/vcap/packages/cloud_controller_ng/cloud_controller_ng/vendor/bundle/ruby/1.9.1/gems/newrelic_rpm-3.7.1.180/lib/new_relic/agent/instrumentation/sinatra.rb:145:in `dispatch_with_newrelic'",
"/var/vcap/packages/cloud_controller_ng/cloud_controller_ng/vendor/bundle/ruby/1.9.1/gems/sinatra-1.4.3/lib/sinatra/base.rb:882:in `block in call!'",
"/var/vcap/packages/cloud_controller_ng/cloud_controller_ng/vendor/bundle/ruby/1.9.1/gems/sinatra-1.4.3/lib/sinatra/base.rb:1041:in `block in invoke'",
"/var/vcap/packages/cloud_controller_ng/cloud_controller_ng/vendor/bundle/ruby/1.9.1/gems/sinatra-1.4.3/lib/sinatra/base.rb:1041:in `catch'",
"/var/vcap/packages/cloud_controller_ng/cloud_controller_ng/vendor/bundle/ruby/1.9.1/gems/sinatra-1.4.3/lib/sinatra/base.rb:1041:in `invoke'",
"/var/vcap/packages/cloud_controller_ng/cloud_controller_ng/vendor/bundle/ruby/1.9.1/gems/sinatra-1.4.3/lib/sinatra/base.rb:882:in `call!'",
"/var/vcap/packages/cloud_controller_ng/cloud_controller_ng/vendor/bundle/ruby/1.9.1/gems/sinatra-1.4.3/lib/sinatra/base.rb:870:in `call'",
"/var/vcap/packages/cloud_controller_ng/cloud_controller_ng/vendor/bundle/ruby/1.9.1/gems/newrelic_rpm-3.7.1.180/lib/new_relic/rack/error_collector.rb:50:in `call'",
"/var/vcap/packages/cloud_controller_ng/cloud_controller_ng/vendor/bundle/ruby/1.9.1/gems/newrelic_rpm-3.7.1.180/lib/new_relic/rack/browser_monitoring.rb:23:in `call'",
"/var/vcap/packages/cloud_controller_ng/cloud_controller_ng/vendor/bundle/ruby/1.9.1/gems/newrelic_rpm-3.7.1.180/lib/new_relic/rack/agent_hooks.rb:28:in `call'",
"/var/vcap/packages/cloud_controller_ng/cloud_controller_ng/vendor/bundle/ruby/1.9.1/gems/rack-protection-1.5.0/lib/rack/protection/xss_header.rb:18:in `call'",
"/var/vcap/packages/cloud_controller_ng/cloud_controller_ng/vendor/bundle/ruby/1.9.1/gems/rack-protection-1.5.0/lib/rack/protection/path_traversal.rb:16:in `call'",
"/var/vcap/packages/cloud_controller_ng/cloud_controller_ng/vendor/bundle/ruby/1.9.1/gems/rack-protection-1.5.0/lib/rack/protection/json_csrf.rb:18:in `call'",
"/var/vcap/packages/cloud_controller_ng/cloud_controller_ng/vendor/bundle/ruby/1.9.1/gems/rack-protection-1.5.0/lib/rack/protection/base.rb:49:in `call'",
"/var/vcap/packages/cloud_controller_ng/cloud_controller_ng/vendor/bundle/ruby/1.9.1/gems/rack-protection-1.5.0/lib/rack/protection/base.rb:49:in `call'",
"/var/vcap/packages/cloud_controller_ng/cloud_controller_ng/vendor/bundle/ruby/1.9.1/gems/rack-protection-1.5.0/lib/rack/protection/frame_options.rb:31:in `call'",
"/var/vcap/packages/cloud_controller_ng/cloud_controller_ng/vendor/bundle/ruby/1.9.1/gems/rack-1.5.2/lib/rack/nulllogger.rb:9:in `call'",
"/var/vcap/packages/cloud_controller_ng/cloud_controller_ng/vendor/bundle/ruby/1.9.1/gems/rack-1.5.2/lib/rack/head.rb:11:in `call'",
"/var/vcap/packages/cloud_controller_ng/cloud_controller_ng/vendor/bundle/ruby/1.9.1/gems/sinatra-1.4.3/lib/sinatra/base.rb:175:in `call'",
"/var/vcap/packages/cloud_controller_ng/cloud_controller_ng/vendor/bundle/ruby/1.9.1/gems/sinatra-1.4.3/lib/sinatra/base.rb:1949:in `call'",
"/var/vcap/packages/cloud_controller_ng/cloud_controller_ng/vendor/bundle/ruby/1.9.1/gems/rack-1.5.2/lib/rack/builder.rb:138:in `call'",
"/var/vcap/packages/cloud_controller_ng/cloud_controller_ng/vendor/bundle/ruby/1.9.1/gems/rack-1.5.2/lib/rack/urlmap.rb:65:in `block in call'",
"/var/vcap/packages/cloud_controller_ng/cloud_controller_ng/vendor/bundle/ruby/1.9.1/gems/rack-1.5.2/lib/rack/urlmap.rb:50:in `each'",
"/var/vcap/packages/cloud_controller_ng/cloud_controller_ng/vendor/bundle/ruby/1.9.1/gems/rack-1.5.2/lib/rack/urlmap.rb:50:in `call'",
"/var/vcap/packages/cloud_controller_ng/cloud_controller_ng/vendor/bundle/ruby/1.9.1/gems/rack-1.5.2/lib/rack/commonlogger.rb:33:in `call'",
"/var/vcap/packages/cloud_controller_ng/cloud_controller_ng/vendor/bundle/ruby/1.9.1/gems/sinatra-1.4.3/lib/sinatra/base.rb:212:in `call'",
"/var/vcap/packages/cloud_controller_ng/cloud_controller_ng/vendor/bundle/ruby/1.9.1/gems/rack-1.5.2/lib/rack/builder.rb:138:in `call'",
"/var/vcap/packages/cloud_controller_ng/cloud_controller_ng/vendor/bundle/ruby/1.9.1/gems/thin-1.5.1/lib/thin/connection.rb:81:in `block in pre_process'",
"/var/vcap/packages/cloud_controller_ng/cloud_controller_ng/vendor/bundle/ruby/1.9.1/gems/thin-1.5.1/lib/thin/connection.rb:79:in `catch'",
"/var/vcap/packages/cloud_controller_ng/cloud_controller_ng/vendor/bundle/ruby/1.9.1/gems/thin-1.5.1/lib/thin/connection.rb:79:in `pre_process'",
"/var/vcap/packages/cloud_controller_ng/cloud_controller_ng/vendor/bundle/ruby/1.9.1/gems/eventmachine-1.0.3/lib/eventmachine.rb:1037:in `call'",
"/var/vcap/packages/cloud_controller_ng/cloud_controller_ng/vendor/bundle/ruby/1.9.1/gems/eventmachine-1.0.3/lib/eventmachine.rb:1037:in `block in spawn_threadpool'"
],
"code": 170001,
"description": "Staging error: cannot get instances since staging failed",
"error_code": "CF-StagingError",
"types": [
"StagingError",
"Error"
]
}
<<<
Application failed to stage
When running the command cf push --buildpack=https://github.com/dmikusa-pivotal/cf-php-apache-buildpack.git everything seems to be going fine, but I am given an error that states Checking status of app 'xxxxxxx'...Application failed to stage When browsing the site after that it just shows a 404.
Thinking I was doing something wrong I tried using the php example application cf-ex-php-info but I get the same errors. Any idea why I am getting this error?
As HTTP traffic for the apps on CloudFoundry are served by a chain[1], then the X-FORWARDED-HOST and X-FORWARDED-PROTO headers should be used to properly fill the $_SERVER variable for php apps.
Currently php apps most likely see the gorouter IP in REMOTE_X variables, and the DEA IP and port into SERVER_PORT and SERVER_ADDR
https://php-info.cfapps.io/info.php
_SERVER["REMOTE_ADDR"] 10.10.16.16
_SERVER["REMOTE_PORT"] 14456
[1] Current request chain is:
I have an index.php file which simply executes phpinfo() (no other content, short <? tags)
I put it in an htdocs/ folder and push with this buildpack.
PHP never appears to operate on the file and the browser source shows the unpreprocessed phpinfo() call.
What am I doing wrong?
Logs from cf apps cf-php-demo
2014-02-24T00:16:53.11+0800 [STG] OUT Configuring HTTPD Version: 2.2.26
2014-02-24T00:16:53.11+0800 [STG] OUT Cached [/tmp/cache/httpd-2.2.26-bin.tar.gz]
2014-02-24T00:16:53.12+0800 [STG] OUT Configuring PHP Version: 5.4.25
2014-02-24T00:16:53.12+0800 [STG] OUT Cached [/tmp/cache/php-5.4.25-bin.tar.gz]
2014-02-24T00:16:53.12+0800 [STG] OUT Finished: [2014-02-23 16:16:52.956140]
2014-02-24T00:17:00.27+0800 [STG] OUT -----> Uploading droplet (36M)
2014-02-24T00:17:06.26+0800 [DEA] OUT Registering app instance (index 0) with guid 993e76c9-e89d-457b-97b0-e332271192c1
2014-02-24T00:19:38.54+0800 [DEA] OUT Instance (index 0) failed to start accepting connections
2014-02-24T00:19:48.61+0800 [DEA] OUT Removing crash for app with id 993e76c9-e89d-457b-97b0-e332271192c1
2014-02-24T00:19:48.65+0800 [DEA] OUT Removing app instance (index 0) with guid 993e76c9-e89d-457b-97b0-e332271192c1
2014-02-24T00:20:02.09+0800 [DEA] OUT Registering app instance (index 0) with guid 993e76c9-e89d-457b-97b0-e332271192c1
2014-02-24T00:22:34.30+0800 [DEA] OUT Instance (index 0) failed to start accepting connections
2014-02-24T00:22:39.64+0800 [DEA] OUT Removing crash for app with id 993e76c9-e89d-457b-97b0-e332271192c1
2014-02-24T00:22:39.64+0800 [DEA] OUT Removing app instance (index 0) with guid 993e76c9-e89d-457b-97b0-e332271192c1
2014-02-24T00:22:52.11+0800 [DEA] OUT Registering app instance (index 0) with guid 993e76c9-e89d-457b-97b0-e332271192c1
Hi i have tried to deploy the phpmyadmin using the cf-php buildpack but it is failed to stage on my private cloud foundry instance.
As described into http://fr2.php.net/manual/en/reserved.variables.server.php when a php script is handling an HTTPS request, the $_SERVER['HTTPS'] is expec ted to be set.
This is not currently the case as shown on the sample php-info running from the cf-php-apache-buildpack:
https://php-info.cfapps.io/info.php
When an app is running within the cf-php-apache-buildpack, the load balancer before the gorouter (AWS ELB for run.pivotal.io or HAProxy or Nginx such as in https://github.com/cloudfoundry-community/sslproxy-boshrelease) converts the received HTTPS traffic into HTTP and adds the x-forwarded-proto header and x-forwarded-for.
A possible workaround for php apps is to perform the test themselves:
if(isset($_SERVER['HTTP_X_FORWARDED_PROTO']) && $_SERVER['HTTP_X_FORWARDED_PROTO'] == 'https'){
$_SERVER['HTTPS']='on';
}
Some standard apps already perform such tests (e.g. https://drupal.org/node/313145 ), however others may break when accessed from https as they will detect that incoming traffic comes from HTTP, and may try to redirect to HTTPS urls, resulting into infinite redirection loops.
It would be great to have the cf-php-apache-buildpack automatically process the HTTP_X_FORWARDED_PROTO, in a similar way the java-buildpack does it with the RemoteIpValve cf https://github.com/cloudfoundry/java-buildpack/blob/master/resources/tomcat/conf/server.xml and http://tomcat.apache.org/tomcat-7.0-doc/api/org/apache/catalina/valves/RemoteIpValve.html
I searched for a similar apache module but only found so far:
If some php instructions could be included by the php interpreter prio to every HTTP request handling then the php snipnet above could be added.
The CloudFoundry recommended way to collect HTTP access logs is to have apps dump them on stdout, in order for the loggregator to collect them.
See https://docs.google.com/document/d/1zTbS9f6s1Y8WYMhJv5lu6G1bf1ktXA-y-itc3ZOhVAA/edit?disco=AAAAAGhrT_w# for more details.
Current httd-logging.conf is:
ErrorLog "logs/error_log"
LogLevel warn
<IfModule log_config_module>
LogFormat "%h %l %u %t \"%r\" %>s %b \"%{Referer}i\" \"%{User-Agent}i\"" combined
LogFormat "%h %l %u %t \"%r\" %>s %b" common
<IfModule logio_module>
LogFormat "%h %l %u %t \"%r\" %>s %b \"%{Referer}i\" \"%{User-Agent}i\" %I %O" combinedio
</IfModule>
CustomLog "logs/access_log" common
</IfModule>
It would be great to have the cf-php-apache-buildpack configure apache to dump access logs to stdout, with a prefix added on each line in order to distinguish these logs from app-generated logs.
Suggesting to add the prefix "s=access" for a concise short-cut for source=apache_access_logs
In terms of implementation, it is not clear whether standard apache config is able to generate logs on stdout, see http://httpd.apache.org/docs/2.2/mod/mod_log_config.html#customlog may be though piped streams ?
This php heroku buildpack was instead tailing the access file on disk, see http://labs.enru.co.uk/phponheroku/#17 However, this might lack some additional logrotate to avoid filling up the disk ?
The same holds for error logs which could be output to stderr with the "s=apache_err" prefix
It seems that the VCAP_SERVICES environment variable has invalid JSON now (it used to work correctly)?
I created test.php with the following:
<?php
echo $_ENV['VCAP_SERVICES'];
?>
It returns the following (http://nshwptest.testcfapp.standingcloud.com/test.php):
{
"cleardb-n/a": [
{
"name": "cleardb-c14b5",
"label": "cleardb-n/a",
"tags": [
"mysql",
"relational"
],
"plan": "spark",
"credentials": {
"jdbc
It didn't used to do this; any suggestions? Could it be a newer version of PHP or HTTPD that's breaking things?
Thanks!
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.