h2ck / webtrees Goto Github PK
View Code? Open in Web Editor NEWDocker Image containing Webtrees
License: Apache License 2.0
Docker Image containing Webtrees
License: Apache License 2.0
Hi,
It seems sendmail is missing from docker image. Can you add it and have a SMTP configuration stage added in the shell script used for initial setup ?
Thanks for all the work done, and thanks in advance for this one :-)
The directory for 3rd party modules in README.md is modulesv3
. Should it be modules_v4
for version 2.0+?
Hello, I try to setup webtrees using docker-compose.
Everything works fine database is created, and populated, but no user is created and I can't figure out why.
Could you help me, please ?
APP_NAME="webtrees"
APP_PROJECT=webtrees
APP_DOMAIN=webtrees.mydomain.com
MARIADB_RANDOM_ROOT_PASSWORD=true
MYSQL_DATABASE=webtrees
MYSQL_USER=app_user
MYSQL_PASSWORD=secret
TZ=Europe/Paris
# https://github.com/H2CK/webtrees#parameters
# UPDATE_ON_START=true
GROUP_ID=999
DISABLE_SSL=TRUE
PORT=80
PRETTYURLS="1"
BASE_URL="http://${APP_DOMAIN}"
DB_HOST="${APP_PROJECT}-mariadb"
DB_USER="${MYSQL_USER}"
DB_PASSWORD="${MYSQL_PASSWORD}"
# DB_PORT=
DB_NAME="${MYSQL_DATABASE}"
WT_ADMIN="loranger"
WT_ADMINPW="my_password"
WT_ADMINMAIL="[email protected]"
version: '3'
services:
webtrees:
container_name: ${APP_PROJECT}-webtrees
image: dtjs48jkt/webtrees:latest
# volumes:
# - ./datas:/var/www/html/data
env_file:
- .env
restart: always
depends_on:
- mariadb
labels:
- "traefik.http.routers.${APP_PROJECT}.rule=Host(`${APP_DOMAIN}`)"
- "traefik.http.services.${APP_PROJECT}-service.loadbalancer.server.port=80"
mariadb:
container_name: ${APP_PROJECT}-mariadb
image: mariadb:latest
env_file:
- .env
volumes:
- ./database:/var/lib/mysql
labels:
- "traefik.enable=false"
adminer:
container_name: ${APP_PROJECT}-adminer
image: adminer:latest
environment:
ADMINER_DEFAULT_SERVER: ${DB_HOST}
ADMINER_DESIGN: flat
profiles:
- adminer
labels:
- "traefik.http.routers.${APP_PROJECT}-adminer.rule=Host(`adminer.${APP_DOMAIN}`)"
- "traefik.http.services.${APP_PROJECT}-adminer-service.loadbalancer.server.port=8080"
networks:
default:
name: web
Hi,
it would be very practical if you could also determine the maximum upload size of the files via the Docker env variables.
This is set to 2M by default and is often too small for current files. Currently, this would have to be adjusted by changing the php.ini in the container.
Not sure if this is the right place searching for help.
Overnight my installation of webtrees stopped working so I decided to do a fresh install - still using the same database and location for the data files.
When running the docker container with:
docker run -d -p 8089:8079 --name webtrees -e BASE_URL=https://mywebsite.com -v /webtrees/data:/var/www/html/data -e GROUP_ID=999 -e PORT=8079 -e DB_USER=root -e DB_PASSWORD=**** -e DB_HOST=172.20.0.2 -e DB_PORT=3306 -e DB_NAME=webtrees --restart always dtjs48jkt/webtrees:2.1.16
I get this error:
`RuntimeException:
SQLSTATE[HY000] [2002] No route to host in /var/www/html/app/Http/Middleware/UseDatabase.php:119
Stack trace: #0 /var/www/html/vendor/oscarotero/middleland/src/Dispatcher.php(136): Fisharebest\Webtrees\Http\Middleware\UseDatabase->process(Object(Nyholm\Psr7\ServerRequest), Object(Middleland\Dispatcher))
#1 /var/www/html/app/Http/Middleware/BadBotBlocker.php(282): Middleland\Dispatcher->handle(Object(Nyholm\Psr7\ServerRequest))
#2 /var/www/html/vendor/oscarotero/middleland/src/Dispatcher.php(136): Fisharebest\Webtrees\Http\Middleware\BadBotBlocker->process(Object(Nyholm\Psr7\ServerRequest), Object(Middleland\Dispatcher))
#3 /var/www/html/app/Http/Middleware/CompressResponse.php(73): Middleland\Dispatcher->handle(Object(Nyholm\Psr7\ServerRequest))
#4 /var/www/html/vendor/oscarotero/middleland/src/Dispatcher.php(136): Fisharebest\Webtrees\Http\Middleware\CompressResponse->process(Object(Nyholm\Psr7\ServerRequest), Object(Middleland\Dispatcher))
#5 /var/www/html/app/Http/Middleware/ContentLength.php(40): Middleland\Dispatcher->handle(Object(Nyholm\Psr7\ServerRequest))
#6 /var/www/html/vendor/oscarotero/middleland/src/Dispatcher.php(136): Fisharebest\Webtrees\Http\Middleware\ContentLength->process(Object(Nyholm\Psr7\ServerRequest), Object(Middleland\Dispatcher))
#7 /var/www/html/vendor/middlewares/client-ip/src/ClientIp.php(65): Middleland\Dispatcher->handle(Object(Nyholm\Psr7\ServerRequest))
#8 /var/www/html/app/Http/Middleware/ClientIp.php(47): Middlewares\ClientIp->process(Object(Nyholm\Psr7\ServerRequest), Object(Middleland\Dispatcher))
#9 /var/www/html/vendor/oscarotero/middleland/src/Dispatcher.php(136): Fisharebest\Webtrees\Http\Middleware\ClientIp->process(Object(Nyholm\Psr7\ServerRequest), Object(Middleland\Dispatcher))
#10 /var/www/html/app/Http/Middleware/HandleExceptions.php(90): Middleland\Dispatcher->handle(Object(Nyholm\Psr7\ServerRequest))
#11 /var/www/html/vendor/oscarotero/middleland/src/Dispatcher.php(136): Fisharebest\Webtrees\Http\Middleware\HandleExceptions->process(Object(Nyholm\Psr7\ServerRequest), Object(Middleland\Dispatcher))
#12 /var/www/html/app/Http/Middleware/BaseUrl.php(73): Middleland\Dispatcher->handle(Object(Nyholm\Psr7\ServerRequest))
#13 /var/www/html/vendor/oscarotero/middleland/src/Dispatcher.php(136): Fisharebest\Webtrees\Http\Middleware\BaseUrl->process(Object(Nyholm\Psr7\ServerRequest), Object(Middleland\Dispatcher))
#14 /var/www/html/app/Http/Middleware/ReadConfigIni.php(68): Middleland\Dispatcher->handle(Object(Nyholm\Psr7\ServerRequest))
#15 /var/www/html/vendor/oscarotero/middleland/src/Dispatcher.php(136): Fisharebest\Webtrees\Http\Middleware\ReadConfigIni->process(Object(Nyholm\Psr7\ServerRequest), Object(Middleland\Dispatcher))
#16 /var/www/html/app/Http/Middleware/SecurityHeaders.php(48): Middleland\Dispatcher->handle(Object(Nyholm\Psr7\ServerRequest))
#17 /var/www/html/vendor/oscarotero/middleland/src/Dispatcher.php(136): Fisharebest\Webtrees\Http\Middleware\SecurityHeaders->process(Object(Nyholm\Psr7\ServerRequest), Object(Middleland\Dispatcher))
#18 /var/www/html/app/Http/Middleware/EmitResponse.php(57): Middleland\Dispatcher->handle(Object(Nyholm\Psr7\ServerRequest))
#19 /var/www/html/vendor/oscarotero/middleland/src/Dispatcher.php(136): Fisharebest\Webtrees\Http\Middleware\EmitResponse->process(Object(Nyholm\Psr7\ServerRequest), Object(Middleland\Dispatcher))
#20 /var/www/html/vendor/oscarotero/middleland/src/Dispatcher.php(118): Middleland\Dispatcher->handle(Object(Nyholm\Psr7\ServerRequest))
#21 /var/www/html/app/Webtrees.php(275): Middleland\Dispatcher->dispatch(Object(Nyholm\Psr7\ServerRequest))
#22 /var/www/html/app/Webtrees.php(262): Fisharebest\Webtrees\Webtrees::dispatch(Object(Nyholm\Psr7\ServerRequest), Array)
#23 /var/www/html/index.php(51): Fisharebest\Webtrees\Webtrees->httpRequest()
#24 {main}`
I'm able to access the database from the container so I don't think it's firewall related.
Hello, how to enable URL rewrite as shown here ?
I tried to map a .htaccess
to /var/www/html/.htaccess
but it looks like the rewrite mod is not enabled.
How can I do it ? And would it be possible to add an option to do it automatically ?
It is common use, that the latest tag contains the multiarch images from the latest released version. At the moment under latest only is an amd64 architecture image that has not the same hash as the amd64 image from the v2.0.2-0.
If you want an image from the lastest source you should call it master.
Some directories that are not expected to be published are available via browser.
Steps to reproduce:
docker run -d -p 8443:443 --name webtrees --link mysql:db dtjs48jkt/webtrees:v2.0.5-1
According to Webtrees github:
In the unlikely event you do fetch the file (you will just see a semicolon), then that protection is not working on your site and you should take some further action.
Same as #31. I assume it would be desired to upgrade to PHP 8.1.
I have added a custom module under the modules_v4 folder, but it is not showing up anywhere (even under preferences). I am using the latest version (2.1.1) of Webtrees in docker and I am using the descendants chart, which was updated to support the latest release. Here's my docker-compose file:
version: '3.0'
services:
webtrees:
image: dtjs48jkt/webtrees
restart: unless-stopped
container_name: webtrees
ports:
- 8079:8079
environment:
- DISABLE_SSL=TRUE
- PORT=8079
volumes:
- /mnt/docker/containers/webtrees/data:/var/www/html/data
- /mnt/docker/containers/webtrees/modules_v4:/var/www/html/modules_v4
- /mnt/docker/containers/webtrees/media:/var/www/html/media
networks:
- my-network
mysql:
image: mysql:5.5
restart: unless-stopped
container_name: webtrees_mysql
environment:
- MYSQL_ROOT_PASSWORD=PASSWORD
- MYSQL_DATABASE=webtrees
- MYSQL_USER=webtrees
- MYSQL_PASSWORD=PASSWORD
networks:
- my-network
volumes:
- /mnt/docker/containers/webtrees_mysql:/var/lib/mysql
networks:
my-network:
Everything is working except for the custom modules. It does not even show up in modules:
Is it a stable version already?
Regards
Therefor you should create two directories that are mapped to the container internal directories /var/www/html/data and /var/www/html/media.
This was true for webtrees 1.x
Since webtrees 2.x, the media folder is inside the data folder. So only the data folder is needed.
Hi there.
Thank you for this docker image. I'm having ssl certificate issues when trying to launch behind traefik proxy with autogenerated certificate from let's encrypt. I suspect this has something to do with ssl certificate being specified in your build. Any ideas?
Hello
I keep getting this error when opening the site:
RuntimeException: SQLSTATE[HY000] [2002] No such file or directory in /var/www/html/app/Http/Middleware/UseDatabase.php:114 Stack trace: #0 /var/www/html/vendor/oscarotero/middleland/src/Dispatcher.php(136): Fisharebest\Webtrees\Http\Middleware\UseDatabase->process(Object(Nyholm\Psr7\ServerRequest), Object(Middleland\Dispatcher)) #1 /var/www/html/app/Http/Middleware/BadBotBlocker.php(212): Middleland\Dispatcher->handle(Object(Nyholm\Psr7\ServerRequest)) #2 /var/www/html/vendor/oscarotero/middleland/src/Dispatcher.php(136): Fisharebest\Webtrees\Http\Middleware\BadBotBlocker->process(Object(Nyholm\Psr7\ServerRequest), Object(Middleland\Dispatcher)) #3 /var/www/html/app/Http/Middleware/RegisterFactories.php(72): Middleland\Dispatcher->handle(Object(Nyholm\Psr7\ServerRequest)) #4 /var/www/html/vendor/oscarotero/middleland/src/Dispatcher.php(136): Fisharebest\Webtrees\Http\Middleware\RegisterFactories->process(Object(Nyholm\Psr7\ServerRequest), Object(Middleland\Dispatcher)) #5 /var/www/html/vendor/middlewares/client-ip/src/ClientIp.php(81): Middleland\Dispatcher->handle(Object(Nyholm\Psr7\ServerRequest)) #6 /var/www/html/app/Http/Middleware/ClientIp.php(47): Middlewares\ClientIp->process(Object(Nyholm\Psr7\ServerRequest), Object(Middleland\Dispatcher)) #7 /var/www/html/vendor/oscarotero/middleland/src/Dispatcher.php(136): Fisharebest\Webtrees\Http\Middleware\ClientIp->process(Object(Nyholm\Psr7\ServerRequest), Object(Middleland\Dispatcher)) #8 /var/www/html/app/Http/Middleware/HandleExceptions.php(90): Middleland\Dispatcher->handle(Object(Nyholm\Psr7\ServerRequest)) #9 /var/www/html/vendor/oscarotero/middleland/src/Dispatcher.php(136): Fisharebest\Webtrees\Http\Middleware\HandleExceptions->process(Object(Nyholm\Psr7\ServerRequest), Object(Middleland\Dispatcher)) #10 /var/www/html/app/Http/Middleware/BaseUrl.php(77): Middleland\Dispatcher->handle(Object(Nyholm\Psr7\ServerRequest)) #11 /var/www/html/vendor/oscarotero/middleland/src/Dispatcher.php(136): Fisharebest\Webtrees\Http\Middleware\BaseUrl->process(Object(Nyholm\Psr7\ServerRequest), Object(Middleland\Dispatcher)) #12 /var/www/html/app/Http/Middleware/ReadConfigIni.php(69): Middleland\Dispatcher->handle(Object(Nyholm\Psr7\ServerRequest)) #13 /var/www/html/vendor/oscarotero/middleland/src/Dispatcher.php(136): Fisharebest\Webtrees\Http\Middleware\ReadConfigIni->process(Object(Nyholm\Psr7\ServerRequest), Object(Middleland\Dispatcher)) #14 /var/www/html/app/Http/Middleware/SecurityHeaders.php(47): Middleland\Dispatcher->handle(Object(Nyholm\Psr7\ServerRequest)) #15 /var/www/html/vendor/oscarotero/middleland/src/Dispatcher.php(136): Fisharebest\Webtrees\Http\Middleware\SecurityHeaders->process(Object(Nyholm\Psr7\ServerRequest), Object(Middleland\Dispatcher)) #16 /var/www/html/app/Http/Middleware/EmitResponse.php(57): Middleland\Dispatcher->handle(Object(Nyholm\Psr7\ServerRequest)) #17 /var/www/html/vendor/oscarotero/middleland/src/Dispatcher.php(136): Fisharebest\Webtrees\Http\Middleware\EmitResponse->process(Object(Nyholm\Psr7\ServerRequest), Object(Middleland\Dispatcher)) #18 /var/www/html/app/Http/Middleware/PhpEnvironment.php(49): Middleland\Dispatcher->handle(Object(Nyholm\Psr7\ServerRequest)) #19 /var/www/html/vendor/oscarotero/middleland/src/Dispatcher.php(136): Fisharebest\Webtrees\Http\Middleware\PhpEnvironment->process(Object(Nyholm\Psr7\ServerRequest), Object(Middleland\Dispatcher)) #20 /var/www/html/vendor/oscarotero/middleland/src/Dispatcher.php(118): Middleland\Dispatcher->handle(Object(Nyholm\Psr7\ServerRequest)) #21 /var/www/html/index.php(57): Middleland\Dispatcher->dispatch(Object(Nyholm\Psr7\ServerRequest)) #22 {main}
Using the following docker-compose.yml
version: '3.0'
services:
webtrees:
image: dtjs48jkt/webtrees
restart: always
ports:
- 88:80
environment:
- DISABLE_SSL=TRUE
- PORT=80
volumes:
- /webtrees/data:/var/www/html/data
- /webtrees/media:/var/www/html/media
Shouldn't I see the DB setup config page?
hello
today i tried to run this docker container..
i want to open the site and .. nothing happend..
i end up with the knowledge that some files + packages are missing
the files the container missed:
i think there is a lack of other files but i don't know
Hello,
Is it possible to add an option to set a custom authentication header instead of REMOTE_USER ?
For example, Authentik use another header : X-Authentik-Username
Thanks !
(Sorry for my bad English, it's not my native language)
When I set WT_ADMINPW
, the created admin account gets a hashed password saved as *0
in the database. So I can't log in with that account.
It's seems like an issue with a change in how PHP crypt()
function works.
If I don't set DB_PASSWORD
and just go through the manual set up, everything works as expected.
I am unable to login using the admin credentials I specified when creating the container. The error message reads:
The username or password is incorrect.
I see there are no records in the user database table, but I'm not sure if that is where the admin credentials are stored.
Here is my Run command on Linux AMD64 and Docker version 18.06.0-ce. This was created about 13 days ago, so I'm thinking this is image v2.0.10-0.
docker run -d \
-p 8088:8079 \
--name webtrees \
-v /webtrees/data:/var/www/html/data \
-e GROUP_ID=1000 \
-e PORT=8079 \
-e UPDATE_ON_START=TRUE \
-e DB_USER=webtrees_user \
-e DB_PASSWORD=DBPassword \
-e DB_HOST=10.10.10.10 \
-e DB_PORT=3307 \
-e DB_NAME=webtrees_db \
-e WT_ADMIN=AdminName \
-e WT_ADMINPW=AdminPassword \
-e [email protected] \
--restart always \
dtjs48jkt/webtrees
I see no one else has reported this issue, so it must be something I am doing wrong.
Thank you in advance!
Hello ;)
now i have another error. I don't know if i could change something
i used the latest container image.
This exception is displayed in the browser if i tried to open the website
ErrorException: file(/var/www/html/app/../resources/lang/de/messages.po): failed to open stream: No such file or directory in /var/www/html/vendor/fisharebest/localization/src/Translation.php:56
Stack trace:
#0 [internal function]: Fisharebest\Webtrees\Webtrees::Fisharebest\Webtrees\{closure}(2, 'file(/var/www/h...', '/var/www/html/v...', 56, Array)
#1 /var/www/html/vendor/fisharebest/localization/src/Translation.php(56): file('/var/www/html/a...')
#2 /var/www/html/app/I18N.php(306): Fisharebest\Localization\Translation->__construct('/var/www/html/a...')
#3 /var/www/html/app/Http/Middleware/UseLanguage.php(67): Fisharebest\Webtrees\I18N::init('de')
#4 /var/www/html/vendor/oscarotero/middleland/src/Dispatcher.php(136): Fisharebest\Webtrees\Http\Middleware\UseLanguage->process(Object(Nyholm\Psr7\ServerRequest), Object(Middleland\Dispatcher))
#5 /var/www/html/app/Http/Middleware/UseSession.php(71): Middleland\Dispatcher->handle(Object(Nyholm\Psr7\ServerRequest))
#6 /var/www/html/vendor/oscarotero/middleland/src/Dispatcher.php(136): Fisharebest\Webtrees\Http\Middleware\UseSession->process(Object(Nyholm\Psr7\ServerRequest), Object(Middleland\Dispatcher))
#7 /var/www/html/app/Http/Middleware/UpdateDatabaseSchema.php(58): Middleland\Dispatcher->handle(Object(Nyholm\Psr7\ServerRequest))
#8 /var/www/html/vendor/oscarotero/middleland/src/Dispatcher.php(136): Fisharebest\Webtrees\Http\Middleware\UpdateDatabaseSchema->process(Object(Nyholm\Psr7\ServerRequest), Object(Middleland\Dispatcher))
#9 /var/www/html/app/Http/Middleware/UseDebugbar.php(67): Middleland\Dispatcher->handle(Object(Nyholm\Psr7\ServerRequest))
#10 /var/www/html/vendor/oscarotero/middleland/src/Dispatcher.php(136): Fisharebest\Webtrees\Http\Middleware\UseDebugbar->process(Object(Nyholm\Psr7\ServerRequest), Object(Middleland\Dispatcher))
#11 /var/www/html/app/Http/Middleware/UseDatabase.php(117): Middleland\Dispatcher->handle(Object(Nyholm\Psr7\ServerRequest))
#12 /var/www/html/vendor/oscarotero/middleland/src/Dispatcher.php(136): Fisharebest\Webtrees\Http\Middleware\UseDatabase->process(Object(Nyholm\Psr7\ServerRequest), Object(Middleland\Dispatcher))
#13 /var/www/html/app/Http/Middleware/BadBotBlocker.php(212): Middleland\Dispatcher->handle(Object(Nyholm\Psr7\ServerRequest))
#14 /var/www/html/vendor/oscarotero/middleland/src/Dispatcher.php(136): Fisharebest\Webtrees\Http\Middleware\BadBotBlocker->process(Object(Nyholm\Psr7\ServerRequest), Object(Middleland\Dispatcher))
#15 /var/www/html/app/Http/Middleware/RegisterFactories.php(72): Middleland\Dispatcher->handle(Object(Nyholm\Psr7\ServerRequest))
#16 /var/www/html/vendor/oscarotero/middleland/src/Dispatcher.php(136): Fisharebest\Webtrees\Http\Middleware\RegisterFactories->process(Object(Nyholm\Psr7\ServerRequest), Object(Middleland\Dispatcher))
#17 /var/www/html/vendor/middlewares/client-ip/src/ClientIp.php(81): Middleland\Dispatcher->handle(Object(Nyholm\Psr7\ServerRequest))
#18 /var/www/html/app/Http/Middleware/ClientIp.php(47): Middlewares\ClientIp->process(Object(Nyholm\Psr7\ServerRequest), Object(Middleland\Dispatcher))
#19 /var/www/html/vendor/oscarotero/middleland/src/Dispatcher.php(136): Fisharebest\Webtrees\Http\Middleware\ClientIp->process(Object(Nyholm\Psr7\ServerRequest), Object(Middleland\Dispatcher))
#20 /var/www/html/app/Http/Middleware/HandleExceptions.php(90): Middleland\Dispatcher->handle(Object(Nyholm\Psr7\ServerRequest))
#21 /var/www/html/vendor/oscarotero/middleland/src/Dispatcher.php(136): Fisharebest\Webtrees\Http\Middleware\HandleExceptions->process(Object(Nyholm\Psr7\ServerRequest), Object(Middleland\Dispatcher))
#22 /var/www/html/app/Http/Middleware/BaseUrl.php(77): Middleland\Dispatcher->handle(Object(Nyholm\Psr7\ServerRequest))
#23 /var/www/html/vendor/oscarotero/middleland/src/Dispatcher.php(136): Fisharebest\Webtrees\Http\Middleware\BaseUrl->process(Object(Nyholm\Psr7\ServerRequest), Object(Middleland\Dispatcher))
#24 /var/www/html/app/Http/Middleware/ReadConfigIni.php(69): Middleland\Dispatcher->handle(Object(Nyholm\Psr7\ServerRequest))
#25 /var/www/html/vendor/oscarotero/middleland/src/Dispatcher.php(136): Fisharebest\Webtrees\Http\Middleware\ReadConfigIni->process(Object(Nyholm\Psr7\ServerRequest), Object(Middleland\Dispatcher))
#26 /var/www/html/app/Http/Middleware/SecurityHeaders.php(47): Middleland\Dispatcher->handle(Object(Nyholm\Psr7\ServerRequest))
#27 /var/www/html/vendor/oscarotero/middleland/src/Dispatcher.php(136): Fisharebest\Webtrees\Http\Middleware\SecurityHeaders->process(Object(Nyholm\Psr7\ServerRequest), Object(Middleland\Dispatcher))
#28 /var/www/html/app/Http/Middleware/EmitResponse.php(57): Middleland\Dispatcher->handle(Object(Nyholm\Psr7\ServerRequest))
#29 /var/www/html/vendor/oscarotero/middleland/src/Dispatcher.php(136): Fisharebest\Webtrees\Http\Middleware\EmitResponse->process(Object(Nyholm\Psr7\ServerRequest), Object(Middleland\Dispatcher))
#30 /var/www/html/app/Http/Middleware/PhpEnvironment.php(49): Middleland\Dispatcher->handle(Object(Nyholm\Psr7\ServerRequest))
#31 /var/www/html/vendor/oscarotero/middleland/src/Dispatcher.php(136): Fisharebest\Webtrees\Http\Middleware\PhpEnvironment->process(Object(Nyholm\Psr7\ServerRequest), Object(Middleland\Dispatcher))
#32 /var/www/html/vendor/oscarotero/middleland/src/Dispatcher.php(118): Middleland\Dispatcher->handle(Object(Nyholm\Psr7\ServerRequest))
#33 /var/www/html/index.php(57): Middleland\Dispatcher->dispatch(Object(Nyholm\Psr7\ServerRequest))
#34 {main}
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.