wip
This commit is contained in:
parent
7123b8e719
commit
5f06a966aa
6 changed files with 194 additions and 0 deletions
1
.gitignore
vendored
Normal file
1
.gitignore
vendored
Normal file
|
|
@ -0,0 +1 @@
|
|||
inventory.ini
|
||||
28
01_infra_setup.md
Normal file
28
01_infra_setup.md
Normal file
|
|
@ -0,0 +1,28 @@
|
|||
# 01. Infra Setup
|
||||
|
||||
This describes how to prepare each machine before deploying services on them.
|
||||
|
||||
## 01.01 First steps
|
||||
|
||||
* Create an ssh key or pick an existing one. We'll refer to it as the `personal_ssh_key`.
|
||||
* The guide assumes the laptop (Lapy) has `ansible` installed. If not, do `sudo apt install -y ansible` and `ansible --version` to check.
|
||||
|
||||
## 01.02 Prepare the VPS (Vipy)
|
||||
|
||||
### 01.02.01 Source the VPS
|
||||
|
||||
* The guide is agnostic to which provider you pick, but has been tested with VMs from https://lnvps.net.
|
||||
* The expectations are that the VPS ticks the following boxes:
|
||||
+ Runs Debian 12 bookworm.
|
||||
+ Has a public IP4 and starts out with SSH listening on port 22.
|
||||
+ Boots with one of your SSH keys already authorized.
|
||||
* Move on once your VPS is running.
|
||||
|
||||
### 01.02.02 Prepare Ansible vars
|
||||
|
||||
* You have an example `infra/example.inventory.ini`. Copy it with `cp example.inventory.ini inventory.ini` and fill in with the vars for your VPS.
|
||||
|
||||
### 01.02.03 First steps with Ansible
|
||||
|
||||
* cd into `infra`
|
||||
* Run `ansible-playbook playbook.yml`
|
||||
39
README.md
39
README.md
|
|
@ -0,0 +1,39 @@
|
|||
# Personal infra
|
||||
|
||||
My repo documenting my personal infra, along with artifacts, scripts, etc.
|
||||
|
||||
## Overview
|
||||
|
||||
### Services
|
||||
|
||||
* Reverse Proxy
|
||||
+ Deployed on Vipy
|
||||
+ Caddy
|
||||
+ Plan install
|
||||
+ File based config
|
||||
+ Crossbackup to Desky via rsync
|
||||
* Uptime Kuma
|
||||
+ Deployed on Vipy
|
||||
+ Crossbackup to Desky via rsync
|
||||
* Vaultwarden
|
||||
+ Deployed on Desky
|
||||
+ Crossbackup to Vipy via rsync
|
||||
* Gitea
|
||||
+ Deployed on Desky
|
||||
+ Crossbackup to Vipy via rsync
|
||||
* Immich
|
||||
+ Deployed on Desky
|
||||
* VPN
|
||||
+ All set up on Vipy
|
||||
* Bitcoin Knots
|
||||
+ Deployed on Desky
|
||||
* electrs
|
||||
* Synapse Server
|
||||
* Phoenix D + LNBits
|
||||
* Backups
|
||||
|
||||
## Infra
|
||||
|
||||
* Laptop (Lapy)
|
||||
* One beefy desktop (Desky)
|
||||
* One VPS (Vipy)
|
||||
2
infra/example.inventory.ini
Normal file
2
infra/example.inventory.ini
Normal file
|
|
@ -0,0 +1,2 @@
|
|||
[vipy]
|
||||
your.vps.ip.here ansible_user=debian ansible_port=22
|
||||
121
infra/playbook.yml
Normal file
121
infra/playbook.yml
Normal file
|
|
@ -0,0 +1,121 @@
|
|||
- name: Secure Debian VPS
|
||||
hosts: vipy
|
||||
vars_files:
|
||||
- vars.yml
|
||||
become: true
|
||||
|
||||
tasks:
|
||||
- name: Update and upgrade apt packages
|
||||
apt:
|
||||
update_cache: yes
|
||||
upgrade: full
|
||||
autoremove: yes
|
||||
|
||||
- name: Create new user
|
||||
user:
|
||||
name: "{{ new_user }}"
|
||||
groups: sudo
|
||||
shell: /bin/bash
|
||||
state: present
|
||||
create_home: yes
|
||||
|
||||
- name: Set up SSH directory for new user
|
||||
file:
|
||||
path: "/home/{{ new_user }}/.ssh"
|
||||
state: directory
|
||||
mode: "0700"
|
||||
owner: "{{ new_user }}"
|
||||
group: "{{ new_user }}"
|
||||
|
||||
- name: Change SSH port and disable root login
|
||||
lineinfile:
|
||||
path: /etc/ssh/sshd_config
|
||||
regexp: "{{ item.regexp }}"
|
||||
line: "{{ item.line }}"
|
||||
state: present
|
||||
backrefs: yes
|
||||
loop:
|
||||
- { regexp: "^#?Port .*", line: "Port {{ ssh_port }}" }
|
||||
- { regexp: "^#?PermitRootLogin .*", line: "PermitRootLogin no" }
|
||||
- {
|
||||
regexp: "^#?PasswordAuthentication .*",
|
||||
line: "PasswordAuthentication no",
|
||||
}
|
||||
|
||||
- name: Restart SSH
|
||||
service:
|
||||
name: ssh
|
||||
state: restarted
|
||||
|
||||
- name: Set SSH port to new port
|
||||
set_fact:
|
||||
ansible_port: "{{ ssh_port }}"
|
||||
|
||||
- name: Install UFW
|
||||
apt:
|
||||
name: ufw
|
||||
state: present
|
||||
|
||||
- name: Turn UFW off
|
||||
ufw:
|
||||
state: disabled
|
||||
|
||||
- name: Configure UFW default rules
|
||||
ufw:
|
||||
policy: deny
|
||||
direction: incoming
|
||||
|
||||
- name: Allow outgoing traffic
|
||||
ufw:
|
||||
rule: allow
|
||||
direction: outgoing
|
||||
|
||||
- name: Allow SSH port through UFW
|
||||
ufw:
|
||||
rule: allow
|
||||
port: "{{ ssh_port }}"
|
||||
proto: tcp
|
||||
from_ip: "{{ allow_ssh_from if allow_ssh_from != 'any' else omit }}"
|
||||
|
||||
- name: Turn UFW on
|
||||
ufw:
|
||||
state: enabled
|
||||
|
||||
- name: Install fail2ban
|
||||
apt:
|
||||
name: fail2ban
|
||||
state: present
|
||||
|
||||
- name: Ensure fail2ban is running
|
||||
service:
|
||||
name: fail2ban
|
||||
enabled: yes
|
||||
state: started
|
||||
|
||||
- name: Remove unnecessary services
|
||||
apt:
|
||||
name: "{{ item }}"
|
||||
state: absent
|
||||
purge: yes
|
||||
loop:
|
||||
- exim4
|
||||
- apache2
|
||||
- cups
|
||||
- rpcbind
|
||||
- nfs-common
|
||||
- telnet
|
||||
- ftp
|
||||
- samba
|
||||
|
||||
- name: Install auditd
|
||||
apt:
|
||||
name:
|
||||
- auditd
|
||||
- audispd-plugins
|
||||
state: present
|
||||
|
||||
- name: Enable and start auditd
|
||||
service:
|
||||
name: auditd
|
||||
enabled: yes
|
||||
state: started
|
||||
3
infra/vars.yml
Normal file
3
infra/vars.yml
Normal file
|
|
@ -0,0 +1,3 @@
|
|||
new_user: counterweight
|
||||
ssh_port: 2222
|
||||
allow_ssh_from: "any"
|
||||
Loading…
Add table
Add a link
Reference in a new issue