2023-07-23 17:26:46 +03:00
|
|
|
# proxmox-utils (EXPERIMENTAL)
|
|
|
|
|
|
|
|
|
|
A set of scripts for automating setup and tasks in proxmox.
|
|
|
|
|
|
2024-01-04 01:47:12 +03:00
|
|
|
## TODO
|
2024-01-04 02:52:44 +03:00
|
|
|
- revise defaults
|
2024-01-11 02:41:00 +03:00
|
|
|
- separate templates/assets into distribution and user directories
|
|
|
|
|
...this is needed to allow the user to change the configs without the
|
|
|
|
|
fear of them being overwritten by git (similar to how config is handlerd)
|
2024-02-22 23:35:33 +03:00
|
|
|
- might be a good idea to export a specific ct script that can be used
|
|
|
|
|
for updates for that ct
|
2024-03-28 12:46:24 +03:00
|
|
|
- which is better?
|
|
|
|
|
- Makefile (a-la wireguard)
|
|
|
|
|
- shell (a-la shadow)
|
2024-02-22 23:35:33 +03:00
|
|
|
- ct updates
|
2024-01-21 03:54:16 +03:00
|
|
|
- backup/restore
|
|
|
|
|
- mail
|
2023-07-23 17:26:46 +03:00
|
|
|
|
|
|
|
|
|
2024-02-19 22:33:14 +03:00
|
|
|
## Motivation
|
|
|
|
|
|
2024-02-20 23:11:40 +03:00
|
|
|
This was simply faster to implement than learning and writing the same
|
|
|
|
|
functionality in Ansible.
|
2024-02-19 22:33:14 +03:00
|
|
|
|
2024-02-20 23:11:40 +03:00
|
|
|
_NOTE: for a fair assessment of viability of further development an
|
|
|
|
|
Ansible version will be implemented next as a direct comparison._
|
2024-02-19 22:33:14 +03:00
|
|
|
|
|
|
|
|
|
2024-01-14 17:40:13 +03:00
|
|
|
## Architecture
|
|
|
|
|
|
2024-02-24 18:21:53 +03:00
|
|
|
Goals:
|
|
|
|
|
- Separate concerns
|
|
|
|
|
Preferably one service/role per CT
|
|
|
|
|
- Keep things as light as possible
|
|
|
|
|
This for the most part rules out Docker as a nested virtualization
|
|
|
|
|
layer under Proxmox while preferring light distributions like Alpine
|
|
|
|
|
Linux
|
|
|
|
|
- Pragmatic simplicity
|
|
|
|
|
This goal yields some compromises to previous goals, for example [TKL]()
|
|
|
|
|
is used as a base for [Nextcloud]() effectively simplifying the setup
|
|
|
|
|
and administration of all the related components at the cost of a
|
|
|
|
|
heavier CT transparently integrating multiple related services
|
|
|
|
|
|
2024-10-19 23:18:52 +03:00
|
|
|
|
|
|
|
|
### Network
|
|
|
|
|
|
2024-10-19 23:17:24 +03:00
|
|
|
```
|
|
|
|
|
Internet Admin
|
|
|
|
|
v v
|
|
|
|
|
+----|----------------------------------------------------|-----+
|
|
|
|
|
| | | |
|
|
|
|
|
| (wan) (lan) (admin) |
|
|
|
|
|
| | | | |
|
|
|
|
|
| | | pve --+ |
|
|
|
|
|
| | | | |
|
|
|
|
|
| | +--------------------------------+ |
|
|
|
|
|
| | / | | |
|
|
|
|
|
| +--($WAN_SSH_IP)- ssh ---------------+ | |
|
|
|
|
|
| | ^ | | |
|
2024-10-19 23:20:14 +03:00
|
|
|
| | (ssh:23) | | |
|
2024-10-19 23:17:24 +03:00
|
|
|
| | . | | |
|
|
|
|
|
| | . +------------------------(nat)--+ |
|
|
|
|
|
| | ./ | | |
|
|
|
|
|
| +------($WAN_IP)- gate ------(nat)---+ | |
|
|
|
|
|
| . | | |
|
|
|
|
|
| . +-- ns ---------+ |
|
|
|
|
|
| . | | |
|
2024-10-20 10:30:50 +03:00
|
|
|
| + - (udp:51820)-> +-- wireguard --+ |
|
|
|
|
|
| System . | | |
|
|
|
|
|
| - - - - - - - - - - - . - - - - - - - - | - - - - - - - | - - |
|
|
|
|
|
| Application . +-- syncthing --+ |
|
|
|
|
|
| . | |
|
|
|
|
|
| + - - - (https)-> +-- nextcloud |
|
|
|
|
|
| . | |
|
|
|
|
|
| + - (ssh/https)-> +-- gitea |
|
2024-10-19 23:17:24 +03:00
|
|
|
| |
|
|
|
|
|
+---------------------------------------------------------------+
|
|
|
|
|
```
|
2024-01-14 17:40:13 +03:00
|
|
|
|
2024-10-21 14:15:05 +03:00
|
|
|
The system defines two networks:
|
|
|
|
|
- LAN
|
|
|
|
|
Hosts all the service CT's (`*.srv`)
|
|
|
|
|
- ADMIN
|
|
|
|
|
Used for administration (`*.adm`)
|
2024-10-19 23:18:52 +03:00
|
|
|
|
2024-10-21 14:15:05 +03:00
|
|
|
The ADMIN network is connected to the admin port.
|
2024-10-19 23:18:52 +03:00
|
|
|
|
2024-10-21 14:15:05 +03:00
|
|
|
Both networks are provided DNS and DHCP services by the `ns` CT.
|
2024-01-14 17:40:13 +03:00
|
|
|
|
2024-10-21 14:15:05 +03:00
|
|
|
Services on both networks are connected to the outside world (WAN) via
|
|
|
|
|
a NAT router implemented by the `gate` CT (`iptables`).
|
|
|
|
|
|
|
|
|
|
The `gate` CT also implements a reverse proxy (`traefik`), routing requests
|
|
|
|
|
from the WAN ($WAN_IP) to appropriate service CT's on the LAN.
|
|
|
|
|
|
|
|
|
|
Services expose their administration interfaces only on the ADMIN network
|
|
|
|
|
when possible.
|
|
|
|
|
|
|
|
|
|
The host Proxmox (`pve.adm`) is only accessible through the ADMIN network.
|
|
|
|
|
|
|
|
|
|
The `gate` and `ns` CT's are only accessible for administration from the
|
|
|
|
|
host (i.e. via `lxc-attach ..`).
|
|
|
|
|
|
|
|
|
|
Three ways of access to the ADMIN network are provided:
|
|
|
|
|
- `ssh` service (CT) via the `gate` reverse proxy
|
|
|
|
|
- `wireguard` vpn via `gate` reverse proxy
|
|
|
|
|
- `ssh` service (CT) via the direct `$WAN_SSH_IP` (fail-safe)
|
2024-01-14 17:40:13 +03:00
|
|
|
|
|
|
|
|
|
|
|
|
|
|
2024-10-19 23:17:24 +03:00
|
|
|
## Setup
|
2024-01-14 17:40:13 +03:00
|
|
|
|
2024-10-19 23:17:24 +03:00
|
|
|
### Prerequisites
|
2024-01-13 00:04:09 +03:00
|
|
|
|
2024-10-20 16:40:24 +03:00
|
|
|
Install Proxmox and connect it to your device/network.
|
|
|
|
|
|
2024-10-21 14:15:05 +03:00
|
|
|
|
|
|
|
|
#### Notes
|
|
|
|
|
|
2024-10-20 16:41:16 +03:00
|
|
|
This setup will use three IP addresses:
|
2024-10-21 14:15:05 +03:00
|
|
|
1. The static (usually) IP initially assigned to Proxmox on install. This
|
|
|
|
|
will not be used after setup is done,
|
|
|
|
|
2. WAN IP address to be used for the main set of applications, this is
|
2024-10-20 16:40:24 +03:00
|
|
|
the address that all the requests will be routed from to various
|
|
|
|
|
services internally,
|
2024-10-20 16:45:43 +03:00
|
|
|
3. Fail-safe ssh IP address, this is the connection used for recovery
|
|
|
|
|
in case the internal routing fails.
|
2024-01-13 00:04:09 +03:00
|
|
|
|
|
|
|
|
|
2024-10-19 20:05:30 +03:00
|
|
|
|
2024-10-19 23:17:24 +03:00
|
|
|
### Semi-automated setup
|
|
|
|
|
|
|
|
|
|
Download the [`bootstrap.sh`](./scripts/bootstrap.sh) script and execute it:
|
2024-01-13 00:04:09 +03:00
|
|
|
```shell
|
2024-10-19 20:27:39 +03:00
|
|
|
curl 'https://raw.githubusercontent.com/flynx/proxmox-utils/refs/heads/master/scripts/bootstrap.sh' | sudo bash
|
2024-01-13 00:04:09 +03:00
|
|
|
```
|
|
|
|
|
|
2024-10-19 20:05:30 +03:00
|
|
|
This will:
|
|
|
|
|
- Install basic dependencies
|
|
|
|
|
- Clone this repo
|
|
|
|
|
- Run `make bootstrap` on the repo
|
|
|
|
|
|
|
|
|
|
After the basic setup is done connect the device to the network via the
|
2024-10-19 23:17:24 +03:00
|
|
|
selcted WAN port and **disconnect** the ADMIN port.
|
2024-10-19 20:05:30 +03:00
|
|
|
|
|
|
|
|
The WAN interface exposes two IPs:
|
2024-10-19 23:20:14 +03:00
|
|
|
- Main server (config: `$DFL_WAN_IP` / `$WAN_IP`)
|
2024-10-19 20:05:30 +03:00
|
|
|
- ssh:23
|
|
|
|
|
- wireguard:51820
|
2024-10-19 23:20:14 +03:00
|
|
|
- Fail-safe ssh (config: `$DFL_WAN_SSH_IP` / `$WAN_SSH_IP`)
|
2024-10-19 20:05:30 +03:00
|
|
|
- ssh:22
|
|
|
|
|
|
2024-10-19 23:17:24 +03:00
|
|
|
|
2024-10-19 20:05:30 +03:00
|
|
|
The Proxmox administrative interface is available behind the Wireguard
|
|
|
|
|
proxy or on the ADMIN port, both on https://10.0.0.254:8006.
|
|
|
|
|
|
2024-10-19 22:16:22 +03:00
|
|
|
To finalize the setup run:
|
|
|
|
|
```shell
|
|
|
|
|
make finalize
|
|
|
|
|
```
|
|
|
|
|
|
|
|
|
|
This will
|
|
|
|
|
- detach the host from any external ports and make it accessible only
|
|
|
|
|
from the internal network.
|
|
|
|
|
See: [Architecture](#architecture) and [Bootstrapping](#bootstrapping)
|
|
|
|
|
- setup firewall rules.
|
|
|
|
|
Note that the firewall will not be enabled, this should be done manually
|
|
|
|
|
after rule review.
|
|
|
|
|
|
|
|
|
|
|
2024-10-19 23:17:24 +03:00
|
|
|
*Note that the ADMIN port is configured for direct connections only (DHCP),
|
|
|
|
|
connecting it to a configured network can lead to unexpected behavior.*
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
#### Accessing the host
|
2024-10-19 22:16:22 +03:00
|
|
|
|
|
|
|
|
XXX
|
|
|
|
|
|
|
|
|
|
|
2024-10-19 23:17:24 +03:00
|
|
|
#### Setup additional services
|
2024-10-19 22:16:22 +03:00
|
|
|
|
|
|
|
|
XXX
|
|
|
|
|
|
|
|
|
|
```shell
|
|
|
|
|
make all
|
|
|
|
|
```
|
|
|
|
|
|
|
|
|
|
```shell
|
|
|
|
|
make dev
|
|
|
|
|
```
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
Or individually:
|
|
|
|
|
```shell
|
|
|
|
|
make nextcloud
|
|
|
|
|
```
|
|
|
|
|
|
|
|
|
|
```shell
|
|
|
|
|
make syncthing
|
|
|
|
|
```
|
|
|
|
|
|
|
|
|
|
```shell
|
|
|
|
|
make gitea
|
|
|
|
|
```
|
|
|
|
|
|
2024-10-19 20:05:30 +03:00
|
|
|
|
2024-10-19 23:17:24 +03:00
|
|
|
#### Setup and configure custom services
|
2024-10-19 20:05:30 +03:00
|
|
|
|
2024-10-19 22:16:22 +03:00
|
|
|
XXX traefik rules
|
2024-10-19 20:05:30 +03:00
|
|
|
|
|
|
|
|
|
|
|
|
|
|
2024-10-19 23:17:24 +03:00
|
|
|
### Manual setup
|
2024-10-19 20:05:30 +03:00
|
|
|
|
|
|
|
|
|
2024-10-19 23:17:24 +03:00
|
|
|
#### Bootstrapping
|
2024-10-19 20:05:30 +03:00
|
|
|
|
|
|
|
|
Since all the internal traffic is routed through the `gate` we need both
|
|
|
|
|
the bridges and it setup for things to work, thus we first bootstrap the
|
|
|
|
|
bridges, create the basic infrastructure and then finalize the setup.
|
|
|
|
|
|
|
|
|
|
Bootsrapping is done in three stages:
|
|
|
|
|
1. Bootstrap:
|
|
|
|
|
```shell
|
|
|
|
|
make bootstrap
|
|
|
|
|
```
|
|
|
|
|
- Create the needed bridges
|
|
|
|
|
- Create the infrastructure CT's (`gate`, `ns`, `ssh`, ...)
|
|
|
|
|
2. Cleanup:
|
|
|
|
|
```shell
|
|
|
|
|
make bootstrap-clean
|
|
|
|
|
```
|
|
|
|
|
- Route the `host` through the `gate`
|
|
|
|
|
3. Finalize:
|
|
|
|
|
```shell
|
|
|
|
|
make finalise
|
|
|
|
|
```
|
|
|
|
|
- disconnect the `host` from the non-ADMIN networks
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
After the final stage two physical ports will be active, the ADMIN port
|
|
|
|
|
and the WAN port, the former is by default the same port set by Proxmox
|
|
|
|
|
setup, the WAN port is the port selected during the stup stage. All the
|
|
|
|
|
services will be listening on the WAN port while the admin port is used
|
|
|
|
|
only for administration and recovory cases.
|
|
|
|
|
|
|
|
|
|
|
2024-01-13 00:04:09 +03:00
|
|
|
|
2024-10-19 23:17:24 +03:00
|
|
|
#### Network Bridges
|
2024-01-13 00:04:09 +03:00
|
|
|
|
|
|
|
|
`proxmox-utils` expects there to be at least three bridges:
|
2024-10-19 20:05:30 +03:00
|
|
|
- `WAN` (`vmbr_wan`) - connected to the port that faces the external
|
|
|
|
|
network (either directly of via a router)
|
|
|
|
|
- `LAN` (`vmbr_lan`) - a virtual bridge, not connected to any physical
|
|
|
|
|
interfaces
|
|
|
|
|
- `ADMIN` (`vmbr_admin`) - connected to a second physical interface used
|
|
|
|
|
for administrative purposes.
|
|
|
|
|
|
|
|
|
|
Created via:
|
|
|
|
|
```shell
|
|
|
|
|
make host-bootstrap
|
|
|
|
|
```
|
2024-01-13 00:04:09 +03:00
|
|
|
|
2024-10-19 20:05:30 +03:00
|
|
|
Updated by:
|
|
|
|
|
```shell
|
|
|
|
|
make host-bootstrap-clean
|
|
|
|
|
```
|
|
|
|
|
|
|
|
|
|
and:
|
|
|
|
|
```shell
|
|
|
|
|
make finalize
|
|
|
|
|
```
|
2024-01-13 00:04:09 +03:00
|
|
|
|
2024-10-19 20:05:30 +03:00
|
|
|
If the device has more that two ports it is recommended to assign
|
2024-01-17 15:12:04 +03:00
|
|
|
first/last ports to wan/admin respectively and clearly mark them as such.
|
|
|
|
|
|
2024-01-13 00:04:09 +03:00
|
|
|
|
2024-10-19 20:05:30 +03:00
|
|
|
|
2024-10-19 23:17:24 +03:00
|
|
|
#### DNS
|
2024-01-13 00:04:09 +03:00
|
|
|
|
|
|
|
|
Add `10.1.1.1` to the DNS on the Proxmox host node after the `127.0.0.1`
|
|
|
|
|
but before whatever external DNS you are using.
|
|
|
|
|
|
2024-10-19 20:05:30 +03:00
|
|
|
Donw via:
|
|
|
|
|
```shell
|
|
|
|
|
make host
|
|
|
|
|
```
|
|
|
|
|
|
|
|
|
|
or:
|
|
|
|
|
```shell
|
|
|
|
|
make host-bootstrap
|
|
|
|
|
```
|
|
|
|
|
|
2024-01-13 00:04:09 +03:00
|
|
|
|
2024-10-19 23:17:24 +03:00
|
|
|
#### Firewall
|
2024-01-14 17:40:13 +03:00
|
|
|
|
|
|
|
|
Make sure to allow at least `ssh` access to the host node from the `ADMIN`
|
|
|
|
|
interface to allow admin CT's access to the host if needed, this is mostly
|
|
|
|
|
needed to allow VPN/ssh administration from outside.
|
|
|
|
|
|
2024-10-19 20:05:30 +03:00
|
|
|
Donw via:
|
|
|
|
|
```shell
|
|
|
|
|
make host
|
|
|
|
|
```
|
|
|
|
|
|
|
|
|
|
or:
|
|
|
|
|
```shell
|
|
|
|
|
make host-bootstrap
|
|
|
|
|
```
|
|
|
|
|
|
2024-01-14 17:40:13 +03:00
|
|
|
For Proxmox firewall configuration see:
|
|
|
|
|
https://pve.proxmox.com/wiki/Firewall
|
|
|
|
|
|
|
|
|
|
|
2024-01-17 15:12:04 +03:00
|
|
|
### Recovery strategies
|
|
|
|
|
|
2024-02-20 23:11:40 +03:00
|
|
|
XXX ns/gate are separate nodes for redundancy
|
2024-01-17 15:12:04 +03:00
|
|
|
|
2024-02-20 23:11:40 +03:00
|
|
|
XXX ssh facing lan to avoid a single point of failure with gate
|
|
|
|
|
|
2024-02-21 23:55:56 +03:00
|
|
|
XXX emergency access points: ssh and wireguard
|
2024-01-17 15:12:04 +03:00
|
|
|
|
|
|
|
|
|
|
|
|
|
|
2024-10-19 20:05:30 +03:00
|
|
|
## Misc
|
2024-02-07 08:55:16 +03:00
|
|
|
|
|
|
|
|
Install CT's:
|
2024-01-13 00:04:09 +03:00
|
|
|
```shell
|
|
|
|
|
sudo make all
|
|
|
|
|
```
|
|
|
|
|
|
2024-02-08 15:31:22 +03:00
|
|
|
Install gitea (optional):
|
|
|
|
|
```shell
|
|
|
|
|
sudo make dev
|
|
|
|
|
```
|
|
|
|
|
|
|
|
|
|
|
2024-01-20 19:00:22 +03:00
|
|
|
## Post-setup
|
|
|
|
|
|
|
|
|
|
XXX test conections
|
|
|
|
|
XXX change proxmox ip/network
|
2024-02-11 23:42:21 +03:00
|
|
|
XXX firewall
|
2024-01-20 19:00:22 +03:00
|
|
|
|
2024-01-13 00:04:09 +03:00
|
|
|
|
2024-02-15 22:43:34 +03:00
|
|
|
## Extending
|
2023-07-23 17:26:46 +03:00
|
|
|
|
2024-02-15 22:43:34 +03:00
|
|
|
### Directory structure
|
|
|
|
|
|
|
|
|
|
```
|
|
|
|
|
/
|
|
|
|
|
+- <ct-type>/
|
|
|
|
|
| +- templates/
|
|
|
|
|
| +- assets/
|
|
|
|
|
| +- staging/
|
|
|
|
|
| +- make.sh
|
|
|
|
|
| +- config
|
|
|
|
|
| +- config.last-run
|
|
|
|
|
+- ...
|
|
|
|
|
+- Makefile
|
|
|
|
|
+- config.global
|
|
|
|
|
+- config.global.example
|
|
|
|
|
```
|