openimsdk / helm-charts Goto Github PK
View Code? Open in Web Editor NEWhelm charts repository for openim
Home Page: https://openimsdk.github.io/helm-charts/
License: Apache License 2.0
helm charts repository for openim
Home Page: https://openimsdk.github.io/helm-charts/
License: Apache License 2.0
Issue Description:
Currently, our system utilizes sealos
for deploying OpenIM with a direct IP address method, as executed with the command sudo sealos run --env publicIP=192.168.10.10 labring/openim:errcode
. However, in our business context, where OpenIM serves a secondary role, we propose a shift from using a public IP address to a subdomain-based approach. This change aims to enhance accessibility and streamline our service architecture.
Suggested Changes:
api.xxxx.net.cn
, ws.xxxx.net.cn
, sysnotice.xxxx.net.cn
, and minio.xxxx.net.cn
. This approach will facilitate easier access and management.sss.pigsty:5433
) with Nginx for load balancing. Compatibility and seamless integration with this existing setup are crucial.Objective:
The goal is to create a more flexible, scalable, and efficient system architecture that supports our business needs and client integration requirements. By transitioning to a subdomain-based approach and optimizing load balancing, we aim to enhance the overall performance and user experience of our system.
None
Can the project team provide a reverse proxy or load balancer based on Traefik? This software has more performance and flexibility than nginx.
Traefik is an open-source Edge Router that makes publishing your services a fun and easy experience.
traefik listens to your service registry/orchestrator API and instantly generates the routes so your microservices are connected to the outside world -- without further intervention from your part.
No response
No response
Several services within our OpenIM deployment are failing to start, entering a CrashLoopBackOff state. The logs indicate an authentication failure using the SCRAM-SHA-1 mechanism during the MongoDB connection handshake. This issue is affecting multiple components, including the openim-msgtransfer
, openim-rpc-user
, and others, leading to widespread service disruption.
Relevant Logs:
Error: ==> github.com/openimsdk/open-im-server/v3/pkg/common/db/unrelation.(*Mongo).createMongoIndex()@153: CreateIndex: connection() error occurred during connection handshake: auth error: sasl conversation error: unable to authenticate using mechanism "SCRAM-SHA-1": (AuthenticationFailed) Authentication failed.
Service Status:
openimserver
services are in a CrashLoopBackOff state, including openim-msgtransfer
, openim-rpc-conversation
, openim-rpc-friend
, openim-rpc-group
, and openim-rpc-msg
.Events:
Warning BackOff 2m5s (x50214 over 7d14h) kubelet Back-off restarting failed container openim-rpc-user in pod openimserver-openim-rpc-user-7f8f7bd4c6-49smx_openim-lin(3bf29b26-a24f-4397-85be-de97fd2a646f)
Steps to Reproduce:
Expected Behavior:
Services should start successfully without authentication errors during the MongoDB connection process.
Actual Behavior:
Services are crashing and entering a CrashLoopBackOff state due to authentication failures with SCRAM-SHA-1 during the MongoDB connection handshake.
Additional Information:
Any insights or assistance in resolving this authentication issue would be greatly appreciated.
Please ensure you replace placeholders like [Specify version]
with actual version numbers from your environment and adjust any additional information to provide a clear and concise description of your issue.
Environment:
- OpenIM version: v3.3.0
- Kubernetes version: [Specify version]
- MongoDB version: [Specify version, if involved]
- Deployment environment: (e.g., cloud provider, on-prem)
None
It is recommended that the project team provide a stable image library based on K8S to ensure that the images of the components used in OpenIM are continuous and available.
It is recommended that the project team provide a stable image library based on K8S to ensure that the images of the components used in OpenIM are continuous and available.
It supports users to pull up with one click at any time to provide maximum deployment convenience.
No response
No response
The document is concise, and I can easily deploy the service according to the document
No response
No response
Is the chart image library sure to exist? Open https://openim.github.io/helm-charts browser returns an error code.helm repo add openim https://openim.github.io/helm-charts
Error: looks like "https://openim.github.io/helm-charts" is not a valid chart repository or cannot be reached: Get "https://openim.github.io/helm-charts/index.yaml": read tcp 192.168.10.10:8492->185.199.108.153:443: read: connection reset by peer
No response
How do I deploy an SSL certificate for a related component in K8S? For example, minio.
No response
This RFC proposes a CI/CD pipeline design for the OpenIMSDK Helm charts to ensure their reliability and stability. The aim is to automate testing and deployment processes, reducing manual intervention and increasing efficiency.
A CI/CD pipeline for automating the testing, validation, and deployment of OpenIMSDK Helm charts. This will include linting, unit testing, integration testing, and automated release processes.
Linting: Helm charts will be validated using helm lint
, ensuring that they follow best practices and are free of syntax errors. This includes checking for any deprecated API usage.
Unit Testing: Utilize tools like helm unittest
to test individual templates within the Helm charts. This will help in verifying the logic of templates and their outputs for different input values.
Integration Testing: Implement automated end-to-end tests that deploy the Helm charts in a Kubernetes cluster (can be a minikube or a kind cluster). This step will validate that all components of the Helm charts work together as expected. It will include testing of deployment, services, ingress, and any other Kubernetes resources defined by the Helm chart.
Security Scanning: Integrate a security scanning tool (like Trivy or Clair) to scan for vulnerabilities in the container images specified in the Helm charts. This step ensures that the images used are secure and up to date.
Dependency Update Checks: Regularly check for updates in Helm chart dependencies. Automate the process of updating these dependencies and triggering subsequent tests to ensure compatibility.
Automated Versioning and Chart Packaging: Implement a versioning strategy for the Helm charts. Use semantic versioning and automatically bump chart versions based on the type of changes (major, minor, or patch). Package the charts using helm package
.
Publishing: On successful completion of all tests, automatically publish the Helm charts to a Helm repository. This could be a public repository like Helm Hub or a private one within the organization.
Notification and Reporting: Integrate notifications to alert the team in case of failed builds or tests. Also, generate reports of test results for review and audit purposes.
Documentation Update: Ensure that any changes in the Helm charts are automatically reflected in the documentation. This could be achieved by scripting documentation generation as part of the CI/CD process.
N/A – This RFC does not involve changes that require migration.
Similar CI/CD processes are used in various open-source projects to ensure the quality and reliability of software releases.
N/A
Hello, my environment is kubernetes 1.23.6.
When the process of deploying openim runs the service kafka.
Helm install im-kafka infra/kafka- f infra/kafka-config.yaml-n openim.
Pod has been initializing, jammed, and can't run.
No response
</details>
$ cenots 7
$ docker 20.10.0
$ kubernetes 1.23.6
$ network calico
$ CPU 4
$ Memory 8G
$ NFS storageClass 500G
### Cloud provider
<details>
</details>
### OS version
<details>
```console
# On Linux:
$ cat /etc/os-release
# paste output here
$ uname -a
# paste output here
# On Windows:
C:\> wmic os get Caption, Version, BuildNumber, OSArchitecture
# paste output here
Kubernetes
Issue Description:
A key discussion topic that was overlooked in our last bi-weekly meeting concerns the master-slave positioning of OpenIM in relation to our business systems. This topic is crucial as it directly impacts our deployment strategy regarding reverse proxy and load balancing.
Discussion Points:
Suggestions for Improvement:
nginx-ingress
in Kubernetes. This would involve providing a unified set of external service endpoints (API, WebSocket, backend management notifications, etc.), akin to how database clusters offer a unified access point.Objective:
The goal is to transform OpenIM into a highly adaptive, efficient, and unified service, capable of effectively serving in both primary and secondary roles in various business scenarios. This will entail reevaluating and potentially revising its deployment and integration strategies to ensure optimal performance and compatibility with diverse business systems.
None
Cannot support multiple msggateway services
Add the openim msggateway proxy service to act as a proxy for the msggateway service, and access the msggateway service through the consistency hash algorithm
Transforming the msggateway service into a stateful service, supporting multiple msggateway services with low time complexity
No response
No response
helm repo add openim-infra https://xxxxx.xxx
helm install im-mysql infra/mysql -f infra/mysql-config.yaml -n openim
helm install im-kafka infra/kafka -f infra/kafka-config.yaml -n openim
helm install im-minio infra/minio -f infra/minio-config.yaml -n openim
helm install im-mongodb infra/mongodb -f infra/mongodb-config.yaml -n openim
helm install im-redis infra/redis -f infra/redis-config.yaml -n openim
No response
No response
None
When replicas are greater than 1, the following service pattern seems to be more appropriate, and it is recommended that the project team can integrate the components appropriately, and we are willing to cooperate with the testing:
openimserver-openim-0 11/11 running
openimserver-openim-1 11/11 running
and it is recommended that the project team can integrate the components appropriately。
openimserver-openim-0 11/11 running
openimserver-openim-1 11/11 running
openimserver-openim-2 11/11 running
openimserver-openim-3 11/11 running
openimserver-openim-4 11/11 running
running component is clearer, and the O&M monitoring does not feel chaotic when there are multiple PODs
No response
No response
[Background]: I have successfully installed im-server and im-chat, and verified using the official Android app. It works perfectly. Based on my k8s cluster configuration, I did made some modifications, like using Aliyun LB instead of Nginx Ingress.
[Issue]: While exploring openim-admin-front, I encounter a CORS error:
It seems that the requests from the admin-front are not correctly requesting my cluster service(the request url looks like your official website. is this a default value?). I attempted to search through the source code but found nothing. Could you help me identify this problem?
login and use the admin functionalities
access {host}/openim-admin-front/login
No response
How to collect Openim logs with Loki in K8S for system health analysis.
No response
None
It is recommended that the project team try to set the parameters of the components under K8S as quasi-standard as the standard configuration of the production environment. For example, according to the average daily online 100,000, the throughput is 10 million, and the storage is 2T per day. This prevents the openim from looking like a toy. This approach is used in other large software, such as CEPH, which provides medium to high availability rather than minimal availability.
For example, according to the average daily online 100,000, the throughput is 10 million, and the storage is 2T per day. This prevents the openim from looking like a toy. This approach is used in other large software, such as CEPH, which provides medium to high availability rather than minimal availability.
It can help users to provide the best parameters to the greatest extent.
No response
No response
None
According to the instructions released in the official version, the 3.0 version or later regulates the logs, please consult an expert, how to use loki to collect logs in a k8s cluster? Does Openim provide an interface in K8S deployment?
Does Openim provide an interface in K8S deployment?
It helps to analyze logs under the company's unified monitoring system
No response
No response
When accessing minio buckets, it is a good idea to provide the ability to skip SSL checks. Just add tls-insecure-skip-verify=true to the end of the https request
No response
install loki chart error, the promtail component install error,and install some not using components ,sush as filebeat logstash.
only install loki and promtail components
using current vision
No response
None
No response
add custome loki chart in repo
Easy to view server log information
No response
No response
run correct
using old chart name
No response
I am trying to explore the Push feature of the OpenIM server(using android demo app). I noticed that the configuration options include FCM. However, the documentation on how to use FCM is somewhat unclear.
config:
The format for push.fcm.serviceAccount is "x.json," so I assume this should be a JSON file. Initially, I placed the JSON file in the root directory of the Helm charts. It DID NOT work.
I replaced the Helm image repository with my own packaged image and added some logs during startup. The logs indicate that the push service did not correctly read push.fcm.serviceAccount. Then I realized that helm did not specify serviceAccount during the Helm install. Certainly, there isn't that file inside the container either.
So, how should I fix it?
The FCM client initialized properly, and offline push notifications could be sent.
in config-imserver.yaml, change push.enable to fcm
No response
None
components are all standard and open automatically by default, so users who don't need them can be disabled, instead of having them manually execute installation commands. This is also a common practice in many open source software today.
components are all standard and open automatically by default, so users who don't need them can be disabled, instead of having them manually execute installation commands. This is also a common practice in many open source software today.
Minimize user operations.
No response
No response
Hello, my environment is kubernetes 1.23.6.
$ cenots 7
$ docker 20.10.0
$ kubernetes 1.23.6
$ network calico
$ CPU 4
$ Memory 8G
$ NFS storageClass 500G
When the process of deploying openim runs the service kafka.
$ Helm install im-kafka infra/kafka- f infra/kafka-config.yaml-n openim.
Pod has been initializing, jammed, and can't run.
No response
None
prometheus-config.yaml file is configured with a feature to send alerts via email
It's very convenient to configure the alert sending feature of Prometheus
No response
No response
configFolderPath:
use config ../config/config.yaml
use config ../config/notification.yaml
PortFromConfig: prometheus_port
RootCmd.GetPortFromConfig: prometheus_port
2023-10-27 16:21:22.166 DEBUG [PID:1] msgTransfer [log/sql_logger.go:84] sql exec detail {"gorm": "/app/internal/msgtransfer/init.go:48", "elapsed time": "0.179909(ms)", "sql": "SELECT DATABASE()"}
2023-10-27 16:21:22.167 DEBUG [PID:1] msgTransfer [log/sql_logger.go:86] sql exec detail {"gorm": "/app/internal/msgtransfer/init.go:48", "elapsed time": "0.739645(ms)", "rows": 1, "sql": "SELECT SCHEMA_NAME from Information_schema.SCHEMATA where SCHEMA_NAME LIKE 'openim%' ORDER BY SCHEMA_NAME='openim' DESC,SCHEMA_NAME limit 1"}
2023-10-27 16:21:22.169 DEBUG [PID:1] msgTransfer [log/sql_logger.go:84] sql exec detail {"gorm": "/app/internal/msgtransfer/init.go:48", "elapsed time": "0.981042(ms)", "sql": "SELECT count(*) FROM information_schema.tables WHERE table_schema = 'openim' AND table_name = 'chat_logs' AND table_type = 'BASE TABLE'"}
2023-10-27 16:21:22.169 DEBUG [PID:1] msgTransfer [log/sql_logger.go:84] sql exec detail {"gorm": "/app/internal/msgtransfer/init.go:48", "elapsed time": "0.175881(ms)", "sql": "SELECT DATABASE()"}
2023-10-27 16:21:22.170 DEBUG [PID:1] msgTransfer [log/sql_logger.go:86] sql exec detail {"gorm": "/app/internal/msgtransfer/init.go:48", "elapsed time": "0.693231(ms)", "rows": 1, "sql": "SELECT SCHEMA_NAME from Information_schema.SCHEMATA where SCHEMA_NAME LIKE 'openim%' ORDER BY SCHEMA_NAME='openim' DESC,SCHEMA_NAME limit 1"}
2023-10-27 16:21:22.170 DEBUG [PID:1] msgTransfer [log/sql_logger.go:84] sql exec detail {"gorm": "/app/internal/msgtransfer/init.go:48", "elapsed time": "0.239424(ms)", "sql": "SELECT * FROM `chat_logs` LIMIT 1"}
2023-10-27 16:21:22.171 DEBUG [PID:1] msgTransfer [log/sql_logger.go:84] sql exec detail {"gorm": "/app/internal/msgtransfer/init.go:48", "elapsed time": "1.190610(ms)", "sql": "SELECT column_name, column_default, is_nullable = 'YES', data_type, character_maximum_length, column_type, column_key, extra, column_comment, numeric_precision, numeric_scale , datetime_precision FROM information_schema.columns WHERE table_schema = 'openim' AND table_name = 'chat_logs' ORDER BY ORDINAL_POSITION"}
2023-10-27 16:21:22.172 DEBUG [PID:1] msgTransfer [log/sql_logger.go:84] sql exec detail {"gorm": "/app/internal/msgtransfer/init.go:48", "elapsed time": "0.181524(ms)", "sql": "SELECT DATABASE()"}
2023-10-27 16:21:22.172 DEBUG [PID:1] msgTransfer [log/sql_logger.go:86] sql exec detail {"gorm": "/app/internal/msgtransfer/init.go:48", "elapsed time": "0.591284(ms)", "rows": 1, "sql": "SELECT SCHEMA_NAME from Information_schema.SCHEMATA where SCHEMA_NAME LIKE 'openim%' ORDER BY SCHEMA_NAME='openim' DESC,SCHEMA_NAME limit 1"}
2023-10-27 16:21:22.173 DEBUG [PID:1] msgTransfer [log/sql_logger.go:84] sql exec detail {"gorm": "/app/internal/msgtransfer/init.go:48", "elapsed time": "0.890513(ms)", "sql": "SELECT count(*) FROM information_schema.statistics WHERE table_schema = 'openim' AND table_name = 'chat_logs' AND index_name = 'sendTime'"}
2023-10-27 16:21:22.174 DEBUG [PID:1] msgTransfer [log/sql_logger.go:84] sql exec detail {"gorm": "/app/internal/msgtransfer/init.go:48", "elapsed time": "0.164014(ms)", "sql": "SELECT DATABASE()"}
2023-10-27 16:21:22.174 DEBUG [PID:1] msgTransfer [log/sql_logger.go:86] sql exec detail {"gorm": "/app/internal/msgtransfer/init.go:48", "elapsed time": "0.570112(ms)", "rows": 1, "sql": "SELECT SCHEMA_NAME from Information_schema.SCHEMATA where SCHEMA_NAME LIKE 'openim%' ORDER BY SCHEMA_NAME='openim' DESC,SCHEMA_NAME limit 1"}
2023-10-27 16:21:22.175 DEBUG [PID:1] msgTransfer [log/sql_logger.go:84] sql exec detail {"gorm": "/app/internal/msgtransfer/init.go:48", "elapsed time": "0.816590(ms)", "sql": "SELECT count(*) FROM information_schema.statistics WHERE table_schema = 'openim' AND table_name = 'chat_logs' AND index_name = 'send_id'"}
2023-10-27 16:21:22.176 DEBUG [PID:1] msgTransfer [log/sql_logger.go:84] sql exec detail {"gorm": "/app/internal/msgtransfer/init.go:48", "elapsed time": "0.222836(ms)", "sql": "SELECT DATABASE()"}
2023-10-27 16:21:22.176 DEBUG [PID:1] msgTransfer [log/sql_logger.go:86] sql exec detail {"gorm": "/app/internal/msgtransfer/init.go:48", "elapsed time": "0.624001(ms)", "rows": 1, "sql": "SELECT SCHEMA_NAME from Information_schema.SCHEMATA where SCHEMA_NAME LIKE 'openim%' ORDER BY SCHEMA_NAME='openim' DESC,SCHEMA_NAME limit 1"}
2023-10-27 16:21:22.177 DEBUG [PID:1] msgTransfer [log/sql_logger.go:84] sql exec detail {"gorm": "/app/internal/msgtransfer/init.go:48", "elapsed time": "0.804750(ms)", "sql": "SELECT count(*) FROM information_schema.statistics WHERE table_schema = 'openim' AND table_name = 'chat_logs' AND index_name = 'recv_id'"}
2023-10-27 16:21:22.178 DEBUG [PID:1] msgTransfer [log/sql_logger.go:84] sql exec detail {"gorm": "/app/internal/msgtransfer/init.go:48", "elapsed time": "0.167356(ms)", "sql": "SELECT DATABASE()"}
2023-10-27 16:21:22.178 DEBUG [PID:1] msgTransfer [log/sql_logger.go:86] sql exec detail {"gorm": "/app/internal/msgtransfer/init.go:48", "elapsed time": "0.598151(ms)", "rows": 1, "sql": "SELECT SCHEMA_NAME from Information_schema.SCHEMATA where SCHEMA_NAME LIKE 'openim%' ORDER BY SCHEMA_NAME='openim' DESC,SCHEMA_NAME limit 1"}
2023-10-27 16:21:22.179 DEBUG [PID:1] msgTransfer [log/sql_logger.go:84] sql exec detail {"gorm": "/app/internal/msgtransfer/init.go:48", "elapsed time": "0.851954(ms)", "sql": "SELECT count(*) FROM information_schema.statistics WHERE table_schema = 'openim' AND table_name = 'chat_logs' AND index_name = 'session_type'"}
2023-10-27 16:21:22.180 DEBUG [PID:1] msgTransfer [log/sql_logger.go:84] sql exec detail {"gorm": "/app/internal/msgtransfer/init.go:48", "elapsed time": "0.181713(ms)", "sql": "SELECT DATABASE()"}
2023-10-27 16:21:22.180 DEBUG [PID:1] msgTransfer [log/sql_logger.go:86] sql exec detail {"gorm": "/app/internal/msgtransfer/init.go:48", "elapsed time": "0.614439(ms)", "rows": 1, "sql": "SELECT SCHEMA_NAME from Information_schema.SCHEMATA where SCHEMA_NAME LIKE 'openim%' ORDER BY SCHEMA_NAME='openim' DESC,SCHEMA_NAME limit 1"}
2023-10-27 16:21:22.182 DEBUG [PID:1] msgTransfer [log/sql_logger.go:84] sql exec detail {"gorm": "/app/internal/msgtransfer/init.go:48", "elapsed time": "0.838816(ms)", "sql": "SELECT count(*) FROM information_schema.statistics WHERE table_schema = 'openim' AND table_name = 'chat_logs' AND index_name = 'session_type_alone'"}
2023-10-27 16:21:22.182 DEBUG [PID:1] msgTransfer [log/sql_logger.go:84] sql exec detail {"gorm": "/app/internal/msgtransfer/init.go:48", "elapsed time": "0.204947(ms)", "sql": "SELECT DATABASE()"}
2023-10-27 16:21:22.183 DEBUG [PID:1] msgTransfer [log/sql_logger.go:86] sql exec detail {"gorm": "/app/internal/msgtransfer/init.go:48", "elapsed time": "0.631816(ms)", "rows": 1, "sql": "SELECT SCHEMA_NAME from Information_schema.SCHEMATA where SCHEMA_NAME LIKE 'openim%' ORDER BY SCHEMA_NAME='openim' DESC,SCHEMA_NAME limit 1"}
2023-10-27 16:21:22.184 DEBUG [PID:1] msgTransfer [log/sql_logger.go:84] sql exec detail {"gorm": "/app/internal/msgtransfer/init.go:48", "elapsed time": "0.803997(ms)", "sql": "SELECT count(*) FROM information_schema.statistics WHERE table_schema = 'openim' AND table_name = 'chat_logs' AND index_name = 'content_type'"}
2023-10-27 16:21:22.184 DEBUG [PID:1] msgTransfer [log/sql_logger.go:84] sql exec detail {"gorm": "/app/internal/msgtransfer/init.go:48", "elapsed time": "0.176506(ms)", "sql": "SELECT DATABASE()"}
2023-10-27 16:21:22.185 DEBUG [PID:1] msgTransfer [log/sql_logger.go:86] sql exec detail {"gorm": "/app/internal/msgtransfer/init.go:48", "elapsed time": "0.591860(ms)", "rows": 1, "sql": "SELECT SCHEMA_NAME from Information_schema.SCHEMATA where SCHEMA_NAME LIKE 'openim%' ORDER BY SCHEMA_NAME='openim' DESC,SCHEMA_NAME limit 1"}
2023-10-27 16:21:22.186 DEBUG [PID:1] msgTransfer [log/sql_logger.go:84] sql exec detail {"gorm": "/app/internal/msgtransfer/init.go:48", "elapsed time": "0.809862(ms)", "sql": "SELECT count(*) FROM information_schema.statistics WHERE table_schema = 'openim' AND table_name = 'chat_logs' AND index_name = 'content_type_alone'"}
mongo: mongodb://root:[email protected]:27017/openim?maxPoolSize=100&authSource=admin
start msg transfer prometheusPort: 0
2023-10-27 16:21:22.220 DEBUG [PID:1] msgTransfer [kafka/consumer_group.go:66] register consumer group {"groupID": "mongo"}
2023-10-27 16:21:22.220 DEBUG [PID:1] msgTransfer [kafka/consumer_group.go:66] register consumer group {"groupID": "redis"}
panic: kafka server: Offset's topic has not yet been created
goroutine 251 [running]:
github.com/openimsdk/open-im-server/v3/pkg/common/kafka.(*MConsumerGroup).RegisterHandleAndConsumer(0xc000596380, {0x1717de0, 0xc0005ca700})
/app/pkg/common/kafka/consumer_group.go:71 +0x145
created by github.com/openimsdk/open-im-server/v3/internal/msgtransfer.(*MsgTransfer).Start
/app/internal/msgtransfer/init.go:116 +0x197
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.