I usually connect with my server via ssh in a terminal and run basic commands. What’s a better, more efficient and modern way of doing that? Especially considering ai and documentation along the way? I wonder if there’s a better approach than “connect from remote and act local”. Is there a method to “code local and push to remote”?
I use a fedora server with podman, caddyfile and vi.
I have a kubernetes cluster inside of Proxmox vm’s, generally I write a deployment, commit it to a git repo and then use argocd to deploy it in the cluster.
This is not something I would advise to anyone but the clinically insane, but for me there is a certain zen in having everything in git like that. It’s for me the only way I can manage the 60ish applications I run without it having a permanent spot in my brain.
Ansible is one way to “code local, push to remote(s)”. Can define so-called playbooks, which is basically just a script, to do reoccuring tasks like e.g. updates.
Ansible is great, I just wish it would automatically cleanup stuff on the server when I remove parts of the config. I know it’s not the goal, but I dream about a tool that works this way. I get many leftover stuff over years
That sounds like NixOS to me.
I have yet to try it but apparently

We fixed that with roles that manage both install and uninstall
That works but that’s only useful if you have many machines. I have a single server so it’s the same burden as doing it manually. If only the uninstall step could be completely automated by just reverting the install step
To be fair to Ansible, that’s probably a packaging issue.
If the 1st run of an application creates a bunch of files and folders, then the packager won’t know about them and Ansible’s just relying on that.
But yeah, for 1 machine I’d find Ansible overkill (not a problem per se), but really helps when you have 5 Rasperry Pi Zeros scattered around the house 😉
Not quite, if you write the role to manage the life cycle of a bit of software then uninstall is part of that life cycle.
But I do see that investment in time looks more then just do it by hand
There are probably multiple flashy clients and gui’s for it, but if you’re already used to the terminal, I’d recommend
rsync. This might be the wrong syntax but something likersync -av ~/local/project servername:/var/www/html/would take your local files and update the web directory of your server with only the files that are more recent. Rsync will even read your ssh config file so if you’re got an entry for your server you can just use the host name.I ran a little blog for a while using a static site generator so I setup the git server on my web server and wrote a git hook where every time I pushed to the repo the server would pull it’s cloned copy of the repo into the html directory. Took me a few hours to setup but it made updating the blog as simple as pushing to the repo.
Ansible to deploy services in docker compose stacks and backups with resticprofile.
I use ssh with tmux
This is the way
<insert Mandalorian gif here>
Nothing wrong with good old ssh. My VMs are different enough that building and maintaining ansible playbooks or something similar would be a bigger task than actually doing it in the traditional way. Maybe I could benefit by building simple playbooks to populate user accounts, ssh keys, smtp relay settings and other common things, but I don’t really set up new servers that often that it would justify spending time to set up tools for that.
nixos, mostly. It has a very steep learning curve but if it breaks I’m just “whatever, rollback now, fix properly later”.
“code local and push remote” is only more efficient if you have a faulty connection with ssh or want to use a GUI editor that doesn’t support remote connections. What you’re doing is good. You can scoure for more “modern” ways that might have more glimmer and sparkly lights, but it won’t improve efficiency.
Declarative configuration (like docker compose) is basically “code local, push remote”, and it has a lot of benefits, including improving efficiency because you have a clearer idea of exactly what is set up on the server, to make it easier to debug or make changes.
Contrast this with just sshing in and running a bunch of commands to install something. Then coming back months later and wondering “what files did I touch? what packagea did I install? Hmm dpkg log says I added X but then later I removed it, so was it important?” Etc.
Depends what you’re trying to do, really
If you’re talking about going in and restarting containers and checking logs, there are tools like Portainer that give a nice UI you can quickly use from your phone
If you’re talking about repetitive tasks, sometimes there’s a tool to automate it already (e.g. updates via watchtower, unattended-upgrades), and if not, you can write a script and possibly run it via a cronjob if that makes sense
If you’re talking about doing new stuff, you either stick with the SSH & shell commands, or you look into IaC tools like ansible as another reply mentioned. Another option is something like Nix where the setup is defined in config, so you make your changes there
I wait for something to break. Then I yell “God fucking dammit, I don’t have time for this right now!” and spend an hour triaging things before I just try docker down, pull, up and everything works.
same. or i just df and see / 100%
Early on I wrote a script for my user account to run df and save the output to a file, then a second script to read that file and if the drive was full send me an email.
First, it failed because it couldn’t send the email because the email service failed under full disk conditions.
Second, it failed because it couldn’t write the file to disk because the disk was full.
Third, it failed because outbound SMTP was blocked by my ISP.
I learned a lot about how well you can fail if you really put your mind to it. Now I have Home Assistant grabbing the disk stats for my machines and flagging anything over 90%.
Hermes + maybe $5-10 worth of tokens (on a busy month). Running everything in a nice podlet setup and have reduced maintenance down to trivial levels. Config gets occasionally shipped to GitHub
In theory I might lose the ui if it bricked itself but in reality that doesn’t happen.
I looked that up and am astonished that you let an agent range free on your server?!
I bet you I do less work and have a more efficient and locked down network, file permissions, fully rootless, updated on the hour, 100% in code, and observable setup than 98% of you just running sudo apt upgrade and praying. But yeah, my little agent working in an nemoclaw sandbox is going to go rogue and destroy my server somehow and I definitely believe the AI hype bros that are definitely “accidentally “ are hacking orgs and not going to end the human race🙄
Man, the ignorance and prejudice over how llm work is insane.
It’s not about “going rogue”. It’s about making mistakes. It’s not a hypothetical. It has happened many times to people who were as confident as you seem to be with their setup. There’s a proverb in my language that roughly translates to “some learn by looking at others, while some need to experience it by themselves”. Maybe you’re in the latter category.
Humans definitely don’t make mistakes. Especially not with their jank home servers. All of it done without shortcuts and auditable in code, with a standard process.
You’ve set some imaginary high bar that is rarely actually met outside of nerds shit talking on the internet and a small percentage of users.
“I can make mistakes, so I’ll rather use a slop machine that’s known to make mistakes.”
Great strategy, internet stranger.
Oops, slop machine broke something.
“Hey slop machine, you fucked up. Restore the last backup and document the mistake you made in AGENTS.md so we avoid making that mistake again. Im going to go make a coffee, brb”
Ansible and terraform can bath do with you want though for a single server I’d consider them both to be a somewhat overkill. But then again homelabbing often is about overkill.
I created git repos on my main workstation for each homelab server/service I maintain that keeps:
- documentation
- notes
- lessons learned
- scripts, configs
- runbooks
- backup details
- security audit details
- log items that need attention
- infrastructure
I just point a local LLM (offline model that runs on my workststion) into those repos and ask it to perform certain things on those servers. It can do things like update packages, install packages, make config changes, set/check permissions, read logs (and fix errors in real time), and check the health of the overall system.
I have it run pre backups before making changes, then post backups once its done.
Once changes are in place and everything is running okay, I ask it to update documentation in the repo and tag the release.
I use
opencodethat connects to allama.cppservice.opencodelets me gate the AI so that any elevated commands that it needs to run (e.g. sudo or ssh), I have to approve it. It cant just go around making changes without permission.What models are you using? What hardware are you running them on? I’m curious if I can replicate your success
Hardware I’m running:
- 8/16 AMD CPU
- 32GB system RAM
- 12GB GPU VRAM (AMD)
I’m mainly using these MoE models:
Qwen-3.6-35B-A3B
- Q4_K_M quant quality
- 128k context (conversation length before it compacts)
- Gives me about 260 prefill and 19 token gen speeds
Gemma4-26B-A4B
- Q8 quant quality
- 128k context length
- Gives me about 190 prefill and 14 token gen speeds
Poorly.
Hell yeah
Hear hear
I just use ssh and manually type commands. Keep doing it and you will get good and it will become second nature.
No need to burn tokens on basic tasks.
Some shell customisation can help. For example I’m fond of zsh-auto-suggestions and skim. Makes me quicker.










