ProxmoxDeploy/README.md

6.6 KiB

Proxmox Deploy

Build Status

Description

Proxmox Deploy is a little script to manage my HomeLab with JSON file.

Why?

As my homelab was growing I realised that it was harder and harder to keep everything in sync and up to date. So I decided to create a script to manage my Proxmox homelab.

How to use it

Have a look at the resources folder to see how to use it.

Documentation

Creation

In the creation section, you have the option to define conditions for checking whether your LXC/VM has been previously configured.
If all of these conditions are met, the script will proceed directly to the deploy section and execute the necessary steps to update it. (This indicates that your LXC/VM has already been configured, and we want to avoid erasing any existing settings/config.)
However, if any of the conditions fail to match, the script will process to the creation steps section and execute all the commands again.

Conditions

File

The file condition will check if a file exists or not inside the LXC/VM.

"conditions": {
  "file": "/var/data/traefikv2/traefik.toml"
    or
  "files": ["/var/data/traefikv2/traefik.toml", "/var/data/config/traefikv2/docker-compose.yml"]
}

It can be an array of file using ["file1", "file2"] or just one file in double quote "file".

Folder

The folder condition will check if a folder exists or not inside the LXC/VM.

"conditions": {
  "folder": "/var/data/traefikv2"
    or
  "folders": ["/var/data/traefikv2", "/var/data/config/traefikv2"]
}

It can be an array of folders using ["folder1", "folder2"] or just one folder in double quote "file".

Programs

The programs condition will check if a program is installed or not in the LXC/VM.

"conditions": {
  "program": "docker"
    or
  "programs": ["docker", "docker-compose"]
}

It can be an array of programs using ["program1", "program2"] or just one program in double quote "program".

Note:This uses which to check if the program matches to anything

Steps

Note: Paths
When you have to specify a path, you can use /global/ to use the global folder (resources/<scripts|file>/).
If nothing is specified, the script will use the VM/LXC folder (resources/lxc/<id>/).

The comments in the JSON below are only for documentation purposes and are not valid JSON, remove them before running.

Script

The script step will execute a script.

"steps": [
  {
    "type": "script",
    "path": "/global/install-docker.sh" # local path (here: resources/scripts/install-docker.sh)
  }
]

File

The file step will copy a file to the VM/LXC.

"steps": [
  {
    "type": "file",
    "path": "traefik.toml", # local path (here: resources/lxc/<id>/traefik.toml)
    "destination": "/var/data/traefikv2/traefik.toml" # lxc/vm path
  }
]

Folder

The folder step will copy a folder to the VM/LXC.

"steps": [
  {
    "type": "folder",
    "path": "/data/", # local path (here: resources/lxc/<id>/data/)
    "destination": "/var/data/traefikv2" # lxc/vm path
  }
]

Command

The command step will execute a command on the VM/LXC.

"steps": [
  {
    "type": "command",
    "command": "whoami", # command to execute
    "working_directory": "/var/data/config/traefikv2" # lxc/vm path
  }
]

Docker

The docker step will execute a docker command on the VM/LXC.

"steps": [
  {
    "type": "docker",
    "command": "run -d --name=traefikv2 --restart=always -p 80:80 -p 443:443 -p 8080:8080 -v /var/data/traefikv2:/etc/traefik -v /var/data/config/traefikv2:/config -v /var/run/docker.sock:/var/run/docker.sock traefik:latest", # docker command to execute
    "working_directory": "/var/data/config/traefikv2" # lxc/vm path
  }
]

Docker-compose

The docker-compose step will execute a docker-compose command on the VM/LXC.

"steps": [
  {
    "type": "docker-compose",
    "command": "up -d", # docker-compose command to execute
    "working_directory": "/var/data/config/traefikv2" # lxc/vm path
  }
]

Note : Here, why not use the command step? Docker Compose can sometimes be executed with docker-compose or docker compose, the script will take care of choosing the correct one.

Git

The git step will clone a git repo on the VM/LXC.

"steps": [
  {
    "type": "git",
    "url": "https://git.abc.xyz/abc/abc.git", # git url
    "destination": "/root/" # lxc/vm path
  }
]

Note: At the the moment, no authentication is supported, so only works on public repo.

Download

The download step will download a file on the VM/LXC.

"steps": [
  {
    "type": "download",
    "url": "https://git.abc.xyz/file.tar.gz", # download url
        or
    "urls": ["https://git.abc.xyz/file1.tar.gz", "https://git.abc.xyz/file2.tar.gz"] # download urls
    "destination": "/tmp/" # lxc/vm path
  }
]

Extract archive (tar/zip)

The unzip step will unzip a file in the VM/LXC.

"steps": [
  {
    "type": "unzip",
    "path": "/tmp/file.tar.gz", # lxc/vm path to the archive
    "destination": "/var/data/config/traefikv2" # (optional) lxc/vm path to extract the archive, will use archive parent directory if blank
  }
]

Note : At the the moment, only tar and zip are supported.

Install package

The install-package step will install a package on the VM/LXC.

"steps": [
  {
    "type": "install-package",
    "package": "git" # package to install
        or
    "packages": ["git", "docker"] # packages to install
  }
]

Note : At the the moment, only apt, apk, dnf, yum are supported.
Warning : Packages can have different names depending on the Linux distribution.

Remove package

The remove-package step will remove a package on the VM/LXC.

"steps": [
  {
    "type": "remove-package",
    "package": "git" # package to remove
        or
    "packages": ["git", "docker"] # packages to remove
  }
]

Note : At the the moment, only apt, apk, dnf, yum are supported.
Warning : Packages can have different names depending on the Linux distribution.

Reboot

The reboot step will reboot the VM/LXC.

"steps": [
  {
    "type": "reboot"
  }
]

Replace in file

The replace-in-file step will replace a string in a file.

"steps": [
  {
    "type": "replace-in-file",
    "path": "/var/data/config/traefikv2/traefik.toml", # lxc/vm path to the file
        or
    "paths": ["/var/data/config/traefikv2/traefik.toml", "/var/data/config/traefikv2/traefik2.toml"] # lxc/vm paths to the files
    "search": "abc", # string to search
    "replace": "xyz" # string to replace
  }
]