# Automatic first boot configuration
## Reading presets from local config
It is possible to configure your device automatically at first boot. Settings like: root password, IP address, connecting to wireless.
After flashing an image to boot media, mount it and add a file containing your config to `/root/.not_logged_in_yet`
???+ tip
You may also mount the image and edit it prior to flashing, if this is preferable.
## Loading a remote config
It is also possible to load this config file from a remote server, as above, however the **only** directive you should include is:
```bash title="/root/.not_logged_in_yet"
PRESET_CONFIGURATION="http://path/to/config/file"
```
## Configuration directives
- The directives in this file are specified using `key="value"` format.
- To ask for a value interactively, leave it unset or comment out the directive.
- For fully-unattended setup, specify all values
| Configuration directive | `[default]` \| `option` | Description: |
| :---------------------- | :--------------: | -----------: |
| `PRESET_CONFIGURATION` | `http://path/to/config/file` | See [Loading a remote config](#loading-a-remote-config) |
| `PRESET_NET_CHANGE_DEFAULTS` | `[0]` \| `1` | Change default network settings
if unset, **no network changes will be applied** |
| `PRESET_NET_ETHERNET_ENABLED` | `0` \| `1` | Enable Ethernet, ignored if WiFi enabled |
| `PRESET_NET_WIFI_ENABLED` | `0` \| `1` | Enable WiFi, **takes priority over Ethernet** |
| `PRESET_NET_WIFI_SSID` | `MySSID` | WiFi SSID |
| `PRESET_NET_WIFI_KEY` | `MyWPA-PSK` | WiFi Pre-Shared Key (Password), **stored in plaintext** |
| `PRESET_NET_WIFI_COUNTRYCODE` | `CC` | Country code, **required** for WiFi
e.g. `GB`, `US`, `DE`; see [Wikipedia/ISO_3166](https://en.wikipedia.org/wiki/ISO_3166-1_alpha-2) |
| `PRESET_CONNECT_WIRELESS` | `Y` \| `n` | Set to `Y` for interactive mode, `n` uses values from file |
| `PRESET_NET_USE_STATIC` | `[0]` \| `1` | Use the static IP provided, DHCP is the default
Leaving **any** value unset will result in a broken config |
| `PRESET_NET_STATIC_IP` | `xxx.xxx.xxx.xxx` | Static IPv4 address, dotted decimal notation |
| `PRESET_NET_STATIC_MASK` | `xxx.xxx.xxx.xxx` | Subnet mask, typically `255.255.255.0` |
| `PRESET_NET_STATIC_GATEWAY` | `xxx.xxx.xxx.xxx` | Default gateway address |
| `PRESET_NET_STATIC_DNS` | `x.x.x.x x.x.x.x` | DNS Servers to use, separated by a space. If unsure:
CloudFlare is `1.1.1.1 1.0.0.1`
Google is `8.8.8.8 8.8.4.4` |
| `SET_LANG_BASED_ON_LOCATION` | `Y` \| `n` | "Set user language based on your location?" |
| `PRESET_LOCALE` | `locale` | Locale e.g. `en_GB.UTF-8`, `de_DE.UTF-8`, `zh_TW.UTF-8` |
| `PRESET_TIMEZONE` | `timezone` | Timezone e.g. `Etc/UTC`, |
| `PRESET_ROOT_PASSWORD` | `[1234]` \| `password` | Preset `root` password
**Stored in plaintext**, *SSH keys are safer!* |
| `PRESET_ROOT_KEY` | `https://path/to/key.file` | Fetches public key from specified URL for `root` user |
| `PRESET_USER_NAME` | `username` | Username to create |
| `PRESET_USER_PASSWORD` | `password` | Preset created user password
**Stored in plaintext**, *SSH keys are safer!* |
| `PRESET_USER_KEY` | `https://path/to/key.file` | Fetches public key from specified URL for created user |
| `PRESET_DEFAULT_REALNAME` | `Real Name` | RealName to use for created user |
| `PRESET_USER_SHELL` | `shell` | Currently only `bash` (default) or `zsh` (`armbian-zsh`) supported |
## Sample config file
The following is an example configuration, it may be used as a template
```bash title="/root/.not_logged_in_yet"
#/root/.not_logged_in_yet
# Network Settings
PRESET_NET_CHANGE_DEFAULTS="1"
## Ethernet
PRESET_NET_ETHERNET_ENABLED="1" # Ignored due to WiFi
## WiFi
PRESET_NET_WIFI_ENABLED="1"
PRESET_NET_WIFI_SSID="MySSID"
PRESET_NET_WIFI_KEY="MyWiFiKEY"
PRESET_NET_WIFI_COUNTRYCODE="GB"
PRESET_CONNECT_WIRELESS="n"
## Static IP
PRESET_NET_USE_STATIC="1"
PRESET_NET_STATIC_IP="192.168.0.100"
PRESET_NET_STATIC_MASK="255.255.255.0"
PRESET_NET_STATIC_GATEWAY="192.168.0.1"
PRESET_NET_STATIC_DNS="8.8.8.8 8.8.4.4"
# System
SET_LANG_BASED_ON_LOCATION="y"
PRESET_LOCALE="en_US.UTF-8"
PRESET_TIMEZONE="Etc/UTC"
# Root
PRESET_ROOT_PASSWORD="RootPassword"
PRESET_ROOT_KEY=""
# User
PRESET_USER_NAME="armbian"
PRESET_USER_PASSWORD="UserPassword"
PRESET_USER_KEY=""
PRESET_DEFAULT_REALNAME="Armbian user"
PRESET_USER_SHELL="bash"
```
???+ tip
If you want to use first run automatic configuration at build time, [check this GitHub pull request](https://github.com/armbian/build/pull/6194).
tl;dr;
1. Copy the template with `cp extensions/preset-firstrun.sh userpatches/extensions/`
2. Edit the template `userpatches/extensions/preset-firstrun.sh` according to your situation
3. Build your Armbian image using the additional parameter `ENABLE_EXTENSIONS=preset-firstrun`