Added ansible for standing up the influx server
This commit is contained in:
7
.gitignore
vendored
7
.gitignore
vendored
@@ -208,3 +208,10 @@ __marimo__/
|
||||
|
||||
# sqlite stuff
|
||||
*.db
|
||||
|
||||
# SSH Stuff
|
||||
*.pub
|
||||
ansible/inventory-actual
|
||||
*.retry
|
||||
.ansible/
|
||||
ansible/vars/secrets.yml
|
||||
|
||||
0
ansible/.gitkeep
Normal file
0
ansible/.gitkeep
Normal file
90
ansible/README.md
Normal file
90
ansible/README.md
Normal file
@@ -0,0 +1,90 @@
|
||||
# Ansible playbook for server configuration
|
||||
|
||||
## A word of warning about the volume task
|
||||
|
||||
The volumes task creates, formats, and mounts volumes on your machine. It's expected that the influxdb database
|
||||
lives on it's own volume, preferably ssd storage. This will vastly impact the performance of the whole app, and
|
||||
is *highly* recommended. It is not suggested that you store this volume on the root disk. This allows influxdb
|
||||
to have exclusive bandwidth for the database, and if you want to make fast actions, this is very recommended.
|
||||
|
||||
Creating and formatting volumes is an **inherently destructive** action, and therefore this task should only
|
||||
be performed on the first run, or if you do not care about your database. By default this task will only be
|
||||
performed once, and the file responsible for allowing this to run will be removed for future runs.
|
||||
|
||||
**IF YOU SHOOT YOURSELF IN THE FOOT WITH THIS, THIS IS YOUR FAULT**
|
||||
|
||||
You should **NEVER** enable the influx-volume task on successive runs unless you **WISH TO DESTROY** your influx
|
||||
install and database volume.
|
||||
|
||||
## A note about Security
|
||||
|
||||
As we are talking about access to your kraken account api keys with this playbook, you should be very careful
|
||||
and read as much of the playbook you can and *ensure you understand what is happening*. We are human developers
|
||||
and humans make mistakes. Be very careful with your api keys, as they can be used to make trades and transfer
|
||||
funds. We do not wish for you to lose your crypto. Take care. Be safe. Read the code, and the documentation fully
|
||||
before deciding to give this software your api key. If you decide not to trust this playbook, that's fine. Move the
|
||||
vars/secrets.example.yml to vars/secrets.yml and do not fill in the `kraken_api_key` field. Install your api key
|
||||
manually. We will provide examples on how to do this at a later date.
|
||||
|
||||
Also, because of how this program is written, it is *not recommended* that you run the playbook manually. Use our
|
||||
wrapper script, it will ensure that you don't accidentally wipe your database or expose your kraken api keys by
|
||||
leaving them on a hard drive. We recommend never storing your api keys to your crypto accounts *anywhere* you don't
|
||||
*expressly need to*. Not in a password vault, not on your hard drive, not in your email, not in a text file, nowhere.
|
||||
As long as you maintain access to your kraken account, you should be able to create a new api key. Unfortunately,
|
||||
your api key *must* be available to the software this playbook installs, (that is, on the machine you are running
|
||||
this script against) so you should take every effort to *guard that key like it's worth all the money in your kraken
|
||||
account*, because, well, it is. If you don't trust us, fine. Don't. That's your choice. Find another piece of software,
|
||||
or write your own. We won't be upset about this. At the end of the day, you must take responsibility for your own
|
||||
financial wellbeing.
|
||||
|
||||
## A note about SSH keys
|
||||
|
||||
SSH keys are access to the server, and thus access to your api key, and thus access to your kraken account balance.
|
||||
**Password protect them for the love of all that is holy**. Or, if you don't believe anything is holy, password
|
||||
protect them for the love of your own money. We recommend following the
|
||||
[NIST Password Guidelines](https://pages.nist.gov/800-63-4/sp800-63b/passwords/) at the very **minimum**. Ideally, the
|
||||
password on your key should be 50-100% *longer* than what's recommended in these guidelines. Yes, this is a pain.
|
||||
Yes, it's necessary. If you ever lose your key, or worse, accidentally send it to someone, or worse, have it stolen
|
||||
from you, you *should* still be safe if you password protect it, but it depends entirely on the strength of your
|
||||
password.
|
||||
|
||||
## Variables
|
||||
|
||||
Before running this playbook, make sure to fill in the empty variables in the vars/main.yml and vars/secrets.yml
|
||||
files. These files contain the variables that will define the behavior of this playbook. They are expected and
|
||||
necessary for proper behavior of the playbook.
|
||||
|
||||
## Server requirements
|
||||
|
||||
Recommended server setup is the latest version of Debian stable, but you could probably get away with Ubuntu as
|
||||
well. We have not, nor will we, field questions about Ubuntu. Just use Debian if you have questions. That's what
|
||||
this is tested on, and that is what we will answer questions about.
|
||||
|
||||
Current VPS setup:
|
||||
|
||||
1 core shared cpu with 10gb root volume and 10gb database volume with snapshots enabled
|
||||
|
||||
Database size:
|
||||
|
||||
At this time, unknown, likely variable. 10gb volume is what we are testing, but this may need to be expanded
|
||||
|
||||
## Setup
|
||||
|
||||
To set up the environment necessary for this playbook, you can run the install.sh file. Like any code you run on
|
||||
your computer, you should make sure you trust it. Read it, preferrably *before* you execute it.
|
||||
|
||||
chmod u+x install.sh
|
||||
./install.sh
|
||||
|
||||
## Running the playbook
|
||||
|
||||
**First time you run this playbook *only***
|
||||
|
||||
DESTROY_DATABASE_VOLUME=true ./run.sh
|
||||
|
||||
|
||||
**Subsequent runs of the playbook**
|
||||
|
||||
./run.sh
|
||||
|
||||
Good luck, and happy tuning.
|
||||
1
ansible/install.sh
Normal file
1
ansible/install.sh
Normal file
@@ -0,0 +1 @@
|
||||
blah
|
||||
2
ansible/inventory
Normal file
2
ansible/inventory
Normal file
@@ -0,0 +1,2 @@
|
||||
[influxdb]
|
||||
localhost
|
||||
0
ansible/roles/.gitkeep
Normal file
0
ansible/roles/.gitkeep
Normal file
0
ansible/roles/apt/.gitkeep
Normal file
0
ansible/roles/apt/.gitkeep
Normal file
0
ansible/roles/apt/tasks/.gitkeep
Normal file
0
ansible/roles/apt/tasks/.gitkeep
Normal file
0
ansible/roles/firewall/.gitkeep
Normal file
0
ansible/roles/firewall/.gitkeep
Normal file
0
ansible/roles/firewall/tasks/.gitkeep
Normal file
0
ansible/roles/firewall/tasks/.gitkeep
Normal file
0
ansible/roles/influx-user/.gitkeep
Normal file
0
ansible/roles/influx-user/.gitkeep
Normal file
0
ansible/roles/influx-user/tasks/.gitkeep
Normal file
0
ansible/roles/influx-user/tasks/.gitkeep
Normal file
0
ansible/roles/influxdb/.gitkeep
Normal file
0
ansible/roles/influxdb/.gitkeep
Normal file
0
ansible/roles/influxdb/tasks/.gitkeep
Normal file
0
ansible/roles/influxdb/tasks/.gitkeep
Normal file
0
ansible/roles/permissions/.gitkeep
Normal file
0
ansible/roles/permissions/.gitkeep
Normal file
0
ansible/roles/permissions/tasks/.gitkeep
Normal file
0
ansible/roles/permissions/tasks/.gitkeep
Normal file
0
ansible/roles/sshd/.gitkeep
Normal file
0
ansible/roles/sshd/.gitkeep
Normal file
0
ansible/roles/sshd/files/.gitkeep
Normal file
0
ansible/roles/sshd/files/.gitkeep
Normal file
0
ansible/roles/sshd/tasks/.gitkeep
Normal file
0
ansible/roles/sshd/tasks/.gitkeep
Normal file
0
ansible/roles/volume/.gitkeep
Normal file
0
ansible/roles/volume/.gitkeep
Normal file
0
ansible/roles/volume/tasks/.gitkeep
Normal file
0
ansible/roles/volume/tasks/.gitkeep
Normal file
61
ansible/run.sh
Normal file
61
ansible/run.sh
Normal file
@@ -0,0 +1,61 @@
|
||||
#!/usr/bin/env sh
|
||||
|
||||
## Set inventory to the first option
|
||||
inventory="${1}"
|
||||
|
||||
## Give options if none passed
|
||||
if [ -z "$#" ]; then
|
||||
echo "Usage:"
|
||||
echo "${0} <inventory_file"
|
||||
exit 0
|
||||
fi
|
||||
|
||||
## If $END is unspecified by the environment, or is not a number,
|
||||
## then set a default value that allows interaction
|
||||
if [ -z "${END}" || ! ${END} =~ '^[0-9]+$' ]; then
|
||||
END=10
|
||||
fi
|
||||
|
||||
## Do you wish to set a root password?
|
||||
read -p "Do you wish to set a secure root password value for the machine? [y/N]: " answer
|
||||
|
||||
## Does the user want it?
|
||||
if [ "${answer}" =~ '^[yY]' ]; then
|
||||
## Get hash
|
||||
root_hash=$(mkpasswd -m sha-512)
|
||||
|
||||
## Create the sed script
|
||||
cat > /tmp/hash.sed <<EOF
|
||||
s/root_password_hash:.?$/root_password_hash: ${root_hash}/
|
||||
EOF
|
||||
|
||||
## Modify the secrets.yml file
|
||||
sed -i -s /tmp/hash.sed vars/secrets.yml
|
||||
|
||||
## clean up after ourselves
|
||||
rm /tmp/hash.sed
|
||||
fi
|
||||
|
||||
## Check for whether or not $DESTORY_DATABASE_VOLUME is set
|
||||
if [ "$DESTROY_DATABASE_VOLUME" -eq "true" ]; then
|
||||
read -p "Are you sure you wish to destroy the database volume? [y/N]" answer
|
||||
## Ask if they're sure
|
||||
if [ ${answer} =~ '^[yY]' ]; then
|
||||
echo "Choice ${answer} confirmed, running without volume task"
|
||||
## Run the playbook
|
||||
ansible-playbook -i "${inventory}" playbooks/no_destroy_volume.yml
|
||||
exit $?
|
||||
else
|
||||
## Give them one last chance to opt out
|
||||
echo "Choice ${answer} confirmed, continuing with database volume destruction"
|
||||
echo "You may cancel in the next ${END} seconds with ctrl+c"
|
||||
for i in {1..${END}}; do
|
||||
echo -n "${i}."
|
||||
sleep 1
|
||||
done
|
||||
## Run the playbook
|
||||
echo "\nExecuting playbook with database volume destruction"
|
||||
ansible-playbook -i "${inventory}" playbooks/yes_destroy_volume.yml
|
||||
exit $?
|
||||
fi
|
||||
fi
|
||||
0
ansible/vars/.gitkeep
Normal file
0
ansible/vars/.gitkeep
Normal file
47
ansible/vars/main.yml
Normal file
47
ansible/vars/main.yml
Normal file
@@ -0,0 +1,47 @@
|
||||
---
|
||||
influx-user:
|
||||
name: influx
|
||||
locked: true
|
||||
create_home: true
|
||||
ssh_pub_keys:
|
||||
- "id_ed25519.pub"
|
||||
|
||||
sshd:
|
||||
generate_config_snippet: false
|
||||
root_key_only: true
|
||||
|
||||
dbvolume:
|
||||
mount_location: "/home/{{ influx-user.name }}"
|
||||
lvm:
|
||||
volume_devices:
|
||||
- "/dev/blah" # expects a dictionary
|
||||
physical_volumes:
|
||||
vgname: home
|
||||
lvname: influx
|
||||
|
||||
|
||||
|
||||
fstab:
|
||||
|
||||
|
||||
apt:
|
||||
packages:
|
||||
- ufw
|
||||
- vim
|
||||
|
||||
- lvm2
|
||||
|
||||
firewall:
|
||||
default:
|
||||
rule: deny
|
||||
delete: false
|
||||
additional_rules:
|
||||
- rule_name: "allow ssh"
|
||||
rule: allow
|
||||
to_port: "22/tcp"
|
||||
from_ip: "0.0.0.0"
|
||||
delete: false
|
||||
|
||||
influx:
|
||||
|
||||
permissions:
|
||||
0
ansible/vars/secrets.example.yml
Normal file
0
ansible/vars/secrets.example.yml
Normal file
Reference in New Issue
Block a user