From 8680c916d14e995c64af05c7cabea765402300ed Mon Sep 17 00:00:00 2001 From: merlos <404446+merlos@users.noreply.github.com> Date: Fri, 9 Aug 2024 14:49:38 +0300 Subject: [PATCH 01/32] add sdg article --- docs/sdgs.qmd | 105 ++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 105 insertions(+) create mode 100644 docs/sdgs.qmd diff --git a/docs/sdgs.qmd b/docs/sdgs.qmd new file mode 100644 index 0000000..bec5808 --- /dev/null +++ b/docs/sdgs.qmd @@ -0,0 +1,105 @@ +--- +title: How magasin supports the achievement of the SDGs +description: Accelerating the implementation through data-informed decision making +description-meta: How can magasin support the achievement of the SDGs +format: + html: + number-sections: false +--- + +An end-to-end ingestion and analysis data platform such as magasin can significantly support contribute to an efficient and data-informed implementation of several [Sustainable Development Goals (SDGs)](https://sdgs.un.org/goals). + +Below we are providing some examples in which magasin can be used by international development organizations as well as by governments: + +## SDG 3: Good Health and Well-being + +Magasin can be used to **aggregate and analyze health data** from various sources, improving disease tracking, patient care, and health outcomes. + +For example, magasin can be used to integrate and analyze hospital records, wearable device data, and public health information to predict and manage outbreaks of diseases like COVID-19. + +This directly benefits **SDG Indicator 3.3.1** (Number of new HIV infections per 1,000 uninfected population, by sex, age, and key populations) and SDG Indicator **3.3.3** (Malaria incidence per 1,000 population), as it enhances the ability to track and respond to infectious diseases. + +Additionally, by improving the prediction and management of disease outbreaks, magasin supports **SDG Indicator 3.d.1** (International Health Regulations (IHR) capacity and health emergency preparedness), ensuring that health systems are better prepared for emergencies and can respond more effectively to health crises. + + +## SDG 4: Quality Education + +Magasin can enhance educational outcomes by **analyzing student performance data and identifying areas needing improvement**. + +For example, it could be used for analyzing data from online learning platforms to personalize education and provide targeted interventions for students struggling with specific subjects. + +This directly benefits **SDG Indicator 4.1.1** (Proportion of children and young people achieving at least a minimum proficiency level in reading and mathematics, by sex) and **SDG Indicator 4.2.2** (Participation rate in organized learning one year before the official primary entry age, by sex), as it helps tailor educational content to individual needs and ensures early childhood education is effective. + + +## SDG 6: Clean Water and Sanitation + +A data platform such as magasin can be used to **monitor water quality and usage**, helping to manage water resources more effectively. + + For example, using sensors and the data analytics and visualization of magasin, it can track water quality in real-time, ensuring safe drinking water and efficient water usage in agriculture. + + This directly benefits **SDG Indicator 6.1.1** (Proportion of population using safely managed drinking water services) and **SDG Indicator 6.3.2** (Proportion of bodies of water with good ambient water quality), as it ensures the availability of clean water and the maintenance of water quality. + + + ## SDG 7: Affordable and Clean Energy + +Magasin could be used to o**ptimize energy production and consumption, promoting the use of renewable energy sources**. + +For example, magasin can be used to monitor data from smart grids to balance energy supply and demand, reducing reliance on fossil fuels and increasing the use of solar and wind energy. + +This directly benefits **SDG Indicator 7.2.1** (Renewable energy share in the total final energy consumption) and **SDG Indicator 7.3.1** (Energy intensity measured in terms of primary energy and GDP), as it supports the transition to renewable energy and improves energy efficiency. + + +## SDG 9: Industry, Innovation, and Infrastructure + +Magasin can drive innovation and improve infrastructure by providing **insights into industrial processes and urban development**. + +For example, analyzing and using predictive models with IoT data can optimize manufacturing processes, reduce waste, and improve product quality. + +This directly benefits **SDG Indicator 9.2.1** (Manufacturing value added as a proportion of GDP and per capita) and **SDG Indicator 9.4.1** (CO2 emission per unit of value added), as it enhances industrial productivity and reduces environmental impact. + + +## SDG 11: Sustainable Cities and Communities + +Magasin can be used to enhance urban planning and management, making cities more sustainable and resilient. + +For example, by analyzing and visualizing traffic data and generating traffic prediction models, magasin can optimize public transportation routes and reduce congestion, improving air quality and reducing carbon emissions. + +This directly benefits **SDG Indicator 11.2.1** (Proportion of population that has convenient access to public transport, by sex, age, and persons with disabilities) and **SDG Indicator 11.6.2** (Annual mean levels of fine particulate matter in cities), as it promotes sustainable urban mobility and better air quality. + +## SDG 13: Climate Action + +Magasin can be used to **track and analyze environmental data**, supporting efforts to mitigate and adapt to climate change. + +For example, monitoring deforestation and carbon emissions using satellite data to inform climate policies and conservation efforts. + + This directly benefits **SDG Indicator 13.1.1** (Number of deaths, missing persons and directly affected persons attributed to disasters per 100,000 population) and **SDG Indicator 13.2.2** (Total greenhouse gas emissions per year), as it enhances disaster preparedness and reduces emissions. + + +## SDG 15: Life on Land + +Magasin can help protect terrestrial ecosystems by **supporting the monitoring biodiversity and land use changes**. + +For example, using data from drones and satellites to track wildlife populations and habitat changes, aiding in conservation efforts. + +This directly benefits **SDG Indicator 15.1.1** (Forest area as a proportion of total land area) and **SDG Indicator 15.5.1** (Red List Index), as it supports forest conservation and biodiversity protection. + + +## SDG 17: Partnerships for the Goals + +Magasin can facilitate **collaboration and data sharing among different stakeholders**, enhancing efforts to achieve the SDGs. + +For example, by creating a shared data repository for governments, NGOs, and researchers to collaborate on sustainable development projects. + +This directly benefits **SDG Indicator 17.6.1** (Number of science and/or technology cooperation agreements and programmes between countries) and **SDG Indicator 17.18.1** (Proportion of sustainable development indicators produced at the national level with full disaggregation when relevant to the target, in accordance with the Fundamental Principles of Official Statistics), as it promotes international cooperation and data-driven decision-making. + + +To successfully implement SDGs, it is crucial to first digitize the relevant data. Then, magasin can play a pivotal role in this process by collecting data from various digitized sources, cleaning and transforming it, and then analyzing and visualizing the information. By supporting the development of predictive models, magasin can help the optimization and acceleration of the implementation of the SDGs, ensuring that data-informed insights lead to more effective and efficient strategies for achieving these global goals. + + +## What's next + +* **[Getting started with magasin](./get-started/)**. Learn how to install, and start using magasin with a simple example. + +* **[Why magasin?](./why-magasin.qmd)**. Why magasin was created and what is the gap it is fulfilling. + +* **[Magasin architecture](./architecture.qmd)**. Learn more about the different components that conform magasin. From 619b5cdaad394e2d7b860b70b92f236011f6823a Mon Sep 17 00:00:00 2001 From: merlos <404446+merlos@users.noreply.github.com> Date: Fri, 9 Aug 2024 14:49:58 +0300 Subject: [PATCH 02/32] integrate on the other pages the sdg article. --- docs/architecture.qmd | 6 ++++++ docs/docs-home.qmd | 1 + docs/why-magasin.qmd | 5 +++-- 3 files changed, 10 insertions(+), 2 deletions(-) diff --git a/docs/architecture.qmd b/docs/architecture.qmd index 1e5928b..ac45059 100644 --- a/docs/architecture.qmd +++ b/docs/architecture.qmd @@ -100,4 +100,10 @@ Dask cluster Dask Gateway allows easy utilization of a Dask cluster from noteboo [Mag-cli](https://github.com/unicef/magasin/tree/main/mag-cli) is the command line interface of magasin. Helps to manage the different modules of magasin and it makes easier to perform common administration tasks. +## What's next +* **[Getting started with magasin](./get-started/)**. Learn how to install, and start using magasin with a simple example. + +* **[Why magasin?](./why-magasin.qmd)**. Why magasin was created and what is the gap it is fulfilling. + +* **[How magasin supports the implementation of the SDGs](./sdgs.qmd)** Learn about the magasin magasin plays in implementing the Sustainable Development Goals. diff --git a/docs/docs-home.qmd b/docs/docs-home.qmd index 385b48f..e3d5b50 100644 --- a/docs/docs-home.qmd +++ b/docs/docs-home.qmd @@ -10,6 +10,7 @@ Magasin enables organizations to perform automatic data ingestion, storage, anal ## Learn more about magasin * **[Why magasin?](why-magasin.qmd)** * **[Architecture](architecture.qmd)** +* **[How does magasin support the implementation of the SDGs?](sdgs.qmd)** ## Start using magasin * **[Get Started](get-started/)**. Quick setup diff --git a/docs/why-magasin.qmd b/docs/why-magasin.qmd index b05537a..f913308 100644 --- a/docs/why-magasin.qmd +++ b/docs/why-magasin.qmd @@ -15,7 +15,6 @@ In today's data-informed world, governments and organizations face a monumental To overcome these challenges and unlock the full potential of modern data analysis, machine learning, and artificial intelligence, organizations need a comprehensive set of tools. - ## Marketplace gaps When we go to the global market we find several gaps. @@ -57,4 +56,6 @@ For the private sector it fits any organization that wants to leverage data scie * **[Getting started with magasin](./get-started/)**. Learn how to install, and start using magasin with a simple example. -* **[Magasin architecture](./architecture.qmd)**. Learn more about the different components that conform magasin. \ No newline at end of file +* **[Magasin architecture](./architecture.qmd)**. Learn more about the different components that conform magasin. + +* **[How magasin supports the implementation of the SDGs](./sdgs.qmd)** Learn about the magasin magasin plays in implementing the Sustainable Development Goals. \ No newline at end of file From 05b79a4fe70fbd0c7381565bfd024bf0921aead4 Mon Sep 17 00:00:00 2001 From: merlos <404446+merlos@users.noreply.github.com> Date: Wed, 11 Sep 2024 12:23:13 +0300 Subject: [PATCH 03/32] add the planning for success guide --- docs/_website.yml | 2 + docs/planning-for-success.qmd | 149 ++++++++++++++++++++++++++++++++++ 2 files changed, 151 insertions(+) create mode 100644 docs/planning-for-success.qmd diff --git a/docs/_website.yml b/docs/_website.yml index 44a5926..f8fb03e 100644 --- a/docs/_website.yml +++ b/docs/_website.yml @@ -58,6 +58,8 @@ website: file: docs-home.qmd - file: why-magasin.qmd - file: architecture.qmd + - file: planning-for-success.qmd + - section: "Get started" contents: - file: get-started/index.qmd diff --git a/docs/planning-for-success.qmd b/docs/planning-for-success.qmd new file mode 100644 index 0000000..0cc0089 --- /dev/null +++ b/docs/planning-for-success.qmd @@ -0,0 +1,149 @@ +--- +title: Planning for success +description: Preparing your organization for a successful deployment. +metadata-description: What roles and skills are recommended to have in an organization when implement magasin and what processes should be setup +--- + +Implementing an end-to-end cloud-native data solution like magasin effectively requires not just setting up the technology, which is a mere enabler, but also implementing adjustments in people and processes. Without these it is harder to enhance the organization’s ability to make data-informed decisions. + +Here are some considerations to ensure your organization successfully deploys magasin. While **not every consideration needs to be fully implemented from the start**, they will become more effective as your organization becomes more adept at utilizing data. + +When dealing with technology for development (ICT4D) system strengthening initiatives giving some thoughts on these considerations will help to a more successful deployment. + +## The team (People dimension) + +From a personnel standpoint, an organisation must ensure that it has, or will acquire or recruit, the appropriate skills not only for implementing and maintaining the tool but also for processing and extracting insights from the data. Below are the common roles along with the technical skills and capabilities that an organisation should assess to operationalise magasin: + +### **System administrator** +Establishes and manages a magasin instance. While magasin can be operated on a laptop, for a production environment that serves various teams across an organisation, centralised management is more effective. The skills and capabilities required for this role include: + +* Kubernetes Administration (Core) + - Experience setting up, managing, and maintaining Kubernetes clusters. + - Knowledge of Kubernetes architecture, including nodes, pods, deployments, and services. + - Experience with Kubernetes networking, storage, and security configurations. +* Helm (Core) + - Experience using Helm for managing Kubernetes deployments. + - Ability to customize the values of Helm chart. + - Understanding of Helm repositories and version control. + +* Cloud Platforms (Strongly recommended) + - When the deployment is on the cloud, experience with the cloud provider(s) that the organization may be using such as AWS, Azure, or Google Cloud Platform. + - Knowledge of managed Kubernetes services such as EKS, AKS, or GKE. + +* Containerization (Strongly recommended) + - Understanding of containerization technologies, particularly Docker. + - If specific needs need to be implemented, experience in building, managing, and deploying container images. + +* Scripting and Automation (Strongly recommended) + - Understanding scripting languages such as Bash or Python. + +* Monitoring and Logging (Strongly recommended) + - When workloads increase and availability is a must, understanding of monitoring tools like Prometheus, Grafana, and ELK stack. + - Ability to set up and manage logging and monitoring for Kubernetes clusters. + +* Kubernetes Security (Strongly recommended) + - If sensitive data is managed by magasin and exposed to Internet and or different vendors, knowledge of Kubernetes security best practices is recommended. + - Experience with role-based access control (RBAC) and network policies can help to secure the system + +* DevOps Practices (Strongly recommended) + - Understanding of DevOps principles and practices. + - Experience with CI/CD pipelines and integrating Kubernetes with CI/CD tools. + +* What magasin tools does he use? + - Apache Superset (Configuration/system operations level) + - Dagster (Configuration/system operations level) + - Apache Drill (Configuration/system operations level) + - Daskhub (Configuration/system operations level) + - MinIO (Configuration/system operations level) + - Mag-cli (User level) + +### Data Analyst / Scientist +Needs to understand the business itself and collaborate very closely with the businesspeople, based on these conversations so he can “ask” research questions to the existing data, or research on what datasets may be able to answer these questions. This profile identifies data sources (internal and external) and performs explorations to analyze the data to extract insights, generally through visualizations and tracking indicators. Also, during the automation process he works with the data engineer to automate the process of getting real time insights. + +* Data Analysis and Exploration (Core): + - Data analysis techniques and methodologies. + - Experience with data cleaning, transformation, and visualization. + - Ability to explore and analyze both internal and external datasets. + +* Programming (Core): + - Strong skills in Python for data manipulation and analysis. + - Familiarity with libraries such as pandas, NumPy, and matplotlib. +* Statistical Analysis (Core): + - Knowledge of statistical methods and their application in data analysis. + - Ability to perform hypothesis testing, regression analysis, and other statistical techniques. +* Data Visualization (Core): + - Expertise in creating visualizations to communicate insights effectively. + - Experience with tools like Jupyter Notebooks and self-service BI tools (e.g., Superset, PowerBI, Tableau). +* Domain Knowledge (Recommended): + - Familiarity with the industry and business context to derive meaningful insights. + - Ability to translate business requirements into data-driven solutions. +* Machine Learning (Recommended): + - Understanding of machine learning algorithms and their applications. + - Experience with libraries such as scikit-learn, TensorFlow, or PyTorch as well as large language models. +* What magasin tools uses? + - Jupyter notebooks (User level) + - Apache Superset (User level) + - Dask (User level, for advanced applications) + - Use of Dagster (User level) + +### Data Engineer +His role is to ingest data from different data sources in a recurrent way to enable generate . system and merges them into dataset that can be used for creating a dashboard. + +* Data Engineering and ETL (Extract, Transform and Load): + - Proficiency in designing, building, and maintaining data pipelines. + - Experience with ETL processes and tools for data ingestion and transformation. +* Programming: + - Strong skills in Python for developing data engineering solutions. + - Familiarity with libraries such as pandas, NumPy, +* Big Data Technologies: + - Experience with data warehousing solutions and data lakes. + - Understanding of parquet, csv, delta lake formats. +* Cloud Platforms: + - Experience with cloud services for data storage and processing. + - Familiarity with cloud providers like AWS, Azure, or Google Cloud Platform. +* Data Quality and Governance: + - Understanding of data quality principles and best practices. + - Ability to implement data governance and security measures. +* Monitoring and Debugging: + - Skills in monitoring data pipelines and troubleshooting issues. + - Experience with logging and monitoring tools to ensure data reliability. +* Collaboration and Documentation: + - Strong collaboration skills to work with data scientists and system administrators. + - Ability to document data workflows, processes, and best practices. +* What magasin tools uses? + - Dagster (User level) + - MinIO (User level) + + +## Processes dimension + +Another aspect of implementing magasin is related with the processes that will be needed to be setup by the organization: + +1. **Data Quality Management** + The effectiveness of data-informed decision-making largely depends on the quality of the data used. This fundamental principle implies that without high-quality data, any investment in a data platform is futile. Often encapsulated by the phrase "garbage in, garbage out," it means that poor input data results in flawed insights and decisions. + + As your organization manages more datasets, ensuring data quality is crucial throughout the entire data lifecycle, beginning prior to ingestion processes, and emphasizing aspects such as accuracy, reliability, consistency, completeness, implement data cleansing to remove duplicates, correct errors, and update outdated information… + + Resources: + + * [UNICEF Data quality framework](https://data.unicef.org/resources/data-quality-framework/) + + +2. **Data governance** + Implementing a solid data governance process involves determining who can access, share, and delete data. When you define this you have to lever to maximize data utility and to be concious of personal data privacy as well as to minimize the potential data breaches. Data governance is especially critical when handing sensitive/confidential and personal data. Also, you may need to define a data governance to comply with local and international regulations (f.i. GDPR). + + Resources: + + * [Data Privacy in magasin](./user-guides/data-privacy.qmd) + +3. **Data documentation and metadata management** + Maintain comprehensive documentation and metadata management to track data lineage and support data stewardship. + +4. **Implement master data management** + Centralize and standardize key data entities to ensure consistency and accuracy across the organizational data. Elements such as office identifiers, employees’ identifiers, product names, supplier codes, department/division names and unique identifiers, country names and identifiers, etc. + +5. **Data lifecycle management** + Establishing rules and processes for not only in terms of capturing data, but also archival and deletion. + + + From c2b6928c8dddcca6920932382b19f7d9fde3370d Mon Sep 17 00:00:00 2001 From: merlos <404446+merlos@users.noreply.github.com> Date: Wed, 11 Sep 2024 12:25:13 +0300 Subject: [PATCH 04/32] Update sdgs title. Add it to main menu --- docs/_website.yml | 1 + docs/architecture.qmd | 2 +- docs/docs-home.qmd | 2 +- docs/sdgs.qmd | 2 +- docs/why-magasin.qmd | 2 +- 5 files changed, 5 insertions(+), 4 deletions(-) diff --git a/docs/_website.yml b/docs/_website.yml index f8fb03e..25b83cb 100644 --- a/docs/_website.yml +++ b/docs/_website.yml @@ -58,6 +58,7 @@ website: file: docs-home.qmd - file: why-magasin.qmd - file: architecture.qmd + - file: sdgs.qmd - file: planning-for-success.qmd - section: "Get started" diff --git a/docs/architecture.qmd b/docs/architecture.qmd index ac45059..067dd16 100644 --- a/docs/architecture.qmd +++ b/docs/architecture.qmd @@ -106,4 +106,4 @@ Dask cluster Dask Gateway allows easy utilization of a Dask cluster from noteboo * **[Why magasin?](./why-magasin.qmd)**. Why magasin was created and what is the gap it is fulfilling. -* **[How magasin supports the implementation of the SDGs](./sdgs.qmd)** Learn about the magasin magasin plays in implementing the Sustainable Development Goals. +* **[Implementing SDGs through magasin](./sdgs.qmd)** Learn about the magasin magasin plays in implementing the Sustainable Development Goals (SDGs). diff --git a/docs/docs-home.qmd b/docs/docs-home.qmd index e3d5b50..0e38bc6 100644 --- a/docs/docs-home.qmd +++ b/docs/docs-home.qmd @@ -10,7 +10,7 @@ Magasin enables organizations to perform automatic data ingestion, storage, anal ## Learn more about magasin * **[Why magasin?](why-magasin.qmd)** * **[Architecture](architecture.qmd)** -* **[How does magasin support the implementation of the SDGs?](sdgs.qmd)** +* **[Implementing SDGs through magasin](sdgs.qmd)** ## Start using magasin * **[Get Started](get-started/)**. Quick setup diff --git a/docs/sdgs.qmd b/docs/sdgs.qmd index bec5808..4fbfc25 100644 --- a/docs/sdgs.qmd +++ b/docs/sdgs.qmd @@ -1,5 +1,5 @@ --- -title: How magasin supports the achievement of the SDGs +title: Implementing SDGs through magasin description: Accelerating the implementation through data-informed decision making description-meta: How can magasin support the achievement of the SDGs format: diff --git a/docs/why-magasin.qmd b/docs/why-magasin.qmd index f913308..b0ae3c5 100644 --- a/docs/why-magasin.qmd +++ b/docs/why-magasin.qmd @@ -58,4 +58,4 @@ For the private sector it fits any organization that wants to leverage data scie * **[Magasin architecture](./architecture.qmd)**. Learn more about the different components that conform magasin. -* **[How magasin supports the implementation of the SDGs](./sdgs.qmd)** Learn about the magasin magasin plays in implementing the Sustainable Development Goals. \ No newline at end of file +* **[Implementing the SDGs through magasin](./sdgs.qmd)** Learn about the magasin magasin plays in implementing the Sustainable Development Goals (SDGs). \ No newline at end of file From cc1d50f6a7d90a9d273063b54cd25b316b167b8d Mon Sep 17 00:00:00 2001 From: merlos <404446+merlos@users.noreply.github.com> Date: Wed, 11 Sep 2024 13:19:12 +0300 Subject: [PATCH 05/32] move deployment stuff to implement --- docs/_website.yml | 10 ++++++---- docs/{ => implement}/deployment.qmd | 6 +++++- docs/implement/index.qmd | 15 +++++++++++++++ docs/{ => implement}/planning-for-success.qmd | 0 docs/{ => implement}/security.qmd | 2 ++ 5 files changed, 28 insertions(+), 5 deletions(-) rename docs/{ => implement}/deployment.qmd (94%) create mode 100644 docs/implement/index.qmd rename docs/{ => implement}/planning-for-success.qmd (100%) rename docs/{ => implement}/security.qmd (98%) diff --git a/docs/_website.yml b/docs/_website.yml index 25b83cb..e6bc13e 100644 --- a/docs/_website.yml +++ b/docs/_website.yml @@ -59,7 +59,7 @@ website: - file: why-magasin.qmd - file: architecture.qmd - file: sdgs.qmd - - file: planning-for-success.qmd + - section: "Get started" contents: @@ -94,12 +94,14 @@ website: # - file: admin-guides/drill.qmd # - file: admin-guides/superset.qmd - - section: "Deployment" + - section: "Implement" contents: + - file: implement/index.qmd + - file: implement/planning-for-success.qmd - text: "Deploying to production" - file: deployment.qmd + file: implement/deployment.qmd - text: "Security" - file: security.qmd + file: implement/security.qmd - section: "Contributing" contents: diff --git a/docs/deployment.qmd b/docs/implement/deployment.qmd similarity index 94% rename from docs/deployment.qmd rename to docs/implement/deployment.qmd index 997c740..7bfd072 100644 --- a/docs/deployment.qmd +++ b/docs/implement/deployment.qmd @@ -1,6 +1,10 @@ --- -title: "Production deployment" +title: "Deploying to production" +description: Tips and tasks when deploying an instance of magasin into production +meta-decription: Tips and tasks when deploying an instance of magasin into production format: html +aliases: + - deployment.qmd --- Whereas the default installation of magasin is very convenient for testing, it is not ready for production. diff --git a/docs/implement/index.qmd b/docs/implement/index.qmd new file mode 100644 index 0000000..54faa08 --- /dev/null +++ b/docs/implement/index.qmd @@ -0,0 +1,15 @@ +--- +title: Implement +meta-description: What you need to do in order to implement magasin +description: A successfull implementation of magasin within an organization +--- + +In this section we will share some considerations that an organization may want to think about when implementing magasin. + +## Considerations beyond technology + * [Preparing your organization for success](./planning-for-success.qmd). Considerations an organization needs to think about from the team and processes setup perspectives. + +## Production deployment technical considerations + + * [Deploying into production](./deployment.qmd). Recommened tasks when setting up a production environment. + * [Security](./security.qmd). Hardening a setup for enhancing cyber-security \ No newline at end of file diff --git a/docs/planning-for-success.qmd b/docs/implement/planning-for-success.qmd similarity index 100% rename from docs/planning-for-success.qmd rename to docs/implement/planning-for-success.qmd diff --git a/docs/security.qmd b/docs/implement/security.qmd similarity index 98% rename from docs/security.qmd rename to docs/implement/security.qmd index 72fc5a2..3e9dd0f 100644 --- a/docs/security.qmd +++ b/docs/implement/security.qmd @@ -1,6 +1,8 @@ --- title: "Security" format: html +aliases: + - security.qmd --- Ensuring robust security measures within a Kubernetes cluster hosting diverse open-source applications is paramount in safeguarding sensitive data and maintaining operational integrity. From 1a387189739183fab08a7f8f7ed49de1b568c657 Mon Sep 17 00:00:00 2001 From: merlos <404446+merlos@users.noreply.github.com> Date: Wed, 11 Sep 2024 13:51:33 +0300 Subject: [PATCH 06/32] refactor implement --- docs/_website.yml | 4 +- docs/implement/index.qmd | 11 +- ...nning-for-success.qmd => magasin-team.qmd} | 112 ++++++------------ docs/implement/organizational-processes.qmd | 44 +++++++ 4 files changed, 95 insertions(+), 76 deletions(-) rename docs/implement/{planning-for-success.qmd => magasin-team.qmd} (54%) create mode 100644 docs/implement/organizational-processes.qmd diff --git a/docs/_website.yml b/docs/_website.yml index e6bc13e..e29a5db 100644 --- a/docs/_website.yml +++ b/docs/_website.yml @@ -97,7 +97,9 @@ website: - section: "Implement" contents: - file: implement/index.qmd - - file: implement/planning-for-success.qmd + - file: implement/magasin-team.qmd + - file: implement/organizational-processes.qmd + - file: implement/development.qmd - text: "Deploying to production" file: implement/deployment.qmd - text: "Security" diff --git a/docs/implement/index.qmd b/docs/implement/index.qmd index 54faa08..7e7f57b 100644 --- a/docs/implement/index.qmd +++ b/docs/implement/index.qmd @@ -6,10 +6,17 @@ description: A successfull implementation of magasin within an organization In this section we will share some considerations that an organization may want to think about when implementing magasin. +When dealing with technology for development (ICT4D) system strengthening initiatives giving some thoughts on these considerations will help to a more successful deployment. + ## Considerations beyond technology - * [Preparing your organization for success](./planning-for-success.qmd). Considerations an organization needs to think about from the team and processes setup perspectives. -## Production deployment technical considerations +Implementing an end-to-end cloud-native data solution like magasin effectively requires not just setting up the technology, which is a mere enabler, but also implementing adjustments in people and processes. Without these it is harder to enhance the organization’s ability to make data-informed decisions. + + + * [Setting up a magasin team](./magasin-team.qmd). What are the roles, skills and capabilities that are recommended to have within an organization to get the maximum from magasin. + * [Organizational processes](./planning-for-success.qmd). Magasin will + +## Depoying a magasin instance. Technical considerations * [Deploying into production](./deployment.qmd). Recommened tasks when setting up a production environment. * [Security](./security.qmd). Hardening a setup for enhancing cyber-security \ No newline at end of file diff --git a/docs/implement/planning-for-success.qmd b/docs/implement/magasin-team.qmd similarity index 54% rename from docs/implement/planning-for-success.qmd rename to docs/implement/magasin-team.qmd index 0cc0089..5e927bd 100644 --- a/docs/implement/planning-for-success.qmd +++ b/docs/implement/magasin-team.qmd @@ -1,55 +1,49 @@ --- -title: Planning for success -description: Preparing your organization for a successful deployment. -metadata-description: What roles and skills are recommended to have in an organization when implement magasin and what processes should be setup +title: Setting a magasin team +description: Setting up the rigth team for implementing magasin +meta-description: What are the skills and capabilities of a successfull magasin team. Setting up the rigth team for implementing magasin. --- -Implementing an end-to-end cloud-native data solution like magasin effectively requires not just setting up the technology, which is a mere enabler, but also implementing adjustments in people and processes. Without these it is harder to enhance the organization’s ability to make data-informed decisions. - -Here are some considerations to ensure your organization successfully deploys magasin. While **not every consideration needs to be fully implemented from the start**, they will become more effective as your organization becomes more adept at utilizing data. - -When dealing with technology for development (ICT4D) system strengthening initiatives giving some thoughts on these considerations will help to a more successful deployment. - -## The team (People dimension) - From a personnel standpoint, an organisation must ensure that it has, or will acquire or recruit, the appropriate skills not only for implementing and maintaining the tool but also for processing and extracting insights from the data. Below are the common roles along with the technical skills and capabilities that an organisation should assess to operationalise magasin: -### **System administrator** +## Common roles and skillsets of a magasin team + +### System administrator Establishes and manages a magasin instance. While magasin can be operated on a laptop, for a production environment that serves various teams across an organisation, centralised management is more effective. The skills and capabilities required for this role include: -* Kubernetes Administration (Core) +* **Kubernetes Administration** (Core) - Experience setting up, managing, and maintaining Kubernetes clusters. - Knowledge of Kubernetes architecture, including nodes, pods, deployments, and services. - Experience with Kubernetes networking, storage, and security configurations. -* Helm (Core) +* **Helm** (Core) - Experience using Helm for managing Kubernetes deployments. - Ability to customize the values of Helm chart. - Understanding of Helm repositories and version control. -* Cloud Platforms (Strongly recommended) +* **Cloud Platforms** (Strongly recommended) - When the deployment is on the cloud, experience with the cloud provider(s) that the organization may be using such as AWS, Azure, or Google Cloud Platform. - Knowledge of managed Kubernetes services such as EKS, AKS, or GKE. -* Containerization (Strongly recommended) +* **Containerization** (Strongly recommended) - Understanding of containerization technologies, particularly Docker. - If specific needs need to be implemented, experience in building, managing, and deploying container images. -* Scripting and Automation (Strongly recommended) +* **Scripting and Automation** (Strongly recommended) - Understanding scripting languages such as Bash or Python. -* Monitoring and Logging (Strongly recommended) +* **Monitoring and Logging** (Strongly recommended) - When workloads increase and availability is a must, understanding of monitoring tools like Prometheus, Grafana, and ELK stack. - Ability to set up and manage logging and monitoring for Kubernetes clusters. -* Kubernetes Security (Strongly recommended) +* **Kubernetes Security** (Strongly recommended) - If sensitive data is managed by magasin and exposed to Internet and or different vendors, knowledge of Kubernetes security best practices is recommended. - Experience with role-based access control (RBAC) and network policies can help to secure the system -* DevOps Practices (Strongly recommended) +* **DevOps Practices** (Strongly recommended) - Understanding of DevOps principles and practices. - Experience with CI/CD pipelines and integrating Kubernetes with CI/CD tools. -* What magasin tools does he use? +* ***What magasin tools does he use?** - Apache Superset (Configuration/system operations level) - Dagster (Configuration/system operations level) - Apache Drill (Configuration/system operations level) @@ -60,90 +54,62 @@ Establishes and manages a magasin instance. While magasin can be operated on a l ### Data Analyst / Scientist Needs to understand the business itself and collaborate very closely with the businesspeople, based on these conversations so he can “ask” research questions to the existing data, or research on what datasets may be able to answer these questions. This profile identifies data sources (internal and external) and performs explorations to analyze the data to extract insights, generally through visualizations and tracking indicators. Also, during the automation process he works with the data engineer to automate the process of getting real time insights. -* Data Analysis and Exploration (Core): +* **Data Analysis and Exploration** (Core): - Data analysis techniques and methodologies. - Experience with data cleaning, transformation, and visualization. - Ability to explore and analyze both internal and external datasets. -* Programming (Core): +* **Programming** (Core): - Strong skills in Python for data manipulation and analysis. - Familiarity with libraries such as pandas, NumPy, and matplotlib. -* Statistical Analysis (Core): + +* **Statistical Analysis** (Core): - Knowledge of statistical methods and their application in data analysis. - Ability to perform hypothesis testing, regression analysis, and other statistical techniques. -* Data Visualization (Core): + +* **Data Visualization** (Core): - Expertise in creating visualizations to communicate insights effectively. - Experience with tools like Jupyter Notebooks and self-service BI tools (e.g., Superset, PowerBI, Tableau). -* Domain Knowledge (Recommended): + +* **Domain Knowledge** (Recommended): - Familiarity with the industry and business context to derive meaningful insights. - Ability to translate business requirements into data-driven solutions. -* Machine Learning (Recommended): + +* **Machine Learning** (Recommended): - Understanding of machine learning algorithms and their applications. - Experience with libraries such as scikit-learn, TensorFlow, or PyTorch as well as large language models. -* What magasin tools uses? +* **What magasin tools does he use?** - Jupyter notebooks (User level) - Apache Superset (User level) - Dask (User level, for advanced applications) - Use of Dagster (User level) ### Data Engineer -His role is to ingest data from different data sources in a recurrent way to enable generate . system and merges them into dataset that can be used for creating a dashboard. +His role is to ingest data from different data sources in a recurrent and automated way. -* Data Engineering and ETL (Extract, Transform and Load): +* **Data Engineering and ETL (Extract, Transform and Load)** (Core): - Proficiency in designing, building, and maintaining data pipelines. - Experience with ETL processes and tools for data ingestion and transformation. -* Programming: +* **Sofware development** (Core): - Strong skills in Python for developing data engineering solutions. - - Familiarity with libraries such as pandas, NumPy, -* Big Data Technologies: + - Familiarity with libraries such as pandas, NumPy, etc. +* **Big Data Technologies** (Recommended): - Experience with data warehousing solutions and data lakes. - - Understanding of parquet, csv, delta lake formats. -* Cloud Platforms: + - Understanding of parquet, csv, delta lake file formats. +* **Cloud Platforms** (Recommended): - Experience with cloud services for data storage and processing. - - Familiarity with cloud providers like AWS, Azure, or Google Cloud Platform. -* Data Quality and Governance: + - Familiarity with cloud storages on major systems AWS, Azure, or Google Cloud Platform. +* **Data Quality and Governance** (Recommended): - Understanding of data quality principles and best practices. - Ability to implement data governance and security measures. -* Monitoring and Debugging: +* **Monitoring and Debugging** (Recommended): - Skills in monitoring data pipelines and troubleshooting issues. - Experience with logging and monitoring tools to ensure data reliability. -* Collaboration and Documentation: +* **Collaboration and Documentation** (Recommended): - Strong collaboration skills to work with data scientists and system administrators. - Ability to document data workflows, processes, and best practices. -* What magasin tools uses? +* **What magasin tools uses?** - Dagster (User level) - MinIO (User level) - - -## Processes dimension - -Another aspect of implementing magasin is related with the processes that will be needed to be setup by the organization: - -1. **Data Quality Management** - The effectiveness of data-informed decision-making largely depends on the quality of the data used. This fundamental principle implies that without high-quality data, any investment in a data platform is futile. Often encapsulated by the phrase "garbage in, garbage out," it means that poor input data results in flawed insights and decisions. - - As your organization manages more datasets, ensuring data quality is crucial throughout the entire data lifecycle, beginning prior to ingestion processes, and emphasizing aspects such as accuracy, reliability, consistency, completeness, implement data cleansing to remove duplicates, correct errors, and update outdated information… - - Resources: - - * [UNICEF Data quality framework](https://data.unicef.org/resources/data-quality-framework/) - - -2. **Data governance** - Implementing a solid data governance process involves determining who can access, share, and delete data. When you define this you have to lever to maximize data utility and to be concious of personal data privacy as well as to minimize the potential data breaches. Data governance is especially critical when handing sensitive/confidential and personal data. Also, you may need to define a data governance to comply with local and international regulations (f.i. GDPR). - - Resources: - - * [Data Privacy in magasin](./user-guides/data-privacy.qmd) - -3. **Data documentation and metadata management** - Maintain comprehensive documentation and metadata management to track data lineage and support data stewardship. - -4. **Implement master data management** - Centralize and standardize key data entities to ensure consistency and accuracy across the organizational data. Elements such as office identifiers, employees’ identifiers, product names, supplier codes, department/division names and unique identifiers, country names and identifiers, etc. - -5. **Data lifecycle management** - Establishing rules and processes for not only in terms of capturing data, but also archival and deletion. - - + - Drill (User level) diff --git a/docs/implement/organizational-processes.qmd b/docs/implement/organizational-processes.qmd new file mode 100644 index 0000000..16a2b3d --- /dev/null +++ b/docs/implement/organizational-processes.qmd @@ -0,0 +1,44 @@ +--- +title: Organizational processes +description: Processes to be consider to get the maximum of magasin. +metadata-description: Processes an organization should think about to get the maximum of magasin. +--- + + +Here are some considerations from the processes dimesion to ensure your organization successfully deploys magasin. While **not every process needs to be fully implemented from the start**, they will become more effective as your organization becomes more adept at utilizing data. + + + + +## Processes dimension + +Another aspect of implementing magasin is related with the processes that will be needed to be setup by the organization: + +1. **Data Quality Management** + The effectiveness of data-informed decision-making largely depends on the quality of the data used. This fundamental principle implies that without high-quality data, any investment in a data platform is futile. Often encapsulated by the phrase "garbage in, garbage out," it means that poor input data results in flawed insights and decisions. + + As your organization manages more datasets, ensuring data quality is crucial throughout the entire data lifecycle, beginning prior to ingestion processes, and emphasizing aspects such as accuracy, reliability, consistency, completeness, implement data cleansing to remove duplicates, correct errors, and update outdated information… + + Resources: + + * [UNICEF Data quality framework](https://data.unicef.org/resources/data-quality-framework/) + + +2. **Data governance** + Implementing a solid data governance process involves determining who can access, share, and delete data. When you define this you have to lever to maximize data utility and to be concious of personal data privacy as well as to minimize the potential data breaches. Data governance is especially critical when handing sensitive/confidential and personal data. Also, you may need to define a data governance to comply with local and international regulations (f.i. GDPR). + + Resources: + + * [Data Privacy in magasin](./user-guides/data-privacy.qmd) + +3. **Data documentation and metadata management** + Maintain comprehensive documentation and metadata management to track data lineage and support data stewardship. + +4. **Implement master data management** + Centralize and standardize key data entities to ensure consistency and accuracy across the organizational data. Elements such as office identifiers, employees’ identifiers, product names, supplier codes, department/division names and unique identifiers, country names and identifiers, etc. + +5. **Data lifecycle management** + Establishing rules and processes for not only in terms of capturing data, but also archival and deletion. + + + From e09ddb252a467c4899518063e45ef07445470e7b Mon Sep 17 00:00:00 2001 From: merlos <404446+merlos@users.noreply.github.com> Date: Thu, 12 Sep 2024 11:44:36 +0300 Subject: [PATCH 07/32] move data privacy to implement --- docs/_website.yml | 5 +++-- docs/{user-guides => implement}/data-privacy.qmd | 2 ++ docs/user-guides/index.qmd | 4 ++-- 3 files changed, 7 insertions(+), 4 deletions(-) rename docs/{user-guides => implement}/data-privacy.qmd (99%) diff --git a/docs/_website.yml b/docs/_website.yml index e29a5db..3bc7fc4 100644 --- a/docs/_website.yml +++ b/docs/_website.yml @@ -80,7 +80,6 @@ website: - section: "End user guides" contents: - file: user-guides/index.qmd - - file: user-guides/data-privacy.qmd # TODO @@ -96,9 +95,11 @@ website: - section: "Implement" contents: - - file: implement/index.qmd + - text: "Overview" + file: implement/index.qmd - file: implement/magasin-team.qmd - file: implement/organizational-processes.qmd + - file: implement/data-privacy.qmd - file: implement/development.qmd - text: "Deploying to production" file: implement/deployment.qmd diff --git a/docs/user-guides/data-privacy.qmd b/docs/implement/data-privacy.qmd similarity index 99% rename from docs/user-guides/data-privacy.qmd rename to docs/implement/data-privacy.qmd index 8f27b11..366eeb4 100644 --- a/docs/user-guides/data-privacy.qmd +++ b/docs/implement/data-privacy.qmd @@ -3,6 +3,8 @@ title: "Data Privacy" format: html description: How to use magasin for analyzing being data responsible and following data privacy principles. meta-description: How to use magasin for analyzing folloing responsible data management and data privacy principles. +aliases: + - user-guides/data-privacy.qmd --- In today's digital age, the importance of **data privacy, responsible data management, and cybersecurity cannot be overstated**. With the increasing reliance on technology and the vast amount of data being generated and collected, it is crucial to be conscious and proactive in safeguarding sensitive information. diff --git a/docs/user-guides/index.qmd b/docs/user-guides/index.qmd index f498d4e..bef8cb3 100644 --- a/docs/user-guides/index.qmd +++ b/docs/user-guides/index.qmd @@ -23,9 +23,9 @@ Each of the open source components included in magasin has its on end user docum * [Creating your first dashboard (superset.apache.org)](https://superset.apache.org/docs/creating-charts-dashboards/creating-your-first-dashboard) * [Exploring data in Superset (superset.apache.org)](https://superset.apache.org/docs/creating-charts-dashboards/exploring-data) -## Best practices +## Related guides -* **[Data privacy guide](./data-privacy.qmd)**. How to use magasin in following responsible data management practices. +*[Data privacy guide](../implement/data-privacy.qmd). How to use magasin in following responsible data management practices. From 7d441c439424069bb76b0db61b5e8b9b8c75b933 Mon Sep 17 00:00:00 2001 From: merlos <404446+merlos@users.noreply.github.com> Date: Thu, 12 Sep 2024 11:44:53 +0300 Subject: [PATCH 08/32] fix typos in deployment guide --- docs/implement/deployment.qmd | 16 +++++++++------- 1 file changed, 9 insertions(+), 7 deletions(-) diff --git a/docs/implement/deployment.qmd b/docs/implement/deployment.qmd index 7bfd072..1cfb645 100644 --- a/docs/implement/deployment.qmd +++ b/docs/implement/deployment.qmd @@ -30,10 +30,10 @@ Here you have some links to reference documentation from the original projects t ## Daskhub -* [DaskHub helm char](https://artifacthub.io/packages/helm/dask/daskhub) -* [JupyterHub helm Chart](https://z2jh.jupyter.org/en/stable/) -* [Dask Gateway Helm](https://gateway.dask.org/install-kube.html) -* [Dask Gateway Hem Chart Reference](https://gateway.dask.org/install-kube.html#helm-chart-reference) +* [DaskHub helm chart](https://artifacthub.io/packages/helm/dask/daskhub) +* [JupyterHub helm chart](https://z2jh.jupyter.org/en/stable/) +* [Dask Gateway helm](https://gateway.dask.org/install-kube.html) +* [Dask Gateway helm chart reference](https://gateway.dask.org/install-kube.html#helm-chart-reference) ## Dagster @@ -42,11 +42,13 @@ Here you have some links to reference documentation from the original projects t ## MinIO -From MinIO, magasin includes two helm charts: the operator and tenant. The operator basically allows you to deploy instances of tenants (provides multi-tenancy support). In the magasin default installation we do not use the operator to deploy the tenant but rather a helm chart, and we only install the operator as it is a requirement for a tenant. For one single organization, it may be enough to manage a single tenant. +From MinIO, magasin includes two helm charts: the `operator` and `tenant`. The operator basically allows you to deploy instances of tenants (provides multi-tenancy support). In the magasin default installation we do not use the operator to deploy the tenant but rather a helm chart, and we only install the operator as it is a requirement for a tenant. For one single organization, it may be enough to manage a single tenant. -* [Minio Tenant Helm Chart Reference](https://min.io/docs/minio/kubernetes/upstream/reference/operator-chart-values.html#id2) +Also, note that you can skip including this component if you use a cloud provider blob container such as Amazon AWS S3 buckets, Azure Blob containers or Google Cloud Storage. -* [Minio Operator Helm Chart Reference ](https://min.io/docs/minio/kubernetes/upstream/reference/operator-chart-values.html) +* [MinIO Tenant Helm Chart Reference](https://min.io/docs/minio/kubernetes/upstream/reference/operator-chart-values.html#id2) + +* [MinIO Operator Helm Chart Reference ](https://min.io/docs/minio/kubernetes/upstream/reference/operator-chart-values.html) * [Deploy minio operator with Helm](https://min.io/docs/minio/kubernetes/upstream/operations/install-deploy-manage/deploy-operator-helm.html) * [Deploy a tenant with Helm](https://min.io/docs/minio/kubernetes/upstream/operations/install-deploy-manage/deploy-minio-tenant-helm.html#deploy-tenant-helm) From dff35636b79980ab079bf3f25879f626f74c3f31 Mon Sep 17 00:00:00 2001 From: merlos <404446+merlos@users.noreply.github.com> Date: Thu, 12 Sep 2024 12:07:25 +0300 Subject: [PATCH 09/32] fix broken links --- docs/_website.yml | 1 - docs/docs-home.qmd | 4 ++-- docs/implement/index.qmd | 4 +++- docs/implement/organizational-processes.qmd | 13 +++++-------- docs/implement/security.qmd | 2 +- 5 files changed, 11 insertions(+), 13 deletions(-) diff --git a/docs/_website.yml b/docs/_website.yml index 3bc7fc4..bfb917e 100644 --- a/docs/_website.yml +++ b/docs/_website.yml @@ -100,7 +100,6 @@ website: - file: implement/magasin-team.qmd - file: implement/organizational-processes.qmd - file: implement/data-privacy.qmd - - file: implement/development.qmd - text: "Deploying to production" file: implement/deployment.qmd - text: "Security" diff --git a/docs/docs-home.qmd b/docs/docs-home.qmd index 0e38bc6..1fe5318 100644 --- a/docs/docs-home.qmd +++ b/docs/docs-home.qmd @@ -15,8 +15,8 @@ Magasin enables organizations to perform automatic data ingestion, storage, anal ## Start using magasin * **[Get Started](get-started/)**. Quick setup * **[Installation](install/)**. Detailed explanation of the base installation. -* **[End user guides](end-user-guides.qmd)**. References on how to use the components -* **[Deployment](deployment.qmd)**. Learn more about the configuration of the different components. +* **[End user guides](./user-guides/index.qmd)**. References on how to use the components +* **[Deployment](implement/deployment.qmddeployment.qmd)**. Learn more about the configuration of the different components. ## Develop magasin diff --git a/docs/implement/index.qmd b/docs/implement/index.qmd index 7e7f57b..70bbdbb 100644 --- a/docs/implement/index.qmd +++ b/docs/implement/index.qmd @@ -14,8 +14,10 @@ Implementing an end-to-end cloud-native data solution like magasin effectively r * [Setting up a magasin team](./magasin-team.qmd). What are the roles, skills and capabilities that are recommended to have within an organization to get the maximum from magasin. - * [Organizational processes](./planning-for-success.qmd). Magasin will + * [Organizational processes](./organizational-processes.qmd). Whata organizational processes may need to be setup? + * [Data privacy guide](./data-privacy.qmd). How you can use magasin to be data privacy oriented, for instance applying data minimization. + ## Depoying a magasin instance. Technical considerations * [Deploying into production](./deployment.qmd). Recommened tasks when setting up a production environment. diff --git a/docs/implement/organizational-processes.qmd b/docs/implement/organizational-processes.qmd index 16a2b3d..e8efea4 100644 --- a/docs/implement/organizational-processes.qmd +++ b/docs/implement/organizational-processes.qmd @@ -7,13 +7,6 @@ metadata-description: Processes an organization should think about to get the ma Here are some considerations from the processes dimesion to ensure your organization successfully deploys magasin. While **not every process needs to be fully implemented from the start**, they will become more effective as your organization becomes more adept at utilizing data. - - - -## Processes dimension - -Another aspect of implementing magasin is related with the processes that will be needed to be setup by the organization: - 1. **Data Quality Management** The effectiveness of data-informed decision-making largely depends on the quality of the data used. This fundamental principle implies that without high-quality data, any investment in a data platform is futile. Often encapsulated by the phrase "garbage in, garbage out," it means that poor input data results in flawed insights and decisions. @@ -29,10 +22,14 @@ Another aspect of implementing magasin is related with the processes that will b Resources: - * [Data Privacy in magasin](./user-guides/data-privacy.qmd) + * [Data Privacy in magasin](./data-privacy.qmd) 3. **Data documentation and metadata management** Maintain comprehensive documentation and metadata management to track data lineage and support data stewardship. + + Resources: + + * [Dagster metadata](https://docs.dagster.io/concepts/metadata-tags) 4. **Implement master data management** Centralize and standardize key data entities to ensure consistency and accuracy across the organizational data. Elements such as office identifiers, employees’ identifiers, product names, supplier codes, department/division names and unique identifiers, country names and identifiers, etc. diff --git a/docs/implement/security.qmd b/docs/implement/security.qmd index 3e9dd0f..72ed887 100644 --- a/docs/implement/security.qmd +++ b/docs/implement/security.qmd @@ -7,7 +7,7 @@ aliases: Ensuring robust security measures within a Kubernetes cluster hosting diverse open-source applications is paramount in safeguarding sensitive data and maintaining operational integrity. -If you want to disclose a potential vulnerability, please read our [vulnerability disclosure policy](./contributing/vulnerability-disclosure.qmd). +If you want to disclose a potential vulnerability, please read our [vulnerability disclosure policy](../contributing/vulnerability-disclosure.qmd). ## Reference documentation Each component of magasin has its own level of security From 6e37356731f08ca4dd9e4f6da6dbc88aae3a590b Mon Sep 17 00:00:00 2001 From: merlos <404446+merlos@users.noreply.github.com> Date: Thu, 12 Sep 2024 12:32:06 +0300 Subject: [PATCH 10/32] add implement magasin section in docs home --- docs/docs-home.qmd | 13 +++++++++++-- 1 file changed, 11 insertions(+), 2 deletions(-) diff --git a/docs/docs-home.qmd b/docs/docs-home.qmd index 1fe5318..82c42e8 100644 --- a/docs/docs-home.qmd +++ b/docs/docs-home.qmd @@ -1,6 +1,8 @@ --- title: "Magasin documentation" -format: html +format: + html: + number-sections: false --- Magasin is a cloud native open-source end-to-end data platform. @@ -16,7 +18,14 @@ Magasin enables organizations to perform automatic data ingestion, storage, anal * **[Get Started](get-started/)**. Quick setup * **[Installation](install/)**. Detailed explanation of the base installation. * **[End user guides](./user-guides/index.qmd)**. References on how to use the components -* **[Deployment](implement/deployment.qmddeployment.qmd)**. Learn more about the configuration of the different components. + +## Implement magasin in an organization + +* **[Overview](implement/index.qmd)**. +* **[Setting a magasin team](./implement/magasin-team.qmd)**. Typical roles, skills and capabilities that an organization should have to get the maximum from magasin. +* **[Organizational processes](./implement/organizational-processes.qmd)**. What processes will help you to achieve informed decision making with magasin. +* **[Deployment into production](./implement/deployment.qmd)**. Learn more about the configuration of the different components. +* **[Security](./implement/security.qmd)**. Hardening the components of magasin for a production environment. ## Develop magasin From 44cdb2a3abb9f702d92dfca6cc64be8d6d7a2690 Mon Sep 17 00:00:00 2001 From: merlos <404446+merlos@users.noreply.github.com> Date: Thu, 12 Sep 2024 15:08:06 +0300 Subject: [PATCH 11/32] fix format in repository workfloes --- docs/contributing/repository-workflows.qmd | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/docs/contributing/repository-workflows.qmd b/docs/contributing/repository-workflows.qmd index 1153abb..49c0d45 100644 --- a/docs/contributing/repository-workflows.qmd +++ b/docs/contributing/repository-workflows.qmd @@ -112,10 +112,12 @@ Commit messages shall help the reviewer to understand what changes have been int 2. **Clarity and descriptive messages**: Commit messages should be clear, descriptive, and concise. They should summarize the purpose and content of the commit. A good commit message helps others understand the changes at a glance and provides context for future reference. Example. Too generic not descriptive message + ``` ❌ Avoid - Updates Readme - + Updates Readme + ``` + ``` ✅ Better Add CONTRIBUTING link to Readme ``` From 5639a178f6b549bb6f828421b58d437feeb0ee5a Mon Sep 17 00:00:00 2001 From: merlos Date: Thu, 26 Sep 2024 11:29:26 +0300 Subject: [PATCH 12/32] Fix link to get started --- README.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/README.md b/README.md index d6f959d..1104c2d 100644 --- a/README.md +++ b/README.md @@ -6,9 +6,9 @@ Learn more about [why _magasin_](https://unicef.github.io/magasin/why-magasin.ht ## Get started -### **[🚀 Go to get started](https://unicef.github.io/get-started/)** +### **[🚀 Go to get started](https://unicef.github.io/magasin/get-started/)** -In the [get started](https://unicef.github.io/get-started/) you will install magasin within your local machine or in a kubernetes cluster, then you will perform an end-to-end data analysis that includes: +In the [get started](https://unicef.github.io/magasin/get-started/) you will install magasin within your local machine or in a kubernetes cluster, then you will perform an end-to-end data analysis that includes: * exploratory analysis of a data source, * create a pipeline to automate data ingestion, and From dd76c97cb3ebb259ecb26e92d1c580023130cb77 Mon Sep 17 00:00:00 2001 From: merlos <404446+merlos@users.noreply.github.com> Date: Mon, 7 Oct 2024 11:14:49 +0300 Subject: [PATCH 13/32] enhance the team page with q&a --- docs/implement/magasin-team.qmd | 41 ++++++++++++++++++++++++--------- 1 file changed, 30 insertions(+), 11 deletions(-) diff --git a/docs/implement/magasin-team.qmd b/docs/implement/magasin-team.qmd index 5e927bd..c958ff7 100644 --- a/docs/implement/magasin-team.qmd +++ b/docs/implement/magasin-team.qmd @@ -15,35 +15,36 @@ Establishes and manages a magasin instance. While magasin can be operated on a l - Experience setting up, managing, and maintaining Kubernetes clusters. - Knowledge of Kubernetes architecture, including nodes, pods, deployments, and services. - Experience with Kubernetes networking, storage, and security configurations. -* **Helm** (Core) + +* **Helm Usage** (Core) - Experience using Helm for managing Kubernetes deployments. - Ability to customize the values of Helm chart. - Understanding of Helm repositories and version control. -* **Cloud Platforms** (Strongly recommended) +* **Containerization** (Core) + - Understanding of containerization technologies, particularly Docker. + - Experience in building, managing, and deploying container images. + +* **Cloud Platforms** (Recommended) - When the deployment is on the cloud, experience with the cloud provider(s) that the organization may be using such as AWS, Azure, or Google Cloud Platform. - Knowledge of managed Kubernetes services such as EKS, AKS, or GKE. -* **Containerization** (Strongly recommended) - - Understanding of containerization technologies, particularly Docker. - - If specific needs need to be implemented, experience in building, managing, and deploying container images. - -* **Scripting and Automation** (Strongly recommended) +* **Scripting and Automation** (Recommended) - Understanding scripting languages such as Bash or Python. -* **Monitoring and Logging** (Strongly recommended) +* **Monitoring and Logging** (Recommended) - When workloads increase and availability is a must, understanding of monitoring tools like Prometheus, Grafana, and ELK stack. - Ability to set up and manage logging and monitoring for Kubernetes clusters. -* **Kubernetes Security** (Strongly recommended) +* **Kubernetes Security** (Recommended) - If sensitive data is managed by magasin and exposed to Internet and or different vendors, knowledge of Kubernetes security best practices is recommended. - Experience with role-based access control (RBAC) and network policies can help to secure the system -* **DevOps Practices** (Strongly recommended) +* **DevOps Practices** (Recommended) - Understanding of DevOps principles and practices. - Experience with CI/CD pipelines and integrating Kubernetes with CI/CD tools. -* ***What magasin tools does he use?** +* **What magasin tools does he use?** - Apache Superset (Configuration/system operations level) - Dagster (Configuration/system operations level) - Apache Drill (Configuration/system operations level) @@ -112,4 +113,22 @@ His role is to ingest data from different data sources in a recurrent and automa - Dagster (User level) - MinIO (User level) - Drill (User level) + - Mag-Cli (User level) + + +## Frequently asked questions? + +### Do I need all the capabilities since the get go? + +No, your team can learn with time. If you don't have all the capabilities it may take your organization more time to get the full potential of the analysis of your data as you'll be learning at the same time. + + +## Do I actually need to hire new people to manage magasin? + +Not really, you can leverage your existing personnel and train them in the areas where there is a gap in their skill set. + +Whereas finding someone in the market that is proficient already in the three roles may be difficult, your organization still can enable one resource to play more than one magasin-team role. For example, your system administrators who already are managing the enterprise applications are the natural adopters of magasin system administrator role. Software engineers can leverage their software development skills to play the role of data engineers. A data scientist /analyst can extend his functions to also play the role of a data engineer. Data engineers can extend their skillsets to maintain the instance of kubernetes. + + + From cdf67c54c043af1ebe43f8d2326e3f617549b3f2 Mon Sep 17 00:00:00 2001 From: merlos <404446+merlos@users.noreply.github.com> Date: Mon, 7 Oct 2024 11:49:05 +0300 Subject: [PATCH 14/32] add online training courses links --- docs/implement/magasin-team.qmd | 24 ++++++++++++++++++++++-- 1 file changed, 22 insertions(+), 2 deletions(-) diff --git a/docs/implement/magasin-team.qmd b/docs/implement/magasin-team.qmd index c958ff7..daeb079 100644 --- a/docs/implement/magasin-team.qmd +++ b/docs/implement/magasin-team.qmd @@ -86,7 +86,7 @@ Needs to understand the business itself and collaborate very closely with the bu - Use of Dagster (User level) ### Data Engineer -His role is to ingest data from different data sources in a recurrent and automated way. +With strong background in software engineering, his role is to develop data pipelines to ingest data from different data sources in a recurrent and automated way that can be extended and maintained in the long run. * **Data Engineering and ETL (Extract, Transform and Load)** (Core): - Proficiency in designing, building, and maintaining data pipelines. @@ -127,8 +127,28 @@ No, your team can learn with time. If you don't have all the capabilities it ma Not really, you can leverage your existing personnel and train them in the areas where there is a gap in their skill set. -Whereas finding someone in the market that is proficient already in the three roles may be difficult, your organization still can enable one resource to play more than one magasin-team role. For example, your system administrators who already are managing the enterprise applications are the natural adopters of magasin system administrator role. Software engineers can leverage their software development skills to play the role of data engineers. A data scientist /analyst can extend his functions to also play the role of a data engineer. Data engineers can extend their skillsets to maintain the instance of kubernetes. +Whereas finding someone in the market that is proficient already in the three roles may be difficult, your organization still can enable one resource to play more than one magasin-team role. For example, +* IT System administrators who already are managing the enterprise applications are the natural adopters of magasin system administrator role. Software engineers can leverage their software development skills to play the role of data engineers. + +* Data engineers can extend their skillsets to maintain the instance of kubernetes. + +* A data scientist /analyst can extend his functions to also play the role of a data engineer by strengthening the software engineer best practices. Indeed it is common to have data scientist playing both roles in small teams. In magasin it's been separated just because a data engineer needs stronger background in software engineering. + + +## Online trainings + +There are thousands of resources online both free and paid below you have a non extensive list that cover many of the core capabilities: + +**System administrators**: + * [Linux Foundation: Introduction to Kubernetes](https://training.linuxfoundation.org/training/introduction-to-kubernetes/) - free + * [Linux Foundation: Kubernetes Courses catalog](https://training.linuxfoundation.org/full-catalog/?_sft_technology=kubernetes) + * [Linux Foundation: Helm Courses catalog](https://training.linuxfoundation.org/full-catalog/?_sft_technology=helm) + +**Data Engineering && Data scientist** + * [Kaggle Learn]([https://www.kaggle.com/learn) - basic intro to data science and data engineering topics - free + * [FreeCodeCamp - Data Analysis with Python](https://www.freecodecamp.org/learn/data-analysis-with-python/) - free + * [Dagster University](https://courses.dagster.io/) - Learn dagster - free From 6f97197469e6ba111ee4319156c68c620a7c6193 Mon Sep 17 00:00:00 2001 From: merlos <404446+merlos@users.noreply.github.com> Date: Mon, 7 Oct 2024 11:51:07 +0300 Subject: [PATCH 15/32] change many to some --- docs/implement/magasin-team.qmd | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/implement/magasin-team.qmd b/docs/implement/magasin-team.qmd index daeb079..9cc1064 100644 --- a/docs/implement/magasin-team.qmd +++ b/docs/implement/magasin-team.qmd @@ -138,7 +138,7 @@ Whereas finding someone in the market that is proficient already in the three ro ## Online trainings -There are thousands of resources online both free and paid below you have a non extensive list that cover many of the core capabilities: +There are thousands of resources online both free and paid below you have a non extensive list that covers some of the core capabilities: **System administrators**: * [Linux Foundation: Introduction to Kubernetes](https://training.linuxfoundation.org/training/introduction-to-kubernetes/) - free From 4726f6c41bc2fec922e3684a677c8edff8393d62 Mon Sep 17 00:00:00 2001 From: merlos <404446+merlos@users.noreply.github.com> Date: Mon, 7 Oct 2024 12:00:34 +0300 Subject: [PATCH 16/32] Fix formatting --- docs/implement/magasin-team.qmd | 16 +++++++++------- 1 file changed, 9 insertions(+), 7 deletions(-) diff --git a/docs/implement/magasin-team.qmd b/docs/implement/magasin-team.qmd index 9cc1064..4d1ec13 100644 --- a/docs/implement/magasin-team.qmd +++ b/docs/implement/magasin-team.qmd @@ -136,19 +136,21 @@ Whereas finding someone in the market that is proficient already in the three ro * A data scientist /analyst can extend his functions to also play the role of a data engineer by strengthening the software engineer best practices. Indeed it is common to have data scientist playing both roles in small teams. In magasin it's been separated just because a data engineer needs stronger background in software engineering. -## Online trainings +## Introductory Online Trainings There are thousands of resources online both free and paid below you have a non extensive list that covers some of the core capabilities: **System administrators**: - * [Linux Foundation: Introduction to Kubernetes](https://training.linuxfoundation.org/training/introduction-to-kubernetes/) - free - * [Linux Foundation: Kubernetes Courses catalog](https://training.linuxfoundation.org/full-catalog/?_sft_technology=kubernetes) - * [Linux Foundation: Helm Courses catalog](https://training.linuxfoundation.org/full-catalog/?_sft_technology=helm) + +* [Linux Foundation: Introduction to Kubernetes](https://training.linuxfoundation.org/training/introduction-to-kubernetes/) - free +* [Linux Foundation: Kubernetes Courses catalog](https://training.linuxfoundation.org/full-catalog/?_sft_technology=kubernetes) +* [Linux Foundation: Helm Courses catalog](https://training.linuxfoundation.org/full-catalog/?_sft_technology=helm) **Data Engineering && Data scientist** - * [Kaggle Learn]([https://www.kaggle.com/learn) - basic intro to data science and data engineering topics - free - * [FreeCodeCamp - Data Analysis with Python](https://www.freecodecamp.org/learn/data-analysis-with-python/) - free - * [Dagster University](https://courses.dagster.io/) - Learn dagster - free + +* [Kaggle Learn]([https://www.kaggle.com/learn) - basic intro to data science and data engineering topics - free +* [FreeCodeCamp - Data Analysis with Python](https://www.freecodecamp.org/learn/data-analysis-with-python/) - free +* [Dagster University](https://courses.dagster.io/) - Learn dagster - free From 026e18bc512f67dfd794bd9186cd99fb6f671df0 Mon Sep 17 00:00:00 2001 From: merlos <404446+merlos@users.noreply.github.com> Date: Mon, 7 Oct 2024 12:02:54 +0300 Subject: [PATCH 17/32] fix rapidpro link --- docs/implement/data-privacy.qmd | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/implement/data-privacy.qmd b/docs/implement/data-privacy.qmd index 366eeb4..4e2c653 100644 --- a/docs/implement/data-privacy.qmd +++ b/docs/implement/data-privacy.qmd @@ -11,7 +11,7 @@ In today's digital age, the importance of **data privacy, responsible data manag **The underlying components of magasin allow you to apply principles of responsible data management, personal data protection and cyber-security**. Magasin can be compliant with any personal data protection law, including the most stringent such as the [General Data protection Regulation (GDPR)](https://gdpr.eu/). However, it is up to the organization and teams that [implement magasin](../install/) achieve this goal. -**Establishing [privacy by design](https://en.wikipedia.org/wiki/Privacy_by_design) and [people-first data practices](https://digitalprinciples.org/principles/establish-people-first-data-practices/)** such as requesting consent, informing the user about the purpose of collecting the data, that is, what you’re going to do with the data (including what you’re going to do within magasin), who are you going to share the data with, ensure that you involve all the stakeholders, specially that people that is affected by the data collected, etc., **happens even before you start using magasin**, Magasin is a data analysis product rather than a data collecting tool such as [Primero](https://www.primero.org/), RapidPro(https://www.rapidpro.io/), or [ODK](https://odk.org/) etc. +**Establishing [privacy by design](https://en.wikipedia.org/wiki/Privacy_by_design) and [people-first data practices](https://digitalprinciples.org/principles/establish-people-first-data-practices/)** such as requesting consent, informing the user about the purpose of collecting the data, that is, what you’re going to do with the data (including what you’re going to do within magasin), who are you going to share the data with, ensure that you involve all the stakeholders, specially that people that is affected by the data collected, etc., **happens even before you start using magasin**, Magasin is a data analysis product rather than a data collecting tool such as [Primero](https://www.primero.org/), [RapidPro](https://www.rapidpro.io/), or [ODK](https://odk.org/) etc. > Magasin is an enabler of maximum potential data usage. From 70211a9f8d0d911e44ae99dd7cbd92f956c149e4 Mon Sep 17 00:00:00 2001 From: merlos Date: Tue, 29 Oct 2024 14:02:32 +0300 Subject: [PATCH 18/32] Update README.md to unicef.io --- README.md | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/README.md b/README.md index 1104c2d..462c75b 100644 --- a/README.md +++ b/README.md @@ -2,13 +2,13 @@ _magasin_ enables organizations to perform of automatic data ingestion, storage, analysis, ML/AI compute and visualization at scale. -Learn more about [why _magasin_](https://unicef.github.io/magasin/why-magasin.html) and its [architecture](https://unicef.github.io/magasin/architecture.html). +Learn more about [why _magasin_](https://magasin.unicef.io/why-magasin.html) and its [architecture](https://magasin.unicef.io/architecture.html). ## Get started -### **[🚀 Go to get started](https://unicef.github.io/magasin/get-started/)** +### **[🚀 Go to get started](https://magasin.unicef.io/get-started/)** -In the [get started](https://unicef.github.io/magasin/get-started/) you will install magasin within your local machine or in a kubernetes cluster, then you will perform an end-to-end data analysis that includes: +In the [get started](https://magasin.unicef.io/get-started/) you will install magasin within your local machine or in a kubernetes cluster, then you will perform an end-to-end data analysis that includes: * exploratory analysis of a data source, * create a pipeline to automate data ingestion, and @@ -18,12 +18,12 @@ In the [get started](https://unicef.github.io/magasin/get-started/) you will ins ## Documentation All the documentation, features, architecture, get started, advanced installation, deployment, contributing... -### [📚 Go to documentation](https://unicef.github.io/magasin/docs-home.html) +### [📚 Go to documentation](https://magasin.unicef.io/docs-home.html) ## Contributing Magasin follows an open approach towards accepting contributions. -### [🇺🇳 Learn about contributing](https://unicef.github.io/magasin/contributing/) +### [🇺🇳 Learn about contributing](https://magasin.unicef.io/contributing/) ## Licenses Software is distributed under: From 05e8b7280aebaa6ec4930091f0cdcad0fbd4401c Mon Sep 17 00:00:00 2001 From: merlos Date: Fri, 1 Nov 2024 09:50:06 +0300 Subject: [PATCH 19/32] improve the documentation of the installer --- docs/install/advanced.qmd | 74 ++++++++++++++++++++++++++++++++------- 1 file changed, 62 insertions(+), 12 deletions(-) diff --git a/docs/install/advanced.qmd b/docs/install/advanced.qmd index c3a9c9d..0344b7e 100644 --- a/docs/install/advanced.qmd +++ b/docs/install/advanced.qmd @@ -13,16 +13,16 @@ Magasin includes an installer script that sets up all the necessary dependencies To install magasin, the most straight forward way is to use the installer. This [install-magasin.sh](https://github.com/unicef/magasin/tree/main/scripts/install/install-magasin.sh) script is used for both Mac OS and [Debian](https://debian.org) like GNU/Linux and performs two tasks: -1. The first one is to install all the pre-requisites required on your computer in order to be able to deploy magasin to a Kubernetes cluster +1. The first one is to install all the pre-requisites required on your computer in order to be able to deploy magasin to a Kubernetes cluster (namely kubectl, helm, mc and mag-cli) 2. The second one is to deploy magasin in the preselected kubernetes cluster. These are the steps the script takes: -1) Check if all the dependencies are already installed (namely kubectl, helm and python) and if any is missing it will prompt you to install it. It uses the recommended setup describe on the package for the [Debian GNU/Linux](https://www.debian.org/) like system. or in MacOS) +1) Check if all the dependencies are already installed (namely kubectl, helm and python) and if any is missing it will prompt you to install it. It uses the recommended setup describe on the package for the [Debian GNU/Linux](https://www.debian.org/) like system or in MacOS) 2) Run the `helm` command install the different components of magasin in the kubernetes cluster. Note that each component will be installed in a different namespace within the cluster. -## Magasin realms +## Magasin realms concept Compared with most of applications that are distributed using helm charts, instead of defining one unique chart that includes all the dependencies, magasin defines an independent chart for each component. This results in a loosely-coupled architecture which allows you to only setup and use the components that fit your organizational needs. @@ -52,7 +52,9 @@ The concept of realms allows us setup supporting tools that can make use of two ## Advanced use of the magasin-installer -You can check the options. + + +You can check the installer options adding the `-h` option. ```bash ./install-magasin.sh -h Usage: install-magasin.sh [-y] [-c] [-r realm_prefix-realm_postfix (magasin)] [-f values_folder (./)] [-d] [-h] @@ -77,31 +79,77 @@ Options: ``` +:::{.callout-note} +You have two options to run the installer + +1) Download the script locally + + ```sh + curl https://magasin.unicef.io/install-magasin.sh + chmod +x ./install-magasin.sh + ./install-magasin.sh -h + ``` + +2) Curl-piping adding `bash|zsh -s -- -arg1 -arg2 ...` + + ```sh + # Debian/Unbuntu like GNU/Linux | Windows WSL + curl -sSL https://magasin.unicef.io/install-magasin.sh | bash -s -- -h + + # MacOS + curl -sSL https://magasin.unicef.io/install-magasin.sh | zsh -s -- -h + + ``` +::: + + Examples of usage: -1. Allows you to check if all the required components are installed +1. The `-c` option Allows you to check if all the required tools to manage manage a managain instance are installed in the local computer (f.i kubectl, mag-cli, helm, mc...) ```sh install-magasin.sh -c ``` -2. Install all pre-requisites required and manage magasin within the current machine but without installing magasin. Installs all the missing components highlighted by the `-c` option + + ```sh + ... + [ i ] magasin installer for a MacOS system (Darwin) + [ ✓ ] kubectl installed (/opt/homebrew/bin/kubectl) + [ ✓ ] helm installed (/opt/homebrew/bin/helm) + [ ✓ ] pip3 installed (/Users/jmerlostevar/.pyenv/shims/pip3) + [ ✓ ] mc installed (/opt/homebrew/bin/mc) + [ ✓ ] mag installed (/opt/homebrew/bin/mag) + + [ ✓ ] All dependencies are installed. + ``` +2. Install all the required tools within the local machine. Installs all the missing tools highlighted by the `-c` option + + ```sh install-magasin.sh -i ``` - This may be useful if you already have an instance of magasin and you want to seamlessly setup all the tools to manage that instance. -3. Setup the realm `test`. Will use `test-` as namespace. + This may be useful to setup all the tools required to use and manage magasin from a computer different from the one originally used to install magasin. + +3. Install an instance of magasin in the realm `test`. Will use `test-` as namespace. ```sh - install-magasin.sh -r test + install-magasin.sh -r test ``` +4. Install magasin without prompting any question. This is useful for automated setups. + + ```sh + install-magasin.sh -y + ``` + + ## Customizing the setup of each component Helm charts allow you to customize some parameters such as the number of replicas, image version to load, startup script parameters, authentication schemas, etc. In order to do that you can create what is called a values file. -The installer allows you use custom values file for each component. By default it searches in the current working directory (`./`) for files that have the name `.yaml`. That is `dagster.yaml`, `drill.yaml`, `superset.yaml`, `daskhub.yaml`. +The installer allows you use custom values file for each component. By default it searches in the current working directory (`./`) for files that have the name `.yaml`. That is `dagster.yaml`, `drill.yaml`, `superset.yaml`, `daskhub.yaml`, `operator.yaml` and `tenant.yaml`. For example, by default the Apache Drill helm chart launches two replicas of its main server. You can change the number of replicas by changing the `drill.count` value. You can create the file `drill.yaml` with the following contents: @@ -152,12 +200,14 @@ Given the structure below: |- superset.yaml ``` -Now, you can deploy magasin for development by running: +Now, you can deploy in the same cluster more than one instance of magasin. + +For example, magasin for the dev team in the `magasin-dev` realm by running: ```sh install-magasin.sh -r magasin-dev -f ./dev ``` -And the production environment by running: +And then the production environment can be set using `magasin-prd` by running: ```sh install-magasin.sh -r magasin-prd -f ./prd From 1852a430a32c61abeb86adc8337f87117353b1f1 Mon Sep 17 00:00:00 2001 From: merlos Date: Fri, 1 Nov 2024 09:59:52 +0300 Subject: [PATCH 20/32] curl command to create a file --- docs/install/advanced.qmd | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/install/advanced.qmd b/docs/install/advanced.qmd index 0344b7e..52a5f3f 100644 --- a/docs/install/advanced.qmd +++ b/docs/install/advanced.qmd @@ -85,7 +85,7 @@ You have two options to run the installer 1) Download the script locally ```sh - curl https://magasin.unicef.io/install-magasin.sh + curl -O https://magasin.unicef.io/install-magasin.sh chmod +x ./install-magasin.sh ./install-magasin.sh -h ``` From fd60d62e7ea213d5d9266e597e5bd2b25ad5dcba Mon Sep 17 00:00:00 2001 From: merlos Date: Fri, 1 Nov 2024 11:05:37 +0300 Subject: [PATCH 21/32] update about magasin - dpg --- docs/about.qmd | 15 +++++++++++---- 1 file changed, 11 insertions(+), 4 deletions(-) diff --git a/docs/about.qmd b/docs/about.qmd index 7d51571..dfcca33 100644 --- a/docs/about.qmd +++ b/docs/about.qmd @@ -5,9 +5,14 @@ format: html ## About Magasin -Magasin (pronounced /ma.ɡa.zɛ̃/) is an end-to-end suite of open-source tools stitched together to provide enterprise ready automated ingestion, transformation, and storage as well as the enabling infrastructure and tools to perform data analysis, visualization of datasets and ML / AI. +Magasin (pronounced /ma.ɡa.zɛ̃/) is an end-to-end set of mature open-source toolset that enables organizations to unlock the full potential of their data driving digital transformation effortessly. + +Magasin enables data teams to seamlessly extract, analyze, and visualize data from multiple sources. + +Magasin takes flexibility to another level, thanks to its loosely coupled [architecture](architecture.qmd) composed by mature open-source tools. + +Magasin was created by [UNICEF](https://www.unicef.org) and since 2024, magasin is a [Digital Public Good (DPG)](https://github.com/unicef/magasin/discussions/103). -You can learn more about [why we created magasin](why-magasin.qmd) and its [architecture](architecture.qmd). ## Brief history @@ -15,12 +20,14 @@ Magasin grew out of Office of Innovation's and Information and Communication Tec Also informed by experiences of the [Magic Box](https://www.unicef.org/innovation/Magicbox) applied data science initiative, a range of components were evaluated and trialed with country offices to arrive at the current components and architecture. -In 2021, ICTD engaged one of its long term agreement vendors to assist with evolving the proof-of-concept into a minimum viable product (MVP). +In 2021, ICTD engaged one of its long term agreement with a vendor to assist with evolving the proof-of-concept into a minimum viable product (MVP). -In 2023, UNICEF ICTD Digital Center of Excellence (DCOE) started the journey to detach _magasin_ from its organizational and cloud infrastructure dependencies, and release it as an open-source platform with the goal of becoming a [Digital Public Good](https://digitalpublicgoods.net/digital-public-goods/). +In 2023, UNICEF ICTD Digital Center of Excellence (DCOE) started the journey to detach _magasin_ from its organizational and cloud infrastructure dependencies, and release it as an open-source platform with the aim helping to attain the [Sustainable Development Goals (SDGs)](./sdgs.qmd) and to create a more equitable world. On [February 2nd](https://en.wikipedia.org/wiki/Groundhog_Day_(film)),2024, UNICEF released magasin as an [open source](https://github.com/unicef/magasin) solution. This release ships with an an [easy to install process](install/) toolkit as well as [how to get started documentation](get-started/). +On the [31st of October 2024](https://en.wikipedia.org/wiki/Halloween), magasin was declared a [Digital Public Good](https://github.com/unicef/magasin/discussions/103) by the [Digital Public Goods Alliance](https://app.digitalpublicgoods.net/a/11177). + From 42123fbb13b039f672091d234da5493df0e0e3a3 Mon Sep 17 00:00:00 2001 From: merlos Date: Fri, 1 Nov 2024 11:24:22 +0300 Subject: [PATCH 22/32] add link to support and announcements --- docs/_website.yml | 11 +++++++++-- 1 file changed, 9 insertions(+), 2 deletions(-) diff --git a/docs/_website.yml b/docs/_website.yml index bfb917e..18375ef 100644 --- a/docs/_website.yml +++ b/docs/_website.yml @@ -24,7 +24,7 @@ website: repo-subdir: docs repo-actions: [edit, issue] page-navigation: true - #bread-crumbs: true + bread-crumbs: true # website.navbar : Top navigation bar navbar: @@ -44,6 +44,13 @@ website: file: get-started/index.qmd - text: "Docs" file: docs-home.qmd + - text: "Announcements" # ↗ + href: https://github.com/unicef/magasin/discussions/categories/announcements + target: _blank + - text: "Support " #↗ + url: https://github.com/unicef/magasin/discussions + target: _blank + - text: "About" file: about.qmd @@ -104,7 +111,7 @@ website: file: implement/deployment.qmd - text: "Security" file: implement/security.qmd - + - section: "Contributing" contents: - file: contributing/index.qmd From 5cce5516efe3a34d9d3fc419d02c1e8046391cd6 Mon Sep 17 00:00:00 2001 From: merlos Date: Fri, 1 Nov 2024 11:26:16 +0300 Subject: [PATCH 23/32] improve magasin narrative --- docs/architecture.qmd | 83 +++++++++++++++++++++++++++++++------------ 1 file changed, 60 insertions(+), 23 deletions(-) diff --git a/docs/architecture.qmd b/docs/architecture.qmd index 067dd16..710c03e 100644 --- a/docs/architecture.qmd +++ b/docs/architecture.qmd @@ -4,24 +4,37 @@ description-meta: "More about the architecture of magasin architecture" format: html --- -Magasin is a scalable end-to-end data platform based on open-source components that is natively run in a [Kubernetes cluster](https://kubernetes.io). +Magasin is a scalable end-to-end data toolset based on loosely-coupled open-source components that is natively run in a [Kubernetes cluster](https://kubernetes.io). -By end-to-end this describes a data processing pipeline including from how to ingest raw data from multiple data sources, transform the data, run analyses on the processed data, storage in a cloud or local filesystem to enabling visualisation. +Lets break it down: -Kubernetes is a container orchestration system designed to automate the deployment, scaling, and management of [containerized applications](https://kubernetes.io/docs/concepts/overview/#going-back-in-time). It is an integral part of services offered by major cloud providers. Kubernetes, being open source, can also be set up on-premises. For testing purposes, it is even possible to install it on a desktop computer. By using kubernetes, we ensure the scalability of the solution. +## Magasin is an end-to-end data platform + +By end-to-end we mean that magasin enables an organization to ingest raw data from multiple data sources, transform it, run analyses and prediction models on the processed data, storage the results in a cloud filesystem, and enabling visualisation through dashboards. + + +## Magasin scales with an organization needs + +By scalabre we mean that magasin can be run with relatively low resources to provide service to a small team, to scale to thousands of users in a large organization. + +Magasin leverages the power of Kubernetes. Kubernetes is a container orchestration system designed to automate the deployment, scaling, and management of [containerized applications](https://kubernetes.io/docs/concepts/overview/#going-back-in-time). It is an integral part of services offered by major cloud providers. Kubernetes, being open source, can also be set up on-premises. Indeed, for testing purposes, it is even suitable to install it on a desktop computer. By using kubernetes, we ensure the scalability of the solution. Magasin uses Kubernetes in combination with [Helm](https://helm.sh/), a package manager for Kubernetes applications that eases the initial setup of the different components of magasin. Helm is the equivalent to apt, pip, npm, pacman, snap, conda. Using Helm, users specify the configuration of required Kubernetes resources to deploy magasin through a values file or command-line overrides. -The main components of magasin architecture are independent mature open source projects. They are loosely coupled and glued through set of conventions and tools. +## Magasin is a loosely-coupled architecture -## magasin is a loosely-coupled architecture +Magasin identifies the sets of needs for setting up an end-to-end data platform in an organization: -Magasin identifies the sets of needs for setting up an end-to-end data platform that can scale, and provides the set of open source components and an standard underlying technologies (helm, kubernetes) that can be used to solve the needs. +1. Analysis +2. Ingestion. +3. Storage. +4. Visualization +5. Parallel / Cloud compute -However, organizations may already have some of the elements in the architecture already in place. For example, an organization may already have a preferred data visualization platform such as Microsoft PowerBI or Tableau, and switching to another visualization tool may entail more costs than the licenses themselves. Magasin gets organizations covered on that. Each of the components of magasin is not strictly required for an implementation. -This is achieved using helm packaged system in a slightly different way. Generally, in one single helm package all the components are including, setting up an more opinionated way of deploying a particular application. In magasin, each component operates as an autonomous helm chart. This design choice enables the establishment of a loosely-coupled architecture among its components. It allows you to install each component independently. Therefore, rather than mandating a rigid structure for the entire architecture, magasin embraces a more open and adaptable approach, fostering flexibility in component selection and integration. +However, organizations may already have some of the elements in the architecture already in place. For example, an organization may already have a preferred data visualization platform such as Microsoft PowerBI or Tableau, and switching to another visualization tool may entail more costs than the licenses themselves. Magasin gets organizations covered on that. Each of the components of magasin is not strictly required for an implementation. +Technically, this is achieved by using the Helm package system in a slightly different way. Typically, a single Helm package includes all the components, setting up a more opinionated method of deploying a particular application. However, in Magasin, each component operates as an autonomous Helm chart. This design choice establishes a loosely-coupled architecture among its components, allowing you to install each component independently. Instead of enforcing a rigid structure for the entire architecture, Magasin embraces a more open and adaptable approach, fostering flexibility in component selection and integration. ## Magasin's components @@ -30,6 +43,25 @@ Magasin is built on top of a set of mature open source projects to conform an ba ![Magasin architecture](./images/architecture-simplified.svg) +### Analysis: Notebook environment JupyterHub + +A **Jupyter notebook** is an open-source allows you to create and share documents that contain live code, equations, visualizations, and narrative text. It is a powerful tool that combines code execution, rich text, mathematics, plots, and rich media into a single document. They are widely used in data cleaning and transformation, numerical simulation, statistical modeling, data visualization, machine learning, and much more. + +The advantages of using Jupyter Notebooks are numerous. They provide an interactive computing environment that promotes exploratory analysis, making them ideal for data science projects. Notebooks can be easily shared, promoting reproducible research and facilitating collaboration. They also allow for inline plotting, providing immediate visual feedback on the data being analyzed. Typical uses of Jupyter Notebooks include data analysis and visualization, machine learning, statistical modeling, and educational purposes. For instance, a data scientist might use a Jupyter Notebook to clean a dataset, perform exploratory data analysis, build a machine learning model, and then visualize the results, all within a single, cohesive document. + +The multi-tenant JupyterHub component creates on-demand, isolated containers for authenticated users, each with persistent storage for their notebook workspace. + +While it is common for data analysts to run Jupyter Notebooks locally on their computers, Magasin's approach allows them to leverage the power of the cloud. Similar to how Gmail offers the option to check your email directly in your browser without needing a client installed on your computer, Magasin enables data analysts to run their Jupyter Notebooks seamlessly in the cloud. + +### Parallel cloud computing: Dask Gateway + +In addition to notebooks, magashin ships with a python library tool called Dask that enables data scientists and analysts to leverage the full capacity of the compute power of the Kubernetes cluster. A Dask cluster is a flexible tool for parallel computing in Python. It allows you to write python code that will be run in multiples machines taking advantage of all the compute resources of the kubernetes cluster in which magasin is installed. + +It is composed of a central scheduler and multiple distributed workers. Dask works well at many scales, ranging from a single machine to clusters of many machines. It enables parallel processing and extends the size of convenient datasets from “fits in memory” to "fits on disk"1. However, it can also work across a cluster of multiple machines. + +Dask cluster Dask Gateway allows easy utilization of a Dask cluster from notebook environments for distributed computation of massive datasets or parallelizable operations. + + ### Ingestion: Dagster The [Dagster](http://dagster.io) framework is the primary tool for orchestration of data pipelines for ingestion, transformation, analysis, and machine learning. Each pipeline is isolated and encapsulated on its own container, so different tasks may utilize different versions of a library. @@ -41,6 +73,12 @@ In addition to pipeline isolation, it provides some advantages: 3. **A framework for creating pipelines that scale.** Whereas early in the data ingestion processes, pipelines are simple and straightforward, with time, when mixing different sources, which requires more complex cleaning and the need of armonizing identifiiers, the pipelines become very prone to be built as spaguetty code. This lmiits the maintainability, discoverability of issues and efficiency of introducing new changes. With dagster, you get a way of building pipelines that will be more structured and easy to maintain. +Whereas dagster comes as the default data pipeline orchestrator, organizations may prefer to leverage other components for the ingestion such as + +1. [OpenFn](https://www.openfn.org/) +2. [Apache Airflow](https://airflow.apache.org/) + + ## Store: A file based approach In the magasin architecture, as general approach, we stand to store data assets as files. In particular, we recommend the use of [Apache parquet file format](https://parquet.apache.org/). @@ -63,7 +101,14 @@ Magasin can be installed in any cloud provider on in premises. However, each clo Founded in 2014, MinIO offers an S3-compatible API, enabling seamless integration with existing cloud storage ecosystems. It is known for its simplicity, scalability, and speed, making it a popular choice for organizations seeking efficient data storage solutions. MinIO's architecture is optimized for modern data workloads, leveraging erasure coding and distributed techniques to ensure data resilience and high availability. With its lightweight footprint and easy deployment on standard hardware, MinIO empowers developers to build scalable storage infrastructures tailored to their specific needs, whether for on-premises, hybrid, or multi-cloud environments. -Whereas MinIO comes out of the box to provide uniform and cloud agnostic storage layer, there may be organizations that prefer to use a cloud native storage such as Azure Blob, S3 Buckets or Google Cloud Storage. +Whereas MinIO comes out of the box as part of the default magasin setuop there may be organizations that prefer use other options: + +1. [Garage](https://garagehq.deuxfleurs.fr/) S3 buckets (Open Source / Self hosting) +2. [Azure Blob Containers](https://azure.microsoft.com/en-us/products/storage/blobs/)(Commercial, Microsoft Public cloud), +3. [Amazon S3 Buckets](https://aws.amazon.com/s3/) (Commercial / Amazon Public cloud) or +4. [Google Cloud Storage](https://cloud.google.com/storage/) (Commercial / Google Public cloud) + +Other organizations may even opt to directly store the ingested data into a database such as PostgreSQL. #### Query engine: Apache Drill @@ -78,27 +123,19 @@ While [data marts](https://en.wikipedia.org/wiki/Data_mart) for specific busines Apache Superset consumes SQL data sources, so Apache Drill is a nice companion for Superset to work with magasin's file based approach. -### Analysis: Notebook environment JupyterHub +Organizations may opt-in to use other visualization options. -A **Jupyter notebook** is an open-source allows you to create and share documents that contain live code, equations, visualizations, and narrative text. It is a powerful tool that combines code execution, rich text, mathematics, plots, and rich media into a single document. They are widely used in data cleaning and transformation, numerical simulation, statistical modeling, data visualization, machine learning, and much more. +For example, consuming the ingested data directly from commercial solutions such as Microsoft PowerBI, Tableau or InfoGram. -The advantages of using Jupyter Notebooks are numerous. They provide an interactive computing environment that promotes exploratory analysis, making them ideal for data science projects. Notebooks can be easily shared, promoting reproducible research and facilitating collaboration. They also allow for inline plotting, providing immediate visual feedback on the data being analyzed. Typical uses of Jupyter Notebooks include data analysis and visualization, machine learning, statistical modeling, and educational purposes. For instance, a data scientist might use a Jupyter Notebook to clean a dataset, perform exploratory data analysis, build a machine learning model, and then visualize the results, all within a single, cohesive document. - -The multi-tenant JupyterHub component creates on-demand, isolated containers for authenticated users, each with persistent storage for their R and Python notebook workspace. - -### Parallel computing: Dask Gateway -A Dask cluster is a flexible tool for parallel computing in Python. It allows you to write python code that will be run in multiples machines taking advantage of all the compute resources of the kubernetes cluster in which magasin is installed. - -It is composed of a central scheduler and multiple distributed workers. Dask works well at many scales, ranging from a single machine to clusters of many machines. It enables parallel processing and extends the size of convenient datasets from “fits in memory” to "fits on disk"1. However, it can also work across a cluster of multiple machines. - -Dask cluster Dask Gateway allows easy utilization of a Dask cluster from notebook environments for distributed computation of massive datasets or parallelizable operations. +## Mag-cli -## Mag-cli +[Mag-cli](https://github.com/unicef/magasin/tree/main/mag-cli) is the command line interface of magasin. This components helps to manage the different modules of magasin and it makes easier to perform common administration tasks. -[Mag-cli](https://github.com/unicef/magasin/tree/main/mag-cli) is the command line interface of magasin. Helps to manage the different modules of magasin and it makes easier to perform common administration tasks. +For each component (dagster, drill, superset etc.) allows to interact performing common tasks for the administrators and users of magasin such as opening the component user interface in the browser, viewing logs, etc. +It is developed in a modular way, so it is possible to extend its functionality for providing support to an alternative module. ## What's next From 412cfa8d2a11626fda2ea4d22552c4b069e19ded Mon Sep 17 00:00:00 2001 From: merlos Date: Fri, 1 Nov 2024 11:29:36 +0300 Subject: [PATCH 24/32] fix capability image to be fluid --- docs/index.qmd | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/index.qmd b/docs/index.qmd index 529dc8d..cd8a30b 100644 --- a/docs/index.qmd +++ b/docs/index.qmd @@ -14,7 +14,7 @@ toc: false

magasin is the cloud native open-source end-to-end data platform

magasin enables organizations to perform of automatic data ingestion, storage, analysis, ML/AI compute and visualization at scale

- + ::: {.hero-buttons} From 269c2f42b23a45f6b1137ce1aee2cfd2bdd865f1 Mon Sep 17 00:00:00 2001 From: merlos Date: Fri, 1 Nov 2024 11:53:16 +0300 Subject: [PATCH 25/32] magasin logo dpg --- docs/images/magasin-logo-dpg.svg | 31 +++++++++++++++++++++++++++++++ docs/index.qmd | 2 +- 2 files changed, 32 insertions(+), 1 deletion(-) create mode 100644 docs/images/magasin-logo-dpg.svg diff --git a/docs/images/magasin-logo-dpg.svg b/docs/images/magasin-logo-dpg.svg new file mode 100644 index 0000000..26af01f --- /dev/null +++ b/docs/images/magasin-logo-dpg.svg @@ -0,0 +1,31 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/docs/index.qmd b/docs/index.qmd index cd8a30b..d99b5ca 100644 --- a/docs/index.qmd +++ b/docs/index.qmd @@ -10,7 +10,7 @@ css: index.css toc: false --- ::: {.hero .text-center} -![](images/magasin-logo-beta.svg) +![](images/magasin-logo-dpg.svg)

magasin is the cloud native open-source end-to-end data platform

magasin enables organizations to perform of automatic data ingestion, storage, analysis, ML/AI compute and visualization at scale

From 90541690d8dc258ab36f03d479620a681118e969 Mon Sep 17 00:00:00 2001 From: merlos Date: Fri, 1 Nov 2024 12:33:58 +0300 Subject: [PATCH 26/32] update taglines --- docs/index.qmd | 10 ++++++---- 1 file changed, 6 insertions(+), 4 deletions(-) diff --git a/docs/index.qmd b/docs/index.qmd index d99b5ca..b3a6186 100644 --- a/docs/index.qmd +++ b/docs/index.qmd @@ -12,11 +12,13 @@ toc: false ::: {.hero .text-center} ![](images/magasin-logo-dpg.svg) -

magasin is the cloud native open-source end-to-end data platform

-

magasin enables organizations to perform of automatic data ingestion, storage, analysis, ML/AI compute and visualization at scale

+

unleash the full potential of your data with magasin

+

Magasin is the only end-to-end open-source foundational toolset designed to help data analysis teams uncover impactful insights throughout your organization digital transformation journey. +

- - +

+ Magasin enables organization to extract, analyze, and visualize data from multiple sources at scale.. +

::: {.hero-buttons} [Get started](get-started/index.qmd){.btn-action-primary .btn-action .btn .btn-primary .btn-lg role="button"} [Why magasin](why-magasin.qmd){.btn-action-primary .btn .btn-outline-primary .btn-lg role="button"} From ee6efeb6165583790f9511b620422710628ce90d Mon Sep 17 00:00:00 2001 From: merlos Date: Fri, 1 Nov 2024 12:34:36 +0300 Subject: [PATCH 27/32] add dpga logo and dpg status --- docs/images/dpga-logo.png | Bin 0 -> 40705 bytes docs/index.qmd | 24 ++++++++++++++++++++++++ 2 files changed, 24 insertions(+) create mode 100644 docs/images/dpga-logo.png diff --git a/docs/images/dpga-logo.png b/docs/images/dpga-logo.png new file mode 100644 index 0000000000000000000000000000000000000000..cea10cefb3fa20397bea4cd13bde7176f6117837 GIT binary patch literal 40705 zcmb@tWmsIzvM4+Z?t?oF5-hm8y95~AJxI{t&fxAA+=B!O0Rq8;J3)d52_(4N1pOxO z-e;floqK=Y)z5lXPfu0%D(UK~>Rz#$uN1K{$T0u_0JgG{90UMBNP*w%XejU&#zO%+ z_yfTMq9_BXpQ7A{|H!g6P=2kh4q%1X(E!K@_yEMeAn*b}AO|4-QwIQ45GejrhahkR zfbe!a_-z#J06_XTj1&C%_fmr2aO{6QrEOfTY{AOTmUgxfTT2^1cspV-!herZ4E!&A zgp^{$|J2#xZ~*VN(Q5bu-A&2R0|3Az_5h&IemP5IDB|HT;JMpatjL!b8_);^6;?3 zA=o|qTs$p(*Pk)a0hz!S*DClHX^IDJMfTfW0Y9~kf z0|LSg0`4>YRsmcj$O@x6gqdBlxOtLiyzBNMWJB14H{B*pEo;>OmFPRs+rogX)2YCo z%erW8Q$FPXcZHD}88$$XMx9z2`cLUastDcG)qQRx{e(?!p_`d#T?w@blVBHTQ%8Uo zXsi^1nW3Ks0C68BUTJ44g`5;R>gYj-1xc3HminhyeAVm~NbCJ3UfQ30=e4k<*bscx zAHBYK(UQs_YSk+V^b;~Z!D&5VT~Bc>v};DUGFo7t@eT@{yDUBB z?dy4ZyZxt!;b#ip?2H>;Z*+XM3Y$2mI&@zO0UJEG#ggonWJB7}5HcH%1SPRnq&#4NOtfWV#_4x6ST8J3!9U(gH$E z3$heqD!;(#R=}_ayi3qx z!1|T{i6IoAx|astJXhnLzUZvy=$m+B=J)HN!|jzSyΜ9T-`V`9jrZQL{TNZ;_Ld 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 literal 0 HcmV?d00001 diff --git a/docs/index.qmd b/docs/index.qmd index b3a6186..c058fae 100644 --- a/docs/index.qmd +++ b/docs/index.qmd @@ -8,6 +8,8 @@ sidebar: false page-layout: full css: index.css toc: false +number-sections: false + --- ::: {.hero .text-center} ![](images/magasin-logo-dpg.svg) @@ -24,4 +26,26 @@ toc: false [Why magasin](why-magasin.qmd){.btn-action-primary .btn .btn-outline-primary .btn-lg role="button"} ::: + +::: {.grid .pt-5} + +::: {.g-col-1} + +::: +::: {.g-col-4} + + +::: + +::: {.g-col-6} + + +### A certified Digital Public Good (DPG) + +#### The [Digital Public Goods Alliance](https://www.digitalpublicgoods.net/) certified magasin as a [DPG](https://github.com/unicef/magasin/discussions/103) in 2024. + +What does that mean? +Being recognized as a digital public good (DPG) means that magasin adheres to [open source principles](./architecture.qmd), [data privacy](implement/data-privacy.qmd), and software best practices. It ensures that our platform does no harm and helps attain the [Sustainable Development Goals (SDGs)](./sdgs.qmd). +::: + ::: \ No newline at end of file From d8f973a2c20ad0565b9b5ae91bed2e30ce922756 Mon Sep 17 00:00:00 2001 From: merlos Date: Fri, 1 Nov 2024 12:35:21 +0300 Subject: [PATCH 28/32] change size of dpg badge --- docs/images/magasin-logo-dpg.svg | 22 +++++++++++----------- 1 file changed, 11 insertions(+), 11 deletions(-) diff --git a/docs/images/magasin-logo-dpg.svg b/docs/images/magasin-logo-dpg.svg index 26af01f..abc14fa 100644 --- a/docs/images/magasin-logo-dpg.svg +++ b/docs/images/magasin-logo-dpg.svg @@ -1,4 +1,4 @@ - + @@ -18,14 +18,14 @@ - - - - - - - - - - + + + + + + + + + + From 713ea9f9f28e242e41969d9778e4b7b4b1a25e8b Mon Sep 17 00:00:00 2001 From: merlos Date: Fri, 1 Nov 2024 12:37:04 +0300 Subject: [PATCH 29/32] remove dot --- docs/index.qmd | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/index.qmd b/docs/index.qmd index c058fae..4c61acb 100644 --- a/docs/index.qmd +++ b/docs/index.qmd @@ -19,7 +19,7 @@ number-sections: false

- Magasin enables organization to extract, analyze, and visualize data from multiple sources at scale.. + Magasin enables organization to extract, analyze, and visualize data from multiple sources at scale.

::: {.hero-buttons} [Get started](get-started/index.qmd){.btn-action-primary .btn-action .btn .btn-primary .btn-lg role="button"} From 979f44451575d9d0c374d59e88563331cfe91505 Mon Sep 17 00:00:00 2001 From: merlos Date: Mon, 4 Nov 2024 06:08:46 +0300 Subject: [PATCH 30/32] fix typo --- docs/get-started/automate-data-ingestion.qmd | 1 + 1 file changed, 1 insertion(+) diff --git a/docs/get-started/automate-data-ingestion.qmd b/docs/get-started/automate-data-ingestion.qmd index 4618218..c4e0088 100644 --- a/docs/get-started/automate-data-ingestion.qmd +++ b/docs/get-started/automate-data-ingestion.qmd @@ -462,6 +462,7 @@ setup( ], extras_require={"dev": ["dagster-webserver", "pytest"]}, ) +``` This is because now Dagster is going to use now the PosgreSQL database that is used in the cluster for keeping the logs data. Earlier, when we were using the local Dagster setup. From daebb933eca3b8539b353a84efaafcb1bcf0b0b3 Mon Sep 17 00:00:00 2001 From: merlos Date: Wed, 11 Dec 2024 10:47:33 +0300 Subject: [PATCH 31/32] Create dependabot.yml --- .github/workflows/dependabot.yml | 24 ++++++++++++++++++++++++ 1 file changed, 24 insertions(+) create mode 100644 .github/workflows/dependabot.yml diff --git a/.github/workflows/dependabot.yml b/.github/workflows/dependabot.yml new file mode 100644 index 0000000..b4c42b3 --- /dev/null +++ b/.github/workflows/dependabot.yml @@ -0,0 +1,24 @@ +--- +version: 2 +updates: + - package-ecosystem: github-actions + directory: / + schedule: + interval: daily + time: "07:00" + timezone: "Europe/Amsterdam" + + - package-ecosystem: pip + directory: /mag-cli + schedule: + interval: daily + time: "07:00" + timezone: "Europe/Amsterdam" + + - package-ecosystem: docker + directory: /mag-sh + schedule: + interval: weekly + day: thursday + time: "07:00" + timezone: "Europe/Amsterdam" From f0a13f47840942e15b0fc4402b0c5c915d038604 Mon Sep 17 00:00:00 2001 From: merlos Date: Wed, 11 Dec 2024 10:51:05 +0300 Subject: [PATCH 32/32] Create dependabot.yml --- .github/dependabot.yml | 24 ++++++++++++++++++++++++ 1 file changed, 24 insertions(+) create mode 100644 .github/dependabot.yml diff --git a/.github/dependabot.yml b/.github/dependabot.yml new file mode 100644 index 0000000..b4c42b3 --- /dev/null +++ b/.github/dependabot.yml @@ -0,0 +1,24 @@ +--- +version: 2 +updates: + - package-ecosystem: github-actions + directory: / + schedule: + interval: daily + time: "07:00" + timezone: "Europe/Amsterdam" + + - package-ecosystem: pip + directory: /mag-cli + schedule: + interval: daily + time: "07:00" + timezone: "Europe/Amsterdam" + + - package-ecosystem: docker + directory: /mag-sh + schedule: + interval: weekly + day: thursday + time: "07:00" + timezone: "Europe/Amsterdam"