Initial commit
This commit is contained in:
commit
3f72f0e751
39 changed files with 720 additions and 0 deletions
34
Makefile
Normal file
34
Makefile
Normal file
|
@ -0,0 +1,34 @@
|
||||||
|
all: networkvm webserver
|
||||||
|
|
||||||
|
common_args := -i inventory.ini --ask-vault-pass -e@vaulted_vars.yml
|
||||||
|
|
||||||
|
common:
|
||||||
|
ansible-playbook $(common_args) common.yml
|
||||||
|
|
||||||
|
networkvm: wireguard
|
||||||
|
|
||||||
|
webserver: tls haproxy docker minio postgresql mastodon vaultwarden
|
||||||
|
|
||||||
|
wireguard:
|
||||||
|
ansible-playbook $(common_args) wireguard.yml
|
||||||
|
|
||||||
|
tls:
|
||||||
|
ansible-playbook $(common_args) tls.yml
|
||||||
|
|
||||||
|
haproxy:
|
||||||
|
ansible-playbook $(common_args) haproxy.yml
|
||||||
|
|
||||||
|
docker:
|
||||||
|
ansible-playbook $(common_args) docker.yml
|
||||||
|
|
||||||
|
minio:
|
||||||
|
ansible-playbook $(common_args) minio.yml
|
||||||
|
|
||||||
|
postgresql:
|
||||||
|
ansible-playbook $(common_args) postgresql.yml
|
||||||
|
|
||||||
|
mastodon:
|
||||||
|
ansible-playbook $(common_args) mastodon.yml
|
||||||
|
|
||||||
|
vaultwarden:
|
||||||
|
ansible-playbook $(common_args) vaultwarden.yml
|
13
README.md
Normal file
13
README.md
Normal file
|
@ -0,0 +1,13 @@
|
||||||
|
# Home server configuration
|
||||||
|
|
||||||
|
Available at [comfycamp.space](https://comfycamp.space).
|
||||||
|
|
||||||
|
## Ports
|
||||||
|
|
||||||
|
| Number | Service | Public URL |
|
||||||
|
| --- | --- | --- |
|
||||||
|
| 3000 | Mastodon | [m.comfycamp.space](https://m.comfycamp.space) |
|
||||||
|
| 3001 | Mastodon streaming | |
|
||||||
|
| 3002 | Vaultwarden | |
|
||||||
|
| 3003 | Minio console | |
|
||||||
|
| 9000 | Minio | |
|
6
common.yml
Normal file
6
common.yml
Normal file
|
@ -0,0 +1,6 @@
|
||||||
|
---
|
||||||
|
- hosts:
|
||||||
|
- network
|
||||||
|
- webservers
|
||||||
|
roles:
|
||||||
|
- role: common
|
4
docker.yml
Normal file
4
docker.yml
Normal file
|
@ -0,0 +1,4 @@
|
||||||
|
---
|
||||||
|
- hosts: webservers
|
||||||
|
roles:
|
||||||
|
- role: docker
|
4
haproxy.yml
Normal file
4
haproxy.yml
Normal file
|
@ -0,0 +1,4 @@
|
||||||
|
---
|
||||||
|
- hosts: webservers
|
||||||
|
roles:
|
||||||
|
- role: haproxy
|
13
inventory.ini
Normal file
13
inventory.ini
Normal file
|
@ -0,0 +1,13 @@
|
||||||
|
[webservers]
|
||||||
|
192.168.0.39 ansible_ssh_private_key_file=~/.ssh/root_server ansible_become_pass='{{ webserver_become_pass }}'
|
||||||
|
|
||||||
|
[webservers:vars]
|
||||||
|
ansible_become_method=su
|
||||||
|
ansible_become_user=root
|
||||||
|
|
||||||
|
[network]
|
||||||
|
192.168.0.42 ansible_ssh_private_key_file=~/.ssh/network_vm ansible_become_pass='{{ network_vm_become_pass }}'
|
||||||
|
|
||||||
|
[network:vars]
|
||||||
|
ansible_become_method=su
|
||||||
|
ansible_become_user=root
|
11
mastodon.yml
Normal file
11
mastodon.yml
Normal file
|
@ -0,0 +1,11 @@
|
||||||
|
---
|
||||||
|
- hosts: webservers
|
||||||
|
roles:
|
||||||
|
- role: mastodon
|
||||||
|
vapid_public_key: "{{ mastodon_vapid_public_key }}"
|
||||||
|
vapid_private_key: "{{ mastodon_vapid_private_key }}"
|
||||||
|
db_pass: "{{ mastodon_postgresql_password }}"
|
||||||
|
otp_secret: "{{ mastodon_otp_secret }}"
|
||||||
|
secret_key_base: "{{ mastodon_secret_key_base }}"
|
||||||
|
smtp_password: "{{ mastodon_smtp_password }}"
|
||||||
|
aws_secret_access_key: "{{ mastodon_aws_secret_access_key }}"
|
5
minio.yml
Normal file
5
minio.yml
Normal file
|
@ -0,0 +1,5 @@
|
||||||
|
---
|
||||||
|
- hosts: webservers
|
||||||
|
roles:
|
||||||
|
- role: minio
|
||||||
|
minio_root_password: "{{ minio_root_password }}"
|
8
postgresql.yml
Normal file
8
postgresql.yml
Normal file
|
@ -0,0 +1,8 @@
|
||||||
|
---
|
||||||
|
- hosts: webservers
|
||||||
|
roles:
|
||||||
|
- role: postgresql
|
||||||
|
postgres_password: "{{ postgres_password }}"
|
||||||
|
users:
|
||||||
|
mastodon: "{{ mastodon_postgresql_password }}"
|
||||||
|
vaultwarden: "{{ vaultwarden_postgresql_password }}"
|
3
requirements.yml
Normal file
3
requirements.yml
Normal file
|
@ -0,0 +1,3 @@
|
||||||
|
---
|
||||||
|
collections:
|
||||||
|
- name: ansible.posix
|
5
roles/common/tasks/editor.yml
Normal file
5
roles/common/tasks/editor.yml
Normal file
|
@ -0,0 +1,5 @@
|
||||||
|
---
|
||||||
|
- name: Install vim
|
||||||
|
become: true
|
||||||
|
ansible.builtin.apt:
|
||||||
|
name: vim
|
2
roles/common/tasks/main.yml
Normal file
2
roles/common/tasks/main.yml
Normal file
|
@ -0,0 +1,2 @@
|
||||||
|
---
|
||||||
|
- import_tasks: editor.yml
|
30
roles/docker/tasks/main.yml
Normal file
30
roles/docker/tasks/main.yml
Normal file
|
@ -0,0 +1,30 @@
|
||||||
|
---
|
||||||
|
- name: Install dependencies
|
||||||
|
become: true
|
||||||
|
ansible.builtin.apt:
|
||||||
|
pkg:
|
||||||
|
- curl
|
||||||
|
- ca-certificates
|
||||||
|
- python3-pip
|
||||||
|
- python3-docker
|
||||||
|
- python3-requests
|
||||||
|
- name: Download docker keyring
|
||||||
|
become: true
|
||||||
|
ansible.builtin.get_url:
|
||||||
|
url: https://download.docker.com/linux/debian/gpg
|
||||||
|
dest: /etc/apt/keyrings/docker.asc
|
||||||
|
mode: '0644'
|
||||||
|
- name: Add docker source
|
||||||
|
become: true
|
||||||
|
ansible.builtin.apt_repository:
|
||||||
|
repo: deb [arch=amd64 signed-by=/etc/apt/keyrings/docker.asc] https://download.docker.com/linux/debian bookworm stable
|
||||||
|
state: present
|
||||||
|
filename: docker
|
||||||
|
- name: Install docker engine
|
||||||
|
become: true
|
||||||
|
ansible.builtin.apt:
|
||||||
|
pkg:
|
||||||
|
- docker-ce
|
||||||
|
- docker-ce-cli
|
||||||
|
- containerd.io
|
||||||
|
update_cache: yes
|
88
roles/haproxy/files/haproxy.cfg
Normal file
88
roles/haproxy/files/haproxy.cfg
Normal file
|
@ -0,0 +1,88 @@
|
||||||
|
global
|
||||||
|
log /dev/log local0
|
||||||
|
log /dev/log local1 notice
|
||||||
|
chroot /var/lib/haproxy
|
||||||
|
stats socket /run/haproxy/admin.sock mode 660 level admin
|
||||||
|
stats timeout 30s
|
||||||
|
user haproxy
|
||||||
|
group haproxy
|
||||||
|
daemon
|
||||||
|
|
||||||
|
# Default SSL material locations
|
||||||
|
ca-base /etc/ssl/certs
|
||||||
|
crt-base /etc/ssl/private
|
||||||
|
|
||||||
|
# See: https://ssl-config.mozilla.org/#server=haproxy&server-version=2.0.3&config=intermediate
|
||||||
|
ssl-default-bind-ciphers ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-CHACHA20-POLY1305:ECDHE-RSA-CHACHA20-POLY1305:DHE-RSA-AES128-GCM-SHA256:DHE-RSA-AES256-GCM-SHA384
|
||||||
|
ssl-default-bind-ciphersuites TLS_AES_128_GCM_SHA256:TLS_AES_256_GCM_SHA384:TLS_CHACHA20_POLY1305_SHA256
|
||||||
|
ssl-default-bind-options ssl-min-ver TLSv1.2 no-tls-tickets
|
||||||
|
|
||||||
|
defaults
|
||||||
|
log global
|
||||||
|
mode http
|
||||||
|
option httplog
|
||||||
|
option dontlognull
|
||||||
|
timeout connect 5000
|
||||||
|
timeout client 50000
|
||||||
|
timeout server 50000
|
||||||
|
errorfile 400 /etc/haproxy/errors/400.http
|
||||||
|
errorfile 403 /etc/haproxy/errors/403.http
|
||||||
|
errorfile 408 /etc/haproxy/errors/408.http
|
||||||
|
errorfile 500 /etc/haproxy/errors/500.http
|
||||||
|
errorfile 502 /etc/haproxy/errors/502.http
|
||||||
|
errorfile 503 /etc/haproxy/errors/503.http
|
||||||
|
errorfile 504 /etc/haproxy/errors/504.http
|
||||||
|
|
||||||
|
frontend www
|
||||||
|
mode http
|
||||||
|
bind :80
|
||||||
|
bind :443 ssl crt /etc/haproxy/certs
|
||||||
|
http-request redirect scheme https unless { ssl_fc }
|
||||||
|
http-request set-header X-Forwarded-Proto https if { ssl_fc }
|
||||||
|
http-request set-header X-Forwarded-Proto http if !{ ssl_fc }
|
||||||
|
|
||||||
|
acl acl_mastodon hdr(host) -i m.comfycamp.space
|
||||||
|
acl acl_s3 hdr(host) -i s3.comfycamp.space
|
||||||
|
acl acl_comfycamp hdr(host) -i comfycamp.space
|
||||||
|
acl acl_vaultwarden hdr(host) -i vault.comfycamp.space
|
||||||
|
acl acl_minio hdr(host) -i minio.comfycamp.space
|
||||||
|
|
||||||
|
use_backend mastodon_streaming if acl_mastodon { path_beg /api/v1/streaming }
|
||||||
|
use_backend mastodon if acl_mastodon
|
||||||
|
use_backend minio if acl_s3
|
||||||
|
use_backend minio_console if acl_minio
|
||||||
|
use_backend vaultwarden if acl_vaultwarden
|
||||||
|
use_backend comfycamp if acl_comfycamp
|
||||||
|
|
||||||
|
|
||||||
|
backend comfycamp
|
||||||
|
mode http
|
||||||
|
server green 127.0.0.1:8080 check
|
||||||
|
|
||||||
|
backend mastodon
|
||||||
|
mode http
|
||||||
|
option forwardfor
|
||||||
|
server green 127.0.0.1:3000 check
|
||||||
|
|
||||||
|
backend mastodon_streaming
|
||||||
|
mode http
|
||||||
|
option forwardfor
|
||||||
|
option http-server-close
|
||||||
|
timeout tunnel 1h
|
||||||
|
server green 127.0.0.1:3001 check
|
||||||
|
|
||||||
|
backend vaultwarden
|
||||||
|
mode http
|
||||||
|
option forwardfor
|
||||||
|
server green 127.0.0.1:3002 check
|
||||||
|
|
||||||
|
backend minio_console
|
||||||
|
mode http
|
||||||
|
option forwardfor
|
||||||
|
server green 127.0.0.1:3003 check
|
||||||
|
|
||||||
|
backend minio
|
||||||
|
mode http
|
||||||
|
http-response set-header Access-Control-Allow-Origin https://m.comfycamp.space
|
||||||
|
option forwardfor
|
||||||
|
server green 127.0.0.1:9000 check
|
18
roles/haproxy/tasks/main.yml
Normal file
18
roles/haproxy/tasks/main.yml
Normal file
|
@ -0,0 +1,18 @@
|
||||||
|
---
|
||||||
|
- name: Install haproxy
|
||||||
|
become: true
|
||||||
|
ansible.builtin.apt:
|
||||||
|
name: haproxy
|
||||||
|
- name: Copy haproxy config
|
||||||
|
become: true
|
||||||
|
ansible.builtin.copy:
|
||||||
|
src: haproxy.cfg
|
||||||
|
dest: /etc/haproxy/haproxy.cfg
|
||||||
|
validate: /usr/sbin/haproxy -f %s -c
|
||||||
|
register: haproxy
|
||||||
|
- name: Reload haproxy
|
||||||
|
become: true
|
||||||
|
when: haproxy.changed
|
||||||
|
ansible.builtin.systemd_service:
|
||||||
|
name: haproxy
|
||||||
|
state: reloaded
|
5
roles/mastodon/files/redis-cache.conf
Normal file
5
roles/mastodon/files/redis-cache.conf
Normal file
|
@ -0,0 +1,5 @@
|
||||||
|
save ""
|
||||||
|
appendonly no
|
||||||
|
|
||||||
|
maxmemory 64mb
|
||||||
|
maxmemory-policy allkeys-lru
|
1
roles/mastodon/files/redis.conf
Normal file
1
roles/mastodon/files/redis.conf
Normal file
|
@ -0,0 +1 @@
|
||||||
|
save 60 1000
|
3
roles/mastodon/tasks/main.yml
Normal file
3
roles/mastodon/tasks/main.yml
Normal file
|
@ -0,0 +1,3 @@
|
||||||
|
---
|
||||||
|
- import_tasks: redis.yml
|
||||||
|
- import_tasks: mastodon.yml
|
64
roles/mastodon/tasks/mastodon.yml
Normal file
64
roles/mastodon/tasks/mastodon.yml
Normal file
|
@ -0,0 +1,64 @@
|
||||||
|
---
|
||||||
|
- name: Create mastodon's public volume
|
||||||
|
become: true
|
||||||
|
community.docker.docker_volume:
|
||||||
|
name: mastodon-public-system
|
||||||
|
- name: Create mastodon config directory
|
||||||
|
become: true
|
||||||
|
ansible.builtin.file:
|
||||||
|
path: /etc/mastodon
|
||||||
|
state: directory
|
||||||
|
mode: '1750'
|
||||||
|
owner: root
|
||||||
|
group: root
|
||||||
|
- name: Copy env file
|
||||||
|
become: true
|
||||||
|
ansible.builtin.template:
|
||||||
|
src: mastodon.env.j2
|
||||||
|
dest: /etc/mastodon/.env
|
||||||
|
mode: '0660'
|
||||||
|
owner: root
|
||||||
|
group: root
|
||||||
|
- name: Create web container
|
||||||
|
become: true
|
||||||
|
community.docker.docker_container:
|
||||||
|
name: mastodon-web
|
||||||
|
image: ghcr.io/mastodon/mastodon:v4.2.12
|
||||||
|
env_file: /etc/mastodon/.env
|
||||||
|
command: ["bundle", "exec", "puma", "-C", "config/puma.rb"]
|
||||||
|
networks:
|
||||||
|
- name: redis-mastodon
|
||||||
|
- name: postgresql
|
||||||
|
- name: minio
|
||||||
|
ports:
|
||||||
|
- 127.0.0.1:3000:3000
|
||||||
|
volumes:
|
||||||
|
- mastodon-public-system:/mastodon/public/system
|
||||||
|
restart_policy: unless-stopped
|
||||||
|
- name: Create streaming container
|
||||||
|
become: true
|
||||||
|
community.docker.docker_container:
|
||||||
|
name: mastodon-streaming
|
||||||
|
image: ghcr.io/mastodon/mastodon-streaming:nightly.2024-08-19
|
||||||
|
env_file: /etc/mastodon/.env
|
||||||
|
command: ["node", "./streaming/index.js"]
|
||||||
|
networks:
|
||||||
|
- name: redis-mastodon
|
||||||
|
- name: postgresql
|
||||||
|
ports:
|
||||||
|
- 127.0.0.1:3001:4000
|
||||||
|
restart_policy: unless-stopped
|
||||||
|
- name: Create sidekiq container
|
||||||
|
become: true
|
||||||
|
community.docker.docker_container:
|
||||||
|
name: mastodon-sidekiq
|
||||||
|
image: ghcr.io/mastodon/mastodon:v4.2.12
|
||||||
|
env_file: /etc/mastodon/.env
|
||||||
|
command: ["bundle", "exec", "sidekiq"]
|
||||||
|
networks:
|
||||||
|
- name: redis-mastodon
|
||||||
|
- name: postgresql
|
||||||
|
- name: minio
|
||||||
|
volumes:
|
||||||
|
- mastodon-public-system:/mastodon/public/system
|
||||||
|
restart_policy: unless-stopped
|
48
roles/mastodon/tasks/redis.yml
Normal file
48
roles/mastodon/tasks/redis.yml
Normal file
|
@ -0,0 +1,48 @@
|
||||||
|
---
|
||||||
|
- name: Create docker network
|
||||||
|
become: true
|
||||||
|
community.docker.docker_network:
|
||||||
|
name: redis-mastodon
|
||||||
|
|
||||||
|
- name: Create redis docker volume
|
||||||
|
become: true
|
||||||
|
community.docker.docker_volume:
|
||||||
|
name: redis-mastodon
|
||||||
|
- name: Create redis cache docker volume
|
||||||
|
become: true
|
||||||
|
community.docker.docker_volume:
|
||||||
|
name: redis-mastodon-cache
|
||||||
|
|
||||||
|
- name: Copy redis config
|
||||||
|
become: true
|
||||||
|
ansible.builtin.copy:
|
||||||
|
src: redis.conf
|
||||||
|
dest: /var/lib/docker/volumes/redis-mastodon/_data/redis.conf
|
||||||
|
- name: Copy redis cache config
|
||||||
|
become: true
|
||||||
|
ansible.builtin.copy:
|
||||||
|
src: redis-cache.conf
|
||||||
|
dest: /var/lib/docker/volumes/redis-mastodon-cache/_data/redis.conf
|
||||||
|
|
||||||
|
- name: Create redis container
|
||||||
|
become: true
|
||||||
|
community.docker.docker_container:
|
||||||
|
name: redis-mastodon
|
||||||
|
image: redis:7.4-bookworm
|
||||||
|
command: ["redis-server", "/data/redis.conf"]
|
||||||
|
networks:
|
||||||
|
- name: redis-mastodon
|
||||||
|
volumes:
|
||||||
|
- redis-mastodon:/data
|
||||||
|
restart_policy: unless-stopped
|
||||||
|
- name: Create redis cache container
|
||||||
|
become: true
|
||||||
|
community.docker.docker_container:
|
||||||
|
name: redis-mastodon-cache
|
||||||
|
image: redis:7.4-bookworm
|
||||||
|
command: ["redis-server", "/data/redis.conf"]
|
||||||
|
networks:
|
||||||
|
- name: redis-mastodon
|
||||||
|
volumes:
|
||||||
|
- redis-mastodon-cache:/data
|
||||||
|
restart_policy: unless-stopped
|
34
roles/mastodon/templates/mastodon.env.j2
Normal file
34
roles/mastodon/templates/mastodon.env.j2
Normal file
|
@ -0,0 +1,34 @@
|
||||||
|
LOCAL_DOMAIN={{ local_domain }}
|
||||||
|
|
||||||
|
REDIS_HOST=redis-mastodon
|
||||||
|
REDIS_PORT=6379
|
||||||
|
|
||||||
|
CACHE_REDIS_HOST=redis-mastodon-cache
|
||||||
|
CACHE_REDIS_PORT=6379
|
||||||
|
|
||||||
|
DB_HOST={{ db_host }}
|
||||||
|
DB_USER={{ db_user }}
|
||||||
|
DB_NAME={{ db_name }}
|
||||||
|
DB_PASS={{ db_pass }}
|
||||||
|
DB_PORT={{ db_port }}
|
||||||
|
|
||||||
|
SECRET_KEY_BASE={{ secret_key_base }}
|
||||||
|
OTP_SECRET={{ otp_secret }}
|
||||||
|
|
||||||
|
VAPID_PRIVATE_KEY={{ vapid_private_key }}
|
||||||
|
VAPID_PUBLIC_KEY={{ vapid_public_key }}
|
||||||
|
|
||||||
|
SMTP_SERVER={{ smtp_server }}
|
||||||
|
SMTP_PORT={{ smtp_port }}
|
||||||
|
SMTP_LOGIN={{ smtp_login }}
|
||||||
|
SMTP_PASSWORD={{ smtp_password }}
|
||||||
|
SMTP_FROM_ADDRESS={{ smtp_from_address }}
|
||||||
|
|
||||||
|
S3_ENABLED=true
|
||||||
|
S3_ENDPOINT={{ s3_endpoint }}
|
||||||
|
S3_BUCKET={{ s3_bucket }}
|
||||||
|
AWS_ACCESS_KEY_ID={{ aws_access_key_id }}
|
||||||
|
AWS_SECRET_ACCESS_KEY={{ aws_secret_access_key }}
|
||||||
|
|
||||||
|
S3_PROTOCOL=https
|
||||||
|
S3_HOSTNAME={{ s3_hostname }}
|
24
roles/mastodon/vars/main.yml
Normal file
24
roles/mastodon/vars/main.yml
Normal file
|
@ -0,0 +1,24 @@
|
||||||
|
local_domain: m.comfycamp.space
|
||||||
|
|
||||||
|
vapid_public_key: change_me
|
||||||
|
vapid_private_key: change_me
|
||||||
|
otp_secret: change_me
|
||||||
|
secret_key_base: change_me
|
||||||
|
|
||||||
|
db_host: postgresql
|
||||||
|
db_user: mastodon
|
||||||
|
db_name: mastodon
|
||||||
|
db_pass: change_me
|
||||||
|
db_port: "5432"
|
||||||
|
|
||||||
|
smtp_server: comfycamp.space
|
||||||
|
smtp_port: "465"
|
||||||
|
smtp_login: mastodon@comfycamp.space
|
||||||
|
smtp_password: change_me
|
||||||
|
smtp_from_address: mastodon@comfycamp.space
|
||||||
|
|
||||||
|
s3_endpoint: http://minio:9000
|
||||||
|
s3_hostname: s3.comfycamp.space
|
||||||
|
s3_bucket: mastodon
|
||||||
|
aws_access_key_id: WfSoEsOL1Glg9GXc3sRN
|
||||||
|
aws_secret_access_key: change_me
|
31
roles/minio/tasks/main.yml
Normal file
31
roles/minio/tasks/main.yml
Normal file
|
@ -0,0 +1,31 @@
|
||||||
|
---
|
||||||
|
- name: Create minio volume
|
||||||
|
become: true
|
||||||
|
community.docker.docker_volume:
|
||||||
|
name: minio
|
||||||
|
- name: Create minio network
|
||||||
|
become: true
|
||||||
|
community.docker.docker_network:
|
||||||
|
name: minio
|
||||||
|
- name: Run minio container
|
||||||
|
become: true
|
||||||
|
community.docker.docker_container:
|
||||||
|
name: minio
|
||||||
|
image: minio/minio:{{ minio_version }}
|
||||||
|
command: ["minio", "server", "--console-address", ":9001"]
|
||||||
|
networks:
|
||||||
|
- name: minio
|
||||||
|
volumes:
|
||||||
|
- minio:/data
|
||||||
|
ports:
|
||||||
|
- 127.0.0.1:3003:9001
|
||||||
|
- 127.0.0.1:9000:9000
|
||||||
|
env:
|
||||||
|
MINIO_ROOT_USER: "{{ minio_root_user }}"
|
||||||
|
MINIO_ROOT_PASSWORD: "{{ minio_root_password }}"
|
||||||
|
MINIO_VOLUMES: /data
|
||||||
|
restart_policy: unless-stopped
|
||||||
|
- name: Install rclone
|
||||||
|
become: true
|
||||||
|
ansible.builtin.apt:
|
||||||
|
name: rclone
|
3
roles/minio/vars/main.yml
Normal file
3
roles/minio/vars/main.yml
Normal file
|
@ -0,0 +1,3 @@
|
||||||
|
minio_version: RELEASE.2024-09-22T00-33-43Z
|
||||||
|
minio_root_user: lumin
|
||||||
|
minio_root_password: change_me
|
10
roles/postgresql/files/create-user.sql
Normal file
10
roles/postgresql/files/create-user.sql
Normal file
|
@ -0,0 +1,10 @@
|
||||||
|
CREATE OR REPLACE FUNCTION create_user_if_not_exists(username TEXT, passwd TEXT)
|
||||||
|
RETURNS VOID AS \$\$
|
||||||
|
BEGIN
|
||||||
|
IF NOT EXISTS (SELECT 1 FROM pg_roles WHERE rolname = username) THEN
|
||||||
|
EXECUTE format('CREATE ROLE %I LOGIN PASSWORD %L', username, passwd);
|
||||||
|
ELSE
|
||||||
|
RAISE NOTICE 'User % already exists.', username;
|
||||||
|
END IF;
|
||||||
|
END;
|
||||||
|
\$\$ LANGUAGE plpgsql;
|
42
roles/postgresql/tasks/main.yml
Normal file
42
roles/postgresql/tasks/main.yml
Normal file
|
@ -0,0 +1,42 @@
|
||||||
|
---
|
||||||
|
- name: Create docker network
|
||||||
|
become: true
|
||||||
|
community.docker.docker_network:
|
||||||
|
name: postgresql
|
||||||
|
- name: Create docker volume
|
||||||
|
become: true
|
||||||
|
community.docker.docker_volume:
|
||||||
|
name: postgresql
|
||||||
|
- name: Create postgresql container
|
||||||
|
become: true
|
||||||
|
community.docker.docker_container:
|
||||||
|
name: postgresql
|
||||||
|
image: postgres:16.4-bookworm
|
||||||
|
networks:
|
||||||
|
- name: postgresql
|
||||||
|
volumes:
|
||||||
|
- postgresql:/var/lib/postgresql/data
|
||||||
|
env:
|
||||||
|
POSTGRES_USER: postgres
|
||||||
|
POSTGRES_DB: postgres
|
||||||
|
POSTGRES_PASSWORD: "{{ postgres_password }}"
|
||||||
|
restart_policy: unless-stopped
|
||||||
|
- name: Create a function to manage users
|
||||||
|
become: true
|
||||||
|
community.docker.docker_container_exec:
|
||||||
|
container: postgresql
|
||||||
|
argv:
|
||||||
|
- /bin/bash
|
||||||
|
- "-c"
|
||||||
|
- echo "{{ lookup('file', 'create-user.sql') }}" | psql -U postgres
|
||||||
|
- name: Create roles
|
||||||
|
become: true
|
||||||
|
community.docker.docker_container_exec:
|
||||||
|
container: postgresql
|
||||||
|
argv:
|
||||||
|
- /bin/bash
|
||||||
|
- "-c"
|
||||||
|
- echo "SELECT create_user_if_not_exists('{{ item.key }}', '{{ item.value }}')" | psql -U postgres
|
||||||
|
no_log: True
|
||||||
|
loop:
|
||||||
|
"{{ users | dict2items }}"
|
2
roles/postgresql/vars/main.yml
Normal file
2
roles/postgresql/vars/main.yml
Normal file
|
@ -0,0 +1,2 @@
|
||||||
|
postgres_password: change_me
|
||||||
|
users: []
|
13
roles/tls/README.md
Normal file
13
roles/tls/README.md
Normal file
|
@ -0,0 +1,13 @@
|
||||||
|
# TLS
|
||||||
|
|
||||||
|
This role will install certbot with cloudflare plugin,
|
||||||
|
issue a wildcard certificate for your domain, and prepare it for use in haproxy.
|
||||||
|
|
||||||
|
Certbot should automatically set a systemd timer to renew certificates.
|
||||||
|
|
||||||
|
## Created files
|
||||||
|
|
||||||
|
- `/etc/certbot/cloudflare.ini`
|
||||||
|
- `/etc/letsencrypt/live/{{ domain }}/fullchain.pem`
|
||||||
|
- `/etc/letsencrypt/live/{{ domain }}/privkey.pem`
|
||||||
|
- `/etc/haproxy/certs/{{ domain }}.pem` - fullchain + privkey
|
41
roles/tls/tasks/main.yml
Normal file
41
roles/tls/tasks/main.yml
Normal file
|
@ -0,0 +1,41 @@
|
||||||
|
---
|
||||||
|
- name: Install certbot
|
||||||
|
become: true
|
||||||
|
ansible.builtin.apt:
|
||||||
|
pkg:
|
||||||
|
- certbot
|
||||||
|
- python3-certbot-dns-cloudflare
|
||||||
|
- name: Create certbot directory
|
||||||
|
become: true
|
||||||
|
ansible.builtin.file:
|
||||||
|
path: /etc/certbot
|
||||||
|
state: directory
|
||||||
|
owner: root
|
||||||
|
group: root
|
||||||
|
mode: '1750'
|
||||||
|
- name: Copy cloudflare credentials
|
||||||
|
become: true
|
||||||
|
ansible.builtin.template:
|
||||||
|
src: cloudflare.ini.j2
|
||||||
|
dest: /etc/certbot/cloudflare.ini
|
||||||
|
owner: root
|
||||||
|
group: root
|
||||||
|
mode: '0660'
|
||||||
|
- name: Issue certificates
|
||||||
|
become: true
|
||||||
|
ansible.builtin.shell:
|
||||||
|
certbot certonly -n --agree-tos --expand --email {{ email }} --dns-cloudflare --dns-cloudflare-credentials /etc/certbot/cloudflare.ini -d {{ domain }} -d '*.{{ domain }}'
|
||||||
|
args:
|
||||||
|
creates: /etc/letsencrypt/live/{{ domain }}/fullchain.pem
|
||||||
|
- name: Create a directory to store combined files
|
||||||
|
become: true
|
||||||
|
ansible.builtin.file:
|
||||||
|
path: /etc/haproxy/certs
|
||||||
|
state: directory
|
||||||
|
mode: '1750'
|
||||||
|
- name: Combine certificate and private key
|
||||||
|
become: true
|
||||||
|
ansible.builtin.shell:
|
||||||
|
cat fullchain.pem privkey.pem > /etc/haproxy/certs/{{ domain }}.pem
|
||||||
|
args:
|
||||||
|
chdir: /etc/letsencrypt/live/{{ domain }}
|
1
roles/tls/templates/cloudflare.ini.j2
Normal file
1
roles/tls/templates/cloudflare.ini.j2
Normal file
|
@ -0,0 +1 @@
|
||||||
|
dns_cloudflare_api_token = {{ dns_cloudflare_api_token }}
|
3
roles/tls/vars/main.yml
Normal file
3
roles/tls/vars/main.yml
Normal file
|
@ -0,0 +1,3 @@
|
||||||
|
email: ordinarydev@protonmail.com
|
||||||
|
domain: comfycamp.space
|
||||||
|
dns_cloudflare_api_token: change_me
|
21
roles/vaultwarden/tasks/main.yml
Normal file
21
roles/vaultwarden/tasks/main.yml
Normal file
|
@ -0,0 +1,21 @@
|
||||||
|
---
|
||||||
|
- name: Create vaultwarden docker volume
|
||||||
|
become: true
|
||||||
|
community.docker.docker_volume:
|
||||||
|
name: vaultwarden
|
||||||
|
- name: Create vaultwarden container
|
||||||
|
become: true
|
||||||
|
community.docker.docker_container:
|
||||||
|
name: vaultwarden
|
||||||
|
image: vaultwarden/server:1.32.0
|
||||||
|
env:
|
||||||
|
DOMAIN: "{{ domain }}"
|
||||||
|
LOG_LEVEL: warn
|
||||||
|
DATABASE_URL: "{{ db_url }}"
|
||||||
|
networks:
|
||||||
|
- name: postgresql
|
||||||
|
ports:
|
||||||
|
- 127.0.0.1:3002:80
|
||||||
|
volumes:
|
||||||
|
- vaultwarden:/data
|
||||||
|
restart_policy: unless-stopped
|
2
roles/vaultwarden/vars/main.yml
Normal file
2
roles/vaultwarden/vars/main.yml
Normal file
|
@ -0,0 +1,2 @@
|
||||||
|
db_url: postgresql://vaultwarden:password@postgresql:5432/vaultwarden
|
||||||
|
domain: https://vault.comfycamp.space
|
52
roles/wireguard/tasks/main.yml
Normal file
52
roles/wireguard/tasks/main.yml
Normal file
|
@ -0,0 +1,52 @@
|
||||||
|
---
|
||||||
|
- name: Install wireguard and iptables
|
||||||
|
become: true
|
||||||
|
ansible.builtin.apt:
|
||||||
|
pkg:
|
||||||
|
- wireguard
|
||||||
|
- iptables
|
||||||
|
- name: Create wireguard directory
|
||||||
|
become: true
|
||||||
|
ansible.builtin.file:
|
||||||
|
path: /etc/wireguard
|
||||||
|
state: directory
|
||||||
|
mode: '1750'
|
||||||
|
- name: Generate private key
|
||||||
|
become: true
|
||||||
|
ansible.builtin.shell: |
|
||||||
|
umask 077
|
||||||
|
wg genkey > private_key
|
||||||
|
args:
|
||||||
|
chdir: /etc/wireguard
|
||||||
|
creates: private_key
|
||||||
|
- name: Generate public key
|
||||||
|
become: true
|
||||||
|
ansible.builtin.shell: |
|
||||||
|
umask 077
|
||||||
|
cat private_key | wg pubkey > public_key
|
||||||
|
args:
|
||||||
|
chdir: /etc/wireguard
|
||||||
|
creates: public_key
|
||||||
|
- name: Enable packet forwarding
|
||||||
|
become: true
|
||||||
|
ansible.posix.sysctl:
|
||||||
|
name: net.ipv4.ip_forward
|
||||||
|
value: '1'
|
||||||
|
state: present
|
||||||
|
reload: true
|
||||||
|
- name: Read private key
|
||||||
|
become: true
|
||||||
|
ansible.builtin.slurp:
|
||||||
|
path: /etc/wireguard/private_key
|
||||||
|
register: private_key
|
||||||
|
- name: Copy wireguard config
|
||||||
|
become: true
|
||||||
|
ansible.builtin.template:
|
||||||
|
src: wg0.conf.j2
|
||||||
|
dest: /etc/wireguard/wg0.conf
|
||||||
|
- name: Enable wireguard service
|
||||||
|
become: true
|
||||||
|
ansible.builtin.systemd_service:
|
||||||
|
name: wg-quick@wg0
|
||||||
|
state: restarted
|
||||||
|
enabled: true
|
10
roles/wireguard/templates/wg0.conf.j2
Normal file
10
roles/wireguard/templates/wg0.conf.j2
Normal file
|
@ -0,0 +1,10 @@
|
||||||
|
[Interface]
|
||||||
|
PrivateKey = {{ private_key.content | b64decode }}
|
||||||
|
Address = 10.110.0.1/24
|
||||||
|
ListenPort = 51840
|
||||||
|
PostUp = iptables -A FORWARD -i %i -j ACCEPT; iptables -t nat -A POSTROUTING -o ens18 -j MASQUERADE
|
||||||
|
PostDown = iptables -D FORWARD -i %i -j ACCEPT; iptables -t nat -D POSTROUTING -o ens18 -j MASQUERADE
|
||||||
|
|
||||||
|
[Peer]
|
||||||
|
PublicKey = awAVP/tkl0Z9PKEMTABjIXhblWSGHhIvYjBFp3C7YUk=
|
||||||
|
AllowedIPs = 10.110.0.2/32
|
5
tls.yml
Normal file
5
tls.yml
Normal file
|
@ -0,0 +1,5 @@
|
||||||
|
---
|
||||||
|
- hosts: webservers
|
||||||
|
roles:
|
||||||
|
- role: tls
|
||||||
|
dns_cloudflare_api_token: "{{ dns_cloudflare_api_token }}"
|
52
vaulted_vars.yml
Normal file
52
vaulted_vars.yml
Normal file
|
@ -0,0 +1,52 @@
|
||||||
|
$ANSIBLE_VAULT;1.1;AES256
|
||||||
|
36316363396534613033333531386165353335363961316133363862333864656435396137333335
|
||||||
|
3431376131663962656632333563373162313066323835620a313961653764303462343563353064
|
||||||
|
65393361356530373764396264636235353435363162663865396232333861323064633538306563
|
||||||
|
3830356338353433340a383165643938333938623434633839613835313736646633326238363636
|
||||||
|
30613838303933333161393236363531613662616638326138613262626631613061346132306663
|
||||||
|
38323336363930313834323131303430663866613264356630303133323964353635386635383165
|
||||||
|
64386432643930643935343731383131653662353166376434373635343962343139666134613161
|
||||||
|
36663261343234396533313662386330363465653164633162386339363461313163316237643566
|
||||||
|
39386537656165356330386533643164616633326264313961326166323964316336386662393830
|
||||||
|
61616130373466363861623137393530326164383663303237633631303930653633666235396435
|
||||||
|
65666535366133333365353233656464663338363763643363656562376131353230333763656462
|
||||||
|
34376431656563613964623739623735613931396439343432386131663032386161336461343232
|
||||||
|
61336462393931633065393330626230383237666235303266333736333863356630653139313134
|
||||||
|
65343463356137363633373839323461626139393163646531613465313037353466636566373839
|
||||||
|
62656234386663616461616430353865653834623933333438313463656439316465643762396262
|
||||||
|
33363834313938336135323064393331383132613234643837393934616262346536623532666635
|
||||||
|
39303337313964666665336562643065653861623866326232323438363164346639613433316235
|
||||||
|
39303633383038326661313031613536313265353333653239613138666439343533333934336638
|
||||||
|
39656235316662363862326664323035306666646434383539366563643532393762636233653832
|
||||||
|
63336131363931386432333764306464303866653064346233613338333636346536626436636438
|
||||||
|
33633431386135666138363661353866623966343638316261396132303866383161643538393663
|
||||||
|
31343833343462363530633065636561363466333334303730643333316437613963623536623438
|
||||||
|
32646530653838653332353635613066613761643161643639383331636332616138623936363139
|
||||||
|
34386661303233316439656239356463366130356665366639613031383130626330363531633238
|
||||||
|
63343532356635666233393665663832666161353735326337666637303032396434633135323832
|
||||||
|
38373563333637386264633430346638376433323234623562643230623564616432653431623135
|
||||||
|
32376363353065323230363564353461623162326635323539626237376239643061363035343436
|
||||||
|
62333261326131303333643537316162316662303432353162653933373530656432373266326135
|
||||||
|
61343235626238353864643630353630303532613031356239353532396338306539333538336639
|
||||||
|
66366533666364383837343236333130396265366230376333383231383464383364616233366136
|
||||||
|
33316134383430623662363163373538323161333061313562363363663865336131343832666134
|
||||||
|
35656563366438363565613439663161323565363330316661353764393533316238323332386364
|
||||||
|
30653336616664643565363261613936353831343364393562663933323731313334623038363539
|
||||||
|
36333133633035643433396339353931626433363036303135323864323465316565323730343832
|
||||||
|
36336362343634656436346131333137613035626434323434663539313131626363373266323236
|
||||||
|
31373963663736353833356237643630353837386534306362306138363834633863386434363731
|
||||||
|
31366666633661323638613136396133646666643436613232633439346565323036313238663863
|
||||||
|
31333231616462396133623839383961623039306363653532303262363532313063396235356362
|
||||||
|
33306661313464323738663132663666333630353039656366303534613364376639366563343161
|
||||||
|
36333535383532363966323439396666646162313562633462643837643363623137366232383065
|
||||||
|
63633265366135613963316536663538346661353832383364653935313236353131653664396663
|
||||||
|
64306234663438353233646539343439643462363238323539396136343232303531313837653235
|
||||||
|
34343536633430383565356263643730343539346139343935323333636535666461663764373434
|
||||||
|
35376239643833343233663933656464623861373961363363616537313861353238396665353366
|
||||||
|
63363331663630353966306264386138396434646335386564646233303735323062363135343931
|
||||||
|
35393339653934363138646463393034613561333063313235346135386532356331373162366433
|
||||||
|
65396330326662653237336431393861613932646233313061373532363364616438626433336463
|
||||||
|
33333530303130326361343663613030623262353137366536323062333636393463356434346638
|
||||||
|
33383132336431356631303638393964646231626361383638393838623334636338313661316232
|
||||||
|
61383131623133376331383239393765346335373530346231353161616433633064316633343533
|
||||||
|
376235356632396563306361653663336366
|
5
vaultwarden.yml
Normal file
5
vaultwarden.yml
Normal file
|
@ -0,0 +1,5 @@
|
||||||
|
---
|
||||||
|
- hosts: webservers
|
||||||
|
roles:
|
||||||
|
- role: vaultwarden
|
||||||
|
db_url: postgresql://vaultwarden:{{ vaultwarden_postgresql_password }}@postgresql:5432/vaultwarden
|
4
wireguard.yml
Normal file
4
wireguard.yml
Normal file
|
@ -0,0 +1,4 @@
|
||||||
|
---
|
||||||
|
- hosts: network
|
||||||
|
roles:
|
||||||
|
- role: wireguard
|
Loading…
Reference in a new issue