Giter Club home page Giter Club logo

screeps-launcher's Introduction

A better launcher for Screeps private servers

CircleCI

Why?

  • The steam private server has a few limitations, one being that getting non-workshop mods to work is a huge headache.
  • The npm version is much better, but requires care in installing everything correctly.

Therefore, the goal of this is to simplify the entire process making it much easier to use. No need to manually npm install anything, its handled automatically

Guides

If installing on ubuntu 18.04 or on a Pi with raspbian, theres also a guide on reddit here that does a step-by-step setup including mongo, redis, and auto start.

Usage

  1. Download a release from the Releases Page
  2. Drop into an empty folder or your PATH
  3. Get your Steam API key
  4. Create config.yml (All fields are optional! You can pass STEAM_KEY as an environment variable)
steamKey: keyFromStep3
# Sometimes dependencies change in ways that break screeps-launcher or the builds it does.  To work around those issues, some package versions need to be pinned.  See the current list in the README at https://github.com/screepers/screeps-launcher/ or the specific issue tracking pinned packages: https://github.com/screepers/screeps-launcher/issues/34
pinnedPackages:
  ssri: 8.0.1
  cacache: 15.3.0
  passport-steam: 1.0.17
  minipass-fetch: 2.1.2
  express-rate-limit: 6.7.0
mods: # Recommended mods
- screepsmod-auth
- screepsmod-admin-utils
- screepsmod-mongo  # You must install and start `mongodb` and `redis` before this mod will work
bots:
  simplebot: screepsbot-zeswarm
serverConfig: # This section requires screepsmod-admin-utils to work
  welcomeText:  |
    <h1 style="text-align: center;">My Cool Server</h1>
  constants: # Used to override screeps constants
    TEST_CONSTANT: 123
  tickRate: 1000  # In milliseconds. This is a lower bound. Users reported problems when set too low.
  1. Open a shell to folder
  2. Run screeps-launcher
  3. If you installed screepsmod-mongo, run screeps-launcher cli in another shell, and run system.resetAllData() to init the DB. It completes instantly, restart the server after.
  4. Done!

You can use screeps-launcher cli in the same folder for CLI access

Other options

There are several extra arguments that can be used to manage the install:

  • screeps-launcher apply Applies the current config.yml without starting the server.
  • screeps-launcher upgrade Upgrades all packages (screeps, mods, bots, etc)
  • screeps-launcher cli Launch a screeps cli
  • screeps-launcher backup <file> Creates a backup
  • screeps-launcher restore <file> Restores a backup (Warning: Completely replaces existing data)

docker-compose

There is also an example docker-compose.yml that starts a server + mongo. This is the easiest way to get a private server working on windows and using mongo + redis.

  1. Install docker (look on the left to find the correct platform).
  2. You might have to fiddle with the docker advanced settings to allow enough CPU to run the server smoothly.
  3. Create an empty folder with both a config.yml (don't forget to add screepsmod-mongo!) and a docker-compose.yml (see examples). The docker-compose.yml example can be used as-is, but the config.yml requires some customization. Remove environments (line 2-5) in config.yml, since they are defined in docker-compose.yml.
  4. Open a terminal in that folder. Run docker-compose up to start the services. Wait until it is done starting the docker images and settle on mongo status messages.
  5. Open another terminal in that folder. Run docker-compose exec screeps screeps-launcher cli. This is a command-line interface to control your new private server.
  6. In the CLI, run system.resetAllData() to initialize the database. Unless you want to poke around, use Ctrl-d to exit the cli.
  7. Run docker-compose restart screeps to reboot the private server.

Your server should be up and running! Connect to it using the steam client:

Choose the Private Server tab and connect using those options:

  • Host: localhost
  • Port: 21025
  • Server password: <leave blank, unless configured otherwise>

Docker

Docker builds are published to Dockerhub as screepers/screeps-launcher Quickstart:

  1. Create config file in an empty folder (/srv/screeps is used for this example)
  2. Run docker run --restart=unless-stopped --name MyScreepsServer -v /srv/screeps:/screeps -p 21025:21025 screepers/screeps-launcher
  3. Done!

Mods

You can easily install mods by adding their names to the config.yml file. The screeps-launcher takes care of downloading them for you. Mods can be found in the ScreepsMods github repository.

A few mods of interests:

  • screepsmod-mongo (needed to actually use mongo+redis!)
  • screepsmod-auth (use it to change your password by going to [http://localhost:21025/authmod/password])
  • screepsmod-admin-utils
  • screepsmod-map-tool
  • screepsmod-history
  • screepsmod-market

See each of their documentation on the ScreepsMods github repository.

Bots

You can add bots to spawn in by adding either their names or path to the code on your file system in the config.yml file. See config.sample.yml for an example.

Building for a PI

You can easily build your own docker image for an ARM architecute via the Docker build arg ARCH.

screeps-launcher's People

Contributors

alex-mohr avatar alinanova21 avatar asalvail avatar jomik avatar kalgen432 avatar pawndev avatar philipp-horstenkamp avatar pointerevent avatar rejectpretzel avatar shanemadden avatar tboerger avatar

Stargazers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

Watchers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar

screeps-launcher's Issues

[feature] Support docker / docker-compose secrets for steamKey

I'm a big fan of isolating secrets away from configuration. Making secrets available in docker-compose (without running docker in swarm mode) is fairly easy, and supporting that feature should be straightforward enough.

Proposal: If steamKeyFile is specified instead of steamKey, then the exact contents of the file specified in steamKeyFile should be used.

To use this in docker-compose afterwards, the compose file would need to specify a new secret like so:

version: '3'
services:
  screeps:
    image: screepers/screeps-launcher
    volumes:
      - ./config.yml:/screeps/config.yml
      - screeps-data:/screeps
    ports:
      - 21025:21025/tcp
    environment:
      MONGO_HOST: mongo
      REDIS_HOST: redis
    restart: unless-stopped
    secrets:
      - screeps_steam_key

  mongo:
    image: mongo
    volumes:
      - mongo-data:/data/db
    restart: unless-stopped

  redis:
    image: redis
    volumes:
      - redis-data:/data
    restart: unless-stopped

volumes:
  redis-data:
  mongo-data:
  screeps-data:


secrets:
  screeps_steam_key:
    file: ./screeps_steam_key

Pros:

  • configuration can be safely version controlled afterwards without recording secrets
  • configuration can be more easily shared, since redaction should be less likely to be necessary

Cons:

  • configuration logic will become more complex, since now either steamKey or steamKeyFile should be specified (exclusive or)

Unfortunately, I'm not familiar enough with Go, otherwise I'd throw a PR down instead of an issue.

Docker-Compose not working.

Hey with the latest Docker-Compose version i got this error.

2022/11/12 05:21:19 Installing Node
2022/11/12 05:21:19 Downloading https://nodejs.org/dist/v12.22.12/node-v12.22.12-linux-x64.tar.gz...
2022/11/12 05:21:19   200 OK
2022/11/12 05:21:19   downloaded 0/23131523 bytes (0.00%)
2022/11/12 05:21:19 Download failed: open node-v12.22.12-linux-x64.tar.gz: permission denied
2022/11/12 05:21:19 node-v12.22.12-linux-x64.tar.gz
2022/11/12 05:21:19 node-v12.22.12-linux-x64
2022/11/12 05:21:19 rename deps/node-v12.22.12-linux-x64 deps/node: no such file or directory

modify config.sample.yml

Hi ags,

As seen on slack: I was trying to use the screeps-launcher\docker-compose instructions to install and run the private server, but was getting a bunch of errors related to the server not connecting to mongo/redis.

After a looking through the docker docs I modified config.yml:

env:
  shared:
    MONGO_HOST: localhost
    REDIS_HOST: localhost

to

env:
  shared:
    MONGO_HOST: mongo
    REDIS_HOST: redis

and this solved the problem.
Net result being that the only config required was renaming the file and adding my steam key.

I tried to create a PR but don't have permission, so adding an issue.

Thanks

Tim(Sca1ey)

Pinned packages needed to build screeps node packages

Currently, pinnedPackages configuration is needed to get the screeps packages built successfully by launcher, due to upstream packages releasing versions that break compatibility with node 12.

Creating this issue as a place to collect the needed pins and add to it as necessary.

Known necessary pins so far (see #33)

pinnedPackages:
  ssri: 8.0.1
  cacache: 16.1.3
  passport-steam: 1.0.17
  minipass-fetch: 3.0.3

isolated-vm fails to install

isolated-vm fails on docker run, including with docker run --restart=unless-stopped --memory=4g --memory-swap=8g --name MyScreepsServer -v ${PWD}:/screeps -p 21025:21025 screepers/screeps-launcher. --memory and --memory-swap were added to as a potential fix mentioned here #6, but no luck. Also fails running without port exposure, directory sharing, and through the docker GUI.

Log file for isolated-vm@npm:2.1.1:

# This file contains the result of Yarn building a package (isolated-vm@npm:2.1.1)
# Script name: install

gyp info it worked if it ends with ok
gyp info using [email protected]
gyp info using [email protected] | linux | x64
gyp info find Python using Python version 3.7.3 found at "/usr/bin/python3"
gyp ERR! UNCAUGHT EXCEPTION 
gyp ERR! stack /screeps/node_modules/ssri/lib/index.js:16
gyp ERR! stack const getOptString = options => options?.length ? `?${options.join('?')}` : ''
gyp ERR! stack                                         ^
gyp ERR! stack 
gyp ERR! stack SyntaxError: Unexpected token '.'
gyp ERR! stack     at wrapSafe (internal/modules/cjs/loader.js:915:16)
gyp ERR! stack     at Module._compile (internal/modules/cjs/loader.js:963:27)
gyp ERR! stack     at Object.Module._extensions..js (internal/modules/cjs/loader.js:1027:10)
gyp ERR! stack     at Module.load (internal/modules/cjs/loader.js:863:32)
gyp ERR! stack     at Function.Module._load (internal/modules/cjs/loader.js:708:14)
gyp ERR! stack     at Module.require (internal/modules/cjs/loader.js:887:19)
gyp ERR! stack     at require (internal/modules/cjs/helpers.js:74:18)
gyp ERR! stack     at Object.<anonymous> (/screeps/node_modules/make-fetch-happen/lib/cache/policy.js:3:14)
gyp ERR! stack     at Module._compile (internal/modules/cjs/loader.js:999:30)
gyp ERR! stack     at Object.Module._extensions..js (internal/modules/cjs/loader.js:1027:10)
gyp ERR! System Linux 5.10.102.1-microsoft-standard-WSL2
gyp ERR! command "/screeps/deps/node/bin/node" "/screeps/node_modules/node-gyp/bin/node-gyp.js" "rebuild" "--release" "-j" "4"
gyp ERR! cwd /screeps/node_modules/isolated-vm
gyp ERR! node -v v12.22.12
gyp ERR! node-gyp -v v9.4.0
gyp ERR! Node-gyp failed to build your package.
gyp ERR! Try to update npm and/or node-gyp and if it does not help file an issue with the package author.

@screeps/driver@npm:5.2.1 also fails but it looks like it depends on isolated-vm.

Installing Node failed

We are trying to set up a private server on Raspberry Pi 3 running Raspbian following this guide using the latest version:

Once we try to run the ./screeps-launcher inside terminal it tries to install NodeJS and fails with error code 404.

image

We are using the screeps-launcher_v1.15.1_linux_arm version as it is the only we were actually able to execute. As we later found out inside the source code of the install.go file at line 201, it sets the arch to armv6l and tries to install NodeJS based on that.

We then found out there is no such distributable for the NodeJS based on the Index of /dist/v12.22.12/ and our Raspberry is also running on armv7l architecture as shown in the screenshot below.

image

We are able to manually install the correct armv7l version of NodeJS, but the ./screeps-launcher keeps looking for the armv6l version as it is predefined in the code.

Any ideas on how to tackle this?

Enable pixels in the market

Hi! It seems that the pixels are not available by default, even after installing screepsmod-market.
How may I procede?

Cannot start a docker container

Hi all just tried to start a screeps server in docker using both docker compose and just a strait docker image and got the same error both times. I have tried to google it but cant find anything solid any idea's.

`2021/08/09 16:10:27 screeps-launcher ()
2021/08/09 16:10:27 Loaded config from config.yaml
2021/08/09 16:10:27 Writing package.json
2021/08/09 16:10:27 Running yarn
2021/08/09 16:10:27 Exec: yarn config set nodeLinker node-modules
internal/modules/cjs/loader.js:638
throw err;
^

Error: Cannot find module 'worker_threads'
at Function.Module._resolveFilename (internal/modules/cjs/loader.js:636:15)
at Function.Module._load (internal/modules/cjs/loader.js:562:25)
at Module.require (internal/modules/cjs/loader.js:692:17)
at require (internal/modules/cjs/helpers.js:25:18)
at /screeps/.yarn/releases/yarn-berry.cjs:289:2658
at Object. (/screeps/.yarn/releases/yarn-berry.cjs:586:2636)
at Module._compile (internal/modules/cjs/loader.js:778:30)
at Object.Module._extensions..js (internal/modules/cjs/loader.js:789:10)
at Module.load (internal/modules/cjs/loader.js:653:32)
at tryModuleLoad (internal/modules/cjs/loader.js:593:12)
2021/08/09 16:10:28 exit status 1`

any help will be great thanks.

Ubuntu 22.04 breaks screeps-launcher

Here is a copy of the log of where it fails when building screeps/driver

# This file contains the result of Yarn building a package (@screeps/driver@npm:5.2.1)
# Script name: install

gyp info it worked if it ends with ok
gyp info using [email protected]
gyp info using [email protected] | linux | arm64
gyp info chdir native
gyp info spawn /usr/bin/python2
gyp info spawn args [
gyp info spawn args   '/home/ubuntu/Server/Screeps/node_modules/@screeps/driver/node_modules/node-gyp/gyp/gyp_main.py',
gyp info spawn args   'binding.gyp',
gyp info spawn args   '-f',
gyp info spawn args   'make',
gyp info spawn args   '-I',
gyp info spawn args   '/home/ubuntu/Server/Screeps/node_modules/@screeps/driver/native/build/config.gypi',
gyp info spawn args   '-I',
gyp info spawn args   '/home/ubuntu/Server/Screeps/node_modules/@screeps/driver/node_modules/node-gyp/addon.gypi',
gyp info spawn args   '-I',
gyp info spawn args   '/home/ubuntu/.node-gyp/12.22.12/include/node/common.gypi',
gyp info spawn args   '-Dlibrary=shared_library',
gyp info spawn args   '-Dvisibility=default',
gyp info spawn args   '-Dnode_root_dir=/home/ubuntu/.node-gyp/12.22.12',
gyp info spawn args   '-Dnode_gyp_dir=/home/ubuntu/Server/Screeps/node_modules/@screeps/driver/node_modules/node-gyp',
gyp info spawn args   '-Dnode_lib_file=/home/ubuntu/.node-gyp/12.22.12/<(target_arch)/node.lib',
gyp info spawn args   '-Dmodule_root_dir=/home/ubuntu/Server/Screeps/node_modules/@screeps/driver/native',
gyp info spawn args   '-Dnode_engine=v8',
gyp info spawn args   '--depth=.',
gyp info spawn args   '--no-parallel',
gyp info spawn args   '--generator-output',
gyp info spawn args   'build',
gyp info spawn args   '-Goutput_dir=.'
gyp info spawn args ]
gyp info spawn make
gyp info spawn args [ 'BUILDTYPE=Release', '-C', 'build' ]
make: Entering directory '/home/ubuntu/Server/Screeps/node_modules/@screeps/driver/native/build'
  CXX(target) Release/obj.target/native/src/main.o
In file included from ../src/main.cc:5:
../src/pf.h:16:28: error: ‘numeric_limits’ is not a member of ‘std’
   16 |         static_assert(std::numeric_limits<pos_index_t>::max() > 2500 * k_max_rooms, "pos_index_t is too small");
      |                            ^~~~~~~~~~~~~~
../src/pf.h:16:54: error: expected primary-expression before ‘>’ token
   16 |         static_assert(std::numeric_limits<pos_index_t>::max() > 2500 * k_max_rooms, "pos_index_t is too small");
      |                                                      ^
../src/pf.h:16:57: error: ‘::max’ has not been declared; did you mean ‘std::max’?
   16 |         static_assert(std::numeric_limits<pos_index_t>::max() > 2500 * k_max_rooms, "pos_index_t is too small");
      |                                                         ^~~
      |                                                         std::max
In file included from /usr/include/c++/11/algorithm:62,
                 from ../../../../nan/nan.h:63,
                 from ../src/main.cc:2:
/usr/include/c++/11/bits/stl_algo.h:3467:5: note: ‘std::max’ declared here
 3467 |     max(initializer_list<_Tp> __l, _Compare __comp)
      |     ^~~
In file included from ../src/main.cc:5:
../src/pf.h: In member function ‘void screeps::open_closed_t<capacity>::clear()’:
../src/pf.h:186:42: error: ‘numeric_limits’ is not a member of ‘std’
  186 |                                 if (std::numeric_limits<marker_t>::max() - 2 <= marker) {
      |                                          ^~~~~~~~~~~~~~
../src/pf.h:186:65: error: expected primary-expression before ‘>’ token
  186 |                                 if (std::numeric_limits<marker_t>::max() - 2 <= marker) {
      |                                                                 ^
../src/pf.h:186:68: error: ‘::max’ has not been declared; did you mean ‘std::max’?
  186 |                                 if (std::numeric_limits<marker_t>::max() - 2 <= marker) {
      |                                                                    ^~~
      |                                                                    std::max
In file included from /usr/include/c++/11/algorithm:62,
                 from ../../../../nan/nan.h:63,
                 from ../src/main.cc:2:
/usr/include/c++/11/bits/stl_algo.h:3467:5: note: ‘std::max’ declared here
 3467 |     max(initializer_list<_Tp> __l, _Compare __comp)
      |     ^~~
In file included from ../src/main.cc:5:
../src/pf.h: At global scope:
../src/pf.h:342:65: error: ‘numeric_limits’ is not a member of ‘std’
  342 |                         static constexpr cost_t obstacle = std::numeric_limits<cost_t>::max();
      |                                                                 ^~~~~~~~~~~~~~
../src/pf.h:342:86: error: expected primary-expression before ‘>’ token
  342 |                         static constexpr cost_t obstacle = std::numeric_limits<cost_t>::max();
      |                                                                                      ^
../src/pf.h:342:89: error: ‘::max’ has not been declared; did you mean ‘std::max’?
  342 |                         static constexpr cost_t obstacle = std::numeric_limits<cost_t>::max();
      |                                                                                         ^~~
      |                                                                                         std::max
In file included from /usr/include/c++/11/algorithm:62,
                 from ../../../../nan/nan.h:63,
                 from ../src/main.cc:2:
/usr/include/c++/11/bits/stl_algo.h:3467:5: note: ‘std::max’ declared here
 3467 |     max(initializer_list<_Tp> __l, _Compare __comp)
      |     ^~~
In file included from ../../../../nan/nan.h:60,
                 from ../src/main.cc:2:
/home/ubuntu/.node-gyp/12.22.12/include/node/node.h:736:7: warning: cast between incompatible function types from ‘void (*)(Nan::ADDON_REGISTER_FUNCTION_ARGS_TYPE)’ {aka ‘void (*)(v8::Local<v8::Object>)’} to ‘node::addon_register_func’ {aka ‘void (*)(v8::Local<v8::Object>, v8::Local<v8::Value>, void*)’} [-Wcast-function-type]
  736 |       (node::addon_register_func) (regfunc),                          \
      |       ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
/home/ubuntu/.node-gyp/12.22.12/include/node/node.h:770:3: note: in expansion of macro ‘NODE_MODULE_X’
  770 |   NODE_MODULE_X(modname, regfunc, NULL, 0)  // NOLINT (readability/null_usage)
      |   ^~~~~~~~~~~~~
../src/main.cc:63:1: note: in expansion of macro ‘NODE_MODULE’
   63 | NODE_MODULE(native, init);
      | ^~~~~~~~~~~

command arguments missing

I think, there is a mistake in screeps-launcher/cmd/screeps-launcher/main.go
I cannot call screeps-launcher without any parameter to start the server. In line 19 you are accessing os.Args[1] but if you don't give any parameter, the array-element 1 dosn't exist.
In the consoel I'm getting the following error:

~/screeps-launcher$ sudo ./screeps-launcher
panic: runtime error: index out of range

goroutine 1 [running]:
main.main()
/home/circleci/project/cmd/screeps-launcher/main.go:19 +0x1cd

Isolated VM building is hanging, can't be cancelled (raspberry pi)

I've been struggling all day to get screeps to work; I've even nuked my raspberry pi and installed a fresh copy of raspian. So this error seems to occur even on a fresh OS. When I try to cancel the build, it just keeps going. The only way to stop it was to unplug the pi.

Unable to install on WIndows 10 Possible Dependency problems

I've tried to install using the screeps-launcher_v1.9.5_windows_amd64.exe to install on Windows 10 x64 system. I'm not sure if having an already installed version of NodeJS leads to the problem considering this is bundle with a version of NodeJS already. To me it seems like it sets up it's own environment to install everything you need so I doubt that is the problem which leads me to think there is something wrong and refuses to install all the way through.

Here is the output from using CMD.exe in Adminstrative mode to install it via Command Line
Click here for the output <- Provide via pastebin.com

Any information regarding the issue or how to resolve it would be nice thank you for your time if you decide to look into the matter as NPM installs are getting to be annoying and was hopping this tool would work for me.

Procesors and server failing with exit status 1

I've followed the docker-compose way and got below errors, any clues would be helpful. Just want to setup local development server.

docker-compose up
Creating network "my-server-cfg_default" with the default driver
Creating my-server-cfg_mongo_1   ... done
Creating my-server-cfg_redis_1   ... done
Creating my-server-cfg_screeps_1 ... done
Attaching to my-server-cfg_screeps_1, my-server-cfg_redis_1, my-server-cfg_mongo_1
mongo_1    | {"t":{"$date":"2021-02-04T20:25:51.233+00:00"},"s":"I",  "c":"CONTROL",  "id":23285,   "ctx":"main","msg":"Automatically disabling TLS 1.0, to force-enable TLS 1.0 specify --sslDisabledProtocols 'none'"}
redis_1    | 1:C 04 Feb 2021 20:25:51.062 # oO0OoO0OoO0Oo Redis is starting oO0OoO0OoO0Oo
redis_1    | 1:C 04 Feb 2021 20:25:51.062 # Redis version=6.0.10, bits=64, commit=00000000, modified=0, pid=1, just started
redis_1    | 1:C 04 Feb 2021 20:25:51.062 # Warning: no config file specified, using the default config. In order to specify a config file use redis-server /path/to/redis.conf
screeps_1  | 2021/02/04 20:25:50 screeps-launcher  ()
screeps_1  | 2021/02/04 20:25:50 Loaded config from config.yml
redis_1    | 1:M 04 Feb 2021 20:25:51.063 * Running mode=standalone, port=6379.
redis_1    | 1:M 04 Feb 2021 20:25:51.063 # Server initialized
mongo_1    | {"t":{"$date":"2021-02-04T20:25:51.235+00:00"},"s":"W",  "c":"ASIO",     "id":22601,   "ctx":"main","msg":"No TransportLayer configured during NetworkInterface startup"}
redis_1    | 1:M 04 Feb 2021 20:25:51.063 # WARNING overcommit_memory is set to 0! Background save may fail under low memory condition. To fix this issue add 'vm.overcommit_memory = 1' to /etc/sysctl.conf and then reboot or run the command 'sysctl vm.overcommit_memory=1' for this to take effect.
screeps_1  | 2021/02/04 20:25:50 Writing package.json
mongo_1    | {"t":{"$date":"2021-02-04T20:25:51.235+00:00"},"s":"I",  "c":"NETWORK",  "id":4648601, "ctx":"main","msg":"Implicit TCP FastOpen unavailable. If TCP FastOpen is required, set tcpFastOpenServer, tcpFastOpenClient, and tcpFastOpenQueueSize."}
screeps_1  | 2021/02/04 20:25:50 Running yarn
screeps_1  | 2021/02/04 20:25:50 Exec: yarn config set nodeLinker node-modules
redis_1    | 1:M 04 Feb 2021 20:25:51.063 * Loading RDB produced by version 6.0.10
redis_1    | 1:M 04 Feb 2021 20:25:51.063 * RDB age 23 seconds
redis_1    | 1:M 04 Feb 2021 20:25:51.063 * RDB memory usage when created 0.76 Mb
redis_1    | 1:M 04 Feb 2021 20:25:51.063 * DB loaded from disk: 0.000 seconds
redis_1    | 1:M 04 Feb 2021 20:25:51.063 * Ready to accept connections
mongo_1    | {"t":{"$date":"2021-02-04T20:25:51.235+00:00"},"s":"I",  "c":"STORAGE",  "id":4615611, "ctx":"initandlisten","msg":"MongoDB starting","attr":{"pid":1,"port":27017,"dbPath":"/data/db","architecture":"64-bit","host":"371f503b73ae"}}
mongo_1    | {"t":{"$date":"2021-02-04T20:25:51.235+00:00"},"s":"I",  "c":"CONTROL",  "id":23403,   "ctx":"initandlisten","msg":"Build Info","attr":{"buildInfo":{"version":"4.4.3","gitVersion":"913d6b62acfbb344dde1b116f4161360acd8fd13","openSSLVersion":"OpenSSL 1.1.1  11 Sep 2018","modules":[],"allocator":"tcmalloc","environment":{"distmod":"ubuntu1804","distarch":"x86_64","target_arch":"x86_64"}}}}
mongo_1    | {"t":{"$date":"2021-02-04T20:25:51.235+00:00"},"s":"I",  "c":"CONTROL",  "id":51765,   "ctx":"initandlisten","msg":"Operating System","attr":{"os":{"name":"Ubuntu","version":"18.04"}}}
mongo_1    | {"t":{"$date":"2021-02-04T20:25:51.235+00:00"},"s":"I",  "c":"CONTROL",  "id":21951,   "ctx":"initandlisten","msg":"Options set by command line","attr":{"options":{"net":{"bindIp":"*"}}}}
mongo_1    | {"t":{"$date":"2021-02-04T20:25:51.236+00:00"},"s":"I",  "c":"STORAGE",  "id":22270,   "ctx":"initandlisten","msg":"Storage engine to use detected by data files","attr":{"dbpath":"/data/db","storageEngine":"wiredTiger"}}
mongo_1    | {"t":{"$date":"2021-02-04T20:25:51.237+00:00"},"s":"I",  "c":"STORAGE",  "id":22297,   "ctx":"initandlisten","msg":"Using the XFS filesystem is strongly recommended with the WiredTiger storage engine. See http://dochub.mongodb.org/core/prodnotes-filesystem","tags":["startupWarnings"]}
mongo_1    | {"t":{"$date":"2021-02-04T20:25:51.237+00:00"},"s":"I",  "c":"STORAGE",  "id":22315,   "ctx":"initandlisten","msg":"Opening WiredTiger","attr":{"config":"create,cache_size=15521M,session_max=33000,eviction=(threads_min=4,threads_max=4),config_base=false,statistics=(fast),log=(enabled=true,archive=true,path=journal,compressor=snappy),file_manager=(close_idle_time=100000,close_scan_interval=10,close_handle_minimum=250),statistics_log=(wait=0),verbose=[recovery_progress,checkpoint_progress,compact_progress],"}}
screeps_1  | ➤ YN0000: Successfully set nodeLinker to 'node-modules'
screeps_1  | 2021/02/04 20:25:51 Exec: yarn 
mongo_1    | {"t":{"$date":"2021-02-04T20:25:51.835+00:00"},"s":"I",  "c":"STORAGE",  "id":22430,   "ctx":"initandlisten","msg":"WiredTiger message","attr":{"message":"[1612470351:835402][1:0x7f1e6a6f3ac0], txn-recover: [WT_VERB_RECOVERY_PROGRESS] Recovering log 4 through 5"}}
mongo_1    | {"t":{"$date":"2021-02-04T20:25:51.868+00:00"},"s":"I",  "c":"STORAGE",  "id":22430,   "ctx":"initandlisten","msg":"WiredTiger message","attr":{"message":"[1612470351:868596][1:0x7f1e6a6f3ac0], txn-recover: [WT_VERB_RECOVERY_PROGRESS] Recovering log 5 through 5"}}
mongo_1    | {"t":{"$date":"2021-02-04T20:25:51.920+00:00"},"s":"I",  "c":"STORAGE",  "id":22430,   "ctx":"initandlisten","msg":"WiredTiger message","attr":{"message":"[1612470351:920612][1:0x7f1e6a6f3ac0], txn-recover: [WT_VERB_RECOVERY | WT_VERB_RECOVERY_PROGRESS] Main recovery loop: starting at 4/6784 to 5/256"}}
mongo_1    | {"t":{"$date":"2021-02-04T20:25:51.988+00:00"},"s":"I",  "c":"STORAGE",  "id":22430,   "ctx":"initandlisten","msg":"WiredTiger message","attr":{"message":"[1612470351:988810][1:0x7f1e6a6f3ac0], txn-recover: [WT_VERB_RECOVERY_PROGRESS] Recovering log 4 through 5"}}
screeps_1  | ➤ YN0000: ┌ Resolution step
mongo_1    | {"t":{"$date":"2021-02-04T20:25:52.092+00:00"},"s":"I",  "c":"STORAGE",  "id":22430,   "ctx":"initandlisten","msg":"WiredTiger message","attr":{"message":"[1612470352:92890][1:0x7f1e6a6f3ac0], txn-recover: [WT_VERB_RECOVERY_PROGRESS] Recovering log 5 through 5"}}
mongo_1    | {"t":{"$date":"2021-02-04T20:25:52.127+00:00"},"s":"I",  "c":"STORAGE",  "id":22430,   "ctx":"initandlisten","msg":"WiredTiger message","attr":{"message":"[1612470352:127268][1:0x7f1e6a6f3ac0], txn-recover: [WT_VERB_RECOVERY | WT_VERB_RECOVERY_PROGRESS] Set global recovery timestamp: (0, 0)"}}
mongo_1    | {"t":{"$date":"2021-02-04T20:25:52.127+00:00"},"s":"I",  "c":"STORAGE",  "id":22430,   "ctx":"initandlisten","msg":"WiredTiger message","attr":{"message":"[1612470352:127322][1:0x7f1e6a6f3ac0], txn-recover: [WT_VERB_RECOVERY | WT_VERB_RECOVERY_PROGRESS] Set global oldest timestamp: (0, 0)"}}
screeps_1  | ➤ YN0000: └ Completed
screeps_1  | ➤ YN0000: ┌ Fetch step
mongo_1    | {"t":{"$date":"2021-02-04T20:25:52.422+00:00"},"s":"I",  "c":"STORAGE",  "id":4795906, "ctx":"initandlisten","msg":"WiredTiger opened","attr":{"durationMillis":1185}}
mongo_1    | {"t":{"$date":"2021-02-04T20:25:52.422+00:00"},"s":"I",  "c":"RECOVERY", "id":23987,   "ctx":"initandlisten","msg":"WiredTiger recoveryTimestamp","attr":{"recoveryTimestamp":{"$timestamp":{"t":0,"i":0}}}}
mongo_1    | {"t":{"$date":"2021-02-04T20:25:52.423+00:00"},"s":"I",  "c":"STORAGE",  "id":4366408, "ctx":"initandlisten","msg":"No table logging settings modifications are required for existing WiredTiger tables","attr":{"loggingEnabled":true}}
mongo_1    | {"t":{"$date":"2021-02-04T20:25:52.423+00:00"},"s":"I",  "c":"STORAGE",  "id":22262,   "ctx":"initandlisten","msg":"Timestamp monitor starting"}
screeps_1  | ➤ YN0000: └ Completed in 0s 291ms
screeps_1  | ➤ YN0000: ┌ Link step
screeps_1  | ➤ YN0062: │ fsevents@patch:fsevents@npm%3A2.3.1#builtin<compat/fsevents>::version=2.3.1&hash=11e9ea The platform linux is incompatible with this module, link skipped.
screeps_1  | ➤ YN0062: │ fsevents@patch:fsevents@npm%3A1.2.13#builtin<compat/fsevents>::version=1.2.13&hash=11e9ea The platform linux is incompatible with this module, link skipped.
mongo_1    | {"t":{"$date":"2021-02-04T20:25:52.543+00:00"},"s":"W",  "c":"CONTROL",  "id":22120,   "ctx":"initandlisten","msg":"Access control is not enabled for the database. Read and write access to data and configuration is unrestricted","tags":["startupWarnings"]}
mongo_1    | {"t":{"$date":"2021-02-04T20:25:52.545+00:00"},"s":"I",  "c":"STORAGE",  "id":20536,   "ctx":"initandlisten","msg":"Flow Control is enabled on this deployment"}
mongo_1    | {"t":{"$date":"2021-02-04T20:25:52.546+00:00"},"s":"I",  "c":"FTDC",     "id":20625,   "ctx":"initandlisten","msg":"Initializing full-time diagnostic data capture","attr":{"dataDirectory":"/data/db/diagnostic.data"}}
mongo_1    | {"t":{"$date":"2021-02-04T20:25:52.547+00:00"},"s":"I",  "c":"NETWORK",  "id":23015,   "ctx":"listener","msg":"Listening on","attr":{"address":"/tmp/mongodb-27017.sock"}}
mongo_1    | {"t":{"$date":"2021-02-04T20:25:52.547+00:00"},"s":"I",  "c":"NETWORK",  "id":23015,   "ctx":"listener","msg":"Listening on","attr":{"address":"0.0.0.0"}}
mongo_1    | {"t":{"$date":"2021-02-04T20:25:52.547+00:00"},"s":"I",  "c":"NETWORK",  "id":23016,   "ctx":"listener","msg":"Waiting for connections","attr":{"port":27017,"ssl":"off"}}
screeps_1  | ➤ YN0000: └ Completed in 0s 389ms
screeps_1  | ➤ YN0000: Done with warnings in 0s 928ms
screeps_1  | 2021/02/04 20:25:52 Writing mods.json
screeps_1  | 2021/02/04 20:25:52 Writing 3 mods and 2 bots
screeps_1  | 2021/02/04 20:25:52 Starting Server
screeps_1  | 2021/02/04 20:25:52 Started
screeps_1  | 2021/02/04 20:25:52 [processor_6] exec: screeps-engine-processor
screeps_1  | 2021/02/04 20:25:52 [processor_3] exec: screeps-engine-processor
screeps_1  | 2021/02/04 20:25:52 [processor_0] exec: screeps-engine-processor
screeps_1  | 2021/02/04 20:25:52 [main] exec: screeps-engine-main
screeps_1  | 2021/02/04 20:25:52 [runner] exec: screeps-engine-runner
screeps_1  | 2021/02/04 20:25:52 [processor_7] exec: screeps-engine-processor
screeps_1  | 2021/02/04 20:25:52 [processor_4] exec: screeps-engine-processor
screeps_1  | 2021/02/04 20:25:52 [backend] exec: screeps-backend
screeps_1  | 2021/02/04 20:25:52 [processor_2] exec: screeps-engine-processor
screeps_1  | 2021/02/04 20:25:52 [processor_1] exec: screeps-engine-processor
screeps_1  | 2021/02/04 20:25:52 [processor_5] exec: screeps-engine-processor
screeps_1  | 2021/02/04 20:25:53 [main] Exited with error: exit status 1
screeps_1  | 2021/02/04 20:25:53 [processor_6] Exited with error: exit status 1
screeps_1  | 2021/02/04 20:25:53 [processor_7] Exited with error: exit status 1
screeps_1  | 2021/02/04 20:25:53 [processor_3] Exited with error: exit status 1
screeps_1  | 2021/02/04 20:25:53 [runner] Exited with error: exit status 1
screeps_1  | 2021/02/04 20:25:53 [processor_5] Exited with error: exit status 1
screeps_1  | 2021/02/04 20:25:53 [processor_0] Exited with error: exit status 1
screeps_1  | 2021/02/04 20:25:53 [processor_1] Exited with error: exit status 1
screeps_1  | 2021/02/04 20:25:53 [processor_4] Exited with error: exit status 1
screeps_1  | 2021/02/04 20:25:53 [processor_2] Exited with error: exit status 1

Random map generation

When running the server, the generated map is always the same. Is there a problem with the generation system?

Are Redis and MongoDB in the DockerHub image?

Tried run the DockerHub image with screepsmod-mongo in config and got this error in main.log

Error: Redis connection to localhost:6379 failed - connect ECONNREFUSED 127.0.0.1:6379
    at TCPConnectWrap.afterConnect [as oncomplete] (net.js:1144:16)
Emitted 'error' event on RedisClient instance at:
    at RedisClient.on_error (/screeps/node_modules/redis/index.js:342:14)
    at Socket.<anonymous> (/screeps/node_modules/redis/index.js:223:14)
    at Socket.emit (events.js:314:20)
    at emitErrorNT (internal/streams/destroy.js:92:8)
    at emitErrorAndCloseNT (internal/streams/destroy.js:60:3)
    at processTicksAndRejections (internal/process/task_queues.js:84:21) {
  errno: 'ECONNREFUSED',
  code: 'ECONNREFUSED',
  syscall: 'connect',
  address: '127.0.0.1',
  port: 6379
}
==== main Exited ====

Failing to download yarn from github on windows (and now linux too)

On a fresh pull and docker-compose up of the launcher, it fails to download yarn from github with 403 forbidden.

% docker run screepers/screeps-launcher
2023/09/11 14:01:39 Installing Yarn
2023/09/11 14:01:40 yarn-v1.22.19.tar.gz
2023/09/11 14:01:40 Downloading https://github.com/yarnpkg/yarn/releases/download/v1.22.19/yarn-v1.22.19.tar.gz...
2023/09/11 14:01:40 403 Forbidden
2023/09/11 14:01:40 downloaded 0/0 bytes (0.00%)
2023/09/11 14:01:40 Download failed: server returned 403 Forbidden

Screeps launcher includes a User-Agent: screeps-launcher field, so initially I thought it might have blacklisted that agent. But a rebuild of the container seems to fix it.

% docker build .
etc
Successfully built dbf21f16fadb
% docker run dbf21f16fadb
etc
2023/09/11 14:04:58 Installing Yarn
2023/09/11 14:04:59 yarn-v1.22.19.tar.gz
2023/09/11 14:04:59 Downloading https://github.com/yarnpkg/yarn/releases/download/v1.22.19/yarn-v1.22.19.tar.gz...
2023/09/11 14:04:59 200 OK
2023/09/11 14:04:59 downloaded 1244259/1244259 bytes (100.00%)
2023/09/11 14:04:59 Download completed

The base image is FROM buildpack-deps:buster and the tag refers to Debian Buster, which is oldoldstable and released in 2019. Perhaps a change in allowed ciphers or certificates in the underlying OS?

docker image assumes uid/gid and fails

I set up an account on a machine

When I run the container I get the following error:

2024/02/09 20:29:08 screeps-launcher  ()
2024/02/09 20:29:08 Loaded config from config.yml
2024/02/09 20:29:08 Installing Node
2024/02/09 20:29:08 Downloading https://nodejs.org/dist/v12.22.12/node-v12.22.12-linux-x64.tar.gz...
2024/02/09 20:29:08   200 OK
2024/02/09 20:29:08   downloaded 0/23131523 bytes (0.00%)
2024/02/09 20:29:08 Download failed: open node-v12.22.12-linux-x64.tar.gz: permission denied
2024/02/09 20:29:08 node-v12.22.12-linux-x64.tar.gz
2024/02/09 20:29:08 node-v12.22.12-linux-x64
2024/02/09 20:29:08 rename deps/node-v12.22.12-linux-x64 deps/node: no such file or directory

This problem is caused by hardcoding differ uids/gids in the Dockerfile


RUN groupadd --gid 1000 screeps \
  && useradd --uid 1000 --gid screeps --shell /bin/bash --create-home screeps \
  && mkdir /screeps && chown screeps.screeps /screeps

On my machine I happen to have different gids
$ id -a
uid=1002(screeps) gid=1001(screeps) groups=1001(screeps),137(docker)

I edited the dockerfile to have the uids/gids from my user, built and tagged the container, then I was able to get further with starting the container

Docker image does not allow mounting config file

Everything seems to work if I manually put the file where it belongs, but if I follow the docker-compose example and use the volume /path/to/screeps-config.yml:/screeps/config.yml it does not work.

From my reading this is an issue of not creating the file in the docker container itself: https://stackoverflow.com/a/47099098/4404257

To test, use:

version: '3'
services:
  screeps:
    image: screepers/screeps-launcher
    volumes:
      - /path/to/data/screeps:/screeps
      - /path/to/config/screeps-config.yml:/screeps/config.yml
    ports:
      - 21025:21025/tcp
    restart: unless-stopped

And the config:

steamKey: A_VALID_KEY
version: latest
mods:
- screepsmod-admin-utils
- screepsmod-auth
localMods: ./mods

And then run docker-compose up, you should see the error

screeps-service | 2020/12/30 17:42:37 screeps-launcher  ()
screeps-service | 2020/12/30 17:42:37 Loaded config from config.yml
screeps-service | 2020/12/30 17:42:37 Installing Node
screeps-service | 2020/12/30 17:42:37 Downloading https://nodejs.org/dist/v10.23.0/node-v10.23.0-linux-x64.tar.gz...
screeps-service | 2020/12/30 17:42:37   200 OK
screeps-service | 2020/12/30 17:42:37   downloaded 0/21182673 bytes (0.00%)
screeps-service | 2020/12/30 17:42:37 Download failed: open node-v10.23.0-linux-x64.tar.gz: permission denied
screeps-service | 2020/12/30 17:42:37 node-v10.23.0-linux-x64.tar.gz
screeps-service | 2020/12/30 17:42:37 node-v10.23.0-linux-x64
screeps-service | 2020/12/30 17:42:37 rename deps/node-v10.23.0-linux-x64 deps/node: no such file or directory

Set server password

Hi,

is there currently a way to set the password of the private server ? I have found no option for that in the examples nor in the config loading code.

Thanks :)

Setup private server and resetAllData failed

Hi, I following the README to setup my private server, after docker-compose up and docker-compose exec, running the system.resetAllData() in cli, I got Post "http://127.0.0.1:21026/cli": dial tcp 127.0.0.1:21026: connect: connection refused error, how to fix this?

Connecting outside of localhost

I'm trying to set this up on DigitalOcean on Ubuntu 20.04 and I can't seem to get the screeps port to connect to the internet. If I try another container the port is exposed fine with netcat. But with the screeps port I can't ever connect to it outside of localhost. Am I missing something?

config.yml

# steamKey: <YourSteamKey>
# env:
#   shared:
#     MONGO_HOST: localhost
#     REDIS_HOST: localhost
version: latest
mods:
- screepsmod-admin-utils
- screepsmod-auth
- screepsmod-mongo
# bots:
  # simplebot: "screepsbot-zeswarm"
  # overmind: "./bots/overmind/dist" # On windows path needs to be .\\bots\\overmind\\dist
# extraPackages:
#   morgan: "*"
localMods: ./mods
# backup:
#   dirs:
#   - tests
#   - bots/overmind
#   files:
#   - .screepsrc # You probably don't need this, jsut an example
serverConfig:
  welcomeText:  |
    <style>.screepsplus h1{  text-align: center; }</style>
    <div class="screepsplus">
    <h1>ScreepsPlus</h1>
    Wecome to the ScreepsPlus private server.<br>
    Mods include screepsmod-auth and several custom mods to enable email notifications, control tickrate, power banks, portals, and other internal improvements.<br><br>
    <div style="text-align: center">
    This server is funded by backers on Patreon. <br>
    <a target="_blank" href="https://www.patreon.com/bePatron?u=6867142" ><img src="https://c5.patreon.com/external/logo/become_a_patron_button.png"></a>
    </div>
  constants:
    TEST_CONSTANT: 123
  tickRate: 1000

docker-compose.yml - I would expect this to publish the screeps port to 8080, I haven't found any variation on this that works.

version: '3.2'
services:
  screeps:
    image: screepers/screeps-launcher
    volumes:
      - ./config.yml:/screeps/config.yml
      - screeps-data:/screeps
    ports:
      # - 21025:21025/tcp
      - target: 21025
        published: 8080
        protocol: tcp
        mode: host
    environment:
      MONGO_HOST: mongo
      REDIS_HOST: redis
      STEAM_KEY: $STEAM_KEY
    restart: unless-stopped

  mongo:
    image: mongo
    ports:
      - 27017:27017/tcp
    volumes:
      - mongo-data:/data/db
    restart: unless-stopped

  redis:
    image: redis
    ports:
      - 6379:6379/tcp
    volumes:
      - redis-data:/data
    restart: unless-stopped

volumes:
  redis-data:
  mongo-data:
  screeps-data:

commands:

docker-compose up -d
# netstat shows the port open
netstat -plant | grep 80
# nc can connect to the port from the machine but not from home. This works with a simple server.
nc -zvv 0.0.0.0 8080
# simple server example to validate no firewall issues
docker run --rm -p 8080:80 yeasy/simple-web:latest

Docker install fail at yarn semver version

I get this error when doing a fresh install using docker on windows:

2023/11/16 17:03:23 yarn-v1.22.21
2023/11/16 17:03:23 Exec: yarn set version berry
➤ YN0000: Retrieving https://repo.yarnpkg.com/4.0.2/packages/yarnpkg-cli/bin/yarn.js
➤ YN0001: Error: Invalid semver version. yarn --version returned:

    at /screeps/.yarn/releases/yarn-stable-temp.cjs:485:7900
    at runMicrotasks (<anonymous>)
    at processTicksAndRejections (internal/process/task_queues.js:97:5)
    at async $t.mktempPromise (/screeps/.yarn/releases/yarn-stable-temp.cjs:314:69436)
    at async eO (/screeps/.yarn/releases/yarn-stable-temp.cjs:485:7635)
    at async /screeps/.yarn/releases/yarn-stable-temp.cjs:485:4958
    at async Function.start (/screeps/.yarn/releases/yarn-stable-temp.cjs:409:2384)
    at async mu.execute (/screeps/.yarn/releases/yarn-stable-temp.cjs:485:4609)
    at async mu.validateAndExecute (/screeps/.yarn/releases/yarn-stable-temp.cjs:345:664)
    at async Gn.run (/screeps/.yarn/releases/yarn-stable-temp.cjs:359:2057)
➤ YN0000: Failed with errors in 2s 100ms
2023/11/16 17:03:28 exit status 1

Running multiple shard

As stated at the end of this page, the world shards are supported on the private server.
How may I enable this feature?

Thanks in advance!

how to configure map-tool user and password ?

I have tried adding env variable MAPTOOL_USER and MAPTOOL_PASS in docker-compose env and in config.yml env -> common.
or at least how to get console output from map-tool at server launch ? (normally it print a generated password for user "admin")

WONDERFUL_WOZNIAK container installed along side screeps-launcher

When I installed screeps-luancher onto my unraid server from https://hub.docker.com/r/screepers/screeps-launcher/

I get an identical container installed, but it is called WONDERFUL_WOZNIAK.

Is this some type easter egg?

WONDERFUL WOZNIAK is relatively well known as a Steve Wonziak type of harmless technical prank.

EDIT: This has been resolved as external. It is related to how the Unraid server handles installing some Docker containers that the unraid server

Mod pages not loading

Ubuntu 18.04
Screeps-Launcher version - 1.9.7

I have maptools and auth-mod installed, but neither will allow to me load the url. This is a remote server on a fresh install. They will not load on a cli browser (w3m) on the server either. Anyone else have the same problem?

I followed the guide on reddit but used the latest version

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.