friendica / docker Goto Github PK
View Code? Open in Web Editor NEWDocker image for Friendica
Home Page: https://friendi.ca
License: GNU Affero General Public License v3.0
Docker image for Friendica
Home Page: https://friendi.ca
License: GNU Affero General Public License v3.0
I'm running friendica using docker. I have two different containers. One is for managing daemon.php in foreground.
I have time to time worker issue for unknown reason. So I'm wondering if there is a way to provide more log by default. Because when i run docker logs <my_friendica_cron_container
I only have this :
Waiting for MySQL X.X.X.X initialization...
#
# This script tries to connect to a database for a given interval
# Useful in case of installation e.g. to wait for the database to not generate unnecessary errors
#
# Usage: php bin/wait-for-connection {HOST} {PORT} [{TIMEOUT}]
At least having a log saying to everything is running well or not
The friendica.log isn't skipped during update so it will get deleted at every update.
Maybe we can add a environment variable to optionally skip the log
When updating from a *-rc or *-dev version (f.e. 2019.03-rc
) to the same release (f.e. 2019.03
), the method version_greater()
doesn't sort the release over the rc version, so the upgrade fails.
This is cause because of this implementation:
docker/.docker-files/entrypoint.sh
Line 15 in 0d190b3
The sender of each notification/email from Friendica is currently "Linux user".
That's because the "standard name" of the www-data user is "Linux user" and there is currently no overriding "From:" mechanism when using the mail() function in Friendica.
Maybe there is a php/sendmail-setting for it.
I don't know why, but #45 didn't work during the upgrade .. It deleted the local.config.php
So be careful during update and save your local.config.php
before updating! I'll fix it soon
Hi @nupplaphil ,
I'm actually still getting this issue (6124) with my friendica instance (red hot poker) via docker, traefik 2.2, nginx 1.17.10 (and the apache version) and mariadb 10.4.13.
Wasn't this fixed? or am I doing something wrong?
Looks like there is a commit 34e0bd3 but the tag isn't available in dockerhub.
I'm using version 2019.12 and I get two times issue when changing configuration using my environment variables that were not reflected.
I think these two issues are linked. In both cases I had to modify manually local-config.php where changes were not reflected.
My uses cases are :
admin_mail
instead of admin_email
: corresponding codeHi,
I've just seen that exec php /var/www/html/bin/daemon.php -f start
is not terminated when daemon.php status
return it is not running. Maybe it is normal.
But we have strange issue on our instance which generates maybe zombies process :
In that situation we have many messages queueing.
if I run dameon.php in background inside the container i get the following result. Is it expected result ?
/var/www/html/bin# ./daemon.php status
Pidfile wasn't found. Is the daemon running?
/var/www/html/bin# ./daemon.php start
Starting worker daemon.
/var/www/html/bin# ./daemon.php status
Daemon process 30620 is running.
Then messages unqueued.
Do you have any idea why worker looses their parent id ?
Thank you :)
On the startup page a "Page Not Found" is displayed and it seams that mod/home.php
is missing in the image. Is this a bug or do we have a incomplete configuration?
You can see the problem in action here: https://friendica.feneas.org/
and our compose file looks like this:
version: '2'
volumes:
friendica: {}
db: {}
services:
app:
image: friendica/server
hostname: friendica.local
environment:
FRIENDICA_ADMIN_MAIL: [email protected]
MYSQL_DATABASE: friendica
MYSQL_HOST: db
MYSQL_PASSWORD: secret
MYSQL_USER: friendica
SMTP: smtphost
SMTP_AUTH_PASS: smtpuser
SMTP_AUTH_USER: secret
SMTP_TLS: '1'
SITENAME: friendica.feneas.org
volumes:
- friendica:/var/www/html
labels:
io.rancher.scheduler.affinity:host_label: feneas.host=hel1-3
db:
image: mariadb
environment:
MYSQL_DATABASE: friendica
MYSQL_PASSWORD: secret
MYSQL_RANDOM_ROOT_PASSWORD: 'yes'
MYSQL_USER: friendica
volumes:
- db:/var/lib/mysql
labels:
io.rancher.scheduler.affinity:host_label: feneas.host=hel1-3
Any advice? Thanks in advantage, Lukas
This morning my instance crashes after a reboot.
After a quick investigation it is because when using a RC tag version at startup changes are pulled. Unfortunately this morning 2019-09-rc
branch was not present anymore which leads to a crash.
I think it would be interesting in case of a git pull issue to fallback in previous version without crash.
Hi,
I tried to setup a friendica instance by using the docker-compose variant (Base version - FPM).
By using the install wizard I got an error during the database initialization:
Warning: dns_get_record(): A temporary server error occurred. in /var/www/html/include/dba.php on line 58
So I think the dns_get_record() function cannot handle the "db" hostname from the database.
So I digged a little around in the app container:
# dig db
; <<>> DiG 9.9.5-9+deb8u15-Debian <<>> db
;; global options: +cmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 5959
;; flags: qr rd ra; QUERY: 1, ANSWER: 1, AUTHORITY: 0, ADDITIONAL: 0
;; QUESTION SECTION:
;db. IN A
;; ANSWER SECTION:
db. 600 IN A 172.19.0.2
;; Query time: 1 msec
;; SERVER: 127.0.0.11#53(127.0.0.11)
;; WHEN: Wed May 23 10:08:20 UTC 2018
;; MSG SIZE rcvd: 38
Using the PHP function:
# php -r "var_dump(dns_get_record('db', DNS_A + DNS_CNAME + DNS_PTR));"
Warning: dns_get_record(): A temporary server error occurred. in Command line code on line 1
bool(false)
Using the PHP function without DNS_PTR
# php -r "var_dump(dns_get_record('db', DNS_A + DNS_CNAME));"
array(1) {
[0]=>
array(5) {
["host"]=>
string(2) "db"
["class"]=>
string(2) "IN"
["ttl"]=>
int(600)
["type"]=>
string(1) "A"
["ip"]=>
string(10) "172.19.0.2"
}
}
So there seems to be an issue whith the PTR lookup inside the docker container...
Like I said in
friendica/friendica#5682
I do have to make a permission check after/during the rsync!
Is it possible to use nginx instead of apache?
EDIT: have the option to**
I'm following the instructions here to start Friendica using docker-compose. Here is a copy of my compose file.
version: '3'
services:
friendica.db:
image: mariadb
hostname: friendica.db
restart: always
volumes:
- db:/var/lib/mysql
environment:
- MYSQL_USER=friendica
- MYSQL_PASSWORD=password
- MYSQL_DATABASE=friendica
- MYSQL_RANDOM_ROOT_PASSWORD=yes
friendica:
image: friendica:stable-apache
hostname: friendica.local
restart: always
volumes:
- friendica:/var/www/html
ports:
- "8080:80"
environment:
- MYSQL_HOST=friendica.db
- MYSQL_USER=friendica
- MYSQL_PASSWORD=password
- MYSQL_DATABASE=friendica
- [email protected]
depends_on:
- friendica.db
volumes:
db:
friendica:
The logs report no errors, but when I try to visit http://friendica.local:8080/
, I see the System Check page and everything is green except the URL rewrite is working
test.
Url rewrite in .htaccess is not working. Make sure you copied .htaccess-dist to .htaccess.
Error message from Curl while fetching
http://friendica.local:8080/install/testrewrite
Failed to connect to friendica.local port 8080: Connection refused
If I visit the /install/testrewrite
page, from either the docker host or the container, I get the same response:
From docker host:
$ curl -I http://friendica.local:8080/install/testrewrite
HTTP/1.1 204 No Content
Date: Sun, 23 Aug 2020 22:20:08 GMT
Server: Apache/2.4.38 (Debian)
X-Powered-By: PHP/7.3.21
X-Account-Management-Status: none
From container:
root@friendica:/var/www/html# curl -I http://friendica.local/install/testrewrite
HTTP/1.1 204 No Content
Date: Sun, 23 Aug 2020 22:19:46 GMT
Server: Apache/2.4.38 (Debian)
X-Powered-By: PHP/7.3.21
X-Account-Management-Status: none
I've also verified that inside the container the .htaccess
file is identical to the .htaccess-dist
file.
Can someone please help me understand why I can't get past the system check?
When I try to use a secondary container with /cron.sh
entrypoint, all I get is:
Friendica isn't properly installed yet.
I'm passing the same environment variables as the main docker container, so not sure where the hiccup is happening.
Hi there,
I'm sure this is user error but I'm a bit stumped at what I am doing wrong. When I spin up the docker-compose example in the documentation and navigate to localhost:8080 it forwards to friendica/install in browser but never connects. adding something in hosts file just to force resolution doesn't help things either.
The same thing happens if I spin up two containers, one with MYSQL & friendica separately. These are the commands I'm running for that
docker run --name mysql -e MYSQL_ROOT_PASSWORD=testing -d mysql:5.7
(login and create friendicaDB)
docker run -d -p 8080:80 --link mysql:friendica friendica/server
I'm sure this is something simple but could use some help in order to start testing this out and then plan for my production.
Thanks in advance
FollowUp #44
Sometimes, the file-storage of photos loose their permissions, which leads to
[21-Jul-2019 14:46:03 Europe/Vienna] PHP Warning: file_get_contents(/var/www/html/storage/76/b7/d3bb4ead7dce7cb04fa982fe996bda3f3be41459a34e6289715aeb7187ed): failed to open s
tream: Permission denied in /var/www/html/src/Model/Storage/Filesystem.php on line 90
[21-Jul-2019 14:46:03 Europe/Vienna] PHP Warning: Cannot modify header information - headers already sent by (output started at /var/www/html/src/Model/Storage/Filesystem.php:
90) in /var/www/html/src/Core/System.php on line 131
[21-Jul-2019 14:46:03 Europe/Vienna] PHP Warning: file_get_contents(/var/www/html/storage/c6/73/d1cea97550fe8612b0241dab869523341388d752903dc89501f091080f68): failed to open s
tream: Permission denied in /var/www/html/src/Model/Storage/Filesystem.php on line 90
[21-Jul-2019 14:46:03 Europe/Vienna] PHP Warning: Cannot modify header information - headers already sent by (output started at /var/www/html/src/Model/Storage/Filesystem.php:
90) in /var/www/html/src/Core/System.php on line 131
[21-Jul-2019 14:46:04 Europe/Vienna] PHP Warning: file_get_contents(/var/www/html/storage/9a/43/39faf7730ff6ca59c54a9be7e90e4694cf86afb8464845ef336deb8da2fa): failed to open s
tream: Permission denied in /var/www/html/src/Model/Storage/Filesystem.php on line 90
[21-Jul-2019 14:46:04 Europe/Vienna] PHP Warning: Cannot modify header information - headers already sent by (output started at /var/www/html/src/Model/Storage/Filesystem.php:
90) in /var/www/html/src/Core/System.php on line 131
Either I find the root cause, or I've to auto-check the permissions on startup (like for Smarty)
Hi!
I have following configuration with Docker, Traefik and Caddy:
docker-compose.yml
services:
db:
image: mariadb
restart: always
volumes:
- /srv/containers/databases/friendica/mysql:/var/lib/mysql
environment:
- MYSQL_USER=[REDACTED]
- MYSQL_PASSWORD=[REDACTED]
- MYSQL_DATABASE=[REDACTED]
- MYSQL_RANDOM_ROOT_PASSWORD=yes
networks:
- internal
labels:
- traefik.enable=false
- com.centurylinklabs.watchtower.enable=true
derpapp:
image: friendica/server
restart: always
volumes:
- /srv/containers/data/friendica:/var/www/html
environment:
- MYSQL_HOST=db
- MYSQL_USER=[REDACTED]
- MYSQL_PASSWORD=[REDACTED]
- MYSQL_DATABASE=[REDACTED]
- FRIENDICA_ADMIN_MAIL=[REDACTED]
hostname: derpy.email
depends_on:
- db
networks:
- internal
- proxy
labels:
- traefik.enable=true
- traefik.backend=derpapp
- traefik.docker.network=proxy
- traefik.port=80
- traefik.frontend.rule=Host:derpy.email
- com.centurylinklabs.watchtower.enable=true
networks:
proxy:
external: true
internal:
external: false
derpy.email.conf Caddyfile
derpy.email {
proxy / http://localhost:8080 {
transparent
}
tls [REDACTED] {
dns cloudflare
}
gzip
}
Federation seems working (I can ping my Mastodon account and back, faves work too). But Mastodon can't follow Friendica account:
And a comment from a libranet.de user:
The network type couldn't be detected. Contact can't be added.
The only visible problem is #79 (comment)
I'd like to push this image to the official repository since it evolved a lot and I know at least 2 other people using it regulary ;-) .
This will also solve #55 , because the official repository is capable of building multi-architecture images out of the box.
If I do get a way to automatically fetch the Friendica releases, it would be possible to automatically create/update docker images based on this list. So this repo would automatically update itself with each new release and I'm no more necessary to permanently check it ;-) .. And a next followup would be to automatically create a PR in the official library in case of a new release (but step by step :-) )
Maybe with an event of the github releases. I know from nextcloud that there's a releases repository: https://download.nextcloud.com/server/releases/ which includes
Calling for @tobiasd and @MrPetovan if you know a similar way for Friendica. This would be helpful in either case :-)
When I want to start the daemon through docker, the following error occurs:
root@philipp /opt/friendica # docker-compose exec --user=www-data cron php bin/daemon.php start
Starting worker daemon.
Fatal error: Uncaught Error: Call to undefined function pcntl_fork() in /var/www/html/bin/daemon.php:124
Stack trace:
#0 {main}
thrown in /var/www/html/bin/daemon.php on line 124
I guess the "native" forking possibility vanished from to another version...
I have tried updating my friendica docker installation from friendica/server:latest
which was 2019.04 to friendica/server:2019.06-rc
after upgrading everything looks fine but i'm still in version 2019.04 in admin panel.
inside the container it looks ok :
env|grep FRIEN
FRIENDICA_VERSION=2019.06-rc
FRIENDICA_ADDONS=2019.06-rc
on docker host :
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
4d03e4f41680 friendica/server:2019.06-rc "/cron.sh" 43 minutes ago Up 13 minutes 80/tcp friendicacron
3bc23e5046c6 friendica/server:2019.06-rc "/entrypoint.sh apac…" 44 minutes ago Up 17 minutes 127.0.0.1:8088->80/tcp friendicaapp
but in admin panel i'm still having 2019.04 :
Do i have miss something in the upgrade operation ?
It'd be great if this container just worked without additional configuration. Please consider rolling mysql into the container.
Based on friendica/friendica#6180 we can use a docker volume for data storage instead of the db.
It's currently possible in dev
branch only and not yet stable, but as a reminder for 2019.03
and following
As already said in a PR, I want to increase the automatic testing.
So I do want to add Travis CI tests for all of the docker-compose examples. Like we have for the dockerfiles examples.
Therefore I have to download and execute the docker-compose binary on-the-fly during the Travis runs :-)
Originally posted by @pianic26 in #8 (comment)
I have the same problem; I'm new with docker and I don't how to fix please help
ERROR: for firstproject-webserver Cannot start service webserver: OCI runtime create failed: container_linux.go:345: starting container process caused "process_linux.go:424: container init caused "rootfs_linux.go:58: mounting \"/c/firstproject/phpdocker/nginx/nginx.conf\" to rootfs \"/mnt/sda1/var/lib/docker/overlay2/ccb70cb832f49a81d583eb3e389371e01865cb6ab9ae7dd4a923d4f434a9361c/merged\" at \"/mnt/sda1/var/lib/docker/overlay2/ccb70cb832f49a81d583eb3e389371e01865Creating firstproject-php-fpm ... done
u trying to mount a directory onto a file (or vice-versa)? Check if the specified host path exists and is the expected tCreating firstproject-mysql ... done
docker-compose.txt
I'm looking at current Apache configuration. Container is set to run using MPM prefork which process based.
Current config is :
<IfModule mpm_prefork_module>
StartServers 5
MinSpareServers 5
MaxSpareServers 10
MaxRequestWorkers 150
MaxConnectionsPerChild 0
</IfModule>
It starts 5 processes and keep always minimum 5 processes idle and maximum 10. It can start maximum of 150 processes.
MaxConnectionsPerChild to 0 means a process never dies. It can causes memory leaks. If we set a value, it will kill the process when it has served the MaxConnections value.
I would suggest changing that value to 1000 for example.
What do you think about this change? I can implement it if you want?
The dockerfiles
aren't usable at the moment :-(
log:
/usr/lib/python2.7/dist-packages/supervisor/options.py:296: UserWarning: Supervisord is running as root and it is searching for its configuration file in default locations (including its current working directory); you probably want to specify a "-c" argument specifying an absolute path to a configuration file for improved security.
'Supervisord is running as root and it is searching '
2018-05-26 15:55:35,868 CRIT Supervisor running as root (no user in config file)
2018-05-26 15:55:37,821 CRIT reaped unknown pid 209)
2018-05-26 15:55:37,834 CRIT reaped unknown pid 164)
[...]
supervisor constantly restarts the php instances and kill them because it doesn't "remember" the pid.
I have the fear that the bin/worker.php
usage in the whole docker environment has some flaws and is therefore the reason for the supervisor errors ("zombie-process"es ...)
Hi,
I've just updated to 2019.12 and my cron container wasn't starting.
I had to add MYSQL_PORT
environment variable to make it works again. Else I had this error :
Waiting for MySQL db initialization...
Port must be an integer greater than zero
[ERROR] Waited 300 seconds, no response
Waiting for MySQL db initialization...
Port must be an integer greater than zero
So I think it means default value is not set as before ?
Because of #30 , stack.yml
isn't working anymore.
=> we have to disable the email & url verification again
The reason behind it, is that Friendica will automatically check the admin-mail "[email protected]" which isn't - of course - a valid emal ;-)
Line 29 in 987edd5
But the e-mail isn't valid, so with Play-with-docker , we can start Friendica, but we cannot register an admin-account because of this fake-mailname (error "the email is not valid.")
With my current docker-setup, I get an error at the admin overview page because /.well-known/host-meta isn't reachable.
My current docker-compose is:
app:
image: friendica/server:rc-fpm-alpine
command: "php-fpm -d date.timezone=${TZ} -d expose_php=0"
depends_on:
- db
- redis
volumes:
- friendica-vol-1:/var/www/html
environment:
- MYSQL_USERNAME=${DBUSER}
- MYSQL_PASSWORD=${DBPASS}
- MYSQL_DATABASE=${DBDATA}
- MYSQL_HOST=${DBHOST}
- MYSQL_PORT=${DBPORT}
- FRIENDICA_ADMIN_MAIL=${MAILNAME}
- FRIENDICA_TZ=${TZ}
- FRIENDICA_LANG=${LANGUAGE}
- FRIENDICA_UPGRADE=true
- REDIS_HOST=redis
- FRIENDICA_DATA=true
- FRIENDICA_DEBUGGING=true
- SMTP=mail
- SITENAME=${SITENAME}
restart: always
networks:
default:
aliases:
- app
private:
aliases:
- friendica_web
logging:
driver: json-file
options:
max-size: "10m"
max-file: "3"
web:
build: ./web
restart: always
volumes:
- friendica-vol-1:/var/www/html:ro
environment:
- HOSTNAME=${HOSTNAME}
depends_on:
- app
networks:
- web
- default
labels:
- "traefik.backend=friendica"
- "traefik.frontend.entryPoints=https"
- "traefik.frontend.headers.SSLRedirect=true"
- "traefik.frontend.headers.STSSeconds=15768000"
- "traefik.frontend.headers.STSIncludeSubdomains=false"
- "traefik.frontend.headers.forceSTSHeader=true"
- "traefik.friendica.frontend.rule=Host:${HOSTNAME}"
- "traefik.friendica.port=80"
- "traefik.enable=true"
- "traefik.docker.network=web"
logging:
driver: json-file
options:
max-size: "10m"
max-file: "3"
I add many errors in logs like this one :
Cannot allocate memory: AH00159: fork: Unable to fork new process
it looks like this error is linked to the memory limit in php.ini
:
memory_limit = 128M
I had to copy to :
cp /usr/local/etc/php/php.ini-production /usr/local/etc/php/php.ini
and then change memory_limit
to 256M
would it be possible to setup a php.ini and dynamically setup memory limit from a variable ?
maybe there are other interesting settings to setup ?
Change tag to 2019.01-rc
otherwise all images with tag rc
will break when restarting/upgrading
based on commit
friendica/friendica@d1fb0be
It seems there is no auto-deployment in place. Any idea when the latest version will be available on Docker Hub?
friendica.log
renders:
2019-11-12 10:25:08 index [INFO]: ldapauth: not configured or missing php-ldap module [] - {"file":"ldapauth.php","line":105,"function":"ldapauth_authenticate","uid":"3c55bf","process_id":39}
for example, after my trying to fill out and run an addon.config.php
with an ldapauth
block.
Currently, I have to create and upload every docker image by hand. There are some possibilities to create auto builds.
I've to look for it
Switching back to local.config.php
because of friendica/friendica#6199
@MrPetovan This change is making a lot of things easier here :-). There would have been a ugly workaround for custom ini.php files necessary instead.
I followed your website for running Friendica using docker-compose at https://hub.docker.com/_/friendica#! - "Base version - apache". My YAML file is:
version: '2'
services:
db:
image: mariadb
restart: always
volumes:
- db:/var/lib/mysql
environment:
- MYSQL_USER=friendica
- MYSQL_PASSWORD=password
- MYSQL_DATABASE=friendica
- MYSQL_RANDOM_ROOT_PASSWORD=yes
app:
image: friendica
restart: always
volumes:
- friendica:/var/www/html
ports:
- "9090:80"
environment:
- MYSQL_HOST=db
- MYSQL_USER=friendica
- MYSQL_PASSWORD=password
- MYSQL_DATABASE=friendica
- [email protected]
depends_on:
- db
volumes:
db:
friendica:
When I use docker-compose up -d, I get:
URL rewrite in .htaccess is not working. Make sure you copied .htaccess-dist to .htaccess.
Any suggestions? Thanks
Instead of setting the password inside a plain-readable environment variable, you should use a password-file in production.
Details here: https://medium.com/@adrian.gheorghe.dev/using-docker-secrets-in-your-environment-variables-7a0609659aab
I'd like to introduce the explained file_env()
function as alternative to MYSQL_PASSWORD
and SMTP_AUTH_PASS
By using the docker-compose example for "Base version - FPM" I got an error while firing up the containers:
ERROR: for friendica_web_1 Cannot start service web: OCI runtime create failed: container_linux.go:348: starting container process caused "process_linux.go:402: container init caused \"rootfs_linux.go:58: mounting \\\"/srv/docker/friendica/nginx.conf\\\" to rootfs \\\"/var/lib/docker/overlay2/***UUID***/merged\\\" at \\\"/var/lib/docker/overlay2/***UUID***/merged/etc/nginx/nginx.conf\\\" caused \\\"not a directory\\\"\"": unknown: Are you trying to mount a directory onto a file (or vice-versa)? Check if the specified host path exists and is the expected type
docker-compose created an empty folder nginx.conf
inside the directory of the docker-compose.yml file during startup.
I can install Friendica and I can then create my account using this image. But when I try to login I get a blank page and an error "Can't connect to site". The site is configured for localhost
as I'm just running it on my laptop without a domain name. Is this supported?
Major todos to make the images work again:
.htconfig.php
with local.ini.php
(for database)console config set
possibilityHello,
As I'm having trouble on my x86_64 server in reason of having only 2GB of RAM and my friendica instance requires almost 1GB with server + mariadb I was looking for hosting friendica on a ARM architecture which is cheaper than x86.
Unfortunately MariaDB runs well but it is not the same for the server. I've tried several different image but each time I get the same result. Is there a trick to do this or maybe it's not possible ?
thank you.
Some dependencies and extensions are already provided by the base image, so there's no need to add them again:
docker/2019.06/fpm-alpine/Dockerfile
Lines 55 to 67 in af1aa85
Since we add redis cache support, I'm going to add a redis cache container in the docker-compose.
like
redis:
image: redis
restart: always
and add the following lines to the .htconfig.php
:
$a->config['system']['cache_driver'] = 'redis';
$a->config['system']['redis_host'] = 'redis';
$a->config['system']['redis_port'] = 0;
Just voicing excitement and pinging for a new release 😇
Currently I have to manually overwrite the git clone in /entrypoint.sh
to checkout other branches / repos than the default one
Maybe we can add (just for the develop images) the possibility to configure the checkout
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.