I personally found Fedora to be rock solid, and along with Ubuntu provided the best hardware support out of the box on all my computers - though it's been a couple of years since I used it. I did end up on Ubuntu non-LTS in the end as I now run Ubuntu LTS on my servers and find having the same systems to be beneficial (from a knowledge perspective).
vampatori
If I’m okay with the software (not just trying it out) am I missing out by not using dockers?
No, I think in your use case you're good. A lot of the key features of containers, such as immutability, reproduceability, scaling, portability, etc. don't really apply to your use case.
If you reach a point where you find you want a stand-alone linux server, or an auto-reconfiguring reverse proxy to map domains to your services, or something like that - then it starts to have some additional benefit and I'd recommend it.
In fact, using native builds of this software on Windows is probably much more performant.
Containers can be based on operating systems that are different to your computer.
Containers utilise the host's kernel - which is why there needs to be some hoops to run Linux container on Windows (VM/WSL).
That's one of the most key differences between VMs and containers. VMs virtualise all the hardware, so you can have a totally different guest and host operating systems; whereas because a container is using the host kernel, it must use the same kind of operating system and accesses the host's hardware through the kernel.
The big advantage of that approach, over VMs, is that containers are much more lightweight and performant because they don't have a virtual kernel/hardware/etc. I find its best to think of them as a process wrapper, kind of like chroot for a specific application - you're just giving the application you're running a box to run in - but the host OS is still doing the heavy lifting.
As always, it depends! I'm a big fan of "the right tool for the job" and I work in many languages/platforms as the need arises.
But for my "default" where I'm building up the largest codebase, I've gone for the following:
- TypeScript
- Strongly-typed (ish) which makes for a nice developer experience
- Makes refactoring much easier/less error-prone.
- Runs on back-end (node) and front-end, so only one language, tooling, codebase, etc. for both.
- SvelteKit
- Svelte as a front-end reactive framework is so nice and intuative to use, definite the best there is around atm.
- It's hybrid SSR/CSR is amazing, so nice to use.
- As the back-end it's "OK", needs a lot more work IMO, but I do like it for a lot of things - and can not use it where necessary.
- Socket.IO
- For any real-time/stream based communication I use this over plain web sockets as it adds so much and is so easy to use.
- PostgreSQL
- Really solid database that I love more and more the more I use it (and I've used it a lot, for a very long time now!)
- Docker
- Easy to use container management system.
- Everything is reproducible, which is great for development/testing/bug-fixing/and disasters.
- Single method to manage all services on all servers, regardless of how they're implemented.
- Traefik
- Reverse proxy that can be set to auto-configure based on configuration data in my docker compose files.
- Automatically configuring takes a pain point out of deploying (and allows me to fully automate deployment).
- Really fast, nice dashboard, lots of useful middleware.
- Ubuntu
- LTS releases keep things reliable.
- Commercial support available if required.
- Enough name recognition that when asked by clients, this reassures them.
I was using file merging, but one issue I found was that arrays don't get merged - and since switching to use Traefik (which is great) there are a lot of arrays in the config! And I've since started using labels for my own tooling too.
I was recently helping someone working on a mini-project to do a bit of parsing of docker compose files, when I discovered that the docker compose spec is published as JSON Schema here.
I converted that into TypeScript types using JSON Schema to TypeScript. So I can create docker compose config in code and then just export it as yaml - I have a build/deploy script that does this at the end.
But now the great thing is that I can export/import that config, share it between projects, extend configs, mix-in, and so on. I've just started doing it and it's been really nice so far, when I get a chance and it's stabilised a bit I'm going to tidy it up and share it. But there's not much I've added beyond the above at the moment (just some bits to mix-in arrays, which was what set me off on this whole thing!)
I hear they have improved performance now though
It's still not great. Better, but still slow enough to make you question whether you've actually launched the app or not.
I did start with it and use it on a laptop, honestly I think that's where it shines the most - but I guess the more windows you open the less useful it becomes. I think if there was a way to do the expose-like "view all things at once" (Super key) that worked across all workspaces, I'd be all over them. But as there's no easy way to live view everything on all workspaces, I just don't use them.
Yes, I love it! Really it's the MacOS-like "Expose" feature that I find to be essential.
I would advise against using workspaces though, I find those actually sort of go against the core idea of it IMO. There are a few things I'd really like added to it, but for the most-part when you get into it it's great.
My main desktop I have 4 monitors (I know, but once you start a monitor habit it's really hard to not push it to the limit - this is only the beginning!) It roughly breaks down into:
- Primary work (usually a full-screen editor)
- Terminals (different windows, some for the project, some monitoring)
- Browsers - documentation, various services, my own code output
- Communication - signal, discord, what's app (ugh), etc.
The key, literally, is you just press the Super key and boom, you can see everything and if you want to interact with something it's all available in just one click or a few of key presses away.
On my laptop with just one screen, I find it equally invaluable, and is actually where I started to use it the most - once again, just one press of Super and I can see all the applications I have open and quickly select one or launch something.
It's replaced Alt + Tab for me - and I know they've made that better, and added Super + Tab, but none of them are as good as just pressing Super.
The things I'd really love added to it are:
- Better tiling (including quarter tiling). It's a sad state of affairs when Windows has far better tiling than Gnome.
- Super then Search, I'd like it to filter the windows it's showing and shrink/hide the others, along with a simple way to choose one using the keyboard.
- Rather than having an icon for each window, I also want the tooltip information to always be shown (e.g. vs code project) and for standard apps to expose better information for that (e.g. Gnome Terminal to expose its prompt/pwd) and/or have a specific mechanism by which apps could communicate.
- Adding Quicksilver-like functionality to the launcher/search would be amazing. e.g.
- Super
- Sp... (auto-populates Spotify)
- Tab
- P... (auto-populates Play/Pause)
- Return
- Session restoration - it just doesn't work at the moment for some reason. Some apps do, some don't. Some go to their correct position/size, some don't.
I just have a static page that I randomly change - you can see mine here. In this case I was testing the idea of having text within an SVG for better scaling from mobile to desktop, and also I'm loving orange and purple at the moment for some reason! Oh, and I was testing automated deployments from CI/CD, so I always use my own base domain with those first tests!
Slackware was mine too - all it took was a box of floppy disks and tens of hours of downloading and installing! It was great though, something so different. But it was just a toy, and I went back to DOS/Windows on PC - mainly for the games and hardware support (Voodoo!)
A year or so later I spent a lot of time playing with Solaris and VAX/VMS at University and really developed a love for the command-line and UNIX environment. It was that which led me to my first job (with HP-UX) and my second (Debian/Yellow Dog). From then on I used it at home a lot more. Now I use Windows for games/gamedev, and Ubuntu for everything else (desktop, laptop, servers).
But it's amazing how far things have come in some respects, but how some things have regressed over those 20 years - window managers/themes never reached the heights I envisioned in the Enlightenment hay day, session management/restoration/remoting seems to have been eroded away, virtual desktops/window management/tiling regressed and became fractured, the wonder of Compiz didn't really move things in an interesting way, and I felt sure Quicksilver (for MacOS) was the future of launcher, but it's not really been taken up - though the Expose feature is an excellent essential part of Gnome now (Activities)!
In some ways I think Linux has lost that "wow factor" that we used to have with all those cool features - but it is much more rock-solid and professional now! I use it more now than I ever have.
How do Linux distro's deal with this? I feel like however that's done, I'd like node packages to work in a similar way - "package distro's". You could have rolling-release, long-term service w/security patches, an application and verification process for being included in a distro, etc.
It wouldn't eliminate all problems, of course, but could help with several methods of attack, and also help focus communities and reduce duplication of effort.