diff --git a/.gitea/.moko-platform b/.mokogitea/.moko-platform similarity index 100% rename from .gitea/.moko-platform rename to .mokogitea/.moko-platform diff --git a/.gitea/workflows/branch-protection.yml b/.mokogitea/branch-protection.yml similarity index 100% rename from .gitea/workflows/branch-protection.yml rename to .mokogitea/branch-protection.yml diff --git a/.gitea/workflows/bulk-repo-sync.yml b/.mokogitea/bulk-repo-sync.yml similarity index 100% rename from .gitea/workflows/bulk-repo-sync.yml rename to .mokogitea/bulk-repo-sync.yml diff --git a/.gitea/workflows/pr-branch-check.yml b/.mokogitea/pr-branch-check.yml similarity index 100% rename from .gitea/workflows/pr-branch-check.yml rename to .mokogitea/pr-branch-check.yml diff --git a/.gitea/workflows/renovate.yml b/.mokogitea/renovate.yml similarity index 100% rename from .gitea/workflows/renovate.yml rename to .mokogitea/renovate.yml diff --git a/.gitea/workflows/sync-wikis.yml b/.mokogitea/sync-wikis.yml similarity index 100% rename from .gitea/workflows/sync-wikis.yml rename to .mokogitea/sync-wikis.yml diff --git a/composer.json b/composer.json index 1c373a9..c39262f 100644 --- a/composer.json +++ b/composer.json @@ -2,7 +2,7 @@ "name": "mokoconsulting-tech/enterprise", "description": "MokoStandards Enterprise API \u2014 PHP implementation", "type": "library", - "version": "05.00.00", + "version": "05.00.01", "license": "GPL-3.0-or-later", "authors": [ { diff --git a/monitoring/grafana/library-panels/cpu-usage.json b/monitoring/grafana/library-panels/cpu-usage.json new file mode 100644 index 0000000..c260461 --- /dev/null +++ b/monitoring/grafana/library-panels/cpu-usage.json @@ -0,0 +1,85 @@ +{ + "name": "CPU Usage", + "kind": 1, + "model": { + "description": "", + "fieldConfig": { + "defaults": { + "custom": { + "fillOpacity": 20, + "gradientMode": "scheme", + "lineWidth": 2 + }, + "max": 1, + "min": 0, + "thresholds": { + "mode": "absolute", + "steps": [ + { + "color": "green", + "value": null + }, + { + "color": "yellow", + "value": 0.7 + }, + { + "color": "red", + "value": 0.9 + } + ] + }, + "unit": "percentunit" + }, + "overrides": [ + { + "matcher": { + "id": "byName", + "options": "Yesterday CPU" + }, + "properties": [ + { + "id": "custom.lineStyle", + "value": { + "dash": [ + 10, + 10 + ], + "fill": "dash" + } + }, + { + "id": "custom.fillOpacity", + "value": 0 + }, + { + "id": "custom.lineWidth", + "value": 1 + }, + { + "id": "color", + "value": { + "fixedColor": "rgba(255,255,255,0.35)", + "mode": "fixed" + } + } + ] + } + ] + }, + "targets": [ + { + "expr": "1 - avg(rate(node_cpu_seconds_total{mode=\"idle\"}[5m]))", + "legendFormat": "Total CPU", + "refId": "A" + }, + { + "expr": "1 - avg(rate(node_cpu_seconds_total{mode=\"idle\"}[5m] offset 1d))", + "legendFormat": "Yesterday CPU", + "refId": "B" + } + ], + "title": "CPU Usage %", + "type": "timeseries" + } +} \ No newline at end of file diff --git a/monitoring/grafana/library-panels/disk-usage.json b/monitoring/grafana/library-panels/disk-usage.json new file mode 100644 index 0000000..4170794 --- /dev/null +++ b/monitoring/grafana/library-panels/disk-usage.json @@ -0,0 +1,45 @@ +{ + "name": "Disk Usage", + "kind": 1, + "model": { + "description": "", + "fieldConfig": { + "defaults": { + "max": 1, + "min": 0, + "thresholds": { + "mode": "absolute", + "steps": [ + { + "color": "green", + "value": null + }, + { + "color": "yellow", + "value": 0.75 + }, + { + "color": "red", + "value": 0.9 + } + ] + }, + "unit": "percentunit" + } + }, + "targets": [ + { + "expr": "1 - (node_filesystem_avail_bytes{mountpoint=\"/\",fstype!=\"tmpfs\"} / node_filesystem_size_bytes{mountpoint=\"/\",fstype!=\"tmpfs\"})", + "legendFormat": "/ (root)", + "refId": "A" + }, + { + "expr": "1 - (node_filesystem_avail_bytes{mountpoint=\"/mnt/backup\",fstype!=\"tmpfs\"} / node_filesystem_size_bytes{mountpoint=\"/mnt/backup\",fstype!=\"tmpfs\"})", + "legendFormat": "/mnt/backup", + "refId": "B" + } + ], + "title": "Filesystem Usage", + "type": "gauge" + } +} \ No newline at end of file diff --git a/monitoring/grafana/library-panels/docker-container-cpu.json b/monitoring/grafana/library-panels/docker-container-cpu.json new file mode 100644 index 0000000..ef1c149 --- /dev/null +++ b/monitoring/grafana/library-panels/docker-container-cpu.json @@ -0,0 +1,28 @@ +{ + "name": "Docker Container CPU", + "kind": 1, + "model": { + "description": "", + "fieldConfig": { + "defaults": { + "custom": { + "fillOpacity": 20, + "lineWidth": 2, + "stacking": { + "mode": "normal" + } + }, + "unit": "percentunit" + } + }, + "targets": [ + { + "expr": "rate(container_cpu_usage_seconds_total{name!=\"\",name!~\".*POD.*\"}[5m])", + "legendFormat": "{{name}}", + "refId": "A" + } + ], + "title": "CPU Usage by Container", + "type": "timeseries" + } +} \ No newline at end of file diff --git a/monitoring/grafana/library-panels/docker-container-memory.json b/monitoring/grafana/library-panels/docker-container-memory.json new file mode 100644 index 0000000..dd8b411 --- /dev/null +++ b/monitoring/grafana/library-panels/docker-container-memory.json @@ -0,0 +1,28 @@ +{ + "name": "Docker Container Memory", + "kind": 1, + "model": { + "description": "", + "fieldConfig": { + "defaults": { + "custom": { + "fillOpacity": 20, + "lineWidth": 2, + "stacking": { + "mode": "normal" + } + }, + "unit": "bytes" + } + }, + "targets": [ + { + "expr": "container_memory_usage_bytes{name!=\"\",name!~\".*POD.*\"}", + "legendFormat": "{{name}}", + "refId": "A" + } + ], + "title": "Memory Usage by Container", + "type": "timeseries" + } +} \ No newline at end of file diff --git a/monitoring/grafana/library-panels/memory-usage.json b/monitoring/grafana/library-panels/memory-usage.json new file mode 100644 index 0000000..6f33721 --- /dev/null +++ b/monitoring/grafana/library-panels/memory-usage.json @@ -0,0 +1,44 @@ +{ + "name": "Memory Usage", + "kind": 1, + "model": { + "description": "", + "fieldConfig": { + "defaults": { + "custom": { + "fillOpacity": 30, + "lineWidth": 2, + "stacking": { + "group": "A", + "mode": "normal" + } + }, + "unit": "bytes" + } + }, + "targets": [ + { + "expr": "node_memory_MemTotal_bytes - node_memory_MemFree_bytes - node_memory_Buffers_bytes - node_memory_Cached_bytes - node_memory_SReclaimable_bytes", + "legendFormat": "Used", + "refId": "A" + }, + { + "expr": "node_memory_Buffers_bytes", + "legendFormat": "Buffers", + "refId": "B" + }, + { + "expr": "node_memory_Cached_bytes + node_memory_SReclaimable_bytes", + "legendFormat": "Cached", + "refId": "C" + }, + { + "expr": "node_memory_MemFree_bytes", + "legendFormat": "Free", + "refId": "D" + } + ], + "title": "Memory Usage", + "type": "timeseries" + } +} \ No newline at end of file diff --git a/monitoring/grafana/library-panels/mysql-connections.json b/monitoring/grafana/library-panels/mysql-connections.json new file mode 100644 index 0000000..ae16c10 --- /dev/null +++ b/monitoring/grafana/library-panels/mysql-connections.json @@ -0,0 +1,34 @@ +{ + "name": "MySQL Connections", + "kind": 1, + "model": { + "description": "", + "fieldConfig": { + "defaults": { + "custom": { + "fillOpacity": 15, + "lineWidth": 2 + } + } + }, + "targets": [ + { + "expr": "mysql_global_status_threads_connected", + "legendFormat": "Connected", + "refId": "A" + }, + { + "expr": "mysql_global_status_threads_running", + "legendFormat": "Running", + "refId": "B" + }, + { + "expr": "mysql_global_variables_max_connections", + "legendFormat": "Max", + "refId": "C" + } + ], + "title": "Connections", + "type": "timeseries" + } +} \ No newline at end of file diff --git a/monitoring/grafana/library-panels/mysql-queries-per-second.json b/monitoring/grafana/library-panels/mysql-queries-per-second.json new file mode 100644 index 0000000..56a97a7 --- /dev/null +++ b/monitoring/grafana/library-panels/mysql-queries-per-second.json @@ -0,0 +1,65 @@ +{ + "name": "MySQL Queries per Second", + "kind": 1, + "model": { + "description": "", + "fieldConfig": { + "defaults": { + "custom": { + "fillOpacity": 20, + "lineWidth": 2 + }, + "unit": "ops" + }, + "overrides": [ + { + "matcher": { + "id": "byName", + "options": "Yesterday" + }, + "properties": [ + { + "id": "custom.lineStyle", + "value": { + "dash": [ + 10, + 10 + ], + "fill": "dash" + } + }, + { + "id": "custom.fillOpacity", + "value": 0 + }, + { + "id": "custom.lineWidth", + "value": 1 + }, + { + "id": "color", + "value": { + "fixedColor": "rgba(255,255,255,0.35)", + "mode": "fixed" + } + } + ] + } + ] + }, + "targets": [ + { + "expr": "rate(mysql_global_status_queries[5m])", + "legendFormat": "Queries/s", + "refId": "A" + }, + { + "expr": "rate(mysql_global_status_queries[5m] offset 1d)", + "legendFormat": "Yesterday", + "refId": "B" + } + ], + "title": "Queries per Second", + "type": "timeseries" + } +} \ No newline at end of file diff --git a/monitoring/grafana/library-panels/network-traffic.json b/monitoring/grafana/library-panels/network-traffic.json new file mode 100644 index 0000000..82b994e --- /dev/null +++ b/monitoring/grafana/library-panels/network-traffic.json @@ -0,0 +1,75 @@ +{ + "name": "Network Traffic", + "kind": 1, + "model": { + "description": "", + "fieldConfig": { + "defaults": { + "custom": { + "fillOpacity": 20, + "lineWidth": 2 + }, + "unit": "bps" + }, + "overrides": [ + { + "matcher": { + "id": "byRegexp", + "options": "/Yesterday.*/" + }, + "properties": [ + { + "id": "custom.lineStyle", + "value": { + "dash": [ + 10, + 10 + ], + "fill": "dash" + } + }, + { + "id": "custom.fillOpacity", + "value": 0 + }, + { + "id": "custom.lineWidth", + "value": 1 + }, + { + "id": "color", + "value": { + "fixedColor": "rgba(255,255,255,0.35)", + "mode": "fixed" + } + } + ] + } + ] + }, + "targets": [ + { + "expr": "rate(node_network_receive_bytes_total{device!~\"lo|veth.*|br-.*|docker.*\"}[5m]) * 8", + "legendFormat": "RX {{device}}", + "refId": "A" + }, + { + "expr": "-rate(node_network_transmit_bytes_total{device!~\"lo|veth.*|br-.*|docker.*\"}[5m]) * 8", + "legendFormat": "TX {{device}}", + "refId": "B" + }, + { + "expr": "rate(node_network_receive_bytes_total{device!~\"lo|veth.*|br-.*|docker.*\"}[5m] offset 1d) * 8", + "legendFormat": "Yesterday RX {{device}}", + "refId": "C" + }, + { + "expr": "-rate(node_network_transmit_bytes_total{device!~\"lo|veth.*|br-.*|docker.*\"}[5m] offset 1d) * 8", + "legendFormat": "Yesterday TX {{device}}", + "refId": "D" + } + ], + "title": "Network Traffic", + "type": "timeseries" + } +} \ No newline at end of file diff --git a/monitoring/grafana/library-panels/nginx-connections.json b/monitoring/grafana/library-panels/nginx-connections.json new file mode 100644 index 0000000..d6effbf --- /dev/null +++ b/monitoring/grafana/library-panels/nginx-connections.json @@ -0,0 +1,39 @@ +{ + "name": "Nginx Connections", + "kind": 1, + "model": { + "description": "", + "fieldConfig": { + "defaults": { + "custom": { + "fillOpacity": 20, + "lineWidth": 2 + } + } + }, + "targets": [ + { + "expr": "nginx_connections_active", + "legendFormat": "Active", + "refId": "A" + }, + { + "expr": "nginx_connections_reading", + "legendFormat": "Reading", + "refId": "B" + }, + { + "expr": "nginx_connections_writing", + "legendFormat": "Writing", + "refId": "C" + }, + { + "expr": "nginx_connections_waiting", + "legendFormat": "Waiting", + "refId": "D" + } + ], + "title": "Connections Over Time", + "type": "timeseries" + } +} \ No newline at end of file diff --git a/monitoring/grafana/library-panels/nginx-request-rate.json b/monitoring/grafana/library-panels/nginx-request-rate.json new file mode 100644 index 0000000..0544ef6 --- /dev/null +++ b/monitoring/grafana/library-panels/nginx-request-rate.json @@ -0,0 +1,42 @@ +{ + "name": "Nginx Request Rate", + "kind": 1, + "model": { + "description": "", + "fieldConfig": { + "defaults": { + "custom": { + "fillOpacity": 25, + "gradientMode": "scheme", + "lineWidth": 2 + }, + "thresholds": { + "steps": [ + { + "color": "green", + "value": null + }, + { + "color": "yellow", + "value": 50 + }, + { + "color": "red", + "value": 200 + } + ] + }, + "unit": "reqps" + } + }, + "targets": [ + { + "expr": "rate(nginx_http_requests_total[5m])", + "legendFormat": "Requests/s", + "refId": "A" + } + ], + "title": "Request Rate", + "type": "timeseries" + } +} \ No newline at end of file diff --git a/monitoring/grafana/library-panels/response-time.json b/monitoring/grafana/library-panels/response-time.json new file mode 100644 index 0000000..eded845 --- /dev/null +++ b/monitoring/grafana/library-panels/response-time.json @@ -0,0 +1,45 @@ +{ + "name": "Response Time", + "kind": 1, + "model": { + "datasource": { + "type": "prometheus", + "uid": "PBFA97CFB590B2093" + }, + "description": "", + "fieldConfig": { + "defaults": { + "unit": "s" + } + }, + "options": { + "legend": { + "displayMode": "list", + "placement": "bottom" + }, + "tooltip": { + "mode": "multi" + } + }, + "targets": [ + { + "datasource": { + "type": "prometheus", + "uid": "PBFA97CFB590B2093" + }, + "expr": "probe_http_duration_seconds{site_name=~\"$site\", job=\"blackbox-http\", phase=\"transfer\"}", + "legendFormat": "{{site_name}} transfer" + }, + { + "datasource": { + "type": "prometheus", + "uid": "PBFA97CFB590B2093" + }, + "expr": "probe_http_duration_seconds{site_name=~\"$site\", job=\"blackbox-http\", phase=\"processing\"}", + "legendFormat": "{{site_name}} processing" + } + ], + "title": "Response Time", + "type": "timeseries" + } +} \ No newline at end of file diff --git a/monitoring/grafana/library-panels/service-health.json b/monitoring/grafana/library-panels/service-health.json new file mode 100644 index 0000000..94f25c6 --- /dev/null +++ b/monitoring/grafana/library-panels/service-health.json @@ -0,0 +1,64 @@ +{ + "name": "Service Health", + "kind": 1, + "model": { + "description": "", + "fieldConfig": { + "defaults": {}, + "overrides": [ + { + "matcher": { + "id": "byName", + "options": "Value" + }, + "properties": [ + { + "id": "mappings", + "value": [ + { + "options": { + "0": { + "color": "red", + "text": "DOWN" + }, + "1": { + "color": "green", + "text": "UP" + } + }, + "type": "value" + } + ] + } + ] + } + ] + }, + "targets": [ + { + "expr": "up", + "format": "table", + "instant": true, + "refId": "A" + } + ], + "title": "Scrape Target Health", + "transformations": [ + { + "id": "organize", + "options": { + "excludeByName": { + "Time": true, + "__name__": true + }, + "renameByName": { + "Value": "Status", + "instance": "Instance", + "job": "Service" + } + } + } + ], + "type": "table" + } +} \ No newline at end of file diff --git a/monitoring/grafana/library-panels/ssl-certificate-expiry.json b/monitoring/grafana/library-panels/ssl-certificate-expiry.json new file mode 100644 index 0000000..f068ba8 --- /dev/null +++ b/monitoring/grafana/library-panels/ssl-certificate-expiry.json @@ -0,0 +1,68 @@ +{ + "name": "SSL Certificate Expiry", + "kind": 1, + "model": { + "description": "", + "fieldConfig": { + "defaults": { + "custom": { + "drawStyle": "line", + "fillOpacity": 10, + "lineWidth": 2, + "spanNulls": false, + "thresholdsStyle": { + "mode": "area" + } + }, + "decimals": 0, + "thresholds": { + "mode": "absolute", + "steps": [ + { + "color": "red", + "value": null + }, + { + "color": "yellow", + "value": 7 + }, + { + "color": "green", + "value": 30 + } + ] + }, + "unit": "short" + }, + "overrides": [] + }, + "options": { + "legend": { + "calcs": [ + "lastNotNull", + "min" + ], + "displayMode": "table", + "placement": "bottom" + }, + "tooltip": { + "mode": "multi", + "sort": "desc" + } + }, + "targets": [ + { + "expr": "moko_ssl_cert_expiry_seconds{domain=\"git.mokoconsulting.tech\"} / 86400", + "legendFormat": "git.mokoconsulting.tech \u2014 days", + "refId": "A" + }, + { + "expr": "moko_ssl_cert_expiry_seconds{domain=\"ntfy.mokoconsulting.tech\"} / 86400", + "legendFormat": "ntfy.mokoconsulting.tech \u2014 days", + "refId": "B" + } + ], + "title": "Certificate Expiry Timeline", + "type": "timeseries" + } +} \ No newline at end of file diff --git a/monitoring/grafana/library-panels/uptime-availability.json b/monitoring/grafana/library-panels/uptime-availability.json new file mode 100644 index 0000000..292b6ed --- /dev/null +++ b/monitoring/grafana/library-panels/uptime-availability.json @@ -0,0 +1,59 @@ +{ + "name": "Uptime Availability", + "kind": 1, + "model": { + "datasource": { + "type": "prometheus", + "uid": "PBFA97CFB590B2093" + }, + "description": "", + "fieldConfig": { + "defaults": { + "custom": { + "fillOpacity": 10, + "lineWidth": 2 + }, + "max": 1, + "min": 0, + "thresholds": { + "steps": [ + { + "color": "red", + "value": 0 + }, + { + "color": "yellow", + "value": 0.95 + }, + { + "color": "green", + "value": 0.99 + } + ] + }, + "unit": "percentunit" + } + }, + "options": { + "legend": { + "displayMode": "list", + "placement": "bottom" + }, + "tooltip": { + "mode": "single" + } + }, + "targets": [ + { + "datasource": { + "type": "prometheus", + "uid": "PBFA97CFB590B2093" + }, + "expr": "avg_over_time(probe_success{site_name=~\"$site\", job=\"blackbox-http\"}[1h])", + "legendFormat": "{{site_name}}" + } + ], + "title": "Availability (30d)", + "type": "timeseries" + } +} \ No newline at end of file diff --git a/monitoring/grafana/moko-waas-dashboard.json b/monitoring/grafana/moko-waas-dashboard.json index 30edeb4..8aa703e 100644 --- a/monitoring/grafana/moko-waas-dashboard.json +++ b/monitoring/grafana/moko-waas-dashboard.json @@ -1,5 +1,5 @@ { - "description": "Unified Panopticon monitoring for all Joomla client sites", + "description": "MokoWaaS endpoint monitoring — site health, Joomla core & extensions, backups, performance, and uptime", "editable": true, "panels": [ { @@ -15,586 +15,271 @@ "type": "row" }, { - "datasource": { - "type": "prometheus", - "uid": "PBFA97CFB590B2093" - }, + "datasource": { "type": "prometheus", "uid": "PBFA97CFB590B2093" }, "fieldConfig": { "defaults": { - "mappings": [ - { - "options": { - "0": { - "color": "red", - "text": "DOWN" - }, - "1": { - "color": "green", - "text": "UP" - } - }, - "type": "value" - } - ], - "thresholds": { - "steps": [ - { - "color": "red", - "value": 0 - }, - { - "color": "green", - "value": 1 - } + "noValue": "—", + "custom": { "align": "center", "cellOptions": { "type": "auto" } } + }, + "overrides": [ + { + "matcher": { "id": "byName", "options": "Site" }, + "properties": [ + { "id": "custom.width", "value": 300 }, + { "id": "custom.align", "value": "left" }, + { "id": "links", "value": [{ "title": "Open Site", "url": "${__value.text}", "targetBlank": true }] } + ] + }, + { + "matcher": { "id": "byName", "options": "Online" }, + "properties": [ + { "id": "mappings", "value": [{ "options": { "0": { "color": "orange", "text": "OFFLINE" }, "1": { "color": "green", "text": "ONLINE" } }, "type": "value" }] }, + { "id": "thresholds", "value": { "mode": "absolute", "steps": [{ "color": "orange", "value": null }, { "color": "green", "value": 1 }] } }, + { "id": "custom.cellOptions", "value": { "type": "color-background", "mode": "basic" } } + ] + }, + { + "matcher": { "id": "byName", "options": "Status" }, + "properties": [ + { "id": "mappings", "value": [{ "options": { "0": { "color": "red", "text": "DOWN" }, "1": { "color": "green", "text": "UP" } }, "type": "value" }] }, + { "id": "thresholds", "value": { "mode": "absolute", "steps": [{ "color": "red", "value": null }, { "color": "green", "value": 1 }] } }, + { "id": "custom.cellOptions", "value": { "type": "color-background", "mode": "basic" } } + ] + }, + { + "matcher": { "id": "byName", "options": "HTTP" }, + "properties": [ + { "id": "thresholds", "value": { "mode": "absolute", "steps": [{ "color": "red", "value": null }, { "color": "green", "value": 200 }, { "color": "yellow", "value": 300 }, { "color": "orange", "value": 400 }, { "color": "red", "value": 500 }] } }, + { "id": "custom.cellOptions", "value": { "type": "color-background", "mode": "basic" } }, + { "id": "links", "value": [{ "title": "HTTP Status Code Reference", "url": "https://en.wikipedia.org/wiki/List_of_HTTP_status_codes#${__value.raw}", "targetBlank": true }] } + ] + }, + { + "matcher": { "id": "byName", "options": "API" }, + "properties": [ + { "id": "mappings", "value": [{ "options": { "0": { "color": "red", "text": "NO" }, "1": { "color": "green", "text": "OK" } }, "type": "value" }] }, + { "id": "thresholds", "value": { "mode": "absolute", "steps": [{ "color": "red", "value": null }, { "color": "green", "value": 1 }] } }, + { "id": "custom.cellOptions", "value": { "type": "color-background", "mode": "basic" } } + ] + }, + { + "matcher": { "id": "byName", "options": "SSL" }, + "properties": [ + { "id": "decimals", "value": 0 }, + { "id": "unit", "value": "d" }, + { "id": "thresholds", "value": { "mode": "absolute", "steps": [{ "color": "red", "value": null }, { "color": "yellow", "value": 14 }, { "color": "green", "value": 30 }] } }, + { "id": "custom.cellOptions", "value": { "type": "color-text" } } + ] + }, + { + "matcher": { "id": "byName", "options": "Last Scrape" }, + "properties": [ + { "id": "unit", "value": "dateTimeFromNow" } ] } - } - }, - "gridPos": { - "x": 0, - "y": 1, - "w": 12, - "h": 4 + ] }, + "gridPos": { "x": 0, "y": 1, "w": 24, "h": 8 }, "id": 1, - "options": { - "colorMode": "background", - "graphMode": "none" - }, + "options": { "showHeader": true, "cellHeight": "sm", "footer": { "show": false } }, "targets": [ { - "datasource": { - "type": "prometheus", - "uid": "PBFA97CFB590B2093" - }, - "expr": "probe_success{site_name=~\"$site\", job=\"blackbox-http\"}", - "legendFormat": "{{site_name}}" - } - ], - "title": "Site Status", - "type": "stat" - }, - { - "datasource": { - "type": "prometheus", - "uid": "PBFA97CFB590B2093" - }, - "fieldConfig": { - "defaults": { - "mappings": [ - { - "options": { - "0": { - "color": "orange", - "text": "OFFLINE" - }, - "1": { - "color": "green", - "text": "ONLINE" - } - }, - "type": "value" - } - ], - "noValue": "N/A", - "thresholds": { - "steps": [ - { - "color": "orange", - "value": 0 - }, - { - "color": "green", - "value": 1 - } - ] - } - } - }, - "gridPos": { - "x": 12, - "y": 1, - "w": 12, - "h": 4 - }, - "id": 2, - "options": { - "colorMode": "background", - "graphMode": "none" - }, - "targets": [ + "datasource": { "type": "prometheus", "uid": "PBFA97CFB590B2093" }, + "expr": "probe_success{site_name=~\"$site\", job=\"blackbox-http\"} and on(site_name) label_replace(joomla_site_online{site=~\"$site\"} == 1, \"site_name\", \"$1\", \"site\", \"(.+)\")", + "instant": true, "format": "table", "refId": "STATUS" + }, { - "datasource": { - "type": "prometheus", - "uid": "PBFA97CFB590B2093" - }, - "expr": "joomla_site_online{site=~\"$site\"}", - "legendFormat": "{{site}}" - } - ], - "title": "Joomla Online", - "type": "stat" - }, - { - "datasource": { - "type": "prometheus", - "uid": "PBFA97CFB590B2093" - }, - "fieldConfig": { - "defaults": { - "thresholds": { - "steps": [ - { - "color": "red", - "value": 0 - }, - { - "color": "green", - "value": 200 - }, - { - "color": "yellow", - "value": 300 - }, - { - "color": "orange", - "value": 400 - }, - { - "color": "red", - "value": 500 - } - ] - } - } - }, - "gridPos": { - "x": 0, - "y": 5, - "w": 12, - "h": 4 - }, - "id": 3, - "options": { - "colorMode": "background", - "graphMode": "none" - }, - "targets": [ + "datasource": { "type": "prometheus", "uid": "PBFA97CFB590B2093" }, + "expr": "label_replace(probe_http_status_code{site_name=~\"$site\", job=\"blackbox-http\"}, \"site_url\", \"$1\", \"instance\", \"(.+)\")", + "instant": true, "format": "table", "refId": "HTTP" + }, { - "datasource": { - "type": "prometheus", - "uid": "PBFA97CFB590B2093" - }, - "expr": "probe_http_status_code{site_name=~\"$site\", job=\"blackbox-http\"}", - "legendFormat": "{{site_name}}" - } - ], - "title": "HTTP Status", - "type": "stat" - }, - { - "datasource": { - "type": "prometheus", - "uid": "PBFA97CFB590B2093" - }, - "fieldConfig": { - "defaults": { - "decimals": 0, - "thresholds": { - "steps": [ - { - "color": "red", - "value": 0 - }, - { - "color": "yellow", - "value": 14 - }, - { - "color": "green", - "value": 30 - } - ] - }, - "unit": "d" - } - }, - "gridPos": { - "x": 12, - "y": 5, - "w": 12, - "h": 4 - }, - "id": 4, - "options": { - "colorMode": "background", - "graphMode": "none" - }, - "targets": [ + "datasource": { "type": "prometheus", "uid": "PBFA97CFB590B2093" }, + "expr": "label_replace(joomla_site_online{site=~\"$site\"}, \"site_name\", \"$1\", \"site\", \"(.+)\")", + "instant": true, "format": "table", "refId": "ONLINE" + }, { - "datasource": { - "type": "prometheus", - "uid": "PBFA97CFB590B2093" - }, + "datasource": { "type": "prometheus", "uid": "PBFA97CFB590B2093" }, + "expr": "label_replace(joomla_site_api_reachable{site=~\"$site\"}, \"site_name\", \"$1\", \"site\", \"(.+)\") and on(site_name) label_replace(joomla_site_online{site=~\"$site\"} == 1, \"site_name\", \"$1\", \"site\", \"(.+)\")", + "instant": true, "format": "table", "refId": "API" + }, + { + "datasource": { "type": "prometheus", "uid": "PBFA97CFB590B2093" }, "expr": "(probe_ssl_earliest_cert_expiry{site_name=~\"$site\"} - time()) / 86400", - "legendFormat": "{{site_name}}" + "instant": true, "format": "table", "refId": "SSL" + }, + { + "datasource": { "type": "prometheus", "uid": "PBFA97CFB590B2093" }, + "expr": "label_replace(joomla_monitor_last_scrape{site=~\"$site\"} * 1000, \"site_name\", \"$1\", \"site\", \"(.+)\")", + "instant": true, "format": "table", "refId": "LASTSCRAPE" } ], - "title": "SSL Days", - "type": "stat" - }, - { - "datasource": { - "type": "prometheus", - "uid": "PBFA97CFB590B2093" - }, - "fieldConfig": { - "defaults": { - "mappings": [ - { - "options": { - "0": { - "color": "red", - "text": "NO" - }, - "1": { - "color": "green", - "text": "OK" - } - }, - "type": "value" - } - ], - "noValue": "N/A", - "thresholds": { - "steps": [ - { - "color": "red", - "value": 0 - }, - { - "color": "green", - "value": 1 - } - ] + "transformations": [ + { "id": "joinByField", "options": { "byField": "site_name", "mode": "outer" } }, + { + "id": "filterFieldsByName", + "options": { + "include": { "pattern": "^(site_url|Value #).*" } } - } - }, - "gridPos": { - "x": 0, - "y": 9, - "w": 12, - "h": 4 - }, - "id": 5, - "options": { - "colorMode": "background", - "graphMode": "none" - }, - "targets": [ + }, { - "datasource": { - "type": "prometheus", - "uid": "PBFA97CFB590B2093" - }, - "expr": "joomla_site_api_reachable{site=~\"$site\"}", - "legendFormat": "{{site}}" - } + "id": "organize", + "options": { + "renameByName": { + "site_url": "Site", + "Value #ONLINE": "Online", + "Value #STATUS": "Status", + "Value #HTTP": "HTTP", + "Value #API": "API", + "Value #SSL": "SSL", + "Value #LASTSCRAPE": "Last Scrape" + }, + "indexByName": { + "site_url": 0, + "Value #ONLINE": 1, + "Value #STATUS": 2, + "Value #HTTP": 3, + "Value #API": 4, + "Value #SSL": 5, + "Value #LASTSCRAPE": 6 + } + } + }, + { "id": "sortBy", "options": { "sort": [{ "field": "Site", "desc": false }] } } ], - "title": "API Reachable", - "type": "stat" + "title": "Site Health", + "type": "table" }, { - "datasource": { - "type": "prometheus", - "uid": "PBFA97CFB590B2093" - }, - "fieldConfig": { - "defaults": { - "noValue": "Never", - "thresholds": { - "steps": [ - { - "color": "green", - "value": null - } - ] - }, - "unit": "dateTimeFromNow" - } - }, - "gridPos": { - "x": 12, - "y": 9, - "w": 12, - "h": 4 - }, - "id": 6, - "options": { - "colorMode": "value", - "graphMode": "none" - }, - "targets": [ - { - "datasource": { - "type": "prometheus", - "uid": "PBFA97CFB590B2093" - }, - "expr": "joomla_monitor_last_scrape{site=~\"$site\"} * 1000", - "legendFormat": "{{site}}" - } - ], - "title": "Last Check", - "type": "stat" - }, - { - "collapsed": false, + "collapsed": true, "gridPos": { "h": 1, "w": 24, "x": 0, - "y": 13 + "y": 25 }, "id": 101, "title": "Joomla Core & Updates", - "type": "row" - }, + "type": "row", + "panels": [ { - "datasource": { - "type": "prometheus", - "uid": "PBFA97CFB590B2093" - }, + "datasource": { "type": "prometheus", "uid": "PBFA97CFB590B2093" }, "fieldConfig": { "defaults": { - "thresholds": { - "steps": [ - { - "color": "blue", - "value": null - } + "noValue": "—", + "custom": { "align": "center", "cellOptions": { "type": "auto" } } + }, + "overrides": [ + { + "matcher": { "id": "byName", "options": "Site" }, + "properties": [ + { "id": "custom.width", "value": 300 }, + { "id": "custom.align", "value": "left" }, + { "id": "links", "value": [{ "title": "Open Admin", "url": "${__value.text}/administrator/", "targetBlank": true }] } + ] + }, + { + "matcher": { "id": "byName", "options": "System" }, + "properties": [ + { "id": "mappings", "value": [{ "options": { "0": { "color": "green", "text": "CURRENT" }, "1": { "color": "red", "text": "UPDATE" } }, "type": "value" }] }, + { "id": "thresholds", "value": { "mode": "absolute", "steps": [{ "color": "green", "value": null }, { "color": "red", "value": 1 }] } }, + { "id": "custom.cellOptions", "value": { "type": "color-background", "mode": "basic" } } + ] + }, + { + "matcher": { "id": "byName", "options": "Ext Updates" }, + "properties": [ + { "id": "thresholds", "value": { "mode": "absolute", "steps": [{ "color": "green", "value": null }, { "color": "red", "value": 1 }] } }, + { "id": "custom.cellOptions", "value": { "type": "color-text" } }, + { "id": "mappings", "value": [{ "options": { "0": { "text": "—" } }, "type": "value" }] } + ] + }, + { + "matcher": { "id": "byName", "options": "Total" }, + "properties": [ + { "id": "mappings", "value": [{ "options": { "0": { "text": "—" } }, "type": "value" }] } + ] + }, + { + "matcher": { "id": "byName", "options": "Enabled" }, + "properties": [ + { "id": "mappings", "value": [{ "options": { "0": { "text": "—" } }, "type": "value" }] }, + { "id": "thresholds", "value": { "mode": "absolute", "steps": [{ "color": "green", "value": null }] } }, + { "id": "custom.cellOptions", "value": { "type": "color-text" } } + ] + }, + { + "matcher": { "id": "byName", "options": "Disabled" }, + "properties": [ + { "id": "mappings", "value": [{ "options": { "0": { "text": "—" } }, "type": "value" }] }, + { "id": "thresholds", "value": { "mode": "absolute", "steps": [{ "color": "green", "value": null }, { "color": "yellow", "value": 5 }, { "color": "orange", "value": 20 }] } }, + { "id": "custom.cellOptions", "value": { "type": "color-text" } } ] } - } - }, - "gridPos": { - "x": 0, - "y": 14, - "w": 12, - "h": 4 + ] }, + "gridPos": { "x": 0, "y": 26, "w": 24, "h": 8 }, "id": 10, - "options": { - "colorMode": "background", - "graphMode": "none", - "textMode": "name" - }, + "options": { "showHeader": true, "cellHeight": "sm", "footer": { "show": false } }, "targets": [ { - "datasource": { - "type": "prometheus", - "uid": "PBFA97CFB590B2093" - }, - "expr": "joomla_core_version_info{site=~\"$site\"}", - "legendFormat": "{{site}} {{version}}" - } - ], - "title": "Joomla Version", - "type": "stat" - }, - { - "datasource": { - "type": "prometheus", - "uid": "PBFA97CFB590B2093" - }, - "fieldConfig": { - "defaults": { - "mappings": [ - { - "options": { - "0": { - "color": "green", - "text": "CURRENT" - }, - "1": { - "color": "red", - "text": "UPDATE" - } - }, - "type": "value" - } - ], - "noValue": "?", - "thresholds": { - "steps": [ - { - "color": "green", - "value": 0 - }, - { - "color": "red", - "value": 1 - } - ] - } - } - }, - "gridPos": { - "x": 12, - "y": 14, - "w": 12, - "h": 4 - }, - "id": 11, - "options": { - "colorMode": "background", - "graphMode": "none" - }, - "targets": [ + "datasource": { "type": "prometheus", "uid": "PBFA97CFB590B2093" }, + "expr": "label_replace(joomla_core_version_info{site=~\"$site\"}, \"site_url\", \"$1\", \"exported_instance\", \"(.+)\")", + "instant": true, "format": "table", "refId": "VERSION" + }, { - "datasource": { - "type": "prometheus", - "uid": "PBFA97CFB590B2093" - }, - "expr": "joomla_core_update_available{site=~\"$site\"}", - "legendFormat": "{{site}}" - } - ], - "title": "Core Update", - "type": "stat" - }, - { - "datasource": { - "type": "prometheus", - "uid": "PBFA97CFB590B2093" - }, - "fieldConfig": { - "defaults": { - "noValue": "N/A", - "thresholds": { - "steps": [ - { - "color": "blue", - "value": null - } - ] - } - } - }, - "gridPos": { - "x": 0, - "y": 18, - "w": 12, - "h": 4 - }, - "id": 12, - "options": { - "colorMode": "value", - "graphMode": "none" - }, - "targets": [ + "datasource": { "type": "prometheus", "uid": "PBFA97CFB590B2093" }, + "expr": "max by (site) (joomla_core_update_available{site=~\"$site\"})", + "instant": true, "format": "table", "refId": "SYSTEM" + }, { - "datasource": { - "type": "prometheus", - "uid": "PBFA97CFB590B2093" - }, + "datasource": { "type": "prometheus", "uid": "PBFA97CFB590B2093" }, + "expr": "joomla_extensions_update_count{site=~\"$site\"} or joomla_extensions_total{site=~\"$site\"} * 0", + "instant": true, "format": "table", "refId": "EXTUPDATES" + }, + { + "datasource": { "type": "prometheus", "uid": "PBFA97CFB590B2093" }, "expr": "joomla_extensions_total{site=~\"$site\"}", - "legendFormat": "{{site}}" - } - ], - "title": "Extensions", - "type": "stat" - }, - { - "datasource": { - "type": "prometheus", - "uid": "PBFA97CFB590B2093" - }, - "fieldConfig": { - "defaults": { - "noValue": "N/A", - "thresholds": { - "steps": [ - { - "color": "green", - "value": null - } - ] - } - } - }, - "gridPos": { - "x": 12, - "y": 18, - "w": 12, - "h": 4 - }, - "id": 13, - "options": { - "colorMode": "value", - "graphMode": "none" - }, - "targets": [ + "instant": true, "format": "table", "refId": "TOTAL" + }, { - "datasource": { - "type": "prometheus", - "uid": "PBFA97CFB590B2093" - }, + "datasource": { "type": "prometheus", "uid": "PBFA97CFB590B2093" }, "expr": "joomla_extensions_enabled{site=~\"$site\"}", - "legendFormat": "{{site}}" - } - ], - "title": "Enabled", - "type": "stat" - }, - { - "datasource": { - "type": "prometheus", - "uid": "PBFA97CFB590B2093" - }, - "fieldConfig": { - "defaults": { - "noValue": "N/A", - "thresholds": { - "steps": [ - { - "color": "green", - "value": 0 - }, - { - "color": "yellow", - "value": 5 - }, - { - "color": "orange", - "value": 20 - } - ] - } - } - }, - "gridPos": { - "x": 0, - "y": 22, - "w": 12, - "h": 4 - }, - "id": 14, - "options": { - "colorMode": "value", - "graphMode": "none" - }, - "targets": [ + "instant": true, "format": "table", "refId": "ENABLED" + }, { - "datasource": { - "type": "prometheus", - "uid": "PBFA97CFB590B2093" - }, + "datasource": { "type": "prometheus", "uid": "PBFA97CFB590B2093" }, "expr": "joomla_extensions_disabled{site=~\"$site\"}", - "legendFormat": "{{site}}" + "instant": true, "format": "table", "refId": "DISABLED" } ], - "title": "Disabled", - "type": "stat" + "transformations": [ + { "id": "joinByField", "options": { "byField": "site", "mode": "outer" } }, + { "id": "filterFieldsByName", "options": { "include": { "pattern": "^(site_url|version|Value #).*" } } }, + { + "id": "organize", + "options": { + "renameByName": { + "site_url": "Site", + "version": "Version", + "Value #VERSION": "v_hidden", + "Value #SYSTEM": "System", + "Value #EXTUPDATES": "Ext Updates", + "Value #TOTAL": "Total", + "Value #ENABLED": "Enabled", + "Value #DISABLED": "Disabled" + }, + "excludeByName": { + "v_hidden": true + } + } + }, + { "id": "sortBy", "options": { "sort": [{ "field": "Site", "desc": false }] } } + ], + "title": "Joomla Core & Extensions", + "type": "table" + } + ] }, { "collapsed": false, @@ -602,7 +287,7 @@ "h": 1, "w": 24, "x": 0, - "y": 26 + "y": 46 }, "id": 102, "title": "Performance", @@ -622,7 +307,7 @@ "h": 8, "w": 16, "x": 0, - "y": 27 + "y": 47 }, "id": 20, "options": { @@ -687,7 +372,7 @@ "h": 8, "w": 8, "x": 16, - "y": 27 + "y": 47 }, "id": 22, "targets": [ @@ -709,169 +394,91 @@ "h": 1, "w": 24, "x": 0, - "y": 35 + "y": 55 }, "id": 104, "title": "Backup Status", "type": "row" }, { - "datasource": { - "type": "prometheus", - "uid": "PBFA97CFB590B2093" - }, + "datasource": { "type": "prometheus", "uid": "PBFA97CFB590B2093" }, "fieldConfig": { "defaults": { - "mappings": [ - { - "options": { - "0": { - "color": "red", - "text": "FAILED" - }, - "1": { - "color": "green", - "text": "OK" - } - }, - "type": "value" - } - ], - "noValue": "No Data", - "thresholds": { - "steps": [ - { - "color": "red", - "value": 0 - }, - { - "color": "green", - "value": 1 - } + "noValue": "—", + "custom": { "align": "center", "cellOptions": { "type": "auto" } } + }, + "overrides": [ + { + "matcher": { "id": "byName", "options": "Site" }, + "properties": [ + { "id": "custom.width", "value": 300 }, + { "id": "custom.align", "value": "left" }, + { "id": "links", "value": [{ "title": "Manage Backups", "url": "${__value.text}/administrator/index.php?option=com_akeebabackup&view=Manage", "targetBlank": true }] } + ] + }, + { + "matcher": { "id": "byName", "options": "Status" }, + "properties": [ + { "id": "mappings", "value": [{ "options": { "0": { "color": "red", "text": "FAILED" }, "1": { "color": "green", "text": "OK" } }, "type": "value" }] }, + { "id": "thresholds", "value": { "mode": "absolute", "steps": [{ "color": "red", "value": null }, { "color": "green", "value": 1 }] } }, + { "id": "custom.cellOptions", "value": { "type": "color-background", "mode": "basic" } } + ] + }, + { + "matcher": { "id": "byName", "options": "Age" }, + "properties": [ + { "id": "unit", "value": "s" }, + { "id": "thresholds", "value": { "mode": "absolute", "steps": [{ "color": "green", "value": null }, { "color": "yellow", "value": 172800 }, { "color": "red", "value": 604800 }] } }, + { "id": "custom.cellOptions", "value": { "type": "color-text" } }, + { "id": "mappings", "value": [{ "options": { "-1": { "text": "—" } }, "type": "value" }] } + ] + }, + { + "matcher": { "id": "byName", "options": "Records" }, + "properties": [ + { "id": "mappings", "value": [{ "options": { "0": { "text": "—" } }, "type": "value" }] } ] } - } - }, - "gridPos": { - "x": 0, - "y": 36, - "w": 12, - "h": 4 + ] }, + "gridPos": { "x": 0, "y": 56, "w": 24, "h": 8 }, "id": 40, - "options": { - "colorMode": "background", - "graphMode": "none" - }, + "options": { "showHeader": true, "cellHeight": "sm", "footer": { "show": false } }, "targets": [ { - "datasource": { - "type": "prometheus", - "uid": "PBFA97CFB590B2093" - }, - "expr": "joomla_backup_status{site=~\"$site\"}", - "legendFormat": "{{site}}" - } - ], - "title": "Last Backup", - "type": "stat" - }, - { - "datasource": { - "type": "prometheus", - "uid": "PBFA97CFB590B2093" - }, - "fieldConfig": { - "defaults": { - "noValue": "?", - "thresholds": { - "steps": [ - { - "color": "green", - "value": 0 - }, - { - "color": "yellow", - "value": 172800 - }, - { - "color": "red", - "value": 604800 - } - ] - }, - "unit": "s" - } - }, - "gridPos": { - "x": 12, - "y": 36, - "w": 12, - "h": 4 - }, - "id": 41, - "options": { - "colorMode": "value", - "graphMode": "none" - }, - "targets": [ + "datasource": { "type": "prometheus", "uid": "PBFA97CFB590B2093" }, + "expr": "label_replace(max by (site, exported_instance) (joomla_backup_status{site=~\"$site\"}), \"site_url\", \"$1\", \"exported_instance\", \"(.+)\")", + "instant": true, "format": "table", "refId": "STATUS" + }, { - "datasource": { - "type": "prometheus", - "uid": "PBFA97CFB590B2093" - }, + "datasource": { "type": "prometheus", "uid": "PBFA97CFB590B2093" }, "expr": "joomla_backup_age_seconds{site=~\"$site\"}", - "legendFormat": "{{site}}" - } - ], - "title": "Backup Age", - "type": "stat" - }, - { - "datasource": { - "type": "prometheus", - "uid": "PBFA97CFB590B2093" - }, - "fieldConfig": { - "defaults": { - "noValue": "N/A", - "thresholds": { - "steps": [ - { - "color": "red", - "value": 0 - }, - { - "color": "green", - "value": 1 - } - ] - } - } - }, - "gridPos": { - "x": 0, - "y": 40, - "w": 12, - "h": 4 - }, - "id": 42, - "options": { - "colorMode": "value", - "graphMode": "none" - }, - "targets": [ + "instant": true, "format": "table", "refId": "AGE" + }, { - "datasource": { - "type": "prometheus", - "uid": "PBFA97CFB590B2093" - }, + "datasource": { "type": "prometheus", "uid": "PBFA97CFB590B2093" }, "expr": "joomla_backup_records_total{site=~\"$site\"}", - "legendFormat": "{{site}}" + "instant": true, "format": "table", "refId": "RECORDS" } ], - "title": "Records", - "type": "stat" + "transformations": [ + { "id": "joinByField", "options": { "byField": "site", "mode": "outer" } }, + { "id": "filterFieldsByName", "options": { "include": { "pattern": "^(site_url|Value #).*" } } }, + { + "id": "organize", + "options": { + "renameByName": { + "site_url": "Site", + "Value #STATUS": "Status", + "Value #AGE": "Age", + "Value #RECORDS": "Records" + } + } + }, + { "id": "sortBy", "options": { "sort": [{ "field": "Site", "desc": false }] } } + ], + "title": "Backup Status", + "type": "table" }, { "collapsed": false, @@ -879,7 +486,7 @@ "h": 1, "w": 24, "x": 0, - "y": 44 + "y": 68 }, "id": 103, "title": "Uptime History", @@ -921,7 +528,7 @@ "h": 8, "w": 24, "x": 0, - "y": 45 + "y": 69 }, "id": 30, "options": { @@ -968,7 +575,7 @@ "label": "Site", "multi": true, "name": "site", - "query": "label_values(probe_success{job=\"blackbox-http\"}, site_name)", + "query": "label_values(probe_success{job=\"blackbox-http\", site_type=~\"joomla.*\"}, site_name)", "refresh": 2, "sort": 1, "type": "query" @@ -980,7 +587,7 @@ "to": "now" }, "timezone": "browser", - "title": "MokoWaaS -- Joomla Sites", + "title": "MokoWaaS", "uid": "moko-waas", "version": 1 } diff --git a/templates/docs/required/template-CONTRIBUTING.md b/templates/docs/required/template-CONTRIBUTING.md index 4e4d165..5a6642e 100644 --- a/templates/docs/required/template-CONTRIBUTING.md +++ b/templates/docs/required/template-CONTRIBUTING.md @@ -109,10 +109,10 @@ All contributions must follow [MokoStandards](https://git.mokoconsulting.tech/Mo ## Custom Workflows -Place repo-specific workflows in `.github/workflows/custom/` — they are **never overwritten or deleted** by MokoStandards sync: +Place repo-specific workflows in `.mokogitea/workflows/custom/` — they are **never overwritten or deleted** by MokoStandards sync: ``` -.github/workflows/ +.mokogitea/workflows/ ├── deploy-dev.yml ← Synced from MokoStandards ├── auto-release.yml ← Synced from MokoStandards └── custom/ ← Your custom workflows (safe) diff --git a/templates/gitea/README.md b/templates/gitea/README.md index d596abe..7ad1db7 100644 --- a/templates/gitea/README.md +++ b/templates/gitea/README.md @@ -53,7 +53,7 @@ Located in `ISSUE_TEMPLATE/` directory: - **Custom Templates**: Project-specific issue types - **Configuration** (`config.yml`): Issue template configuration -**Usage**: Copy entire `ISSUE_TEMPLATE/` directory to your repository's `.gitea/` directory. +**Usage**: Copy entire `ISSUE_TEMPLATE/` directory to your repository's `.mokogitea/` directory. ### Pull Request Template @@ -61,7 +61,7 @@ Located in `ISSUE_TEMPLATE/` directory: **Purpose**: Standardize pull request descriptions and ensure all necessary information is provided before review. -**Usage**: Copy to `.gitea/PULL_REQUEST_TEMPLATE.md` in your repository. +**Usage**: Copy to `.mokogitea/PULL_REQUEST_TEMPLATE.md` in your repository. ### CODEOWNERS Template @@ -70,7 +70,7 @@ Located in `ISSUE_TEMPLATE/` directory: **Purpose**: Define code ownership for automatic review assignment. **Usage**: -1. Copy to `.gitea/CODEOWNERS` (remove `.template` suffix) +1. Copy to `.mokogitea/CODEOWNERS` (remove `.template` suffix) 2. Customize with your team and file patterns 3. Commit to repository @@ -79,7 +79,7 @@ Located in `ISSUE_TEMPLATE/` directory: ### Setup Process 1. **Choose Templates**: Identify which templates your repository needs -2. **Copy to Repository**: Copy templates to your repository's `.gitea/` directory +2. **Copy to Repository**: Copy templates to your repository's `.mokogitea/` directory 3. **Customize**: Adapt templates to your project's needs 4. **Test**: Create test issues/PRs to validate templates 5. **Document**: Update README with any project-specific requirements @@ -88,7 +88,7 @@ Located in `ISSUE_TEMPLATE/` directory: ``` your-repository/ -└── .gitea/ +└── .mokogitea/ ├── ISSUE_TEMPLATE/ │ ├── bug_report.md │ ├── feature_request.md @@ -205,7 +205,7 @@ The CODEOWNERS file: * @org/default-team /docs/ @org/docs-team /src/ @org/dev-team -/.gitea/workflows/ @org/devops-team +/.mokogitea/workflows/ @org/devops-team /scripts/ @org/automation-team /docs/policy/security-*.md @org/security-team ``` @@ -274,7 +274,7 @@ Before publishing templates: For small projects: ``` -.gitea/ +.mokogitea/ ├── ISSUE_TEMPLATE/ │ └── bug_report.md └── PULL_REQUEST_TEMPLATE.md @@ -284,7 +284,7 @@ For small projects: For large projects: ``` -.gitea/ +.mokogitea/ ├── ISSUE_TEMPLATE/ │ ├── bug_report.md │ ├── feature_request.md @@ -299,7 +299,7 @@ For large projects: For repositories with multiple components: ``` -.gitea/ +.mokogitea/ ├── ISSUE_TEMPLATE/ │ ├── bug_report.md │ ├── feature_request.md