diff --git a/.env.template b/.env.template deleted file mode 100644 index 6482cfa..0000000 --- a/.env.template +++ /dev/null @@ -1,2 +0,0 @@ -GITHUB_TOKEN=token -REPOS="docker/buildx, docker/model-cli" diff --git a/.github/workflows/gh-pages.yml b/.github/workflows/gh-pages.yml new file mode 100644 index 0000000..b728fcc --- /dev/null +++ b/.github/workflows/gh-pages.yml @@ -0,0 +1,30 @@ +name: Deploy Docsify + +on: + push: + branches: [ docs ] + +jobs: + deploy: + runs-on: ubuntu-latest + steps: + - name: Checkout code + uses: actions/checkout@v3 + + - name: Setup Node.js + uses: actions/setup-node@v4 + with: + node-version: '22' + + - name: Install docsify-cli + run: npm install -g docsify-cli + + - name: Build static files + run: docsify generate . + + - name: Deploy to GitHub Pages + uses: JamesIves/github-pages-deploy-action@v4 + with: + branch: gh-pages # The branch the action should deploy to + folder: . # The folder the action should deploy + clean: true # Automatically remove deleted files from the deploy branch diff --git a/.nojekyll b/.nojekyll new file mode 100644 index 0000000..e69de29 diff --git a/CHANGELOG.md b/CHANGELOG.md deleted file mode 100644 index 2fab0ba..0000000 --- a/CHANGELOG.md +++ /dev/null @@ -1,16 +0,0 @@ -# CHANGELOG - -## [Unreleased] - 2025-04-28 - -### Added - -- Add official documentation (Product vision) -- Add Roadmap/Backlog of the project -- Add GNU General Public License v3.0 License -- Add Code of conduct file -- Add a complete README -- Add a Contributing guide file -- Add a Security guide file -- Add a Changelog file -- Add a Pull Request template -- Add an Issue Template diff --git a/CODE_OF_CONDUCT.md b/CODE_OF_CONDUCT.md deleted file mode 100644 index c06e35d..0000000 --- a/CODE_OF_CONDUCT.md +++ /dev/null @@ -1,128 +0,0 @@ -# Contributor Covenant Code of Conduct - -## Our Pledge - -We as members, contributors, and leaders pledge to make participation in our -community a harassment-free experience for everyone, regardless of age, body -size, visible or invisible disability, ethnicity, sex characteristics, gender -identity and expression, level of experience, education, socio-economic status, -nationality, personal appearance, race, religion, or sexual identity -and orientation. - -We pledge to act and interact in ways that contribute to an open, welcoming, -diverse, inclusive, and healthy community. - -## Our Standards - -Examples of behavior that contributes to a positive environment for our -community include: - -* Demonstrating empathy and kindness toward other people -* Being respectful of differing opinions, viewpoints, and experiences -* Giving and gracefully accepting constructive feedback -* Accepting responsibility and apologizing to those affected by our mistakes, - and learning from the experience -* Focusing on what is best not just for us as individuals, but for the - overall community - -Examples of unacceptable behavior include: - -* The use of sexualized language or imagery, and sexual attention or - advances of any kind -* Trolling, insulting or derogatory comments, and personal or political attacks -* Public or private harassment -* Publishing others' private information, such as a physical or email - address, without their explicit permission -* Other conduct which could reasonably be considered inappropriate in a - professional setting - -## Enforcement Responsibilities - -Community leaders are responsible for clarifying and enforcing our standards of -acceptable behavior and will take appropriate and fair corrective action in -response to any behavior that they deem inappropriate, threatening, offensive, -or harmful. - -Community leaders have the right and responsibility to remove, edit, or reject -comments, commits, code, wiki edits, issues, and other contributions that are -not aligned to this Code of Conduct, and will communicate reasons for moderation -decisions when appropriate. - -## Scope - -This Code of Conduct applies within all community spaces, and also applies when -an individual is officially representing the community in public spaces. -Examples of representing our community include using an official e-mail address, -posting via an official social media account, or acting as an appointed -representative at an online or offline event. - -## Enforcement - -Instances of abusive, harassing, or otherwise unacceptable behavior may be -reported to the community leaders responsible for enforcement at issues and put -the Conduct label. -All complaints will be reviewed and investigated promptly and fairly. - -All community leaders are obligated to respect the privacy and security of the -reporter of any incident. - -## Enforcement Guidelines - -Community leaders will follow these Community Impact Guidelines in determining -the consequences for any action they deem in violation of this Code of Conduct: - -### 1. Correction - -**Community Impact**: Use of inappropriate language or other behavior deemed -unprofessional or unwelcome in the community. - -**Consequence**: A private, written warning from community leaders, providing -clarity around the nature of the violation and an explanation of why the -behavior was inappropriate. A public apology may be requested. - -### 2. Warning - -**Community Impact**: A violation through a single incident or series -of actions. - -**Consequence**: A warning with consequences for continued behavior. No -interaction with the people involved, including unsolicited interaction with -those enforcing the Code of Conduct, for a specified period of time. This -includes avoiding interactions in community spaces as well as external channels -like social media. Violating these terms may lead to a temporary or -permanent ban. - -### 3. Temporary Ban - -**Community Impact**: A serious violation of community standards, including -sustained inappropriate behavior. - -**Consequence**: A temporary ban from any sort of interaction or public -communication with the community for a specified period of time. No public or -private interaction with the people involved, including unsolicited interaction -with those enforcing the Code of Conduct, is allowed during this period. -Violating these terms may lead to a permanent ban. - -### 4. Permanent Ban - -**Community Impact**: Demonstrating a pattern of violation of community -standards, including sustained inappropriate behavior, harassment of an -individual, or aggression toward or disparagement of classes of individuals. - -**Consequence**: A permanent ban from any sort of public interaction within -the community. - -## Attribution - -This Code of Conduct is adapted from the [Contributor Covenant][homepage], -version 2.0, available at -https://www.contributor-covenant.org/version/2/0/code_of_conduct.html. - -Community Impact Guidelines were inspired by [Mozilla's code of conduct -enforcement ladder](https://github.com/mozilla/diversity). - -[homepage]: https://www.contributor-covenant.org - -For answers to common questions about this code of conduct, see the FAQ at -https://www.contributor-covenant.org/faq. Translations are available at -https://www.contributor-covenant.org/translations. diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md deleted file mode 100644 index 3ac1c32..0000000 --- a/CONTRIBUTING.md +++ /dev/null @@ -1,108 +0,0 @@ -Contributing Guidelines -======================= - -Thank you for your interest in contributing to this project! We welcome contributions from everyone, regardless of experience level. By contributing, you'll be helping to make this project even better. - -Code of Conduct ---------------- - -Before contributing, please read our [Code of Conduct](CODE_OF_CONDUCT.md). We are committed to creating a welcoming and inclusive environment for all. - -How to Contribute ------------------ - -Here are the steps to contribute to this project: - -1. **Fork the Repository:** Click the "Fork" button in the top right corner of the repository on GitHub. This will create a copy of the project in your GitHub account. - -2. **Clone the Repository:** Clone your forked repository to your local machine using Git: -`git clone https://github.com/your-username/your-repository-name.git` -Replace `your-username` and `your-repository-name` with your GitHub username and the repository name, respectively. - -3. **Create a New Branch:** Create a new branch for your contribution: -`git checkout -b feature/your-feature-name` -or -`git checkout -b fix/your-bug-fix-name` Use a descriptive name for your branch. - -4. **Make Changes:** Make your changes in your local branch. Follow the project's coding style and guidelines. - -5. **Test Your Changes:** If applicable, write and run tests to ensure your changes work as expected and don't break existing functionality. - -6. **Commit your changes:** Commit your changes with a clear and concise message: -`git add .` -`git commit -m "Add your descriptive commit message"` - -7. **Push to your fork:** Push your changes to your forked repository on GitHub: -`git push origin your-branch-name` - -8. **Create a Pull Request:** Go to the original repository on GitHub and click the "Compare & pull request" button. Provide a clear title and description of your changes. If your pull request addresses an existing issue, include the issue number in the description (e.g., "Fixes #123"). - -9. **Review Process:** The project maintainers will review your pull request. They may request changes or provide feedback. Be patient and responsive to their comments. - -10. **Merge:** Once your pull request is approved, it will be merged into the main branch. Congratulations, you've contributed! - - -Reporting Issues ----------------- - -If you find a bug, typo, or have a suggestion, please [open an issue](https://github.com/your-username/your-repository-name/issues) on GitHub. Provide as much detail as possible, including: - -* A clear and descriptive title - -* Steps to reproduce the issue - -* Expected behavior - -* Actual behavior - -* Screenshots (if applicable) - -* Your environment (operating system, browser, etc.) - - -Style Guidelines ----------------- - -* Follow the existing code style of the project. - -* Use clear and descriptive variable and function names. - -* Write concise and informative comments. - -* Format your code using [EditorConfig](https://editorconfig.org/) if available. - -* Keep lines of code to a reasonable length (e.g., 80-120 characters). - - -Types of Contributions ----------------------- - -We welcome various types of contributions, including: - -* **Bug fixes:** Fixing reported issues. - -* **New features:** Adding new functionality. - -* **Documentation:** Improving the documentation. - -* **Tests:** Writing unit or integration tests. - -* **Code review:** Reviewing pull requests from other contributors. - -* **Translations:** Translating the project into other languages. - -* **Community support:** Helping others in the community. - - -Getting Help ------------- - -If you have any questions or need help, feel free to: - -* Open an issue on GitHub. - - -Thank You ---------- - -Thank you for contributing to this project! Your help is greatly appreciated. \ No newline at end of file diff --git a/SECURITY.md b/SECURITY.md deleted file mode 100644 index b01e55d..0000000 --- a/SECURITY.md +++ /dev/null @@ -1,38 +0,0 @@ -Security Policy ---------------- - -This security policy outlines our procedures for handling security vulnerabilities in this project. - -### Reporting a Vulnerability - -If you discover a security vulnerability, please **do not** create a public GitHub issue. Instead, follow these steps: - -1. **Private Disclosure:** Send an email (see Contact) with the subject: SECURITY: github-monitor. Please include a detailed description of the vulnerability on email body, including: - - * The affected component(s) - - * Steps to reproduce the vulnerability - - * Potential impact of the vulnerability - -2. **Timely Reporting:** Please report vulnerabilities in a timely manner. This allows us to address them before they can be exploited. - -3. **Acknowledgement:** We will acknowledge receipt of your report within 3 business days and will work with you to validate the vulnerability. - -### Vulnerability Handling Process - -1. **Triage:** The project maintainers will assess the severity of the vulnerability. - -2. **Patch Development:** We will work to develop a patch for the vulnerability. - -3. **Notification:** We will notify users of the vulnerability and the availability of a patch through release notes at CHANGELOG. - -### Public Disclosure - -Please do not publicly disclose any vulnerability details before we have had a chance to address it. - -### Contact - -Please email security reports to: thomasqsa@gmail.com - -Thank you for helping to keep this project secure. diff --git a/dashboards/github-organization.json b/dashboards/github-organization.json deleted file mode 100644 index bc5c8d5..0000000 --- a/dashboards/github-organization.json +++ /dev/null @@ -1,497 +0,0 @@ -{ - "annotations": { - "list": [ - { - "builtIn": 1, - "datasource": { - "type": "datasource", - "uid": "grafana" - }, - "enable": true, - "hide": true, - "iconColor": "rgba(0, 211, 255, 1)", - "name": "Annotations & Alerts", - "type": "dashboard" - } - ] - }, - "description": "This dashboard contains PR and Issues across multiple repositories in the Organization using GitHub data source.", - "editable": true, - "fiscalYearStartMonth": 0, - "graphTooltip": 0, - "id": 4, - "links": [], - "panels": [ - { - "collapsed": false, - "gridPos": { - "h": 1, - "w": 24, - "x": 0, - "y": 0 - }, - "id": 4, - "panels": [], - "repeat": "repository", - "title": "Repository $repository", - "type": "row" - }, - { - "datasource": { - "uid": "$datasource" - }, - "fieldConfig": { - "defaults": { - "mappings": [], - "thresholds": { - "mode": "absolute", - "steps": [ - { - "color": "dark-blue" - }, - { - "color": "dark-green", - "value": 1 - } - ] - } - }, - "overrides": [] - }, - "gridPos": { - "h": 3, - "w": 4, - "x": 0, - "y": 1 - }, - "id": 9, - "options": { - "colorMode": "background", - "graphMode": "none", - "justifyMode": "center", - "orientation": "auto", - "percentChangeColorMode": "standard", - "reduceOptions": { - "calcs": [ - "mean" - ], - "fields": "", - "values": false - }, - "showPercentChange": false, - "text": {}, - "textMode": "auto", - "wideLayout": true - }, - "pluginVersion": "11.6.0", - "targets": [ - { - "datasource": { - "uid": "$datasource" - }, - "owner": "$organization", - "queryType": "Releases", - "refId": "A", - "repository": "$repository" - } - ], - "title": "Releases", - "transformations": [ - { - "id": "reduce", - "options": { - "reducers": [ - "count" - ] - } - } - ], - "type": "stat" - }, - { - "datasource": { - "uid": "$datasource" - }, - "fieldConfig": { - "defaults": { - "color": { - "mode": "thresholds" - }, - "mappings": [], - "thresholds": { - "mode": "absolute", - "steps": [ - { - "color": "dark-blue" - }, - { - "color": "dark-green", - "value": 1 - } - ] - } - }, - "overrides": [] - }, - "gridPos": { - "h": 3, - "w": 5, - "x": 4, - "y": 1 - }, - "id": 15, - "options": { - "colorMode": "background", - "graphMode": "none", - "justifyMode": "center", - "orientation": "auto", - "percentChangeColorMode": "standard", - "reduceOptions": { - "calcs": [ - "mean" - ], - "fields": "", - "values": false - }, - "showPercentChange": false, - "text": {}, - "textMode": "auto", - "wideLayout": true - }, - "pluginVersion": "11.6.0", - "targets": [ - { - "datasource": { - "uid": "$datasource" - }, - "options": { - "query": "" - }, - "owner": "$organization", - "queryType": "Issues", - "refId": "A", - "repository": "$repository" - } - ], - "title": "Issues Created", - "transformations": [ - { - "id": "reduce", - "options": { - "reducers": [ - "count" - ] - } - } - ], - "type": "stat" - }, - { - "datasource": { - "uid": "$datasource" - }, - "fieldConfig": { - "defaults": { - "color": { - "mode": "thresholds" - }, - "mappings": [], - "thresholds": { - "mode": "absolute", - "steps": [ - { - "color": "dark-blue" - }, - { - "color": "dark-green", - "value": 1 - } - ] - } - }, - "overrides": [] - }, - "gridPos": { - "h": 3, - "w": 5, - "x": 9, - "y": 1 - }, - "id": 29, - "options": { - "colorMode": "background", - "graphMode": "none", - "justifyMode": "center", - "orientation": "auto", - "percentChangeColorMode": "standard", - "reduceOptions": { - "calcs": [ - "lastNotNull" - ], - "fields": "", - "values": false - }, - "showPercentChange": false, - "text": {}, - "textMode": "auto", - "wideLayout": true - }, - "pluginVersion": "11.6.0", - "targets": [ - { - "datasource": { - "uid": "$datasource" - }, - "options": { - "query": "", - "timeField": 1 - }, - "owner": "$organization", - "queryType": "Pull_Requests", - "refId": "A", - "repository": "$repository" - } - ], - "title": "Pull Requests Created", - "transformations": [ - { - "id": "reduce", - "options": { - "reducers": [ - "count" - ] - } - } - ], - "type": "stat" - }, - { - "datasource": { - "uid": "$datasource" - }, - "fieldConfig": { - "defaults": { - "mappings": [], - "thresholds": { - "mode": "absolute", - "steps": [ - { - "color": "dark-blue" - }, - { - "color": "dark-green", - "value": 1 - }, - { - "color": "dark-orange", - "value": 10 - } - ] - } - }, - "overrides": [] - }, - "gridPos": { - "h": 3, - "w": 5, - "x": 14, - "y": 1 - }, - "id": 33, - "options": { - "colorMode": "background", - "graphMode": "none", - "justifyMode": "center", - "orientation": "auto", - "percentChangeColorMode": "standard", - "reduceOptions": { - "calcs": [ - "mean" - ], - "fields": "", - "values": false - }, - "showPercentChange": false, - "text": {}, - "textMode": "auto", - "wideLayout": true - }, - "pluginVersion": "11.6.0", - "targets": [ - { - "datasource": { - "uid": "$datasource" - }, - "options": { - "query": "is:open", - "timeField": 0 - }, - "owner": "$organization", - "queryType": "Issues", - "refId": "A", - "repository": "$repository" - } - ], - "title": "Active Issues", - "transformations": [ - { - "id": "reduce", - "options": { - "reducers": [ - "count" - ] - } - } - ], - "type": "stat" - }, - { - "datasource": { - "uid": "$datasource" - }, - "fieldConfig": { - "defaults": { - "mappings": [], - "thresholds": { - "mode": "absolute", - "steps": [ - { - "color": "dark-blue" - }, - { - "color": "dark-purple", - "value": 1 - } - ] - } - }, - "overrides": [] - }, - "gridPos": { - "h": 3, - "w": 5, - "x": 19, - "y": 1 - }, - "id": 32, - "options": { - "colorMode": "background", - "graphMode": "none", - "justifyMode": "center", - "orientation": "auto", - "percentChangeColorMode": "standard", - "reduceOptions": { - "calcs": [ - "mean" - ], - "fields": "", - "values": false - }, - "showPercentChange": false, - "text": {}, - "textMode": "auto", - "wideLayout": true - }, - "pluginVersion": "11.6.0", - "targets": [ - { - "datasource": { - "uid": "$datasource" - }, - "options": { - "query": "is:open", - "timeField": 3 - }, - "owner": "$organization", - "queryType": "Pull_Requests", - "refId": "A", - "repository": "$repository" - } - ], - "title": "Active Pull Requests", - "transformations": [ - { - "id": "reduce", - "options": { - "reducers": [ - "count" - ] - } - } - ], - "type": "stat" - } - ], - "preload": false, - "refresh": "", - "schemaVersion": 41, - "tags": [], - "templating": { - "list": [ - { - "current": { - "text": "GitHub", - "value": "PF911E414CF6BDFC5" - }, - "includeAll": false, - "name": "datasource", - "options": [], - "query": "grafana-github-datasource", - "refresh": 1, - "regex": "", - "type": "datasource" - }, - { - "current": { - "text": "RedisGrafana", - "value": "RedisGrafana" - }, - "label": "Organization", - "name": "organization", - "options": [ - { - "selected": true, - "text": "RedisGrafana", - "value": "RedisGrafana" - } - ], - "query": "RedisGrafana", - "type": "textbox" - }, - { - "current": { - "text": [ - "All" - ], - "value": [ - "$__all" - ] - }, - "datasource": "PF911E414CF6BDFC5", - "definition": "GitHub - Repositories", - "includeAll": true, - "label": "Repository", - "multi": true, - "name": "repository", - "options": [], - "query": { - "owner": "$organization", - "queryType": "Repositories" - }, - "refresh": 1, - "regex": "", - "sort": 1, - "type": "query" - } - ] - }, - "time": { - "from": "now-6M", - "to": "now" - }, - "timepicker": {}, - "timezone": "", - "title": "GitHub Organization", - "uid": "iVcSTeyGz", - "version": 1 -} diff --git a/dashboards/github.json b/dashboards/github.json deleted file mode 100644 index fc5c2f5..0000000 --- a/dashboards/github.json +++ /dev/null @@ -1,1634 +0,0 @@ -{ - "annotations": { - "list": [ - { - "builtIn": 1, - "datasource": { - "type": "datasource", - "uid": "grafana" - }, - "enable": true, - "hide": true, - "iconColor": "rgba(0, 211, 255, 1)", - "name": "Annotations & Alerts", - "type": "dashboard" - }, - { - "annotation": { - "datasource": "$datasource", - "field": "title", - "options": { - "query": "" - }, - "owner": "$organization", - "queryType": "Issues", - "refId": "", - "repository": "$repository", - "timeField": "created_at" - }, - "datasource": { - "uid": "$datasource" - }, - "datasourceId": 10, - "enable": true, - "hide": false, - "iconColor": "#E02F44", - "name": "Issues Opened", - "rawQuery": "SELECT\n extract(epoch from time_column) AS time,\n text_column as text,\n tags_column as tags\nFROM\n metric_table\nWHERE\n $__timeFilter(time_column)\n", - "showIn": 0 - }, - { - "annotation": { - "datasource": "$datasource", - "field": "title", - "options": { - "query": "is:closed", - "timeField": 1 - }, - "owner": "$organization", - "queryType": "Issues", - "refId": "", - "repository": "$repository", - "timeField": "closed_at" - }, - "datasource": { - "uid": "$datasource" - }, - "datasourceId": 10, - "enable": true, - "hide": false, - "iconColor": "#96D98D", - "name": "Issues Closed", - "rawQuery": "SELECT\n extract(epoch from time_column) AS time,\n text_column as text,\n tags_column as tags\nFROM\n metric_table\nWHERE\n $__timeFilter(time_column)\n", - "showIn": 0 - }, - { - "annotation": { - "datasource": "$datasource", - "field": "name", - "owner": "$organization", - "queryType": "Releases", - "refId": "", - "repository": "$repository", - "timeField": "published_at" - }, - "datasource": { - "uid": "$datasource" - }, - "datasourceId": 10, - "enable": true, - "hide": false, - "iconColor": "#8AB8FF", - "name": "Releases", - "rawQuery": "SELECT\n extract(epoch from time_column) AS time,\n text_column as text,\n tags_column as tags\nFROM\n metric_table\nWHERE\n $__timeFilter(time_column)\n", - "showIn": 0 - } - ] - }, - "description": "This dashboard contains a sample of some of the various features and display methods available in the GitHub datasource.", - "editable": true, - "fiscalYearStartMonth": 0, - "graphTooltip": 0, - "id": 2, - "links": [], - "panels": [ - { - "collapsed": false, - "gridPos": { - "h": 1, - "w": 24, - "x": 0, - "y": 0 - }, - "id": 4, - "panels": [], - "title": "Stats", - "type": "row" - }, - { - "datasource": { - "uid": "$datasource" - }, - "fieldConfig": { - "defaults": { - "mappings": [], - "thresholds": { - "mode": "absolute", - "steps": [ - { - "color": "green" - }, - { - "color": "red", - "value": 80 - } - ] - } - }, - "overrides": [] - }, - "gridPos": { - "h": 4, - "w": 4, - "x": 0, - "y": 1 - }, - "id": 9, - "options": { - "colorMode": "value", - "graphMode": "area", - "justifyMode": "auto", - "orientation": "auto", - "percentChangeColorMode": "standard", - "reduceOptions": { - "calcs": [ - "mean" - ], - "fields": "", - "values": false - }, - "showPercentChange": false, - "text": {}, - "textMode": "auto", - "wideLayout": true - }, - "pluginVersion": "11.6.0", - "targets": [ - { - "datasource": { - "uid": "$datasource" - }, - "owner": "$organization", - "queryType": "Releases", - "refId": "A", - "repository": "$repository" - } - ], - "title": "Releases", - "transformations": [ - { - "id": "reduce", - "options": { - "reducers": [ - "count" - ] - } - } - ], - "type": "stat" - }, - { - "datasource": { - "uid": "$datasource" - }, - "fieldConfig": { - "defaults": { - "mappings": [], - "thresholds": { - "mode": "absolute", - "steps": [ - { - "color": "green" - }, - { - "color": "red", - "value": 80 - } - ] - } - }, - "overrides": [] - }, - "gridPos": { - "h": 4, - "w": 4, - "x": 4, - "y": 1 - }, - "id": 10, - "options": { - "colorMode": "value", - "graphMode": "area", - "justifyMode": "auto", - "orientation": "auto", - "percentChangeColorMode": "standard", - "reduceOptions": { - "calcs": [ - "mean" - ], - "fields": "", - "values": false - }, - "showPercentChange": false, - "text": {}, - "textMode": "auto", - "wideLayout": true - }, - "pluginVersion": "11.6.0", - "targets": [ - { - "datasource": { - "uid": "$datasource" - }, - "owner": "$organization", - "queryType": "Tags", - "refId": "A", - "repository": "$repository" - } - ], - "title": "Tags", - "transformations": [ - { - "id": "reduce", - "options": { - "reducers": [ - "count" - ] - } - } - ], - "type": "stat" - }, - { - "collapsed": false, - "gridPos": { - "h": 1, - "w": 24, - "x": 0, - "y": 5 - }, - "id": 31, - "panels": [], - "title": "Pull Requests", - "type": "row" - }, - { - "datasource": { - "uid": "$datasource" - }, - "fieldConfig": { - "defaults": { - "mappings": [], - "thresholds": { - "mode": "absolute", - "steps": [ - { - "color": "green" - } - ] - } - }, - "overrides": [] - }, - "gridPos": { - "h": 4, - "w": 4, - "x": 0, - "y": 6 - }, - "id": 29, - "options": { - "colorMode": "value", - "graphMode": "area", - "justifyMode": "auto", - "orientation": "auto", - "percentChangeColorMode": "standard", - "reduceOptions": { - "calcs": [ - "mean" - ], - "fields": "", - "values": false - }, - "showPercentChange": false, - "text": {}, - "textMode": "auto", - "wideLayout": true - }, - "pluginVersion": "11.6.0", - "targets": [ - { - "datasource": { - "uid": "$datasource" - }, - "options": { - "query": "", - "timeField": 1 - }, - "owner": "$organization", - "queryType": "Pull_Requests", - "refId": "A", - "repository": "$repository" - } - ], - "title": "Pull Requests Created", - "transformations": [ - { - "id": "reduce", - "options": { - "reducers": [ - "count" - ] - } - } - ], - "type": "stat" - }, - { - "datasource": { - "uid": "$datasource" - }, - "fieldConfig": { - "defaults": { - "mappings": [], - "thresholds": { - "mode": "absolute", - "steps": [ - { - "color": "green" - }, - { - "color": "yellow", - "value": 30 - }, - { - "color": "red", - "value": 90 - } - ] - } - }, - "overrides": [] - }, - "gridPos": { - "h": 4, - "w": 4, - "x": 4, - "y": 6 - }, - "id": 32, - "options": { - "colorMode": "value", - "graphMode": "area", - "justifyMode": "auto", - "orientation": "auto", - "percentChangeColorMode": "standard", - "reduceOptions": { - "calcs": [ - "mean" - ], - "fields": "", - "values": false - }, - "showPercentChange": false, - "text": {}, - "textMode": "auto", - "wideLayout": true - }, - "pluginVersion": "11.6.0", - "targets": [ - { - "datasource": { - "uid": "$datasource" - }, - "options": { - "query": "is:open", - "timeField": 3 - }, - "owner": "$organization", - "queryType": "Pull_Requests", - "refId": "A", - "repository": "$repository" - } - ], - "title": "Active Pull Requests", - "transformations": [ - { - "id": "reduce", - "options": { - "reducers": [ - "count" - ] - } - } - ], - "type": "stat" - }, - { - "datasource": { - "uid": "$datasource" - }, - "fieldConfig": { - "defaults": { - "mappings": [], - "thresholds": { - "mode": "absolute", - "steps": [ - { - "color": "green" - }, - { - "color": "red", - "value": 80 - } - ] - }, - "unit": "s" - }, - "overrides": [] - }, - "gridPos": { - "h": 4, - "w": 4, - "x": 8, - "y": 6 - }, - "id": 21, - "options": { - "colorMode": "value", - "graphMode": "area", - "justifyMode": "auto", - "orientation": "auto", - "percentChangeColorMode": "standard", - "reduceOptions": { - "calcs": [ - "mean" - ], - "fields": "", - "values": false - }, - "showPercentChange": false, - "text": {}, - "textMode": "auto", - "wideLayout": true - }, - "pluginVersion": "11.6.0", - "targets": [ - { - "datasource": { - "uid": "$datasource" - }, - "options": { - "query": "", - "timeField": 0 - }, - "owner": "$organization", - "queryType": "Pull_Requests", - "refId": "A", - "repository": "$repository" - } - ], - "title": "PR average open time", - "transformations": [ - { - "id": "reduce", - "options": { - "reducers": [ - "mean" - ] - } - } - ], - "type": "stat" - }, - { - "datasource": { - "uid": "$datasource" - }, - "fieldConfig": { - "defaults": { - "mappings": [], - "thresholds": { - "mode": "absolute", - "steps": [ - { - "color": "green" - }, - { - "color": "red", - "value": 80 - } - ] - }, - "unit": "s" - }, - "overrides": [] - }, - "gridPos": { - "h": 4, - "w": 4, - "x": 12, - "y": 6 - }, - "id": 35, - "options": { - "colorMode": "value", - "graphMode": "area", - "justifyMode": "auto", - "orientation": "auto", - "percentChangeColorMode": "standard", - "reduceOptions": { - "calcs": [ - "mean" - ], - "fields": "", - "values": false - }, - "showPercentChange": false, - "text": {}, - "textMode": "auto", - "wideLayout": true - }, - "pluginVersion": "11.6.0", - "targets": [ - { - "datasource": { - "uid": "$datasource" - }, - "options": { - "query": "is:open", - "timeField": 3 - }, - "owner": "$organization", - "queryType": "Pull_Requests", - "refId": "A", - "repository": "$repository" - } - ], - "title": "Active PR Open Time", - "transformations": [ - { - "id": "reduce", - "options": { - "reducers": [ - "mean" - ] - } - } - ], - "type": "stat" - }, - { - "collapsed": false, - "gridPos": { - "h": 1, - "w": 24, - "x": 0, - "y": 10 - }, - "id": 27, - "panels": [], - "title": "Issues", - "type": "row" - }, - { - "datasource": { - "uid": "$datasource" - }, - "fieldConfig": { - "defaults": { - "mappings": [], - "thresholds": { - "mode": "absolute", - "steps": [ - { - "color": "green" - }, - { - "color": "red", - "value": 80 - } - ] - } - }, - "overrides": [] - }, - "gridPos": { - "h": 4, - "w": 4, - "x": 0, - "y": 11 - }, - "id": 15, - "options": { - "colorMode": "value", - "graphMode": "area", - "justifyMode": "auto", - "orientation": "auto", - "percentChangeColorMode": "standard", - "reduceOptions": { - "calcs": [ - "mean" - ], - "fields": "", - "values": false - }, - "showPercentChange": false, - "text": {}, - "textMode": "auto", - "wideLayout": true - }, - "pluginVersion": "11.6.0", - "targets": [ - { - "datasource": { - "uid": "$datasource" - }, - "options": { - "query": "" - }, - "owner": "$organization", - "queryType": "Issues", - "refId": "A", - "repository": "$repository" - } - ], - "title": "Issues Created", - "transformations": [ - { - "id": "reduce", - "options": { - "reducers": [ - "count" - ] - } - } - ], - "type": "stat" - }, - { - "datasource": { - "uid": "$datasource" - }, - "fieldConfig": { - "defaults": { - "mappings": [], - "thresholds": { - "mode": "absolute", - "steps": [ - { - "color": "green" - }, - { - "color": "yellow", - "value": 30 - }, - { - "color": "red", - "value": 90 - } - ] - } - }, - "overrides": [] - }, - "gridPos": { - "h": 4, - "w": 4, - "x": 4, - "y": 11 - }, - "id": 33, - "options": { - "colorMode": "value", - "graphMode": "area", - "justifyMode": "auto", - "orientation": "auto", - "percentChangeColorMode": "standard", - "reduceOptions": { - "calcs": [ - "mean" - ], - "fields": "", - "values": false - }, - "showPercentChange": false, - "text": {}, - "textMode": "auto", - "wideLayout": true - }, - "pluginVersion": "11.6.0", - "targets": [ - { - "datasource": { - "uid": "$datasource" - }, - "options": { - "query": "is:open" - }, - "owner": "$organization", - "queryType": "Issues", - "refId": "A", - "repository": "$repository" - } - ], - "title": "Active Issues", - "transformations": [ - { - "id": "reduce", - "options": { - "reducers": [ - "count" - ] - } - } - ], - "type": "stat" - }, - { - "datasource": { - "uid": "$datasource" - }, - "fieldConfig": { - "defaults": { - "mappings": [], - "thresholds": { - "mode": "absolute", - "steps": [ - { - "color": "green" - }, - { - "color": "red", - "value": 80 - } - ] - }, - "unit": "s" - }, - "overrides": [] - }, - "gridPos": { - "h": 4, - "w": 4, - "x": 8, - "y": 11 - }, - "id": 34, - "options": { - "colorMode": "value", - "graphMode": "area", - "justifyMode": "auto", - "orientation": "auto", - "percentChangeColorMode": "standard", - "reduceOptions": { - "calcs": [ - "mean" - ], - "fields": "", - "values": false - }, - "showPercentChange": false, - "text": {}, - "textMode": "auto", - "wideLayout": true - }, - "pluginVersion": "11.6.0", - "targets": [ - { - "datasource": { - "uid": "$datasource" - }, - "options": { - "query": "", - "timeField": 1 - }, - "owner": "$organization", - "queryType": "Issues", - "refId": "A", - "repository": "$repository" - } - ], - "title": "Issues Average Open Time (Closed issues)", - "transformations": [ - { - "id": "reduce", - "options": { - "reducers": [ - "mean" - ] - } - } - ], - "type": "stat" - }, - { - "datasource": { - "uid": "$datasource" - }, - "fieldConfig": { - "defaults": { - "mappings": [], - "thresholds": { - "mode": "absolute", - "steps": [ - { - "color": "green" - }, - { - "color": "red", - "value": 80 - } - ] - } - }, - "overrides": [] - }, - "gridPos": { - "h": 4, - "w": 4, - "x": 12, - "y": 11 - }, - "id": 28, - "options": { - "colorMode": "value", - "graphMode": "area", - "justifyMode": "auto", - "orientation": "auto", - "percentChangeColorMode": "standard", - "reduceOptions": { - "calcs": [ - "mean" - ], - "fields": "", - "values": false - }, - "showPercentChange": false, - "text": {}, - "textMode": "auto", - "wideLayout": true - }, - "pluginVersion": "11.6.0", - "targets": [ - { - "datasource": { - "uid": "$datasource" - }, - "options": { - "query": "milestone:$milestone" - }, - "owner": "$organization", - "queryType": "Issues", - "refId": "A", - "repository": "$repository" - } - ], - "title": "Issues Created in Milestone", - "transformations": [ - { - "id": "reduce", - "options": { - "reducers": [ - "count" - ] - } - } - ], - "type": "stat" - }, - { - "collapsed": false, - "gridPos": { - "h": 1, - "w": 24, - "x": 0, - "y": 15 - }, - "id": 37, - "panels": [], - "title": "Data", - "type": "row" - }, - { - "datasource": { - "uid": "$datasource" - }, - "fieldConfig": { - "defaults": { - "custom": { - "align": "auto", - "cellOptions": { - "type": "auto" - }, - "filterable": false, - "inspect": false - }, - "mappings": [], - "thresholds": { - "mode": "absolute", - "steps": [ - { - "color": "green" - }, - { - "color": "red", - "value": 80 - } - ] - } - }, - "overrides": [ - { - "matcher": { - "id": "byName", - "options": "id" - }, - "properties": [ - { - "id": "custom.width", - "value": 74 - } - ] - }, - { - "matcher": { - "id": "byName", - "options": "author" - }, - "properties": [ - { - "id": "custom.width", - "value": 136 - } - ] - } - ] - }, - "gridPos": { - "h": 9, - "w": 12, - "x": 0, - "y": 16 - }, - "id": 2, - "options": { - "cellHeight": "sm", - "footer": { - "countRows": false, - "fields": "", - "reducer": [ - "sum" - ], - "show": false - }, - "showHeader": true, - "sortBy": [] - }, - "pluginVersion": "11.6.0", - "targets": [ - { - "datasource": { - "uid": "$datasource" - }, - "options": { - "gitRef": "$branch" - }, - "owner": "$organization", - "queryType": "Commits", - "refId": "A", - "repository": "$repository" - } - ], - "title": "Commits", - "type": "table" - }, - { - "datasource": { - "uid": "$datasource" - }, - "fieldConfig": { - "defaults": { - "custom": { - "align": "auto", - "cellOptions": { - "type": "auto" - }, - "filterable": false, - "inspect": false - }, - "mappings": [], - "thresholds": { - "mode": "absolute", - "steps": [ - { - "color": "green" - }, - { - "color": "red", - "value": 80 - } - ] - } - }, - "overrides": [ - { - "matcher": { - "id": "byName", - "options": "title" - }, - "properties": [ - { - "id": "custom.width", - "value": 323 - } - ] - } - ] - }, - "gridPos": { - "h": 9, - "w": 12, - "x": 12, - "y": 16 - }, - "id": 12, - "options": { - "cellHeight": "sm", - "footer": { - "countRows": false, - "fields": "", - "reducer": [ - "sum" - ], - "show": false - }, - "showHeader": true, - "sortBy": [] - }, - "pluginVersion": "11.6.0", - "targets": [ - { - "datasource": { - "uid": "$datasource" - }, - "options": { - "query": "" - }, - "owner": "$organization", - "queryType": "Issues", - "refId": "A", - "repository": "$repository" - } - ], - "title": "Issues", - "type": "table" - }, - { - "datasource": { - "uid": "$datasource" - }, - "fieldConfig": { - "defaults": { - "custom": { - "align": "auto", - "cellOptions": { - "type": "auto" - }, - "filterable": false, - "inspect": false - }, - "mappings": [], - "thresholds": { - "mode": "absolute", - "steps": [ - { - "color": "green" - }, - { - "color": "red", - "value": 80 - } - ] - } - }, - "overrides": [ - { - "matcher": { - "id": "byName", - "options": "number" - }, - "properties": [ - { - "id": "custom.width", - "value": 44 - } - ] - }, - { - "matcher": { - "id": "byName", - "options": "title" - }, - "properties": [ - { - "id": "custom.width", - "value": 259 - } - ] - } - ] - }, - "gridPos": { - "h": 9, - "w": 12, - "x": 0, - "y": 25 - }, - "id": 13, - "options": { - "cellHeight": "sm", - "footer": { - "countRows": false, - "fields": "", - "reducer": [ - "sum" - ], - "show": false - }, - "showHeader": true, - "sortBy": [] - }, - "pluginVersion": "11.6.0", - "targets": [ - { - "datasource": { - "uid": "$datasource" - }, - "options": { - "timeField": 1 - }, - "owner": "$organization", - "queryType": "Pull_Requests", - "refId": "A", - "repository": "$repository" - } - ], - "title": "Pull Requests", - "transformations": [ - { - "id": "organize", - "options": { - "excludeByName": { - "author_company": false, - "author_email": false, - "is_draft": false, - "locked": false, - "repository": false - }, - "indexByName": {}, - "renameByName": {} - } - } - ], - "type": "table" - }, - { - "datasource": { - "uid": "$datasource" - }, - "fieldConfig": { - "defaults": { - "custom": { - "align": "auto", - "cellOptions": { - "type": "auto" - }, - "filterable": false, - "inspect": false - }, - "mappings": [], - "thresholds": { - "mode": "absolute", - "steps": [ - { - "color": "green" - }, - { - "color": "red", - "value": 80 - } - ] - } - }, - "overrides": [ - { - "matcher": { - "id": "byName", - "options": "id" - }, - "properties": [ - { - "id": "custom.width", - "value": 380 - } - ] - }, - { - "matcher": { - "id": "byName", - "options": "company" - }, - "properties": [ - { - "id": "custom.width", - "value": 109 - } - ] - } - ] - }, - "gridPos": { - "h": 9, - "w": 12, - "x": 12, - "y": 25 - }, - "id": 17, - "options": { - "cellHeight": "sm", - "footer": { - "countRows": false, - "fields": "", - "reducer": [ - "sum" - ], - "show": false - }, - "showHeader": true, - "sortBy": [] - }, - "pluginVersion": "11.6.0", - "targets": [ - { - "datasource": { - "uid": "$datasource" - }, - "options": { - "query": "" - }, - "owner": "$organization", - "queryType": "Contributors", - "refId": "A", - "repository": "$repository" - } - ], - "title": "Contributors", - "type": "table" - }, - { - "datasource": { - "uid": "$datasource" - }, - "fieldConfig": { - "defaults": { - "custom": { - "align": "auto", - "cellOptions": { - "type": "auto" - }, - "filterable": false, - "inspect": false - }, - "mappings": [], - "thresholds": { - "mode": "absolute", - "steps": [ - { - "color": "green" - }, - { - "color": "red", - "value": 80 - } - ] - } - }, - "overrides": [] - }, - "gridPos": { - "h": 9, - "w": 12, - "x": 0, - "y": 34 - }, - "id": 24, - "options": { - "cellHeight": "sm", - "footer": { - "countRows": false, - "fields": "", - "reducer": [ - "sum" - ], - "show": false - }, - "showHeader": true - }, - "pluginVersion": "11.6.0", - "targets": [ - { - "datasource": { - "uid": "$datasource" - }, - "options": { - "query": "" - }, - "owner": "$organization", - "queryType": "Milestones", - "refId": "A", - "repository": "$repository" - } - ], - "title": "Milestones", - "type": "table" - }, - { - "datasource": { - "uid": "$datasource" - }, - "fieldConfig": { - "defaults": { - "custom": { - "align": "auto", - "cellOptions": { - "type": "auto" - }, - "filterable": false, - "inspect": false - }, - "mappings": [], - "thresholds": { - "mode": "absolute", - "steps": [ - { - "color": "green" - }, - { - "color": "red", - "value": 80 - } - ] - } - }, - "overrides": [] - }, - "gridPos": { - "h": 9, - "w": 12, - "x": 12, - "y": 34 - }, - "id": 18, - "options": { - "cellHeight": "sm", - "footer": { - "countRows": false, - "fields": "", - "reducer": [ - "sum" - ], - "show": false - }, - "showHeader": true, - "sortBy": [ - { - "desc": false, - "displayName": "login" - } - ] - }, - "pluginVersion": "11.6.0", - "targets": [ - { - "datasource": { - "uid": "$datasource" - }, - "owner": "$organization", - "queryType": "Releases", - "refId": "A", - "repository": "$repository" - } - ], - "title": "Releases", - "type": "table" - }, - { - "datasource": { - "uid": "$datasource" - }, - "fieldConfig": { - "defaults": { - "custom": { - "align": "auto", - "cellOptions": { - "type": "auto" - }, - "filterable": false, - "inspect": false - }, - "mappings": [], - "thresholds": { - "mode": "absolute", - "steps": [ - { - "color": "green" - }, - { - "color": "red", - "value": 80 - } - ] - } - }, - "overrides": [ - { - "matcher": { - "id": "byName", - "options": "author_email" - }, - "properties": [ - { - "id": "custom.width", - "value": 155 - } - ] - } - ] - }, - "gridPos": { - "h": 9, - "w": 12, - "x": 0, - "y": 43 - }, - "id": 11, - "options": { - "cellHeight": "sm", - "footer": { - "countRows": false, - "fields": "", - "reducer": [ - "sum" - ], - "show": false - }, - "showHeader": true, - "sortBy": [] - }, - "pluginVersion": "11.6.0", - "targets": [ - { - "datasource": { - "uid": "$datasource" - }, - "owner": "$organization", - "queryType": "Tags", - "refId": "A", - "repository": "$repository" - } - ], - "title": "Tags", - "type": "table" - } - ], - "preload": false, - "refresh": "", - "schemaVersion": 41, - "tags": [], - "templating": { - "list": [ - { - "current": { - "text": "GitHub", - "value": "PF911E414CF6BDFC5" - }, - "includeAll": false, - "name": "datasource", - "options": [], - "query": "grafana-github-datasource", - "refresh": 1, - "regex": "", - "type": "datasource" - }, - { - "current": { - "text": "docker", - "value": "docker" - }, - "label": "Organization", - "name": "organization", - "options": [ - { - "selected": true, - "text": "docker", - "value": "docker" - }, - { - "selected": false, - "text": "hyperlight-dev", - "value": "hyperlight-dev" - }, - { - "selected": false, - "text": "YaLTeR", - "value": "YaLTeR" - } - ], - "query": "docker,hyperlight-dev,YaLTeR", - "type": "custom" - }, - { - "current": { - "text": "grafana", - "value": "grafana" - }, - "datasource": "PF911E414CF6BDFC5", - "definition": "GitHub - Repositories", - "includeAll": false, - "label": "Repository", - "name": "repository", - "options": [], - "query": { - "field": "name", - "owner": "$organization", - "queryType": "Repositories", - "repository": "" - }, - "refresh": 1, - "regex": "^(niri|wl-clipboard-rs|hyperlight|buildx|model-cli)$", - "type": "query" - }, - { - "current": { - "text": "All", - "value": "$__all" - }, - "datasource": "PF911E414CF6BDFC5", - "definition": "GitHub - Labels", - "includeAll": true, - "label": "Labels", - "name": "labels", - "options": [], - "query": { - "field": "name", - "owner": "$organization", - "queryType": "Labels", - "repository": "$repository" - }, - "refresh": 1, - "regex": "", - "sort": 1, - "type": "query" - }, - { - "current": { - "text": "master", - "value": "master" - }, - "includeAll": false, - "label": "Branch", - "name": "branch", - "options": [ - { - "selected": true, - "text": "master", - "value": "master" - } - ], - "query": "master", - "type": "custom" - }, - { - "current": { - "text": "All", - "value": "$__all" - }, - "datasource": "PF911E414CF6BDFC5", - "definition": "GitHub - Milestones", - "includeAll": true, - "label": "Milestone", - "name": "milestone", - "options": [], - "query": { - "field": "title", - "owner": "$organization", - "queryType": "Milestones", - "repository": "$repository" - }, - "refresh": 1, - "regex": "", - "type": "query" - } - ] - }, - "time": { - "from": "now-7d", - "to": "now" - }, - "timepicker": {}, - "timezone": "", - "title": "GitHub", - "uid": "iVcSTeyGza", - "version": 6 -} diff --git a/docker-compose.yml b/docker-compose.yml deleted file mode 100644 index d7dce4a..0000000 --- a/docker-compose.yml +++ /dev/null @@ -1,36 +0,0 @@ -services: - grafana: - image: grafana/grafana:11.6.0 - container_name: grafana - restart: unless-stopped - ports: - - "0.0.0.0:3000:3000" - environment: - - GF_INSTALL_PLUGINS=grafana-github-datasource - - GF_AUTH_ANONYMOUS_ENABLED=true - - GF_AUTH_ANONYMOUS_ORG_ROLE=Viewer - - GF_SECURITY_ALLOW_EMBEDDING=true - - GF_AUTH_BASIC_ENABLED=false # Disable basic auth - - GF_AUTH_DISABLE_LOGIN_FORM=true # Hide login form completely - - GF_AUTH_DISABLE_SIGNOUT_MENU=true # Hide sign out option - - GF_USERS_ALLOW_SIGN_UP=false # Prevent new user registration - - GF_USERS_ALLOW_ORG_CREATE=false # Prevent org creation - - GF_DASHBOARDS_MIN_REFRESH_INTERVAL=1m # Prevent dashboard DDoS - - GF_SECURITY_COOKIE_SAMESITE=strict # Cookie security - # Trust Cloudflare headers for proper IP logging - - GF_SERVER_ENFORCE_DOMAIN=true - - GF_SERVER_ROOT_URL=https://.com - env_file: - - .env - volumes: - - ./grafana-data:/var/lib/grafana:Z - - ./provisioning:/etc/grafana/provisioning:z - - ./dashboards:/var/lib/grafana/dashboards:z - - ./grafana.ini:/etc/grafana/grafana.ini:z - deploy: - resources: - limits: - memory: 2G - reservations: - memory: 1G - diff --git a/docs/.nojekyll b/docs/.nojekyll new file mode 100644 index 0000000..e69de29 diff --git a/docs/Backlog.md b/docs/Backlog.md new file mode 100644 index 0000000..e311482 --- /dev/null +++ b/docs/Backlog.md @@ -0,0 +1,55 @@ +# 🗂️ Backlog do Projeto + +## 🎯 Objetivo +Este backlog tem como objetivo organizar e documentar os requisitos, épicos e histórias de usuário para o desenvolvimento do dashboard de monitoramento de projetos no GitHub. + +--- + +## ✅ Requisitos Funcionais +- **RF01**: O sistema deve disponibilizar painéis pré-configurados para monitorar atividades do GitHub. +- **RF02**: O sistema deve permitir visualizar estatísticas de múltiplos repositórios dentro de uma organização. +- **RF03**: O sistema deve permitir filtrar o acesso aos repositórios exibidos no dashboard. +- **RF04**: O sistema deve exibir métricas granulares como issues, pull requests, releases e commits. +- **RF05**: O sistema deve permitir acesso anônimo com permissões restritas. +- **RF06**: O sistema deve possibilitar a exportação de relatórios em formatos PDF e Excel. +- **RF07**: O sistema deve ser compatível com implantação via Docker Compose/Kubernetes. +- **RF08**: O sistema deve permitir a configuração de um domínio personalizado para acesso ao dashboard. + +--- + +## 🛡️ Requisitos Não Funcionais +- **RNF01**: O sistema deve ser implantável com alta facilidade usando Docker Compose/Kubernetes. +- **RNF02**: O sistema deve ser responsivo, adaptando-se a diferentes tamanhos de tela. +- **RNF03**: O sistema deve seguir boas práticas de código aberto, incluindo documentação técnica e política de contribuições. +- **RNF04**: O sistema deve ter compatibilidade cross-browser (Chrome, Firefox, Edge). +- **RNF05**: O sistema deve possuir integração contínua com execução de testes automatizados no GitHub Actions. + +--- + +## 🏗️ Épicos +- **EP01**: Montar infraestrutura de monitoramento de repositórios GitHub. +- **EP02**: Implementar funcionalidade de filtragem e visualização personalizada de dados. +- **EP03**: Criar recurso de exportação de relatórios. +- **EP04**: Configurar acesso anônimo e permissões de usuário. +- **EP05**: Automatizar implantação via Docker Compose/Kubernetes. +- **EP06**: Configurar domínio personalizado para acesso externo ao dashboard. + +--- + +## 👤 Histórias de Usuário +| ID | História de Usuário | +|:--|:--| +| **US01** | Como usuário, quero visualizar painéis prontos para acompanhar rapidamente a atividade dos repositórios. | +| **US02** | Como administrador, quero filtrar quais repositórios aparecem para garantir que apenas projetos relevantes sejam exibidos. | +| **US03** | Como colaborador, quero acompanhar métricas específicas (issues, pull requests, commits) para entender a evolução dos projetos. | +| **US04** | Como visitante anônimo, quero visualizar o dashboard público com permissões limitadas para acessar apenas informações liberadas. | +| **US05** | Como administrador, quero exportar dados do dashboard para PDF ou Excel para gerar relatórios de acompanhamento. | +| **US06** | Como desenvolvedor, quero subir o ambiente rapidamente usando Docker Compose/Kubernetes para agilizar a instalação. | +| **US07** | Como administrador, quero configurar um domínio personalizado para que o dashboard seja acessível em um endereço próprio. | + +--- + +## 🕰️ Histórico de Versão +| Data | Versão | Descrição | Autores | +|------------|--------|----------------------|------------------------------------------------------------------------------------------------------------------------------------| +| 24/04/2025 | 0.1 | Mapeamento inicial do backlog e estrutura | [Ana Luíza Fernandes Alves da Rocha](https://github.com/analufernanndess) e [Tales Rodrigues Gonçalves](https://github.com/TalesRG)| diff --git a/docs/_sidebar.md b/docs/_sidebar.md new file mode 100644 index 0000000..be9f70c --- /dev/null +++ b/docs/_sidebar.md @@ -0,0 +1,9 @@ +- [🏠 Inicio](home.md) +- [🧩 Funcionamento do projeto](funcionamentoDoProjeto.md) +- [🧩 Arquitetura](arquitetura.md) +- [👥 Como contribuir](contribuir.md) +- [🗂️ Backlog](Backlog.md) +- [🤝 Codigo de conduta](codigoConduta.md) +- [🛣️ Roadmap](roadmap.md) +- [🧩 Changelog](changelog.md) +- [📝 Diário de Bordo](diario-de-bordo.md) \ No newline at end of file diff --git a/docs/arquitetura.md b/docs/arquitetura.md new file mode 100644 index 0000000..0497834 --- /dev/null +++ b/docs/arquitetura.md @@ -0,0 +1,24 @@ +![Diagrama de Arquitetura](./assets/arquitetura/diagrama-arquitetura.png) + +## Descrição do Diagrama de Arquitetura + +Este diagrama de arquitetura descreve um sistema de monitoramento para repositórios do GitHub. + +### Coleta e Armazenamento de Dados + +* **GitHub:** Funciona como a fonte primária de dados. A "Coleta de dados" é realizada a partir daqui. +* **Prometheus:** Atua como o sistema central de monitoramento. + * Ele recebe os dados coletados do GitHub. + * Utiliza um banco de dados (representado pelo ícone de cilindro) para armazenar as métricas ao longo do tempo. + * O Prometheus é indicado como rodando em um ambiente **Docker** (representado pelo logo do Docker). + +### Visualização e Exportação + +* **Grafana:** É a plataforma de visualização. + * Recebe os dados do Prometheus ("Visualização de dados") para exibir em dashboards. + * O Grafana também é indicado como rodando em um ambiente **Docker**. + * Permite a exportação de dados ou relatórios em formatos **PDF** e **CSV**. + +### Fluxo Geral + +O fluxo de dados inicia-se no GitHub, de onde as informações são coletadas e enviadas ao Prometheus. O Prometheus armazena essas métricas e as disponibiliza para o Grafana, que as utiliza para criar visualizações. Por fim, o Grafana oferece a funcionalidade de exportar essas visualizações ou os dados brutos em arquivos PDF ou CSV. \ No newline at end of file diff --git a/docs/assets/analufernanndess.png b/docs/assets/analufernanndess.png new file mode 100644 index 0000000..4b91148 Binary files /dev/null and b/docs/assets/analufernanndess.png differ diff --git a/docs/assets/arquitetura/diagrama-arquitetura.png b/docs/assets/arquitetura/diagrama-arquitetura.png new file mode 100644 index 0000000..67fc252 Binary files /dev/null and b/docs/assets/arquitetura/diagrama-arquitetura.png differ diff --git a/docs/assets/gabrielMarques.png b/docs/assets/gabrielMarques.png new file mode 100644 index 0000000..aa9721b Binary files /dev/null and b/docs/assets/gabrielMarques.png differ diff --git a/docs/assets/geovaneF.png b/docs/assets/geovaneF.png new file mode 100644 index 0000000..3afe129 Binary files /dev/null and b/docs/assets/geovaneF.png differ diff --git a/docs/assets/gustavo.jpeg b/docs/assets/gustavo.jpeg new file mode 100644 index 0000000..3f7a0de Binary files /dev/null and b/docs/assets/gustavo.jpeg differ diff --git a/docs/assets/patrick.jpg b/docs/assets/patrick.jpg new file mode 100644 index 0000000..d5d5ff9 Binary files /dev/null and b/docs/assets/patrick.jpg differ diff --git a/docs/assets/pedroeduardo.jpeg b/docs/assets/pedroeduardo.jpeg new file mode 100644 index 0000000..c40ee18 Binary files /dev/null and b/docs/assets/pedroeduardo.jpeg differ diff --git a/docs/assets/renanOliveira.png b/docs/assets/renanOliveira.png new file mode 100644 index 0000000..0d5f706 Binary files /dev/null and b/docs/assets/renanOliveira.png differ diff --git a/docs/assets/talesRG.png b/docs/assets/talesRG.png new file mode 100644 index 0000000..156676a Binary files /dev/null and b/docs/assets/talesRG.png differ diff --git a/docs/assets/thomas.jpg b/docs/assets/thomas.jpg new file mode 100644 index 0000000..0f8270e Binary files /dev/null and b/docs/assets/thomas.jpg differ diff --git a/docs/assets/vitorBorges.png b/docs/assets/vitorBorges.png new file mode 100644 index 0000000..12feb81 Binary files /dev/null and b/docs/assets/vitorBorges.png differ diff --git a/docs/assets/weslley.jpeg b/docs/assets/weslley.jpeg new file mode 100644 index 0000000..dc86552 Binary files /dev/null and b/docs/assets/weslley.jpeg differ diff --git a/docs/assets/yanLuca.png b/docs/assets/yanLuca.png new file mode 100644 index 0000000..e369279 Binary files /dev/null and b/docs/assets/yanLuca.png differ diff --git a/docs/changelog.md b/docs/changelog.md new file mode 100644 index 0000000..13652bc --- /dev/null +++ b/docs/changelog.md @@ -0,0 +1,48 @@ +# 📝 CHANGELOG + +Este documento lista todas as mudanças importantes no projeto, seguindo a convenção de versionamento abaixo: + +## ℹ️ Tipos de versão + +- **Major (versão principal)** – usada quando mudanças incompatíveis com versões anteriores são introduzidas, como alterações de APIs ou estruturas internas que exigem ajustes por parte dos usuários do sistema. + +- **Minor (versão secundária)** – usada quando funcionalidades novas são adicionadas de forma retrocompatível, ou seja, sem quebrar o que já funciona. + +- **Patch (correção)** – usada quando são feitas correções de bugs ou melhorias internas que não alteram a funcionalidade nem afetam a compatibilidade. + +--- + +## [Unreleased] + +### Adicionado +- Adicionada funcionalidade de exportação para PDF +- Automatização de personalização com base em templates + +--- + +## 0.1.1 - 2025-06-02 + +### Adicionado +- Documento de arquitetura do projeto +- Fluxograma de dados da aplicação +- Registro de contribuições (logbook) +- Histórias de usuário relacionadas à personalização de dashboards + +--- + +## 0.1.0 - 2025-04-28 + +### Adicionado +- Documentação oficial (Visão do Produto) +- Roadmap e backlog do projeto +- Licença GNU General Public License v3.0 +- Arquivo de código de conduta +- Arquivo README completo +- Guia de contribuição +- Guia de segurança +- Arquivo CHANGELOG +- Template para Pull Requests +- Template para criação de Issues + +--- + diff --git a/docs/codigoConduta.md b/docs/codigoConduta.md new file mode 100644 index 0000000..8360d1e --- /dev/null +++ b/docs/codigoConduta.md @@ -0,0 +1,88 @@ +# 📜 Código de Conduta do Contributor Covenant + +## 🤝 Nosso Compromisso + +Nós, como membros, contribuintes e líderes, nos comprometemos a tornar a participação em nossa comunidade uma experiência livre de assédio para todos, independentemente de idade, tamanho corporal, deficiência visível ou invisível, etnia, características sexuais, identidade e expressão de gênero, nível de experiência, educação, status socioeconômico, nacionalidade, aparência pessoal, raça, religião ou identidade e orientação sexual. + +Nos comprometemos a agir e interagir de maneira a contribuir para uma comunidade aberta, acolhedora, diversificada, inclusiva e saudável. + +--- + +## 🌟 Nossos Padrões + +Exemplos de comportamento que contribuem para um ambiente positivo incluem: + +- Demonstrar empatia e gentileza com outras pessoas +- Ser respeitoso com diferentes opiniões, pontos de vista e experiências +- Oferecer e aceitar feedback construtivo de forma graciosa +- Assumir responsabilidade pelos nossos erros, pedindo desculpas e aprendendo com a experiência +- Focar no que é melhor para a comunidade em geral, não apenas para nós individualmente + +Exemplos de comportamentos inaceitáveis incluem: + +- Uso de linguagem ou imagens sexualizadas, atenção ou avanços sexuais de qualquer tipo +- Trollagem, comentários insultuosos ou depreciativos e ataques pessoais ou políticos +- Assédio público ou privado +- Publicação de informações privadas de terceiros, como endereço físico ou de e-mail, sem permissão explícita +- Qualquer outra conduta que possa ser razoavelmente considerada inadequada em um ambiente profissional + +--- + +## 🛡️ Responsabilidades de Aplicação + +Líderes da comunidade são responsáveis por esclarecer e aplicar nossos padrões de comportamento aceitável e tomar ações corretivas apropriadas e justas em resposta a qualquer comportamento que considerem inadequado, ameaçador, ofensivo ou prejudicial. + +Líderes da comunidade têm o direito e a responsabilidade de remover, editar ou rejeitar comentários, commits, códigos, edições de wiki, issues e outras contribuições que não estejam alinhadas a este Código de Conduta, e irão comunicar as razões das ações de moderação quando apropriado. + +--- + +## 🌐 Escopo + +Este Código de Conduta se aplica a todos os espaços da comunidade, bem como quando um indivíduo está representando oficialmente a comunidade em espaços públicos. +Exemplos incluem o uso de e-mail oficial, postagens em contas oficiais de redes sociais ou atuação como representante nomeado em um evento online ou presencial. + +--- + +## 🚨 Aplicação + +Casos de comportamento abusivo, assédio ou outras condutas inaceitáveis podem ser reportados aos líderes da comunidade responsáveis pela aplicação em Issues, utilizando o rótulo **Conduct**. + +Todas as reclamações serão revisadas e investigadas prontamente e de maneira justa. + +Todos os líderes da comunidade têm a obrigação de respeitar a privacidade e a segurança de quem reportar um incidente. + +--- + +## ⚖️ Diretrizes de Aplicação + +Líderes da comunidade seguirão estas Diretrizes de Impacto Comunitário ao determinar as consequências de qualquer ação considerada violadora deste Código de Conduta: + +### 1. Correção +- **Impacto Comunitário:** Uso de linguagem inadequada ou outro comportamento considerado inapropriado ou indesejado. +- **Consequência:** Advertência privada e escrita dos líderes da comunidade, com esclarecimento sobre a violação e pedido de desculpas públicas, se necessário. + +### 2. Advertência +- **Impacto Comunitário:** Violação através de um incidente isolado ou série de ações. +- **Consequência:** Advertência formal com consequências para comportamentos futuros. Restrição de interação com as partes envolvidas por um período definido. Violação pode levar a banimento temporário ou permanente. + +### 3. Banimento Temporário +- **Impacto Comunitário:** Violação grave dos padrões da comunidade. +- **Consequência:** Banimento temporário de todas as interações e comunicações públicas e privadas na comunidade por um período definido. Violação das condições pode levar a banimento permanente. + +### 4. Banimento Permanente +- **Impacto Comunitário:** Padrão de violações, incluindo comportamento persistente inadequado, assédio ou agressões contra grupos de indivíduos. +- **Consequência:** Banimento permanente de todas as formas de participação na comunidade. + +--- + +## 📚 Atribuição + +Este Código de Conduta é adaptado do Contributor Covenant, versão 2.0, disponível em: +[https://www.contributor-covenant.org/version/2/0/code_of_conduct.html](https://www.contributor-covenant.org/version/2/0/code_of_conduct.html) + +As Diretrizes de Impacto Comunitário foram inspiradas na escala de aplicação de conduta da Mozilla. + +Para respostas a dúvidas comuns sobre este Código de Conduta, veja: +[https://www.contributor-covenant.org/faq](https://www.contributor-covenant.org/faq) +Traduções estão disponíveis em: +[https://www.contributor-covenant.org/translations](https://www.contributor-covenant.org/translations) diff --git a/docs/commits.md b/docs/commits.md new file mode 100644 index 0000000..6ccfd9c --- /dev/null +++ b/docs/commits.md @@ -0,0 +1,60 @@ +# 📝 Política de Commits + +## 🎯 Objetivo + +Padronizar as mensagens de commit, garantindo um histórico **limpo**, **rastreável** e que facilite a colaboração no projeto. + +--- + +## 📦 Padrão Utilizado + +Adotamos o modelo [Conventional Commits](https://www.conventionalcommits.org/pt-br/v1.0.0/), que organiza as mensagens seguindo a estrutura: + +````bash +(escopo): descrição breve +```` + +- `` O que você está fazendo (ex: feat, fix, docs, etc). +- `(escopo)` Área específica do código modificada. +- `descrição breve` Uma frase curta no tempo presente. + +## 🏷️ Tipos de Commits Permitidos + +| Tipo | Descrição | Exemplos de Uso | +|:-----------|:---------------------------------------------------|:----------------| +| `build` | Ajustes em ferramentas ou dependências de build | Configurar Docker, atualizar dependências do projeto | +| `static` | Atualização de conteúdos estáticos | Substituir imagens, corrigir texto institucional | +| `ci` | Alterações em processos de integração contínua | Atualizar workflows de testes automáticos | +| `cd` | Melhorias na entrega contínua | Ajustar rotinas de deploy automático | +| `docs` | Mudanças apenas em documentação | Corrigir instruções de instalação no README | +| `feat` | Desenvolvimento de uma nova funcionalidade | Implementar login social, adicionar exportação em CSV | +| `fix` | Correção de defeitos ou falhas no código | Resolver problema de autenticação no mobile | +| `perf` | Melhorias específicas de desempenho | Reduzir tempo de carregamento da home page | +| `refactor` | Refatoração de código sem alterar o funcionamento | Reestruturar controllers para melhor organização | +| `improve` | Ajustes visuais ou melhorias pequenas | Melhorar responsividade em dispositivos móveis | +| `style` | Alterações de estilo de código | Aplicar formatação de código padrão, ajustes no ESLint | +| `test` | Inclusão ou atualização de testes | Adicionar testes de integração para novo serviço | +| `revert` | Reversão de mudanças anteriores | Desfazer atualização que causou erro em produção | + +--- + +## ℹ️ Observações Importantes + +- Use o tipo que **melhor descreva a natureza da alteração**. +- Caso tenha dúvidas, prefira abrir uma **issue** para discussão antes de submeter o commit. + +--- + +## 📜 Regras de Mensagens de Commit + +Para manter a consistência e a clareza no histórico de commits, siga estas regras: + +- Comece sempre com um dos tipos permitidos (`feat`, `fix`, `docs`, etc.). +- Utilize escopo (entre parênteses) sempre que fizer sentido. +- Escreva a descrição no tempo presente e de forma objetiva. +- Não use descrições vagas como "ajustes" ou "mudanças". +- Cada commit deve representar uma alteração lógica isolada. +- Evite commits grandes demais: prefira mudanças menores e claras. +- Use `revert` caso precise desfazer um commit anterior. + +--- \ No newline at end of file diff --git a/docs/contribuir.md b/docs/contribuir.md new file mode 100644 index 0000000..a9bb5f6 --- /dev/null +++ b/docs/contribuir.md @@ -0,0 +1,93 @@ +# 👥 Como Contribuir + +Muito obrigado pelo interesse em contribuir! +Este guia explica como você pode colaborar da melhor forma, para que suas contribuições sejam facilmente revisadas e aceitas. + +--- + +## 🚀 Como Começar + +1. Fork do Repositório +- Faça um Fork deste repositório no GitHub. +- Clone o seu Fork localmente: + +````bash +git clone https://github.com/thmasq/github-monitor.git +cd github-dashboard +```` + +2. Criação de Branch +- Crie uma branch para a sua funcionalidade ou correção: + +````bash +git checkout -b feature/nome-da-sua-feature +```` + +ou para corrigir bugs: + +````bash +git checkout -b fix/nome-da-correção +```` + +## ✍️ Fazendo Alterações +- Siga o padrão de código e estrutura do projeto. +- Comente seu código, se necessário, para explicar raciocínios complexos. +- Se modificar uma funcionalidade existente, verifique se ela ainda está funcionando. +- Atualize a documentação relevante, se aplicável. + +## 📦 Commits +Seja claro nas mensagens de commit: + +- Mensagens curtas e objetivas, por exemplo: + - `fix: corrigir erro de autenticação` + - `feat: adicionar filtro por data no dashboard` + - `docs: atualizar guia de instalação` +- Evite commits genéricos como `atualizações` ou `mudanças`. + +Faça o commit assim: + +````bash +git add . +git commit -m "feat: adiciona nova funcionalidade X" +```` +Para seguir as boas práticas, recomendamos a leitura da nossa [Política de Commits](commits). + +## 📤 Push e Pull Request +1. Envie sua branch para o seu Fork: + +````bash +git push origin feature/nome-da-sua-feature +```` + +2. Crie um Pull Request: +- Acesse o seu fork no GitHub. +- Clique em "Compare & pull request". +- Preencha o título e a descrição explicando o que foi feito e por que. +- Indique se houveram mudanças que exigem atenção especial (como quebra de compatibilidade). + +## ✅ Regras para Aceitação de Pull Requests + +- Código funcional e testado. +- Código bem formatado (sem erros de lint ou formatação básica). +- Pull Requests focados em uma mudança específica (evitar juntar várias coisas não relacionadas). +- Discussões e ajustes podem ser solicitados durante a revisão do PR. +
+ 📋 Checklist Antes de Criar um Pull Request + + - [ ] Eu testei as alterações localmente + - [ ] Eu atualizei a documentação, se necessário + - [ ] Eu segui o padrão de código do projeto + - [ ] O Pull Request está focado em uma única mudança + +
+ +## 💬 Dúvidas? +Se você tiver qualquer dúvida, abra uma Issue ou entre em contato. Estamos felizes em ajudar! + +Obrigado por fazer parte deste projeto! + + +## 🕰️ Histórico de Versão +| Data | Versão | Descrição | Autores | +|------------|--------|---------------------------------------------|------------------------------------------------------------------------------------------------------------------------------------| +| 24/04/2025 | 0.1 | Adicionando como contribuir para o projeto | [Ana Luíza Fernandes Alves da Rocha](https://github.com/analufernanndess) e [Tales Rodrigues Gonçalves](https://github.com/TalesRG)| diff --git a/docs/diario-de-bordo.md b/docs/diario-de-bordo.md new file mode 100644 index 0000000..6cf276a --- /dev/null +++ b/docs/diario-de-bordo.md @@ -0,0 +1,58 @@ +# 📝 Diário de Bordo + +--- + +## 📅 Reunião – 22/04/2025 + +**👥 Participantes:** +Ana Luíza Fernandes, Pedro Eduardo, Tales Rodrigues, Yan Luca Viana + +**🗂️ Assuntos discutidos:** +- Organização do projeto +- Apresentação dos artefatos para a Release 1 +- Separação das tarefas e definição de papéis + +**📌 Observações:** +- Telegram e GitHub como canais principais +- Documentação será feita no GitHub Pages +- Roadmap hospedado no Pages + +**📋 Ações definidas:** +- Organizar o Telegram e Issues +- Iniciar o GitHub Pages +- Customizar o Grafana +- Adicionar features no backlog +- Atualizar Issues no GitHub +- Testar soluções do Grafana +- Rastrear os integrantes + +🔁 **Commits relevantes dessa semana foram realizados e podem ser conferidos no [repositório](https://github.com/thmasq/github-monitor/commits).** + +--- + +## 📅 Reunião – 26/05/2025 + +**👥 Participantes:** +Pedro Eduardo, Thomas, Yan Luca Viana, Renann de Oliveira, Vitor Borges + +**🗂️ Assuntos discutidos:** +- Organização das issues +- Atualização da documentação + +**📋 Ações definidas:** +- Personalizar dashboards (Vitor B.) +- Atualizar changelog com releases (Pedro, Gabriel) +- Desenhar a arquitetura da aplicação (Tales) +- Criar fluxograma dos dados (Yan, Renann) +- Adicionar o diário de bordo no GitHub Pages (Ana Luíza) +- Benchmark de soluções para exportação em PDF (Pedro) + +🔁 **Commits relevantes dessa semana foram realizados e podem ser conferidos no [repositório](https://github.com/thmasq/github-monitor/commits).** + +--- + +## 🕰️ Histórico de Versão +| Data | Versão | Descrição | Autores | +|------------|--------|--------------------------------------|------------------------------------------------------------------------------------------------------------------------------------| +| 24/04/2025 | 0.1 | Adicionando Funcionamento do projeto | [Ana Luíza Fernandes Alves da Rocha](https://github.com/analufernanndess)| + diff --git a/docs/funcionamentoDoProjeto.md b/docs/funcionamentoDoProjeto.md new file mode 100644 index 0000000..6efdc5b --- /dev/null +++ b/docs/funcionamentoDoProjeto.md @@ -0,0 +1,175 @@ +# 🧩 Funcionamento do Projeto + +## 🎯 Objetivo: +Um painel de monitoramento do GitHub pronto para uso no Grafana que oferece insights abrangentes sobre repositórios do GitHub, issues, pull requests e muito mais. Este projeto facilita a configuração e personalização de painéis para organizações e repositórios específicos do GitHub. + +## 🛠️ Funcionalidades: +### 🖥️ Painéis pré-configurados: +Painéis prontos para uso para monitorar a atividade no GitHub + +### 🧭 Visão geral da organização: +Visualize estatísticas de vários repositórios dentro de uma organização + +### 🗂️ Filtragem de repositórios: +Limite o acesso do painel a repositórios específicos + +### 📊 Métricas granulares: +Acompanhe issues, pull requests, releases, commits e mais + +### 🕵️‍♂️ Acesso anônimo: +Configure para visualização pública com permissões restritas + +### 🐳 Compatível com Docker: +Faça a implantação facilmente com Docker Compose + +## 📋 Requisitos +- Docker and Docker Compose +- Token de Acesso Pessoal do GitHub +- Bash (para executar scripts de configuração) +- jq (para o script de filtragem de repositórios) + +## 🚀 Início Rápido + +1. Fork do Repositório: +- Faça um Fork deste repositório no GitHub. +- Clone o seu Fork localmente: + +```bash +git clone https://github.com/thmasq/github-monitor.git +cd github-dashboard +``` + +2. Crie o arquivo de ambiente + +```bash +cp .env.template .env +``` + +3. Adicione seu token do GitHub ao arquivo .env + +```bash +# Required: GitHub API Token +GITHUB_TOKEN=your_github_token_here + +# Optional: Repositories to monitor +REPOS="docker/buildx, docker/model-cli" + +# Optional: Grafana server configuration +GF_SERVER_ROOT_URL=https://your-domain.com +GF_SERVER_DOMAIN=your-domain.com +GF_SERVER_ENFORCE_DOMAIN=true +``` + +4. Configure as permissões (necessário para ambientes com SELinux) + +```bash +./set-perms.sh +``` + +5. Gere o grafana.ini + +```bash +./generate-config.sh +``` + + +6. Inicie o Grafana + +```bash +docker-compose up -d +``` + +7. Acesse o dashboard +Abra http://localhost:3000 no seu navegador. + +## ⚙️ Configuração + +### 🔒 Limitando o Acesso aos Repositórios + +Por padrão, o dashboard exibe todos os repositórios das organizações configuradas. Para limitar o acesso a repositórios específicos: + +1. **Defina os repositórios em uma variável de ambiente** + +````bash +export REPOS="YaLTeR/niri, YaLTeR/wl-clipboard-rs, hyperlight-dev/hyperlight, docker/buildx, docker/model-cli" +```` + +2. Execute o script de atualização + +````bash +./update-dashboard.sh +```` + +### 🌐 Configuração de Domínio Personalizado +Para disponibilizar o dashboard em um domínio personalizado: + +1. Edite o arquivo *docker-compose.yml* e atualize: + +````yaml +GF_SERVER_ROOT_URL=https://seu-dominio.com +```` + +2. Edite o arquivo *grafana.ini* e atualize: + +````ini +[server] + root_url = https://seu-dominio.com + domain = seu-dominio.com + +```` + +## 📊 Visão Geral do Dashboard + +Este projeto inclui dois dashboards principais: + +### GitHub Dashboard + +Fornece métricas detalhadas para um repositório específico: + +- Contagem de releases e tags +- Métricas de pull requests (quantidade, tempo de abertura) +- Métricas de issues (quantidade abertas/fechadas, tempo de resolução) +- Tabelas de dados históricos para commits, issues e pull requests +- Informações sobre colaboradores + +### GitHub Organization Dashboard + +Fornece uma visão geral de múltiplos repositórios em uma organização: + +- Releases por repositório +- Issues criadas por repositório +- Pull requests por repositório +- Issues e pull requests ativas + +## 🔒 Recursos de Segurança + +Esta configuração foi projetada com a segurança em mente: + +- Acesso anônimo com permissões apenas de visualização +- Sem formulário de login ou acesso à API para usuários anônimos +- Proteção CSRF com configurações rígidas de cookies +- Limitação de taxa para atualizações do dashboard + +--- + +## 🎨 Personalização + +### Adicionando Dashboards Personalizados + +Coloque seus arquivos JSON de dashboards personalizados no diretório `dashboards` e eles serão carregados automaticamente. + +### Modificando a Configuração da Fonte de Dados + +Edite o arquivo `provisioning/datasources/datasource.yaml` para modificar as configurações da fonte de dados do GitHub. + +--- + +## 📜 Licença + +Este projeto é licenciado sob a Licença Pública Geral GNU versão 3.0 — veja o arquivo [licença](LICENSE) para mais detalhes. + +## 🕰️ Histórico de Versão +| Data | Versão | Descrição | Autores | +|------------|--------|--------------------------------------|------------------------------------------------------------------------------------------------------------------------------------| +| 24/04/2025 | 0.1 | Adicionando Funcionamento do projeto | [Ana Luíza Fernandes Alves da Rocha](https://github.com/analufernanndess) e [Tales Rodrigues Gonçalves](https://github.com/TalesRG)| + diff --git a/docs/home.md b/docs/home.md new file mode 100644 index 0000000..1edef39 --- /dev/null +++ b/docs/home.md @@ -0,0 +1,32 @@ +# 📈 Dashboard de Monitoramento de Projetos no GitHub + +## 📝 Descrição: +O projeto visa criar um *dashboard em tempo real* para acompanhar repositórios no GitHub, com dados como issues, pull requests, estrelas e contribuidores, atendendo disciplinas da FCTE + +## 🎯 Objetivo: +Selecionar uma solução open source, customizar com a identidade visual da FCTE, e garantir que seja fácil +de implantar via Docker Compose. A solução deve incluir visualização por contribuidor e +exportação de relatórios (PDF/Excel). E subir em ambiente de produção (laboratório). + +## 👥 Equipe +| Nome | Matrícula | Foto | +|--------------------------------------|-----------|----------------------------------------------------------------------| +| [Ana Luíza Fernandes Alves da Rocha](https://github.com/analufernanndess) | 211030667 | Ana Luiza | +| [Gabriel Marques de Souza](https://github.com/GabrielMS00) | 202016266 | gabrielMarques | +| [Geovane Freitas](https://github.com/GeovaneSFT) | 211031708 | geovaneF | +| [Gustavo Henrique](https://github.com/GustavoHenriqueRS) | 211030783 | gustavoHenrique | +| [Patrick Anderson](https://github.com/patrickacs) | 211030620 | patrick | +| [Pedro Eduardo Santos Sousa](https://github.com/PedroEduardoSS) | 211062375 | pedroeduardo | +| [Renann de Oliveira](https://github.com/renannOgomes) | 200043030 | renan Oliveira | +| [Tales Rodrigues Gonçalves](https://github.com/TalesRG) | 211041295 | talesRG | +| [Thomas Queiroz](https://github.com/thmasq) | 211062526 | thomas | +| [Vitor Borges dos Santos](https://github.com/VitorB2002) | 200028626 | Vitor Borges | +| [Weslley Alves](https://github.com/weslley17w) | 200044567 |Weslley Alves | +| [Yan Luca Viana de Araújo Fontenele](https://github.com/yan-luca) | |Yan Luca | + + +## 🕰️ Histórico de Versão +| Data | Versão | Descrição | Autores | +|------------|--------|----------------------|------------------------------------------------------------------------------------------------------------------------------------| +| 24/04/2025 | 0.1 | Criação da tela home | [Ana Luíza Fernandes Alves da Rocha](https://github.com/analufernanndess) e [Tales Rodrigues Gonçalves](https://github.com/TalesRG)| +| 27/04/2025 | 0.2 | Adição de membros da equipe | [Pedro Eduardo Santos Sousa](https://github.com/PedroEduardoSS) | diff --git a/docs/index.html b/docs/index.html new file mode 100644 index 0000000..d8d1c62 --- /dev/null +++ b/docs/index.html @@ -0,0 +1,29 @@ + + + + + Dashboard de Monitoramento de Projetos no GitHub + + + + + + +
+ + + + + + + + diff --git a/docs/license.md b/docs/license.md new file mode 100644 index 0000000..12aca0a --- /dev/null +++ b/docs/license.md @@ -0,0 +1,674 @@ +GNU GENERAL PUBLIC LICENSE +Version 3, 29 June 2007 + +Copyright (C) 2007 Free Software Foundation, Inc. +Everyone is permitted to copy and distribute verbatim copies +of this license document, but changing it is not allowed. + + Preamble + +The GNU General Public License is a free, copyleft license for +software and other kinds of works. + +The licenses for most software and other practical works are designed +to take away your freedom to share and change the works. By contrast, +the GNU General Public License is intended to guarantee your freedom to +share and change all versions of a program--to make sure it remains free +software for all its users. We, the Free Software Foundation, use the +GNU General Public License for most of our software; it applies also to +any other work released this way by its authors. You can apply it to +your programs, too. + +When we speak of free software, we are referring to freedom, not +price. Our General Public Licenses are designed to make sure that you +have the freedom to distribute copies of free software (and charge for +them if you wish), that you receive source code or can get it if you +want it, that you can change the software or use pieces of it in new +free programs, and that you know you can do these things. + +To protect your rights, we need to prevent others from denying you +these rights or asking you to surrender the rights. Therefore, you have +certain responsibilities if you distribute copies of the software, or if +you modify it: responsibilities to respect the freedom of others. + +For example, if you distribute copies of such a program, whether +gratis or for a fee, you must pass on to the recipients the same +freedoms that you received. You must make sure that they, too, receive +or can get the source code. And you must show them these terms so they +know their rights. + +Developers that use the GNU GPL protect your rights with two steps: +(1) assert copyright on the software, and (2) offer you this License +giving you legal permission to copy, distribute and/or modify it. + +For the developers' and authors' protection, the GPL clearly explains +that there is no warranty for this free software. For both users' and +authors' sake, the GPL requires that modified versions be marked as +changed, so that their problems will not be attributed erroneously to +authors of previous versions. + +Some devices are designed to deny users access to install or run +modified versions of the software inside them, although the manufacturer +can do so. This is fundamentally incompatible with the aim of +protecting users' freedom to change the software. The systematic +pattern of such abuse occurs in the area of products for individuals to +use, which is precisely where it is most unacceptable. Therefore, we +have designed this version of the GPL to prohibit the practice for those +products. If such problems arise substantially in other domains, we +stand ready to extend this provision to those domains in future versions +of the GPL, as needed to protect the freedom of users. + +Finally, every program is threatened constantly by software patents. +States should not allow patents to restrict development and use of +software on general-purpose computers, but in those that do, we wish to +avoid the special danger that patents applied to a free program could +make it effectively proprietary. To prevent this, the GPL assures that +patents cannot be used to render the program non-free. + +The precise terms and conditions for copying, distribution and +modification follow. + + TERMS AND CONDITIONS + +0. Definitions. + +"This License" refers to version 3 of the GNU General Public License. + +"Copyright" also means copyright-like laws that apply to other kinds of +works, such as semiconductor masks. + +"The Program" refers to any copyrightable work licensed under this +License. Each licensee is addressed as "you". "Licensees" and +"recipients" may be individuals or organizations. + +To "modify" a work means to copy from or adapt all or part of the work +in a fashion requiring copyright permission, other than the making of an +exact copy. The resulting work is called a "modified version" of the +earlier work or a work "based on" the earlier work. + +A "covered work" means either the unmodified Program or a work based +on the Program. + +To "propagate" a work means to do anything with it that, without +permission, would make you directly or secondarily liable for +infringement under applicable copyright law, except executing it on a +computer or modifying a private copy. Propagation includes copying, +distribution (with or without modification), making available to the +public, and in some countries other activities as well. + +To "convey" a work means any kind of propagation that enables other +parties to make or receive copies. Mere interaction with a user through +a computer network, with no transfer of a copy, is not conveying. + +An interactive user interface displays "Appropriate Legal Notices" +to the extent that it includes a convenient and prominently visible +feature that (1) displays an appropriate copyright notice, and (2) +tells the user that there is no warranty for the work (except to the +extent that warranties are provided), that licensees may convey the +work under this License, and how to view a copy of this License. If +the interface presents a list of user commands or options, such as a +menu, a prominent item in the list meets this criterion. + +1. Source Code. + +The "source code" for a work means the preferred form of the work +for making modifications to it. "Object code" means any non-source +form of a work. + +A "Standard Interface" means an interface that either is an official +standard defined by a recognized standards body, or, in the case of +interfaces specified for a particular programming language, one that +is widely used among developers working in that language. + +The "System Libraries" of an executable work include anything, other +than the work as a whole, that (a) is included in the normal form of +packaging a Major Component, but which is not part of that Major +Component, and (b) serves only to enable use of the work with that +Major Component, or to implement a Standard Interface for which an +implementation is available to the public in source code form. A +"Major Component", in this context, means a major essential component +(kernel, window system, and so on) of the specific operating system +(if any) on which the executable work runs, or a compiler used to +produce the work, or an object code interpreter used to run it. + +The "Corresponding Source" for a work in object code form means all +the source code needed to generate, install, and (for an executable +work) run the object code and to modify the work, including scripts to +control those activities. However, it does not include the work's +System Libraries, or general-purpose tools or generally available free +programs which are used unmodified in performing those activities but +which are not part of the work. For example, Corresponding Source +includes interface definition files associated with source files for +the work, and the source code for shared libraries and dynamically +linked subprograms that the work is specifically designed to require, +such as by intimate data communication or control flow between those +subprograms and other parts of the work. + +The Corresponding Source need not include anything that users +can regenerate automatically from other parts of the Corresponding +Source. + +The Corresponding Source for a work in source code form is that +same work. + +2. Basic Permissions. + +All rights granted under this License are granted for the term of +copyright on the Program, and are irrevocable provided the stated +conditions are met. This License explicitly affirms your unlimited +permission to run the unmodified Program. The output from running a +covered work is covered by this License only if the output, given its +content, constitutes a covered work. This License acknowledges your +rights of fair use or other equivalent, as provided by copyright law. + +You may make, run and propagate covered works that you do not +convey, without conditions so long as your license otherwise remains +in force. You may convey covered works to others for the sole purpose +of having them make modifications exclusively for you, or provide you +with facilities for running those works, provided that you comply with +the terms of this License in conveying all material for which you do +not control copyright. Those thus making or running the covered works +for you must do so exclusively on your behalf, under your direction +and control, on terms that prohibit them from making any copies of +your copyrighted material outside their relationship with you. + +Conveying under any other circumstances is permitted solely under +the conditions stated below. Sublicensing is not allowed; section 10 +makes it unnecessary. + +3. Protecting Users' Legal Rights From Anti-Circumvention Law. + +No covered work shall be deemed part of an effective technological +measure under any applicable law fulfilling obligations under article +11 of the WIPO copyright treaty adopted on 20 December 1996, or +similar laws prohibiting or restricting circumvention of such +measures. + +When you convey a covered work, you waive any legal power to forbid +circumvention of technological measures to the extent such circumvention +is effected by exercising rights under this License with respect to +the covered work, and you disclaim any intention to limit operation or +modification of the work as a means of enforcing, against the work's +users, your or third parties' legal rights to forbid circumvention of +technological measures. + +4. Conveying Verbatim Copies. + +You may convey verbatim copies of the Program's source code as you +receive it, in any medium, provided that you conspicuously and +appropriately publish on each copy an appropriate copyright notice; +keep intact all notices stating that this License and any +non-permissive terms added in accord with section 7 apply to the code; +keep intact all notices of the absence of any warranty; and give all +recipients a copy of this License along with the Program. + +You may charge any price or no price for each copy that you convey, +and you may offer support or warranty protection for a fee. + +5. Conveying Modified Source Versions. + +You may convey a work based on the Program, or the modifications to +produce it from the Program, in the form of source code under the +terms of section 4, provided that you also meet all of these conditions: + + a) The work must carry prominent notices stating that you modified + it, and giving a relevant date. + + b) The work must carry prominent notices stating that it is + released under this License and any conditions added under section + 7. This requirement modifies the requirement in section 4 to + "keep intact all notices". + + c) You must license the entire work, as a whole, under this + License to anyone who comes into possession of a copy. This + License will therefore apply, along with any applicable section 7 + additional terms, to the whole of the work, and all its parts, + regardless of how they are packaged. This License gives no + permission to license the work in any other way, but it does not + invalidate such permission if you have separately received it. + + d) If the work has interactive user interfaces, each must display + Appropriate Legal Notices; however, if the Program has interactive + interfaces that do not display Appropriate Legal Notices, your + work need not make them do so. + +A compilation of a covered work with other separate and independent +works, which are not by their nature extensions of the covered work, +and which are not combined with it such as to form a larger program, +in or on a volume of a storage or distribution medium, is called an +"aggregate" if the compilation and its resulting copyright are not +used to limit the access or legal rights of the compilation's users +beyond what the individual works permit. Inclusion of a covered work +in an aggregate does not cause this License to apply to the other +parts of the aggregate. + +6. Conveying Non-Source Forms. + +You may convey a covered work in object code form under the terms +of sections 4 and 5, provided that you also convey the +machine-readable Corresponding Source under the terms of this License, +in one of these ways: + + a) Convey the object code in, or embodied in, a physical product + (including a physical distribution medium), accompanied by the + Corresponding Source fixed on a durable physical medium + customarily used for software interchange. + + b) Convey the object code in, or embodied in, a physical product + (including a physical distribution medium), accompanied by a + written offer, valid for at least three years and valid for as + long as you offer spare parts or customer support for that product + model, to give anyone who possesses the object code either (1) a + copy of the Corresponding Source for all the software in the + product that is covered by this License, on a durable physical + medium customarily used for software interchange, for a price no + more than your reasonable cost of physically performing this + conveying of source, or (2) access to copy the + Corresponding Source from a network server at no charge. + + c) Convey individual copies of the object code with a copy of the + written offer to provide the Corresponding Source. This + alternative is allowed only occasionally and noncommercially, and + only if you received the object code with such an offer, in accord + with subsection 6b. + + d) Convey the object code by offering access from a designated + place (gratis or for a charge), and offer equivalent access to the + Corresponding Source in the same way through the same place at no + further charge. You need not require recipients to copy the + Corresponding Source along with the object code. If the place to + copy the object code is a network server, the Corresponding Source + may be on a different server (operated by you or a third party) + that supports equivalent copying facilities, provided you maintain + clear directions next to the object code saying where to find the + Corresponding Source. Regardless of what server hosts the + Corresponding Source, you remain obligated to ensure that it is + available for as long as needed to satisfy these requirements. + + e) Convey the object code using peer-to-peer transmission, provided + you inform other peers where the object code and Corresponding + Source of the work are being offered to the general public at no + charge under subsection 6d. + +A separable portion of the object code, whose source code is excluded +from the Corresponding Source as a System Library, need not be +included in conveying the object code work. + +A "User Product" is either (1) a "consumer product", which means any +tangible personal property which is normally used for personal, family, +or household purposes, or (2) anything designed or sold for incorporation +into a dwelling. In determining whether a product is a consumer product, +doubtful cases shall be resolved in favor of coverage. For a particular +product received by a particular user, "normally used" refers to a +typical or common use of that class of product, regardless of the status +of the particular user or of the way in which the particular user +actually uses, or expects or is expected to use, the product. A product +is a consumer product regardless of whether the product has substantial +commercial, industrial or non-consumer uses, unless such uses represent +the only significant mode of use of the product. + +"Installation Information" for a User Product means any methods, +procedures, authorization keys, or other information required to install +and execute modified versions of a covered work in that User Product from +a modified version of its Corresponding Source. The information must +suffice to ensure that the continued functioning of the modified object +code is in no case prevented or interfered with solely because +modification has been made. + +If you convey an object code work under this section in, or with, or +specifically for use in, a User Product, and the conveying occurs as +part of a transaction in which the right of possession and use of the +User Product is transferred to the recipient in perpetuity or for a +fixed term (regardless of how the transaction is characterized), the +Corresponding Source conveyed under this section must be accompanied +by the Installation Information. But this requirement does not apply +if neither you nor any third party retains the ability to install +modified object code on the User Product (for example, the work has +been installed in ROM). + +The requirement to provide Installation Information does not include a +requirement to continue to provide support service, warranty, or updates +for a work that has been modified or installed by the recipient, or for +the User Product in which it has been modified or installed. Access to a +network may be denied when the modification itself materially and +adversely affects the operation of the network or violates the rules and +protocols for communication across the network. + +Corresponding Source conveyed, and Installation Information provided, +in accord with this section must be in a format that is publicly +documented (and with an implementation available to the public in +source code form), and must require no special password or key for +unpacking, reading or copying. + +7. Additional Terms. + +"Additional permissions" are terms that supplement the terms of this +License by making exceptions from one or more of its conditions. +Additional permissions that are applicable to the entire Program shall +be treated as though they were included in this License, to the extent +that they are valid under applicable law. If additional permissions +apply only to part of the Program, that part may be used separately +under those permissions, but the entire Program remains governed by +this License without regard to the additional permissions. + +When you convey a copy of a covered work, you may at your option +remove any additional permissions from that copy, or from any part of +it. (Additional permissions may be written to require their own +removal in certain cases when you modify the work.) You may place +additional permissions on material, added by you to a covered work, +for which you have or can give appropriate copyright permission. + +Notwithstanding any other provision of this License, for material you +add to a covered work, you may (if authorized by the copyright holders of +that material) supplement the terms of this License with terms: + + a) Disclaiming warranty or limiting liability differently from the + terms of sections 15 and 16 of this License; or + + b) Requiring preservation of specified reasonable legal notices or + author attributions in that material or in the Appropriate Legal + Notices displayed by works containing it; or + + c) Prohibiting misrepresentation of the origin of that material, or + requiring that modified versions of such material be marked in + reasonable ways as different from the original version; or + + d) Limiting the use for publicity purposes of names of licensors or + authors of the material; or + + e) Declining to grant rights under trademark law for use of some + trade names, trademarks, or service marks; or + + f) Requiring indemnification of licensors and authors of that + material by anyone who conveys the material (or modified versions of + it) with contractual assumptions of liability to the recipient, for + any liability that these contractual assumptions directly impose on + those licensors and authors. + +All other non-permissive additional terms are considered "further +restrictions" within the meaning of section 10. If the Program as you +received it, or any part of it, contains a notice stating that it is +governed by this License along with a term that is a further +restriction, you may remove that term. If a license document contains +a further restriction but permits relicensing or conveying under this +License, you may add to a covered work material governed by the terms +of that license document, provided that the further restriction does +not survive such relicensing or conveying. + +If you add terms to a covered work in accord with this section, you +must place, in the relevant source files, a statement of the +additional terms that apply to those files, or a notice indicating +where to find the applicable terms. + +Additional terms, permissive or non-permissive, may be stated in the +form of a separately written license, or stated as exceptions; +the above requirements apply either way. + +8. Termination. + +You may not propagate or modify a covered work except as expressly +provided under this License. Any attempt otherwise to propagate or +modify it is void, and will automatically terminate your rights under +this License (including any patent licenses granted under the third +paragraph of section 11). + +However, if you cease all violation of this License, then your +license from a particular copyright holder is reinstated (a) +provisionally, unless and until the copyright holder explicitly and +finally terminates your license, and (b) permanently, if the copyright +holder fails to notify you of the violation by some reasonable means +prior to 60 days after the cessation. + +Moreover, your license from a particular copyright holder is +reinstated permanently if the copyright holder notifies you of the +violation by some reasonable means, this is the first time you have +received notice of violation of this License (for any work) from that +copyright holder, and you cure the violation prior to 30 days after +your receipt of the notice. + +Termination of your rights under this section does not terminate the +licenses of parties who have received copies or rights from you under +this License. If your rights have been terminated and not permanently +reinstated, you do not qualify to receive new licenses for the same +material under section 10. + +9. Acceptance Not Required for Having Copies. + +You are not required to accept this License in order to receive or +run a copy of the Program. Ancillary propagation of a covered work +occurring solely as a consequence of using peer-to-peer transmission +to receive a copy likewise does not require acceptance. However, +nothing other than this License grants you permission to propagate or +modify any covered work. These actions infringe copyright if you do +not accept this License. Therefore, by modifying or propagating a +covered work, you indicate your acceptance of this License to do so. + +10. Automatic Licensing of Downstream Recipients. + +Each time you convey a covered work, the recipient automatically +receives a license from the original licensors, to run, modify and +propagate that work, subject to this License. You are not responsible +for enforcing compliance by third parties with this License. + +An "entity transaction" is a transaction transferring control of an +organization, or substantially all assets of one, or subdividing an +organization, or merging organizations. If propagation of a covered +work results from an entity transaction, each party to that +transaction who receives a copy of the work also receives whatever +licenses to the work the party's predecessor in interest had or could +give under the previous paragraph, plus a right to possession of the +Corresponding Source of the work from the predecessor in interest, if +the predecessor has it or can get it with reasonable efforts. + +You may not impose any further restrictions on the exercise of the +rights granted or affirmed under this License. For example, you may +not impose a license fee, royalty, or other charge for exercise of +rights granted under this License, and you may not initiate litigation +(including a cross-claim or counterclaim in a lawsuit) alleging that +any patent claim is infringed by making, using, selling, offering for +sale, or importing the Program or any portion of it. + +11. Patents. + +A "contributor" is a copyright holder who authorizes use under this +License of the Program or a work on which the Program is based. The +work thus licensed is called the contributor's "contributor version". + +A contributor's "essential patent claims" are all patent claims +owned or controlled by the contributor, whether already acquired or +hereafter acquired, that would be infringed by some manner, permitted +by this License, of making, using, or selling its contributor version, +but do not include claims that would be infringed only as a +consequence of further modification of the contributor version. For +purposes of this definition, "control" includes the right to grant +patent sublicenses in a manner consistent with the requirements of +this License. + +Each contributor grants you a non-exclusive, worldwide, royalty-free +patent license under the contributor's essential patent claims, to +make, use, sell, offer for sale, import and otherwise run, modify and +propagate the contents of its contributor version. + +In the following three paragraphs, a "patent license" is any express +agreement or commitment, however denominated, not to enforce a patent +(such as an express permission to practice a patent or covenant not to +sue for patent infringement). To "grant" such a patent license to a +party means to make such an agreement or commitment not to enforce a +patent against the party. + +If you convey a covered work, knowingly relying on a patent license, +and the Corresponding Source of the work is not available for anyone +to copy, free of charge and under the terms of this License, through a +publicly available network server or other readily accessible means, +then you must either (1) cause the Corresponding Source to be so +available, or (2) arrange to deprive yourself of the benefit of the +patent license for this particular work, or (3) arrange, in a manner +consistent with the requirements of this License, to extend the patent +license to downstream recipients. "Knowingly relying" means you have +actual knowledge that, but for the patent license, your conveying the +covered work in a country, or your recipient's use of the covered work +in a country, would infringe one or more identifiable patents in that +country that you have reason to believe are valid. + +If, pursuant to or in connection with a single transaction or +arrangement, you convey, or propagate by procuring conveyance of, a +covered work, and grant a patent license to some of the parties +receiving the covered work authorizing them to use, propagate, modify +or convey a specific copy of the covered work, then the patent license +you grant is automatically extended to all recipients of the covered +work and works based on it. + +A patent license is "discriminatory" if it does not include within +the scope of its coverage, prohibits the exercise of, or is +conditioned on the non-exercise of one or more of the rights that are +specifically granted under this License. You may not convey a covered +work if you are a party to an arrangement with a third party that is +in the business of distributing software, under which you make payment +to the third party based on the extent of your activity of conveying +the work, and under which the third party grants, to any of the +parties who would receive the covered work from you, a discriminatory +patent license (a) in connection with copies of the covered work +conveyed by you (or copies made from those copies), or (b) primarily +for and in connection with specific products or compilations that +contain the covered work, unless you entered into that arrangement, +or that patent license was granted, prior to 28 March 2007. + +Nothing in this License shall be construed as excluding or limiting +any implied license or other defenses to infringement that may +otherwise be available to you under applicable patent law. + +12. No Surrender of Others' Freedom. + +If conditions are imposed on you (whether by court order, agreement or +otherwise) that contradict the conditions of this License, they do not +excuse you from the conditions of this License. If you cannot convey a +covered work so as to satisfy simultaneously your obligations under this +License and any other pertinent obligations, then as a consequence you may +not convey it at all. For example, if you agree to terms that obligate you +to collect a royalty for further conveying from those to whom you convey +the Program, the only way you could satisfy both those terms and this +License would be to refrain entirely from conveying the Program. + +13. Use with the GNU Affero General Public License. + +Notwithstanding any other provision of this License, you have +permission to link or combine any covered work with a work licensed +under version 3 of the GNU Affero General Public License into a single +combined work, and to convey the resulting work. The terms of this +License will continue to apply to the part which is the covered work, +but the special requirements of the GNU Affero General Public License, +section 13, concerning interaction through a network will apply to the +combination as such. + +14. Revised Versions of this License. + +The Free Software Foundation may publish revised and/or new versions of +the GNU General Public License from time to time. Such new versions will +be similar in spirit to the present version, but may differ in detail to +address new problems or concerns. + +Each version is given a distinguishing version number. If the +Program specifies that a certain numbered version of the GNU General +Public License "or any later version" applies to it, you have the +option of following the terms and conditions either of that numbered +version or of any later version published by the Free Software +Foundation. If the Program does not specify a version number of the +GNU General Public License, you may choose any version ever published +by the Free Software Foundation. + +If the Program specifies that a proxy can decide which future +versions of the GNU General Public License can be used, that proxy's +public statement of acceptance of a version permanently authorizes you +to choose that version for the Program. + +Later license versions may give you additional or different +permissions. However, no additional obligations are imposed on any +author or copyright holder as a result of your choosing to follow a +later version. + +15. Disclaimer of Warranty. + +THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY +APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT +HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY +OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, +THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR +PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM +IS WITH YOU. SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF +ALL NECESSARY SERVICING, REPAIR OR CORRECTION. + +16. Limitation of Liability. + +IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING +WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS +THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY +GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE +USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF +DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD +PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS), +EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF +SUCH DAMAGES. + +17. Interpretation of Sections 15 and 16. + +If the disclaimer of warranty and limitation of liability provided +above cannot be given local legal effect according to their terms, +reviewing courts shall apply local law that most closely approximates +an absolute waiver of all civil liability in connection with the +Program, unless a warranty or assumption of liability accompanies a +copy of the Program in return for a fee. + + END OF TERMS AND CONDITIONS + + How to Apply These Terms to Your New Programs + +If you develop a new program, and you want it to be of the greatest +possible use to the public, the best way to achieve this is to make it +free software which everyone can redistribute and change under these terms. + +To do so, attach the following notices to the program. It is safest +to attach them to the start of each source file to most effectively +state the exclusion of warranty; and each file should have at least +the "copyright" line and a pointer to where the full notice is found. + + + Copyright (C) + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . + +Also add information on how to contact you by electronic and paper mail. + +If the program does terminal interaction, make it output a short +notice like this when it starts in an interactive mode: + + Copyright (C) + This program comes with ABSOLUTELY NO WARRANTY; for details type `show w'. + This is free software, and you are welcome to redistribute it + under certain conditions; type `show c' for details. + +The hypothetical commands `show w' and `show c' should show the appropriate +parts of the General Public License. Of course, your program's commands +might be different; for a GUI interface, you would use an "about box". + +You should also get your employer (if you work as a programmer) or school, +if any, to sign a "copyright disclaimer" for the program, if necessary. +For more information on this, and how to apply and follow the GNU GPL, see +. + +The GNU General Public License does not permit incorporating your program +into proprietary programs. If your program is a subroutine library, you +may consider it more useful to permit linking proprietary applications with +the library. If this is what you want to do, use the GNU Lesser General +Public License instead of this License. But first, please read +. \ No newline at end of file diff --git a/docs/roadmap.md b/docs/roadmap.md new file mode 100644 index 0000000..0876382 --- /dev/null +++ b/docs/roadmap.md @@ -0,0 +1,123 @@ +# Roadmap - GitHub Monitor + +Este roadmap apresenta a visão de evolução do projeto, agrupando objetivos em épicos e suas respectivas features, com informações de status, prioridade e critérios de conclusão, além de listar quais dependências foram escolhidas para o projeto e suas respectivas versões. + +--- + +## 🗂️ Legenda de Status para os épicos e features +- ✅ Concluído +- 🚧 Em andamento +- 📝 Planejado + +## 📊 Lista das dependências utilizadas +- Grafana 11.6.0 +- Github datasource 2.1.4 + +--- + +## 🧩 Épicos e Features + +### Épico 1: Coleta e Organização de Dados do GitHub (📝) + +| Feature | Status | Prioridade | Complexidade | +|:--------|:-------|:-----------|:-------------| +| Coletar Issues, PRs e Commits via API | 📝 | Alta | Fácil | +| Suporte a múltiplos repositórios | 📝 | Alta | Médio | +| Coletar métricas de Stars, Forks e Watchers | 📝 | Média | Médio | +| Implementar coleta incremental (otimização API) | 📝 | Alta | Difícil | + +**Definition of Done:** +- Dados de Issues, PRs, Commits, Stars, Forks e Watchers armazenados de forma consistente. +- Múltiplos repositórios configuráveis via `.env`. +- Redução de requisições para evitar rate limits da GitHub API. + +--- + +### Épico 2: Dashboards no Grafana (🚧) + +| Feature | Status | Prioridade | Complexidade | +|:--------|:-------|:-----------|:-------------| +| Dashboard inicial de métricas principais | 📝 | Alta | Médio | +| Dashboards por organização e por repositório | 📝 | Média | Médio | +| Dashboards históricos (tendência de atividade) | 📝 | Alta | Difícil | +| Suporte a múltiplos temas (Dark/Light Mode) | 📝 | Baixa | Fácil | + +**Definition of Done:** +- Dashboards acessíveis após deploy padrão. +- Visualizações históricas funcionais para no mínimo 12 meses de dados. +- Suporte a visualização Light/Dark via configuração. + +--- + +### Épico 3: Configuração e Implantação (📝) + +| Feature | Status | Prioridade | Complexidade | +|:--------|:-------|:-----------|:-------------| +| Deploy via Docker Compose | 📝 | Alta | Fácil | +| Templates de deploy para Kubernetes | 📝 | Média | Difícil | +| Gerenciamento de configurações via `.env` | 📝 | Alta | Fácil | +| Script de instalação automático | 📝 | Média | Médio | + +**Definition of Done:** +- Docker Compose rodando sem necessidade de configuração manual extra. +- Helm Chart ou YAMLs prontos para deploy no Kubernetes. +- Script capaz de rodar `setup.sh` para subir ambiente completo. + +--- + +### Épico 4: Monitoramento e Alertas (📝) + +| Feature | Status | Prioridade | Complexidade | +|:--------|:-------|:-----------|:-------------| +| Alertas no Grafana para eventos críticos | 📝 | Média | Médio | +| Integração com Slack/Email para alertas | 📝 | Baixa | Médio | +| Painel "Health Overview" por repositório | 📝 | Média | Médio | + +**Definition of Done:** +- Definição de alertas no Grafana configuráveis via dashboard. +- Envio de alertas externos opcional (Slack, Email). + +--- + +## 📋 Requisitos para o MVP (Minimum Viable Product) + +Essenciais para primeira versão pública: + +- [ ] Coletar Issues, PRs e Commits +- [ ] Deploy via Docker Compose +- [ ] Dashboard inicial com principais métricas +- [ ] Configuração via `.env` + +--- + +## 🌟 Melhorias Futuras + +- Suporte a múltiplos repositórios +- Dashboards históricos e temáticos +- Deploy em Kubernetes +- Alertas automáticos no Grafana +- Integração com Slack/Email +- Cache local para otimização de chamadas API +- Suporte a múltiplas plataformas (GitLab, Bitbucket) + +--- + +## 📅 Timeline sugerida + +| Mês | Entregas Prioritárias | +|-------------|---------------------------------------------------| +| Maio 2025 | Dashboards históricos + Suporte a múltiplos repositórios | +| Junho 2025 | Deploy Kubernetes + Alertas no Grafana | +| Julho 2025 | Integrações externas + Melhorias de performance | + +--- + +## ✍️ Notas + +- As prioridades e entregas podem mudar conforme feedback da comunidade e crescimento do projeto. +- Sugestões são sempre bem-vindas! Veja [contribuir.md](./docs/contribuir.md) para colaborar. + +## 🕰️ Histórico de Versão +| Data | Versão | Descrição | Autores | +|------------|--------|----------------------|------------------------------------------------------------------------------------------------------------------------------------| +| 27/04/2025 | 0.1 | Criação do Roadmap | [Yan Luca Viana de Araújo Fontenele](https://github.com/yan-luca) e [Gabriel Marques de Souza](https://github.com/GabrielMS00)| \ No newline at end of file diff --git a/grafana.ini b/grafana.ini deleted file mode 100644 index fee577c..0000000 --- a/grafana.ini +++ /dev/null @@ -1,36 +0,0 @@ -[paths] -provisioning = /etc/grafana/provisioning - -[server] -root_url = https://.com -domain = .com -enforce_domain = true - -[security] -allow_embedding = true -disable_gravatar = true -cookie_secure = true -cookie_samesite = strict -disable_initial_admin_creation = true - -[auth] -disable_login_form = true -oauth_auto_login = false - -[auth.anonymous] -enabled = true -org_role = Viewer -hide_version = true - -[dashboards] -default_home_dashboard_path = /var/lib/grafana/dashboards/github.json -min_refresh_interval = 1m - -[analytics] -reporting_enabled = false -check_for_updates = false - -[feature_toggles] -publicDashboards = false -accessTokenExpirationCheck = false - diff --git a/provisioning/access-control/api-permissions.yaml b/provisioning/access-control/api-permissions.yaml deleted file mode 100644 index ad8fad0..0000000 --- a/provisioning/access-control/api-permissions.yaml +++ /dev/null @@ -1,15 +0,0 @@ -apiVersion: 1 - -roles: - - name: "restricted_viewer" - description: "A viewer with no access to the Grafana API except for viewing dashboards" - permissions: - - action: "dashboards:read" - scope: "dashboards:*" - - action: "datasources:read" - scope: "datasources:*" - -assignments: - - name: "read_only_anon" - role: "restricted_viewer" - target: "anonymous" diff --git a/provisioning/dashboards/dashboard.yaml b/provisioning/dashboards/dashboard.yaml deleted file mode 100755 index 2787794..0000000 --- a/provisioning/dashboards/dashboard.yaml +++ /dev/null @@ -1,13 +0,0 @@ -apiVersion: 1 - -providers: - - name: "default" - orgId: 1 - folder: "" - type: file - disableDeletion: true - updateIntervalSeconds: 10 - allowUiUpdates: false - options: - path: /var/lib/grafana/dashboards - foldersFromFilesStructure: true diff --git a/provisioning/datasources/datasource.yaml b/provisioning/datasources/datasource.yaml deleted file mode 100755 index 875653e..0000000 --- a/provisioning/datasources/datasource.yaml +++ /dev/null @@ -1,10 +0,0 @@ -apiVersion: 1 - -datasources: - - name: GitHub - type: grafana-github-datasource - access: proxy - isDefault: true - secureJsonData: - accessToken: "${GITHUB_TOKEN}" - editable: false diff --git a/set-perms.sh b/set-perms.sh deleted file mode 100755 index 150b1e2..0000000 --- a/set-perms.sh +++ /dev/null @@ -1,6 +0,0 @@ -#!/bin/bash -# Probably not necessary for every docker setup, but definitely necessary if you're running SE Linux -mkdir -p grafana-data -sudo chown -R 472:472 grafana-data provisioning dashboards -sudo chmod -R 755 grafana-data provisioning dashboards -sudo chmod 644 grafana.ini diff --git a/update-dashboard.sh b/update-dashboard.sh deleted file mode 100755 index 1e17902..0000000 --- a/update-dashboard.sh +++ /dev/null @@ -1,89 +0,0 @@ -#!/bin/bash - -# Exit on error -set -e - -# Default values -DASHBOARD_FILE="dashboards/github.json" - -# Check if REPOS is set -if [ -z "${REPOS}" ]; then - echo "Error: REPOS environment variable not set" - echo "Example: REPOS=\"YaLTeR/niri, YaLTeR/wl-clipboard-rs, hyperlight-dev/hyperlight, docker/buildx, docker/model-cli\"" - exit 1 -fi - -echo "Processing repositories: ${REPOS}" - -# Clean and parse the repos -REPOS_CLEAN=$(echo "${REPOS}" | tr -d ' ') -IFS=',' read -ra REPO_ARRAY <<< "${REPOS_CLEAN}" - -# Extract unique organizations -ORGS=() -REPO_NAMES=() -for repo in "${REPO_ARRAY[@]}"; do - ORG=$(echo "${repo}" | cut -d'/' -f1) - REPO_NAME=$(echo "${repo}" | cut -d'/' -f2) - - ORGS+=("${ORG}") - REPO_NAMES+=("${REPO_NAME}") -done - -# Get unique organizations -UNIQUE_ORGS=($(echo "${ORGS[@]}" | tr ' ' '\n' | sort -u | tr '\n' ' ')) -ORG_LIST=$(IFS=','; echo "${UNIQUE_ORGS[*]}") - -# Create regex pattern for repository names -REPO_PATTERN=$(IFS='|'; echo "${REPO_NAMES[*]}") -REPO_REGEX="^(${REPO_PATTERN})\$" - -echo "Organizations: ${ORG_LIST}" -echo "Repository regex: ${REPO_REGEX}" - -# Create org options JSON for dashboard -ORG_OPTIONS="[" -for i in "${!UNIQUE_ORGS[@]}"; do - SELECTED="false" - if [ $i -eq 0 ]; then - SELECTED="true" - fi - ORG_OPTIONS+="{ \"selected\": ${SELECTED}, \"text\": \"${UNIQUE_ORGS[$i]}\", \"value\": \"${UNIQUE_ORGS[$i]}\" }" - if [ $i -lt $((${#UNIQUE_ORGS[@]} - 1)) ]; then - ORG_OPTIONS+="," - fi -done -ORG_OPTIONS+="]" - -# First organization to use as default -DEFAULT_ORG="${UNIQUE_ORGS[0]}" - -# Update dashboard JSON with jq -TMP_FILE=$(mktemp) -jq --arg orgs "${ORG_LIST}" \ - --arg regex "${REPO_REGEX}" \ - --argjson options "${ORG_OPTIONS}" \ - --arg default_org "${DEFAULT_ORG}" \ - '.templating.list |= map( - if .name == "organization" then - .options = $options | - .query = $orgs | - .current.text = $default_org | - .current.value = $default_org - elif .name == "repository" then - .regex = $regex - else . - end - )' "${DASHBOARD_FILE}" > "${TMP_FILE}" - -# Check if jq command succeeded -if [ $? -eq 0 ]; then - mv "${TMP_FILE}" "${DASHBOARD_FILE}" - echo "Successfully updated dashboard with repository filter" - echo "Organizations: ${ORG_LIST}" - echo "Repository regex: ${REPO_REGEX}" -else - rm "${TMP_FILE}" - echo "Error updating dashboard file" - exit 1 -fi