Giter Site home page Giter Site logo

gigalixir-cli's People

Contributors

anderssorby avatar andrewek avatar axelclark avatar bryanjbryce avatar chadfennell avatar chadonihi avatar chewfred avatar codyduval avatar cznrhubarb avatar damonvjanis avatar dfalling avatar dustinfarris avatar fdbeirao avatar fireproofsocks avatar gigalixir-michael avatar gigatim avatar iangreenleaf avatar jeff-hostetler avatar jesseshieh avatar joaothallis avatar lodelestra avatar mbirman avatar nikitaavvakumov avatar oleks avatar pangratz avatar pcapel avatar petelacey avatar rhnonose avatar ryan-senn avatar stoneg 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

Watchers

 avatar  avatar  avatar  avatar

gigalixir-cli's Issues

Docs: Different Bin Location with ASDF python

Hi,

Just a possible note for the docs. If you have Python installed via asdf, when you run pip3 install gigalixir, the installed binary will not end up in ~/.local/bin. In fact, it ends up in ~/.asdf/installs/python/3.8.2/bin (of course the version string will differ based on the version of Python you have installed.

You may have to re-shim asdf and restart your terminal for it to be found

Gigalixir Broke Unrelated Apps That I Develop

After playing with Gigalixir recently, I was surprised to find that some other applications that I develop no longer work on my laptop. I lost a few hours tracking down the cause. It boils down to an entry that Gigalixir's tools added to my .netrc file for localhost. Here's the code that performs that change:

https://github.com/gigalixir/gigalixir-cli/blob/master/gigalixir/netrc.py#L37

This modification seems unsafe. It adds—or overrides in some cases—authorization for all loopback requests that honor my .netrc file. That's a pretty sweeping change.

Unknown platform: freebsd

Hi,

I was really looking forward to push a project to Gigalixir, however I encountered the following error while running gigalixir login:

Traceback (most recent call last):
  File "/home/mkaag/.local/bin/gigalixir", line 33, in <module>
    sys.exit(load_entry_point('gigalixir==1.2.5', 'console_scripts', 'gigalixir')())
  File "/home/mkaag/.local/lib/python3.8/site-packages/click/core.py", line 1128, in __call__
    return self.main(*args, **kwargs)
  File "/home/mkaag/.local/lib/python3.8/site-packages/click/core.py", line 1053, in main
    rv = self.invoke(ctx)
  File "/home/mkaag/.local/lib/python3.8/site-packages/click/core.py", line 1656, in invoke
    super().invoke(ctx)
  File "/home/mkaag/.local/lib/python3.8/site-packages/click/core.py", line 1395, in invoke
    return ctx.invoke(self.callback, **ctx.params)
  File "/home/mkaag/.local/lib/python3.8/site-packages/click/core.py", line 754, in invoke
    return __callback(*args, **kwargs)
  File "/home/mkaag/.local/lib/python3.8/site-packages/click/decorators.py", line 26, in new_func
    return f(get_current_context(), *args, **kwargs)
  File "/home/mkaag/.local/lib/python3.8/site-packages/gigalixir/__init__.py", line 251, in cli
    raise Exception("Unknown platform: %s" % PLATFORM)
Exception: Unknown platform: freebsd

Is there a particular version of Python that I should use? Or FreeBSD is out of scope?

Here are my environment:

  • Python 3.8.12
  • pip 20.3.4

Thank you for the Gigalixir platform, this idea is great!
Maurice

gigalixir run ecto.migrate not working

Hey guys, it is my first time using Gigalixir but I'm stuck here with this error:

Running: gigalixir run mix ecto.create return me this in gigalixir logs

web.1  | 03:41:05.114 [error] Postgrex.Protocol (#PID<0.283.0>) failed to connect: ** (DBConnection.ConnectionError) tcp connect (localhost:5432): connection refused - :econnrefused

I've created the Phoenix project and then followed the docs to deploy it, not sure why I am getting this error when I try to run all my migrations because I did create the database using gigalixir pg:create --free and my prod.exs is as follow:

config :chat, ChatWeb.Endpoint,
  http: [port: {:system, "PORT"}], # Possibly not needed, but doesn't hurt
  url: [host: System.get_env("APP_NAME") <> ".gigalixirapp.com", port: 80],
  secret_key_base: Map.fetch!(System.get_env(), "SECRET_KEY_BASE"),
  server: true

config :chat, ChatWeb.Repo,
  adapter: Ecto.Adapters.Postgres,
  url: System.get_env("DATABASE_URL"),
  ssl: true,
  pool_size: 2 # Free tier db only allows 4 connections. Rolling deploys need pool_size*(n+1) connections.

Let me know if you guys need any more details

Support for kitty terminal

When I run gigalixir ps:remote_console in kitty I get the warning
tput: unknown terminal "xterm-kitty". And the resulting console does not support navigating the input or moving through history.

For ssh this is usually resolved by using kitty +kitten ssh

Could you fix it?

`run` command not prepending `Elixir.`

According to the documentation, the gigalixir run $APP_NAME Module command would append Elixir. before the module automatically, which is not happening.
You can check the setup in this branch
Working command: gigalixir run course-planner Elixir.CoursePlanner.ReleaseTasks seed
Not working command: gigalixir run course-planner CoursePlanner.ReleaseTasks seed

Customise logs format

It would be nice to be able to customize the output of the logs command. Right now, there is a lot of duplicated data before any meaningful log is printed, which means it's not possible to view the logs nicely in any standard-width terminal window. For example:

2020-05-21T07:33:04.257862+00:00 funky-slugggy-name[funky-slugggy-name-1231231231-dgdfgg]: web.1 | actual app log goes here

Any app using a logging framework will also include a timestamp at the start of the log statement, which means the timestamp is logged twice in that case too.

My screen fits 238 characters, and 110 of those (46%) are the prefix.

Problem with expired cert with brand new project

Hello,

I'm not sure where else to ask this. Every time I click "help" in the web console, it takes me to hey.com for some reason (I don't have a hey.com address) and the help link itself has no email in it.

So the problem in a nutshell is that whenever I try and git push gigalixir master I get:

fatal: unable to access 'https://git.gigalixir.com/myappname.git/': SSL certificate problem: certificate has expired

(myappname isn't my actual app name)

When I inspect the certificate it is a: "Kubernetes Ingress Controller Fake Certificate"

According to the guide, a certificate should be generated for me. I'm trying with a custom domain but I've also tried with a standard gigalixir subdomain.

I've tried with different version of Elixir and OTP but the latest is:

# elixir_buildpack.config
elixir_version=1.12.3
erlang_version=24.0

My prod.exs looks like this:

  server: true,
  http: [port: {:system, "PORT"}],
  url: [host: "mydomain.com", port: 443], # Note, I have my actual domain there
  secret_key_base: Map.fetch!(System.get_env(), "SECRET_KEY_BASE"),
  force_ssl: [rewrite_on: [:x_forwarded_proto]],

And I have set both my APP_NAME and SECRET_KEY_BASE with the gigalixir cli tool.

Is it obvious what I'm doing wrong?

I'm hopefully filing this issue will work as rubber ducking otherwise I hope you can help.

Thank you!

Cannot run login on windows

Windows 10 64bit

python --version yields Python 2.7.14

pip --version yields pip 9.0.1 from c:\program files\python27\lib\site-packages (python 2.7)

gigalixir --help yields expected output.

gigalixir version crashes.
gigalixir login also crashes with the same output:

> gigalixir version
Traceback (most recent call last):
  File "c:\program files\python27\lib\runpy.py", line 174, in _run_module_as_main
    "__main__", fname, loader, pkg_name)
  File "c:\program files\python27\lib\runpy.py", line 72, in _run_code
    exec code in run_globals
  File "C:\Program Files\Python27\Scripts\gigalixir.exe\__main__.py", line 9, in <module>
  File "c:\program files\python27\lib\site-packages\click\core.py", line 722, in __call__
    return self.main(*args, **kwargs)
  File "c:\program files\python27\lib\site-packages\click\core.py", line 697, in main
    rv = self.invoke(ctx)
  File "c:\program files\python27\lib\site-packages\click\core.py", line 1063, in invoke
    Command.invoke(self, ctx)
  File "c:\program files\python27\lib\site-packages\click\core.py", line 895, in invoke
    return ctx.invoke(self.callback, **ctx.params)
  File "c:\program files\python27\lib\site-packages\click\core.py", line 535, in invoke
    return callback(*args, **kwargs)
  File "c:\program files\python27\lib\site-packages\click\decorators.py", line 17, in new_func
    return f(get_current_context(), *args, **kwargs)
  File "c:\program files\python27\lib\site-packages\gigalixir\__init__.py", line 72, in cli
    PLATFORM = call("uname -s").decode().lower() # linux or darwin
  File "c:\program files\python27\lib\site-packages\gigalixir\shell.py", line 5, in call
    return subprocess.check_output(cmd.split()).strip()
  File "c:\program files\python27\lib\subprocess.py", line 212, in check_output
    process = Popen(stdout=PIPE, *popenargs, **kwargs)
  File "c:\program files\python27\lib\subprocess.py", line 390, in __init__
    errread, errwrite)
  File "c:\program files\python27\lib\subprocess.py", line 640, in _execute_child
    startupinfo)
WindowsError: [Error 2] The system cannot find the file specified

According to pip list, I have the following packages installed:

Package    Version
---------- -------
click      6.7
gigalixir  0.23.0
pip        9.0.1
requests   2.13.0
rollbar    0.13.17
setuptools 38.2.5
six        1.11.0
stripe     1.51.0
wheel      0.30.0

Let me know if you need any further information.

Cheers!

Multiple databases for a single app?

Is it possible to create multiple databases for a single app? I am developing an app based on event driven architecture so I need two databases, one for read model and second for event store. I don't see this option in CLI. There is only gigalixir create_database my-app which creates db for my-app and that's all. Is there a way of creating more than on db for an app?

License for package?

Hi! Could you add a license to this repo? I would like to package this tool up for Arch Linux, and it's nice to have a license attached so that everyone knows they have permission to distribute it.

The MIT License is a good one if you don't have any particular preference. GitHub makes it easy to add.

Stripe - SEPA Direct Debit

Would it be possible to support https://stripe.com/docs/sources/ideal/recurring for recurring debit card payment?

I do not own a credit card, and I do not want to own a credit card. For this reason I am very limited in my use of web hosting providers for private projects. I've recently tried out gigalixir, and would love to use it for all the websites I make.

Would it be possible at all supporting something like stripe's recurring debit card payments? Or is this limited because of GCP/AWS?

I hope this is the right place to ask this question.

Gigalixir can't be used as a non admin user

Using homebrew:

  • su admin
  • brew install gigalixir
  • exit
  • gigalixir
Traceback (most recent call last):
  File "/usr/local/bin/gigalixir", line 33, in <module>
    sys.exit(load_entry_point('gigalixir==1.1.10', 'console_scripts', 'gigalixir')())
  File "/usr/local/bin/gigalixir", line 25, in importlib_load_entry_point
    return next(matches).load()
  File "/usr/local/Cellar/gigalixir/1.1.10/libexec/lib/python3.8/importlib/metadata.py", line 77, in load
    module = import_module(match.group('module'))
  File "/usr/local/Cellar/gigalixir/1.1.10/libexec/lib/python3.8/importlib/__init__.py", line 127, in import_module
    return _bootstrap._gcd_import(name[level:], package, level)
  File "<frozen importlib._bootstrap>", line 1014, in _gcd_import
  File "<frozen importlib._bootstrap>", line 991, in _find_and_load
  File "<frozen importlib._bootstrap>", line 975, in _find_and_load_unlocked
  File "<frozen importlib._bootstrap>", line 671, in _load_unlocked
  File "<frozen importlib._bootstrap_external>", line 783, in exec_module
  File "<frozen importlib._bootstrap>", line 219, in _call_with_frames_removed
  File "/usr/local/Cellar/gigalixir/1.1.10/libexec/lib/python3.8/site-packages/gigalixir/__init__.py", line 41, in <module>
    import pkg_resources
  File "/usr/local/Cellar/gigalixir/1.1.10/libexec/lib/python3.8/site-packages/pkg_resources/__init__.py", line 3239, in <module>
    def _initialize_master_working_set():
  File "/usr/local/Cellar/gigalixir/1.1.10/libexec/lib/python3.8/site-packages/pkg_resources/__init__.py", line 3222, in _call_aside
    f(*args, **kwargs)
  File "/usr/local/Cellar/gigalixir/1.1.10/libexec/lib/python3.8/site-packages/pkg_resources/__init__.py", line 3251, in _initialize_master_working_set
    working_set = WorkingSet._build_master()
  File "/usr/local/Cellar/gigalixir/1.1.10/libexec/lib/python3.8/site-packages/pkg_resources/__init__.py", line 558, in _build_master
    ws = cls()
  File "/usr/local/Cellar/gigalixir/1.1.10/libexec/lib/python3.8/site-packages/pkg_resources/__init__.py", line 551, in __init__
    self.add_entry(entry)
  File "/usr/local/Cellar/gigalixir/1.1.10/libexec/lib/python3.8/site-packages/pkg_resources/__init__.py", line 607, in add_entry
    for dist in find_distributions(entry, True):
  File "/usr/local/Cellar/gigalixir/1.1.10/libexec/lib/python3.8/site-packages/pkg_resources/__init__.py", line 2060, in find_on_path
    for dist in factory(fullpath):
  File "/usr/local/Cellar/gigalixir/1.1.10/libexec/lib/python3.8/site-packages/pkg_resources/__init__.py", line 2125, in distributions_from_metadata
    yield Distribution.from_location(
  File "/usr/local/Cellar/gigalixir/1.1.10/libexec/lib/python3.8/site-packages/pkg_resources/__init__.py", line 2585, in from_location
    return cls(
  File "/usr/local/Cellar/gigalixir/1.1.10/libexec/lib/python3.8/site-packages/pkg_resources/__init__.py", line 2985, in _reload_version
    md_version = self._get_version()
  File "/usr/local/Cellar/gigalixir/1.1.10/libexec/lib/python3.8/site-packages/pkg_resources/__init__.py", line 2767, in _get_version
    version = _version_from_file(lines)
  File "/usr/local/Cellar/gigalixir/1.1.10/libexec/lib/python3.8/site-packages/pkg_resources/__init__.py", line 2551, in _version_from_file
    line = next(iter(version_lines), '')
  File "/usr/local/Cellar/gigalixir/1.1.10/libexec/lib/python3.8/site-packages/pkg_resources/__init__.py", line 2762, in _get_metadata
    for line in self.get_metadata_lines(name):
  File "/usr/local/Cellar/gigalixir/1.1.10/libexec/lib/python3.8/site-packages/pkg_resources/__init__.py", line 1415, in get_metadata_lines
    return yield_lines(self.get_metadata(name))
  File "/usr/local/Cellar/gigalixir/1.1.10/libexec/lib/python3.8/site-packages/pkg_resources/__init__.py", line 1405, in get_metadata
    value = self._get(path)
  File "/usr/local/Cellar/gigalixir/1.1.10/libexec/lib/python3.8/site-packages/pkg_resources/__init__.py", line 1609, in _get
    with open(path, 'rb') as stream:
PermissionError: [Errno 13] Permission denied: '/usr/local/Cellar/gigalixir/1.1.10/libexec/lib/python3.8/site-packages/idna-2.7-py3.8.egg-info/PKG-INFO'

Gigalixir CLI truncates password if '$' is present in it

When the password contains $ symbol the characters after it (including $ as well) till another special character is being removed, resulting in authentication failure.

Eg:-

Email: [email protected]
Password: abcdef$thispartwillberemoved*xyz

When one tries to login using:
$ gigalixir login -e [email protected] -p "abcdef$thispartwillberemoved*xyz" -y

the password that is being received in the function
def login in user.py is

abcdef*xyz.

The issue does not exist if the email and password are entered from prompt ie if we run
$ gigalixir login

Environment Used for Testing:
Docker Image -
python:3-buster
gigalixir-cli - 1.1.8
click - 6.7

I have not investigated the issue further. This could be an issue related to click package.

Unable to use gigalixir-cli on Arch Linux

Hi!
I got this error on my Arch Linux machine:

➜  ~ gigalixir signup
Traceback (most recent call last):
  File "/usr/bin/gigalixir", line 11, in <module>
    load_entry_point('gigalixir==0.22.0', 'console_scripts', 'gigalixir')()
  File "/usr/lib/python3.6/site-packages/click/core.py", line 722, in __call__
    return self.main(*args, **kwargs)
  File "/usr/lib/python3.6/site-packages/click/core.py", line 697, in main
    rv = self.invoke(ctx)
  File "/usr/lib/python3.6/site-packages/click/core.py", line 1063, in invoke
    Command.invoke(self, ctx)
  File "/usr/lib/python3.6/site-packages/click/core.py", line 895, in invoke
    return ctx.invoke(self.callback, **ctx.params)
  File "/usr/lib/python3.6/site-packages/click/core.py", line 535, in invoke
    return callback(*args, **kwargs)
  File "/usr/lib/python3.6/site-packages/click/decorators.py", line 17, in new_func
    return f(get_current_context(), *args, **kwargs)
  File "/usr/lib/python3.6/site-packages/gigalixir/__init__.py", line 78, in cli
    raise Exception("Unknown platform: %s" % PLATFORM)
Exception: Unknown platform: b'linux'

gigalixir --help is not complaining. And

➜  ~ sudo pip install gigalixir --ignore-installed six
Collecting gigalixir
  Using cached gigalixir-0.22.0.tar.gz
Collecting six
  Using cached six-1.11.0-py2.py3-none-any.whl
Collecting click~=6.7 (from gigalixir)
  Using cached click-6.7-py2.py3-none-any.whl
Collecting requests~=2.13.0 (from gigalixir)
  Using cached requests-2.13.0-py2.py3-none-any.whl
Collecting stripe~=1.51.0 (from gigalixir)
  Using cached stripe-1.51.0-py3-none-any.whl
Collecting rollbar~=0.13.11 (from gigalixir)
  Using cached rollbar-0.13.17.tar.gz
Installing collected packages: click, requests, stripe, six, rollbar, gigalixir
  Running setup.py install for rollbar ... done
  Running setup.py install for gigalixir ... done
Successfully installed click-6.7 gigalixir-0.22.0 requests-2.18.4 rollbar-0.13.17 six-1.11.0 stripe-1.51.0

Unable to install on OSX

I'm not sure if this is a permissions issue? The error looks different to me though...

➜  ~ pip install gigalixir
Collecting gigalixir
  Using cached gigalixir-0.14.0.tar.gz
Requirement already satisfied: click~=6.7 in /Library/Python/2.7/site-packages (from gigalixir)
Requirement already satisfied: requests~=2.13.0 in /Library/Python/2.7/site-packages (from gigalixir)
Requirement already satisfied: stripe~=1.51.0 in /Library/Python/2.7/site-packages (from gigalixir)
Collecting rollbar~=0.13.11 (from gigalixir)
  Using cached rollbar-0.13.12.tar.gz
Collecting six>=1.9.0 (from rollbar~=0.13.11->gigalixir)
  Using cached six-1.10.0-py2.py3-none-any.whl
Installing collected packages: six, rollbar, gigalixir
  Found existing installation: six 1.4.1
    DEPRECATION: Uninstalling a distutils installed project (six) has been deprecated and will be removed in a future version. This is due to the fact that uninstalling a distutils project will only partially uninstall the project.
    Uninstalling six-1.4.1:
Exception:
Traceback (most recent call last):
  File "/Library/Python/2.7/site-packages/pip-9.0.1-py2.7.egg/pip/basecommand.py", line 215, in main
    status = self.run(options, args)
  File "/Library/Python/2.7/site-packages/pip-9.0.1-py2.7.egg/pip/commands/install.py", line 342, in run
    prefix=options.prefix_path,
  File "/Library/Python/2.7/site-packages/pip-9.0.1-py2.7.egg/pip/req/req_set.py", line 778, in install
    requirement.uninstall(auto_confirm=True)
  File "/Library/Python/2.7/site-packages/pip-9.0.1-py2.7.egg/pip/req/req_install.py", line 754, in uninstall
    paths_to_remove.remove(auto_confirm)
  File "/Library/Python/2.7/site-packages/pip-9.0.1-py2.7.egg/pip/req/req_uninstall.py", line 115, in remove
    renames(path, new_path)
  File "/Library/Python/2.7/site-packages/pip-9.0.1-py2.7.egg/pip/utils/__init__.py", line 267, in renames
    shutil.move(old, new)
  File "/System/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/shutil.py", line 302, in move
    copy2(src, real_dst)
  File "/System/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/shutil.py", line 131, in copy2
    copystat(src, dst)
  File "/System/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/shutil.py", line 103, in copystat
    os.chflags(dst, st.st_flags)
OSError: [Errno 1] Operation not permitted: '/var/folders/vm/bdkqhkqd4fngc_lw1hr6cnrc0000gn/T/pip-YdR89_-uninstall/System/Library/Frameworks/Python.framework/Versions/2.7/Extras/lib/python/six-1.4.1-py2.7.egg-info'

Migrating not working

When I try to run gigalixir migrate $APP_NAME this is all I get back.

Connection to us-central1.gcp.ssh.gigalixir.com closed.
▸ Invalid expression: keyword argument must be followed by space after: lists:

Command '[u'ssh', u'-t', u'[email protected]', u'-p', u'32160', u'gigalixir_run', u'run', u'eval', u'''"'"'Elixir.Ecto.Migrator'"'"':run(lists:nth(1,', u''"'"'Elixir.Application'"'"':get_env(carl,', u'ecto_repos)),', u''"'"'Elixir.Application'"'"':app_dir(carl,', u'<<"priv/repo/migrations">>),', u'up,', u'[{all,', u"true}])'"]' returned non-zero exit status 1

Don't dump the stack when Rollbar cannot be reached

I use a DNS-level blocker for ads and trackers. Because of this, api.rollbar.com does not resolve on my computer.

The issue is, whenever I trigger an error with the CLI, it dumps a huge, ugly Python stack trace. (See below).

It would be nice if the CLI would swallow errors raised from the error reporting service.

Additionally, it could be nice to make the error reporting opt-in, or at least opt-out-able.

$ gigalixir ps:remote_console -a foo
You don't have any ssh keys yet. See `gigalixir account:ssh_keys:add --help`
Exception while posting item ConnectionError(MaxRetryError("HTTPSConnectionPool(host='api.rollbar.com', port=443): Max retries exceeded with url: /api/1/item/ (Caused by NewConnectionError('<urllib3.connection.HTTPSConnection object at 0x102c75490>: Failed to establish a new connection: [Errno 61] Connection refused'))"))
Traceback (most recent call last):
  File "/opt/homebrew/lib/python3.9/site-packages/urllib3/connection.py", line 174, in _new_conn
    conn = connection.create_connection(
  File "/opt/homebrew/lib/python3.9/site-packages/urllib3/util/connection.py", line 96, in create_connection
    raise err
  File "/opt/homebrew/lib/python3.9/site-packages/urllib3/util/connection.py", line 86, in create_connection
    sock.connect(sa)
ConnectionRefusedError: [Errno 61] Connection refused

During handling of the above exception, another exception occurred:

Traceback (most recent call last):
  File "/opt/homebrew/lib/python3.9/site-packages/urllib3/connectionpool.py", line 699, in urlopen
    httplib_response = self._make_request(
  File "/opt/homebrew/lib/python3.9/site-packages/urllib3/connectionpool.py", line 382, in _make_request
    self._validate_conn(conn)
  File "/opt/homebrew/lib/python3.9/site-packages/urllib3/connectionpool.py", line 1010, in _validate_conn
    conn.connect()
  File "/opt/homebrew/lib/python3.9/site-packages/urllib3/connection.py", line 358, in connect
    conn = self._new_conn()
  File "/opt/homebrew/lib/python3.9/site-packages/urllib3/connection.py", line 186, in _new_conn
    raise NewConnectionError(
urllib3.exceptions.NewConnectionError: <urllib3.connection.HTTPSConnection object at 0x102c75490>: Failed to establish a new connection: [Errno 61] Connection refused

During handling of the above exception, another exception occurred:

Traceback (most recent call last):
  File "/opt/homebrew/lib/python3.9/site-packages/requests/adapters.py", line 439, in send
    resp = conn.urlopen(
  File "/opt/homebrew/lib/python3.9/site-packages/urllib3/connectionpool.py", line 755, in urlopen
    retries = retries.increment(
  File "/opt/homebrew/lib/python3.9/site-packages/urllib3/util/retry.py", line 574, in increment
    raise MaxRetryError(_pool, url, error or ResponseError(cause))
urllib3.exceptions.MaxRetryError: HTTPSConnectionPool(host='api.rollbar.com', port=443): Max retries exceeded with url: /api/1/item/ (Caused by NewConnectionError('<urllib3.connection.HTTPSConnection object at 0x102c75490>: Failed to establish a new connection: [Errno 61] Connection refused'))

During handling of the above exception, another exception occurred:

Traceback (most recent call last):
  File "/opt/homebrew/lib/python3.9/site-packages/rollbar/__init__.py", line 1497, in _send_payload
    _post_api('item/', payload_str, access_token=access_token)
  File "/opt/homebrew/lib/python3.9/site-packages/rollbar/__init__.py", line 1545, in _post_api
    resp = transport.post(url,
  File "/opt/homebrew/lib/python3.9/site-packages/rollbar/lib/transport.py", line 44, in post
    return _session().post(*args, proxies=proxies, **kw)
  File "/opt/homebrew/lib/python3.9/site-packages/requests/sessions.py", line 590, in post
    return self.request('POST', url, data=data, json=json, **kwargs)
  File "/opt/homebrew/lib/python3.9/site-packages/requests/sessions.py", line 542, in request
    resp = self.send(prep, **send_kwargs)
  File "/opt/homebrew/lib/python3.9/site-packages/requests/sessions.py", line 655, in send
    r = adapter.send(request, **kwargs)
  File "/opt/homebrew/lib/python3.9/site-packages/requests/adapters.py", line 516, in send
    raise ConnectionError(e, request=request)
requests.exceptions.ConnectionError: HTTPSConnectionPool(host='api.rollbar.com', port=443): Max retries exceeded with url: /api/1/item/ (Caused by NewConnectionError('<urllib3.connection.HTTPSConnection object at 0x102c75490>: Failed to establish a new connection: [Errno 61] Connection refused'))

Newly added migration file might not be run in the auto-deployment workflow

My team uses Github action to build a auto-deployment pipeline. Part of the commands are as follows:

- name: Auto Deploy
        run: |
          sudo pip3 install gigalixir
          gigalixir login -e "${{ secrets.GIGALIXIR_USERNAME }}" -y -p "${{ secrets.GIGALIXIR_PASSWORD }}"
          gigalixir git:remote ${{ secrets.APP_NAME }}
          git push -f gigalixir HEAD:refs/heads/main
- name: Migration
        run: |
          mkdir ~/.ssh
          printf "Host *\n StrictHostKeyChecking no" > ~/.ssh/config
          echo "${{ secrets.SSH_KEY }}" > ~/.ssh/id_rsa
          chmod 400 ~/.ssh/id_rsa
          gigalixir ps:migrate -a ${{ secrets.APP_NAME }}

It seems that Gigalixir needs some reaction time for pushing new files to the server. So there are chances that the gigalixir ps:migrate -a ${{ secrets.APP_NAME }} command would be run before the newly added migration files being deployed on the server.
As shown in the image, this deployment contains a newly added migration file, but the server says migrations already up
Screenshot 2021-06-23 at 11 07 17

Do we have any solution to this? if I operated in the wrong way, please correct me.

Thanks

Postgis migration

Hi guys. Im getting this error when running gigalixir ps:migrate

07:37:49.130 [info] == Running ProjectName.Repo.Migrations.EnablePostgis.up/0 forward 07:37:49.130 [info] execute "CREATE EXTENSION IF NOT EXISTS postgis" ▸ Given the following expression: Ecto.Migrator.run(List.first(Application.get_env(:project_onz, :ecto_repos)), Application.app_dir(:project_onz, "priv/repo/migrations"), :up,all: true) ▸ The remote call failed with: ▸ ** (exit) %Postgrex.Error{connection_id: 25320, message: nil, postgres: %{code: :undefined_file, file: "extension.c", line: "478", message: "could not open extension controlfile \"/usr/share/postgresql/9.5/extension/postgis.control\": No such file or directory", pg_code: "58P01", routine: "parse_extension_control_file", severity: "ERROR"}} ▸ (ecto) lib/ecto/adapters/sql.ex:200: Ecto.Adapters.SQL.query!/5 ▸ (ecto) lib/ecto/adapters/postgres.ex:96: anonymous fn/4 in Ecto.Adapters.Postgres.execute_ddl/3 ▸ (elixir) lib/enum.ex:1811: Enum."-reduce/3-lists^foldl/2-0-"/3 ▸ (ecto) lib/ecto/adapters/postgres.ex:96: Ecto.Adapters.Postgres.execute_ddl/3 ▸ (ecto) lib/ecto/migration/runner.ex:104: anonymous fn/2 in Ecto.Migration.Runner.flush/0 ▸ (elixir) lib/enum.ex:1811: Enum."-reduce/3-lists^foldl/2-0-"/3 ▸ (ecto) lib/ecto/migration/runner.ex:102: Ecto.Migration.Runner.flush/0 ▸ (stdlib) timer.erl:181: :timer.tc/2

Im using geo_postgis, "~> 1.1.0 in my project

Please help

Python version

The docs are still recommending to install the CLI on Python 2 (see Prerequisites in docs/source/main.rst). Python 2 is out of support in 2 months, and still recommending it isn't a great signal.

From my usage, the client runs absolutely perfectly on Python 3. Is there any reason not to update the docs?

Pseudo-terminal will not be allocated because stdin is not a terminal

I noticed last week that ssh fails trying to ssh in for migrations with the following args

'['ssh', '-t', '[email protected]', '-p', '31632', 'gigalixir_run', 'migrate']'

if you instead use -tt or possibly -T I think you can side step this because that option will Disable pseudo-tty allocation

Any help on this would be greatly appreciated @jesseshieh

If I use the -o options I still see gigalixir ssh_helper using the normal -t option

gigalixir ps:ssh -o "-tt"

'['ssh', '-tt', '-t', '[email protected]', '-p', '31632', 'gigalixir_run', 'migrate']'

edit this terminal error fails during any Github Actions Deployment that requires gigalixir
Screen Shot 2022-05-09 at 4 09 34 PM

Run elixir application without server

Hello,

I'm running a elixir application that does not have an web server and I keep getting on the logs Readiness probe failed: dial tcp 10.56.21.195:4000: getsockopt: connection refused.

There is a way to tell gigalixir that my app doesn't have an http server?

Thanks.

Suggestion: Add a new question to the FAQ page

Hi Jesse,
As a (new) member of the Elixir community, I'm curious to know: is Gigalixir itself written in Elixir? Or put more broadly, what languages is Gigalixir itself written in?

I tried to answer those questions myself, but a quick search didn't yield a ready answer, and as yet there's no Wikipedia page for Gigalixir. I reckon that the above questions would be an informative addition to Gigalixir's FAQ page.

Thanks,
Ken.

EACCES: permission denied for phoenix liveview

       Installing and caching node modules
       yarn install v0.27.5
       (node:646) [DEP0005] DeprecationWarning: Buffer() is deprecated due to security and usability issues. Please use the Buffer.alloc(), Buffer.allocUnsafe(), or Buffer.from() methods instead.
       [1/4] Resolving packages...
       [2/4] Fetching packages...
       warning [email protected]: The platform "linux" is incompatible with this module.
       info "[email protected]" is an optional dependency and failed compatibility check. Excluding it from installation.
       [3/4] Linking dependencies...
       error An unexpected error occurred: "EACCES: permission denied, open '/tmp/build/assets/node_modules/phoenix_live_view/.git/objects/pack/pack-56c0116a1ed02743a5c6dacb1a5a85c9e91ea20c.idx'".
       info If you think this is a bug, please open a bug report with the information provided in "/tmp/build/assets/yarn-error.log".

The app isn't running so can't see what is in that log. I don't know if this issue is specific to LiveView or something more general.

Cannot run multiple sessions.

Using two sessions of gigalixir doesn't work.
The message:

Sorry, you do not have access. Try running gigalixir login or checking your ~/.netrc file.

I'm using iTerm2 Build 3.0.12 on macOS Sierra 10.12.6
Python version: 2.7.13
Gigalixir version: 0.15.0

gigalixir login fails with "Unknown platform: msys_nt-10.0"

Environment

pip 19.0.1 from C:\Python27\lib\site-packages\pip (python 2.7)
Python 2.7.13 (v2.7.13:a06454b1afa1, Dec 17 2016, 20:42:59) [MSC v.1500 32 bit (Intel)] on win32

How to reproduce

gigalixir login

(or gigalixir version or gigalixir logs or ...)

Expected result

login promt should show

#Actual result
Crashes with exception Exception: Unknown platform: msys_nt-10.0

Full stack trace:

gigalixir help
Traceback (most recent call last):
  File "c:\python27\lib\runpy.py", line 174, in _run_module_as_main
    "__main__", fname, loader, pkg_name)
  File "c:\python27\lib\runpy.py", line 72, in _run_code
    exec code in run_globals
  File "C:\Python27\Scripts\gigalixir.exe\__main__.py", line 9, in <module>
  File "c:\python27\lib\site-packages\click\core.py", line 722, in __call__
    return self.main(*args, **kwargs)
  File "c:\python27\lib\site-packages\click\core.py", line 697, in main
    rv = self.invoke(ctx)
  File "c:\python27\lib\site-packages\click\core.py", line 1063, in invoke
    Command.invoke(self, ctx)
  File "c:\python27\lib\site-packages\click\core.py", line 895, in invoke
    return ctx.invoke(self.callback, **ctx.params)
  File "c:\python27\lib\site-packages\click\core.py", line 535, in invoke
    return callback(*args, **kwargs)
  File "c:\python27\lib\site-packages\click\decorators.py", line 17, in new_func
    return f(get_current_context(), *args, **kwargs)
  File "c:\python27\lib\site-packages\gigalixir\__init__.py", line 231, in cli
    raise Exception("Unknown platform: %s" % PLATFORM)
Exception: Unknown platform: msys_nt-10.0

Most likely reason

Looking at

PLATFORM = call("uname -s").lower() # linux or darwin
, it looks like windows is not supported

`ps:remote_console` should allow more than one connection

It looks like we can’t open more than one ps:remote_console to a given instance; any attempt to open another one (from the same terminal or another) gives:

Protocol 'inet_tcp': the name [email protected] seems to be in use by another Erlang node
Connection to v2018-us-central1.gcp.ssh.gigalixir.com closed.

(Using gigalixir-cli v1.2.0)

Docs: .gitignore and secrets plus buggy npm.

First, awesome product! I hope to graduate out of the free tier in the next two months.

In the meantime, I just worked through my first deploy and hit a couple of snags that you may want to know about and maybe document.

One, the default .gitignore file that Github generates for a new Elixir project includes *.secret.exs. If someone (like me) is not paying attention, they may fail to actually commit the needed changes to prod.secret.exs. This causes the deploy to fail with remote: ** (Code.LoadError) could not load /tmp/build/config/prod.secret.exs.

Two, the latest version of node.js includes a buggy version of npm. I originally specified node_version=13.8.0 in my phoenix_static_buildpack.config file. I needed to downgrade to node_version=13.3.0 to get things to work. Without the downgrade, the error was remote: npm ERR! invalid bin entry for package @babel/[email protected]. key=parser, value=bin/babel-parser.js. This is the npm issue.

Finally, there's a minor typo in the database migrations section where you have: "If you are using not using releases..."

Thanks again for the awesome product and documentation!

(Mix.Releases.Config.LoadError) could not load release config rel/config.exs

Getting this during the deploy, though it seems it is still completing and the app is up. Any ideas? Update updated Elixir/Erlang versions in the buildpack for this release. Any other context that might help in particular?

# Erlang version
erlang_version=21.1

# Elixir version
elixir_version=1.7.3
remote: ** (Mix.Releases.Config.LoadError) could not load release config rel/config.exs
remote:     ** (UndefinedFunctionError) function Mix.Config.Agent.start_link/0 is undefined (module Mix.Config.Agent is not available)
remote:     Mix.Config.Agent.start_link()
remote:     (stdlib) erl_eval.erl:680: :erl_eval.do_apply/6
remote:     (stdlib) erl_eval.erl:449: :erl_eval.expr/5
remote:     (stdlib) erl_eval.erl:126: :erl_eval.exprs/5
remote:     (elixir) lib/code.ex:232: Code.eval_string/3
remote:     (distillery) lib/mix/lib/releases/config/config.ex:281: Mix.Releases.Config.read_string!/1
remote:     (distillery) lib/mix/lib/releases/config/config.ex:302: Mix.Releases.Config.read!/1
remote: Command '[u'docker', u'run', u'--rm', u'-e', u'GIGALIXIR_SHOULD_CLEAN_CACHE=True', u'-v', u'/tmp/tmp1FrasS/codecast-proto:/tmp/app', u'-v', u'/tmp/gigalixir/cache/codecast-proto/:/tmp/cache', u'-v', u'/tmp/tmp1FrasS/env:/tmp/env', u'--env=USER=www-data', u'us.gcr.io/gigalixir-152404/herokuish:latest']' returned non-zero exit status 1

sh: 1: /app/bin/app: not found

Hello! Thanks for what seems to be a great product in this (niche?) space

i love that you offer a free trial with little to no hoops to getting started

i'm having a hard time deploying a simple test app.

i'm following this tutorial here:
https://www.howtographql.com/graphql-elixir/0-introduction/

when i mix distillery.release and then test-run things locally, it appears to work fine.

i have a feeling it's either something misconfigured in my version specifications or the way i have buildpacks configured.

would love some insight from anyone more experienced at this than i am.

here's the current state of my repo: https://github.com/jakedowns/elixir_test_app

2020-04-19T03:53:02.993171+00:00 blueviolet-humble-emperorshrimp[gigalixir-run]: Attempting health checks on port 4000
2020-04-19T03:53:03.218655+00:00 blueviolet-humble-emperorshrimp[blueviolet-humble-emperorshrimp-844cd4559d-shhbv]: web.1  | started with pid 43
2020-04-19T03:53:03.219704+00:00 blueviolet-humble-emperorshrimp[blueviolet-humble-emperorshrimp-844cd4559d-shhbv]: web.1  | sh: 1: /app/bin/app: not found
2020-04-19T03:53:03.319036+00:00 blueviolet-humble-emperorshrimp[blueviolet-humble-emperorshrimp-844cd4559d-shhbv]: web.1  | exited with code 127
2020-04-19T03:53:03.319387+00:00 blueviolet-humble-emperorshrimp[blueviolet-humble-emperorshrimp-844cd4559d-shhbv]: system | sending SIGTERM to all processes

Remote console potentially dangerous for development machines

After an initial deployment of a hobby project, I started fiddling with some of the less commonly used tooling built into Gigalixir. I was surprised to see that running gigalixir ps:remote_console enters me into a remote shell session, without any further prompting. I'm still learning Elixir and Erlang, but this seems like a potentially dangerous thing (see https://broot.ca/erlang-remsh-is-dangerous or https://andreiclinciu.net/erlang-elixir-node-security-flaws) assuming Gigalixir doesn't run the remsh session in a VM.

I'd expect a large red warning in the documentation as well as a Running ps:remote_console connects you to the production server, giving the remote server full RPC priviledges on this computer. This is potentially dangerous if the remote server is compromised. Are you sure you want to connect to the server? Y/n type of command line prompt at least the first time I'm running remote_console

Thanks for building the by far easiest tool for deploying an Elixir app! 🙂

Syntax error running Oban migrations

There are some default initial migrations which Oban requires to setup a jobs table and such.
Locally I am able to run them all with no errors.
However, after deploying this to Gigalixir I get a syntax error for this query.

This might be due to the Postgresql version used on Gigalixir (possibly a version where the given syntax wasn't implemented yet)?

My local postgresql version: 12.1

Elixir version: 1.10.4
Erlang version: 23.0.1

** (Postgrex.Error) ERROR 42601 (syntax_error) syntax error at or near "NOT" 
     query: ALTER TABLE "public"."oban_jobs" ADD COLUMN IF NOT EXISTS "attempted_by" text[]
     (ecto_sql 3.4.5) lib/ecto/adapters/sql.ex:593: Ecto.Adapters.SQL.raise_sql_call_error/1
     (elixir 1.10.4) lib/enum.ex:1396: Enum."-map/2-lists^map/1-0-"/2
     (ecto_sql 3.4.5) lib/ecto/adapters/sql.ex:686: Ecto.Adapters.SQL.execute_ddl/4
     (ecto_sql 3.4.5) lib/ecto/migration/runner.ex:343: Ecto.Migration.Runner.log_and_execute_ddl/3
     (ecto_sql 3.4.5) lib/ecto/migration/runner.ex:117: anonymous fn/6 in Ecto.Migration.Runner.flush/0
     (elixir 1.10.4) lib/enum.ex:2111: Enum."-reduce/3-lists^foldl/2-0-"/3
     (ecto_sql 3.4.5) lib/ecto/migration/runner.ex:116: Ecto.Migration.Runner.flush/0
     (stdlib 3.13) timer.erl:166: :timer.tc/1

initial `git push` fails

Creating a new project and failing when I attempt to push to remote

git push 
Counting objects: 4, done.
Delta compression using up to 8 threads.
Compressing objects: 100% (4/4), done.
Writing objects: 100% (4/4), 380 bytes | 380.00 KiB/s, done.
Total 4 (delta 3), reused 0 (delta 0)
remote: Resolving deltas: 100% (3/3), completed with 3 local objects.
remote: 
remote: GitHub found 4 vulnerabilities on alavkx/drip-drop's default branch (1 high, 3 moderate). To find out more, visit:
remote:      https://github.com/alavkx/drip-drop/network/alerts
remote: 
To https://github.com/alavkx/drip-drop.git
   480152f..1cea513  master -> master
alavkx@DESKTOP-HV138MK:/mnt/c/Users/Z/Projects/drip-drop$ git push gigalixir master
Counting objects: 311, done.
Delta compression using up to 8 threads.
Compressing objects: 100% (275/275), done.
Writing objects: 100% (311/311), 140.64 KiB | 1.76 MiB/s, done.
Total 311 (delta 129), reused 0 (delta 0)
remote: Setting environment variables.
remote: * LIBCLUSTER_KUBERNETES_SELECTOR
remote: * LIBCLUSTER_KUBERNETES_NODE_BASENAME
remote: * APP_NAME
remote: * SECRET_KEY_BASE
remote: * PORT
remote: * SOURCE_VERSION
remote: Cloning into 'drip-drop'...
remote: warning: You appear to have cloned an empty repository.
remote: done.
remote: Compiling code and generating slug.
remote: latest: Pulling from gigalixir-152404/herokuish
remote: Digest: sha256:01b2c78943f694bcb5e18d7305aa444fe8205007bd93c5b6ae4648a0c63a809a
remote: Status: Image is up to date for us.gcr.io/gigalixir-152404/herokuish:latest
----->        Detecting assets directory
       package.json found in assets directory
       Elixir+Phoenix app detected
       Detecting assets directory
       package.json found in assets directory
=====> Downloading Buildpack: https://github.com/gigalixir/gigalixir-buildpack-clean-cache.git
=====> Detected Framework: Clean Cache
       Not cleaning cache
=====> Downloading Buildpack: https://github.com/HashNuke/heroku-buildpack-elixir.git
=====> Detected Framework: Elixir
-----> Checking Erlang and Elixir versions
       Will use the following versions:
       * Stack cedar-14
       * Erlang 22.0
       * Elixir 1.8.2
-----> Will export the following config vars:
       APP_NAME
       LIBCLUSTER_KUBERNETES_NODE_BASENAME
       LIBCLUSTER_KUBERNETES_SELECTOR
       PORT
       SECRET_KEY_BASE
       SOURCE_VERSION
       * MIX_ENV=prod
-----> Using cached Erlang 22.0
-----> Installing Erlang 22.0
remote: 
remote: gzip: stdin: not in gzip format
remote: tar: Child returned status 1
remote: tar: Error is not recoverable: exiting now
remote: /tmp/buildpack1mxe3/lib/erlang_funcs.sh: line 37: /tmp/cache/erlang/Install: No such file or directory
-----> Using cached Elixir v1.8.2
-----> Installing Elixir v1.8.2
-----> Installing Hex
remote: /tmp/build/.platform_tools/elixir/bin/elixir: 123: exec: erl: not found
-----> Installing rebar
remote: /tmp/build/.platform_tools/elixir/bin/elixir: 123: exec: erl: not found
-----> Fetching app dependencies with mix
remote: /tmp/build/.platform_tools/elixir/bin/elixir: 123: exec: erl: not found
remote: Command '[u'docker', u'run', u'--rm', u'-e', u'GIGALIXIR_SHOULD_CLEAN_CACHE=False', u'-v', u'/tmp/tmpgkk32r/drip-drop:/tmp/app', u'-v', u'/tmp/gigalixir/cache/drip-drop/:/tmp/cache', u'-v', u'/tmp/tmpgkk32r/env:/tmp/env', u'--env=USER=www-data', u'us.gcr.io/gigalixir-152404/herokuish:latest']' returned non-zero exit status 1
To https://git.gigalixir.com/drip-drop.git/
 ! [remote rejected] master -> master (pre-receive hook declined)
error: failed to push some refs to 'https://git.gigalixir.com/drip-drop.git/'

Cannot run seeds

There's no documentation about running seeds.
The only one that seems possible is the run command, but it only specifies module and function as arguments, but not arguments to be passed to functions.
Is it intentional? How can I run my app's seeds?

How can i upload SSL client certificates to connect to GCP storage?

I've created a new Phoenix umberlla project and deployed it to Gigalixir at https://unhealthy-frugal-alligatorgar.gigalixirapp.com/. I have created a PostgreSql database on Google cloud storage with the recommend network mask and updated the DATABASE_URL environment variable but I'm unable to connect.

I get the error

2018-12-14T22:10:21.414930+00:00 unhealthy-frugal-alligatorgar[unhealthy-frugal-alligatorgar-544687c55c-2jscq]: web.1  | 22:10:21.414 [error] Postgrex.Protocol (#PID<0.285.0>) failed to connect: ** (Postgrex.Error) FATAL 28000 (invalid_authorization_specification): connection requires a valid client certificate

I believe that the solution is to upload my client certificates like this article suggests https://www.amberbit.com/blog/2017/11/13/connecting-ecto-to-postgresql-with-ssl/ but I don't want to check them into version control.

How can I get these certificates to the server? Or perhaps there's another way to connect to GCP storage.

Struggling with Elixir version on 'git push'

I am getting this error: remote: warning: You appear to have cloned an empty repository.

       Detected buildpacks: multi elixir
-----> Multipack app detected
=====> Downloading Buildpack: https://github.com/gigalixir/gigalixir-buildpack-clean-cache.git
=====> Detected Framework: Clean Cache
       Not cleaning cache
=====> Downloading Buildpack: https://github.com/HashNuke/heroku-buildpack-elixir
=====> Detected Framework: Elixir
-----> Checking Erlang and Elixir versions
       WARNING: elixir_buildpack.config wasn't found in the app
       Using default config from Elixir buildpack
       Will use the following versions:
       * Stack cedar-14
       * Erlang 20.1
       * Elixir 1.5.3
-----> Will export the following config vars:
       APP_NAME
       LIBCLUSTER_KUBERNETES_NODE_BASENAME
       LIBCLUSTER_KUBERNETES_SELECTOR
       PORT
       SECRET_KEY_BASE
       SOURCE_VERSION
       * MIX_ENV=prod
-----> Using cached Erlang 20.1
-----> Installing Erlang 20.1
       
-----> Using cached Elixir v1.5.3
-----> Installing Elixir v1.5.3

At the bottom of the log it says:
remote: ** (Mix) You're trying to run :autocomplete on Elixir v1.5.3 but it has declared in its mix.exs file it supports only Elixir ~> 1.7

I can't figure out why this is because I have an elixir_buildpack.config file as seen below:

image

Any help would be appreciated.

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.