Initial commit
This commit is contained in:
parent
1c92066956
commit
4fe58cc4f3
15 changed files with 264 additions and 0 deletions
5
ansible/ansible.cfg
Normal file
5
ansible/ansible.cfg
Normal file
|
@ -0,0 +1,5 @@
|
|||
[defaults]
|
||||
INVENTORY = hosts
|
||||
|
||||
[ssh_connections]
|
||||
pipelining = true
|
15
ansible/group_vars/all/vars.yml
Normal file
15
ansible/group_vars/all/vars.yml
Normal file
|
@ -0,0 +1,15 @@
|
|||
packages:
|
||||
- nano
|
||||
- exfat-fuse
|
||||
- exfat-utils
|
||||
- ca-certificates
|
||||
- curl
|
||||
- gnupg
|
||||
- lsb-release
|
||||
- nfs-common
|
||||
- unbound
|
||||
- dnsutils
|
||||
|
||||
### ZSH Settings
|
||||
zsh_theme: "powerlevel10k/powerlevel10k"
|
||||
ohmyzsh_git_url: https://github.com/robbyrussell/oh-my-zsh
|
87
ansible/tasks/essential.yml
Normal file
87
ansible/tasks/essential.yml
Normal file
|
@ -0,0 +1,87 @@
|
|||
- name: Update packages
|
||||
apt:
|
||||
update_cache: yes
|
||||
upgrade: yes
|
||||
|
||||
- name: Install essential packages
|
||||
package:
|
||||
name: "{{ packages }}"
|
||||
state: latest
|
||||
|
||||
- name: Check if docker is installed
|
||||
stat:
|
||||
path: /usr/bin/docker
|
||||
register: docker_status
|
||||
|
||||
- name: Check if docker pgp key is installed
|
||||
stat:
|
||||
path: /usr/share/keyrings/docker-archive-keyring.gpg
|
||||
register: docker_pgp_key_status
|
||||
|
||||
- name: Download docker
|
||||
shell: "curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo gpg --dearmor -o /usr/share/keyrings/docker-archive-keyring.gpg"
|
||||
when: not docker_pgp_key_status.stat.exists
|
||||
|
||||
- name: Setup stable docker repository
|
||||
shell: 'echo "deb [arch=$(dpkg --print-architecture) signed-by=/usr/share/keyrings/docker-archive-keyring.gpg] https://download.docker.com/linux/ubuntu $(lsb_release -cs) stable" | sudo tee /etc/apt/sources.list.d/docker.list > /dev/null'
|
||||
when: not docker_status.stat.exists
|
||||
|
||||
- name: Update packages
|
||||
apt:
|
||||
update_cache: yes
|
||||
upgrade: yes
|
||||
|
||||
- name: Install essential packages
|
||||
package:
|
||||
name:
|
||||
- docker-ce
|
||||
- docker-ce-cli
|
||||
- containerd.io
|
||||
state: latest
|
||||
|
||||
- name: Add group docker
|
||||
group:
|
||||
name: docker
|
||||
|
||||
- name: Add user to group docker
|
||||
user:
|
||||
name: "{{ username }}"
|
||||
group: docker
|
||||
|
||||
- name: Disable SSH password auth
|
||||
lineinfile:
|
||||
dest: /etc/ssh/sshd_config
|
||||
regexp: "^#PasswordAuthentication yes"
|
||||
line: "PasswordAuthentication no"
|
||||
register: sshd_config
|
||||
|
||||
- name: Enable passwordless sudo for "{{ username }}"
|
||||
lineinfile:
|
||||
dest: /etc/sudoers
|
||||
regexp: "^%wheel"
|
||||
line: "{{ username }} ALL=(ALL) NOPASSWD: ALL"
|
||||
validate: "/usr/sbin/visudo -cf %s"
|
||||
|
||||
- name: Restart SSH daemon
|
||||
service:
|
||||
name: sshd
|
||||
state: restarted
|
||||
when: sshd_config.changed
|
||||
|
||||
- name: Allow SSH in UFW
|
||||
community.general.ufw:
|
||||
rule: allow
|
||||
port: 22
|
||||
from: 192.168.2.0/24
|
||||
proto: tcp
|
||||
|
||||
- name: Allow port 111 for NFS
|
||||
community.general.ufw:
|
||||
rule: allow
|
||||
port: 111
|
||||
from: 192.168.2.0/24
|
||||
when: nfs_share is defined
|
||||
|
||||
- name: Enable UFW
|
||||
community.general.ufw:
|
||||
state: enabled
|
0
app-data/.gitkeep
Normal file
0
app-data/.gitkeep
Normal file
0
apps/pi-hole/data/dnsmasq/.gitkeep
Normal file
0
apps/pi-hole/data/dnsmasq/.gitkeep
Normal file
0
apps/pi-hole/data/pihole/.gitkeep
Normal file
0
apps/pi-hole/data/pihole/.gitkeep
Normal file
19
apps/pi-hole/docker-compose.yml
Normal file
19
apps/pi-hole/docker-compose.yml
Normal file
|
@ -0,0 +1,19 @@
|
|||
version: "3.7"
|
||||
|
||||
services:
|
||||
server:
|
||||
image: pihole/pihole
|
||||
restart: on-failure
|
||||
ports:
|
||||
- 53:53
|
||||
- 53:53/udp
|
||||
- ${APP_PI_HOLE_PORT}:80
|
||||
volumes:
|
||||
- ${APP_DATA_DIR}/data/pihole:/etc/pihole/
|
||||
- ${APP_DATA_DIR}/data/dnsmasq:/etc/dnsmasq.d/
|
||||
environment:
|
||||
- VIRTUAL_HOST=${APP_DOMAIN}
|
||||
- WEBPASSWORD=${APP_PASSWORD}
|
||||
networks:
|
||||
default:
|
||||
ipv4_address: $APP_PI_HOLE_IP
|
13
docker-compose.yml
Normal file
13
docker-compose.yml
Normal file
|
@ -0,0 +1,13 @@
|
|||
version: '3.7'
|
||||
|
||||
services:
|
||||
nginx-proxy:
|
||||
image: 'jc21/nginx-proxy-manager:latest'
|
||||
restart: unless-stopped
|
||||
ports:
|
||||
- '80:80'
|
||||
- '81:81'
|
||||
- '443:443'
|
||||
volumes:
|
||||
- ${PWD}/nginx:/data
|
||||
- ${PWD}/letsencrypt:/etc/letsencrypt
|
0
letsencrypt/.gitkeep
Normal file
0
letsencrypt/.gitkeep
Normal file
0
nginx/.gitkeep
Normal file
0
nginx/.gitkeep
Normal file
76
scripts/configure.sh
Normal file
76
scripts/configure.sh
Normal file
|
@ -0,0 +1,76 @@
|
|||
# Constants
|
||||
NETWORK_IP="10.21.21.0"
|
||||
GATEWAY_IP="10.21.21.1"
|
||||
NGINX_IP="10.21.21.2"
|
||||
NGINX_PORT="80"
|
||||
TIPI_IP="$1"
|
||||
USERNAME="$(whoami)"
|
||||
|
||||
# Apps
|
||||
APP_PI_HOLE_PORT="8081"
|
||||
APP_PI_HOLE_IP="10.21.21.20"
|
||||
|
||||
# Store paths to intermediary config files
|
||||
ANSIBLE_HOSTS_FILE="./templates/ansible-hosts-sample.cfg"
|
||||
ENV_FILE="./templates/.env"
|
||||
|
||||
# Remove intermediary config files
|
||||
[[ -f "$ENV_FILE" ]] && rm -f "$ENV_FILE"
|
||||
[[ -f "$ANSIBLE_HOSTS_FILE" ]] && rm -f "$ANSIBLE_HOSTS_FILE"
|
||||
|
||||
# Copy template configs to intermediary configs
|
||||
[[ -f "./templates/.env-sample" ]] && cp "./templates/.env-sample" "$ENV_FILE"
|
||||
[[ -f "./templates/ansible-hosts-sample.cfg" ]] && cp "./templates/ansible-hosts-sample.cfg" "$ANSIBLE_HOSTS_FILE"
|
||||
|
||||
# Install ansible if not installed
|
||||
if ! command -v ansible > /dev/null; then
|
||||
echo "Installing Ansible..."
|
||||
apt-get update
|
||||
apt-get install -y software-properties-common
|
||||
apt-add-repository -y ppa:ansible/ansible
|
||||
apt-get update
|
||||
apt-get install -y ansible
|
||||
fi
|
||||
|
||||
# Install ssh-keygen if not installed
|
||||
if ! command -v ssh-keygen > /dev/null; then
|
||||
echo "Installing ssh-keygen..."
|
||||
apt-get update
|
||||
apt-get install -y ssh-keygen
|
||||
fi
|
||||
|
||||
# Generate ssh keys
|
||||
if [[ ! -f "~/ssh/id_rsa_tipi" ]]; then
|
||||
echo "Generating ssh keys..."
|
||||
mkdir -p "~/ssh"
|
||||
ssh-keygen -t rsa -b 4096 -f "~/ssh/id_rsa_tipi" -N ""
|
||||
fi
|
||||
|
||||
echo "Generating config files..."
|
||||
for template in "${ENV_FILE}" "${ANSIBLE_HOSTS_FILE}"; do
|
||||
# Umbrel
|
||||
sed -i "s/<network-ip>/${NETWORK_IP}/g" "${template}"
|
||||
sed -i "s/<gateway-ip>/${GATEWAY_IP}/g" "${template}"
|
||||
sed -i "s/<nginx-ip>/${NGINX_IP}/g" "${template}"
|
||||
sed -i "s/<nginx-port>/${NGINX_PORT}/g" "${template}"
|
||||
# Apps
|
||||
sed -i "s/<app-pi-hole-port>/${APP_PI_HOLE_PORT}/g" "${template}"
|
||||
sed -i "s/<app-pi-hole-ip>/${APP_PI_HOLE_IP}/g" "${template}"
|
||||
# Ansible
|
||||
sed -i "s/<host_ip>/${TIPI_IP}/g" "${template}"
|
||||
sed -i "s/<username>/${USERNAME}/g" "${template}"
|
||||
done
|
||||
|
||||
# Copy SSH keys to ansible host
|
||||
echo "Copying SSH keys to tipi server..."
|
||||
ssh-copy-id -i "~/ssh/id_rsa_tipi" "${USERNAME}@${TIPI_IP}"
|
||||
|
||||
mv -f "$ENV_FILE" "./.env"
|
||||
mv -f "$ANSIBLE_HOSTS_FILE" "./ansible/hosts"
|
||||
|
||||
echo "Configuring permissions..."
|
||||
find "$UMBREL_ROOT" -path "$UMBREL_ROOT/app-data" -prune -o -exec chown 1000:1000 {} + || true
|
||||
|
||||
# Run ansible playbook
|
||||
echo "Running Ansible playbook..."
|
||||
ansible-playbook -i "./ansible/hosts" "./ansible/playbook.yml"
|
6
scripts/start.sh
Normal file
6
scripts/start.sh
Normal file
|
@ -0,0 +1,6 @@
|
|||
if [[ $UID != 0 ]]; then
|
||||
echo "Tipi must be started as root"
|
||||
echo "Please re-run this script as"
|
||||
echo " sudo ./scripts/start"
|
||||
exit 1
|
||||
fi
|
10
templates/.env-sample
Normal file
10
templates/.env-sample
Normal file
|
@ -0,0 +1,10 @@
|
|||
#Umbrel
|
||||
NETWORK_IP=<network-ip>
|
||||
GATEWAY_IP=<gateway-ip>
|
||||
NGINX_IP=<nginx-ip>
|
||||
NGINX_PORT=<nginx-port>
|
||||
DASHBOARD_IP=<dashboard-ip>
|
||||
|
||||
# Apps
|
||||
APP_PI_HOLE_PORT=<app-pi-hole-port>
|
||||
APP_PI_HOLE_IP=<app-pi-hole-ip>
|
2
templates/ansible-hosts-sample.cfg
Normal file
2
templates/ansible-hosts-sample.cfg
Normal file
|
@ -0,0 +1,2 @@
|
|||
[home]
|
||||
homeserver ansible_host=<host_ip> ansible_user=<username> ansible_connection=ssh ansible_ssh_private_key_file=<ssh_key_path>
|
31
templates/nginx-sample.conf
Normal file
31
templates/nginx-sample.conf
Normal file
|
@ -0,0 +1,31 @@
|
|||
# Warning: it's not recommended to modify these files directly. Any
|
||||
# modifications you make can break the functionality of your umbrel. These files
|
||||
# are automatically reset with every Umbrel update.
|
||||
|
||||
user nginx;
|
||||
worker_processes 1;
|
||||
|
||||
error_log /dev/stdout info;
|
||||
|
||||
events {
|
||||
worker_connections 1024;
|
||||
}
|
||||
|
||||
http {
|
||||
access_log /dev/stdout;
|
||||
|
||||
proxy_read_timeout 600;
|
||||
|
||||
default_type application/octet-stream;
|
||||
|
||||
server {
|
||||
listen 80;
|
||||
|
||||
location / {
|
||||
proxy_pass http://<dashboard-ip>:3004/;
|
||||
proxy_http_version 1.1;
|
||||
proxy_set_header Upgrade $http_upgrade;
|
||||
proxy_set_header Connection "upgrade";
|
||||
}
|
||||
}
|
||||
}
|
Loading…
Reference in a new issue