[HN Gopher] Show HN: Hocus - self-hosted alternative to GitHub C...
       ___________________________________________________________________
        
       Show HN: Hocus - self-hosted alternative to GitHub Codespaces using
       Firecracker
        
       Author : hugodutka
       Score  : 177 points
       Date   : 2023-04-03 17:00 UTC (5 hours ago)
        
 (HTM) web link (github.com)
 (TXT) w3m dump (github.com)
        
       | itissid wrote:
       | This seems to be at the same level of how Meta manages their dev
       | environments. You pick the environment right from VS code and it
       | spins up an environment.
       | 
       | I think
       | 
       | > Add multi-node support
       | 
       | will be important for non trivial project development where the 2
       | distinct environments might be needed to talk to each other like
       | say for prototyping or "sharing configs"..
        
         | hugodutka wrote:
         | By multi-node support we mean the ability of Hocus to manage
         | multiple machines, so you can run dev envs on more than one
         | server and handle more concurrent users. These environments
         | would not communicate with one another. From the end user's
         | perspective using a multi-node deployment vs a single-node
         | deployment would not differ. If you needed 2 distinct
         | environments I would suggest using virtualization within a
         | single dev env.
        
       | politelemon wrote:
       | I see Docker listed as a requirement, and I am familiar with
       | Docker. The repo mentions using Firecracker, a microVM that I've
       | only ever heard of. What is the relation, if any, between these
       | two? Is this a wrong question: if this uses Firecracker why is
       | Docker involved?
        
         | guywithabowtie wrote:
         | Firecracker is the VM powering AWS Lambda, it is maintained by
         | Amazon. It is pretty decent and popular in certain areas. I
         | believe Fly.io is using them behind them too.
        
           | guywithabowtie wrote:
           | It has special optimizations for reducing cold start.
        
         | hugodutka wrote:
         | We use Firecracker to provider greater isolation and more
         | capabilities in dev envs. For example, one thing you often want
         | in your dev env is to run Docker containers, but to do that you
         | need some permissions that usually only a root user has. If we
         | used Docker to virtualize dev envs then we would have several
         | options to enable that:
         | 
         | - make dev envs privileged containers, effectively giving any
         | random user root control over the machine where Hocus is hosted
         | 
         | - mount the Docker agent from host into the container, but that
         | also allows the user to gain root control over the host machine
         | 
         | - use Linux user namespaces, and give you a root user with
         | limited capabilities inside your dev env. That's actually what
         | Gitpod - another Github Codespaces alternative - does. That
         | root can't do everything though. It can't run Kubernetes,
         | LocalStack, or the Elastic stack, because it can't modify some
         | system limits.
         | 
         | A dev env backed by Firecracker is a full-fledged virtual
         | machine that has none of the aforementioned drawbacks. It has
         | some performance tradeoffs though, but we are working to
         | minimize them as much as possible.
        
           | politelemon wrote:
           | OK thanks for that. I am tinkering with it and noticed that
           | it makes use of KVM and just found out that WSL2 has KVM
           | support so I'm going to give it a try there and see what
           | breaks, ha!
           | 
           | https://serverfault.com/questions/1043441/how-to-run-kvm-
           | nes...
        
         | cube2222 wrote:
         | Docker is used for running the control plane.
        
           | hugodutka wrote:
           | That's right! Docker is used to simplify deployment, so other
           | components, like the agent, are also containerized.
        
       | cpa wrote:
       | I believe this kind of service is the way forward when it comes
       | to developer tooling. But paying $39/mo/user for having the right
       | to deal with the deployment myself for a tool that is still alpha
       | is pretty high. I understand the (tremendous) value prop, but
       | that's the kind of price I'd be expecting from a SaaS version,
       | not from a self-hosted app. Although not giving a discount for
       | self-hosting and a price per user is the "modern" way to do open
       | source (see gitlab or mattermost), it still feels a bit wrong.
       | 
       | Anyway, excuse my old man rant, awesome work and good luck making
       | a business out of it! I'll give it a try.
        
         | hugodutka wrote:
         | Thanks! The pricing is there mostly to set expectations for the
         | future. The current release works (for the most part) for
         | individual users and it would not support a team well. Hocus is
         | free for up to 3 users, so we expect people who deploy the
         | alpha version not to pay a thing.
        
         | benatkin wrote:
         | For me it's a different issue. To me, Developer Tools are very
         | personal, and I've come to view using non-free IDEs as a waste
         | of time in the long-run. If I'm going to set it up for myself
         | individually, I want the whole thing to be open source*.
         | 
         | * It has the dreaded "View License" on GitHub
        
       | itay wrote:
       | Pretty nice, I have two questions:
       | 
       | 1. Comparing to something like GitPod (which lets you run on your
       | own instances as well), where do you think Hocus shines?
       | 
       | 2. Given you're leveraging Firecracker for isolation, and
       | Firecracker doesn't support GPUs, I assume that adding GPU-
       | enabled machines isn't on your near-term roadmap?
        
         | hugodutka wrote:
         | Thanks!
         | 
         | 1. GitPod doesn't officially support self-hosting anymore -
         | https://news.ycombinator.com/item?id=33907897. When they did,
         | it was extremely hard to set up. In fact we tried to do it at
         | my previous company several times and failed. Hocus is designed
         | with self-hosting in mind, and we want to make deployment and
         | management straightforward. And from an end user's perspective
         | there are 2 main advantages:
         | 
         | - Hocus dev envs are VMs instead of containers, so you can run
         | anything you want inside. For example Kubernetes or nested KVM.
         | 
         | - Workspaces start in <5 seconds, while Gitpod can take a
         | minute or longer.
         | 
         | 2. Actually we are exploring moving to Cloud Hypervisor or
         | QEMU, so we may support GPUs sooner than later. If you have a
         | specific use case in mind, feel free to contact me - contact
         | info is in my profile. I'd be happy to hear why you need them.
        
       | guywithabowtie wrote:
       | What would be the future plan here? Any hosted commercial
       | offerings? I am asking to understand whether one could use and
       | depend upon it for few years.
        
         | hugodutka wrote:
         | A hosted offering is not on our radar right now. Currently we
         | want to monetize by selling seat-based licenses for larger
         | teams.
        
           | ezekg wrote:
           | I run a software licensing/distribution API
           | (https://keygen.sh) that may be able to help you once your
           | self-hosted licensing requirements expand over the next
           | couple years. Reach out if you ever need anything or just
           | want to talk licensing best practices.
           | 
           | We're going to be going source-available under ELv2 soon as
           | well. Good to see more companies lately using the Elastic
           | license.
        
         | capableweb wrote:
         | It seems the future plans (short and long-term) are already
         | outlined in the README itself.                   - Ease of
         | deployment and management are central goals of Hocus, with
         | minimal assumptions made about the underlying OS and hardware.
         | - Hocus should provide a native development experience with
         | performance on par with bare-metal development.         - Hocus
         | should be scalable to accommodate large teams, with support for
         | thousands of users and heavyweight repositories. We're not
         | there yet.              Roadmap              - Add basic single
         | node support         - Optimize single node storage usage,
         | performance, and reliability         - Add permissioning for
         | teams, admins, and regular users         - Add multi-node
         | support         - Add support for more IDEs, particularly
         | JetBrains
        
       | notamy wrote:
       | This looks excellent! I have to try spinning it up in my homelab
       | to see how well it works for my needs.
        
       | yewenjie wrote:
       | How does this compare to https://coder.com?
        
         | hugodutka wrote:
         | Coder lets you describe a set of Terraform templates for your
         | development environments. Your team members then manually spin
         | up new VMs on e.g. AWS from these templates.
         | 
         | With Hocus you specify your dev env right alongside your code
         | in your Git repository with a hocus.yml file
         | (https://hocus.dev/docs/hocus-yml). Hocus is deployed on a set
         | of servers you manage (only 1 server during alpha). It has a
         | built-in CI system that watches your repository for new commits
         | and continuously builds the environment - we call this process
         | a prebuild. You can specify that your dependencies should be
         | installed and your code should be compiled during a prebuild.
         | You can also describe tasks that should run when you open a dev
         | env - for example automatically starting the app you are
         | working on. Once a prebuild is ready you can spin up a new dev
         | env - which we call a workspace - and connect to it
         | automatically with your IDE. We also have a VSCode extension
         | that automatically opens terminals connected to those tasks
         | from hocus.yml. All this combined allows each team member to
         | connect to a fresh, ready-to-code dev env anytime they want,
         | whether they are reviewing a PR or writing code themselves.
        
           | emptysongglass wrote:
           | I really wish you had used one of the existing standards in
           | place like .devcontainer or a Devfile. Frustrating to see a
           | solution emerge that uses its own declarative devenv
           | standard. Portability is also an important feature and I wish
           | the industry would converge on one or two.
        
           | donmcronald wrote:
           | I didn't look at it thoroughly, but it looks really cool and
           | I'll probably give it a proper try at some point. Judging by
           | your comment only...
           | 
           | > watches your repository for new commits and continuously
           | builds the environment
           | 
           | That feels wrong to me. For example, what happens if I want
           | to check out a 1 year old commit and edit it? Will the dev
           | environment that was used at the time be available or will it
           | be rebuilt? If it gets rebuilt, there's no way I get any
           | guarantees it's going to work.
           | 
           | IMHO most of the industry is getting it wrong when it comes
           | to dev environments and build systems. I've always called it
           | butterfly effect builds. You make a commit and it triggers a
           | ton of non-repeatable builds. There's not much value in doing
           | that for every commit IMO. What happens when something like
           | an APT mirror fails and the whole system grinds to a halt?
           | What happens when a runtime or dependency gets updated and
           | breaks at exactly the worst time during the week?
           | 
           | I'd rather see something on a (calendar) schedule with the
           | potential to trigger a manual build if needed. For example,
           | skim this [1] article. That's always made sense to me and, in
           | the context of a dev environment, why not build the base dev
           | environment once a week (or day) and only layer in the
           | resources / code on-demand? IE: Build the things I _don 't_
           | control on a calendar schedule and only build on-demand for
           | changes that are part of my project (using the base env).
           | 
           | The way I've always envisioned it is to have a stable env
           | build once per month or per week. It's fast enough to keep
           | everything rolling in terms of being current, yet slow enough
           | that I'm not spending time wondering if a problem I'm
           | debugging is caused by a change in my dev environment. I try
           | to do the same thing as dedicated build containers for
           | projects, but it's hard because everything is tunnel visioned
           | on per-commit re-builds these days.
           | 
           | 1. https://phauer.com/2019/no-fat-jar-in-docker-image/
        
             | hugodutka wrote:
             | > what happens if I want to check out a 1 year old commit
             | and edit it?
             | 
             | Your dev environment is version controlled too because it
             | lives in your repository. You would run a prebuild for that
             | old commit and get a dev env from that time. It would only
             | break if your old dev env can no longer be built, for
             | example if it depended on some external resource which is
             | no longer available on the internet.
             | 
             | > I'd rather see something on a (calendar) schedule with
             | the potential to trigger a manual build if needed.
             | 
             | That's actually on our todo list, but it didn't make it
             | into the 0.1 release. This feature is especially useful for
             | monorepos, where rebuilding everything on every commit is
             | too much.
        
               | donmcronald wrote:
               | > It would only break if your old dev env can no longer
               | be built, for example if it depended on some external
               | resource which is no longer available on the internet.
               | 
               | That's what I was getting at. Version controlling a
               | config doesn't make a build deterministic when it depends
               | on transient resources that aren't in version control.
               | 
               | There's nothing repeatable about a container style build.
               | They can change between runs that are 5 seconds apart. I
               | see a lot of Docker builds where the author claims
               | they're repeatable because they're version controlled and
               | then they start with 'apt-get update && apt-get upgrade'.
               | 
               | At least you don't claim yours repeatable, but I'd much
               | rather build my dev environment on the first Monday of
               | every month, check it in to an artifact repository, and
               | use that for a full month. The re-build would be similar
               | to (using Docker as an example):                   FROM
               | mygroup/myproject:2023.04         RUN git checkout ...
               | 
               | That way when I go back to a commit that's a year old I
               | re-use the _exact_ environment that was in use at the
               | time, If I want an updated dev environment I create a
               | branch and update the version of the dev environment.
               | 
               | From the perspective of being the developer, I'd rather
               | specify a release cadence and have the matching dev
               | environment used. Ex: monthly, weekly, daily, ci. IMO
               | container like systems that are used as part of the dev /
               | build chain should be promoted and reused, not comitted
               | and rebuilt. The only person using a CI based build
               | environment should be the person responsible for
               | maintaining it. Everyone else should be on a slower
               | cadence.
               | 
               | It's seems so weird to me to come to HN and see people
               | livid about Windows auto-updates and then having no
               | problem with their dev and build tools (potentially)
               | change 50 times a day.
               | 
               | To put it another way, would you auto-update VS Code,
               | your runtime, and your dependencies every time you commit
               | to Git? If not, why build the auto-magical dev
               | environment so it works like that? Maybe I'm
               | misunderstanding what it does. Admittedly, I didn't try
               | it out yet.
        
       | enedil wrote:
       | This is actually something I wish we had at my previous company.
       | Setting up the environment was a pain, and very few people knew
       | how to run all the tests (integration tests really). I am willing
       | to give Hocus a go.
        
       | 0cf8612b2e1e wrote:
       | Very intrigued. With the real VM isolation, I wonder if I could
       | use this as a way of dipping my toe into the Nix pool.
       | 
       | Have you given any thought to offering pre-baked development
       | templates? For example, here is a standard Django build with
       | poetry + js utilities + Postgres drivers + jq, etc.
        
         | hugodutka wrote:
         | That's something we would love to do in the future. For now
         | extending the base development template so that it has the most
         | popular programming languages already installed is on top of
         | our todo list.
        
       | cube2222 wrote:
       | Ah, great to see this here!
       | 
       | Disclaimer: Know the authors, who are extremely bright engineers.
       | 
       | Based on my discussions with one of them, Hugo, re the
       | architecture a couple weeks ago, I really think you should take a
       | look at this if you want to do auto-provisioned dev environments
       | in a self-hosted fashion, they know what they're doing.
        
       ___________________________________________________________________
       (page generated 2023-04-03 23:00 UTC)