This guide provides a complete Ansible playbook to install Beszel using Docker with proper configuration for server monitoring, metrics collection, and web dashboard.
Current Beszel version: Latest (Docker image)
Create a file named beszel.yml:
---
- name: Install and Configure Beszel
hosts: beszel
become: true
vars:
beszel_version: "latest"
beszel_port: 8080
beszel_data_dir: "/opt/beszel/data"
beszel_config_dir: "/opt/beszel/config"
beszel_jwt_secret: "CHANGE-ME-TO-A-RANDOM-JWT-SECRET"
tasks:
- name: Create Beszel directories
file:
path: "{{ item }}"
state: directory
owner: root
group: root
mode: '0755'
loop:
- "{{ beszel_data_dir }}"
- "{{ beszel_config_dir }}"
- name: Create Docker Compose file
copy:
dest: "{{ beszel_data_dir }}/docker-compose.yml"
owner: root
group: root
mode: '0644'
content: |
version: '3.8'
services:
beszel:
image: heybeszel/beszel:{{ beszel_version }}
container_name: beszel
restart: unless-stopped
ports:
- "{{ beszel_port }}:8080"
volumes:
- {{ beszel_data_dir }}/data:/app/data
- {{ beszel_config_dir }}:/app/config
environment:
- JWT_SECRET={{ beszel_jwt_secret }}
- DATA_DIR=/app/data
networks:
- beszel_net
networks:
beszel_net:
driver: bridge
- name: Start Beszel container
community.docker.docker_compose:
project_src: "{{ beszel_data_dir }}"
state: present
build: false
pull: true
- name: Wait for Beszel to start
wait_for:
port: "{{ beszel_port }}"
delay: 5
timeout: 120
- name: Configure firewall (UFW)
ufw:
rule: allow
port: "{{ beszel_port }}"
proto: tcp
comment: "Beszel web interface"
when: ansible_os_family == "Debian"
failed_when: false
- name: Configure firewall (firewalld)
firewalld:
port: "{{ beszel_port }}/tcp"
permanent: true
immediate: true
state: enabled
when: ansible_os_family == "RedHat"
failed_when: false
- name: Verify Beszel is running
uri:
url: "http://localhost:{{ beszel_port }}/api/health"
method: GET
status_code: 200
register: health_check
retries: 3
delay: 5
until: health_check.status == 200
- name: Display Beszel status
debug:
msg: |
Beszel {{ beszel_version }} installed successfully!
Web Interface: http://{{ ansible_default_ipv4.address | default(ansible_host) }}:{{ beszel_port }}
Data directory: {{ beszel_data_dir }}
Config directory: {{ beszel_config_dir }}
IMPORTANT: Create your admin account on first login!
---
beszel:
hosts:
beszel-server:
ansible_host: 192.168.1.123
ansible_user: ansible
ansible_become: true
# Test connectivity
ansible all -i inventory.yml -m ping
# Run the Beszel playbook
ansible-playbook -i inventory.yml beszel.yml
# Run with custom JWT secret
ansible-playbook -i inventory.yml beszel.yml \
-e "beszel_jwt_secret=$(openssl rand -base64 32)"
# Check container status
ssh beszel-server "docker ps | grep beszel"
# View container logs
ssh beszel-server "docker logs beszel"
# Test health endpoint
curl http://beszel-server:8080/api/health
# Access web UI
# http://beszel-server:8080
- name: Configure Beszel agent on monitored hosts
hosts: monitored_hosts
become: true
vars:
beszel_server: "192.168.1.123"
beszel_agent_port: 45874
tasks:
- name: Create Beszel agent directory
file:
path: /opt/beszel-agent
state: directory
mode: '0755'
- name: Create Docker Compose for agent
copy:
dest: /opt/beszel-agent/docker-compose.yml
owner: root
group: root
mode: '0644'
content: |
version: '3.8'
services:
beszel-agent:
image: heybeszel/agent:latest
container_name: beszel-agent
restart: unless-stopped
ports:
- "{{ beszel_agent_port }}:45874"
volumes:
- /var/run/docker.sock:/var/run/docker.sock:ro
- /:/host:ro
environment:
- SERVER_HOST={{ beszel_server }}
- SERVER_PORT={{ beszel_agent_port }}
privileged: true
pid: host
- name: Start Beszel agent
community.docker.docker_compose:
project_src: /opt/beszel-agent
state: present
build: false
pull: true
- name: Configure firewall for agent
ufw:
rule: allow
port: "{{ beszel_agent_port }}"
proto: tcp
comment: "Beszel agent"
when: ansible_os_family == "Debian"
failed_when: false
- name: Backup Beszel data
hosts: beszel
become: true
vars:
beszel_data_dir: "/opt/beszel/data"
backup_dir: "/backup/beszel"
tasks:
- name: Create backup directory
file:
path: "{{ backup_dir }}"
state: directory
mode: '0755'
- name: Backup data directory
archive:
path: "{{ beszel_data_dir }}/data"
dest: "{{ backup_dir }}/data-backup-{{ ansible_date_time.date }}.tar.gz"
- name: Backup configuration
archive:
path: "{{ beszel_config_dir }}"
dest: "{{ backup_dir }}/config-backup-{{ ansible_date_time.date }}.tar.gz"
- name: Clean up old backups (keep 7 days)
find:
paths: "{{ backup_dir }}"
patterns: "*.tar.gz"
age: 7d
register: old_backups
- name: Remove old backups
file:
path: "{{ item.path }}"
state: absent
loop: "{{ old_backups.files }}"
# Check container logs
docker logs beszel
# Check container status
docker ps -a | grep beszel
# Check port binding
docker exec beszel netstat -tlnp | grep 8080
# Check agent logs
docker logs beszel-agent
# Test connectivity
telnet beszel-server 45874
# Check firewall
sudo ufw status | grep 45874
# Check data directory
ls -la /opt/beszel/data/data
# Check database
docker exec beszel ls -la /app/data
# Restart container
docker-compose -f /opt/beszel/data/docker-compose.yml restart
openssl rand -base64 32We develop tailored automation solutions for:
Let’s discuss your requirements: office@linux-server-admin.com | Contact