Session-lived containers for advanced browser-based applications.

Overview

Spawner

Spawner logo

Spawner is a bridge between a web application and Kuberenetes. It allows a web application to create session-lived containers that serve WebSocket or HTTP connections. Spawner coordinates with a reverse proxy, so that your client-side code can talk directly to these servers. session-lived means that when the remote client(s) close the connection, the container is cleaned up.

This is still a work-in-progress. It's demo-stage, and not ready for use in production just yet. If you are interested in being an early adopter, though, feel free to open an issue or email me at [email protected].

Video Demo

Screen shot of YouTube player

Use cases

Spawner is intended for cases where a web app needs a dedicated, stateful back-end to talk to for the duration of a session. One area where this approach is currently common is web-based IDEs like GitHub Codespaces, which spin up a container for each user to run code in. It's also useful as a back-end for real-time collaboration, when the document state is non-trivial and needs more than just a relay server (see e.g. Figma's description of how they run one process per active document.) By making it low-stakes to experiment with this architecture, my hope is that Spawner will help developers discover new use-cases, like loading a large dataset into system or GPU memory to allow real-time interactive data exploration.

Depending on your needs, it may also make sense as a back-end for games and virtual spaces, but also see Agones for that use case.

How it works

Service Creation

The Spawner process runs in a pod on your cluster and serves an HTTP API. On startup, it is passed an --application-image argument that specifies the full path of the image for your application container on a container registry.

Routing

When your web app wants to create a session-lived container, its backend sends a POST request to http://hostname-of-spawner:8080/init. Spawner then asks Kubernetes to create a pod and service for that session, and returns a JSON object containing a URL specific to that session-lived container, like https://my-domain.com/p/JE3M/. This URL can then be passed on to the client-side container, which can connect to it as a regular HTTP host. The proxy server is configured to map paths under the root, so that https://my-domain.com/p/JE3M/my-file.txt is internally routed to http://hostname-of-pod/my-file.txt.

Currently, Spawner works best with NGINX as a reverse proxy, but other reverse proxies with a similar feature set should also work. If there's a particular proxy you'd like to see supported, feel free to open an issue.

Service Destruction

When Spawner detects that a container has not served a request for some (configurable) interval, it will shut down the pod and delete the service. It can determine whether a pod has served a request in one of two ways:

  1. The pod can serve a /status endpoint which returns a JSON blob that looks like this:
{
  "active_connections": 2,
  "seconds_inactive": 0,
  "listening": true,
}
  • active_connections is the number of active connections (e.g. WebSocket connections) to the server.
  • seconds_inactive is the amount of time elapsed since the last connection.
  • listening is true if the server is currently accepting new connections.

At least one of active_connections or seconds_inactive should be zero. Currently, only seconds_inactive is used; the container is shut down when it passes a threshold value. Eventually, the other values may be exposed through a monitoring interface.

  1. The sidecar process can be injected into your pod. The sidecar process shares a network namespace with the application container, so it can ask the OS for active TCP connections on the application container's port. It uses this information to serve the same /status interface, but on a different port.
Comments
  • Abhi/compose cli

    Abhi/compose cli

    This adds the cli proposed in https://github.com/drifting-in-space/plane/pull/199

    I'm still working on this (need to add in certs and make the guac-firefox default open up to plane.dev) but I wanted some comments on the cli, the way it works is: ./plane-dev -[lmxg] where -l : linux -m : mac -x : x11 -g : guac

    I'd have nice long options, but can't do that without GNU getopts, which isn't on macs by default, so I'd rather not. what'd you guys think?

    opened by pretentious7 13
  • Support specifying listening port of spawned image

    Support specifying listening port of spawned image

    It looks like currently the container I launch has to listen on port 8080 for incoming connections. It would be nice if the API (DockerExecutableConfig) supported specifiying a different port.

    opened by t-moe 6
  • plane-drone docker container error in M1 Mac

    plane-drone docker container error in M1 Mac

    Hi I'm seeing this error when I try to run the sample-config Any workaround? Seems like a rust / docker / M1 Mac issue - https://docs.rs/notify/latest/notify/

    $ docker compose up
    
    plane-drone       | Error: Error building cert refresher.
    plane-drone       | 
    plane-drone       | Caused by:
    plane-drone       |     Function not implemented (os error 38)
    
    opened by MyCADDev 6
  • Allow a spawn request which does not pull the image

    Allow a spawn request which does not pull the image

    This is something I've wanted to do to reduce cold start times when we know we have the image locally, and has also been requested by @mycaddev via Discord.

    enhancement 
    opened by paulgb 5
  • plane-cli list-dns error

    plane-cli list-dns error

    I followed along the example and opened the drop four app in firefox

    plane-cli list-dns is giving this below error

    2022-11-17T23:16:57.797046Z  INFO async_nats::options: event: connected
    Error: NATS Error: Custom { kind: Other, error: "error while processing messages from the stream: 404, Some(\"No Messages\")" }
    
    opened by MyCADDev 4
  • `stats_are_acquired` test is flakey

    `stats_are_acquired` test is flakey

    E.g. https://github.com/drifting-in-space/spawner/runs/8142561122?check_suite_focus=true

    @pretentious7 how frequent are these checks emitted? I thought 30s would be a long enough time to wait but maybe not.

    test 
    opened by paulgb 4
  • Desired use case

    Desired use case

    Evening :wave:

    I stumbled across your project whilst planning to develop something which sounds very similar. I thought I'd let you know my intended use case, because it sounds like you may already be developing the solution I'm looking for.

    My plan was to authenticate users using my existing Keycloak OIDC SSO, and then spin up a fresh code-server container.

    User story:

    • User navigates to a site and is prompted to login with OAuth.
    • Once logged in, server automatically spins up a new container.
      • A volume (whose name is based on the user's username) is mapped to the new container for data persistence.
      • Container is exposed on a subdomain via a reverse proxy.
    • Server redirects user to the unique subdomain.

    A crude diagram in an attempt to illustrate this is below.

    index

    I'd be interested to hear if this sort of architecture matches what you're aiming to achieve.

    No worries if not! :-)

    question 
    opened by jackhadrill 4
  • Add passthrough flag for proxy

    Add passthrough flag for proxy

    This adds a flag to the proxy to allow a "passthrough" SocketAddr used when a backend can't be resolved. All unknown hosts will be proxied to this backend, but it will all be TLS terminated with the same certificate, so if this is used to resolve other hostnames a custom certificate will need to be passed in which covers all of them.

    Only HTTP is supported for the upstream connection.

    This will close #289.

    opened by paulgb 3
  • Drone Proxy: Allow Custom Routes

    Drone Proxy: Allow Custom Routes

    We're using plane in the standalone configuration (single drone, without dnsmasq / firefox). We use a wilcard dns to map *.example.com => 1.2.3.4

    In order to manage plane, we have a custom webservice. Currently we need a separate host or port for that, but we would like to host that on the same host and port as the drone. For Example:

    • When we visit example.com we reach our custom webservice (e.g. listening on 127.0.0.1:4567)
    • When we visit e485cf9a-fc65-4d7c-935e-656572068226.example.com => we reach the launched backend

    It would be nice if we could provide custom subdomain to route mapping in the drone.toml as a map. Example:

    [proxy]
    # IP to listen for connections on.
    bind_ip = "0.0.0.0"
    
    [proxy.custom_route]
    host = "status.example.com"
    route = "http://127.0.0.1:9874"
    
    [proxy.custom_route]
    host = "example.com"
    route = "http://127.0.0.1:4567"
    

    If I'm correct, I could extend the code here, to make that work: https://github.com/drifting-in-space/plane/blob/dbd550e9b1db33e611ab00730182a28eaf12e7db/drone/src/proxy/service.rs#L203-L236

    enhancement 
    opened by t-moe 3
  • Support Single-Drone Scenario, with Wildcard Dns

    Support Single-Drone Scenario, with Wildcard Dns

    Hi there, This project looks like the perfect foundation for our use case: We develop a webapp in .NET/Angular and want to spin up a backend (single docker container) for each developer when they click a link in the CI build output of our project (e.g. to Preview a PullRequest).

    We want to host plane on our azure infrastructure, but we don't need multiple drones right now. Is there a way to disable the DNS stuff and just create a single drone and a scheduler? We would then create a wildcard dns to map *.test-our-webapp.com => The-One-And-Only-Drone-IP. We really don't want to host multiple services (dns, scheduler, drone) for this, because we need to keep our cloud cost at a minimum....

    Thanks in advance

    opened by t-moe 3
  • Fix DNS subject (fixes #265)

    Fix DNS subject (fixes #265)

    Previously, all DNS records for a given cluster went to the same subject. The cli fetches DNS records using DeliverPolicy::LastPerSubject, so it only gets the last message sent to a subject (so one per cluster). This fixes the issue by adding the backend ID to the subject.

    Leaving this as a draft for now because this changes the NATS API between the drone and controller and I haven't thought through a zero-downtime migration path as we try to do for NATS API changes.

    Currently, migration requires:

    • Re-installing the CLI (cargo install --path=cli in root of the repo)
    • Deleting the old stream (nats stream delete dns_record)
    • Re-building and running the controller and drone (docker compose build followed by docker compose up)
    nats-api-breaking 
    opened by paulgb 3
  • Provide standalone Plane configuration (without Firefox/dnsmasq)

    Provide standalone Plane configuration (without Firefox/dnsmasq)

    It could be confusing that we spin up some extra services to get a local demo running that are not needed for a production system. We should have a docker compose file that only runs the controller, DNS server, and NATS jetstream server.

    We should also consider an example that doesn't use DNS, as mentioned in #279.

    documentation 
    opened by paulgb 0
  • Refactor how drone state propagates to controller and other consumers

    Refactor how drone state propagates to controller and other consumers

    Our current approach to state is to use non-Jetstream NATS and treat it as unreliable and ephemeral. Drones simply rebroadcast all of their current state frequently to keep that state alive in the system. Consumers of that state will cache it for a limited TTL, and then intentionally forget it if it is not rebroadcast again.

    This has some maintenance benefits, because even though the system is stateful, it does not have long-persisted state. It does have a few downsides, though:

    • As the system state grows, it can become very chatty to have all state rebroadcast frequently. This is especially relevant as we add more state to be used for scheduling.
    • There's no system-level consensus on when a drone has become lost, or who is responsible for declaring it lost. As a result, we currently do not handle drone loss.
    • A bunch of code that doesn't really have to do with events (i.e. just needs a static view of cluster state) has to deal with the event-based nature of the data.

    Now that we have a better understanding of the semantics of Jetstream (including @pretentious7's deep dives), I propose returning to using Jetstream to store Plane's runtime state.

    The approach I propose is:

    • All state used for scheduling and routing is moved into a single Jetstream stream.
    • The stream captures all subjects that match cluster.*.drone.*.sm.> and stores the last message on each subject.
    • One-time consumers of this state read a “snapshot” copy by reading the last message on every subject from NATS. Once the snapshot is read, the stream consumer is dropped.
    • Long-term consumers of this state (including the DNS server and scheduler) keep a single local copy of a view into all system state. The process has a single global instance of a SystemViewReplica which owns a NATS subscription which processes change events from the drones. These events are applied to the shared data structure. Consumers do not need to be aware of the event-based nature of the data, they just access system state by calling methods of a data structure. All requests are synchronous, since a replica of the entire system state data structure is stored locally.

    Tasks:

    • [x] Use this model for the CLI client, and broadcasts the appropriate messages. The old messages remain for now. #274
    • [ ] Switch to the new model for DNS serving. #285
    • [ ] Switch to the new model for scheduling.
    • [ ] Remove BackendStateMessage and SetDnsRecord (we will keep SetAcmeDnsRecord for ACME, counter to the previous plans to do all DNS through SetDnsRecord).
    • [ ] Handle lost drones appropriately and send update messages on all of their backends.

    Consumers of BackendStateMessage will need to change, but it's mostly just a matter of listening on a different subject wildcard as the message has mostly the same information.

    This will fix #265, and supersede #145’s proposed changes to SetDnsRecord and BackendStateMessage.

    nats-api-breaking 
    opened by paulgb 2
  • Listing of DNS records seems to be unstable

    Listing of DNS records seems to be unstable

    I just tried this with latest pull and install of cli

    Created two backends

    % plane-cli spawn plane.test ghcr.io/drifting-in-space/demo-image-drop-four
    Backend scheduled.
    URL: https://64becea6-7e02-472e-bc1e-8319363843d5.plane.test
    Drone: 6c12439f-6e48-4a4a-96b1-489be751ed56
    Backend ID: 64becea6-7e02-472e-bc1e-8319363843d5
    
    % plane-cli spawn plane.test ghcr.io/drifting-in-space/demo-image-drop-four
    Backend scheduled.
    URL: https://03b6ca25-b8f1-4519-952d-56d845474434.plane.test
    Drone: 6c12439f-6e48-4a4a-96b1-489be751ed56
    Backend ID: 03b6ca25-b8f1-4519-952d-56d845474434
    

    List DNS is always showing one or the other - never both

    % plane-cli list-dns
    Found 1 DNS records:
    64becea6-7e02-472e-bc1e-8319363843d5.plane.test	A	172.16.238.3
    
    % plane-cli list-dns
    Found 1 DNS records:
    03b6ca25-b8f1-4519-952d-56d845474434.plane.test	A	172.16.238.3
    
    % plane-cli list-dns
    Found 1 DNS records:
    03b6ca25-b8f1-4519-952d-56d845474434.plane.test	A	172.16.238.3
    
    % plane-cli list-dns
    Found 1 DNS records:
    03b6ca25-b8f1-4519-952d-56d845474434.plane.test	A	172.16.238.3
    
    % plane-cli list-dns
    Found 1 DNS records:
    64becea6-7e02-472e-bc1e-8319363843d5.plane.test	A	172.16.238.3
    
    bug 
    opened by MyCADDev 3
  • Check NATS subject when receiving messages

    Check NATS subject when receiving messages

    We currently generate NATS subjects from message contents, but we don't verify that a message was received at the appropriate subject, so a connected client with access to publish on cluster.foo_bar.* can publish a message about the fizz_boom cluster instead of the foo_bar cluster and it is not checked. This is fine in the current situation where there is only one tenant, but will become necessary when we implement #124.

    This will not be useful on all subjects until #145 ensures that all subjects include the cluster, since the cluster is level of isolation we want.

    Rather than try to parse the subject, we can just generate the subject upon receiving a message and do a string comparison. This works because subjects are deterministically generated from messages.

    enhancement 
    opened by paulgb 0
Releases(v0.3.4)
  • v0.3.4(Nov 15, 2022)

    What's Changed

    • Remove drone handshake and make drone ID a string by @paulgb in https://github.com/drifting-in-space/plane/pull/158
    • Store drone id in logs by @paulgb in https://github.com/drifting-in-space/plane/pull/159
    • Fix spawn request logging by @paulgb in https://github.com/drifting-in-space/plane/pull/163
    • add SetDnsRecord message by @pretentious7 in https://github.com/drifting-in-space/plane/pull/162
    • Fix log component serialization by @paulgb in https://github.com/drifting-in-space/plane/pull/165
    • Log drone ID on startup by @paulgb in https://github.com/drifting-in-space/plane/pull/166
    • Better logging of scheduler errors by @paulgb in https://github.com/drifting-in-space/plane/pull/167
    • do not multiply cpu_percent by num_cpus by @pretentious7 in https://github.com/drifting-in-space/plane/pull/169
    • Minimal functional docker-compose config by @paulgb in https://github.com/drifting-in-space/plane/pull/171
    • Use jetstream for status message by @paulgb in https://github.com/drifting-in-space/plane/pull/172
    • Initialize tracing before planning by @paulgb in https://github.com/drifting-in-space/plane/pull/174
    • Listen for sigterm by @paulgb in https://github.com/drifting-in-space/plane/pull/175
    • Limit stream to one message per drone by @paulgb in https://github.com/drifting-in-space/plane/pull/176
    • move from streaming stats api to polling by @pretentious7 in https://github.com/drifting-in-space/plane/pull/177
    • Initial commit of CLI (lists drones, spawn backends) by @paulgb in https://github.com/drifting-in-space/plane/pull/181
    • Allow scheduler to pick backend name (fixes #182) by @paulgb in https://github.com/drifting-in-space/plane/pull/183
    • Initial docs by @paulgb in https://github.com/drifting-in-space/plane/pull/185
    • Local spawner development environment by @paulgb in https://github.com/drifting-in-space/plane/pull/186
    • rename Spawner -> Plane by @paulgb in https://github.com/drifting-in-space/plane/pull/189
    • docs improvements by @paulgb in https://github.com/drifting-in-space/plane/pull/190
    • Fix passive voice nit by @paulgb in https://github.com/drifting-in-space/plane/pull/191
    • Improve CLI spawning interface by @paulgb in https://github.com/drifting-in-space/plane/pull/192
    • CLI and doc improvements by @paulgb in https://github.com/drifting-in-space/plane/pull/194
    • Add demo video to README.md by @paulgb in https://github.com/drifting-in-space/plane/pull/196
    • Fix URL base by @paulgb in https://github.com/drifting-in-space/plane/pull/197
    • Fix share card image by @paulgb in https://github.com/drifting-in-space/plane/pull/198
    • Add arm64 arch to docker builds by @paulgb in https://github.com/drifting-in-space/plane/pull/195
    • Refactor SpawnRequest to be composed of RouterConfig and ExecutorConfig by @pretentious7 in https://github.com/drifting-in-space/plane/pull/200
    • Add video to plane.dev homepage. by @paulgb in https://github.com/drifting-in-space/plane/pull/203
    • test: add web socket test by @lalo in https://github.com/drifting-in-space/plane/pull/202
    • Fix github workflows by @paulgb in https://github.com/drifting-in-space/plane/pull/206
    • Update architecture diagram by @paulgb in https://github.com/drifting-in-space/plane/pull/209
    • Version bump by @paulgb in https://github.com/drifting-in-space/plane/pull/205
    • Fix link in readme by @paulgb in https://github.com/drifting-in-space/plane/pull/204
    • Fix svg issue by @paulgb in https://github.com/drifting-in-space/plane/pull/211
    • More docs by @paulgb in https://github.com/drifting-in-space/plane/pull/208
    • add subscribe jetstream ordered by @pretentious7 in https://github.com/drifting-in-space/plane/pull/212
    • Misc cleanup by @paulgb in https://github.com/drifting-in-space/plane/pull/213
    • Update bollard commit hash by @paulgb in https://github.com/drifting-in-space/plane/pull/214
    • Report drone version in liveness ping by @paulgb in https://github.com/drifting-in-space/plane/pull/215
    • Basic DNS record tests by @paulgb in https://github.com/drifting-in-space/plane/pull/216
    • Add SOA record support on DNS by @paulgb in https://github.com/drifting-in-space/plane/pull/218
    • subscribe to drone status message as a regular subscription - not a jetstream by @rolyatmax in https://github.com/drifting-in-space/plane/pull/219
    • Handle NATS parse errors by @paulgb in https://github.com/drifting-in-space/plane/pull/220
    • Fix route duplication issue by @paulgb in https://github.com/drifting-in-space/plane/pull/221
    • Abhi/compose cli by @pretentious7 in https://github.com/drifting-in-space/plane/pull/217
    • Disable proxy routes except when the backend is ready by @paulgb in https://github.com/drifting-in-space/plane/pull/222
    • fix bug and notif for other unhandled errors by @pretentious7 in https://github.com/drifting-in-space/plane/pull/224
    • Abhi/misc cli improvement by @pretentious7 in https://github.com/drifting-in-space/plane/pull/225
    • Add timings for certain startup tasks by @paulgb in https://github.com/drifting-in-space/plane/pull/230
    • Remove SetAcmeDnsRecord in favor of SetDnsRecord by @paulgb in https://github.com/drifting-in-space/plane/pull/226
    • Add ready field to DroneStatusMessage to support draining (#129) by @paulgb in https://github.com/drifting-in-space/plane/pull/228
    • Add bearer tokens to messages to support eventual implementation (#118) by @paulgb in https://github.com/drifting-in-space/plane/pull/229
    • CORS header for 404 by @paulgb in https://github.com/drifting-in-space/plane/pull/232
    • Fix drone lifecycle bug by @paulgb in https://github.com/drifting-in-space/plane/pull/233
    • Abhi/caching by @pretentious7 in https://github.com/drifting-in-space/plane/pull/234
    • add caching to github workflows by @pretentious7 in https://github.com/drifting-in-space/plane/pull/235
    • Add back SetAcmeDnsRecord by @paulgb in https://github.com/drifting-in-space/plane/pull/236
    • Fix clippy warnings by @paulgb in https://github.com/drifting-in-space/plane/pull/237
    • Better handling of error in dns loop by @paulgb in https://github.com/drifting-in-space/plane/pull/238
    • Support drone draining (#129) by @paulgb in https://github.com/drifting-in-space/plane/pull/240
    • refactor dockerfiles to remove docker compose warnings re: build args by @pretentious7 in https://github.com/drifting-in-space/plane/pull/239
    • Add running backends to DroneStatusMessage schema by @paulgb in https://github.com/drifting-in-space/plane/pull/241
    • move everything over to 16 core machines! by @pretentious7 in https://github.com/drifting-in-space/plane/pull/243
    • Abhi/fix arg bug by @pretentious7 in https://github.com/drifting-in-space/plane/pull/244
    • update dockerfiles to use rust-sccache by @pretentious7 in https://github.com/drifting-in-space/plane/pull/245
    • Add CLI command to drain drone and terminate backend by @paulgb in https://github.com/drifting-in-space/plane/pull/246
    • Drone reports number of running backends by @paulgb in https://github.com/drifting-in-space/plane/pull/247
    • Do not use sccache when S3 bucket url not set in $PLANE_SCCACHE_BUCKET (fixes slow docker build times when that variable is unset) by @pretentious7 in https://github.com/drifting-in-space/plane/pull/248
    • use test command explicitly instead of [ ] alias in docker run and remove "" as default arg in compose by @pretentious7 in https://github.com/drifting-in-space/plane/pull/249
    • Version updates by @paulgb in https://github.com/drifting-in-space/plane/pull/251
    • Add devcontainer by @paulgb in https://github.com/drifting-in-space/plane/pull/252
    • Executor refactoring by @paulgb in https://github.com/drifting-in-space/plane/pull/253

    Full Changelog: https://github.com/drifting-in-space/plane/compare/v0.0.3...v0.3.4

    Source code(tar.gz)
    Source code(zip)
Owner
drifting in space
drifting in space
Browser tab search provider for GNOME

What is this ? This is repository provides browser tab search provider for GNOME Screenshot Installation Installl all 3 components for tab search to w

Harshad 28 Dec 20, 2022
memflow based dxgi screen mirror prototype

memflow-mirror work in progress framebuffer mirror based on memflow. Installation Compile the guest-agent on Windows with: cargo build --release --bin

null 21 May 9, 2022
Redis backed session store for async-session using fred.rs.

async-fred-session Redis backed session store for async-session using fred.rs. This work is mostly based on async-redis-session. use async_fred_sessio

void* 4 Feb 28, 2023
Easy c̵̰͠r̵̛̠ö̴̪s̶̩̒s̵̭̀-t̶̲͝h̶̯̚r̵̺͐e̷̖̽ḁ̴̍d̶̖̔ ȓ̵͙ė̶͎ḟ̴͙e̸̖͛r̶̖͗ë̶̱́ṉ̵̒ĉ̷̥e̷͚̍ s̷̹͌h̷̲̉a̵̭͋r̷̫̊ḭ̵̊n̷̬͂g̵̦̃ f̶̻̊ơ̵̜ṟ̸̈́ R̵̞̋ù̵̺s̷̖̅ţ̸͗!̸̼͋

Rust S̵̓i̸̓n̵̉ I̴n̴f̶e̸r̵n̷a̴l mutability! Howdy, friendly Rust developer! Ever had a value get m̵̯̅ð̶͊v̴̮̾ê̴̼͘d away right under your nose just when

null 294 Dec 23, 2022
My utils for long-lived, fault-tolerant rust tasks

Sisyphus Utilities for long-running, resilient tasks. This library contains code I wrote, found useful, and want to keep using. It aims to provide sys

James Prestwich 25 Dec 30, 2022
Docker containers on a synthetic network. Run applications in a context that lets you manipulate their network conditions.

Synthetic Network Docker containers on a synthetic network. Run applications in a context that lets you manipulate their network conditions. Dependenc

Daily 58 Dec 15, 2022
In-memory, non stateful and session based code sharing application.

interviewer In-memory, non stateful and session based code sharing application. Test it here: interviewer.taras.lol Note: it's deployed to render auto

2pac 7 Aug 16, 2021
Serenade: Low-Latency Session-Based Recommendations

Serenade: Low-Latency Session-Based Recommendations This repository contains the official code for session-based recommender system Serenade, which em

bol.com 61 Dec 16, 2022
🪪 Session-based user authentication for Axum.

axum-login ?? Session-based user authentication for Axum. ?? Overview axum-login is a Tower middleware providing session-based user authentication for

Max Countryman 99 Jan 5, 2023
A real-time data backend for browser-based applications.

DriftDB DriftDB is a real-time data backend for browser-based applications. For more information, see driftdb.com. Structure of this repo docs/: main

drifting in space 453 Feb 6, 2023
rust-browser-game but native and rendered with ncurses in C without the Browser

Spin-off of rust-browser-game-but-sdl but with ncurses Nothing much to say. Just see rust-browser-game-but-sdl and rust-browser-game. Quick Start $ ma

Tsoding 8 Apr 21, 2022
The Bloat-Free Browser Game in Rust but in C and not in a Browser

rust-browser-game but native and rendered with SDL in C without the Browser The original idea of rust-browser-game is that the game.wasm module is com

Tsoding 12 Sep 26, 2022
Rslide - A web service that allows you to move through multiple html pages in the browser like a slide, even without focusing on the app console or the browser. Currently only supports Windows.

rslide rslide is a web service that allows you to move through multiple html pages in the browser like a slide, even without focusing on the app conso

Jason Dongheng Lee 3 Jan 1, 2022
A Rust Boilerplate server with GraphQL API, Diesel, PostgreSQL, session authentication and JWT

Canduma rust Graphql A Rust authentication server with GraphQL API, Diesel, PostgreSQL session authentication and JWT This repository contains a Graph

Julien Lenne 738 Dec 28, 2022
Quick demo of a REST frontend with a Redis session store.

axum-rest-starter-example Important Tasks Ensure session UUID is unique Protect /api/ with JWT Add CSRF CORS? Dev Setup (1) Run docker compose up to f

Michael de Silva 23 Dec 31, 2022
Authorize an ssh session using your keys on GitHub.

GitHub AuthorizedKeysCommand (hubakc) Heavily inspired by https://github.com/sequencer/gitakc . It allows someone login to the server using their ssh

Wenzhuo Liu 5 Nov 11, 2022
⚙️ Layered configuration system for Rust applications (with strong support for 12-factor applications).

config-rs Layered configuration system for Rust applications (with strong support for 12-factor applications). Set defaults Set explicit values (to pr

Ryan Leckey 1.8k Jan 9, 2023
Decentralized Autonomous Applications (DAAs). Building the Future with Self-Managing Applications.

Decentralized Autonomous Applications (DAAs) Building the Future with Self-Managing Applications. ?? Straw Man Code Outline ?? Reddit Group ?? Twitter

rUv 100 Apr 15, 2023
RailCar: Rust implementation of the Open Containers Initiative oci-runtime

railcar - rust implementation of the oci-runtime spec What is railcar? railcar is a rust implementation of the opencontainers initiative's runtime spe

Oracle 1.1k Dec 21, 2022
Open Source Rust kernel; Runs WASM and WASI as lightweight containers.

?? etheryal Kernel etheryal kernel is an Open Source capability-based Kernel written in the Rust programming language. The kernel allows implementing

null 32 Dec 4, 2022