├── src ├── __init__.py ├── version.py ├── health_check.py ├── config_diff.py ├── web_gui.py ├── web_gui_dev.py └── unraid_config_guardian.py ├── assets ├── demo_home.png ├── demo_containers.png ├── favicon_io │ ├── favicon.ico │ ├── favicon-16x16.png │ ├── favicon-32x32.png │ ├── apple-touch-icon.png │ ├── android-chrome-192x192.png │ ├── android-chrome-512x512.png │ └── site.webmanifest ├── unraid_guardian_logo.png └── unraid_guardian_logo_template.png ├── config └── config.yml ├── templates ├── error.html ├── containers.html ├── base.html ├── dashboard.html └── backups.html ├── requirements-dev.txt ├── .github ├── ISSUE_TEMPLATE │ ├── feature_request.md │ └── bug_report.md └── workflows │ └── ci-cd.yml ├── .dockerignore ├── requirements.txt ├── .env.example ├── .githooks └── pre-push ├── .gitignore ├── docker ├── refresh-templates.sh └── entrypoint.sh ├── .pre-commit-config.yaml ├── pyproject.toml ├── LICENSE ├── Dockerfile ├── docker-compose.dev.yml ├── docker-compose.yml ├── unraid-template.xml ├── tests └── test_unraid_config_guardian.py ├── docs ├── troubleshooting.md ├── CONTRIBUTING.md └── DEPLOYMENT.md ├── README.md └── Makefile /src/__init__.py: -------------------------------------------------------------------------------- 1 | # Unraid Config Guardian package 2 | -------------------------------------------------------------------------------- /src/version.py: -------------------------------------------------------------------------------- 1 | """ 2 | Version information for Unraid Config Guardian 3 | """ 4 | 5 | __version__ = "1.5.2" 6 | -------------------------------------------------------------------------------- /assets/demo_home.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/stephondoestech/unraid-config-guardian/HEAD/assets/demo_home.png -------------------------------------------------------------------------------- /assets/demo_containers.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/stephondoestech/unraid-config-guardian/HEAD/assets/demo_containers.png -------------------------------------------------------------------------------- /assets/favicon_io/favicon.ico: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/stephondoestech/unraid-config-guardian/HEAD/assets/favicon_io/favicon.ico -------------------------------------------------------------------------------- /assets/unraid_guardian_logo.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/stephondoestech/unraid-config-guardian/HEAD/assets/unraid_guardian_logo.png -------------------------------------------------------------------------------- /assets/favicon_io/favicon-16x16.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/stephondoestech/unraid-config-guardian/HEAD/assets/favicon_io/favicon-16x16.png -------------------------------------------------------------------------------- /assets/favicon_io/favicon-32x32.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/stephondoestech/unraid-config-guardian/HEAD/assets/favicon_io/favicon-32x32.png -------------------------------------------------------------------------------- /assets/favicon_io/apple-touch-icon.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/stephondoestech/unraid-config-guardian/HEAD/assets/favicon_io/apple-touch-icon.png -------------------------------------------------------------------------------- /assets/unraid_guardian_logo_template.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/stephondoestech/unraid-config-guardian/HEAD/assets/unraid_guardian_logo_template.png -------------------------------------------------------------------------------- /assets/favicon_io/android-chrome-192x192.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/stephondoestech/unraid-config-guardian/HEAD/assets/favicon_io/android-chrome-192x192.png -------------------------------------------------------------------------------- /assets/favicon_io/android-chrome-512x512.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/stephondoestech/unraid-config-guardian/HEAD/assets/favicon_io/android-chrome-512x512.png -------------------------------------------------------------------------------- /config/config.yml: -------------------------------------------------------------------------------- 1 | guardian: 2 | backup: 3 | mask_passwords: true 4 | include_system_info: true 5 | output_location: /output 6 | 7 | notifications: 8 | webhook_url: 9 | email: 10 | 11 | debug: true 12 | -------------------------------------------------------------------------------- /assets/favicon_io/site.webmanifest: -------------------------------------------------------------------------------- 1 | {"name":"","short_name":"","icons":[{"src":"/android-chrome-192x192.png","sizes":"192x192","type":"image/png"},{"src":"/android-chrome-512x512.png","sizes":"512x512","type":"image/png"}],"theme_color":"#ffffff","background_color":"#ffffff","display":"standalone"} 2 | -------------------------------------------------------------------------------- /templates/error.html: -------------------------------------------------------------------------------- 1 | {% extends "base.html" %} 2 | 3 | {% block title %}Error - Unraid Config Guardian{% endblock %} 4 | 5 | {% block content %} 6 |
{{ error }}
12 |Overview of all Docker containers on your Unraid server
10 || Name | 32 |Image | 33 |Status | 34 |Ports | 35 |Volumes | 36 |Environment Variables | 37 |
|---|---|---|---|---|---|
| 43 | {{ container.name }} 44 | | 45 |
46 | {{ container.image }}
47 | |
48 | 49 | {% if container.status == 'running' %} 50 | 51 | {{ container.status }} 52 | 53 | {% elif container.status == 'exited' %} 54 | 55 | {{ container.status }} 56 | 57 | {% else %} 58 | 59 | {{ container.status }} 60 | 61 | {% endif %} 62 | | 63 |64 | {% if container.ports %} 65 | {% for port in container.ports %} 66 | {{ port }} 67 | {% endfor %} 68 | {% else %} 69 | None 70 | {% endif %} 71 | | 72 |
73 | {% if container.volumes %}
74 |
80 |
81 | {% for volume in container.volumes %}
82 |
85 | {% else %}
86 | None
87 | {% endif %}
88 | {{ volume }}
83 | {% endfor %}
84 | |
89 |
90 | {% if container.environment %}
91 |
97 |
98 | {% for key, value in container.environment.items() %}
99 |
100 | {{ key }}:
101 | {% if value == '***MASKED***' %}
102 | {{ value }}
103 | {% else %}
104 |
109 | {% else %}
110 | None
111 | {% endif %}
112 | {{ value }}
105 | {% endif %}
106 |
107 | {% endfor %}
108 | |
113 |
6 |
7 | [](https://github.com/stephondoestech/unraid-config-guardian/actions/workflows/ci-cd.yml)
8 | [](https://hub.docker.com/r/stephondoestech/unraid-config-guardian)
9 | [](https://github.com/stephondoestech/unraid-config-guardian/releases)
10 | [](LICENSE)
11 |
12 | **Your Unraid flash drive crashed and you don't have a backup?**
13 |
14 | This tool saves you from complete disaster by automatically documenting your entire Unraid configuration.
15 |
16 |
38 |
39 | ### Container Management
40 |
41 |
42 | Monitor your Unraid server and manage configuration backups
10 |Total Containers
27 |Running
36 |Hostname
45 |Unraid Version
54 || Hostname: | 95 |{{ stats.system_info.hostname }} | 96 |
| Unraid Version: | 99 |{{ stats.system_info.get('unraid_version', 'Unknown') }} | 100 |
| Guardian Version: | 103 |{{ stats.system_info.get('guardian_version', 'Unknown') }} | 104 |
| Last Scan: | 107 |{{ stats.system_info.timestamp[:19] if stats.system_info.timestamp else 'Never' }} | 108 |
| Date: | 123 |{{ stats.last_backup.timestamp[:19] if stats.last_backup.timestamp else 'Unknown' }} | 124 |
| Containers: | 127 |{{ stats.last_backup.containers }} | 128 |
| Size: | 131 |{{ "%.1f"|format(stats.last_backup.size / 1024) }} KB | 132 |
No backups found
136 | 139 | {% endif %} 140 |Download and manage your generated backup files
10 || File | 39 |Size | 40 |Modified | 41 |Actions | 42 |
|---|---|---|---|
| 48 | 49 | {{ backup.name }} 50 | {% if backup.name.endswith('.json') %} 51 | Config 52 | {% elif backup.name.endswith('.yml') %} 53 | Compose 54 | {% elif backup.name.endswith('.sh') %} 55 | Script 56 | {% elif backup.name.endswith('.md') %} 57 | Docs 58 | {% endif %} 59 | | 60 |61 | {% if backup.size < 1024 %} 62 | {{ backup.size }} B 63 | {% elif backup.size < 1024 * 1024 %} 64 | {{ "%.1f"|format(backup.size / 1024) }} KB 65 | {% else %} 66 | {{ "%.1f"|format(backup.size / (1024 * 1024)) }} MB 67 | {% endif %} 68 | | 69 |70 | {{ backup.modified.strftime('%Y-%m-%d %H:%M:%S') }} 71 | | 72 |73 | 74 | Download 75 | 76 | {% if backup.name.endswith(('.json', '.yml', '.md')) %} 77 | 83 | {% endif %} 84 | | 85 |
Complete system configuration including all containers, system info, and metadata.
103 | 104 |NEW! XML templates for native Unraid restore. Extract to templates directory and use "Add Container".
106 | 107 |Docker Compose file for emergency fallback restore (not recommended for Unraid).
109 |Automated restoration script that extracts templates and provides restore options.
113 | 114 |Step-by-step recovery guide with both template and compose restore methods.
116 |Generate your first backup to see files here.
128 | 131 |