devmachine

How it works

Setting up a server for the first time

Setting up a server you have never logged into is the hardest moment this CLI handles, and the first thing a new user hits. This page explains what devmachine setup does, and why the steps run in this order.

It does not ask which situation you are in

Most providers let you paste an SSH key in when you create the server, so a lot of people arrive with a key that already works — asking them for a root password would ask for something they never had. So setup finds out for itself: where the machine is, which account and port, which key to use, then tries the key first. Only if that fails does it ask for the password.

The proof is a new connection

Installing a key does not mean it works — a wrong file permission, a world-writable home folder, SELinux, any of these can let a key install cleanly and still refuse every login. The connection that installed the key cannot prove it works either, since that connection used the password. So setup closes it, opens a brand new connection using only the key, and only counts that as proof.

Locking down comes after the proof, never with it

Turning password login off before proving the key works is locking the door with the key still inside. If the proof fails, setup stops and says plainly:

password login is still on: you can still get in with the password

--no-harden skips locking the server down; the key is still installed and proved.

Locking down means writing one file that turns password login off, checking it is valid, and only reloading SSH if it passes — an invalid file is deleted, since a bad file left behind would break the next SSH reload, even a routine reboot.

Why the file name starts with 00

SSH uses the first value it finds for each setting, so a drop-in file only wins if it sorts before others. A cloud image often ships its own settings as 60-cloudimg-settings.conf; a file named 99- would read after it and silently do nothing — no warning, password login still on despite a successful run.

The password is never stored

It lives in memory for one connection, then is gone — never written to config.yml, the lock file, or the log. Typed at a terminal, it is never shown on screen.

Why this does not just run the ssh command

If your SSH agent holds several keys, a password login can fail before you see the prompt: the agent offers key after key, and the server cuts the connection after too many tries — on a server you are meeting for the first time, that happens every time.

setup talks to SSH directly in code, so it offers exactly one thing at a time — the key, or the password, never both. Sessions you use yourself, ssh and mosh, still run the real command, since there you want your own terminal and agent.

After this step

setup installs ansible and git — the last thing done by hand. From then on, every change goes through devmachine sync. It installs ansible rather than ansible-core, since the smaller package leaves out a piece the firewall package needs.