SSH tunnels to remote server.

Overview

CircleCI AppVeyor Documentation Status coveralls version

pyversions license

Author: Pahaz

Repo: https://github.com/pahaz/sshtunnel/

Inspired by https://github.com/jmagnusson/bgtunnel, which doesn't work on Windows.

See also: https://github.com/paramiko/paramiko/blob/master/demos/forward.py

Requirements

Installation

sshtunnel is on PyPI, so simply run:

pip install sshtunnel

or

easy_install sshtunnel

or

conda install -c conda-forge sshtunnel

to have it installed in your environment.

For installing from source, clone the repo and run:

python setup.py install

Testing the package

In order to run the tests you first need tox and run:

python setup.py test

Usage scenarios

One of the typical scenarios where sshtunnel is helpful is depicted in the figure below. User may need to connect a port of a remote server (i.e. 8080) where only SSH port (usually port 22) is reachable.

----------------------------------------------------------------------

                            |
-------------+              |    +----------+
    LOCAL    |              |    |  REMOTE  | :22 SSH
    CLIENT   | <== SSH ========> |  SERVER  | :8080 web service
-------------+              |    +----------+
                            |
                         FIREWALL (only port 22 is open)

----------------------------------------------------------------------

Fig1: How to connect to a service blocked by a firewall through SSH tunnel.

If allowed by the SSH server, it is also possible to reach a private server (from the perspective of REMOTE SERVER) not directly visible from the outside (LOCAL CLIENT's perspective).

----------------------------------------------------------------------

                            |
-------------+              |    +----------+               +---------
    LOCAL    |              |    |  REMOTE  |               | PRIVATE
    CLIENT   | <== SSH ========> |  SERVER  | <== local ==> | SERVER
-------------+              |    +----------+               +---------
                            |
                         FIREWALL (only port 443 is open)

----------------------------------------------------------------------

Fig2: How to connect to PRIVATE SERVER through SSH tunnel.

Usage examples

API allows either initializing the tunnel and starting it or using a with context, which will take care of starting and stopping the tunnel:

Example 1

Code corresponding to Fig1 above follows, given remote server's address is pahaz.urfuclub.ru, password authentication and randomly assigned local bind port.

from sshtunnel import SSHTunnelForwarder

server = SSHTunnelForwarder(
    'alfa.8iq.dev',
    ssh_username="pahaz",
    ssh_password="secret",
    remote_bind_address=('127.0.0.1', 8080)
)

server.start()

print(server.local_bind_port)  # show assigned local port
# work with `SECRET SERVICE` through `server.local_bind_port`.

server.stop()

Example 2

Example of a port forwarding to a private server not directly reachable, assuming password protected pkey authentication, remote server's SSH service is listening on port 443 and that port is open in the firewall (Fig2):

import paramiko
import sshtunnel

with sshtunnel.open_tunnel(
    (REMOTE_SERVER_IP, 443),
    ssh_username="",
    ssh_pkey="/var/ssh/rsa_key",
    ssh_private_key_password="secret",
    remote_bind_address=(PRIVATE_SERVER_IP, 22),
    local_bind_address=('0.0.0.0', 10022)
) as tunnel:
    client = paramiko.SSHClient()
    client.load_system_host_keys()
    client.set_missing_host_key_policy(paramiko.AutoAddPolicy())
    client.connect('127.0.0.1', 10022)
    # do some operations with client session
    client.close()

print('FINISH!')

Example 3

Example of a port forwarding for the Vagrant MySQL local port:

from sshtunnel import open_tunnel
from time import sleep

with open_tunnel(
    ('localhost', 2222),
    ssh_username="vagrant",
    ssh_password="vagrant",
    remote_bind_address=('127.0.0.1', 3306)
) as server:

    print(server.local_bind_port)
    while True:
        # press Ctrl-C for stopping
        sleep(1)

print('FINISH!')

Or simply using the CLI:

(bash)$ python -m sshtunnel -U vagrant -P vagrant -L :3306 -R 127.0.0.1:3306 -p 2222 localhost

Example 4

Opening an SSH session jumping over two tunnels. SSH transport and tunnels will be daemonised, which will not wait for the connections to stop at close time.

import sshtunnel
from paramiko import SSHClient


with sshtunnel.open_tunnel(
    ssh_address_or_host=('GW1_ip', 20022),
    remote_bind_address=('GW2_ip', 22),
) as tunnel1:
    print('Connection to tunnel1 (GW1_ip:GW1_port) OK...')
    with sshtunnel.open_tunnel(
        ssh_address_or_host=('localhost', tunnel1.local_bind_port),
        remote_bind_address=('target_ip', 22),
        ssh_username='GW2_user',
        ssh_password='GW2_pwd',
    ) as tunnel2:
        print('Connection to tunnel2 (GW2_ip:GW2_port) OK...')
        with SSHClient() as ssh:
            ssh.connect('localhost',
                port=tunnel2.local_bind_port,
                username='target_user',
                password='target_pwd',
            )
            ssh.exec_command(...)

CLI usage

$ sshtunnel --help
usage: sshtunnel [-h] [-U SSH_USERNAME] [-p SSH_PORT] [-P SSH_PASSWORD] -R
                 IP:PORT [IP:PORT ...] [-L [IP:PORT [IP:PORT ...]]]
                 [-k SSH_HOST_KEY] [-K KEY_FILE] [-S KEY_PASSWORD] [-t] [-v]
                 [-V] [-x IP:PORT] [-c SSH_CONFIG_FILE] [-z] [-n]
                 [-d [FOLDER [FOLDER ...]]]
                 ssh_address

Pure python ssh tunnel utils
Version 0.4.0

positional arguments:
  ssh_address           SSH server IP address (GW for SSH tunnels)
                        set with "-- ssh_address" if immediately after -R or -L

optional arguments:
  -h, --help            show this help message and exit
  -U SSH_USERNAME, --username SSH_USERNAME
                        SSH server account username
  -p SSH_PORT, --server_port SSH_PORT
                        SSH server TCP port (default: 22)
  -P SSH_PASSWORD, --password SSH_PASSWORD
                        SSH server account password
  -R IP:PORT [IP:PORT ...], --remote_bind_address IP:PORT [IP:PORT ...]
                        Remote bind address sequence: ip_1:port_1 ip_2:port_2 ... ip_n:port_n
                        Equivalent to ssh -Lxxxx:IP_ADDRESS:PORT
                        If port is omitted, defaults to 22.
                        Example: -R 10.10.10.10: 10.10.10.10:5900
  -L [IP:PORT [IP:PORT ...]], --local_bind_address [IP:PORT [IP:PORT ...]]
                        Local bind address sequence: ip_1:port_1 ip_2:port_2 ... ip_n:port_n
                        Elements may also be valid UNIX socket domains:
                        /tmp/foo.sock /tmp/bar.sock ... /tmp/baz.sock
                        Equivalent to ssh -LPORT:xxxxxxxxx:xxxx, being the local IP address optional.
                        By default it will listen in all interfaces (0.0.0.0) and choose a random port.
                        Example: -L :40000
  -k SSH_HOST_KEY, --ssh_host_key SSH_HOST_KEY
                        Gateway's host key
  -K KEY_FILE, --private_key_file KEY_FILE
                        RSA/DSS/ECDSA private key file
  -S KEY_PASSWORD, --private_key_password KEY_PASSWORD
                        RSA/DSS/ECDSA private key password
  -t, --threaded        Allow concurrent connections to each tunnel
  -v, --verbose         Increase output verbosity (default: ERROR)
  -V, --version         Show version number and quit
  -x IP:PORT, --proxy IP:PORT
                        IP and port of SSH proxy to destination
  -c SSH_CONFIG_FILE, --config SSH_CONFIG_FILE
                        SSH configuration file, defaults to ~/.ssh/config
  -z, --compress        Request server for compression over SSH transport
  -n, --noagent         Disable looking for keys from an SSH agent
  -d [FOLDER [FOLDER ...]], --host_pkey_directories [FOLDER [FOLDER ...]]
                        List of directories where SSH pkeys (in the format `id_*`) may be found
Comments
  • Hangs with Python 3.7

    Hangs with Python 3.7

    I'm using SSHTunnelForwarder with Python 3.7. After finishing my work, I run server.stop() and hangs.

    I believe it caused by socketserver.ThreadingMixIn https://docs.python.org/3.7/library/socketserver.html#socketserver.ThreadingMixIn

    Changed in version 3.7: socketserver.ForkingMixIn.server_close() and socketserver.ThreadingMixIn.server_close() now waits until all child processes and non-daemonic threads complete. Add a new socketserver.ForkingMixIn.block_on_close class attribute to opt-in for the pre-3.7 behaviour.

    Here's my work around. I changed the attribute server._server_list[0].block_on_close = False, and it behave like usual. It closed normally and not being hang.

    I'm not sure if setting block_on_close = False is a good way or not.

    Issue #135 may have the same cause.

    bug 
    opened by cjltsod 31
  • psycopg2 conn.poll() hangs when used with sshtunnel

    psycopg2 conn.poll() hangs when used with sshtunnel

    Hello

    I am using psycopg2 2.7.4 to connect to the PostgreSQL database server using asynchronous support. It is working absolutely fine. I have used sshtunnel v0.1.3 in pgAdmin4. When I connect the PostgreSQL database server using ssh tunnel and run the valid/correct query it works fine, but when I run any wrong query(invalid column of table) my application gets hang on conn.poll() function.

    Please refer the code how we use conn.poll() with timeouts https://git.postgresql.org/gitweb/?p=pgadmin4.git;a=blob;f=web/pgadmin/utils/driver/psycopg2/connection.py;h=4f11c12b30882209c308cb3558e67189c97ea31e;hb=15fe26a7106610b710f3de5b604cd038302c926a#l1363

    Can anyone please provide some pointers, suggestions? Similar question I have asked on psycopg2 ML.

    To figure out the solution, I have performed following test case:

    • Issue is reproducible only when server is connected using SSH Tunnel and any wrong query will be executed.
    • Create SSH Tunnel using ssh command "ssh -L 3333:127.0.0.1:5444 172.16.195.213". Create new server with Host = 127.0.0.1 and port = 3333. Open Query Tool and run the wrong query. Issue is not reproducible.
    • Enable logging of sshtunnel module by providing logger object in SSHTunnelForwarder() call. No useful logs found.
    • Enable logging of psycopg2 connection. No useful logs found.

    Note: I have verified the database server log and every time query gets executed.

    question wontfix 
    opened by akshay-joshi 16
  • Script won't exit because paramiko thread is still running

    Script won't exit because paramiko thread is still running

    The following script works and "FINISH" is printed, but it never exits to the shell:

    import threading
    
    from sshtunnel import SSHTunnelForwarder
    
    with SSHTunnelForwarder(
        "localhost",
        ssh_username="localuser",
        ssh_password="localpass",
        remote_bind_address=('127.0.0.1', 5984),
        local_bind_address=('127.0.0.1', 9000)
    ) as server:
    
        print(server.local_bind_port)
        # these don't help
        # server.stop()
        # server.close()
    
    # [t.close() for t in threading.enumerate() if t.__class__.__name__ == "Transport"]
    
    print('FINISH!')
    

    Python is waiting on threads to finish, but they never do. After running this script in iPython I can see the threads:

    threading.enumerate()
    [<_MainThread(MainThread, started 140735243972608)>,
     <HistorySavingThread(IPythonHistorySavingThread, started 123145307557888)>,
     <paramiko.Transport at 0x3880470 (cipher aes128-ctr, 128 bits) (connected; awaiting auth)>,
     <paramiko.Transport at 0x3874630 (cipher aes128-ctr, 128 bits) (connected; awaiting auth)>,
     <paramiko.Transport at 0x3191ba8 (cipher aes128-ctr, 128 bits) (connected; awaiting auth)>,
     <paramiko.Transport at 0x3874550 (cipher aes128-ctr, 128 bits) (active; 0 open channel(s))>,
     <paramiko.Transport at 0x3191c88 (cipher aes128-ctr, 128 bits) (connected; awaiting auth)>,
     <paramiko.Transport at 0x387bac8 (cipher aes128-ctr, 128 bits) (connected; awaiting auth)>,
     <paramiko.Transport at 0x3803e48 (cipher aes128-ctr, 128 bits) (connected; awaiting auth)>,
     <paramiko.Transport at 0x3874f60 (cipher aes128-ctr, 128 bits) (connected; awaiting auth)>]
    

    If I uncomment the last line which explicitly closes the paramiko.Transport threads, the script exits correctly. It seems like I'm missing something, but even so this default behavior is confusing.

    bug 
    opened by jsheedy 16
  • sshtunnel 0.7

    sshtunnel 0.7

    Since the addition of is_use_local_check_up parameter in 64af238 the default behaviour is not to check the local side of the tunnel. I see here two issues:

    • Being not backwards compatible with versions prior to 0.0.5 (which may be a decision made by @pahaz which I respect)
    • Not being able to set directly the way we want it to behave. Now we've first to create an SSHTunnelForwarder object, then change its is_use_local_check_up value to True.

    I added a new method for SSHTunnelForwarder to force those checks.

    opened by fernandezcuesta 15
  • Connection to remote MySQL db from Python 3.4

    Connection to remote MySQL db from Python 3.4

    Hi All, I posted a question about using SSH Tunnel on Stack Exchange recently, but I'm not sure if that was the right place for it (and I didn't get any answer). Would it have been better to post it on here? This is the "Issues" section which doesn't really seem right... I'm a bit lost :-(

    Thanks in advance. Stuart.

    question 
    opened by stuart258 14
  • User private keys are not found in default directory

    User private keys are not found in default directory

    This line of code

    https://github.com/pahaz/sshtunnel/blob/bd4ae32344a3a68ce27b1ad27c992687613b3182/sshtunnel.py#L1021

    prevents the or at

    https://github.com/pahaz/sshtunnel/blob/bd4ae32344a3a68ce27b1ad27c992687613b3182/sshtunnel.py#L1026

    to kick in and allow for DEFAULT_SSH_DIRECTORY to be searched. With the result that no keys are found even when there are plenty!

    bug 
    opened by mapio 13
  • Added silent setting to prevent raising exceptions

    Added silent setting to prevent raising exceptions

    When running sshtunnel as a thread, exceptions from the handler are printed to the console directly. This is often not a desired feature, since the console will become cluttered by error messages for any connection in error -- even when the majority of connections are successful. This pull request adds a boolean flag silent, that suppresses the exceptions while continuing to correctly log these errors using the Python logging module.

    With the addition of the logging.raiseExceptions flag, sshtunnel can now be operated in a completely silent way.

    import paramiko
    from sshtunnel import *
    import logging
    
    logging.raiseExceptions = False
    
    server = SSHTunnelForwarder(
        ssh_address=('1.2.3.4', 22),
        ssh_username='username',
        ssh_private_key=paramiko.RSAKey.from_private_key_file('...'),
        remote_bind_address=('127.0.0.1', 80),
        local_bind_address=('127.0.0.1', 80),
        silent=True,
    )
    
    server.start()
    
    question 
    opened by cjermain 12
  • Is there a way to make it work with Pageant on Windows ?

    Is there a way to make it work with Pageant on Windows ?

    I could not manage it.. Has anybody tried that ? Which options should be used ?

    I was (seemingly) able to connect to SSH using paramiko with Pageant, but I could not establish working tunnel for MySQL

    I can provide more details if anyone is interested.

    enhancement question 
    opened by 62mkv 11
  • [Regression] script hangs in 0.2.0, not 0.1.5 when not using context manager

    [Regression] script hangs in 0.2.0, not 0.1.5 when not using context manager

    I'm finding that my scripts are hanging forever even after I close the tunnel. This happens in versions 0.2.1 and 0.2.0, but not 0.1.5. So I think something has happened to break this.

    Note that in my use case I do not want to use a context manager. I'm deploying inside an AWS Lambda function, and I want to cache the connection between Lambda invocations, which means I need to assign the tunnel object to a global variable. I also have some unit tests with the unittest module's setUp() and tearDown() functions.

    The difference between .start() and the context manager seems to be:

    .daemon_forward_servers = True
    .daemon_transport = True
    

    What's the meaning of these parameters? Why are the defaults different between context manager and a function?

    Steps to reproduce

    We'll SSH to localhost, so run:

    ssh key-gen
    cat ~/.ssh/id_rsa.pub >> ~/.ssh/authorized_keys
    

    Then run this script:

    from sshtunnel import SSHTunnelForwarder
    from time import sleep
    
    server = SSHTunnelForwarder(
        ssh_address_or_host='localhost',
        remote_bind_address=('localhost', 80),
        local_bind_address=('localhost', 8088),
        ssh_username='ec2-user',
        ssh_port=22,
        ssh_pkey='~/.ssh/epic_ssh_unit_test_key.private',
        ssh_config_file=None,
        allow_agent=False,
        set_keepalive=10,
        threaded=True
    )
    print("About to start")
    server.start()
    
    while not server.is_active:
        sleep(1)
        
    print("SSH up")
    
    server.stop()
    while server.is_active:
        sleep(1)
    print("Server stopped")
    

    If I add:

    server.daemon_forward_servers = True
    server.daemon_transport = True
    

    just before server.start() then it does work.

    Note that it does work with the context manager:

    import sshtunnel
    
    with sshtunnel.open_tunnel(
            ssh_address_or_host='localhost',
            remote_bind_address=('localhost', 80),
            local_bind_address=('localhost', 8088),
            ssh_username='ec2-user',
            ssh_port=22,
            ssh_pkey='~/.ssh/epic_ssh_unit_test_key.private',
            ssh_config_file=None,
            allow_agent=False,
            set_keepalive=10,
            threaded=True
        ) as tunnel:
    
        print("SSH up")
    
    print("Server stopped")
    

    I think this is related to #169 , but hard to tell since there's no detail there.

    bug duplicate wontfix 
    opened by mdavis-xyz 10
  • Tunnel hangs on database connect

    Tunnel hangs on database connect

    I'm connecting to a variety of database (Oracle, PostgreSQL und MS SQL) via SQLAlchemy. Connecting to an Oracle database makes the tunnel hang. This does not happen for PostgreSQL or MS SQL or when using plink to create the tunnel.

    I've created a trace log.

    oracle-hang.txt

    This is Python 3.6.2 64-bit on Windows. All modules have the latest version. Regards, Thorsten

    paramiko issue? 
    opened by thorstenkampe 10
  • SSHTunnelForwarder closing deadlocks if tunnel leads to self and a connection is left open

    SSHTunnelForwarder closing deadlocks if tunnel leads to self and a connection is left open

    This is a bit of a heisenbug. If I open a tunnel on my laptop from localhost:65000 to dbserver:1521 through server jumpserv, and then open a connection through it (in my case it was cx_Oracle accessing dbserver), closing the SSHTunnelForwarder without closing the dbserver connection prior works fine - the connection drops and the closing finishes. However, if the same tunnel is opened on jumpserv, from localhost:6500 to server dbserver:1521 through server jumpserv, and then I open the same connection through it, closing the SSHTunnelForwarder without closing the dbserver connection prior leads to a deadlock. This can lead to strange behaviour, as the same code works fine when executed on one machine and deadlocks on another. If you'd like, I can try to provide minimal code samples.

    bug 
    opened by chedatomasz 9
  • Modern packaging

    Modern packaging

    It would be nice if sshtunnel was packaged in a more modern way - inside it's own sshtunnel package directory with __init__.py, and the ability to break up the package into multiple .py modules. I also believe this would be helpful with adding of mypy static type checking support.

    opened by keithel-qt 1
  • Add types and type checking so mypy type checking is happy

    Add types and type checking so mypy type checking is happy

    Mypy is presently not happy with sshtunnel, as it is not annotated with python types in it's variables and function signatures.

    If you try importing sshtunnel in a project, and you run mypy against it, you will get messages similar to this:

    myproject/ssh_tunnel.py:2: error: Skipping analyzing "sshtunnel": module is installed, but missing library stubs or py.typed marker
    myproject/main.py:13: error: Skipping analyzing "sshtunnel": module is installed, but missing library stubs or py.typed marker
    myproject/main.py:13: note: See https://mypy.readthedocs.io/en/stable/running_mypy.html#missing-imports
    Found 2 errors in 2 files (checked 32 source files)
    [cargo-make] ERROR - Error while executing command, exit code: 1
    [cargo-make] WARN - Build Failed.
    

    I created this issue to track progress of sshtunnel working well with Mypy - being able to check sshtunnel's static typing. This also would encompass adding static typing to sshtunnel, which will aid testing.

    opened by keithel-qt 0
  • opentunnel with -N parameter

    opentunnel with -N parameter

    Hello dear

    I am working on a client-side connection that will open a tunnel on a server with a user that doesn't have permission to run command and the user only can use port forwarding so on client-side ssh most run with the -N argument

    now where I open my tunnel the tunnel will close by the server because the ssh tunnel didn't pass -N

    how can I solve this issue?

    opened by B14ckP4nd4 0
  • SSHTunnel able to log in even with wrong credentials

    SSHTunnel able to log in even with wrong credentials

    I'm trying to use SSH agent to tunnel to a remote machine, but I want to explicitly ONLY allow key-based authentication (from the client side) based on a key passed in at runtime, not based off of whatever the OS has saved at the time. However, SSHTunnelForwarder appears to be ignoring these directives and is successfully connecting every time, even when I deliberately pass in the incorrect key. Minimum viable example below:

    import time
    
    from sshtunnel import SSHTunnelForwarder
    
    tunnel = SSHTunnelForwarder(
        'my.server.ip.address',
        ssh_config_file=None,
        ssh_username='edgeot',
        ssh_pkey='/home/fshriver/test_keys/test_key',
        local_bind_address=('127.0.0.1', 9555),
        remote_bind_address=('127.0.0.1', 9555),
        allow_agent=False
    )
    
    tunnel.start()
    
    print(tunnel.tunnel_is_up)
    
    time.sleep(10)
    
    tunnel.close()
    

    As stated, if I've ssh'd into the server before then sshtunnel will never fail to ssh in, even when I change the key to some non-existent filepath. I believe this is because it's still using the ssh agent, but my understanding is allow_agent=False should disable that. Is that incorrect behavior? Am I missing something?

    opened by fshriver 0
Releases(0.4.0)
  • 0.4.0(Jan 11, 2021)

    • Change the daemon mod flag for all tunnel threads to prevent unexpected hangs (#219) (is not fully backward compatible!)
    • Add docker based end to end functional tests for Mongo/Postgres/MySQL (#219)
    • Add docker based end to end hangs tests (#219)
    Source code(tar.gz)
    Source code(zip)
  • 0.3.2(Jan 11, 2021)

  • 0.3.1(Nov 15, 2020)

  • 0.3.0(Nov 15, 2020)

    • Change default with context behavior to use .stop(force=True) on exit (is not fully backward compatible)
    • Remove useless daemon_forward_servers = True hack for hangs prevention (is not fully backward compatible)
    • Set transport keepalive to 5 second by default (disabled for version < 0.3.0)
    • Set default transport timeout to 0.1
    • Deprecate and remove block_on_close option
    • Fix "deadlocks" / "tunneling hangs" (#173, #201, #162, #211)
    Source code(tar.gz)
    Source code(zip)
  • 0.2.2(Oct 31, 2020)

  • 0.2.1(Oct 24, 2020)

    v.0.2.1

    • Fixes bug with orphan thread for a tunnel that is DOWN (#170). (@pahaz, @eddie-chiang and @kkrasovskii)

    NOTE:: regression https://github.com/pahaz/sshtunnel/issues/201

    Source code(tar.gz)
    Source code(zip)
  • 0.2.0(Oct 24, 2020)

    v.0.2.0

    • Support IPv6 without proxy command. Use built-in paramiko create socket logic. The logic tries to use ipv6 socket family first, then ipv4 socket family. (Georgy Rylov) https://github.com/pahaz/sshtunnel/pull/195

    NOTE: possible regression https://github.com/pahaz/sshtunnel/issues/201

    Source code(tar.gz)
    Source code(zip)
  • 0.0.7.3(Feb 16, 2015)

Owner
Pavel White
Entrepreneurship. Founder and CTO of 8IQ Software. FullStack DevOps Security Engineer %) And IT 💘lover
Pavel White
MagTape is a Policy-as-Code tool for Kubernetes that allows for evaluating Kubernetes resources against a set of defined policies to inform and enforce best practice configurations.

MagTape is a Policy-as-Code tool for Kubernetes that allows for evaluating Kubernetes resources against a set of defined policies to inform and enforce best practice configurations. MagTape includes

T-Mobile 143 Dec 27, 2022
Python IMDB Docker - A docker tutorial to containerize a python script.

Python_IMDB_Docker A docker tutorial to containerize a python script. Build the docker in the current directory: docker build -t python-imdb . Run the

Sarthak Babbar 1 Dec 30, 2021
docker-compose工程部署时的辅助脚本

okta-cmd Introduction docker-compose 辅助脚本

完美风暴666 4 Dec 09, 2021
Wiremind Kubernetes helper

Wiremind Kubernetes helper This Python library is a high-level set of Kubernetes Helpers allowing either to manage individual standard Kubernetes cont

Wiremind 3 Oct 09, 2021
Deploy a simple Multi-Node Clickhouse Cluster with docker-compose in minutes.

Simple Multi Node Clickhouse Cluster I hate those single-node clickhouse clusters and manually installation, I mean, why should we: Running multiple c

Nova Kwok 11 Nov 18, 2022
Chartreuse: Automated Alembic migrations within kubernetes

Chartreuse: Automated Alembic SQL schema migrations within kubernetes "How to automate management of Alembic database schema migration at scale using

Wiremind 8 Oct 25, 2022
strava-offline is a tool to keep a local mirror of Strava activities for further analysis/processing:

strava-offline Overview strava-offline is a tool to keep a local mirror of Strava activities for further analysis/processing: synchronizes metadata ab

Tomáš Janoušek 29 Dec 14, 2022
A declarative Kubeflow Management Tool inspired by Terraform

🍭 KRSH is Alpha version, so many bugs can be reported. If you find a bug, please write an Issue and grow the project together! A declarative Kubeflow

Riiid! 128 Oct 18, 2022
Universal Command Line Interface for Amazon Web Services

aws-cli This package provides a unified command line interface to Amazon Web Services. Jump to: Getting Started Getting Help More Resources Getting St

Amazon Web Services 13.3k Jan 01, 2023
Learning and experimenting with Kubernetes

Kubernetes Experiments This repository contains code that I'm using to learn and experiment with Kubernetes. 1. Environment setup minikube kubectl doc

Richard To 10 Dec 02, 2022
Nagios status monitor for your desktop.

Nagstamon Nagstamon is a status monitor for the desktop. It connects to multiple Nagios, Icinga, Opsview, Centreon, Op5 Monitor/Ninja, Checkmk Multisi

Henri Wahl 361 Jan 05, 2023
Play Wordle from any Kubernetes cluster.

wordle-operator 🟩 ⬛ 🟩 🟨 ⬛ Play Wordle from any Kubernetes cluster. Using the power of CustomResourceDefinitions and Kubernetes Operators, now you c

Lucas Melin 1 Jan 15, 2022
Webinar oficial Zabbix Brasil. Uma série de 4 aulas sobre API do Zabbix.

Repositório de scripts do Webinar de API do Zabbix Webinar oficial Zabbix Brasil. Uma série de 4 aulas sobre API do Zabbix. Nossos encontros [x] 04/11

Robert Silva 7 Mar 31, 2022
Let's Git - Version Control & Open Source Homework

Let's Git - Version Control & Open Source Homework Welcome to this homework for our MOOC: Let's Git! We hope you will learn a lot and have fun working

1 Dec 05, 2021
Hubble - Network, Service & Security Observability for Kubernetes using eBPF

Network, Service & Security Observability for Kubernetes What is Hubble? Getting Started Features Service Dependency Graph Metrics & Monitoring Flow V

Cilium 2.4k Jan 04, 2023
Bash-based Python-venv convenience wrapper

venvrc Bash-based Python-venv convenience wrapper. Demo Install Copy venvrc file to ~/.venvrc, and add the following line to your ~/.bashrc file: # so

1 Dec 29, 2022
This repository contains useful docker-swarm-tools.

docker-swarm-tools This repository contains useful docker-swarm-tools. swarm-guardian This Docker image is intended to be used in a multihost docker e

NeuroForge GmbH & Co. KG 4 Jan 12, 2022
CI repo for building Skia as a shared library

Automated Skia builds This repo is dedicated to building Skia binaries for use in Skija. Prebuilt binaries Prebuilt binaries can be found in releases.

Humble UI 20 Jan 06, 2023
Phonebook application to manage phone numbers

PhoneBook Phonebook application to manage phone numbers. How to Use run main.py python file. python3 main.py Links Download Source Code: Click Here M

Mohammad Dori 3 Jul 15, 2022
Create pinned requirements.txt inside a Docker image using pip-tools

Pin your Python dependencies! pin-requirements.py is a script that lets you pin your Python dependencies inside a Docker container. Pinning your depen

4 Aug 18, 2022