From b93afa575a319912f37322823cdf078f7956c533 Mon Sep 17 00:00:00 2001
From: Juice Brenner Build Bot
Date: Sun, 24 Nov 2024 08:35:28 +0000
Subject: [PATCH] Yet another automated deployment
---
index.html | 2 +-
search/search_index.json | 2 +-
tutorials/epc-setup/index.html | 4 ++--
3 files changed, 4 insertions(+), 4 deletions(-)
diff --git a/index.html b/index.html
index 99bc483..fa33988 100644
--- a/index.html
+++ b/index.html
@@ -216,5 +216,5 @@ What's here?
diff --git a/search/search_index.json b/search/search_index.json
index e62425b..95d783b 100644
--- a/search/search_index.json
+++ b/search/search_index.json
@@ -1 +1 @@
-{"config":{"indexing":"full","lang":["en"],"min_search_length":3,"prebuild_index":false,"separator":"[\\s\\-]+"},"docs":[{"location":"","text":"Seattle Community Network Docs Welcome to the documentation website for the Seattle Community Network ! If you're looking for our main website, it is located at https://www.seattlecommunitynetwork.org . You're in the Right Place Seattle Community Network has a place for everyone . Whether you'd like to join to get free Internet , get involved to help out your community, learn some skills so that you can get a job, or all of the above! PRO TIP We are a community . It's in our name! So, why not start by joining our community ? It's easy. What's here? Some topics you can find on this website include: FAQ - get the answers to some common questions. Community - get involved and learn more about our community, our rules, and what we're up to. Learn - gain some new skills that you can use to help out with our networks. Infrastructure - get the details on how our networks work behind the scenes.","title":"Home"},{"location":"#seattle-community-network-docs","text":"Welcome to the documentation website for the Seattle Community Network ! If you're looking for our main website, it is located at https://www.seattlecommunitynetwork.org .","title":"Seattle Community Network Docs"},{"location":"#youre-in-the-right-place","text":"Seattle Community Network has a place for everyone . Whether you'd like to join to get free Internet , get involved to help out your community, learn some skills so that you can get a job, or all of the above! PRO TIP We are a community . It's in our name! So, why not start by joining our community ? It's easy.","title":"You're in the Right Place"},{"location":"#whats-here","text":"Some topics you can find on this website include: FAQ - get the answers to some common questions. Community - get involved and learn more about our community, our rules, and what we're up to. Learn - gain some new skills that you can use to help out with our networks. Infrastructure - get the details on how our networks work behind the scenes.","title":"What's here?"},{"location":"community/code-of-conduct/","text":"Code of Conduct The Seattle Community Network (SCN) is dedicated to fostering an environment in which everyone can participate in our meetups, installs, online spaces, and any other community event. We believe that diversity in our community is critical and should be celebrated. We welcome everyone of any race, age, gender, nationality, gender identity and expression, sexual orientation, disability, physical appearance, body size, religion, education, and skill level. The SCN community and experience often extends outside those spaces. Members meet in person to collaborate on projects, attend related meetups or conferences together, and communicate on social media. Abusive or unwelcoming behavior between SCN Members still has a profound impact on individuals and on the community when it happens beyond our events and online forums. We will use our discretion when deciding whether to enforce this code of conduct after reports of such behavior happening outside of our spaces, taking into account the impact on the individual Members involved as well as the impact on the community at large. Types of Behavior Encouraged Behavior All participants are expected to: be considerate, respectful, and collaborative. Specifically we expect participants to: Demonstrate empathy, kindness, and patience toward other people Assume the best intentions from others Be respectful of differing opinions, viewpoints, and experiences Give and gracefully accept constructive feedback Accept responsibility and apologize to those affected by our mistakes, and learn from the experience Focus on what is best not just for us as individuals, but for the overall community Unacceptable Behavior The following types of behavior are unacceptable at SCN, both online and in-person, and constitute code of conduct violations. Abusive Behavior Harassment Offensive verbal comments related to gender, sexual orientation, disability, physical appearance, body size, race, nationality, immigration status, language, religion, or education level Sexual images in public spaces, unwelcome sexual or romantic attention, and inappropriate physical contact. Threats Threating someone physically or verbally. For example, threatening to publicize sensitive information about someone's personal life Hacking Any kind of malicious or harmful behavior towards other network users and their devices/data/property, or towards the network and its equipment or normal functioning. For example, DDOS attacks or unauthorized remote access. Unwelcoming Behavior Blatant -isms Saying things that are explicitly racist, sexist, homophobic, etc. For example, arguing that some people are less intelligent because of their gender, race or religion. Subtle -isms and small mistakes made in conversation are not code of conduct violations. However, repeating something after it has been pointed out to you that you made a member feel unwelcome, broke a social rule or antagonizing or arguing with someone who has pointed out your subtle -ism is considered unwelcoming behavior and is not allowed in SCN. Maliciousness towards other members Deliberately attempting to make others feel bad, name-calling, singling out others for derision or exclusion. For example, telling somone they're not technical enough or that they don't belong in SCN. Being especially unpleasant For example, if we've received reports from multiple members of annoying, rude, or especially distracting behavior. For example, repeatedly engaging in bad faith arguments, talking down to people, or excluding people from participation. Reporting Please report code of conduct violations either to the event organizer, by emailing lcl@seattlecommunitynetwork.org or by alerting moderators on Discord with the @moderators group tag. All of our moderators are volunteers, and will response with their best effort. However, if you provide your name, or contact info we promise to respond within two business days. How to Report In your report, please include: Subject line \"[SCN Code of Conduct Violation Report]\" followed by descriptive subject Your name This is incredibly helpful for us to be able to follow up with you, and ask questions to better understand the situation. You are welcome to report anonymously. Please only use this option if you really need to, and know that we might not be able to take action without knowing who you are. In any case, provide an email address so we can correspond with you about the report. A detailed description of what happened If the violation happened online, please link to or send us the relevant text. If the violation happened in person, please detail exactly what the other person said or did. In order to take action, we need to know the concrete actions that someone took. Where and when the incident happened Any other relevant context. Do you have examples of a pattern of similar behavior? Do you have a relationship with this person outside of SCN? If/how you've already responded - this lets us know the current state of the situation. Why to Report You are responsible for making SCN a safe and comfortable space for everyone. Everyone in our community shares this responsibility. Our volunteer Moderators are not around all the time, so we cannot enforce the code of conduct without your help. The consequences for SCN of not reporting bad behavior outweigh the consequences for one person reporting it. We sometimes hear \u201cI don\u2019t want X person to meet consequences because I told someone about their bad behavior.\u201d Consider the impact on everyone else at SCN of letting their behavior continue unchecked. SCN only works as a self-directed, community-driven effort because of shared trust between members. Reporting code of conduct violations helps us identify when this trust is broken, to prevent that from happening in the future. Enforcement Guidelines Moderators will follow these Community Impact Guidelines in determining the consequences for any action they deem in violation of this Code of Conduct. Correction Community Impact: Unwelcoming behavior. Use of inappropriate language or other behavior deemed unprofessional or unwelcome in the community. Consequence: A private, written warning from moderators, providing clarity around the nature of the violation and an explanation of why the behavior was inappropriate. A public or private apology may be requested in the venue where the behavior took place, for example on Discord or at the event. Warning Community Impact: A violation through a single incident of abusive behavior or series of unwelcoming behaviors. Consequence: A warning with consequences for continued behavior. No interaction with the people involved, including unsolicited interaction with those enforcing the Code of Conduct, for a specified period of time. This includes avoiding interactions in community spaces as well as external channels like social media. Violating these terms may lead to a temporary or permanent ban. Temporary Ban Community Impact: A serious violation of community standards, including sustained unwelcoming behavior. Consequence: A temporary ban from any sort of participation, interaction, or public communication with the community for a specified period of time. No public or private interaction with the people involved, including unsolicited interaction with those enforcing the Code of Conduct, is allowed during this period. Violating these terms may lead to a permanent ban. Permanent Ban Community Impact: Demonstrating a pattern of violation of community standards, including sustained unwelcoming behavior, harassment or threatening of an individual, or aggression toward or disparagement of classes of individuals. Consequence: A permanent ban from any sort of participation, or public interaction within the community. Discussion If you have questions about any aspect of the code of conduct, or want to propose amending it, please contact the @moderators group, or drop in to the public #governance channel on Discord. Attribution Taken almost verbatim from the NYC Mesh Code of Conduct . NYC Mesh CoC Attribution: Most of this is from the Recurse Center CoC. Other parts are from Strange Loop(community goals), Contributor Covenant (portion of the community goals, encouraged behaviors, enforcement guidelines), and the Toronto Mesh/Geek Feminism (guidelines for moderators).","title":"Code of Conduct"},{"location":"community/code-of-conduct/#code-of-conduct","text":"The Seattle Community Network (SCN) is dedicated to fostering an environment in which everyone can participate in our meetups, installs, online spaces, and any other community event. We believe that diversity in our community is critical and should be celebrated. We welcome everyone of any race, age, gender, nationality, gender identity and expression, sexual orientation, disability, physical appearance, body size, religion, education, and skill level. The SCN community and experience often extends outside those spaces. Members meet in person to collaborate on projects, attend related meetups or conferences together, and communicate on social media. Abusive or unwelcoming behavior between SCN Members still has a profound impact on individuals and on the community when it happens beyond our events and online forums. We will use our discretion when deciding whether to enforce this code of conduct after reports of such behavior happening outside of our spaces, taking into account the impact on the individual Members involved as well as the impact on the community at large.","title":"Code of Conduct"},{"location":"community/code-of-conduct/#types-of-behavior","text":"","title":"Types of Behavior"},{"location":"community/code-of-conduct/#encouraged-behavior","text":"All participants are expected to: be considerate, respectful, and collaborative. Specifically we expect participants to: Demonstrate empathy, kindness, and patience toward other people Assume the best intentions from others Be respectful of differing opinions, viewpoints, and experiences Give and gracefully accept constructive feedback Accept responsibility and apologize to those affected by our mistakes, and learn from the experience Focus on what is best not just for us as individuals, but for the overall community","title":"Encouraged Behavior"},{"location":"community/code-of-conduct/#unacceptable-behavior","text":"The following types of behavior are unacceptable at SCN, both online and in-person, and constitute code of conduct violations.","title":"Unacceptable Behavior"},{"location":"community/code-of-conduct/#abusive-behavior","text":"Harassment Offensive verbal comments related to gender, sexual orientation, disability, physical appearance, body size, race, nationality, immigration status, language, religion, or education level Sexual images in public spaces, unwelcome sexual or romantic attention, and inappropriate physical contact. Threats Threating someone physically or verbally. For example, threatening to publicize sensitive information about someone's personal life Hacking Any kind of malicious or harmful behavior towards other network users and their devices/data/property, or towards the network and its equipment or normal functioning. For example, DDOS attacks or unauthorized remote access.","title":"Abusive Behavior"},{"location":"community/code-of-conduct/#unwelcoming-behavior","text":"Blatant -isms Saying things that are explicitly racist, sexist, homophobic, etc. For example, arguing that some people are less intelligent because of their gender, race or religion. Subtle -isms and small mistakes made in conversation are not code of conduct violations. However, repeating something after it has been pointed out to you that you made a member feel unwelcome, broke a social rule or antagonizing or arguing with someone who has pointed out your subtle -ism is considered unwelcoming behavior and is not allowed in SCN. Maliciousness towards other members Deliberately attempting to make others feel bad, name-calling, singling out others for derision or exclusion. For example, telling somone they're not technical enough or that they don't belong in SCN. Being especially unpleasant For example, if we've received reports from multiple members of annoying, rude, or especially distracting behavior. For example, repeatedly engaging in bad faith arguments, talking down to people, or excluding people from participation.","title":"Unwelcoming Behavior"},{"location":"community/code-of-conduct/#reporting","text":"Please report code of conduct violations either to the event organizer, by emailing lcl@seattlecommunitynetwork.org or by alerting moderators on Discord with the @moderators group tag. All of our moderators are volunteers, and will response with their best effort. However, if you provide your name, or contact info we promise to respond within two business days.","title":"Reporting"},{"location":"community/code-of-conduct/#how-to-report","text":"In your report, please include: Subject line \"[SCN Code of Conduct Violation Report]\" followed by descriptive subject Your name This is incredibly helpful for us to be able to follow up with you, and ask questions to better understand the situation. You are welcome to report anonymously. Please only use this option if you really need to, and know that we might not be able to take action without knowing who you are. In any case, provide an email address so we can correspond with you about the report. A detailed description of what happened If the violation happened online, please link to or send us the relevant text. If the violation happened in person, please detail exactly what the other person said or did. In order to take action, we need to know the concrete actions that someone took. Where and when the incident happened Any other relevant context. Do you have examples of a pattern of similar behavior? Do you have a relationship with this person outside of SCN? If/how you've already responded - this lets us know the current state of the situation.","title":"How to Report"},{"location":"community/code-of-conduct/#why-to-report","text":"You are responsible for making SCN a safe and comfortable space for everyone. Everyone in our community shares this responsibility. Our volunteer Moderators are not around all the time, so we cannot enforce the code of conduct without your help. The consequences for SCN of not reporting bad behavior outweigh the consequences for one person reporting it. We sometimes hear \u201cI don\u2019t want X person to meet consequences because I told someone about their bad behavior.\u201d Consider the impact on everyone else at SCN of letting their behavior continue unchecked. SCN only works as a self-directed, community-driven effort because of shared trust between members. Reporting code of conduct violations helps us identify when this trust is broken, to prevent that from happening in the future.","title":"Why to Report"},{"location":"community/code-of-conduct/#enforcement-guidelines","text":"Moderators will follow these Community Impact Guidelines in determining the consequences for any action they deem in violation of this Code of Conduct.","title":"Enforcement Guidelines"},{"location":"community/code-of-conduct/#correction","text":"Community Impact: Unwelcoming behavior. Use of inappropriate language or other behavior deemed unprofessional or unwelcome in the community. Consequence: A private, written warning from moderators, providing clarity around the nature of the violation and an explanation of why the behavior was inappropriate. A public or private apology may be requested in the venue where the behavior took place, for example on Discord or at the event.","title":"Correction"},{"location":"community/code-of-conduct/#warning","text":"Community Impact: A violation through a single incident of abusive behavior or series of unwelcoming behaviors. Consequence: A warning with consequences for continued behavior. No interaction with the people involved, including unsolicited interaction with those enforcing the Code of Conduct, for a specified period of time. This includes avoiding interactions in community spaces as well as external channels like social media. Violating these terms may lead to a temporary or permanent ban.","title":"Warning"},{"location":"community/code-of-conduct/#temporary-ban","text":"Community Impact: A serious violation of community standards, including sustained unwelcoming behavior. Consequence: A temporary ban from any sort of participation, interaction, or public communication with the community for a specified period of time. No public or private interaction with the people involved, including unsolicited interaction with those enforcing the Code of Conduct, is allowed during this period. Violating these terms may lead to a permanent ban.","title":"Temporary Ban"},{"location":"community/code-of-conduct/#permanent-ban","text":"Community Impact: Demonstrating a pattern of violation of community standards, including sustained unwelcoming behavior, harassment or threatening of an individual, or aggression toward or disparagement of classes of individuals. Consequence: A permanent ban from any sort of participation, or public interaction within the community.","title":"Permanent Ban"},{"location":"community/code-of-conduct/#discussion","text":"If you have questions about any aspect of the code of conduct, or want to propose amending it, please contact the @moderators group, or drop in to the public #governance channel on Discord.","title":"Discussion"},{"location":"community/code-of-conduct/#attribution","text":"Taken almost verbatim from the NYC Mesh Code of Conduct . NYC Mesh CoC Attribution: Most of this is from the Recurse Center CoC. Other parts are from Strange Loop(community goals), Contributor Covenant (portion of the community goals, encouraged behaviors, enforcement guidelines), and the Toronto Mesh/Geek Feminism (guidelines for moderators).","title":"Attribution"},{"location":"community/community-networking-toolkit/","text":"Community Networking Toolkit This is a toolkit/resource guide for anyone interested in starting up their own community network. Recommended Deployment Kit Here is a spreadsheet containing a bunch of tools and equipment that you should bring to network deployments. This was created by Esther Jang who has a lot of practical experience deploying sites. This spreadsheet is color-coded into different categories based on how important they are to have! Ethernet Crimping Ethernet crimping is an important skill for network site installations. The length of an ethernet cable connection is only truly known once you're on site so it is useful to be able to quickly cut ethernet cable to the desired length and crimp it. Our Guide to Crimping Workshop Slides Crimping Video Cable Testing Video (first 7 min only for basics) Ethernet Color Coding Diagrams Both the T-568A and the T-568B standard Straight-Through cables are used most often as patch cords for your Ethernet connections. If you require a cable to connect two Ethernet devices directly together without a hub or when you connect two hubs together, you will need to use a Crossover cable instead. Internet Society (ISOC) Materials Introduction to Community Networks All-aspects Community Networking Guides AlterMundi (Spanish Language) NYC Mesh - How to start a community network NYC Mesh Docs Telecommunications Reclaimed - Linked from NYC Mesh guide Start your own ISP This site is dedicated to helping you start your own Internet Service Provider. Specifically this guide is about building a Wireless ISP (WISP). Commotion Construction Kit The Commotion Construction Kit is a set of documentation tools that the Open Technology Institute has used in workshops around the world and at home. It is a \u201cdo it ourselves\u201d guide to building community wireless networks. Neighborhood Network Construction Kit The Neighborhood Network Construction Kit is a set of documentation tools that the Open Technology Institute has used in workshops around the world and at home. It is a \u201cdo it ourselves\u201d guide to building community wireless networks. Many of these activities were first released as part of the Commotion project. Community Technology Field Guide A collective resource for digital stewardship, digital justice and community infrastructure. These resources emphasize self-governance, participatory learning, collaborative design and sustainability. Building Broadband Commons - Tools for Planners and Communities Next Century City - Becoming Broadband Ready, a Toolkit for Communities Wireless Networking in the Developing World - Online Book Wireless Networking in the Developing World is a free book about designing, implementing, and maintaining low-cost wireless networks. Community Networks in Comics It is not easy to explain the concepts behind community networks, both the technical characteristics of radio frequency networks and the social and human aspects of community technologies. Teaching a workshop for popular groups using colonizing terms and methodologies can increase the existing barrier between people and a technology that was not created for their interests. With this in mind, images and analogies are powerful tools to make it easier to explain a technical term or an idea. We reject the premise that to do so would in any way underestimate people\u2019s ability to understand technical matters. Building Consentful Tech Zine In 2017, Una Lee, Dann Toliver, and their design firm And Also Too published the Building Consentful Tech Zine as a provocation on how to think about and design for consentfulness. This framing really resonated with our group, so we expanded it into a project where we prototype what this looks like in practice (and learned some interaction design methodologies on the way)! Report on Digital Skill Sets for Diverse Users The City of Seattle, in partnership with Technology and Social Change Group (TASCHA), developed a set of Digital Equity Indicators that helps measure Seattle\u2019s progress in meeting the initiative's goals. What digital skills do existing frameworks and curricula cover? What digital skills should the City and partners recommend to digital skill instructors to teach and promote? Do these resources have corresponding assessments to help assess individuals\u2019 digital skill abilities? Worksheet for Digital Skills for Diverse Users A list of 74 skills identified by TASCHA (see above resource) to include in digital equity curriculums Report on current state of Detroit Community Network In this case study, we focus on Detroit and the predominantly Black and lower-income neighborhood of the North End as an example of innovative, community-scale projects that are locally generated. New Community Networks by Douglas Schuler Online book about building and socially sustaining community networks, based on Doug Schuler's experiences with the Seattle Community Network project in the 90's (1996)","title":"Community Networking Toolkit"},{"location":"community/community-networking-toolkit/#community-networking-toolkit","text":"This is a toolkit/resource guide for anyone interested in starting up their own community network.","title":"Community Networking Toolkit"},{"location":"community/community-networking-toolkit/#recommended-deployment-kit","text":"Here is a spreadsheet containing a bunch of tools and equipment that you should bring to network deployments. This was created by Esther Jang who has a lot of practical experience deploying sites. This spreadsheet is color-coded into different categories based on how important they are to have!","title":"Recommended Deployment Kit"},{"location":"community/community-networking-toolkit/#ethernet-crimping","text":"Ethernet crimping is an important skill for network site installations. The length of an ethernet cable connection is only truly known once you're on site so it is useful to be able to quickly cut ethernet cable to the desired length and crimp it. Our Guide to Crimping Workshop Slides Crimping Video Cable Testing Video (first 7 min only for basics) Ethernet Color Coding Diagrams Both the T-568A and the T-568B standard Straight-Through cables are used most often as patch cords for your Ethernet connections. If you require a cable to connect two Ethernet devices directly together without a hub or when you connect two hubs together, you will need to use a Crossover cable instead.","title":"Ethernet Crimping"},{"location":"community/community-networking-toolkit/#internet-society-isoc-materials","text":"Introduction to Community Networks","title":"Internet Society (ISOC) Materials"},{"location":"community/community-networking-toolkit/#all-aspects-community-networking-guides","text":"AlterMundi (Spanish Language) NYC Mesh - How to start a community network NYC Mesh Docs Telecommunications Reclaimed - Linked from NYC Mesh guide Start your own ISP This site is dedicated to helping you start your own Internet Service Provider. Specifically this guide is about building a Wireless ISP (WISP). Commotion Construction Kit The Commotion Construction Kit is a set of documentation tools that the Open Technology Institute has used in workshops around the world and at home. It is a \u201cdo it ourselves\u201d guide to building community wireless networks. Neighborhood Network Construction Kit The Neighborhood Network Construction Kit is a set of documentation tools that the Open Technology Institute has used in workshops around the world and at home. It is a \u201cdo it ourselves\u201d guide to building community wireless networks. Many of these activities were first released as part of the Commotion project. Community Technology Field Guide A collective resource for digital stewardship, digital justice and community infrastructure. These resources emphasize self-governance, participatory learning, collaborative design and sustainability. Building Broadband Commons - Tools for Planners and Communities Next Century City - Becoming Broadband Ready, a Toolkit for Communities Wireless Networking in the Developing World - Online Book Wireless Networking in the Developing World is a free book about designing, implementing, and maintaining low-cost wireless networks. Community Networks in Comics It is not easy to explain the concepts behind community networks, both the technical characteristics of radio frequency networks and the social and human aspects of community technologies. Teaching a workshop for popular groups using colonizing terms and methodologies can increase the existing barrier between people and a technology that was not created for their interests. With this in mind, images and analogies are powerful tools to make it easier to explain a technical term or an idea. We reject the premise that to do so would in any way underestimate people\u2019s ability to understand technical matters. Building Consentful Tech Zine In 2017, Una Lee, Dann Toliver, and their design firm And Also Too published the Building Consentful Tech Zine as a provocation on how to think about and design for consentfulness. This framing really resonated with our group, so we expanded it into a project where we prototype what this looks like in practice (and learned some interaction design methodologies on the way)! Report on Digital Skill Sets for Diverse Users The City of Seattle, in partnership with Technology and Social Change Group (TASCHA), developed a set of Digital Equity Indicators that helps measure Seattle\u2019s progress in meeting the initiative's goals. What digital skills do existing frameworks and curricula cover? What digital skills should the City and partners recommend to digital skill instructors to teach and promote? Do these resources have corresponding assessments to help assess individuals\u2019 digital skill abilities? Worksheet for Digital Skills for Diverse Users A list of 74 skills identified by TASCHA (see above resource) to include in digital equity curriculums Report on current state of Detroit Community Network In this case study, we focus on Detroit and the predominantly Black and lower-income neighborhood of the North End as an example of innovative, community-scale projects that are locally generated. New Community Networks by Douglas Schuler Online book about building and socially sustaining community networks, based on Doug Schuler's experiences with the Seattle Community Network project in the 90's (1996)","title":"All-aspects Community Networking Guides"},{"location":"community/join/","text":"Join Us Seattle Community Network has a place for everyone . Whether you'd like to join to get free Internet, get involved to help out your community, learn some skills so that you can get a job, or all of the above! PRO TIP Do everything on this page! Our community is spread out in a lot of different places, so doing everything is the best way to make sure you don't miss out. Join our Discord! Discord is a messaging platform that we use to stay in touch with each other, organize our different teams, and update everyone on last minute things. This is a MUST do if you don't want to get left out! Follow these steps to join our Discord server: Click the invite link to enter the Discord server. Introduce yourself on the #introductions channel and friend request one of the moderators so they can chat with you (you can write @moderators in your message to get their attention). They will need to add a role for you as a \"member\" so you can stay on the server before you log out, otherwise you will have to be invited and join again. Install Discord on your computer , Android , or iOS device to always stay up-to-date. Chat with someone! The best way to get involved with the network is to find someone that can direct you! Most of our work happens in teams. Here's how to join a team . Subscribe to our Google calendar! On our Google calendar we post regular occurring meetings and any impromptu events like social events, emergency repairs, site visits, etc. This is one of the only places to find out about the meetings our various teams are having! Join using one of these options: Use this link that should prompt you to add the calendar to your Google account Use this ICS file to manually add the calendar via the iCalendar format. View the calendar here Follow our social media! Our social media team makes posts about upcoming meetings, social events, and they also occasionally make educational posts! Don't miss out and follow us on Instagram , Facebook , and Twitter . Visit our Community Lab Space! See the Space for details.","title":"Join Us"},{"location":"community/join/#join-us","text":"Seattle Community Network has a place for everyone . Whether you'd like to join to get free Internet, get involved to help out your community, learn some skills so that you can get a job, or all of the above! PRO TIP Do everything on this page! Our community is spread out in a lot of different places, so doing everything is the best way to make sure you don't miss out.","title":"Join Us"},{"location":"community/join/#join-our-discord","text":"Discord is a messaging platform that we use to stay in touch with each other, organize our different teams, and update everyone on last minute things. This is a MUST do if you don't want to get left out!","title":"Join our Discord!"},{"location":"community/join/#follow-these-steps-to-join-our-discord-server","text":"Click the invite link to enter the Discord server. Introduce yourself on the #introductions channel and friend request one of the moderators so they can chat with you (you can write @moderators in your message to get their attention). They will need to add a role for you as a \"member\" so you can stay on the server before you log out, otherwise you will have to be invited and join again. Install Discord on your computer , Android , or iOS device to always stay up-to-date.","title":"Follow these steps to join our Discord server:"},{"location":"community/join/#chat-with-someone","text":"The best way to get involved with the network is to find someone that can direct you! Most of our work happens in teams. Here's how to join a team .","title":"Chat with someone!"},{"location":"community/join/#subscribe-to-our-google-calendar","text":"On our Google calendar we post regular occurring meetings and any impromptu events like social events, emergency repairs, site visits, etc. This is one of the only places to find out about the meetings our various teams are having! Join using one of these options: Use this link that should prompt you to add the calendar to your Google account Use this ICS file to manually add the calendar via the iCalendar format. View the calendar here","title":"Subscribe to our Google calendar!"},{"location":"community/join/#follow-our-social-media","text":"Our social media team makes posts about upcoming meetings, social events, and they also occasionally make educational posts! Don't miss out and follow us on Instagram , Facebook , and Twitter .","title":"Follow our social media!"},{"location":"community/join/#visit-our-community-lab-space","text":"See the Space for details.","title":"Visit our Community Lab Space!"},{"location":"community/mission-vision-values/","text":"Mission, Vision, and Values Mission LCL seeks to democratize knowledge, skills, and resources to enable people to establish and run their own local, community-centered, and community-owned Internet access networks and digital infrastructure. Vision We envision a world where no one is excluded from access to the Internet, and where anyone can achieve the expertise and capability to bring communications infrastructure to their community and improve their quality of life. Values We value the ability to access the Internet and all public information and digital resources therein as a human right. - Digital privacy of our users and partner organizations - Collaboration, especially with the communities and organizations we work with - Care, consideration, allyship, and peer mentorship between individuals within our organization - Education, sharing, and capacity-building- emphasize teaching and dissemination of information and skills - Openness, transparency, and accountability of our organization and its processes - Democratization and inclusiveness of decision processes among stakeholders - Long-term sustainability of our technology deployments and community structures - Equity in planning for resource allocation, programming, and contribution","title":"Mission, Vision, Values"},{"location":"community/mission-vision-values/#mission-vision-and-values","text":"","title":"Mission, Vision, and Values"},{"location":"community/mission-vision-values/#mission","text":"LCL seeks to democratize knowledge, skills, and resources to enable people to establish and run their own local, community-centered, and community-owned Internet access networks and digital infrastructure.","title":"Mission"},{"location":"community/mission-vision-values/#vision","text":"We envision a world where no one is excluded from access to the Internet, and where anyone can achieve the expertise and capability to bring communications infrastructure to their community and improve their quality of life.","title":"Vision"},{"location":"community/mission-vision-values/#values","text":"We value the ability to access the Internet and all public information and digital resources therein as a human right. - Digital privacy of our users and partner organizations - Collaboration, especially with the communities and organizations we work with - Care, consideration, allyship, and peer mentorship between individuals within our organization - Education, sharing, and capacity-building- emphasize teaching and dissemination of information and skills - Openness, transparency, and accountability of our organization and its processes - Democratization and inclusiveness of decision processes among stakeholders - Long-term sustainability of our technology deployments and community structures - Equity in planning for resource allocation, programming, and contribution","title":"Values"},{"location":"community/partners/","text":"Our Partners Althea ALTSpace API Chaya (WiFi is a Lifeline) Black Brilliance Research Project Breakfast Group City of Seattle IT Compassion8 Innovation /dev/hack Filipino Community of Seattle Internet Archive Internet Society King County Library System Low Income Housing Institute Nickelsville Seattle Makers Seattle Public Schools Tacoma Cooperative Network Tacoma Public Library The Silent Task Force University of Washington","title":"Our Partners"},{"location":"community/partners/#our-partners","text":"Althea ALTSpace API Chaya (WiFi is a Lifeline) Black Brilliance Research Project Breakfast Group City of Seattle IT Compassion8 Innovation /dev/hack Filipino Community of Seattle Internet Archive Internet Society King County Library System Low Income Housing Institute Nickelsville Seattle Makers Seattle Public Schools Tacoma Cooperative Network Tacoma Public Library The Silent Task Force University of Washington","title":"Our Partners"},{"location":"community/space/","text":"Seattle Community Network Lab Space We now have a newly opened community network lab and hack space, co-located with the gracious and welcoming /dev/hack hackerspace in Seattle, WA, with whom we share mutual membership. Address: 4534 1/2 University Way NE, Seattle WA 98105 SCN Lab Space Membership is for 24/7 keyholder access to the space only, and is absolutely not required to volunteer with us. Members can bring in guests at any time. Here are the current member application and policies .","title":"SCN Community Lab Space"},{"location":"community/space/#seattle-community-network-lab-space","text":"We now have a newly opened community network lab and hack space, co-located with the gracious and welcoming /dev/hack hackerspace in Seattle, WA, with whom we share mutual membership. Address: 4534 1/2 University Way NE, Seattle WA 98105 SCN Lab Space Membership is for 24/7 keyholder access to the space only, and is absolutely not required to volunteer with us. Members can bring in guests at any time. Here are the current member application and policies .","title":"Seattle Community Network Lab Space"},{"location":"community/teams/","text":"Join a Team As a volunteer-run community network, we are always in need of extra hands. If you're interested in helping out, check out what our teams are working on here! Feel free to have informational meetings with the respective team leads to learn more about how you can help. There's no commitment required and we welcome you to take on as much work as you have the capacity for. Outreach Our outreach team is responsible for finding new site host partners, finding users, and maintaining communications with our current partners. Message the #outreach channel in Discord and contact Esther Jang to learn more about how you can get involved. This is the perfect team for you if any of the following apply to you: Experience with community organizing Have community connections in the Greater Seattle Area Have cultural humility and experience partnering with marginalized communities Have the ability to translate and/or interpret into non-English languages common in the Seattle area such as Spanish, Vietnamese, Somali, Oromo, Khmer, and more. As of July 2021, the primary objective of the outreach team is to get connected with users for our network sites that fit any of the following criteria: Unemployed Seniors Housing-unstable or houseless Non-English speaking Social Media Our social media team is in charge of our various accounts on Instagram , Facebook , and Twitter . They also develop branding and marketing materials for our various projects. Message the #social-media channel in Discord and contact Firn Tieanklin to learn more about how you can get involved. You should join this team if you have experience in or are interested in practicing any of the following skills/technologies: - Canva - Design - Marketing - Photography/Videography Web Development Our web development team is working on redesigning and developing our new website. Message the #website channel in Discord to learn more about how you can get involved. You should join this team if you have experience in or are interested in learning any of the following skills/technologies: HTML/CSS Javascript Bootstrap React Redux Web Design (Using Figma) Mobile App Development Our mobile app development team is currently developing an Android app to record cell network performance metrics during our field tests. Message the #measurement channel in Discord and contact Zhennan Zhou to learn more about how you can get involved. You should join this team if you have experience in or are interested in learning any of the following skills/technologies: Android app development iOS app development Java Object oriented programming Open source development, Git, and GitHub Education Our education team plays a core role in our community networks as they enable our networks to be community-owned and operated. The education team is responsible for developing educational materials, running workshops, and teaching our Digital Steward cohorts. Message the #digital-stewards channel in Discord and contact Esther Jang to learn more about how you can get involved. You should join this team if you have experience in or are interested in learning any of the following skills/technologies: Teaching Curriculum development Computer networks, LTE networks, and community networks Linux Community organizing Fundraising Our fundraising team is currently setting up a crowdfunding platform to raise money for various expenses that this project requires. Our fundraising team is also working on applying for various community grants and research grants. Message the #funding channel in Discord and contact Esther Jang to learn more about how you can get involved. Accounting & Legal Local Connectivity Lab, the nonprofit organizing that is incubating this project, often runs into accounting and legal challenges. If you are willing to provide pro bono services to benefit the community network, please contact Esther Jang at lcl@seattlecommunitynetwork.org.","title":"Join a Team"},{"location":"community/teams/#join-a-team","text":"As a volunteer-run community network, we are always in need of extra hands. If you're interested in helping out, check out what our teams are working on here! Feel free to have informational meetings with the respective team leads to learn more about how you can help. There's no commitment required and we welcome you to take on as much work as you have the capacity for.","title":"Join a Team"},{"location":"community/teams/#outreach","text":"Our outreach team is responsible for finding new site host partners, finding users, and maintaining communications with our current partners. Message the #outreach channel in Discord and contact Esther Jang to learn more about how you can get involved. This is the perfect team for you if any of the following apply to you: Experience with community organizing Have community connections in the Greater Seattle Area Have cultural humility and experience partnering with marginalized communities Have the ability to translate and/or interpret into non-English languages common in the Seattle area such as Spanish, Vietnamese, Somali, Oromo, Khmer, and more. As of July 2021, the primary objective of the outreach team is to get connected with users for our network sites that fit any of the following criteria: Unemployed Seniors Housing-unstable or houseless Non-English speaking","title":"Outreach"},{"location":"community/teams/#social-media","text":"Our social media team is in charge of our various accounts on Instagram , Facebook , and Twitter . They also develop branding and marketing materials for our various projects. Message the #social-media channel in Discord and contact Firn Tieanklin to learn more about how you can get involved. You should join this team if you have experience in or are interested in practicing any of the following skills/technologies: - Canva - Design - Marketing - Photography/Videography","title":"Social Media"},{"location":"community/teams/#web-development","text":"Our web development team is working on redesigning and developing our new website. Message the #website channel in Discord to learn more about how you can get involved. You should join this team if you have experience in or are interested in learning any of the following skills/technologies: HTML/CSS Javascript Bootstrap React Redux Web Design (Using Figma)","title":"Web Development"},{"location":"community/teams/#mobile-app-development","text":"Our mobile app development team is currently developing an Android app to record cell network performance metrics during our field tests. Message the #measurement channel in Discord and contact Zhennan Zhou to learn more about how you can get involved. You should join this team if you have experience in or are interested in learning any of the following skills/technologies: Android app development iOS app development Java Object oriented programming Open source development, Git, and GitHub","title":"Mobile App Development"},{"location":"community/teams/#education","text":"Our education team plays a core role in our community networks as they enable our networks to be community-owned and operated. The education team is responsible for developing educational materials, running workshops, and teaching our Digital Steward cohorts. Message the #digital-stewards channel in Discord and contact Esther Jang to learn more about how you can get involved. You should join this team if you have experience in or are interested in learning any of the following skills/technologies: Teaching Curriculum development Computer networks, LTE networks, and community networks Linux Community organizing","title":"Education"},{"location":"community/teams/#fundraising","text":"Our fundraising team is currently setting up a crowdfunding platform to raise money for various expenses that this project requires. Our fundraising team is also working on applying for various community grants and research grants. Message the #funding channel in Discord and contact Esther Jang to learn more about how you can get involved.","title":"Fundraising"},{"location":"community/teams/#accounting-legal","text":"Local Connectivity Lab, the nonprofit organizing that is incubating this project, often runs into accounting and legal challenges. If you are willing to provide pro bono services to benefit the community network, please contact Esther Jang at lcl@seattlecommunitynetwork.org.","title":"Accounting & Legal"},{"location":"community/tech-help/","text":"Community Tech Help There are several ways to get community-based tech support from the SCN community, such as the Help Desk . You can use any of these methods to request Internet service from us, request general technology or computer help, or contact us about any other topic. Join our Discord! The FASTEST way to get support will be to join the #support channel on our Discord , a messaging platform that we use to organize. Follow these steps to join Discord: Join our Discord server via the invite link. You will need to log in or create an account to join, and a moderator will need to assign you a role before you are allowed to join permanently. Install Discord for your computer , Android , or iOS device to stay up-to-date on conversations. When posting to the #support channel, describe your question or problem in as much detail as you can. Someone from the community will most likely respond within a few hours. If you would like to get to know the community, introduce yourself in the #introductions channel! How did you hear about SCN and why are you interested? (More complete instructions can be found here ). Community-Run Help Desk The Seattle Community Network organizes a community-run tech help desk supported by the Black Brilliance Research Project's (BBR's) Digital Stewards Program and the Filipino Community of Seattle (FCS). Our current in-person help desk hours are on Fridays at 3-5 pm starting on 2/18/2022, located in the Filipino Community Village Integrated Learning Center (ILC) . Filipino Community Village Integrated Learning Center address: 5727 37th Ave S, Seattle, WA 98118 Our help desk is best-effort and mainly volunteer-based, so our virtual hours availability may be highly variable. Please check our available hours and sign up for an appointment slot using the calendar link below if you can (or contact us another way if that doesn't work), as it helps the volunteers plan for our time. However, you may also drop in during our scheduled calendar hours without an appointment. Our Help Desk Calendar : You can sign up for an appointment slot for any staffed volunteer hours indicated on the calendar. Phone Number (Voicemail-only except during staffed Community Tech Help hours): (253) 655-7221 You may also send text messages to this number, which will be checked during staffed hours. Inquiries about getting connected to our Internet service can also be sent here. Email address for general Tech Support: support@seattlecommunitynetwork.org Email address for SCN Internet service-related support: help@seattlecommunitynetwork.org Help Desk Volunteers We are actively recruiting more volunteers to help us run the help desk virtually, whenever and wherever that you are available. Join our team by simply signing up on this interest form , we need you! Please let us know if you have additional questions or concerns in the #support channel on our Discord . Documentation As always, please do not hesitate to consult our docs for any information, or submit an issue on the docs site github if there is information missing that you would like to see. Also feel free to message the Discord for the same purpose.","title":"Community Tech Help"},{"location":"community/tech-help/#community-tech-help","text":"There are several ways to get community-based tech support from the SCN community, such as the Help Desk . You can use any of these methods to request Internet service from us, request general technology or computer help, or contact us about any other topic.","title":"Community Tech Help"},{"location":"community/tech-help/#join-our-discord","text":"The FASTEST way to get support will be to join the #support channel on our Discord , a messaging platform that we use to organize.","title":"Join our Discord!"},{"location":"community/tech-help/#follow-these-steps-to-join-discord","text":"Join our Discord server via the invite link. You will need to log in or create an account to join, and a moderator will need to assign you a role before you are allowed to join permanently. Install Discord for your computer , Android , or iOS device to stay up-to-date on conversations. When posting to the #support channel, describe your question or problem in as much detail as you can. Someone from the community will most likely respond within a few hours. If you would like to get to know the community, introduce yourself in the #introductions channel! How did you hear about SCN and why are you interested? (More complete instructions can be found here ).","title":"Follow these steps to join Discord:"},{"location":"community/tech-help/#community-run-help-desk","text":"The Seattle Community Network organizes a community-run tech help desk supported by the Black Brilliance Research Project's (BBR's) Digital Stewards Program and the Filipino Community of Seattle (FCS). Our current in-person help desk hours are on Fridays at 3-5 pm starting on 2/18/2022, located in the Filipino Community Village Integrated Learning Center (ILC) . Filipino Community Village Integrated Learning Center address: 5727 37th Ave S, Seattle, WA 98118 Our help desk is best-effort and mainly volunteer-based, so our virtual hours availability may be highly variable. Please check our available hours and sign up for an appointment slot using the calendar link below if you can (or contact us another way if that doesn't work), as it helps the volunteers plan for our time. However, you may also drop in during our scheduled calendar hours without an appointment. Our Help Desk Calendar : You can sign up for an appointment slot for any staffed volunteer hours indicated on the calendar. Phone Number (Voicemail-only except during staffed Community Tech Help hours): (253) 655-7221 You may also send text messages to this number, which will be checked during staffed hours. Inquiries about getting connected to our Internet service can also be sent here. Email address for general Tech Support: support@seattlecommunitynetwork.org Email address for SCN Internet service-related support: help@seattlecommunitynetwork.org","title":"Community-Run Help Desk"},{"location":"community/tech-help/#help-desk-volunteers","text":"We are actively recruiting more volunteers to help us run the help desk virtually, whenever and wherever that you are available. Join our team by simply signing up on this interest form , we need you! Please let us know if you have additional questions or concerns in the #support channel on our Discord .","title":"Help Desk Volunteers"},{"location":"community/tech-help/#documentation","text":"As always, please do not hesitate to consult our docs for any information, or submit an issue on the docs site github if there is information missing that you would like to see. Also feel free to message the Discord for the same purpose.","title":"Documentation"},{"location":"contribute/contribute/","text":"Contribute to SCN Docs Looking to help? If you wanna share resources and help improve our docs, this page will get you started! Our docs are designed so that anyone can contribute. If this page isn't enough, contact one of us and we'll be able to help you! Our documentation uses MkDocs ReadTheDocs theme (links at the bottom of the page) Editing process To edit this documentation you should: Get your own copy of the repo Modify the documentation in your own repo (for more information see section on Local Development) Submit a pull request Wait for someone to review and approve the request. You can also nudge someone who has access to approve it. The rest of this page will explain all the details you need to know about the directory structure, markdown, and other quirks for editing this documentation. Make sure to read everything! Markdown files All our documentation is stored in 'Markdown' files so that they can be easily modified and changed without heavy technical knowledge. Markdown Editors A nice and simple online editor is StackEdit which will let you type in markdown and see what it would look like in realtime in split-screen. Another option is HackMD which has the same features as StackEdit but it also allows you to connect to your own GitHub repo and pull/push. This is a nice option if you are uncomfortable with using Git from the command line. Using MkDocs MkDocs is pretty simple, just install it through pip then you can run mkdocs serve to locally view the website it will generate. Each directory has a .pages file that declares the order each file/folder in that directory will show up. Children pages are implicit in the directory structure If you need static files for any of your pages, you should put them in the assets folder within the top level docs folder For example, for the cable-crimping page, the images for the tutorial are located in the \"assets/cable-crimping\" folder. These images can then be referenced relatively with the following standard markdown image syntax: ![RJ45 Crimping Tool](../assets/cable-crimping/kit-crimping-tool.jpg) Deployment The default branch of the repo is gh-pages-src which is where development should be done. One of the things that means is that pull requests will request to be merged by default into this branch. When a merge happens, a github workflow is set up (see .github/workflows) to listen to new commits, and then transform the source to something that can be served by a static file server. These build artifacts are automatically comitted to the branch gh-pages whose latest commit is what our documentation site serves.","title":"Contribute to SCN Docs"},{"location":"contribute/contribute/#contribute-to-scn-docs","text":"","title":"Contribute to SCN Docs"},{"location":"contribute/contribute/#looking-to-help","text":"If you wanna share resources and help improve our docs, this page will get you started! Our docs are designed so that anyone can contribute. If this page isn't enough, contact one of us and we'll be able to help you! Our documentation uses MkDocs ReadTheDocs theme (links at the bottom of the page)","title":"Looking to help?"},{"location":"contribute/contribute/#editing-process","text":"To edit this documentation you should: Get your own copy of the repo Modify the documentation in your own repo (for more information see section on Local Development) Submit a pull request Wait for someone to review and approve the request. You can also nudge someone who has access to approve it. The rest of this page will explain all the details you need to know about the directory structure, markdown, and other quirks for editing this documentation. Make sure to read everything!","title":"Editing process"},{"location":"contribute/contribute/#markdown-files","text":"All our documentation is stored in 'Markdown' files so that they can be easily modified and changed without heavy technical knowledge.","title":"Markdown files"},{"location":"contribute/contribute/#markdown-editors","text":"A nice and simple online editor is StackEdit which will let you type in markdown and see what it would look like in realtime in split-screen. Another option is HackMD which has the same features as StackEdit but it also allows you to connect to your own GitHub repo and pull/push. This is a nice option if you are uncomfortable with using Git from the command line.","title":"Markdown Editors"},{"location":"contribute/contribute/#using-mkdocs","text":"MkDocs is pretty simple, just install it through pip then you can run mkdocs serve to locally view the website it will generate. Each directory has a .pages file that declares the order each file/folder in that directory will show up. Children pages are implicit in the directory structure If you need static files for any of your pages, you should put them in the assets folder within the top level docs folder For example, for the cable-crimping page, the images for the tutorial are located in the \"assets/cable-crimping\" folder. These images can then be referenced relatively with the following standard markdown image syntax: ![RJ45 Crimping Tool](../assets/cable-crimping/kit-crimping-tool.jpg)","title":"Using MkDocs"},{"location":"contribute/contribute/#deployment","text":"The default branch of the repo is gh-pages-src which is where development should be done. One of the things that means is that pull requests will request to be merged by default into this branch. When a merge happens, a github workflow is set up (see .github/workflows) to listen to new commits, and then transform the source to something that can be served by a static file server. These build artifacts are automatically comitted to the branch gh-pages whose latest commit is what our documentation site serves.","title":"Deployment"},{"location":"faq/about/","text":"About Seattle Community Network Seattle Community Network (SCN) is a community network dedicated to providing fair access to underserved communities all across the Puget Sound. SCN is a project of Local Connectivity Lab, a 501(c)(3) registered non-profit that works to share free or low-cost broadband access in higher-need areas throughout the Puget Sound region, making use of existing network infrastructure such as buildings and fiber-optic cables to extend coverage to more people. As a community network, we rely on the help of local residents such as yourself to maintain and grow the network. Joining us is a great way to become an active member of your own community, make friends, and learn valuable technical skills.","title":"What is the Seattle Community Network?"},{"location":"faq/about/#about-seattle-community-network","text":"Seattle Community Network (SCN) is a community network dedicated to providing fair access to underserved communities all across the Puget Sound. SCN is a project of Local Connectivity Lab, a 501(c)(3) registered non-profit that works to share free or low-cost broadband access in higher-need areas throughout the Puget Sound region, making use of existing network infrastructure such as buildings and fiber-optic cables to extend coverage to more people. As a community network, we rely on the help of local residents such as yourself to maintain and grow the network. Joining us is a great way to become an active member of your own community, make friends, and learn valuable technical skills.","title":"About Seattle Community Network"},{"location":"faq/connection/","text":"How do I get Internet from the Seattle Community Network? Eligibility The Seattle Community Network exists to provide free or low-cost internet to low-income and in-need users. We prioritize serving the following groups: low-income families of students unemployed adults (looking for work) majority non-English speaking adults/families seniors Registration To connect to the internet through the Seattle Community Network, you will need to register with us. To register, you can: - Email lcl@seattlecommunitynetwork.org - Contact us by phone at (253) 655-7221 and leaving a voice mail or text. Hardware Once your registration is processed, you will receive the necessary hardware to connect to the network.","title":"How do I get Internet?"},{"location":"faq/connection/#how-do-i-get-internet-from-the-seattle-community-network","text":"","title":"How do I get Internet from the Seattle Community Network?"},{"location":"faq/connection/#eligibility","text":"The Seattle Community Network exists to provide free or low-cost internet to low-income and in-need users. We prioritize serving the following groups: low-income families of students unemployed adults (looking for work) majority non-English speaking adults/families seniors","title":"Eligibility"},{"location":"faq/connection/#registration","text":"To connect to the internet through the Seattle Community Network, you will need to register with us. To register, you can: - Email lcl@seattlecommunitynetwork.org - Contact us by phone at (253) 655-7221 and leaving a voice mail or text.","title":"Registration"},{"location":"faq/connection/#hardware","text":"Once your registration is processed, you will receive the necessary hardware to connect to the network.","title":"Hardware"},{"location":"faq/help/","text":"How can I Help? Volunteer! SCN is run completely by volunteers. There are many ways you can help, and no technology skills are required. We need help with everything from setting up network hardware and developing software to community outreach and fundraising. If you want to help, we can use your talents! First, make sure you get connected with our community . Next, why not Join a Team or Contribute to SCN Docs ?","title":"How can I Help?"},{"location":"faq/help/#how-can-i-help","text":"","title":"How can I Help?"},{"location":"faq/help/#volunteer","text":"SCN is run completely by volunteers. There are many ways you can help, and no technology skills are required. We need help with everything from setting up network hardware and developing software to community outreach and fundraising. If you want to help, we can use your talents! First, make sure you get connected with our community . Next, why not Join a Team or Contribute to SCN Docs ?","title":"Volunteer!"},{"location":"faq/how/","text":"How Does the Seattle Community Network Work? The Seattle Community Network partners with the University of Washington to share free or low-cost internet access with areas of higher need. The Seattle Community Network (SCN) is a wireless Internet access network using 4G LTE and WiFi technologies, providing public access from partner locations such as libraries, schools, businesses, and community centers. The Internet connection at these sites is shared wirelessly to nearby devices using the 4G LTE (cell-phone) data standard, which can be used by certain phones and hotspots (also known as Customer Premises Equipment or CPE). Individual users can connect to this signal using SCN-provided (or other compatible) devices to create a local WiFi network in their home. Some of our installed sites utilize a portion of the University of Washington's internet bandwidth, sharing it out to further neighborhoods via point-to-point wireless links. Some sites use other upstream internet service providers (ISPs) such as Lumen. The network is completely created, managed, and maintained by volunteers with a range of diverse skills in information technology and beyond. All infrastructure is paid for by generous donations from sponsors and the public. Speaking of which, why not volunteer or donate ?","title":"How does SCN Work?"},{"location":"faq/how/#how-does-the-seattle-community-network-work","text":"The Seattle Community Network partners with the University of Washington to share free or low-cost internet access with areas of higher need. The Seattle Community Network (SCN) is a wireless Internet access network using 4G LTE and WiFi technologies, providing public access from partner locations such as libraries, schools, businesses, and community centers. The Internet connection at these sites is shared wirelessly to nearby devices using the 4G LTE (cell-phone) data standard, which can be used by certain phones and hotspots (also known as Customer Premises Equipment or CPE). Individual users can connect to this signal using SCN-provided (or other compatible) devices to create a local WiFi network in their home. Some of our installed sites utilize a portion of the University of Washington's internet bandwidth, sharing it out to further neighborhoods via point-to-point wireless links. Some sites use other upstream internet service providers (ISPs) such as Lumen. The network is completely created, managed, and maintained by volunteers with a range of diverse skills in information technology and beyond. All infrastructure is paid for by generous donations from sponsors and the public. Speaking of which, why not volunteer or donate ?","title":"How Does the Seattle Community Network Work?"},{"location":"faq/site/","text":"About This Website The Seattle Community Network Docs website is the central hub for information about our community and networks. Here, we describe our infrastructure, how to set-up hardware and software, how you can start your own community network, our community rules, and more. This website is maintained by our volunteers, much like the rest of our services. This means you can help us improve it by adding missing information, clarifying confusing points, or even just fixing typos you notice while you\u2019re reading. See Contribute to SCN Docs to learn more about how you can contribute to this website. If you are looking for our main website, it is located at www.seattlecommunitynetwork.org .","title":"What is this site?"},{"location":"faq/site/#about-this-website","text":"The Seattle Community Network Docs website is the central hub for information about our community and networks. Here, we describe our infrastructure, how to set-up hardware and software, how you can start your own community network, our community rules, and more. This website is maintained by our volunteers, much like the rest of our services. This means you can help us improve it by adding missing information, clarifying confusing points, or even just fixing typos you notice while you\u2019re reading. See Contribute to SCN Docs to learn more about how you can contribute to this website. If you are looking for our main website, it is located at www.seattlecommunitynetwork.org .","title":"About This Website"},{"location":"faq/what/","text":"What is a Community Network? \"Community Networks (CNs) are crowd-sourced collaborative networks, developed in a bottom-up fashion by groups of individuals \u2013 i.e. communities \u2013 that design, develop and manage the network infrastructure as a common resource. Importantly, at the centre of CNs and the socio-economic ecosystems they generate lay the communities and their members, who are essential to initiate, maintain and guarantee the success of these connectivity efforts.\" Source: Building Community Network Policies: A Collaborative Governance towards Enabling Frameworks","title":"What is a Community Network?"},{"location":"faq/what/#what-is-a-community-network","text":"\"Community Networks (CNs) are crowd-sourced collaborative networks, developed in a bottom-up fashion by groups of individuals \u2013 i.e. communities \u2013 that design, develop and manage the network infrastructure as a common resource. Importantly, at the centre of CNs and the socio-economic ecosystems they generate lay the communities and their members, who are essential to initiate, maintain and guarantee the success of these connectivity efforts.\" Source: Building Community Network Policies: A Collaborative Governance towards Enabling Frameworks","title":"What is a Community Network?"},{"location":"faq/why/","text":"Why Have a Community Network? Internet access is a foundational component of many aspects of modern life, nearly as important as electricity and water service. Though internet service is generally available in many areas of the United States, there are still areas that are underserved because of a variety of geographic and socio-economic factors, or simply because traditional internet service providers do not find it profitable to install and maintain the necessary infrastructure to serve some areas with adequate internet. Community networks attempt to address this digital divide by connecting underserved communities. Because a community network is created, managed, and maintained by volunteers, it is able to serve areas that may not have other affordable internet options.","title":"Why have a Community Network?"},{"location":"faq/why/#why-have-a-community-network","text":"Internet access is a foundational component of many aspects of modern life, nearly as important as electricity and water service. Though internet service is generally available in many areas of the United States, there are still areas that are underserved because of a variety of geographic and socio-economic factors, or simply because traditional internet service providers do not find it profitable to install and maintain the necessary infrastructure to serve some areas with adequate internet. Community networks attempt to address this digital divide by connecting underserved communities. Because a community network is created, managed, and maintained by volunteers, it is able to serve areas that may not have other affordable internet options.","title":"Why Have a Community Network?"},{"location":"infrastructure/grafana-log-dashboard/","text":"Developed By: Rudra Prakash Singh, Esther Jang This guide walks you through the process of setting up a Grafana Server Log Monitoring Dashboard, including the installation and configuration of Grafana, Loki, and Promtail for log aggregation and visualization. It also covers setting up scripts for automating log retrieval and dashboard updates. Step 1: Install Grafana via CLI Install Grafana on your server using the following instructions for Debian-based systems: Follow the installation guide here: Grafana Installation on Debian Once installed, start Grafana and make sure it's accessible via a port (default: 3000 ). After Grafana is running, create an admin account. Once logged in, you'll land on the Grafana homepage. Step 2: Install Loki Install Loki by following the official instructions for Docker: Loki Installation via Docker Step 3: Create a Docker Compose File for Loki To set up Loki with Grafana, create a docker-compose.yml file: version: \"3\" # The version can be removed if you're using a recent Docker Compose version. services: grafana: image: grafana/grafana:latest ports: - \"3000:3000\" networks: - loki volumes: - grafana-data:/path # [CHANGE THIS LINE] Adding persistence for Grafana data loki: image: grafana/loki:latest ports: - \"3100:3100\" networks: - loki volumes: - ./path # [CHANGE THIS LINE] Local directory for Loki data user: \"10001\" # Run Loki as the appropriate user to avoid permission issues promtail: image: grafana/promtail:latest command: \"-config.file=/etc/promtail/config.yaml\" # [CHANGE THIS LINE] networks: - loki volumes: - \"/var/log:/var/log\" # [CHANGE THIS LINE] Mounting host logs networks: loki: volumes: grafana-data: # Declaring the volume for Grafana Step 4: Install Promtail Install Promtail by following the official instructions: Promtail Installation Guide Step 5: Configure Data Sources (Logs) To aggregate logs from other servers, we set up a method of transferring logs to the Grafana server. The logs are pulled into the Grafana server, where they are processed and rendered on a Grafana dashboard. Here\u2019s the updated section of the README with the requested changes marked. The rest remains unchanged. Step 5: Configure Data Sources (Logs) 5.1: Write a Bash Script to Pull Logs Here\u2019s an example of a script ( transfer_logs.sh ) to pull logs from another server: #!/bin/bash # Define variables REMOTE_SERVER=\"root@server_ip\" # [CHANGE THIS LINE] Remote server IP SSH_KEY_PATH=\"path\" # [CHANGE THIS LINE] Path to SSH key DEST_DIR=\"path\" # [CHANGE THIS LINE] Destination directory on the Grafana server # Define paths for logs DOCKER_LOG=\"path/to/docker/log\" # [CHANGE THIS LINE] Path to Docker log on remote server NGINX_LOG=\"path/to/nginx/log\" # [CHANGE THIS LINE] Path to NGINX log on remote server SYSLOG=\"path/to/syslog\" # [CHANGE THIS LINE] Path to syslog on remote server # Create directories if they don't exist mkdir -p \"$DEST_DIR/docker\" \"$DEST_DIR/nginx\" \"$DEST_DIR/syslog\" # Transfer logs echo \"Transferring Docker log...\" ssh -i $SSH_KEY_PATH $REMOTE_SERVER \"cat $DOCKER_LOG\" > \"$DEST_DIR/docker/docker.log\" echo \"Transferring NGINX log...\" ssh -i $SSH_KEY_PATH $REMOTE_SERVER \"cat $NGINX_LOG\" > \"$DEST_DIR/nginx/error.log\" echo \"Transferring syslog...\" ssh -i $SSH_KEY_PATH $REMOTE_SERVER \"cat $SYSLOG\" > \"$DEST_DIR/syslog/syslog.log\" echo \"All logs have been successfully transferred.\" 5.2: Configure Promtail to Scrape Logs Next, create a promtail-config.yaml file to let Promtail know where the logs are located: server: http_listen_port: 9080 grpc_listen_port: 0 positions: filename: /tmp/positions.yaml clients: - url: http://server_ip:3100/loki/api/v1/push # [CHANGE THIS LINE] Loki's URL scrape_configs: - job_name: docker_logs static_configs: labels: job: docker __path__: /path/to/logs/on/grafana/server/docker/*.log # [CHANGE THIS LINE] Path to Docker logs - job_name: nginx_logs static_configs: labels: job: nginx __path__: /path/to/logs/on/grafana/server/nginx/*.log # [CHANGE THIS LINE] Path to NGINX logs - job_name: syslog_logs static_configs: labels: job: syslog __path__: /path/to/logs/on/grafana/server/syslog/*.log # [CHANGE THIS LINE] Path to syslog logs Step 6: Configure Grafana to Use Loki Open Grafana\u2019s homepage and click the three vertical lines in the top-left corner. Navigate to Data Sources , then click Add Data Source . Select Loki as the data source type. Define the URL of your Loki instance, which is typically http://localhost:3100 . Click Save & Test . You should see a success message confirming the connection. Step 7: Explore Data in Grafana Go to the Explore section in Grafana. Use label filters and run queries to see the logs coming from Promtail. The labels in the filters correspond to the labels defined in the promtail-config.yaml . Step 8: Create a Dashboard On the left sidebar in Grafana, click Dashboards > New Dashboard . Click Add Panel to create a new panel. Under Data Source , select Loki . Write queries to retrieve logs for display. Use different labels to filter log data as needed. Choose a visualization type (e.g., Logs ). Repeat the process to add more visualizations, then adjust the layout and size to suit your needs. Save the dashboard once you are satisfied with the layout. Step 9: Automate Log Retrieval and Update Dashboard To make the process of pulling logs and updating the Grafana dashboard more automated, create two Python scripts: 9.1: transfer_server.py This script triggers the Promtail process to start log scraping when accessed via an HTTP request: from http.server import BaseHTTPRequestHandler, HTTPServer import subprocess COMMAND = \"sudo ./promtail-linux-amd64 -config.file=promtail-config.yaml\" class RequestHandler(BaseHTTPRequestHandler): def do_GET(self): if self.path == \"/run\": try: subprocess.Popen(COMMAND, shell=True) self.send_response(200) self.end_headers() self.wfile.write(b\"Command executed successfully.\") except Exception as e: self.send_response(500) self.end_headers() self.wfile.write(f\"Error executing command: {e}\".encode()) else: self.send_response(404) self.end_headers() self.wfile.write(b\"Not found.\") if __name__ == \"__main__\": server_address = ('server_ip', 8081) httpd = HTTPServer(server_address, RequestHandler) print(\"Server running on http://server_ip. Access /run to execute the command.\") httpd.serve_forever() 9.2: server.py This script pulls the logs by executing the previously created bash script: from http.server import BaseHTTPRequestHandler, HTTPServer import subprocess class ScriptHandler(BaseHTTPRequestHandler): def do_GET(self): script_path = \"/path/to/transfer_logs.sh\" # [CHANGE THIS LINE] try: subprocess.run([script_path], check=True) self.send_response(200) self.send_header(\"Content-type\", \"text/html\") self.end_headers() self.wfile.write(b\"Logs Pulled Successfully.\") except subprocess.CalledProcessError: self.send_response(500) self.send_header(\"Content-type\", \"text/html\") self.end_headers() self.wfile.write(b\"Failed to pull logs.\") def run(server_class=HTTPServer, handler_class=ScriptHandler, port=8080): server_address = ('', port) httpd = server_class(server_address, handler_class) print(f\"Starting http server on port {port}\") httpd.serve_forever() if __name__ == \"__main__\": run() Run both Python scripts in the background using nohup : nohup python3 transfer_server.py > transfer_server.log 2>&1 & nohup python3 server.py > server.log 2>&1 & Step 10: Add Buttons to Grafana Dashboard In Grafana, go to Settings > Links . Add the links to the above Python scripts with the appropriate port ( 8080 for log pulling and 8081 for triggering Promtail). This will enable users to pull logs instantly as they wish. Make sure promtail activation button is run first when opening dashboard, and then pulling logs button after.","title":"Grafana Log Dashboard Guide"},{"location":"infrastructure/grafana-log-dashboard/#developed-by-rudra-prakash-singh-esther-jang","text":"This guide walks you through the process of setting up a Grafana Server Log Monitoring Dashboard, including the installation and configuration of Grafana, Loki, and Promtail for log aggregation and visualization. It also covers setting up scripts for automating log retrieval and dashboard updates.","title":"Developed By: Rudra Prakash Singh, Esther Jang"},{"location":"infrastructure/grafana-log-dashboard/#step-1-install-grafana-via-cli","text":"Install Grafana on your server using the following instructions for Debian-based systems: Follow the installation guide here: Grafana Installation on Debian Once installed, start Grafana and make sure it's accessible via a port (default: 3000 ). After Grafana is running, create an admin account. Once logged in, you'll land on the Grafana homepage.","title":"Step 1: Install Grafana via CLI"},{"location":"infrastructure/grafana-log-dashboard/#step-2-install-loki","text":"Install Loki by following the official instructions for Docker: Loki Installation via Docker","title":"Step 2: Install Loki"},{"location":"infrastructure/grafana-log-dashboard/#step-3-create-a-docker-compose-file-for-loki","text":"To set up Loki with Grafana, create a docker-compose.yml file: version: \"3\" # The version can be removed if you're using a recent Docker Compose version. services: grafana: image: grafana/grafana:latest ports: - \"3000:3000\" networks: - loki volumes: - grafana-data:/path # [CHANGE THIS LINE] Adding persistence for Grafana data loki: image: grafana/loki:latest ports: - \"3100:3100\" networks: - loki volumes: - ./path # [CHANGE THIS LINE] Local directory for Loki data user: \"10001\" # Run Loki as the appropriate user to avoid permission issues promtail: image: grafana/promtail:latest command: \"-config.file=/etc/promtail/config.yaml\" # [CHANGE THIS LINE] networks: - loki volumes: - \"/var/log:/var/log\" # [CHANGE THIS LINE] Mounting host logs networks: loki: volumes: grafana-data: # Declaring the volume for Grafana","title":"Step 3: Create a Docker Compose File for Loki"},{"location":"infrastructure/grafana-log-dashboard/#step-4-install-promtail","text":"Install Promtail by following the official instructions: Promtail Installation Guide","title":"Step 4: Install Promtail"},{"location":"infrastructure/grafana-log-dashboard/#step-5-configure-data-sources-logs","text":"To aggregate logs from other servers, we set up a method of transferring logs to the Grafana server. The logs are pulled into the Grafana server, where they are processed and rendered on a Grafana dashboard. Here\u2019s the updated section of the README with the requested changes marked. The rest remains unchanged.","title":"Step 5: Configure Data Sources (Logs)"},{"location":"infrastructure/grafana-log-dashboard/#step-5-configure-data-sources-logs_1","text":"","title":"Step 5: Configure Data Sources (Logs)"},{"location":"infrastructure/grafana-log-dashboard/#51-write-a-bash-script-to-pull-logs","text":"Here\u2019s an example of a script ( transfer_logs.sh ) to pull logs from another server: #!/bin/bash # Define variables REMOTE_SERVER=\"root@server_ip\" # [CHANGE THIS LINE] Remote server IP SSH_KEY_PATH=\"path\" # [CHANGE THIS LINE] Path to SSH key DEST_DIR=\"path\" # [CHANGE THIS LINE] Destination directory on the Grafana server # Define paths for logs DOCKER_LOG=\"path/to/docker/log\" # [CHANGE THIS LINE] Path to Docker log on remote server NGINX_LOG=\"path/to/nginx/log\" # [CHANGE THIS LINE] Path to NGINX log on remote server SYSLOG=\"path/to/syslog\" # [CHANGE THIS LINE] Path to syslog on remote server # Create directories if they don't exist mkdir -p \"$DEST_DIR/docker\" \"$DEST_DIR/nginx\" \"$DEST_DIR/syslog\" # Transfer logs echo \"Transferring Docker log...\" ssh -i $SSH_KEY_PATH $REMOTE_SERVER \"cat $DOCKER_LOG\" > \"$DEST_DIR/docker/docker.log\" echo \"Transferring NGINX log...\" ssh -i $SSH_KEY_PATH $REMOTE_SERVER \"cat $NGINX_LOG\" > \"$DEST_DIR/nginx/error.log\" echo \"Transferring syslog...\" ssh -i $SSH_KEY_PATH $REMOTE_SERVER \"cat $SYSLOG\" > \"$DEST_DIR/syslog/syslog.log\" echo \"All logs have been successfully transferred.\"","title":"5.1: Write a Bash Script to Pull Logs"},{"location":"infrastructure/grafana-log-dashboard/#52-configure-promtail-to-scrape-logs","text":"Next, create a promtail-config.yaml file to let Promtail know where the logs are located: server: http_listen_port: 9080 grpc_listen_port: 0 positions: filename: /tmp/positions.yaml clients: - url: http://server_ip:3100/loki/api/v1/push # [CHANGE THIS LINE] Loki's URL scrape_configs: - job_name: docker_logs static_configs: labels: job: docker __path__: /path/to/logs/on/grafana/server/docker/*.log # [CHANGE THIS LINE] Path to Docker logs - job_name: nginx_logs static_configs: labels: job: nginx __path__: /path/to/logs/on/grafana/server/nginx/*.log # [CHANGE THIS LINE] Path to NGINX logs - job_name: syslog_logs static_configs: labels: job: syslog __path__: /path/to/logs/on/grafana/server/syslog/*.log # [CHANGE THIS LINE] Path to syslog logs","title":"5.2: Configure Promtail to Scrape Logs"},{"location":"infrastructure/grafana-log-dashboard/#step-6-configure-grafana-to-use-loki","text":"Open Grafana\u2019s homepage and click the three vertical lines in the top-left corner. Navigate to Data Sources , then click Add Data Source . Select Loki as the data source type. Define the URL of your Loki instance, which is typically http://localhost:3100 . Click Save & Test . You should see a success message confirming the connection.","title":"Step 6: Configure Grafana to Use Loki"},{"location":"infrastructure/grafana-log-dashboard/#step-7-explore-data-in-grafana","text":"Go to the Explore section in Grafana. Use label filters and run queries to see the logs coming from Promtail. The labels in the filters correspond to the labels defined in the promtail-config.yaml .","title":"Step 7: Explore Data in Grafana"},{"location":"infrastructure/grafana-log-dashboard/#step-8-create-a-dashboard","text":"On the left sidebar in Grafana, click Dashboards > New Dashboard . Click Add Panel to create a new panel. Under Data Source , select Loki . Write queries to retrieve logs for display. Use different labels to filter log data as needed. Choose a visualization type (e.g., Logs ). Repeat the process to add more visualizations, then adjust the layout and size to suit your needs. Save the dashboard once you are satisfied with the layout.","title":"Step 8: Create a Dashboard"},{"location":"infrastructure/grafana-log-dashboard/#step-9-automate-log-retrieval-and-update-dashboard","text":"To make the process of pulling logs and updating the Grafana dashboard more automated, create two Python scripts:","title":"Step 9: Automate Log Retrieval and Update Dashboard"},{"location":"infrastructure/grafana-log-dashboard/#91-transfer_serverpy","text":"This script triggers the Promtail process to start log scraping when accessed via an HTTP request: from http.server import BaseHTTPRequestHandler, HTTPServer import subprocess COMMAND = \"sudo ./promtail-linux-amd64 -config.file=promtail-config.yaml\" class RequestHandler(BaseHTTPRequestHandler): def do_GET(self): if self.path == \"/run\": try: subprocess.Popen(COMMAND, shell=True) self.send_response(200) self.end_headers() self.wfile.write(b\"Command executed successfully.\") except Exception as e: self.send_response(500) self.end_headers() self.wfile.write(f\"Error executing command: {e}\".encode()) else: self.send_response(404) self.end_headers() self.wfile.write(b\"Not found.\") if __name__ == \"__main__\": server_address = ('server_ip', 8081) httpd = HTTPServer(server_address, RequestHandler) print(\"Server running on http://server_ip. Access /run to execute the command.\") httpd.serve_forever()","title":"9.1: transfer_server.py"},{"location":"infrastructure/grafana-log-dashboard/#92-serverpy","text":"This script pulls the logs by executing the previously created bash script: from http.server import BaseHTTPRequestHandler, HTTPServer import subprocess class ScriptHandler(BaseHTTPRequestHandler): def do_GET(self): script_path = \"/path/to/transfer_logs.sh\" # [CHANGE THIS LINE] try: subprocess.run([script_path], check=True) self.send_response(200) self.send_header(\"Content-type\", \"text/html\") self.end_headers() self.wfile.write(b\"Logs Pulled Successfully.\") except subprocess.CalledProcessError: self.send_response(500) self.send_header(\"Content-type\", \"text/html\") self.end_headers() self.wfile.write(b\"Failed to pull logs.\") def run(server_class=HTTPServer, handler_class=ScriptHandler, port=8080): server_address = ('', port) httpd = server_class(server_address, handler_class) print(f\"Starting http server on port {port}\") httpd.serve_forever() if __name__ == \"__main__\": run() Run both Python scripts in the background using nohup : nohup python3 transfer_server.py > transfer_server.log 2>&1 & nohup python3 server.py > server.log 2>&1 &","title":"9.2: server.py"},{"location":"infrastructure/grafana-log-dashboard/#step-10-add-buttons-to-grafana-dashboard","text":"In Grafana, go to Settings > Links . Add the links to the above Python scripts with the appropriate port ( 8080 for log pulling and 8081 for triggering Promtail). This will enable users to pull logs instantly as they wish. Make sure promtail activation button is run first when opening dashboard, and then pulling logs button after.","title":"Step 10: Add Buttons to Grafana Dashboard"},{"location":"learn/cable-crimping/","text":"Crimping Ethernet Cables In this article, you'll all about crimping ethernet cables! What is crimping an ethernet cable? Crimping an ethernet cable is the process of attaching connectors onto the ends of ethernet cables. This process is also called 'RJ45 crimping' because RJ45 is the name of the connectors that are used for ethernet cables, and they are what is being crimped. Why? Setting up networks involves setting up long ethernet cable connections between different devices. Instead of buying premade ethernet cables of varying lengths (e.g. 5ft, 10ft, 50ft, etc.), it's more practical to just have a big spool of cabling that we can roll out and cut to the exact length we need. Therefore we need to be able to attach RJ45 connectors to the ends of these cut cables so that we can actually plug them in! Crimping Kit Here are some tools you should have in your crimping kit! RJ45 Crimping Tool An RJ45 crimping tool is the most essential tool. Although it's technically possible to crimp ethernet cables without this specialized tool, it's not very practical for crimping lots of cables. Its primary utility is to do the actual 'crimping' part of compressing/crimping the tiny gold pins in the RJ45 connector onto the ethernet cables. It also has blades that can be used to cut or strip wires. Cable Stripper Cable strippers are used to take off the protecting shielding around cables and expose the inner wires. You can also do the same thing with a simple blade or pair of scissors. The trickiest part about stripping cables is trying to avoid cutting the inner wires! RJ45 Connectors RJ45 connectors are required for crimping because they feature the 8 golden pins that get crimped onto the 8 wires of the ethernet cable. They are what get plugged into ethernet ports! They also feature a latch/clip that locks the ethernet cable into the port once it is plugged in. RJ45 Boots RJ45 boots can be optionally used to protect the RJ45 connector. It provides insulation and prevents the cable from being breaking easily. They have to put slipped onto the cable before you put on the RJ45 connectors though! RJ45 Cable Tester RJ45 cable testers allow you to guarantee that you did the job correctly! They have two pieces that separate from each other, and you plug each end of your crimped ethernet cable into the port on each piece. Then you turn it on and the cable tester will test the connection for all 8 pins. If there are any missing lights on any of the pins, it means that you messed up somewhere and have to restart! How to Crimp an Ethernet Cable Assuming you have a crimping kit and an ethernet cable that needs to be crimped, here are all the steps! Step 0) Slip on the RJ45 boot (optional) Step 1) Strip the cable Push the cable into the razor slot of the strip tool and turn it around the cable to make an even cut around the sheath. Careful not to nick the wires inside! Unwrap the blue foil shielding and plastic to uncover the twisted wire pairs. Push the copper grounding wire to the side. (Ignore the white string.) Step 2) Organize the wires In this step, you'll be taking the 8 colored wires inside the ethernet cable and putting them into the correct ordering of colors. NOTE This is the hardest part of crimping! The wires are small and are hard to control. Take your time and make sure you do this step correctly! Otherwise you might have to go back and restart. Step 2.1) Untwist the wires There should be 4 pairs of wires: green, brown, orange, and blue. Each pair has a solid-colored wire and a striped-colored wire. Untwist these pairs and separate them into the 8 wires. Step 2.2) Straighten out wires After untwisting the wires, they are probably still kinked and look like they want to be twisted. In this step, you should carefully grab all the wires and try to straighten them out by pulling on them. This will prevent the wires from moving around later on. WARNING Don't break off the wires! Step 2.3) Lay out wires in order With your straightened out wires, put them into the correct order! Make sure that the wires are all flat and in line with each other. The ordering for these wires is: 1. Striped orange 2. Solid orange 3. Striped green 4. Solid blue 5. Striped blue 6. Solid green 7. Striped brown 8. Solid brown TIP After laying them out in order, straighten them out again as a group! This will help keep the wires together. Step 2.4) Trim the wires Trim the wires evenly to about 1/2 inch in length using scissors or the blade of your crimping tool. You want to make sure you have enough room for the wires to reach the end of the RJ45 connector. But also try to have room for the shielding of the cable to be inserted into the connector too. TIP You can put the wires side-by-side to the RJ45 connector to see how long you should cut it. Look at the next step to see what the final product looks like. TIP If you don't have the shielding inside of the connector, it makes it easier for the wires to snap off later, which is bad. TIP Make sure that you cut the wires evenly! Step 3) Slide wires into RJ45 connector Carefully slide your 8 wires into the connector. Make sure that the clip is facing away from you! If it is really hard to slide it into the connector, you probably didn't straighten out the wires enough in step 2.2 or 2.3. MORE INFO Inserting the wires with the clip facing away from you is the standard. However, you could technically do it in 'reverse' and insert the wires with the clip facing you, as long as you do it on both ends of the cable. You shouldn't do this in practice though because others would get confused when looking at your cable. Step 4) Crimp it Push the RJ45 connector into the slot of your crimping tool for RJ45 connectors. The slot should be labeled something like \"8P\" for the 8-pin RJ45 connector that you're using. In this step, you're doing the actual 'crimping' part and crimping/compressing/stabbing the 8 golden pins on the RJ45 connector into the 8 colored wires. TIP Squeeze as hard as you can! You need to make sure that all 8 pins are crimped. Step 5) Test it Slide the two pieces of the tester apart and plug each of the cable ends into either piece. Turn the switch to \u201cOn\u201d or \u201cSlow.\u201d If it's working, all 8 numbers should be flashing green. If any of them are not showing green, it means something is wrong and you have to redo it! The RJ45 connector can't be reused once it's crimped, so you should just cut the end off and start back at step 1. If everything is green, then you're done! If you had a cable boot, you can push the boots onto the RJ45 connector now. Resources Workshop Slides ISOC ICS Training Workshop Videos Crimping Tutorial (2 mins) Cable Testing Only need first 7 minutes for the basics Websites Color Coding Diagrams Crimping Comic From People's Open Network + sudomesh Shopping Crimping Kit ($23) Comes with a nice case Might need to buy your own batteries for cable tester Crimping Kit ($17) Might need to buy your own batteries for cable tester","title":"Crimping Ethernet Cables"},{"location":"learn/cable-crimping/#crimping-ethernet-cables","text":"In this article, you'll all about crimping ethernet cables!","title":"Crimping Ethernet Cables"},{"location":"learn/cable-crimping/#what-is-crimping-an-ethernet-cable","text":"Crimping an ethernet cable is the process of attaching connectors onto the ends of ethernet cables. This process is also called 'RJ45 crimping' because RJ45 is the name of the connectors that are used for ethernet cables, and they are what is being crimped.","title":"What is crimping an ethernet cable?"},{"location":"learn/cable-crimping/#why","text":"Setting up networks involves setting up long ethernet cable connections between different devices. Instead of buying premade ethernet cables of varying lengths (e.g. 5ft, 10ft, 50ft, etc.), it's more practical to just have a big spool of cabling that we can roll out and cut to the exact length we need. Therefore we need to be able to attach RJ45 connectors to the ends of these cut cables so that we can actually plug them in!","title":"Why?"},{"location":"learn/cable-crimping/#crimping-kit","text":"Here are some tools you should have in your crimping kit!","title":"Crimping Kit"},{"location":"learn/cable-crimping/#rj45-crimping-tool","text":"An RJ45 crimping tool is the most essential tool. Although it's technically possible to crimp ethernet cables without this specialized tool, it's not very practical for crimping lots of cables. Its primary utility is to do the actual 'crimping' part of compressing/crimping the tiny gold pins in the RJ45 connector onto the ethernet cables. It also has blades that can be used to cut or strip wires.","title":"RJ45 Crimping Tool"},{"location":"learn/cable-crimping/#cable-stripper","text":"Cable strippers are used to take off the protecting shielding around cables and expose the inner wires. You can also do the same thing with a simple blade or pair of scissors. The trickiest part about stripping cables is trying to avoid cutting the inner wires!","title":"Cable Stripper"},{"location":"learn/cable-crimping/#rj45-connectors","text":"RJ45 connectors are required for crimping because they feature the 8 golden pins that get crimped onto the 8 wires of the ethernet cable. They are what get plugged into ethernet ports! They also feature a latch/clip that locks the ethernet cable into the port once it is plugged in.","title":"RJ45 Connectors"},{"location":"learn/cable-crimping/#rj45-boots","text":"RJ45 boots can be optionally used to protect the RJ45 connector. It provides insulation and prevents the cable from being breaking easily. They have to put slipped onto the cable before you put on the RJ45 connectors though!","title":"RJ45 Boots"},{"location":"learn/cable-crimping/#rj45-cable-tester","text":"RJ45 cable testers allow you to guarantee that you did the job correctly! They have two pieces that separate from each other, and you plug each end of your crimped ethernet cable into the port on each piece. Then you turn it on and the cable tester will test the connection for all 8 pins. If there are any missing lights on any of the pins, it means that you messed up somewhere and have to restart!","title":"RJ45 Cable Tester"},{"location":"learn/cable-crimping/#how-to-crimp-an-ethernet-cable","text":"Assuming you have a crimping kit and an ethernet cable that needs to be crimped, here are all the steps!","title":"How to Crimp an Ethernet Cable"},{"location":"learn/cable-crimping/#step-0-slip-on-the-rj45-boot-optional","text":"","title":"Step 0) Slip on the RJ45 boot (optional)"},{"location":"learn/cable-crimping/#step-1-strip-the-cable","text":"Push the cable into the razor slot of the strip tool and turn it around the cable to make an even cut around the sheath. Careful not to nick the wires inside! Unwrap the blue foil shielding and plastic to uncover the twisted wire pairs. Push the copper grounding wire to the side. (Ignore the white string.)","title":"Step 1) Strip the cable"},{"location":"learn/cable-crimping/#step-2-organize-the-wires","text":"In this step, you'll be taking the 8 colored wires inside the ethernet cable and putting them into the correct ordering of colors. NOTE This is the hardest part of crimping! The wires are small and are hard to control. Take your time and make sure you do this step correctly! Otherwise you might have to go back and restart.","title":"Step 2) Organize the wires"},{"location":"learn/cable-crimping/#step-21-untwist-the-wires","text":"There should be 4 pairs of wires: green, brown, orange, and blue. Each pair has a solid-colored wire and a striped-colored wire. Untwist these pairs and separate them into the 8 wires.","title":"Step 2.1) Untwist the wires"},{"location":"learn/cable-crimping/#step-22-straighten-out-wires","text":"After untwisting the wires, they are probably still kinked and look like they want to be twisted. In this step, you should carefully grab all the wires and try to straighten them out by pulling on them. This will prevent the wires from moving around later on. WARNING Don't break off the wires!","title":"Step 2.2) Straighten out wires"},{"location":"learn/cable-crimping/#step-23-lay-out-wires-in-order","text":"With your straightened out wires, put them into the correct order! Make sure that the wires are all flat and in line with each other. The ordering for these wires is: 1. Striped orange 2. Solid orange 3. Striped green 4. Solid blue 5. Striped blue 6. Solid green 7. Striped brown 8. Solid brown TIP After laying them out in order, straighten them out again as a group! This will help keep the wires together.","title":"Step 2.3) Lay out wires in order"},{"location":"learn/cable-crimping/#step-24-trim-the-wires","text":"Trim the wires evenly to about 1/2 inch in length using scissors or the blade of your crimping tool. You want to make sure you have enough room for the wires to reach the end of the RJ45 connector. But also try to have room for the shielding of the cable to be inserted into the connector too. TIP You can put the wires side-by-side to the RJ45 connector to see how long you should cut it. Look at the next step to see what the final product looks like. TIP If you don't have the shielding inside of the connector, it makes it easier for the wires to snap off later, which is bad. TIP Make sure that you cut the wires evenly!","title":"Step 2.4) Trim the wires"},{"location":"learn/cable-crimping/#step-3-slide-wires-into-rj45-connector","text":"Carefully slide your 8 wires into the connector. Make sure that the clip is facing away from you! If it is really hard to slide it into the connector, you probably didn't straighten out the wires enough in step 2.2 or 2.3. MORE INFO Inserting the wires with the clip facing away from you is the standard. However, you could technically do it in 'reverse' and insert the wires with the clip facing you, as long as you do it on both ends of the cable. You shouldn't do this in practice though because others would get confused when looking at your cable.","title":"Step 3) Slide wires into RJ45 connector"},{"location":"learn/cable-crimping/#step-4-crimp-it","text":"Push the RJ45 connector into the slot of your crimping tool for RJ45 connectors. The slot should be labeled something like \"8P\" for the 8-pin RJ45 connector that you're using. In this step, you're doing the actual 'crimping' part and crimping/compressing/stabbing the 8 golden pins on the RJ45 connector into the 8 colored wires. TIP Squeeze as hard as you can! You need to make sure that all 8 pins are crimped.","title":"Step 4) Crimp it"},{"location":"learn/cable-crimping/#step-5-test-it","text":"Slide the two pieces of the tester apart and plug each of the cable ends into either piece. Turn the switch to \u201cOn\u201d or \u201cSlow.\u201d If it's working, all 8 numbers should be flashing green. If any of them are not showing green, it means something is wrong and you have to redo it! The RJ45 connector can't be reused once it's crimped, so you should just cut the end off and start back at step 1. If everything is green, then you're done! If you had a cable boot, you can push the boots onto the RJ45 connector now.","title":"Step 5) Test it"},{"location":"learn/cable-crimping/#resources","text":"","title":"Resources"},{"location":"learn/cable-crimping/#workshop-slides","text":"ISOC ICS Training Workshop","title":"Workshop Slides"},{"location":"learn/cable-crimping/#videos","text":"Crimping Tutorial (2 mins) Cable Testing Only need first 7 minutes for the basics","title":"Videos"},{"location":"learn/cable-crimping/#websites","text":"Color Coding Diagrams Crimping Comic From People's Open Network + sudomesh","title":"Websites"},{"location":"learn/cable-crimping/#shopping","text":"Crimping Kit ($23) Comes with a nice case Might need to buy your own batteries for cable tester Crimping Kit ($17) Might need to buy your own batteries for cable tester","title":"Shopping"},{"location":"learn/lte-networks/","text":"LTE Networks Our network uses a 4G LTE network architecture. Understanding everything is a huge challenge, but understanding it at a high-level is very achievable. Consider exploring all of these links as they all complement each other well! Helpful videos How Cell Service Actually Works Broad overview of cellular technologies, from the very basics up to advanced topics, in only 20 minutes AT&T Archives Video: AMPS Old video from 1978 about an older version of cell networks (AMPS) Very very high quality and gives good background on cellular networks Learn 4G LTE Network Architecture Quick high-level overview of 4G LTE architecture Only shows diagrams How does your mobile phone work? Very good visual for the entire system of how cell phones work today Has 3d animation so it's easier to understand conceptually Doesn't go over LTE architecture specifically Driving Factors of LTE Architecture Gain more understanding of the context around LTE architecture Helpful articles YaleBTS LTE Concepts Explains basically ALL the parts of the LTE architecture TutorialsPoint LTE Network Architecture Gives overview of LTE architecture Not very detailed, but it's a good introduction to the individual components of LTE Open5GS Introduction Documentation for Open5GS, the repo that our networks rely on This is the most applicable to our specific network because it's what we actually use.","title":"LTE Networks"},{"location":"learn/lte-networks/#lte-networks","text":"Our network uses a 4G LTE network architecture. Understanding everything is a huge challenge, but understanding it at a high-level is very achievable. Consider exploring all of these links as they all complement each other well!","title":"LTE Networks"},{"location":"learn/lte-networks/#helpful-videos","text":"How Cell Service Actually Works Broad overview of cellular technologies, from the very basics up to advanced topics, in only 20 minutes AT&T Archives Video: AMPS Old video from 1978 about an older version of cell networks (AMPS) Very very high quality and gives good background on cellular networks Learn 4G LTE Network Architecture Quick high-level overview of 4G LTE architecture Only shows diagrams How does your mobile phone work? Very good visual for the entire system of how cell phones work today Has 3d animation so it's easier to understand conceptually Doesn't go over LTE architecture specifically Driving Factors of LTE Architecture Gain more understanding of the context around LTE architecture","title":"Helpful videos"},{"location":"learn/lte-networks/#helpful-articles","text":"YaleBTS LTE Concepts Explains basically ALL the parts of the LTE architecture TutorialsPoint LTE Network Architecture Gives overview of LTE architecture Not very detailed, but it's a good introduction to the individual components of LTE Open5GS Introduction Documentation for Open5GS, the repo that our networks rely on This is the most applicable to our specific network because it's what we actually use.","title":"Helpful articles"},{"location":"learn/networking/","text":"Learn about Computer Networks This page is currently in development. For now, please view our lesson on computer networks from our Digital Stewards curriculum here . TODO","title":"Networking"},{"location":"learn/networking/#learn-about-computer-networks","text":"This page is currently in development. For now, please view our lesson on computer networks from our Digital Stewards curriculum here . TODO","title":"Learn about Computer Networks"},{"location":"learn/wireless-communication/","text":"Crash Course in Wireless Communication Authored by: Dominick Ta Last updated: June 18th, 2021 TODO: [ ] Expand on transmit/receiving in antennas section [ ] Finish communication section [ ] Finish protocols section This is a crash course in wireless communication: the magical way that we humans send information (e.g. music, messages, text, videos) to each other over long distances, without a wire. Wireless communication is primarily powered by radio waves, a physical thing that we as humans cannot see or touch. In this article you will gain a layman's understanding of how wireless communication works. Specifically, this article will cover the following broad topics: Radio waves and the physics behind it Antennas How data is communicated via radio waves Examples of wireless communication technologies This is not meant to be a comprehensive article, so there will be a lot of simplifications, analogies, and informal explanations. Please let me know at domta@cs.uw.edu if you see any inaccuracies, misconceptions, or misnomers. Radio waves Radio waves are just oscillations of energy that exist throughout our environment. They can be generated naturally by lightning, or artifically by equipment made by humans such as cell phones. The technical definition of radio waves are that they are a form of 'electromagnetic radiation'. Other types of electromagnetic radiation include visible light (what we get from the sun), infrared, and X-rays. How radio waves are created To understand why radio waves are considered a type of electromagnetic radiation, it is helpful to know how we generate radio waves. This section is not important to fully understand, but it is good to skim to have a basic idea of how this stuff works. We create radio waves by moving electrons back and forth within an electrically conductive object (an object made of material that allows electrons to move freely, such as metals). This works because electrons have special properties: All electrons have ' electric fields ' surrounding them that attracts and repels other charged particles. All moving electrons produce ' magnetic fields ' that are the basis for how magnets work. Therefore, when electrons move there are two fields (electric & magnetic) present that combine to create creates an ' electromagnetic field '. By moving an electron back and forth in an oscillating (repetitive) motion, these electromagnetic fields are constantly being disturbed/moved in a way that creates electromagnetic waves or equivalently, electromagnetic radiation . In this GIF below, we see the charge of an antenna changing, representing electrons moving back and forth within the antenna. This creates pulsating electromagnetic waves. Note: in this particular GIF, it is actually only showing the pulsating electric fields. In this GIF below, we are able to fully see an electromagnetic wave with a 3D representation. The red component of the wave represents the electric field, while the blue component represents the magnetic field. Notice how they are perpendicular to each other! This is also why the GIF above didn't show both fields: it was a 2D representation! In this section, we learned about radio waves. In essence, you can just think of radio waves as physical phenomenon that look like these sine waves: With the proper hardware and knowledge, we can create any type of wave we want! We can vary frequencies (how fast the waves go by), amplitudes (how tall/powerful the waves are), and phases (what position within the loop the wave is in). Frequency & Wavelength It turns out that a fundamental characteristic of any given radio wave is its frequency. Therefore, it's important to know what 'frequency' means, and how it relates to the concept of 'wavelength'. Frequency is a measurement of how often something happens. In the case of radio waves, it measures how many cycles of a radio wave occurs in a certain amonut of time. Frequency is measured in the units of hertz (Hz) , which represents cycles per second. If we had a radio wave that passed through 10 complete cycles in a minute, it would have a frequency of 0.16Hz (10 cycles per 60 seconds). Wavelength measures the physical length of a single cycle in a radio wave. If we could see radio waves and measure it, and we saw that there was a distance of 10-feet between two of the peaks in a radio wave, then that radio wave would have a wavelength of 10 feet. In the image above, we can see a natural relationship between frequency and wavelength: a faster frequency means that you will have shorter wavelengths! Or conversely, longer wavelengths means that there is a slower frequency! When one value goes up, the other value has to go down; this is called an inverse relationship . So if I told you that I had a radio wave with a very high frequency, you could figure out that my radio wave has very small wavelengths. And actually, if I told you exactly what frequency my radio waves travelled at, you'd be able to figure out the exact size of the wavelength! For example, if I told you I had a radio wave with a frequency of 10Hz, you would be able to figure out that my radio wave has a wavelength of approximately 30,000,000 meters. This is because radio waves are a physical thing, so they always travel through air at the same speed: the speed of light. This means we can consistently convert back and forth between frequency and wavelength with some basic algebra. The basic equation, where c is the speed of light (3.0 x 10^8 m/s), is: frequency (Hz) * wavelength (m) = c So given a radio wave with a frequency of 10Hz, to solve for wavelength, I just need to take the speed of light and divide by 10! 30,000,000 divided by 10 gives a value of a wavelength of 30,000,000 meters. To summarize this section, frequency and wavelength are important properties of radio waves. Although they describe different aspects of a radio wave, they are essentially synonymous because we can easily convert between the two. When people are talking about radio waves, you may hear them talk in terms of frequencies (e.g. megahertz, gigahertz) or you may hear them talk in terms of wavelengths (e.g. meters). In the next section, we'll see why exactly frequency is such an important characteristic of radio waves. How we distinguish between radio waves An important thing to remember about radio waves is that nowadays they surround us everywhere we go! Radio waves are powerful because they can go through obstacles like walls, and they can potentially propagate over huge distances at a relatively cheap cost. Radio waves are used to communicate information in technologies such as GPS, WiFi, Bluetooth, cell phones, music radio stations, and more. The problem with this is that these radio waves interfere with each other and combine together to become a jumbled mess! They are all co-existing within the same space, and they can't avoid each other. In real life we don't get to have nice, simple, isolated radio wave like in the previous sections, we get a mix of radio waves coming all at once! And somehow, we have to find and narrow down the signal we care about. Imagine you are at an airport and you're trying to talk to your friend, but it is super crowded and theres people talking and shouting all around you. It would be super hard to hear your friend and have a conversation! (In this situation the people represent devices that use radio waves, the sound waves represent radio waves, and the voices & words represent the data we want to transmit) But if your friend talks loud enough, even though your ear is full of noise from everyone else in the airport, you can still figure out what your friend is trying to tell you. This is because you're smart enough to recognize what your friend's voice sounds like and you can focus on that voice. We can do the same thing with radio waves of different frequencies! (Being able to focus on your friend's specific voice is analogous to being able to focus on only radio waves of a specific frequency) In the image below, we can see a red radio wave. This radio wave is actually the combination of 5 radio waves of different frequencies! In the blue, we see this same signal analyzed and split into the individual components, located at its respective frequencies. (Analogy: 5 people talking at the same time, what your ears hear is the red. Your brain recognizing that these are 5 different voices is the blue) The mathematical process of going from the red representation (the signal in the time domain) to the blue representation (the signal in the frequency domain) is called the \"Discrete Fourier Transform\". You may also hear about something called the \"Fast Fourier Transform\" which is the discrete fourier transform, but a very clever and fast way to calculate it. (Intuitively, the DFT/FFT is essentially comparing a bunch of sine waves of varying frequencies to the signal detected, and calculating how similar they are. This would be like your brain iterating through all possible human voices and checking to see how strongly your ears hear that particular voice) This means that even though there may be a jumbled mess of radio waves surrounding us at all times, if they are radio waves of different frequencies, we are able to distinguish between all these different frequencies using some old fashioned engineering. This non-trivial fact is what allows our world to have so many different types of devices communicating wirelessly all at the same time! They are all using radio waves, all in the same space, but at different frequencies! This is why radio waves are identified by their frequency (or wavelength). Summary In this section on radio waves, we learned about what they are, the basics of how they're produced, frequency & wavelength, and how we distinguish between different radio waves co-existing in the same space. These are the fundamental concepts behind the physics of radio waves that engineers take advantage of. In the next section on antennas, we will learn what they are and how they are used to efficiently propagate/send radio waves. In another section, we will learn more about how exactly we manipulate radio waves to convey the information we want to send. Antennas We use antennas in our everyday lives, but most people don't know how they work. We use antennas on cars, on buildings, and even within our computers and phones! How they work Material properties Antennas are all made up of electrically conductive material. This usually means antennas are made out of metals like copper. Materials that are electrically conductive allow electrons to freely move throughout it. The opposite type of material would be electrically insulating material. As a real-life analogy, imagine a typical swimming pool filled with water. A normal pool like this allows people to freely swim through it! In this analogy the water represents electrically conductive material and people represent electrons. Now imagine a piece of copper metal as being that pool of water. Because copper is electrically conductive, electrons can freely move through it! An analogy for an electrically insulating material would be a swimming pool filled with jello/pudding/gelatin. If someone tried diving into that pool, they wouldn't get very far and it'd be super hard or impossible to swim through it. In this analogy the jello/pudding/gelatin represents electrically insulating material and people represent electrons. Now imagine a piece of plastic being that pool of water. Because plastic is electrically insulating, eletrons are mostly stuck where they are inside the plastic! Taking advantage of moving electrons Antennas need to be electrically conductive because they transmit and receive radio waves by taking advantage of the movement of electrons. In the above section on \"How radio waves are created\" we learned that radio waves are generated by moving an electron back and forth in an oscillating (repetitive) motion. This oscillation of electrons occurs in the antennas. If antennas weren't electrically conductive, these electrons wouldn't be able to move and create these radio waves! How transmitting with an antenna works In order to transmit with an antenna, the antenna needs to be connected to an electrical component that can control the movement of these electrons. TODO: expand/clarify? How receiving with an antenna works Antennas receive radio signals passively. As the electromagnetic fields are manipulated in the environment around an antenna, the electrons in the antenna move accordingly (because of how the physics of it work). By monitoring the movement of these electrons, the respective radio wave can be captured. TODO: expand/clarify? Communicating with radio waves How do we as humans harness this power of manipulating radio waves as communication? We agree on a bunch of different rules and conventions on how we will manipulating these radio waves to convey information efficiently and responsibly. In the United States, most of these rules are established and enforced by the Federal Communications Commission (FCC). An analogy To lay a conceptual foundation for this relatively abstract section, here is an analogy. Suppose we have two friends with the simple names of \"A\" and \"B\" that want to talk to each other over a distance, but they cant see, hear, or touch each other over that distance. The only way method of communication they have is a really long piece of rope between them. So once they travel far away from each other, they will each be holding one end of the rope and will be trying to communicate. But before they travel far away from each other, they need to talk to each other to figure out a set of rules of communication so that they can understand each other when they feel the rope moving. When coming up with these rules for communication, one of the first things that A & B need to do is come up with a language. Because A & B really like computers, they chose the language of computers: binary. They chose this language because it is super simple and effective; it only has two letters (1 and 0) and you can send tons of information by being clever with 1s and 0s (thats what computers do). Now the next thing that A & B needs to do is figure out how to use the rope to send these 1s and 0s. Here are some ideas they brainstormed together: * If the rope is moving up and down (oscillating), then that is considered a 1. If the rope is not moving, then that is considered a 0. * If the rope is oscillating super fast then that's a 1, but if the rope is oscillating slowly then that's a 0. * If the rope is oscillating super fast then that's a 0, but if the rope is oscillating slowly then that's a 1. * If the rope is oscillating with a big height then that's a 1, but if the rope is oscillating with small height then that's a 0. A & B realized two properties of the movement of the rope that they could capture: (1) frequency, how fast the rope is oscillating, and (2) amplitude, how tall the rope is when its oscillating. The term for manipulating these properties is \"modulation\". This makes sense because a dictionary definition of modulation is \"to adjust\"; modulation is just a fancy word for changing. In this analogy, the material/medium of communication was the rope. But in our context, the material/medium of communication is radio waves. Both of these materials have frequency and amplitude that can be modulated to send information, and demodulated to receive that information. In the next section, we'll learn about frequency and amplitude modulation. We'll also learn about some other types of modulation that don't have a direct real-life connection to ropes. Modulation Frequency modulation Amplitude modulation Other modulation schemes Frequency allocation Baseband signal and carrier signals Bandwidth Bands and Channels Wireless Communication Protocols In the previous section on \"Communicating with Radio Waves\", we learned how we are able to transmit messages wirelessly over radio waves via modulation. We understood this through our analogy with friends A & B who came up with a way to send letters in their binary language (1 and 0) through a rope. Assuming they were able to do this successfully, they could send long streams of messages that look something like \"101011100101010101010\". But that's still not enough! They need to come up with a 'protocol' for deciphering what this message actually means! For example, they could come up with a simple protocol for sending messages about how their day went. * The first 3 letters would represent how their day went: \"101\" could mean that they had a good day, and \"010\" could mean that they had a bad day, and maybe \"110\" means that their day went okay. * The next 3 letters would represent the weather: \"100\" could mean that it was sunny and \"101\" could mean that it was rainy. We have these same types of protocols in real life that are much more complicated. They are carefully designed to ensure security (can people intercept messages?), reliability (what if the message gets messed up in certain places?), and efficiency (how much useful data can we send at a time?). WiFi Bluetooth Cellular communication","title":"Wireless Communication"},{"location":"learn/wireless-communication/#crash-course-in-wireless-communication","text":"Authored by: Dominick Ta Last updated: June 18th, 2021 TODO: [ ] Expand on transmit/receiving in antennas section [ ] Finish communication section [ ] Finish protocols section This is a crash course in wireless communication: the magical way that we humans send information (e.g. music, messages, text, videos) to each other over long distances, without a wire. Wireless communication is primarily powered by radio waves, a physical thing that we as humans cannot see or touch. In this article you will gain a layman's understanding of how wireless communication works. Specifically, this article will cover the following broad topics: Radio waves and the physics behind it Antennas How data is communicated via radio waves Examples of wireless communication technologies This is not meant to be a comprehensive article, so there will be a lot of simplifications, analogies, and informal explanations. Please let me know at domta@cs.uw.edu if you see any inaccuracies, misconceptions, or misnomers.","title":"Crash Course in Wireless Communication"},{"location":"learn/wireless-communication/#radio-waves","text":"Radio waves are just oscillations of energy that exist throughout our environment. They can be generated naturally by lightning, or artifically by equipment made by humans such as cell phones. The technical definition of radio waves are that they are a form of 'electromagnetic radiation'. Other types of electromagnetic radiation include visible light (what we get from the sun), infrared, and X-rays.","title":"Radio waves"},{"location":"learn/wireless-communication/#how-radio-waves-are-created","text":"To understand why radio waves are considered a type of electromagnetic radiation, it is helpful to know how we generate radio waves. This section is not important to fully understand, but it is good to skim to have a basic idea of how this stuff works. We create radio waves by moving electrons back and forth within an electrically conductive object (an object made of material that allows electrons to move freely, such as metals). This works because electrons have special properties: All electrons have ' electric fields ' surrounding them that attracts and repels other charged particles. All moving electrons produce ' magnetic fields ' that are the basis for how magnets work. Therefore, when electrons move there are two fields (electric & magnetic) present that combine to create creates an ' electromagnetic field '. By moving an electron back and forth in an oscillating (repetitive) motion, these electromagnetic fields are constantly being disturbed/moved in a way that creates electromagnetic waves or equivalently, electromagnetic radiation . In this GIF below, we see the charge of an antenna changing, representing electrons moving back and forth within the antenna. This creates pulsating electromagnetic waves. Note: in this particular GIF, it is actually only showing the pulsating electric fields. In this GIF below, we are able to fully see an electromagnetic wave with a 3D representation. The red component of the wave represents the electric field, while the blue component represents the magnetic field. Notice how they are perpendicular to each other! This is also why the GIF above didn't show both fields: it was a 2D representation! In this section, we learned about radio waves. In essence, you can just think of radio waves as physical phenomenon that look like these sine waves: With the proper hardware and knowledge, we can create any type of wave we want! We can vary frequencies (how fast the waves go by), amplitudes (how tall/powerful the waves are), and phases (what position within the loop the wave is in).","title":"How radio waves are created"},{"location":"learn/wireless-communication/#frequency-wavelength","text":"It turns out that a fundamental characteristic of any given radio wave is its frequency. Therefore, it's important to know what 'frequency' means, and how it relates to the concept of 'wavelength'. Frequency is a measurement of how often something happens. In the case of radio waves, it measures how many cycles of a radio wave occurs in a certain amonut of time. Frequency is measured in the units of hertz (Hz) , which represents cycles per second. If we had a radio wave that passed through 10 complete cycles in a minute, it would have a frequency of 0.16Hz (10 cycles per 60 seconds). Wavelength measures the physical length of a single cycle in a radio wave. If we could see radio waves and measure it, and we saw that there was a distance of 10-feet between two of the peaks in a radio wave, then that radio wave would have a wavelength of 10 feet. In the image above, we can see a natural relationship between frequency and wavelength: a faster frequency means that you will have shorter wavelengths! Or conversely, longer wavelengths means that there is a slower frequency! When one value goes up, the other value has to go down; this is called an inverse relationship . So if I told you that I had a radio wave with a very high frequency, you could figure out that my radio wave has very small wavelengths. And actually, if I told you exactly what frequency my radio waves travelled at, you'd be able to figure out the exact size of the wavelength! For example, if I told you I had a radio wave with a frequency of 10Hz, you would be able to figure out that my radio wave has a wavelength of approximately 30,000,000 meters. This is because radio waves are a physical thing, so they always travel through air at the same speed: the speed of light. This means we can consistently convert back and forth between frequency and wavelength with some basic algebra. The basic equation, where c is the speed of light (3.0 x 10^8 m/s), is: frequency (Hz) * wavelength (m) = c So given a radio wave with a frequency of 10Hz, to solve for wavelength, I just need to take the speed of light and divide by 10! 30,000,000 divided by 10 gives a value of a wavelength of 30,000,000 meters. To summarize this section, frequency and wavelength are important properties of radio waves. Although they describe different aspects of a radio wave, they are essentially synonymous because we can easily convert between the two. When people are talking about radio waves, you may hear them talk in terms of frequencies (e.g. megahertz, gigahertz) or you may hear them talk in terms of wavelengths (e.g. meters). In the next section, we'll see why exactly frequency is such an important characteristic of radio waves.","title":"Frequency & Wavelength"},{"location":"learn/wireless-communication/#how-we-distinguish-between-radio-waves","text":"An important thing to remember about radio waves is that nowadays they surround us everywhere we go! Radio waves are powerful because they can go through obstacles like walls, and they can potentially propagate over huge distances at a relatively cheap cost. Radio waves are used to communicate information in technologies such as GPS, WiFi, Bluetooth, cell phones, music radio stations, and more. The problem with this is that these radio waves interfere with each other and combine together to become a jumbled mess! They are all co-existing within the same space, and they can't avoid each other. In real life we don't get to have nice, simple, isolated radio wave like in the previous sections, we get a mix of radio waves coming all at once! And somehow, we have to find and narrow down the signal we care about. Imagine you are at an airport and you're trying to talk to your friend, but it is super crowded and theres people talking and shouting all around you. It would be super hard to hear your friend and have a conversation! (In this situation the people represent devices that use radio waves, the sound waves represent radio waves, and the voices & words represent the data we want to transmit) But if your friend talks loud enough, even though your ear is full of noise from everyone else in the airport, you can still figure out what your friend is trying to tell you. This is because you're smart enough to recognize what your friend's voice sounds like and you can focus on that voice. We can do the same thing with radio waves of different frequencies! (Being able to focus on your friend's specific voice is analogous to being able to focus on only radio waves of a specific frequency) In the image below, we can see a red radio wave. This radio wave is actually the combination of 5 radio waves of different frequencies! In the blue, we see this same signal analyzed and split into the individual components, located at its respective frequencies. (Analogy: 5 people talking at the same time, what your ears hear is the red. Your brain recognizing that these are 5 different voices is the blue) The mathematical process of going from the red representation (the signal in the time domain) to the blue representation (the signal in the frequency domain) is called the \"Discrete Fourier Transform\". You may also hear about something called the \"Fast Fourier Transform\" which is the discrete fourier transform, but a very clever and fast way to calculate it. (Intuitively, the DFT/FFT is essentially comparing a bunch of sine waves of varying frequencies to the signal detected, and calculating how similar they are. This would be like your brain iterating through all possible human voices and checking to see how strongly your ears hear that particular voice) This means that even though there may be a jumbled mess of radio waves surrounding us at all times, if they are radio waves of different frequencies, we are able to distinguish between all these different frequencies using some old fashioned engineering. This non-trivial fact is what allows our world to have so many different types of devices communicating wirelessly all at the same time! They are all using radio waves, all in the same space, but at different frequencies! This is why radio waves are identified by their frequency (or wavelength).","title":"How we distinguish between radio waves"},{"location":"learn/wireless-communication/#summary","text":"In this section on radio waves, we learned about what they are, the basics of how they're produced, frequency & wavelength, and how we distinguish between different radio waves co-existing in the same space. These are the fundamental concepts behind the physics of radio waves that engineers take advantage of. In the next section on antennas, we will learn what they are and how they are used to efficiently propagate/send radio waves. In another section, we will learn more about how exactly we manipulate radio waves to convey the information we want to send.","title":"Summary"},{"location":"learn/wireless-communication/#antennas","text":"We use antennas in our everyday lives, but most people don't know how they work. We use antennas on cars, on buildings, and even within our computers and phones!","title":"Antennas"},{"location":"learn/wireless-communication/#how-they-work","text":"","title":"How they work"},{"location":"learn/wireless-communication/#material-properties","text":"Antennas are all made up of electrically conductive material. This usually means antennas are made out of metals like copper. Materials that are electrically conductive allow electrons to freely move throughout it. The opposite type of material would be electrically insulating material. As a real-life analogy, imagine a typical swimming pool filled with water. A normal pool like this allows people to freely swim through it! In this analogy the water represents electrically conductive material and people represent electrons. Now imagine a piece of copper metal as being that pool of water. Because copper is electrically conductive, electrons can freely move through it! An analogy for an electrically insulating material would be a swimming pool filled with jello/pudding/gelatin. If someone tried diving into that pool, they wouldn't get very far and it'd be super hard or impossible to swim through it. In this analogy the jello/pudding/gelatin represents electrically insulating material and people represent electrons. Now imagine a piece of plastic being that pool of water. Because plastic is electrically insulating, eletrons are mostly stuck where they are inside the plastic!","title":"Material properties"},{"location":"learn/wireless-communication/#taking-advantage-of-moving-electrons","text":"Antennas need to be electrically conductive because they transmit and receive radio waves by taking advantage of the movement of electrons. In the above section on \"How radio waves are created\" we learned that radio waves are generated by moving an electron back and forth in an oscillating (repetitive) motion. This oscillation of electrons occurs in the antennas. If antennas weren't electrically conductive, these electrons wouldn't be able to move and create these radio waves!","title":"Taking advantage of moving electrons"},{"location":"learn/wireless-communication/#how-transmitting-with-an-antenna-works","text":"In order to transmit with an antenna, the antenna needs to be connected to an electrical component that can control the movement of these electrons. TODO: expand/clarify?","title":"How transmitting with an antenna works"},{"location":"learn/wireless-communication/#how-receiving-with-an-antenna-works","text":"Antennas receive radio signals passively. As the electromagnetic fields are manipulated in the environment around an antenna, the electrons in the antenna move accordingly (because of how the physics of it work). By monitoring the movement of these electrons, the respective radio wave can be captured. TODO: expand/clarify?","title":"How receiving with an antenna works"},{"location":"learn/wireless-communication/#communicating-with-radio-waves","text":"How do we as humans harness this power of manipulating radio waves as communication? We agree on a bunch of different rules and conventions on how we will manipulating these radio waves to convey information efficiently and responsibly. In the United States, most of these rules are established and enforced by the Federal Communications Commission (FCC).","title":"Communicating with radio waves"},{"location":"learn/wireless-communication/#an-analogy","text":"To lay a conceptual foundation for this relatively abstract section, here is an analogy. Suppose we have two friends with the simple names of \"A\" and \"B\" that want to talk to each other over a distance, but they cant see, hear, or touch each other over that distance. The only way method of communication they have is a really long piece of rope between them. So once they travel far away from each other, they will each be holding one end of the rope and will be trying to communicate. But before they travel far away from each other, they need to talk to each other to figure out a set of rules of communication so that they can understand each other when they feel the rope moving. When coming up with these rules for communication, one of the first things that A & B need to do is come up with a language. Because A & B really like computers, they chose the language of computers: binary. They chose this language because it is super simple and effective; it only has two letters (1 and 0) and you can send tons of information by being clever with 1s and 0s (thats what computers do). Now the next thing that A & B needs to do is figure out how to use the rope to send these 1s and 0s. Here are some ideas they brainstormed together: * If the rope is moving up and down (oscillating), then that is considered a 1. If the rope is not moving, then that is considered a 0. * If the rope is oscillating super fast then that's a 1, but if the rope is oscillating slowly then that's a 0. * If the rope is oscillating super fast then that's a 0, but if the rope is oscillating slowly then that's a 1. * If the rope is oscillating with a big height then that's a 1, but if the rope is oscillating with small height then that's a 0. A & B realized two properties of the movement of the rope that they could capture: (1) frequency, how fast the rope is oscillating, and (2) amplitude, how tall the rope is when its oscillating. The term for manipulating these properties is \"modulation\". This makes sense because a dictionary definition of modulation is \"to adjust\"; modulation is just a fancy word for changing. In this analogy, the material/medium of communication was the rope. But in our context, the material/medium of communication is radio waves. Both of these materials have frequency and amplitude that can be modulated to send information, and demodulated to receive that information. In the next section, we'll learn about frequency and amplitude modulation. We'll also learn about some other types of modulation that don't have a direct real-life connection to ropes.","title":"An analogy"},{"location":"learn/wireless-communication/#modulation","text":"","title":"Modulation"},{"location":"learn/wireless-communication/#frequency-modulation","text":"","title":"Frequency modulation"},{"location":"learn/wireless-communication/#amplitude-modulation","text":"","title":"Amplitude modulation"},{"location":"learn/wireless-communication/#other-modulation-schemes","text":"","title":"Other modulation schemes"},{"location":"learn/wireless-communication/#frequency-allocation","text":"","title":"Frequency allocation"},{"location":"learn/wireless-communication/#baseband-signal-and-carrier-signals","text":"","title":"Baseband signal and carrier signals"},{"location":"learn/wireless-communication/#bandwidth","text":"","title":"Bandwidth"},{"location":"learn/wireless-communication/#bands-and-channels","text":"","title":"Bands and Channels"},{"location":"learn/wireless-communication/#wireless-communication-protocols","text":"In the previous section on \"Communicating with Radio Waves\", we learned how we are able to transmit messages wirelessly over radio waves via modulation. We understood this through our analogy with friends A & B who came up with a way to send letters in their binary language (1 and 0) through a rope. Assuming they were able to do this successfully, they could send long streams of messages that look something like \"101011100101010101010\". But that's still not enough! They need to come up with a 'protocol' for deciphering what this message actually means! For example, they could come up with a simple protocol for sending messages about how their day went. * The first 3 letters would represent how their day went: \"101\" could mean that they had a good day, and \"010\" could mean that they had a bad day, and maybe \"110\" means that their day went okay. * The next 3 letters would represent the weather: \"100\" could mean that it was sunny and \"101\" could mean that it was rainy. We have these same types of protocols in real life that are much more complicated. They are carefully designed to ensure security (can people intercept messages?), reliability (what if the message gets messed up in certain places?), and efficiency (how much useful data can we send at a time?).","title":"Wireless Communication Protocols"},{"location":"learn/wireless-communication/#wifi","text":"","title":"WiFi"},{"location":"learn/wireless-communication/#bluetooth","text":"","title":"Bluetooth"},{"location":"learn/wireless-communication/#cellular-communication","text":"","title":"Cellular communication"},{"location":"tutorials/enb-setup/","text":"Step 2: eNodeB and SAS Setup Introduction Despite CBRS being a relatively open frequency band, the processes for spectrum access are still somewhat opaque and require significant capital investment and/or ISP-level resources to set up. To clarify this process, here\u2019s a step by step walkthrough tutorial of the setup of a Baicells eNodeB (eNB) base station running in the Citizen\u2019s Broadband Radio Service (CBRS) spectrum band (or band 48). Before following this tutorial, you should have completed the setup of a LTE Evolved Packet Core (EPC) to control your eNB, for which the setup of an open source version based on open5gs is outlined in this tutorial . I. Get set up with a Spectrum Access System (SAS) A. Why get set up with a SAS? Current FCC regulations require all CBRS equipment (called a CBSD) to be registered on a Spectrum Access System (SAS) that coordinates all spectrum assignments and ensures that no transmissions interfere with each other. This will likely require a commercial agreement with a SAS provider such as Google, Federated Wireless, etc. This tutorial uses the Google SAS. B. CPI License At least one member of your team will require \u201cCertified Professional Installer\u201d (CPI) training and license in order to hold legal responsibility for and sign off on device installations. Most SAS providers will offer training at about $500 for both an online training course and the certification exam. If you aren\u2019t able to get someone on your team certified, be sure to collaborate with a CPI! Feel free to contact us at the Local Connectivity Lab if you need support for your community project in this regard, and we can figure out what is feasible. The following are some links and helpful notes about this process: * https://wifidevan.wordpress.com/cbrs-certified-professional-installer-cpi-study-notes/ * https://alliancecorporation.ca/webinars/webinars-webinars/cbrs-for-beginners-part-2-by-commscope/ * https://cbrs.wirelessinnovation.org/acronyms C. SAS Pricing Agreements For Google, the price options provided us in summer 2020 were: Fixed Wireless SAS services are billed per link/household so you pay for each CPE (Customer Premises Equipment) CBSD registered with SAS. CBSDs that operate as base stations are free of charge. Price Per Customer Link $2.25/month. Mobility/Private LTE (price is based on CBSD categoris) Category A CBSD max transmit capability: 30 dBm/10 MHz = 20 dBm/MHz or \u201c1 Watt\u201d mounted under 6m Height Above Average Terrain measured 3-16 km away from site $2.67/month Category B CBSD max transmit capability: Maximum EIRP of 47 dBm/10 MHz = 37 dBm/MHz or \u201c50 Watt\" $13.33/month. D. SAS Registration CBSDs must register their transmit capabilities with the SAS using either the \u201cone-step\u201d or \u201cmulti-step\u201d process. The one-step process requires you to input all installation parameters and sign them with the CPI certificate all on the base station itself, or via a cloud domain proxy such as used by Baicells. Not all base stations support this and the interfaces for doing so might vary widely, so \u201cmulti-step\u201d is typically recommended. II. Register device in SAS portal This tutorial will be walking through steps following the specifics of the Google SAS portal interface, but the steps should be generalizable to other SAS portals. A. Once you have an account on an SAS service, register your devices on their portal or dashboard. The Google SAS portal can be found at: https://wirelessconnectivity.google.com/sas/ B. Our Setup Our test setup in the lab includes: 1W Baicells Nova 233 base station in the CBRS band mounted on the 6th floor balcony of our UW computer science building. Alpha Wireless 18 dBi-gain panel antenna with a beamwidth of 65 degrees (model AW3014-T4), mounted straight ahead and not tilted down. C. Example Configuration An example configuration for this setup is shown below. The configuration screen is a right-hand sidebar next to the map view, hence the unwieldy aspect ratio. Explanation of parameters: CBSD Category (A or B): Defined by rules in Section I.C above User ID Specified by the SAS provider when you register FCC ID and Serial Number: Both the radio and antenna model must be pre-authorized for use with CBRS by the FCC. The FCC ID is used to identify this approved device type. The serial number specifies the exact device identity. Both can usually be found on the outside of the device (circled in image below). Beamforming Gain, Beamwidth Based on antenna specs in II.B EIRP Effective Isotropic Radiated Power of your system including both the base station radio and antenna. For a Cat B CBSD, this must be 46 dBm/10 MHz=36 dBm/MHz or lower. Calculate this value by adding the max transmit power (actually power density per MHz) of the base station, in our case 28 dBm, to the antenna beamforming gain, in our case 18 dBi; 28+18=36 dBm/MHz. For the units requested by the Google interface, add 10 to this value to specify power per 10 MHz instead of per MHz. Height Specified in terms of height Above Ground Level (AGL) which you can measure using a rangefinder/ measuring tape/ building plan, or in height Above Mean Sea Level (AMSL). Not in terms of HAAT as in the Cat A/B definition. Must be accurate to within 3 m. Azimuth Refers to the compass heading/ direction that the antenna is pointing (set this to 0 for an omnidirectional antenna). This FCC tool is extremely helpful for calculating the azimuth based on the antenna\u2019s gps location and that of a structure you are pointing it at. You can get these GPS coordinates via Google Maps or Google Earth. Air Interface E_UTRA is the LTE radio standard used by our Baicells box. The only \u201csupported spec\u201d currently available for Baicells is FFS (according to a forum post, linked here). Location: In the Google interface, set the site location in GPS coordinates under the tab labeled with the map pin icon. (not shown) Parameters under \"CBSD Info\" Call Sign As far as I can tell, this can be any reasonable alphanumeric string as long as it is unique and matches the value of the \u201ccall sign\u201d parameter as sent over by the eNB or domain proxy. You will set this in the SAS interface as well as either the eNB or Baicells Cloud Core (they all need to match). Others These should match the settings with the same name on the eNB\u2019s local management portal, shown on the \u201cBasic Info\u201d page in section IV.A below. D. CPI Signature When the parameters are all filled out, click the big red \u201cReady for CPI\u201d button at the bottom of the panel (not shown here). On the CPI\u2019s version of the interface, it will provide a place to \u201csign\u201d the configuration with their CPI certificate, which they will upload to the interface. This must happen before the device can get a spectrum grant. E. Status Tab After the CPI signs the eNB configuration, under the \u201cStatus\u201d tab (visible in the config panel), you should see \u201cNot yet Registered\u201d (or a similar message) because the eNB has not checked in to the Google SAS yet with its matching parameters to complete the multi-step process. If something has otherwise gone wrong, you\u2019ll see an error message here. F. Other helpful links Google CBSD registration and deregistration Elevation finder tool with map III. Steps in Baicells Cloud interface A. Make a Baicells OMC account. Due to Baicells\u2019 use of a \u201cdomain proxy\u201d for their SAS requests, you will need to make a new user account in the Baicells Operators Management Console (OMC): https://cloudcore.baicells.com:4443/ This is distinct from their paid \u201cCloud Core\u201d service which we will not be using in this tutorial, although the management portal is the same. B. Take note of the CloudKey Once you have made an account, note the 6-letter \u201cCloudKey\u201d in the upper right corner of the screen (circled in red). This will need to be inputted into the local eNB management portal for the eNB to check into the Cloud OMC. On your version of this portal, if you\u2019re doing this for the first time, you shouldn\u2019t see any eNBs already present. C. Set your SAS service provider. Navigate to Advance\u2192SAS in the left hand menu, and then click the gear icon on the upper right corner, which has the hover text \u201cSettings.\u201d IV. Steps in Baicells management interface A. Local Management Portal The Baicells eNodeB (eNB) is best managed through the browser-based management portal; the current command line interface is accessible but extremely limited. The default IP address of the management portal (and that of most Baicells equipment I\u2019ve seen) is 192.168.150.1, and the default login credentials are admin/admin. I would recommend changing the admin login credentials to be more secure. Connect your computer to the eNB via Ethernet, and navigate to this IP address in your browser (using http://192.168.150.1, not https). Baicells Initial Login Screen: BTS Info\u2192\u201cBasic Info\u201d Page visible upon login: B. Upgrade firmware Upgrade the firmware to the latest firmware version that supports SAS functionality, or verify that it is already up to date. You can check the official firmware page under the correct eNB model. The Nova 233 CBRS small cell we\u2019re using is model mBS1105. The latest firmware version after which SAS is officially supported is BaiBS_RTS_3.6.6.IMG (as of Feb 2021), for which the direct download is available here . Do not skip this step, otherwise none of the following steps will work right. C. Get everything connected Once the firmware is upgraded, you will want to get the eNB connected to your local LTE core network (EPC) as well as to the Internet so it can contact the necessary SAS infrastructure. 1. Configure Internet Access (WAN) Navigate to the Network\u2192WAN/LAN/VLAN tab on the left hand menu. We will set the WAN interface IP address to 192.168.151.1, since the Baicells console requires (for whatever reason) a different subnet for the WAN as opposed to the LAN. Then we will connect the eNB to an Ethernet port on the EPC that has the IP address 192.168.151.2 (as set up in our previous tutorial), which will act as the eNB\u2019s Internet gateway. Don\u2019t forget to hit \u201cSave\u201d after each change you make in this interface. 2. Check Internet access At this point, if the EPC is configured correctly to pass eNB traffic to the Internet, the eNB should be able to ping an arbitrary IP address. To test this, navigate to the Network\u2192Diagnostics tab on the left hand menu and select \u201cPing\u201d under the \u201cMethod of Diagnostics\u201d dropdown menu. Set the \u201cTarget IP Domain\u201d to be a highly reachable IP address on the Internet such as 1.1.1.1, which is the CloudFlare DNS server. Press \u201cImplement.\u201d If the result is \u201cFail!\u201d as in the screenshot, there is likely something wrong with your eNB\u2019s Internet connection through the EPC; you should fix this issue before continuing. 3. Reboot as needed If a message appears that the eNB needs a reboot after the new settings are saved, navigate to the Reboot tab in the left hand menu and perform the reboot (Warm Reset is fine). 4. Attach to Baicells OMC To configure the eNB to talk to the OMC as discussed in the prior section, navigate to the BTS Setting\u2192Management Server tab in the management console and enter the CloudKey. Within a few minutes, the eNB should appear in your Baicells Cloud OMC console, and the \u201cBasic Info\u201d page should show that the OMC is \u201cConnected.\u201d 5. Disable IPsec For our purposes we will not be using IPsec between our EPC and eNB; the default IPSec configured is used for the Baicells Cloud EPC which we are not using. Navigate to the Network\u2192\u201cMME&IPSec Binding\u201d menu tab and set \u201cIPSec Status\u201d to \u201cDisable.\u201d You may also delete the IPSec tunnels as shown below. 6. Disable GPS Sync when testing indoors. Navigate to the \u201cBTS Setting\u201d\u2192\u201cSync Setting\u201d menu and disable both \u201cForced Sync\u201d and \u201cGPS Sync Switch,\u201d in case you need to work with the base station in a location where you don\u2019t have a strong GPS signal. Some base stations will not start up normally or attach to the EPC unless they get a GPS signal, and we should avoid this behavior. 7. Change the MME settings Change the MME settings. Since we are using our local EPC, we will need to change the MME settings to reflect our MME\u2019s IP address, on which it is listening for eNBs to attach, as well as other configurations. Navigate to the BTS Info\u2192Quick Setting tab on the left hand menu. Disable RF You should set the \u201cRF Status\u201d setting to \u201cDisable\u201d before you change the MME IP, because attaching to the MME will normally cause the eNB\u2019s radio to turn on. Since we have not enabled the eNB to ask for spectrum coordinated by the SAS yet, turning on the radio may cause unwanted interference on someone else\u2019s network. PLMN setting Remove the existing \u201cPLMN ID\u201d (by clicking the trash can symbol) and set it to the value that you have configured in your EPC. In our networks, we use \u201c91054\u201d as our PLMN, so add this as a \u201cPrimary\u201d and \u201cNotReserved\u201d PLMN by entering the number in the text box and clicking the \u201c+\u201d button. MME IP address Remove the existing MME IP associated with the old PLMN. Add the new MME IP address, in our case 192.168.150.2, by entering it in the text box and clicking \u201c+\u201d. This MME IP should be associated with the newly added PLMN by default. Save the changes and reboot the eNB (Warm Reset); after the reboot has finished (within a few minutes), the eNB should attach to the MME. If you navigate to BTS Info\u2192Basic Info, you should see the MME Status change from \u201cNot Connected\u201d to \u201cConnected.\u201d If you are looking at the MME logs on the EPC, you will also see the record that an eNB has attached. 8. Enable SAS SAS should only be enabled after successfully attaching the eNB to the MME. Unfortunately, when SAS is enabled, the eNB will not attach to the MME unless it has a currently valid authorization to transmit on a certain frequency. However, until it is attached to an MME, the Baicells Cloud OMC will not provide it this authorization. So we need to have SAS disabled first with the RF also disabled, attach the eNB to the MME, and then enable SAS. Choose \u201cMulti-step\u201d under \u201cSAS Registration Type,\u201d as specified in Section I.E. Also choose \u201cB\u201d under \u201ccategory,\u201d and write in the other parameters to match the ones with the same name in the Google SAS configuration. After you click \u201cSave,\u201d SAS should be enabled immediately. You should see the SAS enabled status change in the Baicells Cloud OMC. If all goes smoothly, your device should get an authorization to transmit within a few minutes and the radio should turn on! 9. Check Baicells CLOUD OMC to debug issues You can check the status of the SAS authorization process in the Cloud OMC. Here you can find logs (upper right corner of SAS screen, shown in the screenshot below) with any error messages that may have occurred in the process. Errors can be caused by invalid or non-matching parameter values, lack of CPI signature, lack of spectrum availability, etc. In more difficult cases, after device registration the SAS may not respond to spectrum inquiries without sending any clear error messages. I have encountered this scenario when requesting spectrum around midnight, which may have been caused by brief database unavailability during the daily \u201cSAS Sync\u201d or IAP. My recommendation is to avoid requesting a new spectrum grant after 11 pm PST. If you change anything about the equipment used on site or the location/orientation of the equipment, you need to change the SAS registration, have it re-signed by the CPI, and use the Baicells OMC to re-request a new spectrum authorization- this process is described in the following section. V. How to change location, antenna properties, etc. after deployment As an example, this section will show how you would change the equipment\u2019s location upon moving from test site to deployment site. Get the new GPS location either manually using Google Maps/Earth, or automatically using Baicells OMC\u2019s GPS reading for the eNB if available. Google SAS steps In the upper right hand corner of the Google SAS configuration for the deployed equipment (long narrow right side panel for a particular site), press the unlock button (shaped like a padlock) to make the configuration editable. To edit the site location, click on the map pin icon in the upper left corner of this same right hand configuration panel to enter the location panel. Enter the new GPS coordinates in the box. After your changes, lock the site configuration again. (If the red \u201cReady for CPI\u201d button appears again at the bottom of the main configuration panel, go ahead and click it to prompt the CPI to sign.) You may have to wait a few minutes or hours for the changes to sync to the CPI\u2019s SAS database view. If after a while the CPI still cannot see the location change, ask them to enter the new GPS coordinates in their own interface and re-sign the configuration. Baicells Cloud OMC steps On the Baicells OMC, navigate to the Advance\u2192SAS screen where you can see the list of CBRS devices and their SAS status. Click on the 3 dots ( \u2807) symbol before the serial number for a particular device and click on \u201cProcedure\u201d to enter the SAS procedure screen. On the Procedure screen, you can see the most recent SAS logs, relinquish and re-request active spectrum authorizations, or de-register and re-register devices. First click on the \u201cAuthorized\u201d icon and click on the \u201cRelinquishment req\u201d button to relinquish the current spectrum authorization. Then the latter two icons will become greyed out, but the device will remain registered. We will need to fully de-register and re-register the device with the new parameters. Click the \u201cRegistered\u201d icon and then the \u201cDe-register\u201d button when it appears to de-register the device. Once the device is in the \u201cUnregistered\u201d state, click the \u201cUnregistered\u201d icon and then click the \u201cRegister req\u201d button when it appears. If all goes well, the device should re-register, and also request and receive a new grant (completing the full procedure) within a few moments.","title":"Step 2. eNodeB and SAS Setup"},{"location":"tutorials/enb-setup/#step-2-enodeb-and-sas-setup","text":"","title":"Step 2: eNodeB and SAS Setup"},{"location":"tutorials/enb-setup/#introduction","text":"Despite CBRS being a relatively open frequency band, the processes for spectrum access are still somewhat opaque and require significant capital investment and/or ISP-level resources to set up. To clarify this process, here\u2019s a step by step walkthrough tutorial of the setup of a Baicells eNodeB (eNB) base station running in the Citizen\u2019s Broadband Radio Service (CBRS) spectrum band (or band 48). Before following this tutorial, you should have completed the setup of a LTE Evolved Packet Core (EPC) to control your eNB, for which the setup of an open source version based on open5gs is outlined in this tutorial .","title":"Introduction"},{"location":"tutorials/enb-setup/#i-get-set-up-with-a-spectrum-access-system-sas","text":"","title":"I. Get set up with a Spectrum Access System (SAS)"},{"location":"tutorials/enb-setup/#a-why-get-set-up-with-a-sas","text":"Current FCC regulations require all CBRS equipment (called a CBSD) to be registered on a Spectrum Access System (SAS) that coordinates all spectrum assignments and ensures that no transmissions interfere with each other. This will likely require a commercial agreement with a SAS provider such as Google, Federated Wireless, etc. This tutorial uses the Google SAS.","title":"A. Why get set up with a SAS?"},{"location":"tutorials/enb-setup/#b-cpi-license","text":"At least one member of your team will require \u201cCertified Professional Installer\u201d (CPI) training and license in order to hold legal responsibility for and sign off on device installations. Most SAS providers will offer training at about $500 for both an online training course and the certification exam. If you aren\u2019t able to get someone on your team certified, be sure to collaborate with a CPI! Feel free to contact us at the Local Connectivity Lab if you need support for your community project in this regard, and we can figure out what is feasible. The following are some links and helpful notes about this process: * https://wifidevan.wordpress.com/cbrs-certified-professional-installer-cpi-study-notes/ * https://alliancecorporation.ca/webinars/webinars-webinars/cbrs-for-beginners-part-2-by-commscope/ * https://cbrs.wirelessinnovation.org/acronyms","title":"B. CPI License"},{"location":"tutorials/enb-setup/#c-sas-pricing-agreements","text":"For Google, the price options provided us in summer 2020 were: Fixed Wireless SAS services are billed per link/household so you pay for each CPE (Customer Premises Equipment) CBSD registered with SAS. CBSDs that operate as base stations are free of charge. Price Per Customer Link $2.25/month. Mobility/Private LTE (price is based on CBSD categoris) Category A CBSD max transmit capability: 30 dBm/10 MHz = 20 dBm/MHz or \u201c1 Watt\u201d mounted under 6m Height Above Average Terrain measured 3-16 km away from site $2.67/month Category B CBSD max transmit capability: Maximum EIRP of 47 dBm/10 MHz = 37 dBm/MHz or \u201c50 Watt\" $13.33/month.","title":"C. SAS Pricing Agreements"},{"location":"tutorials/enb-setup/#d-sas-registration","text":"CBSDs must register their transmit capabilities with the SAS using either the \u201cone-step\u201d or \u201cmulti-step\u201d process. The one-step process requires you to input all installation parameters and sign them with the CPI certificate all on the base station itself, or via a cloud domain proxy such as used by Baicells. Not all base stations support this and the interfaces for doing so might vary widely, so \u201cmulti-step\u201d is typically recommended.","title":"D. SAS Registration"},{"location":"tutorials/enb-setup/#ii-register-device-in-sas-portal","text":"This tutorial will be walking through steps following the specifics of the Google SAS portal interface, but the steps should be generalizable to other SAS portals.","title":"II. Register device in SAS portal"},{"location":"tutorials/enb-setup/#a-once-you-have-an-account-on-an-sas-service-register-your-devices-on-their-portal-or-dashboard","text":"The Google SAS portal can be found at: https://wirelessconnectivity.google.com/sas/","title":"A. Once you have an account on an SAS service, register your devices on their portal or dashboard."},{"location":"tutorials/enb-setup/#b-our-setup","text":"Our test setup in the lab includes: 1W Baicells Nova 233 base station in the CBRS band mounted on the 6th floor balcony of our UW computer science building. Alpha Wireless 18 dBi-gain panel antenna with a beamwidth of 65 degrees (model AW3014-T4), mounted straight ahead and not tilted down.","title":"B. Our Setup"},{"location":"tutorials/enb-setup/#c-example-configuration","text":"An example configuration for this setup is shown below. The configuration screen is a right-hand sidebar next to the map view, hence the unwieldy aspect ratio. Explanation of parameters: CBSD Category (A or B): Defined by rules in Section I.C above User ID Specified by the SAS provider when you register FCC ID and Serial Number: Both the radio and antenna model must be pre-authorized for use with CBRS by the FCC. The FCC ID is used to identify this approved device type. The serial number specifies the exact device identity. Both can usually be found on the outside of the device (circled in image below). Beamforming Gain, Beamwidth Based on antenna specs in II.B EIRP Effective Isotropic Radiated Power of your system including both the base station radio and antenna. For a Cat B CBSD, this must be 46 dBm/10 MHz=36 dBm/MHz or lower. Calculate this value by adding the max transmit power (actually power density per MHz) of the base station, in our case 28 dBm, to the antenna beamforming gain, in our case 18 dBi; 28+18=36 dBm/MHz. For the units requested by the Google interface, add 10 to this value to specify power per 10 MHz instead of per MHz. Height Specified in terms of height Above Ground Level (AGL) which you can measure using a rangefinder/ measuring tape/ building plan, or in height Above Mean Sea Level (AMSL). Not in terms of HAAT as in the Cat A/B definition. Must be accurate to within 3 m. Azimuth Refers to the compass heading/ direction that the antenna is pointing (set this to 0 for an omnidirectional antenna). This FCC tool is extremely helpful for calculating the azimuth based on the antenna\u2019s gps location and that of a structure you are pointing it at. You can get these GPS coordinates via Google Maps or Google Earth. Air Interface E_UTRA is the LTE radio standard used by our Baicells box. The only \u201csupported spec\u201d currently available for Baicells is FFS (according to a forum post, linked here). Location: In the Google interface, set the site location in GPS coordinates under the tab labeled with the map pin icon. (not shown) Parameters under \"CBSD Info\" Call Sign As far as I can tell, this can be any reasonable alphanumeric string as long as it is unique and matches the value of the \u201ccall sign\u201d parameter as sent over by the eNB or domain proxy. You will set this in the SAS interface as well as either the eNB or Baicells Cloud Core (they all need to match). Others These should match the settings with the same name on the eNB\u2019s local management portal, shown on the \u201cBasic Info\u201d page in section IV.A below.","title":"C. Example Configuration"},{"location":"tutorials/enb-setup/#d-cpi-signature","text":"When the parameters are all filled out, click the big red \u201cReady for CPI\u201d button at the bottom of the panel (not shown here). On the CPI\u2019s version of the interface, it will provide a place to \u201csign\u201d the configuration with their CPI certificate, which they will upload to the interface. This must happen before the device can get a spectrum grant.","title":"D. CPI Signature"},{"location":"tutorials/enb-setup/#e-status-tab","text":"After the CPI signs the eNB configuration, under the \u201cStatus\u201d tab (visible in the config panel), you should see \u201cNot yet Registered\u201d (or a similar message) because the eNB has not checked in to the Google SAS yet with its matching parameters to complete the multi-step process. If something has otherwise gone wrong, you\u2019ll see an error message here.","title":"E. Status Tab"},{"location":"tutorials/enb-setup/#f-other-helpful-links","text":"Google CBSD registration and deregistration Elevation finder tool with map","title":"F. Other helpful links"},{"location":"tutorials/enb-setup/#iii-steps-in-baicells-cloud-interface","text":"","title":"III. Steps in Baicells Cloud interface"},{"location":"tutorials/enb-setup/#a-make-a-baicells-omc-account","text":"Due to Baicells\u2019 use of a \u201cdomain proxy\u201d for their SAS requests, you will need to make a new user account in the Baicells Operators Management Console (OMC): https://cloudcore.baicells.com:4443/ This is distinct from their paid \u201cCloud Core\u201d service which we will not be using in this tutorial, although the management portal is the same.","title":"A. Make a Baicells OMC account."},{"location":"tutorials/enb-setup/#b-take-note-of-the-cloudkey","text":"Once you have made an account, note the 6-letter \u201cCloudKey\u201d in the upper right corner of the screen (circled in red). This will need to be inputted into the local eNB management portal for the eNB to check into the Cloud OMC. On your version of this portal, if you\u2019re doing this for the first time, you shouldn\u2019t see any eNBs already present.","title":"B. Take note of the CloudKey"},{"location":"tutorials/enb-setup/#c-set-your-sas-service-provider","text":"Navigate to Advance\u2192SAS in the left hand menu, and then click the gear icon on the upper right corner, which has the hover text \u201cSettings.\u201d","title":"C. Set your SAS service provider."},{"location":"tutorials/enb-setup/#iv-steps-in-baicells-management-interface","text":"","title":"IV. Steps in Baicells management interface"},{"location":"tutorials/enb-setup/#a-local-management-portal","text":"The Baicells eNodeB (eNB) is best managed through the browser-based management portal; the current command line interface is accessible but extremely limited. The default IP address of the management portal (and that of most Baicells equipment I\u2019ve seen) is 192.168.150.1, and the default login credentials are admin/admin. I would recommend changing the admin login credentials to be more secure. Connect your computer to the eNB via Ethernet, and navigate to this IP address in your browser (using http://192.168.150.1, not https). Baicells Initial Login Screen: BTS Info\u2192\u201cBasic Info\u201d Page visible upon login:","title":"A. Local Management Portal"},{"location":"tutorials/enb-setup/#b-upgrade-firmware","text":"Upgrade the firmware to the latest firmware version that supports SAS functionality, or verify that it is already up to date. You can check the official firmware page under the correct eNB model. The Nova 233 CBRS small cell we\u2019re using is model mBS1105. The latest firmware version after which SAS is officially supported is BaiBS_RTS_3.6.6.IMG (as of Feb 2021), for which the direct download is available here . Do not skip this step, otherwise none of the following steps will work right.","title":"B. Upgrade firmware"},{"location":"tutorials/enb-setup/#c-get-everything-connected","text":"Once the firmware is upgraded, you will want to get the eNB connected to your local LTE core network (EPC) as well as to the Internet so it can contact the necessary SAS infrastructure.","title":"C. Get everything connected"},{"location":"tutorials/enb-setup/#1-configure-internet-access-wan","text":"Navigate to the Network\u2192WAN/LAN/VLAN tab on the left hand menu. We will set the WAN interface IP address to 192.168.151.1, since the Baicells console requires (for whatever reason) a different subnet for the WAN as opposed to the LAN. Then we will connect the eNB to an Ethernet port on the EPC that has the IP address 192.168.151.2 (as set up in our previous tutorial), which will act as the eNB\u2019s Internet gateway. Don\u2019t forget to hit \u201cSave\u201d after each change you make in this interface.","title":"1. Configure Internet Access (WAN)"},{"location":"tutorials/enb-setup/#2-check-internet-access","text":"At this point, if the EPC is configured correctly to pass eNB traffic to the Internet, the eNB should be able to ping an arbitrary IP address. To test this, navigate to the Network\u2192Diagnostics tab on the left hand menu and select \u201cPing\u201d under the \u201cMethod of Diagnostics\u201d dropdown menu. Set the \u201cTarget IP Domain\u201d to be a highly reachable IP address on the Internet such as 1.1.1.1, which is the CloudFlare DNS server. Press \u201cImplement.\u201d If the result is \u201cFail!\u201d as in the screenshot, there is likely something wrong with your eNB\u2019s Internet connection through the EPC; you should fix this issue before continuing.","title":"2. Check Internet access"},{"location":"tutorials/enb-setup/#3-reboot-as-needed","text":"If a message appears that the eNB needs a reboot after the new settings are saved, navigate to the Reboot tab in the left hand menu and perform the reboot (Warm Reset is fine).","title":"3. Reboot as needed"},{"location":"tutorials/enb-setup/#4-attach-to-baicells-omc","text":"To configure the eNB to talk to the OMC as discussed in the prior section, navigate to the BTS Setting\u2192Management Server tab in the management console and enter the CloudKey. Within a few minutes, the eNB should appear in your Baicells Cloud OMC console, and the \u201cBasic Info\u201d page should show that the OMC is \u201cConnected.\u201d","title":"4. Attach to Baicells OMC"},{"location":"tutorials/enb-setup/#5-disable-ipsec","text":"For our purposes we will not be using IPsec between our EPC and eNB; the default IPSec configured is used for the Baicells Cloud EPC which we are not using. Navigate to the Network\u2192\u201cMME&IPSec Binding\u201d menu tab and set \u201cIPSec Status\u201d to \u201cDisable.\u201d You may also delete the IPSec tunnels as shown below.","title":"5. Disable IPsec"},{"location":"tutorials/enb-setup/#6-disable-gps-sync-when-testing-indoors","text":"Navigate to the \u201cBTS Setting\u201d\u2192\u201cSync Setting\u201d menu and disable both \u201cForced Sync\u201d and \u201cGPS Sync Switch,\u201d in case you need to work with the base station in a location where you don\u2019t have a strong GPS signal. Some base stations will not start up normally or attach to the EPC unless they get a GPS signal, and we should avoid this behavior.","title":"6. Disable GPS Sync when testing indoors."},{"location":"tutorials/enb-setup/#7-change-the-mme-settings","text":"Change the MME settings. Since we are using our local EPC, we will need to change the MME settings to reflect our MME\u2019s IP address, on which it is listening for eNBs to attach, as well as other configurations. Navigate to the BTS Info\u2192Quick Setting tab on the left hand menu. Disable RF You should set the \u201cRF Status\u201d setting to \u201cDisable\u201d before you change the MME IP, because attaching to the MME will normally cause the eNB\u2019s radio to turn on. Since we have not enabled the eNB to ask for spectrum coordinated by the SAS yet, turning on the radio may cause unwanted interference on someone else\u2019s network. PLMN setting Remove the existing \u201cPLMN ID\u201d (by clicking the trash can symbol) and set it to the value that you have configured in your EPC. In our networks, we use \u201c91054\u201d as our PLMN, so add this as a \u201cPrimary\u201d and \u201cNotReserved\u201d PLMN by entering the number in the text box and clicking the \u201c+\u201d button. MME IP address Remove the existing MME IP associated with the old PLMN. Add the new MME IP address, in our case 192.168.150.2, by entering it in the text box and clicking \u201c+\u201d. This MME IP should be associated with the newly added PLMN by default. Save the changes and reboot the eNB (Warm Reset); after the reboot has finished (within a few minutes), the eNB should attach to the MME. If you navigate to BTS Info\u2192Basic Info, you should see the MME Status change from \u201cNot Connected\u201d to \u201cConnected.\u201d If you are looking at the MME logs on the EPC, you will also see the record that an eNB has attached.","title":"7. Change the MME settings"},{"location":"tutorials/enb-setup/#8-enable-sas","text":"SAS should only be enabled after successfully attaching the eNB to the MME. Unfortunately, when SAS is enabled, the eNB will not attach to the MME unless it has a currently valid authorization to transmit on a certain frequency. However, until it is attached to an MME, the Baicells Cloud OMC will not provide it this authorization. So we need to have SAS disabled first with the RF also disabled, attach the eNB to the MME, and then enable SAS. Choose \u201cMulti-step\u201d under \u201cSAS Registration Type,\u201d as specified in Section I.E. Also choose \u201cB\u201d under \u201ccategory,\u201d and write in the other parameters to match the ones with the same name in the Google SAS configuration. After you click \u201cSave,\u201d SAS should be enabled immediately. You should see the SAS enabled status change in the Baicells Cloud OMC. If all goes smoothly, your device should get an authorization to transmit within a few minutes and the radio should turn on!","title":"8. Enable SAS"},{"location":"tutorials/enb-setup/#9-check-baicells-cloud-omc-to-debug-issues","text":"You can check the status of the SAS authorization process in the Cloud OMC. Here you can find logs (upper right corner of SAS screen, shown in the screenshot below) with any error messages that may have occurred in the process. Errors can be caused by invalid or non-matching parameter values, lack of CPI signature, lack of spectrum availability, etc. In more difficult cases, after device registration the SAS may not respond to spectrum inquiries without sending any clear error messages. I have encountered this scenario when requesting spectrum around midnight, which may have been caused by brief database unavailability during the daily \u201cSAS Sync\u201d or IAP. My recommendation is to avoid requesting a new spectrum grant after 11 pm PST. If you change anything about the equipment used on site or the location/orientation of the equipment, you need to change the SAS registration, have it re-signed by the CPI, and use the Baicells OMC to re-request a new spectrum authorization- this process is described in the following section.","title":"9. Check Baicells CLOUD OMC to debug issues"},{"location":"tutorials/enb-setup/#v-how-to-change-location-antenna-properties-etc-after-deployment","text":"As an example, this section will show how you would change the equipment\u2019s location upon moving from test site to deployment site. Get the new GPS location either manually using Google Maps/Earth, or automatically using Baicells OMC\u2019s GPS reading for the eNB if available. Google SAS steps In the upper right hand corner of the Google SAS configuration for the deployed equipment (long narrow right side panel for a particular site), press the unlock button (shaped like a padlock) to make the configuration editable. To edit the site location, click on the map pin icon in the upper left corner of this same right hand configuration panel to enter the location panel. Enter the new GPS coordinates in the box. After your changes, lock the site configuration again. (If the red \u201cReady for CPI\u201d button appears again at the bottom of the main configuration panel, go ahead and click it to prompt the CPI to sign.) You may have to wait a few minutes or hours for the changes to sync to the CPI\u2019s SAS database view. If after a while the CPI still cannot see the location change, ask them to enter the new GPS coordinates in their own interface and re-sign the configuration. Baicells Cloud OMC steps On the Baicells OMC, navigate to the Advance\u2192SAS screen where you can see the list of CBRS devices and their SAS status. Click on the 3 dots ( \u2807) symbol before the serial number for a particular device and click on \u201cProcedure\u201d to enter the SAS procedure screen. On the Procedure screen, you can see the most recent SAS logs, relinquish and re-request active spectrum authorizations, or de-register and re-register devices. First click on the \u201cAuthorized\u201d icon and click on the \u201cRelinquishment req\u201d button to relinquish the current spectrum authorization. Then the latter two icons will become greyed out, but the device will remain registered. We will need to fully de-register and re-register the device with the new parameters. Click the \u201cRegistered\u201d icon and then the \u201cDe-register\u201d button when it appears to de-register the device. Once the device is in the \u201cUnregistered\u201d state, click the \u201cUnregistered\u201d icon and then click the \u201cRegister req\u201d button when it appears. If all goes well, the device should re-register, and also request and receive a new grant (completing the full procedure) within a few moments.","title":"V. How to change location, antenna properties, etc. after deployment"},{"location":"tutorials/epc-setup/","text":"Introduction and Overview LTE Architecture The LTE Evolved Packet Core (EPC) provides core software functions such as subscriber management and routing user traffic to the Internet. It connects to the radio \"base station\", called the eNodeB (eNB), which then talks to the User Equipment (UE)- i.e., your cell phone or access device. The most important component to know about in the LTE core is the \"MME,\" which manages the process of the eNB and any end-user devices attaching themselves to the network (you can think of this as \"signing on\") so they can start sending data. In the case of users, the MME has to ask the HSS software component (essentially a user database) for credentials (shared secret keys unique to each user) to verify that a given SIM card is allowed to join the network. The MME is the software component whose output logs you should check on first for error messages if something is going wrong with the network. SCN currently runs the LTE-specific components of the Open5GS 4G/5G Non-Standalone (NSA) core. You can find more detailed documentation and diagrams of the Open5GS software architecture at the Open5GS Quickstart page. Their software supports both 4G and 5G, and you only need to run a subset of the software components for 4G. Operating System Support In SCN we will typically perform these installation steps using a fresh install of Ubuntu 22.04 on an x86-64-based computer; however, any operating system that open5gs supports should work. Note: When you're installing Ubuntu, we suggest choosing the \"minimal install\" option that doesn\u2019t install extra unnecessary software. In prior installs this has led to version conflicts. Software Components As of November 2024, in the Open5GS software package , the LTE-specific components (which run on Ubuntu as systemd services) are as follows: MME - Mobility Management Entity: open5gs-mmed.service HSS - Home Subscriber Server: open5gs-hssd.service PCRF - Policy and Charging Rules Function: open5gs-pcrfd.service SGWC - Serving Gateway Control Plane: open5gs-sgwcd.service SGWU - Serving Gateway User Plane: open5gs-sgwud.service PGWC/SMF - Packet Gateway Control Plane / (component contained in Open5GS SMF): open5gs-smfd.service PGWU/UPF - Packet Gateway User Plane / (component contained in Open5GS UPF): open5gs-upfd.service We would also recommend running the optional WebUI (Web User Interface) service: open5gs-webui.service . The following steps will walk you through this installation process. Step 1: Install Open5GS (Notes and Pointers) Install Open5GS following the Open5GS Quickstart documentation based on your operating system and desired implementation (e.g. \"bare metal\" directly on the operating system vs. Docker ). There are even VoLTE and Dockerized VoLTE implementations of Open5GS. A similar step-by-step tutorial to this one can be found here . In SCN we have run Open5GS successfully using Ubuntu 20.04 and 22.04, on bare metal or in Virtual Machines, installed via the apt package manager (see Step \"2. Install Open5GS with a Package Manager\" of the Quickstart ). First install MongoDB as described in the Quickstart. Then follow instructions under the \"Ubuntu\" section to install Open5GS via apt. Note: If installing over a ssh connection, we recommend using tmux or another program in case you get disconnected from the session in the process. Configure MME and SGWU Note that for our LTE setup, the MME and SGWU are the only components whose config files you will really need to change from the defaults. MME Edit the /etc/open5gs/mme.yaml file (as root or using sudo ) as follows: - Under mme: -> s1ap: -> server: -> address: , set the IP address you will assign to the network interface (likely an ethernet port) on your EPC computer which will be connecting to the eNB. In this tutorial (to match with the Network Configuration section that follows), we will use 192.168.150.1 . - Under both mme: -> gummei: and mme: -> tai: , you will need to change the plmn_id ( mcc and mnc values) to match the PLMN you are using for your network. - Note that for the purposes of eNB config later, the Tracking Area Code (or TAC) listed under tai: -> tac: will need to match the TAC number configured on the eNB (using the default of 1 is fine). Quick explanation: \"PLMN\" refers to the Public Land Mobile Network , in which every network has to have a unique carrier ID defined by the 3-digit \"mobile country code (MCC)\" and a 2 or 3-digit \"mobile network code (MNC)\". Alternately, for iPhone compatibility in the US, SCN uses the CBRS \"private LTE\" PLMN assigned by Apple as described in this doc . Optional: Edit network_name: (full and short) and mme_name: as desired. One of these names will show up on smartphones' lock screens as the \"carrier\" when the phone is attached to the network. SGWU Edit the /etc/open5gs/sgwu.yaml file (as root or using sudo ) as follows: - Under sgwu: -> gtpu: -> server: -> address: , set the IP address you will assign to the network interface on your EPC computer which will be connecting to the eNB (this should be the same as the IP address of the MME set above, if the MME and SGWU are running on the same machine). In this tutorial we will use 192.168.150.1 . As mentioned in the Quickstart, after changing the config files, you will need to restart the corresponding Open5GS daemons: sudo systemctl restart open5gs-mmed sudo systemctl restart open5gs-sgwud However, the MME will likely not start correctly until networking is configured, as described below. Step 2: Configure Networking Remember to follow all the network configuration steps in the Open5GS Quickstart documentation . For SCN's Ubuntu machines, this means: Allowing IP forwarding on your machine, e.g. via the following command: sudo sysctl -w net.ipv4.ip_forward=1 Using Netplan to configure network interfaces with IP addresses in the desired way. Setting up NAT rules using iptables so that traffic from the eNB can reach the Internet and vice versa The latter two steps are explained in detail below. Netplan Configuration A. Recommended For this recommended configuration, we require an EPC machine with 2 or more ethernet ports ( in our case , the ethernet interfaces corresponding to these ports are named enp1s0 and enp4s0). The ethernet port named \"enp1s0\" is used as the WAN port, which accesses upstream networks and eventually the Internet. It is physically connected via an ethernet cable to a router that can give it Internet access (e.g. our ISP's router). The one named \"enp4s0\" will connect to our private LTE network, and is physically connected via an ethernet cable to the eNB radio. (Our mini-PC model has 4 ethernet ports.) To enter the appropriate values in your case , you will need to figure out the names of your computer's ethernet interfaces. Use the command ip a on the command line. A list of network interfaces will appear in the terminal. Find the ones corresponding to your ethernet ports (their names usually start with \u201ceth,\u201d \u201cenp,\u201d or \u201cenx\u201d). For Ubuntu 22.04, we're currently using the Netplan program to manage our network configuration. Create a file in the /etc/netplan directory (i.e. a folder) named 99-open5gs-config.yaml , and add the following lines, substituting the correct interface names and subnets for your configuration: network: ethernets: enp1s0: # name of interface used for upstream network dhcp4: yes enp4s0: # name of interface going to the eNB dhcp4: no addresses: - 192.168.150.2/24 # list all downstream networks - 192.168.151.2/24 version: 2 Note: Netplan will apply configuration files in this directory in the numerical order of the filename prefix (ie., 00-*, 01-*, etc.). Any interfaces configured in an earlier file will be overwritten by higher-numbered configuration files, so we create a file with the prefix 99-* in order to supersede all other configuration files. Quick explanation: In order to get Internet connectivity to the EPC, we configure the \"upstream\" or \"WAN\" ethernet interface (enp1s0) to request an IP address via DHCP from an upstream router it's connected to (as your computer usually does when you plug it into a typical home router), which passes its traffic to and from the global Internet. That's why we have the line dhcp4: yes under our interface name enp1s0 . We don't need this interface to have any other IP addresses. The \"downstream\" ethernet interface (enp4s0) connected to the eNB is assigned two IP addresses and subnets, which are configured statically ( not by DHCP, hence the dhcp4: no ). In our case, we need this interface to talk to the Baicells Nova 233 eNB we use. Our eNB has the default local (LAN) IP address of 192.168.150.1 . We also need to set its WAN address (for whatever reason this is required to be different) to 192.168.151.1 , as in this eNB setup tutorial . That's why we have the addresses: section that sets the static IP addresses of the EPC to 192.168.150.2/24 and 192.168.151.2/24 . Since these IP addresses are in the same subnet as the eNB IP addresses, they will be able to talk to each other automatically without a router in between helping to route communications packets between the two addresses. Below we also provide an alternate configuration in case you do not yet have a machine with 2 ethernet ports or a USB to ethernet adapter dongle. However, only the first configuration is recommended for deployments for security reasons. The alternative should be used for testing only . B. NOT Recommended for deployment If you don\u2019t yet have a machine with 2 ethernet ports or a USB to ethernet adapter dongle, you can temporarily use a machine with a single ethernet port along with a simple switch or router. If using a simple switch, you can follow the same instructions but connect all three of the EPC, eNB, and upstream Internet router to the switch. If using a router, you may instead need to configure the router to assign 2 private static IPs to each of the EPC (i.e. 192.168.150.2 , 192.168.151.2 ) and eNB (i.e. 192.168.150.1 , 192.168.151.1 ), such that it will correctly NAT upstream traffic and also route local traffic between the EPC and eNB. # Network config EPC with single ethernet card # A switch is used to connect all devices network: ethernets: enp1s0: # name of ethernet interface dhcp4: true addresses: - 192.168.150.2/24 # list all downstream networks - 192.168.151.2/24 version: 2 Once this file (or your router configuration) has been modified, restart the network daemon to apply the configuration changes: sudo netplan try and if the Netplan syntax check succeeds, hit the Enter or Return key to accept the configuration change. If the eNB will be plugged into its own dedicated EPC ethernet port, as in the recommended configuration above, you may need to connect that EPC ethernet port to something (e.g. the eNB, a switch, another machine) via an ethernet cable to wake the interface up (so that it becomes active and takes on the assigned IP addresses). This is because the open5gs MME needs to \"bind\" (or associate) its S1 interface to one of those IP addresses (in this case 192.168.0.2 ). Until those IP addresses exist on your machine, the MME will continually throw errors if you try to run it. Setting iptables NAT rules to connect the eNB to the Internet As explained above, the eNB currently has the IP addresses 192.168.150.1 and 192.168.151.1 -- private IP addresses that cannot be used on the public Internet. Therefore, to successfully route the eNB's network traffic to the Internet, we have to add a routing rule in the EPC computer that performs NAT, allowing packets from the eNB's subnet to exit the WAN port of the EPC masquerading as coming from the EPC's IP address to the upstream network. There might be an easier way to do this, but we've found the cleanest and most reliable way so far to be using the iptables command line tool. In the Terminal on the EPC, run the following command to add a NAT rule for the eNB's subnet: sudo iptables -t nat -A POSTROUTING -s 192.168.151.0/24 -j MASQUERADE Quick explanation: The -t nat option tells IPTables to install the rule in the correct \"table\" containing all the NAT rules, and the -A option means we're A dding the rule as opposed to D eleting it ( -D ). POSTROUTING is the \"chain,\" or particular list of rules, that this type of NAT rule should go in (more on that here and in this diagram if you're interested). -s 192.168.151.0/24 means that we're applying this rule to packets from the S ource IP addresses described by the subnet 192.168.151.0/24 . -j MASQUERADE means the action we'll be J umping to as a result of this rule is \"masquerading\" the source IP address as my EPC's WAN IP address. 'Persist' IPTables Configuration We use IPTables rules to make sure packets are routed correctly within the EPC. IPTables rules must be made persistent across reboots with the iptables-persistent package: sudo apt install iptables-persistent Installation of this package will save the current iptables rules to its configuration file, /etc/iptables/rules.v4 . Note: iptables-persistent reads the contents of this file at boot and applies all iptables rules it contains. If you need to update the rules, or re-apply manually, you may use the following commands. This should not be necessary under normal circumstances: sudo iptables-save > /etc/iptables/rules.v4 sudo iptables-restore < /etc/iptables/rules.v4 Step 3: Start and monitor Open5GS software services Ubuntu\u2019s built-in logging and monitoring services can be used to monitor the core network services. For example, for seeing the output logs of the MME software component we described in the first section, run the following command in the Terminal: sudo journalctl -f -u open5gs-mmed.service OR sudo systemctl status open5gs-mmed.service Tab complete may be able to fill in the service name for systemctl at least. Learning to read output logs is really important for managing software infrastructure! Simply Googling output messages that seem important but that you don't understand can be a good first step to figuring out how a system is working. Another interesting tool to investigate is Wireshark , which is essentially a graphical user interface (GUI) version of the tcpdump command line tool that can show you the communications packets flowing through the various network cards on your computer. Here are some more useful commands for managing systemd services, which can be used to start, stop, and reload the software components after you've changed their configuration or they've run into errors and need to be restarted: sudo systemctl start open5gs-mmed.service sudo systemctl stop open5gs-mmed.service sudo systemctl restart open5gs-mmed.service sudo systemctl status open5gs-* The following command will start only the systemd services required for LTE. However, you do not need to stop or disable the other components of the 5G core for it to run 4G LTE network hardware correctly- the full Open5GS 5G core is backwards compatible with LTE hardware if you configure the LTE components correctly. sudo systemctl start open5gs-hssd.service open5gs-mmed.service open5gs-sgwud.service open5gs-sgwcd.service open5gs-pcrfd.service open5gs-upfd.service open5gs-smfd.service Install and Start the WebUI The WebUI is another systemd service and runs by default on your local computer at port 9999. It requires some more dependencies to install, such as nodejs (see Step \"3. Install the WebUI of Open5GS\" in the Quickstart ). You can reach it by navigating to http://localhost:9999 in your web browser. If not already started, start it with the following command: sudo systemctl start open5gs-webui.service The default WebUI login credentials are as follows: - Username : admin - Password : 1423 Step 4: Add Users to Open5GS database (Note that an important pre-condition to adding users is to have SIM cards or eSIMs to give to the users for authentication, along with their respective IMSIs and secret keys to register them onto the EPC. These must be procured separately. WIP- We will endeavor to make guides for these processes available soon.) You can manage users using the Open5GS WebUI, or using a script provided in the Open5GS GitHub repository . Our preferred strategy is to use the script, which supports automation better and does not require the WebUI to be running. Clone the repository into the EPC machine: git clone https://github.com/open5gs/open5gs.git The script can be found in misc/db/open5gs-dbctl from the top level of the repository ( open5gs folder). For example, you could run a command to add a user like this from within the open5gs/misc/db folder: sudo ./open5gs-dbctl add 460660003400030 192.168.20.30 0x00112233445566778899AABBCCDDEEFF 0x000102030405060708090A0B0C0D0E0F Running the ./open5gs-dbctl command on its own will output a list of allowed command syntax, of which the following can be particularly handy: - add {imsi key opc}: adds a user to the database with default values - add {imsi ip key opc}: adds a user to the database with default values and a IPv4 address for the UE - remove {imsi}: removes a user from the database - static_ip {imsi ip4}: adds a static IP assignment to an already-existing user - add_ue_with_apn {imsi key opc apn}: adds a user to the database with a specific apn The help text also tells you that \"default values are as follows: APN \"internet\", dl_bw/ul_bw 1 Gbps, PGW address is 127.0.0.3, IPv4 only\". Step 5: Maintenance and Management Updating Open5GS WIP: We are working on an Ansible-based management script for updates and will post updates as they occur. Backup and Restore WIP: We are working on our backup and restore strategies and will update this with a repo soon. Deprecated: CoLTE/EPC (LTE Core Network) Setup Our core networks formerly used the CoLTE project maintained by the UW ICTD Lab . For information on how to install and configure CoLTE, visit the tutorial we wrote with them, on which this document is based. Comments and Feedback Please get in touch with us at support@seattlecommunitynetwork.org if you have questions or feedback about this tutorial! We want your feedback so we can make this better.","title":"Step 1. LTE Core Network Setup"},{"location":"tutorials/epc-setup/#introduction-and-overview","text":"","title":"Introduction and Overview"},{"location":"tutorials/epc-setup/#lte-architecture","text":"The LTE Evolved Packet Core (EPC) provides core software functions such as subscriber management and routing user traffic to the Internet. It connects to the radio \"base station\", called the eNodeB (eNB), which then talks to the User Equipment (UE)- i.e., your cell phone or access device. The most important component to know about in the LTE core is the \"MME,\" which manages the process of the eNB and any end-user devices attaching themselves to the network (you can think of this as \"signing on\") so they can start sending data. In the case of users, the MME has to ask the HSS software component (essentially a user database) for credentials (shared secret keys unique to each user) to verify that a given SIM card is allowed to join the network. The MME is the software component whose output logs you should check on first for error messages if something is going wrong with the network. SCN currently runs the LTE-specific components of the Open5GS 4G/5G Non-Standalone (NSA) core. You can find more detailed documentation and diagrams of the Open5GS software architecture at the Open5GS Quickstart page. Their software supports both 4G and 5G, and you only need to run a subset of the software components for 4G.","title":"LTE Architecture"},{"location":"tutorials/epc-setup/#operating-system-support","text":"In SCN we will typically perform these installation steps using a fresh install of Ubuntu 22.04 on an x86-64-based computer; however, any operating system that open5gs supports should work. Note: When you're installing Ubuntu, we suggest choosing the \"minimal install\" option that doesn\u2019t install extra unnecessary software. In prior installs this has led to version conflicts.","title":"Operating System Support"},{"location":"tutorials/epc-setup/#software-components","text":"As of November 2024, in the Open5GS software package , the LTE-specific components (which run on Ubuntu as systemd services) are as follows: MME - Mobility Management Entity: open5gs-mmed.service HSS - Home Subscriber Server: open5gs-hssd.service PCRF - Policy and Charging Rules Function: open5gs-pcrfd.service SGWC - Serving Gateway Control Plane: open5gs-sgwcd.service SGWU - Serving Gateway User Plane: open5gs-sgwud.service PGWC/SMF - Packet Gateway Control Plane / (component contained in Open5GS SMF): open5gs-smfd.service PGWU/UPF - Packet Gateway User Plane / (component contained in Open5GS UPF): open5gs-upfd.service We would also recommend running the optional WebUI (Web User Interface) service: open5gs-webui.service . The following steps will walk you through this installation process.","title":"Software Components"},{"location":"tutorials/epc-setup/#step-1-install-open5gs-notes-and-pointers","text":"Install Open5GS following the Open5GS Quickstart documentation based on your operating system and desired implementation (e.g. \"bare metal\" directly on the operating system vs. Docker ). There are even VoLTE and Dockerized VoLTE implementations of Open5GS. A similar step-by-step tutorial to this one can be found here . In SCN we have run Open5GS successfully using Ubuntu 20.04 and 22.04, on bare metal or in Virtual Machines, installed via the apt package manager (see Step \"2. Install Open5GS with a Package Manager\" of the Quickstart ). First install MongoDB as described in the Quickstart. Then follow instructions under the \"Ubuntu\" section to install Open5GS via apt. Note: If installing over a ssh connection, we recommend using tmux or another program in case you get disconnected from the session in the process.","title":"Step 1: Install Open5GS (Notes and Pointers)"},{"location":"tutorials/epc-setup/#configure-mme-and-sgwu","text":"Note that for our LTE setup, the MME and SGWU are the only components whose config files you will really need to change from the defaults.","title":"Configure MME and SGWU"},{"location":"tutorials/epc-setup/#mme","text":"Edit the /etc/open5gs/mme.yaml file (as root or using sudo ) as follows: - Under mme: -> s1ap: -> server: -> address: , set the IP address you will assign to the network interface (likely an ethernet port) on your EPC computer which will be connecting to the eNB. In this tutorial (to match with the Network Configuration section that follows), we will use 192.168.150.1 . - Under both mme: -> gummei: and mme: -> tai: , you will need to change the plmn_id ( mcc and mnc values) to match the PLMN you are using for your network. - Note that for the purposes of eNB config later, the Tracking Area Code (or TAC) listed under tai: -> tac: will need to match the TAC number configured on the eNB (using the default of 1 is fine). Quick explanation: \"PLMN\" refers to the Public Land Mobile Network , in which every network has to have a unique carrier ID defined by the 3-digit \"mobile country code (MCC)\" and a 2 or 3-digit \"mobile network code (MNC)\". Alternately, for iPhone compatibility in the US, SCN uses the CBRS \"private LTE\" PLMN assigned by Apple as described in this doc . Optional: Edit network_name: (full and short) and mme_name: as desired. One of these names will show up on smartphones' lock screens as the \"carrier\" when the phone is attached to the network.","title":"MME"},{"location":"tutorials/epc-setup/#sgwu","text":"Edit the /etc/open5gs/sgwu.yaml file (as root or using sudo ) as follows: - Under sgwu: -> gtpu: -> server: -> address: , set the IP address you will assign to the network interface on your EPC computer which will be connecting to the eNB (this should be the same as the IP address of the MME set above, if the MME and SGWU are running on the same machine). In this tutorial we will use 192.168.150.1 . As mentioned in the Quickstart, after changing the config files, you will need to restart the corresponding Open5GS daemons: sudo systemctl restart open5gs-mmed sudo systemctl restart open5gs-sgwud However, the MME will likely not start correctly until networking is configured, as described below.","title":"SGWU"},{"location":"tutorials/epc-setup/#step-2-configure-networking","text":"Remember to follow all the network configuration steps in the Open5GS Quickstart documentation . For SCN's Ubuntu machines, this means: Allowing IP forwarding on your machine, e.g. via the following command: sudo sysctl -w net.ipv4.ip_forward=1 Using Netplan to configure network interfaces with IP addresses in the desired way. Setting up NAT rules using iptables so that traffic from the eNB can reach the Internet and vice versa The latter two steps are explained in detail below.","title":"Step 2: Configure Networking"},{"location":"tutorials/epc-setup/#netplan-configuration","text":"","title":"Netplan Configuration"},{"location":"tutorials/epc-setup/#a-recommended","text":"For this recommended configuration, we require an EPC machine with 2 or more ethernet ports ( in our case , the ethernet interfaces corresponding to these ports are named enp1s0 and enp4s0). The ethernet port named \"enp1s0\" is used as the WAN port, which accesses upstream networks and eventually the Internet. It is physically connected via an ethernet cable to a router that can give it Internet access (e.g. our ISP's router). The one named \"enp4s0\" will connect to our private LTE network, and is physically connected via an ethernet cable to the eNB radio. (Our mini-PC model has 4 ethernet ports.) To enter the appropriate values in your case , you will need to figure out the names of your computer's ethernet interfaces. Use the command ip a on the command line. A list of network interfaces will appear in the terminal. Find the ones corresponding to your ethernet ports (their names usually start with \u201ceth,\u201d \u201cenp,\u201d or \u201cenx\u201d). For Ubuntu 22.04, we're currently using the Netplan program to manage our network configuration. Create a file in the /etc/netplan directory (i.e. a folder) named 99-open5gs-config.yaml , and add the following lines, substituting the correct interface names and subnets for your configuration: network: ethernets: enp1s0: # name of interface used for upstream network dhcp4: yes enp4s0: # name of interface going to the eNB dhcp4: no addresses: - 192.168.150.2/24 # list all downstream networks - 192.168.151.2/24 version: 2 Note: Netplan will apply configuration files in this directory in the numerical order of the filename prefix (ie., 00-*, 01-*, etc.). Any interfaces configured in an earlier file will be overwritten by higher-numbered configuration files, so we create a file with the prefix 99-* in order to supersede all other configuration files. Quick explanation: In order to get Internet connectivity to the EPC, we configure the \"upstream\" or \"WAN\" ethernet interface (enp1s0) to request an IP address via DHCP from an upstream router it's connected to (as your computer usually does when you plug it into a typical home router), which passes its traffic to and from the global Internet. That's why we have the line dhcp4: yes under our interface name enp1s0 . We don't need this interface to have any other IP addresses. The \"downstream\" ethernet interface (enp4s0) connected to the eNB is assigned two IP addresses and subnets, which are configured statically ( not by DHCP, hence the dhcp4: no ). In our case, we need this interface to talk to the Baicells Nova 233 eNB we use. Our eNB has the default local (LAN) IP address of 192.168.150.1 . We also need to set its WAN address (for whatever reason this is required to be different) to 192.168.151.1 , as in this eNB setup tutorial . That's why we have the addresses: section that sets the static IP addresses of the EPC to 192.168.150.2/24 and 192.168.151.2/24 . Since these IP addresses are in the same subnet as the eNB IP addresses, they will be able to talk to each other automatically without a router in between helping to route communications packets between the two addresses. Below we also provide an alternate configuration in case you do not yet have a machine with 2 ethernet ports or a USB to ethernet adapter dongle. However, only the first configuration is recommended for deployments for security reasons. The alternative should be used for testing only .","title":"A. Recommended"},{"location":"tutorials/epc-setup/#b-not-recommended-for-deployment","text":"If you don\u2019t yet have a machine with 2 ethernet ports or a USB to ethernet adapter dongle, you can temporarily use a machine with a single ethernet port along with a simple switch or router. If using a simple switch, you can follow the same instructions but connect all three of the EPC, eNB, and upstream Internet router to the switch. If using a router, you may instead need to configure the router to assign 2 private static IPs to each of the EPC (i.e. 192.168.150.2 , 192.168.151.2 ) and eNB (i.e. 192.168.150.1 , 192.168.151.1 ), such that it will correctly NAT upstream traffic and also route local traffic between the EPC and eNB. # Network config EPC with single ethernet card # A switch is used to connect all devices network: ethernets: enp1s0: # name of ethernet interface dhcp4: true addresses: - 192.168.150.2/24 # list all downstream networks - 192.168.151.2/24 version: 2 Once this file (or your router configuration) has been modified, restart the network daemon to apply the configuration changes: sudo netplan try and if the Netplan syntax check succeeds, hit the Enter or Return key to accept the configuration change. If the eNB will be plugged into its own dedicated EPC ethernet port, as in the recommended configuration above, you may need to connect that EPC ethernet port to something (e.g. the eNB, a switch, another machine) via an ethernet cable to wake the interface up (so that it becomes active and takes on the assigned IP addresses). This is because the open5gs MME needs to \"bind\" (or associate) its S1 interface to one of those IP addresses (in this case 192.168.0.2 ). Until those IP addresses exist on your machine, the MME will continually throw errors if you try to run it.","title":"B. NOT Recommended for deployment"},{"location":"tutorials/epc-setup/#setting-iptables-nat-rules-to-connect-the-enb-to-the-internet","text":"As explained above, the eNB currently has the IP addresses 192.168.150.1 and 192.168.151.1 -- private IP addresses that cannot be used on the public Internet. Therefore, to successfully route the eNB's network traffic to the Internet, we have to add a routing rule in the EPC computer that performs NAT, allowing packets from the eNB's subnet to exit the WAN port of the EPC masquerading as coming from the EPC's IP address to the upstream network. There might be an easier way to do this, but we've found the cleanest and most reliable way so far to be using the iptables command line tool. In the Terminal on the EPC, run the following command to add a NAT rule for the eNB's subnet: sudo iptables -t nat -A POSTROUTING -s 192.168.151.0/24 -j MASQUERADE Quick explanation: The -t nat option tells IPTables to install the rule in the correct \"table\" containing all the NAT rules, and the -A option means we're A dding the rule as opposed to D eleting it ( -D ). POSTROUTING is the \"chain,\" or particular list of rules, that this type of NAT rule should go in (more on that here and in this diagram if you're interested). -s 192.168.151.0/24 means that we're applying this rule to packets from the S ource IP addresses described by the subnet 192.168.151.0/24 . -j MASQUERADE means the action we'll be J umping to as a result of this rule is \"masquerading\" the source IP address as my EPC's WAN IP address.","title":"Setting iptables NAT rules to connect the eNB to the Internet"},{"location":"tutorials/epc-setup/#persist-iptables-configuration","text":"We use IPTables rules to make sure packets are routed correctly within the EPC. IPTables rules must be made persistent across reboots with the iptables-persistent package: sudo apt install iptables-persistent Installation of this package will save the current iptables rules to its configuration file, /etc/iptables/rules.v4 . Note: iptables-persistent reads the contents of this file at boot and applies all iptables rules it contains. If you need to update the rules, or re-apply manually, you may use the following commands. This should not be necessary under normal circumstances: sudo iptables-save > /etc/iptables/rules.v4 sudo iptables-restore < /etc/iptables/rules.v4","title":"'Persist' IPTables Configuration"},{"location":"tutorials/epc-setup/#step-3-start-and-monitor-open5gs-software-services","text":"Ubuntu\u2019s built-in logging and monitoring services can be used to monitor the core network services. For example, for seeing the output logs of the MME software component we described in the first section, run the following command in the Terminal: sudo journalctl -f -u open5gs-mmed.service OR sudo systemctl status open5gs-mmed.service Tab complete may be able to fill in the service name for systemctl at least. Learning to read output logs is really important for managing software infrastructure! Simply Googling output messages that seem important but that you don't understand can be a good first step to figuring out how a system is working. Another interesting tool to investigate is Wireshark , which is essentially a graphical user interface (GUI) version of the tcpdump command line tool that can show you the communications packets flowing through the various network cards on your computer. Here are some more useful commands for managing systemd services, which can be used to start, stop, and reload the software components after you've changed their configuration or they've run into errors and need to be restarted: sudo systemctl start open5gs-mmed.service sudo systemctl stop open5gs-mmed.service sudo systemctl restart open5gs-mmed.service sudo systemctl status open5gs-* The following command will start only the systemd services required for LTE. However, you do not need to stop or disable the other components of the 5G core for it to run 4G LTE network hardware correctly- the full Open5GS 5G core is backwards compatible with LTE hardware if you configure the LTE components correctly. sudo systemctl start open5gs-hssd.service open5gs-mmed.service open5gs-sgwud.service open5gs-sgwcd.service open5gs-pcrfd.service open5gs-upfd.service open5gs-smfd.service","title":"Step 3: Start and monitor Open5GS software services"},{"location":"tutorials/epc-setup/#install-and-start-the-webui","text":"The WebUI is another systemd service and runs by default on your local computer at port 9999. It requires some more dependencies to install, such as nodejs (see Step \"3. Install the WebUI of Open5GS\" in the Quickstart ). You can reach it by navigating to http://localhost:9999 in your web browser. If not already started, start it with the following command: sudo systemctl start open5gs-webui.service The default WebUI login credentials are as follows: - Username : admin - Password : 1423","title":"Install and Start the WebUI"},{"location":"tutorials/epc-setup/#step-4-add-users-to-open5gs-database","text":"(Note that an important pre-condition to adding users is to have SIM cards or eSIMs to give to the users for authentication, along with their respective IMSIs and secret keys to register them onto the EPC. These must be procured separately. WIP- We will endeavor to make guides for these processes available soon.) You can manage users using the Open5GS WebUI, or using a script provided in the Open5GS GitHub repository . Our preferred strategy is to use the script, which supports automation better and does not require the WebUI to be running. Clone the repository into the EPC machine: git clone https://github.com/open5gs/open5gs.git The script can be found in misc/db/open5gs-dbctl from the top level of the repository ( open5gs folder). For example, you could run a command to add a user like this from within the open5gs/misc/db folder: sudo ./open5gs-dbctl add 460660003400030 192.168.20.30 0x00112233445566778899AABBCCDDEEFF 0x000102030405060708090A0B0C0D0E0F Running the ./open5gs-dbctl command on its own will output a list of allowed command syntax, of which the following can be particularly handy: - add {imsi key opc}: adds a user to the database with default values - add {imsi ip key opc}: adds a user to the database with default values and a IPv4 address for the UE - remove {imsi}: removes a user from the database - static_ip {imsi ip4}: adds a static IP assignment to an already-existing user - add_ue_with_apn {imsi key opc apn}: adds a user to the database with a specific apn The help text also tells you that \"default values are as follows: APN \"internet\", dl_bw/ul_bw 1 Gbps, PGW address is 127.0.0.3, IPv4 only\".","title":"Step 4: Add Users to Open5GS database"},{"location":"tutorials/epc-setup/#step-5-maintenance-and-management","text":"","title":"Step 5: Maintenance and Management"},{"location":"tutorials/epc-setup/#updating-open5gs","text":"WIP: We are working on an Ansible-based management script for updates and will post updates as they occur.","title":"Updating Open5GS"},{"location":"tutorials/epc-setup/#backup-and-restore","text":"WIP: We are working on our backup and restore strategies and will update this with a repo soon.","title":"Backup and Restore"},{"location":"tutorials/epc-setup/#deprecated-colteepc-lte-core-network-setup","text":"Our core networks formerly used the CoLTE project maintained by the UW ICTD Lab . For information on how to install and configure CoLTE, visit the tutorial we wrote with them, on which this document is based.","title":"Deprecated: CoLTE/EPC (LTE Core Network) Setup"},{"location":"tutorials/epc-setup/#comments-and-feedback","text":"Please get in touch with us at support@seattlecommunitynetwork.org if you have questions or feedback about this tutorial! We want your feedback so we can make this better.","title":"Comments and Feedback"},{"location":"tutorials/grafana-log-dashboard/","text":"Developed By: Rudra Prakash Singh, Esther Jang This guide walks you through the process of setting up a Grafana Server Log Monitoring Dashboard, including the installation and configuration of Grafana, Loki, and Promtail for log aggregation and visualization. It also covers setting up scripts for automating log retrieval and dashboard updates. Step 1: Install Grafana via CLI Install Grafana on your server using the following instructions for Debian-based systems: Follow the installation guide here: Grafana Installation on Debian Once installed, start Grafana and make sure it's accessible via a port (default: 3000 ). After Grafana is running, create an admin account. Once logged in, you'll land on the Grafana homepage. Step 2: Install Loki Install Loki by following the official instructions for Docker: Loki Installation via Docker Step 3: Create a Docker Compose File for Loki To set up Loki with Grafana, create a docker-compose.yml file: version: \"3\" # The version can be removed if you're using a recent Docker Compose version. services: grafana: image: grafana/grafana:latest ports: - \"3000:3000\" networks: - loki volumes: - grafana-data:/path # [CHANGE THIS LINE] Adding persistence for Grafana data loki: image: grafana/loki:latest ports: - \"3100:3100\" networks: - loki volumes: - ./path # [CHANGE THIS LINE] Local directory for Loki data user: \"10001\" # Run Loki as the appropriate user to avoid permission issues promtail: image: grafana/promtail:latest command: \"-config.file=/etc/promtail/config.yaml\" # [CHANGE THIS LINE] networks: - loki volumes: - \"/var/log:/var/log\" # [CHANGE THIS LINE] Mounting host logs networks: loki: volumes: grafana-data: # Declaring the volume for Grafana Step 4: Install Promtail Install Promtail by following the official instructions: Promtail Installation Guide Step 5: Configure Data Sources (Logs) To aggregate logs from other servers, we set up a method of transferring logs to the Grafana server. The logs are pulled into the Grafana server, where they are processed and rendered on a Grafana dashboard. Here\u2019s the updated section of the README with the requested changes marked. The rest remains unchanged. Step 5: Configure Data Sources (Logs) 5.1: Write a Bash Script to Pull Logs Here\u2019s an example of a script ( transfer_logs.sh ) to pull logs from another server: #!/bin/bash # Define variables REMOTE_SERVER=\"root@server_ip\" # [CHANGE THIS LINE] Remote server IP SSH_KEY_PATH=\"path\" # [CHANGE THIS LINE] Path to SSH key DEST_DIR=\"path\" # [CHANGE THIS LINE] Destination directory on the Grafana server # Define paths for logs DOCKER_LOG=\"path/to/docker/log\" # [CHANGE THIS LINE] Path to Docker log on remote server NGINX_LOG=\"path/to/nginx/log\" # [CHANGE THIS LINE] Path to NGINX log on remote server SYSLOG=\"path/to/syslog\" # [CHANGE THIS LINE] Path to syslog on remote server # Create directories if they don't exist mkdir -p \"$DEST_DIR/docker\" \"$DEST_DIR/nginx\" \"$DEST_DIR/syslog\" # Transfer logs echo \"Transferring Docker log...\" ssh -i $SSH_KEY_PATH $REMOTE_SERVER \"cat $DOCKER_LOG\" > \"$DEST_DIR/docker/docker.log\" echo \"Transferring NGINX log...\" ssh -i $SSH_KEY_PATH $REMOTE_SERVER \"cat $NGINX_LOG\" > \"$DEST_DIR/nginx/error.log\" echo \"Transferring syslog...\" ssh -i $SSH_KEY_PATH $REMOTE_SERVER \"cat $SYSLOG\" > \"$DEST_DIR/syslog/syslog.log\" echo \"All logs have been successfully transferred.\" 5.2: Configure Promtail to Scrape Logs Next, create a promtail-config.yaml file to let Promtail know where the logs are located: server: http_listen_port: 9080 grpc_listen_port: 0 positions: filename: /tmp/positions.yaml clients: - url: http://server_ip:3100/loki/api/v1/push # [CHANGE THIS LINE] Loki's URL scrape_configs: - job_name: docker_logs static_configs: labels: job: docker __path__: /path/to/logs/on/grafana/server/docker/*.log # [CHANGE THIS LINE] Path to Docker logs - job_name: nginx_logs static_configs: labels: job: nginx __path__: /path/to/logs/on/grafana/server/nginx/*.log # [CHANGE THIS LINE] Path to NGINX logs - job_name: syslog_logs static_configs: labels: job: syslog __path__: /path/to/logs/on/grafana/server/syslog/*.log # [CHANGE THIS LINE] Path to syslog logs Step 6: Configure Grafana to Use Loki Open Grafana\u2019s homepage and click the three vertical lines in the top-left corner. Navigate to Data Sources , then click Add Data Source . Select Loki as the data source type. Define the URL of your Loki instance, which is typically http://localhost:3100 . Click Save & Test . You should see a success message confirming the connection. Step 7: Explore Data in Grafana Go to the Explore section in Grafana. Use label filters and run queries to see the logs coming from Promtail. The labels in the filters correspond to the labels defined in the promtail-config.yaml . Step 8: Create a Dashboard On the left sidebar in Grafana, click Dashboards > New Dashboard . Click Add Panel to create a new panel. Under Data Source , select Loki . Write queries to retrieve logs for display. Use different labels to filter log data as needed. Choose a visualization type (e.g., Logs ). Repeat the process to add more visualizations, then adjust the layout and size to suit your needs. Save the dashboard once you are satisfied with the layout. Step 9: Automate Log Retrieval and Update Dashboard To make the process of pulling logs and updating the Grafana dashboard more automated, create two Python scripts: 9.1: transfer_server.py This script triggers the Promtail process to start log scraping when accessed via an HTTP request: from http.server import BaseHTTPRequestHandler, HTTPServer import subprocess COMMAND = \"sudo ./promtail-linux-amd64 -config.file=promtail-config.yaml\" class RequestHandler(BaseHTTPRequestHandler): def do_GET(self): if self.path == \"/run\": try: subprocess.Popen(COMMAND, shell=True) self.send_response(200) self.end_headers() self.wfile.write(b\"Command executed successfully.\") except Exception as e: self.send_response(500) self.end_headers() self.wfile.write(f\"Error executing command: {e}\".encode()) else: self.send_response(404) self.end_headers() self.wfile.write(b\"Not found.\") if __name__ == \"__main__\": server_address = ('server_ip', 8081) httpd = HTTPServer(server_address, RequestHandler) print(\"Server running on http://server_ip. Access /run to execute the command.\") httpd.serve_forever() 9.2: server.py This script pulls the logs by executing the previously created bash script: from http.server import BaseHTTPRequestHandler, HTTPServer import subprocess class ScriptHandler(BaseHTTPRequestHandler): def do_GET(self): script_path = \"/path/to/transfer_logs.sh\" # [CHANGE THIS LINE] try: subprocess.run([script_path], check=True) self.send_response(200) self.send_header(\"Content-type\", \"text/html\") self.end_headers() self.wfile.write(b\"Logs Pulled Successfully.\") except subprocess.CalledProcessError: self.send_response(500) self.send_header(\"Content-type\", \"text/html\") self.end_headers() self.wfile.write(b\"Failed to pull logs.\") def run(server_class=HTTPServer, handler_class=ScriptHandler, port=8080): server_address = ('', port) httpd = server_class(server_address, handler_class) print(f\"Starting http server on port {port}\") httpd.serve_forever() if __name__ == \"__main__\": run() Run both Python scripts in the background using nohup : nohup python3 transfer_server.py > transfer_server.log 2>&1 & nohup python3 server.py > server.log 2>&1 & Step 10: Add Buttons to Grafana Dashboard In Grafana, go to Settings > Links . Add the links to the above Python scripts with the appropriate port ( 8080 for log pulling and 8081 for triggering Promtail). This will enable users to pull logs instantly as they wish. Make sure promtail activation button is run first when opening dashboard, and then pulling logs button after.","title":"Grafana Log Dashboard Guide"},{"location":"tutorials/grafana-log-dashboard/#developed-by-rudra-prakash-singh-esther-jang","text":"This guide walks you through the process of setting up a Grafana Server Log Monitoring Dashboard, including the installation and configuration of Grafana, Loki, and Promtail for log aggregation and visualization. It also covers setting up scripts for automating log retrieval and dashboard updates.","title":"Developed By: Rudra Prakash Singh, Esther Jang"},{"location":"tutorials/grafana-log-dashboard/#step-1-install-grafana-via-cli","text":"Install Grafana on your server using the following instructions for Debian-based systems: Follow the installation guide here: Grafana Installation on Debian Once installed, start Grafana and make sure it's accessible via a port (default: 3000 ). After Grafana is running, create an admin account. Once logged in, you'll land on the Grafana homepage.","title":"Step 1: Install Grafana via CLI"},{"location":"tutorials/grafana-log-dashboard/#step-2-install-loki","text":"Install Loki by following the official instructions for Docker: Loki Installation via Docker","title":"Step 2: Install Loki"},{"location":"tutorials/grafana-log-dashboard/#step-3-create-a-docker-compose-file-for-loki","text":"To set up Loki with Grafana, create a docker-compose.yml file: version: \"3\" # The version can be removed if you're using a recent Docker Compose version. services: grafana: image: grafana/grafana:latest ports: - \"3000:3000\" networks: - loki volumes: - grafana-data:/path # [CHANGE THIS LINE] Adding persistence for Grafana data loki: image: grafana/loki:latest ports: - \"3100:3100\" networks: - loki volumes: - ./path # [CHANGE THIS LINE] Local directory for Loki data user: \"10001\" # Run Loki as the appropriate user to avoid permission issues promtail: image: grafana/promtail:latest command: \"-config.file=/etc/promtail/config.yaml\" # [CHANGE THIS LINE] networks: - loki volumes: - \"/var/log:/var/log\" # [CHANGE THIS LINE] Mounting host logs networks: loki: volumes: grafana-data: # Declaring the volume for Grafana","title":"Step 3: Create a Docker Compose File for Loki"},{"location":"tutorials/grafana-log-dashboard/#step-4-install-promtail","text":"Install Promtail by following the official instructions: Promtail Installation Guide","title":"Step 4: Install Promtail"},{"location":"tutorials/grafana-log-dashboard/#step-5-configure-data-sources-logs","text":"To aggregate logs from other servers, we set up a method of transferring logs to the Grafana server. The logs are pulled into the Grafana server, where they are processed and rendered on a Grafana dashboard. Here\u2019s the updated section of the README with the requested changes marked. The rest remains unchanged.","title":"Step 5: Configure Data Sources (Logs)"},{"location":"tutorials/grafana-log-dashboard/#step-5-configure-data-sources-logs_1","text":"","title":"Step 5: Configure Data Sources (Logs)"},{"location":"tutorials/grafana-log-dashboard/#51-write-a-bash-script-to-pull-logs","text":"Here\u2019s an example of a script ( transfer_logs.sh ) to pull logs from another server: #!/bin/bash # Define variables REMOTE_SERVER=\"root@server_ip\" # [CHANGE THIS LINE] Remote server IP SSH_KEY_PATH=\"path\" # [CHANGE THIS LINE] Path to SSH key DEST_DIR=\"path\" # [CHANGE THIS LINE] Destination directory on the Grafana server # Define paths for logs DOCKER_LOG=\"path/to/docker/log\" # [CHANGE THIS LINE] Path to Docker log on remote server NGINX_LOG=\"path/to/nginx/log\" # [CHANGE THIS LINE] Path to NGINX log on remote server SYSLOG=\"path/to/syslog\" # [CHANGE THIS LINE] Path to syslog on remote server # Create directories if they don't exist mkdir -p \"$DEST_DIR/docker\" \"$DEST_DIR/nginx\" \"$DEST_DIR/syslog\" # Transfer logs echo \"Transferring Docker log...\" ssh -i $SSH_KEY_PATH $REMOTE_SERVER \"cat $DOCKER_LOG\" > \"$DEST_DIR/docker/docker.log\" echo \"Transferring NGINX log...\" ssh -i $SSH_KEY_PATH $REMOTE_SERVER \"cat $NGINX_LOG\" > \"$DEST_DIR/nginx/error.log\" echo \"Transferring syslog...\" ssh -i $SSH_KEY_PATH $REMOTE_SERVER \"cat $SYSLOG\" > \"$DEST_DIR/syslog/syslog.log\" echo \"All logs have been successfully transferred.\"","title":"5.1: Write a Bash Script to Pull Logs"},{"location":"tutorials/grafana-log-dashboard/#52-configure-promtail-to-scrape-logs","text":"Next, create a promtail-config.yaml file to let Promtail know where the logs are located: server: http_listen_port: 9080 grpc_listen_port: 0 positions: filename: /tmp/positions.yaml clients: - url: http://server_ip:3100/loki/api/v1/push # [CHANGE THIS LINE] Loki's URL scrape_configs: - job_name: docker_logs static_configs: labels: job: docker __path__: /path/to/logs/on/grafana/server/docker/*.log # [CHANGE THIS LINE] Path to Docker logs - job_name: nginx_logs static_configs: labels: job: nginx __path__: /path/to/logs/on/grafana/server/nginx/*.log # [CHANGE THIS LINE] Path to NGINX logs - job_name: syslog_logs static_configs: labels: job: syslog __path__: /path/to/logs/on/grafana/server/syslog/*.log # [CHANGE THIS LINE] Path to syslog logs","title":"5.2: Configure Promtail to Scrape Logs"},{"location":"tutorials/grafana-log-dashboard/#step-6-configure-grafana-to-use-loki","text":"Open Grafana\u2019s homepage and click the three vertical lines in the top-left corner. Navigate to Data Sources , then click Add Data Source . Select Loki as the data source type. Define the URL of your Loki instance, which is typically http://localhost:3100 . Click Save & Test . You should see a success message confirming the connection.","title":"Step 6: Configure Grafana to Use Loki"},{"location":"tutorials/grafana-log-dashboard/#step-7-explore-data-in-grafana","text":"Go to the Explore section in Grafana. Use label filters and run queries to see the logs coming from Promtail. The labels in the filters correspond to the labels defined in the promtail-config.yaml .","title":"Step 7: Explore Data in Grafana"},{"location":"tutorials/grafana-log-dashboard/#step-8-create-a-dashboard","text":"On the left sidebar in Grafana, click Dashboards > New Dashboard . Click Add Panel to create a new panel. Under Data Source , select Loki . Write queries to retrieve logs for display. Use different labels to filter log data as needed. Choose a visualization type (e.g., Logs ). Repeat the process to add more visualizations, then adjust the layout and size to suit your needs. Save the dashboard once you are satisfied with the layout.","title":"Step 8: Create a Dashboard"},{"location":"tutorials/grafana-log-dashboard/#step-9-automate-log-retrieval-and-update-dashboard","text":"To make the process of pulling logs and updating the Grafana dashboard more automated, create two Python scripts:","title":"Step 9: Automate Log Retrieval and Update Dashboard"},{"location":"tutorials/grafana-log-dashboard/#91-transfer_serverpy","text":"This script triggers the Promtail process to start log scraping when accessed via an HTTP request: from http.server import BaseHTTPRequestHandler, HTTPServer import subprocess COMMAND = \"sudo ./promtail-linux-amd64 -config.file=promtail-config.yaml\" class RequestHandler(BaseHTTPRequestHandler): def do_GET(self): if self.path == \"/run\": try: subprocess.Popen(COMMAND, shell=True) self.send_response(200) self.end_headers() self.wfile.write(b\"Command executed successfully.\") except Exception as e: self.send_response(500) self.end_headers() self.wfile.write(f\"Error executing command: {e}\".encode()) else: self.send_response(404) self.end_headers() self.wfile.write(b\"Not found.\") if __name__ == \"__main__\": server_address = ('server_ip', 8081) httpd = HTTPServer(server_address, RequestHandler) print(\"Server running on http://server_ip. Access /run to execute the command.\") httpd.serve_forever()","title":"9.1: transfer_server.py"},{"location":"tutorials/grafana-log-dashboard/#92-serverpy","text":"This script pulls the logs by executing the previously created bash script: from http.server import BaseHTTPRequestHandler, HTTPServer import subprocess class ScriptHandler(BaseHTTPRequestHandler): def do_GET(self): script_path = \"/path/to/transfer_logs.sh\" # [CHANGE THIS LINE] try: subprocess.run([script_path], check=True) self.send_response(200) self.send_header(\"Content-type\", \"text/html\") self.end_headers() self.wfile.write(b\"Logs Pulled Successfully.\") except subprocess.CalledProcessError: self.send_response(500) self.send_header(\"Content-type\", \"text/html\") self.end_headers() self.wfile.write(b\"Failed to pull logs.\") def run(server_class=HTTPServer, handler_class=ScriptHandler, port=8080): server_address = ('', port) httpd = server_class(server_address, handler_class) print(f\"Starting http server on port {port}\") httpd.serve_forever() if __name__ == \"__main__\": run() Run both Python scripts in the background using nohup : nohup python3 transfer_server.py > transfer_server.log 2>&1 & nohup python3 server.py > server.log 2>&1 &","title":"9.2: server.py"},{"location":"tutorials/grafana-log-dashboard/#step-10-add-buttons-to-grafana-dashboard","text":"In Grafana, go to Settings > Links . Add the links to the above Python scripts with the appropriate port ( 8080 for log pulling and 8081 for triggering Promtail). This will enable users to pull logs instantly as they wish. Make sure promtail activation button is run first when opening dashboard, and then pulling logs button after.","title":"Step 10: Add Buttons to Grafana Dashboard"},{"location":"tutorials/hardware/","text":"Our Hardware This page will be an overview of some of the core pieces of hardware that we use to deploy our sites. This page is in development, please contact us at lcl@seattlecommunitynetwork.org if you would like to learn more about the hardware we use. TODO Network Site Equipment Base Station (eNodeB) Baicells Nova 233 3.5GHz 1W Gen2 More info here Panel Antennas (eNodeB) Alpha Wireless, 3.3-3.8GHz, 2x2 MIMO, 18dBi, +/-45\u00b0, 65\u00b0 More info here Core Network Computer (EPC) Qotom Mini PC Q190G4N S07 Key features: - 4 ethernet ports - designed to be run 24/7 - small and quiet - cheap More info here User Access Devices LTE Consumer Premises Equipment (CPE) Baicells Atom OD04 3.5GHz 14dBi More info here Outdoor WiFi Router Mikrotik OmniTIK 5 PoE ac Outdoor router of choice for NYC Mesh, so it has been tried and tested. Good balance of quality and price. More info here Home WiFi Router TP-Link Archer A5 Router More info here CBRS-Compatible Unlocked Smartphone We purchase refurbished Google Pixel 4 smartphones because they are affordable, provide all necessary smartphone features, and are CBRS-compatible. Note that purchasing CBRS-compatible phones can be a logistical challenge. We've experienced trouble purchasing from vendors that send incorrect models of phones that don't support CBRS band and we had to go back and forth. Test your phones before distributing them! Here is one spot to purchase refurbished phones.","title":"Hardware Overview"},{"location":"tutorials/hardware/#our-hardware","text":"This page will be an overview of some of the core pieces of hardware that we use to deploy our sites. This page is in development, please contact us at lcl@seattlecommunitynetwork.org if you would like to learn more about the hardware we use.","title":"Our Hardware"},{"location":"tutorials/hardware/#todo","text":"","title":"TODO"},{"location":"tutorials/hardware/#network-site-equipment","text":"","title":"Network Site Equipment"},{"location":"tutorials/hardware/#base-station-enodeb","text":"Baicells Nova 233 3.5GHz 1W Gen2 More info here","title":"Base Station (eNodeB)"},{"location":"tutorials/hardware/#panel-antennas-enodeb","text":"Alpha Wireless, 3.3-3.8GHz, 2x2 MIMO, 18dBi, +/-45\u00b0, 65\u00b0 More info here","title":"Panel Antennas (eNodeB)"},{"location":"tutorials/hardware/#core-network-computer-epc","text":"Qotom Mini PC Q190G4N S07 Key features: - 4 ethernet ports - designed to be run 24/7 - small and quiet - cheap More info here","title":"Core Network Computer (EPC)"},{"location":"tutorials/hardware/#user-access-devices","text":"","title":"User Access Devices"},{"location":"tutorials/hardware/#lte-consumer-premises-equipment-cpe","text":"Baicells Atom OD04 3.5GHz 14dBi More info here","title":"LTE Consumer Premises Equipment (CPE)"},{"location":"tutorials/hardware/#outdoor-wifi-router","text":"Mikrotik OmniTIK 5 PoE ac Outdoor router of choice for NYC Mesh, so it has been tried and tested. Good balance of quality and price. More info here","title":"Outdoor WiFi Router"},{"location":"tutorials/hardware/#home-wifi-router","text":"TP-Link Archer A5 Router More info here","title":"Home WiFi Router"},{"location":"tutorials/hardware/#cbrs-compatible-unlocked-smartphone","text":"We purchase refurbished Google Pixel 4 smartphones because they are affordable, provide all necessary smartphone features, and are CBRS-compatible. Note that purchasing CBRS-compatible phones can be a logistical challenge. We've experienced trouble purchasing from vendors that send incorrect models of phones that don't support CBRS band and we had to go back and forth. Test your phones before distributing them! Here is one spot to purchase refurbished phones.","title":"CBRS-Compatible Unlocked Smartphone"},{"location":"tutorials/librenms-manager-setup/","text":"LibreNMS Network Manager Configuration Seattle Community Networks uses SNMP to monitor network nodes. LibreNMS is used for Network Management, Dashboard generation and Alerting. LibreNMS Manager Installation: Install LibreNMS Install and Configure LibreNMS on Ubuntu with nginx Network-Specific Configuration: Change active user to librenms: sudo su - librenms Edit /opt/librenms/config.php: '); $config['auth_mechanism'] = \"mysql\"; # default, other options: ldap, http-auth $config['nets'][] = \"10.0.0.0/24\"; # Replace with your Management Network Subdomain $config['rrd_purge'] = 0; $config['enable_billing'] = 1; $config['show_services'] = 1; As user 'librenms', run /opt/librenms/snmp-scan.php, to scan the configured network for snmp hosts Adding Baicells OS configuration to LibreNMS As user 'librenms' on the librenms server, create the following files and update their contents accordingly: * For OS detection, ~librenms/includes/definitions/rts.yaml: os: rts text: 'Baicells RTS' type: network icon: rts over: - { graph: device_bits, text: 'Device Traffic' } - { graph: device_processor, text: 'CPU Usage' } - { graph: device_mempool, text: 'Memory Usage' } discovery: - sysDescr: - 'CELL' For defining custom RTS OS sensors, ~librenms/includes/definitions/discovery/rts.yaml: mib: BAICELLS-MIB modules: os: hardware: BAICELLS-MIB::hardwareVersion.0 serial: BAICELLS-MIB::sn.0 version: BAICELLS-MIB::softwareVersion.0 sensors: count: data: - oid: ulThroughput num_oid: '.1.3.6.1.4.1.53058.190.7.{{ $index }}' descr: 'Upload Throughput' group: 'Throughput' index: 'ulthroughput.{{ $index }}' - oid: dlThroughput num_oid: '.1.3.6.1.4.1.53058.190.8.{{ $index }}' descr: 'Download Throughput' group: 'Throughput' index: 'dlThroughput.{{ $index }}' - oid: ulPrbUtilization num_oid: '.1.3.6.1.4.1.53058.190.9.{{ $index }}' descr: 'Upload PRB Utilization' group: 'Utilization' index: 'ulPrbUtilization{{ $index }}' - oid: dlPrbUtilization num_oid: '.1.3.6.1.4.1.53058.190.10.{{ $index }}' descr: 'Download PRB Utilization' group: 'Utilization' index: 'dlPrbUtilization.{{ $index }}' frequency: data: - oid: carrierBwMhz num_oid: '.1.3.6.1.4.1.53058.100.7.{{ $index }}' divisor: 5 descr: 'Carrier Bandwidth' index: 'carrierBwMhz.{{ $index }}' percent: data: - oid: eRABEstablishSuccessRate num_oid: '.1.3.6.1.4.1.53058.190.3.{{ $index }}' descr: 'ERAB Establishment Success Rate' group: 'LTE' index: 'eRABEstablishSuccessRate.{{ $index }}' - oid: hoSuccInterEnbS1Rate num_oid: '.1.3.6.1.4.1.53058.190.4.{{ $index }}' descr: 'Inter MME S1 Handover Success Rate' group: 'LTE' index: 'heSuccInterEnbS1Rate.{{ $index }}' - oid: hoSuccInterEnbRate num_oid: '.1.3.6.1.4.1.53058.190.5.{{ $index }}' descr: 'Inter MME Handover Success Rate' group: 'LTE' index: 'hoSuccInterEnbRate.{{ $index }}' - oid: rrcBuildSuccessRate num_oid: '.1.3.6.1.4.1.53058.190.6.{{ $index }}' descr: 'RRC Build Success Rate' group: 'LTE' index: 'rrcBuildSuccessRate.{{ $index }}' For defining a custom OS class to use Wireless sensors, ~librenms/LibreNMS/OS/Rts.php (note: pay attention to capitalization) getDeviceId(), $oid, 'rts', 1, 'UE Connections') ); } } A nice looking logo, ~librenms/html/images/os/rts.png Download an example Baicells Logo Here Download the baicells mib from this link , and save it to ~librenms/mibs/BAICELLS-MIB (note: no file extension)","title":"Network Monitoring 1. LibreNMS Network Manager Configuration"},{"location":"tutorials/librenms-manager-setup/#librenms-network-manager-configuration","text":"Seattle Community Networks uses SNMP to monitor network nodes. LibreNMS is used for Network Management, Dashboard generation and Alerting.","title":"LibreNMS Network Manager Configuration"},{"location":"tutorials/librenms-manager-setup/#librenms-manager-installation","text":"Install LibreNMS Install and Configure LibreNMS on Ubuntu with nginx","title":"LibreNMS Manager Installation:"},{"location":"tutorials/librenms-manager-setup/#network-specific-configuration","text":"Change active user to librenms: sudo su - librenms Edit /opt/librenms/config.php: '); $config['auth_mechanism'] = \"mysql\"; # default, other options: ldap, http-auth $config['nets'][] = \"10.0.0.0/24\"; # Replace with your Management Network Subdomain $config['rrd_purge'] = 0; $config['enable_billing'] = 1; $config['show_services'] = 1; As user 'librenms', run /opt/librenms/snmp-scan.php, to scan the configured network for snmp hosts","title":"Network-Specific Configuration:"},{"location":"tutorials/librenms-manager-setup/#adding-baicells-os-configuration-to-librenms","text":"As user 'librenms' on the librenms server, create the following files and update their contents accordingly: * For OS detection, ~librenms/includes/definitions/rts.yaml: os: rts text: 'Baicells RTS' type: network icon: rts over: - { graph: device_bits, text: 'Device Traffic' } - { graph: device_processor, text: 'CPU Usage' } - { graph: device_mempool, text: 'Memory Usage' } discovery: - sysDescr: - 'CELL' For defining custom RTS OS sensors, ~librenms/includes/definitions/discovery/rts.yaml: mib: BAICELLS-MIB modules: os: hardware: BAICELLS-MIB::hardwareVersion.0 serial: BAICELLS-MIB::sn.0 version: BAICELLS-MIB::softwareVersion.0 sensors: count: data: - oid: ulThroughput num_oid: '.1.3.6.1.4.1.53058.190.7.{{ $index }}' descr: 'Upload Throughput' group: 'Throughput' index: 'ulthroughput.{{ $index }}' - oid: dlThroughput num_oid: '.1.3.6.1.4.1.53058.190.8.{{ $index }}' descr: 'Download Throughput' group: 'Throughput' index: 'dlThroughput.{{ $index }}' - oid: ulPrbUtilization num_oid: '.1.3.6.1.4.1.53058.190.9.{{ $index }}' descr: 'Upload PRB Utilization' group: 'Utilization' index: 'ulPrbUtilization{{ $index }}' - oid: dlPrbUtilization num_oid: '.1.3.6.1.4.1.53058.190.10.{{ $index }}' descr: 'Download PRB Utilization' group: 'Utilization' index: 'dlPrbUtilization.{{ $index }}' frequency: data: - oid: carrierBwMhz num_oid: '.1.3.6.1.4.1.53058.100.7.{{ $index }}' divisor: 5 descr: 'Carrier Bandwidth' index: 'carrierBwMhz.{{ $index }}' percent: data: - oid: eRABEstablishSuccessRate num_oid: '.1.3.6.1.4.1.53058.190.3.{{ $index }}' descr: 'ERAB Establishment Success Rate' group: 'LTE' index: 'eRABEstablishSuccessRate.{{ $index }}' - oid: hoSuccInterEnbS1Rate num_oid: '.1.3.6.1.4.1.53058.190.4.{{ $index }}' descr: 'Inter MME S1 Handover Success Rate' group: 'LTE' index: 'heSuccInterEnbS1Rate.{{ $index }}' - oid: hoSuccInterEnbRate num_oid: '.1.3.6.1.4.1.53058.190.5.{{ $index }}' descr: 'Inter MME Handover Success Rate' group: 'LTE' index: 'hoSuccInterEnbRate.{{ $index }}' - oid: rrcBuildSuccessRate num_oid: '.1.3.6.1.4.1.53058.190.6.{{ $index }}' descr: 'RRC Build Success Rate' group: 'LTE' index: 'rrcBuildSuccessRate.{{ $index }}' For defining a custom OS class to use Wireless sensors, ~librenms/LibreNMS/OS/Rts.php (note: pay attention to capitalization) getDeviceId(), $oid, 'rts', 1, 'UE Connections') ); } } A nice looking logo, ~librenms/html/images/os/rts.png Download an example Baicells Logo Here Download the baicells mib from this link , and save it to ~librenms/mibs/BAICELLS-MIB (note: no file extension)","title":"Adding Baicells OS configuration to LibreNMS"},{"location":"tutorials/librenms-setup/","text":"LibreNMS Agent Configuration Adding a New Node to LibreNMS Both the eNodeB and the EPC must be configured individually in order for them to report statistics to the SNMP Manager. Since the eNodeB is not directly accessible from the management VPN, we configure an SNMP proxy on the EPC to pass SNMP statistics to the Management host. EPC SNMP Configuration Install snmpd to the EPC node: $ sudo apt install snmpd Modify /etc/snmp/snmpd.conf: sysLocation sysContact lcl@seattlecommunitynetwork.org sysServices 72 master agentx agentAddress udp:161 com2sec readonly com2sec -Cn ctx_baicells readonly enodeb group readonlygroup v2c readonly view all included .1 access readonlygroup \"\" v2c noauth exact all none none access readonlygroup ctx_baicells v2c noauth prefix all none none proxy -Cn ctx_baicells -v 2c -c private 192.168.151.1 .1.3 This configuration allows us to access SNMP data on the EPC with the standard community string (refer to internal standards documentation). but will proxy the Baicells SNMP data when we send the community string \u2018enodeb\u2019 Update the snmpd service file to automatically restart snmpd on crash: Edit /lib/systemd/system/snmpd.service, modify the 'ExecStart' line, and add the 'ExecReload', 'Restart', and 'RestartSec' lines: [Unit] Description=Simple Network Management Protocol (SNMP) Daemon. After=network.target ConditionPathExists=/etc/snmp/snmpd.conf [Service] Type=simple ExecStartPre=/bin/mkdir -p /var/run/agentx ExecStart=/usr/sbin/snmpd -LO2w -u Debian-snmp -g Debian-snmp -I -smux,mteTrigger,mteTriggerConf -f -p /run/snmpd.pid ExecReload=/bin/kill -HUP $MAINPID Restart=on-failure RestartSec=5s [Install] WantedBy=multi-user.target Enable and restart snmpd: Sudo systemctl daemon-reload sudo systemctl enable snmpd sudo systemctl restart snmpd Baicells SNMP configuration Log into the Baicells configuration console: https:// From the left menu, select System Select SNMP Under \u2018SNMP Switch,\u2019 select \u2018Enable\u2019 Configure the following options: Community String: private Contact: lcl@seattlecommunitynetwork.org Location: \\ (String should not have any spaces) Source: Any Adding the Node to LibreNMS If the EPC is running, librenms should be able to auto-discover it. Run this command from a shell on the management host: sudo -u librenms lnms scan LibreNMS should print a status message that it was able to add a new device. When first discovered, the EPC will show up generically as it\u2019s ip address. Edit the hostname, but clicking \u2018Edit Device\u2019 (gear icon): Click the red pencil icon, and change the ip address to the hostname Fill \u2018Overwrite IP\u2019 with the EPC IP address Note: If the IP is not changed to the hostname, you will not be able to add the eNodeB by it\u2019s IP address The Baicells eNB needs to be added manually: From LibreNMS, select Devices and click \u201cAdd Device\u201d Add a new device, with the following configurations: Hostname: Community: \u2018enodeb\u2019 Force Add: On Note: If you receive an error message stating that a device with the specified IP already exists, make sure that you have successfully changed the eNodeB\u2019s hostname per the previous step. Once the device is added, click the \u2018Edit Device\u2019 icon (gear icon) and update the following values: Display name: \\ Overwrite device contact: lcl@seattlecommunitynetwork.org Other helpful notes: Baicells eNB config guide How to SSH into Baicells eNB: SSH using port 27149 (username same as normal web-based login) Convert the MAC address of this eNB to link local address: http://www.sput.nl/internet/ipv6/ll-mac.html","title":"Network Monitoring 2. LibreNMS Agent Configuration"},{"location":"tutorials/librenms-setup/#librenms-agent-configuration","text":"","title":"LibreNMS Agent Configuration"},{"location":"tutorials/librenms-setup/#adding-a-new-node-to-librenms","text":"Both the eNodeB and the EPC must be configured individually in order for them to report statistics to the SNMP Manager. Since the eNodeB is not directly accessible from the management VPN, we configure an SNMP proxy on the EPC to pass SNMP statistics to the Management host.","title":"Adding a New Node to LibreNMS"},{"location":"tutorials/librenms-setup/#epc-snmp-configuration","text":"Install snmpd to the EPC node: $ sudo apt install snmpd Modify /etc/snmp/snmpd.conf: sysLocation sysContact lcl@seattlecommunitynetwork.org sysServices 72 master agentx agentAddress udp:161 com2sec readonly com2sec -Cn ctx_baicells readonly enodeb group readonlygroup v2c readonly view all included .1 access readonlygroup \"\" v2c noauth exact all none none access readonlygroup ctx_baicells v2c noauth prefix all none none proxy -Cn ctx_baicells -v 2c -c private 192.168.151.1 .1.3 This configuration allows us to access SNMP data on the EPC with the standard community string (refer to internal standards documentation). but will proxy the Baicells SNMP data when we send the community string \u2018enodeb\u2019 Update the snmpd service file to automatically restart snmpd on crash: Edit /lib/systemd/system/snmpd.service, modify the 'ExecStart' line, and add the 'ExecReload', 'Restart', and 'RestartSec' lines: [Unit] Description=Simple Network Management Protocol (SNMP) Daemon. After=network.target ConditionPathExists=/etc/snmp/snmpd.conf [Service] Type=simple ExecStartPre=/bin/mkdir -p /var/run/agentx ExecStart=/usr/sbin/snmpd -LO2w -u Debian-snmp -g Debian-snmp -I -smux,mteTrigger,mteTriggerConf -f -p /run/snmpd.pid ExecReload=/bin/kill -HUP $MAINPID Restart=on-failure RestartSec=5s [Install] WantedBy=multi-user.target Enable and restart snmpd: Sudo systemctl daemon-reload sudo systemctl enable snmpd sudo systemctl restart snmpd","title":"EPC SNMP Configuration"},{"location":"tutorials/librenms-setup/#baicells-snmp-configuration","text":"Log into the Baicells configuration console: https:// From the left menu, select System Select SNMP Under \u2018SNMP Switch,\u2019 select \u2018Enable\u2019 Configure the following options: Community String: private Contact: lcl@seattlecommunitynetwork.org Location: \\ (String should not have any spaces) Source: Any","title":"Baicells SNMP configuration"},{"location":"tutorials/librenms-setup/#adding-the-node-to-librenms","text":"If the EPC is running, librenms should be able to auto-discover it. Run this command from a shell on the management host: sudo -u librenms lnms scan LibreNMS should print a status message that it was able to add a new device. When first discovered, the EPC will show up generically as it\u2019s ip address. Edit the hostname, but clicking \u2018Edit Device\u2019 (gear icon): Click the red pencil icon, and change the ip address to the hostname Fill \u2018Overwrite IP\u2019 with the EPC IP address Note: If the IP is not changed to the hostname, you will not be able to add the eNodeB by it\u2019s IP address The Baicells eNB needs to be added manually: From LibreNMS, select Devices and click \u201cAdd Device\u201d Add a new device, with the following configurations: Hostname: Community: \u2018enodeb\u2019 Force Add: On Note: If you receive an error message stating that a device with the specified IP already exists, make sure that you have successfully changed the eNodeB\u2019s hostname per the previous step. Once the device is added, click the \u2018Edit Device\u2019 icon (gear icon) and update the following values: Display name: \\ Overwrite device contact: lcl@seattlecommunitynetwork.org","title":"Adding the Node to LibreNMS"},{"location":"tutorials/librenms-setup/#other-helpful-notes","text":"Baicells eNB config guide How to SSH into Baicells eNB: SSH using port 27149 (username same as normal web-based login) Convert the MAC address of this eNB to link local address: http://www.sput.nl/internet/ipv6/ll-mac.html","title":"Other helpful notes:"},{"location":"tutorials/peering/","text":"Public ASN Peering Local Connectivity Lab operates AS54429 Our peering Policy is Yes Please contact us to peer with our network. Note this network is our public ASN, not the Seattle Community Network itself. If you would like to join the network visit our connect page. Seattle Community Network (SCN) is a community network dedicated to providing fair access to underserved communities all across the Puget Sound. Learn more on our FAQ . Peering Policy Local Connectivity Lab has an open peering policy. We have no requirements in terms of traffic, size, support/SLA, etc. We operate both IPv4 and IPv6. Peering via both protocols is appreciated. Locations Building Address Ports Westin 2001 6th Avenue, Seattle, WA 1G / 10G Exchanges Exchange City IPv4 IPv6 ASNs Routes Speed Seattle Internet Exchange (SIX) Seattle, WA 206.81.81.150 2001:504:16::d49d 336 ~192K 10G Peering Data ASN: 54429 Peering Contact: tech@seattlecommunitynetwork.org PeerDB Page: https://as54429.peeringdb.com As we are a non-profit, please consider providing as many routes as possible, including upstream or other routes.","title":"Public ASN Peering"},{"location":"tutorials/peering/#public-asn-peering","text":"","title":"Public ASN Peering"},{"location":"tutorials/peering/#local-connectivity-lab-operates-as54429","text":"","title":"Local Connectivity Lab operates AS54429"},{"location":"tutorials/peering/#our-peering-policy-is-yes","text":"Please contact us to peer with our network. Note this network is our public ASN, not the Seattle Community Network itself. If you would like to join the network visit our connect page. Seattle Community Network (SCN) is a community network dedicated to providing fair access to underserved communities all across the Puget Sound. Learn more on our FAQ .","title":"Our peering Policy is Yes"},{"location":"tutorials/peering/#peering-policy","text":"Local Connectivity Lab has an open peering policy. We have no requirements in terms of traffic, size, support/SLA, etc. We operate both IPv4 and IPv6. Peering via both protocols is appreciated.","title":"Peering Policy"},{"location":"tutorials/peering/#locations","text":"Building Address Ports Westin 2001 6th Avenue, Seattle, WA 1G / 10G","title":"Locations"},{"location":"tutorials/peering/#exchanges","text":"Exchange City IPv4 IPv6 ASNs Routes Speed Seattle Internet Exchange (SIX) Seattle, WA 206.81.81.150 2001:504:16::d49d 336 ~192K 10G","title":"Exchanges"},{"location":"tutorials/peering/#peering-data","text":"ASN: 54429 Peering Contact: tech@seattlecommunitynetwork.org PeerDB Page: https://as54429.peeringdb.com As we are a non-profit, please consider providing as many routes as possible, including upstream or other routes.","title":"Peering Data"},{"location":"tutorials/proxmox-vaultwarden-deployment/","text":"Deployed by: Esther Jang, Paul Phillion, Rudra Singh Section 1: What is Proxmox? Proxmox VE (Virtual Environment) is an open-source server management platform designed to deploy and manage virtual machines (VMs) and containers. It integrates KVM hypervisor and LXC containers, enabling users to manage virtual infrastructure through a web-based interface. Section 2: Access Requirements for Proxmox VE at Seattle Community Network To submit a request for a SCN self-hosted Proxmox VM on our private cloud, please fill out this form . If you are working on a project for SCN and need access to the Proxmox VE, please continue reading. Next, you will need access to the OpenVPN. Proxmox VE can only be accessed on the VPN. Specific details can be obtained from the SCN discord. Once connected to the VPN, a specific IP will be provided for you to access the Proxmox VE, where you can input your credentials. Section 3: Setting up your VM Install SSH Install Keys Test SSH CLI Section 4: SSH Troubleshooting Please let the SCN discord know if you have trouble SSH'ing in. A useful command during setup was sudo ufw status . If it is active, use ufw disable . The expected status should be inactive. If that still doesn\u2019t work, try restarting the VM from the Proxmox VE. Section 5: Beginning Deployment: Vaultwarden docker pull vaultwarden/server:latest docker run -d --name vaultwarden -v /vw-data/:/data/ --restart unless-stopped -p 80:80 vaultwarden/server:latest Section 6: Docker Compose Create a Docker Compose file: version: \"3\" services: vaultwarden: container_name: vaultwarden hostname: vaultwarden9 ports: - \"127.0.0.1:8080:80\" environment: - LOG_FILE=/log/access.log - LOG_LEVEL=info - EXTENDED_LOGGING=true image: vaultwarden/server:latest restart: unless-stopped volumes: - /opt/vw-data:/data - /var/log/vw:/log To start and run your container application in detached mode, use: docker-compose up -d docker-compose start docker-compose stop docker-compose restart Section 7: Azure DNS For this deployment, we're utilizing a public IP address. This address must be configured within Azure DNS to point to our chosen domain name. Navigate to Home - Microsoft Azure with your account. Open \u201cDNS zones\u201d. If you were using a private IP, you would use \u201cPrivate DNS zones\u201d. We will be creating a subdomain under seattlecommunitynetwork.org. Click on that, and under DNS management, click recordsets, and click add. Insert the beginning of the subdomain name, which in our case is \u201cvaultwarden\u201d. Below, under IP address, insert your IP, and create your new subdomain. Section 8: Enabling Nginx sudo apt update sudo apt install nginx sudo systemctl enable nginx sudo systemctl start nginx Next, go to /etc/nginx/sites-enabled/default . Delete everything inside default and paste this: # The `upstream` directives ensure that you have a http/1.1 connection # This enables the keepalive option and better performance # # Define the server IP and ports here. upstream vaultwarden-default { zone vaultwarden-default 64k; server 127.0.0.1:8080; keepalive 2; } # Needed to support websocket connections # See: https://nginx.org/en/docs/http/websocket.html # Instead of \"close\" as stated in the above link we send an empty value. # Else all keepalive connections will not work. map $http_upgrade $connection_upgrade { default upgrade; '' \"\"; } # Redirect HTTP to HTTPS server { listen 80; listen [::]:80; server_name vaultwarden.seattlecommunitynetwork.org; if ($host = vaultwarden.seattlecommunitynetwork.org) { return 301 https://$host$request_uri; } return 404; } server { # For older versions of nginx appened http2 to the listen line after ssl and remove `http2 on` listen 443 ssl; listen [::]:443 ssl; # http2 on; server_name vaultwarden.seattlecommunitynetwork.org; # Specify SSL Config when needed ssl_certificate /etc/path...; ssl_certificate_key /etc/path...; ssl_trusted_certificate /etc/path...; client_max_body_size 525M; location / { proxy_http_version 1.1; proxy_set_header Upgrade $http_upgrade; proxy_set_header Connection $connection_upgrade; proxy_set_header Host $host; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; proxy_set_header X-Forwarded-Proto $scheme; proxy_pass http://vaultwarden-default; } # Optionally add extra authentication besides the ADMIN_TOKEN # Remove the comments below `#` and create the htpasswd_file to have it active # #location /admin { # See: https://docs.nginx.com/nginx/admin-guide/security-controls/configuring-http-basic-authentication/ #auth_basic \"Administrator's Area\"; #3auth_basic_user_file /path/to/htpasswd_file; #proxy_http_version 1.1; #proxy_set_header Upgrade $http_upgrade; #proxy_set_header Connection $connection_upgrade; #proxy_set_header Host $host; #proxy_set_header X-Real-IP $remote_addr; #proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; #proxy_set_header X-Forwarded-Proto $scheme; #proxy_pass http://vaultwarden-default; } } Section 9: Obtain SSL Certificates sudo apt install certbot python3-certbot-nginx sudo certbot --nginx -d vaultwarden.seattlecommunitynetwork.org Certbot will modify your Nginx configuration to handle HTTPS and redirect from HTTP to HTTPS. Ensure that you copy the file paths provided at the conclusion of the certbot process into the default nginx configuration file, replacing the corresponding comments with these paths. Section 10: Ensure Everything is Running sudo systemctl status nginx Section 11: Additional Features Enabling admin panel: Go back to /etc/nginx/sites-enabled/default and uncomment the admin section at the bottom. Follow directions at Nginx Admin Guide to encrypt your admin password as a .env file (preferably using argon CLI). Once done, make sure you create a .env file in the directory where the compose file is with VAULTWARDEN_ADMIN_TOKEN=[insert your hashed admin token] . Then in your compose, add these two lines under environment: - ADMIN_TOKEN=${VAULTWARDEN_ADMIN_TOKEN} - DOMAIN=https://vaultwarden.seattlecommunitynetwork.org Restart the container and try logging into https://vaultwarden.seattlecommunitynetwork.org/admin . Once logged in, SMTP and 2FA enabling settings can be configured on the home page. Section 12: Data Backup Enabling backups for Vaultwarden is a simple process. Please review the attached backup bash script, which facilitates the transfer of Vaultwarden data to another virtual machine. Additionally, there is a cleanup bash script designed to retain only the most recent file in the other VM, deleting all others. Feel free to modify the scripts as necessary to suit your specific requirements. Backup script: #!/bin/bash docker-compose down datestamp=$(date +%m-%d-%Y) zip -9 -r /home/scn/backups/${datestamp}.zip /opt/vw-data* scp -i ~/.ssh-comm/id_rsa /home/scn/backups/${datestamp}.zip azureuser@[IP address]:~/backups/ docker-compose up -d Cleanup Script: #!/bin/bash # Define the directory containing backup files backup_dir=~/backups # Go to the backup directory cd \"$backup_dir\" || exit # Find and delete older backup files (excluding the latest day) find . -type f -name '*.zip' ! -mtime -1 -exec rm {} + # Exit exit 0 Section 13: Using the Backup To restore a data backup to the original virtual machine, simply unzip the file and delete the existing contents of /opt/vw-data . Then, transfer the contents of your zip file into this directory. Perform a quick restart of the container, and you will have successfully restored the version of the backup you selected.","title":"Proxmox Deployment Guide - Vaultwarden"},{"location":"tutorials/proxmox-vaultwarden-deployment/#deployed-by-esther-jang-paul-phillion-rudra-singh","text":"","title":"Deployed by: Esther Jang, Paul Phillion, Rudra Singh"},{"location":"tutorials/proxmox-vaultwarden-deployment/#section-1-what-is-proxmox","text":"Proxmox VE (Virtual Environment) is an open-source server management platform designed to deploy and manage virtual machines (VMs) and containers. It integrates KVM hypervisor and LXC containers, enabling users to manage virtual infrastructure through a web-based interface.","title":"Section 1: What is Proxmox?"},{"location":"tutorials/proxmox-vaultwarden-deployment/#section-2-access-requirements-for-proxmox-ve-at-seattle-community-network","text":"To submit a request for a SCN self-hosted Proxmox VM on our private cloud, please fill out this form . If you are working on a project for SCN and need access to the Proxmox VE, please continue reading. Next, you will need access to the OpenVPN. Proxmox VE can only be accessed on the VPN. Specific details can be obtained from the SCN discord. Once connected to the VPN, a specific IP will be provided for you to access the Proxmox VE, where you can input your credentials.","title":"Section 2: Access Requirements for Proxmox VE at Seattle Community Network"},{"location":"tutorials/proxmox-vaultwarden-deployment/#section-3-setting-up-your-vm","text":"","title":"Section 3: Setting up your VM"},{"location":"tutorials/proxmox-vaultwarden-deployment/#install-ssh","text":"","title":"Install SSH"},{"location":"tutorials/proxmox-vaultwarden-deployment/#install-keys","text":"","title":"Install Keys"},{"location":"tutorials/proxmox-vaultwarden-deployment/#test-ssh-cli","text":"","title":"Test SSH CLI"},{"location":"tutorials/proxmox-vaultwarden-deployment/#section-4-ssh-troubleshooting","text":"Please let the SCN discord know if you have trouble SSH'ing in. A useful command during setup was sudo ufw status . If it is active, use ufw disable . The expected status should be inactive. If that still doesn\u2019t work, try restarting the VM from the Proxmox VE.","title":"Section 4: SSH Troubleshooting"},{"location":"tutorials/proxmox-vaultwarden-deployment/#section-5-beginning-deployment-vaultwarden","text":"docker pull vaultwarden/server:latest docker run -d --name vaultwarden -v /vw-data/:/data/ --restart unless-stopped -p 80:80 vaultwarden/server:latest","title":"Section 5: Beginning Deployment: Vaultwarden"},{"location":"tutorials/proxmox-vaultwarden-deployment/#section-6-docker-compose","text":"Create a Docker Compose file: version: \"3\" services: vaultwarden: container_name: vaultwarden hostname: vaultwarden9 ports: - \"127.0.0.1:8080:80\" environment: - LOG_FILE=/log/access.log - LOG_LEVEL=info - EXTENDED_LOGGING=true image: vaultwarden/server:latest restart: unless-stopped volumes: - /opt/vw-data:/data - /var/log/vw:/log To start and run your container application in detached mode, use: docker-compose up -d docker-compose start docker-compose stop docker-compose restart","title":"Section 6: Docker Compose"},{"location":"tutorials/proxmox-vaultwarden-deployment/#section-7-azure-dns","text":"For this deployment, we're utilizing a public IP address. This address must be configured within Azure DNS to point to our chosen domain name. Navigate to Home - Microsoft Azure with your account. Open \u201cDNS zones\u201d. If you were using a private IP, you would use \u201cPrivate DNS zones\u201d. We will be creating a subdomain under seattlecommunitynetwork.org. Click on that, and under DNS management, click recordsets, and click add. Insert the beginning of the subdomain name, which in our case is \u201cvaultwarden\u201d. Below, under IP address, insert your IP, and create your new subdomain.","title":"Section 7: Azure DNS"},{"location":"tutorials/proxmox-vaultwarden-deployment/#section-8-enabling-nginx","text":"sudo apt update sudo apt install nginx sudo systemctl enable nginx sudo systemctl start nginx Next, go to /etc/nginx/sites-enabled/default . Delete everything inside default and paste this: # The `upstream` directives ensure that you have a http/1.1 connection # This enables the keepalive option and better performance # # Define the server IP and ports here. upstream vaultwarden-default { zone vaultwarden-default 64k; server 127.0.0.1:8080; keepalive 2; } # Needed to support websocket connections # See: https://nginx.org/en/docs/http/websocket.html # Instead of \"close\" as stated in the above link we send an empty value. # Else all keepalive connections will not work. map $http_upgrade $connection_upgrade { default upgrade; '' \"\"; } # Redirect HTTP to HTTPS server { listen 80; listen [::]:80; server_name vaultwarden.seattlecommunitynetwork.org; if ($host = vaultwarden.seattlecommunitynetwork.org) { return 301 https://$host$request_uri; } return 404; } server { # For older versions of nginx appened http2 to the listen line after ssl and remove `http2 on` listen 443 ssl; listen [::]:443 ssl; # http2 on; server_name vaultwarden.seattlecommunitynetwork.org; # Specify SSL Config when needed ssl_certificate /etc/path...; ssl_certificate_key /etc/path...; ssl_trusted_certificate /etc/path...; client_max_body_size 525M; location / { proxy_http_version 1.1; proxy_set_header Upgrade $http_upgrade; proxy_set_header Connection $connection_upgrade; proxy_set_header Host $host; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; proxy_set_header X-Forwarded-Proto $scheme; proxy_pass http://vaultwarden-default; } # Optionally add extra authentication besides the ADMIN_TOKEN # Remove the comments below `#` and create the htpasswd_file to have it active # #location /admin { # See: https://docs.nginx.com/nginx/admin-guide/security-controls/configuring-http-basic-authentication/ #auth_basic \"Administrator's Area\"; #3auth_basic_user_file /path/to/htpasswd_file; #proxy_http_version 1.1; #proxy_set_header Upgrade $http_upgrade; #proxy_set_header Connection $connection_upgrade; #proxy_set_header Host $host; #proxy_set_header X-Real-IP $remote_addr; #proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; #proxy_set_header X-Forwarded-Proto $scheme; #proxy_pass http://vaultwarden-default; } }","title":"Section 8: Enabling Nginx"},{"location":"tutorials/proxmox-vaultwarden-deployment/#section-9-obtain-ssl-certificates","text":"sudo apt install certbot python3-certbot-nginx sudo certbot --nginx -d vaultwarden.seattlecommunitynetwork.org Certbot will modify your Nginx configuration to handle HTTPS and redirect from HTTP to HTTPS. Ensure that you copy the file paths provided at the conclusion of the certbot process into the default nginx configuration file, replacing the corresponding comments with these paths.","title":"Section 9: Obtain SSL Certificates"},{"location":"tutorials/proxmox-vaultwarden-deployment/#section-10-ensure-everything-is-running","text":"sudo systemctl status nginx","title":"Section 10: Ensure Everything is Running"},{"location":"tutorials/proxmox-vaultwarden-deployment/#section-11-additional-features","text":"Enabling admin panel: Go back to /etc/nginx/sites-enabled/default and uncomment the admin section at the bottom. Follow directions at Nginx Admin Guide to encrypt your admin password as a .env file (preferably using argon CLI). Once done, make sure you create a .env file in the directory where the compose file is with VAULTWARDEN_ADMIN_TOKEN=[insert your hashed admin token] . Then in your compose, add these two lines under environment: - ADMIN_TOKEN=${VAULTWARDEN_ADMIN_TOKEN} - DOMAIN=https://vaultwarden.seattlecommunitynetwork.org Restart the container and try logging into https://vaultwarden.seattlecommunitynetwork.org/admin . Once logged in, SMTP and 2FA enabling settings can be configured on the home page.","title":"Section 11: Additional Features"},{"location":"tutorials/proxmox-vaultwarden-deployment/#section-12-data-backup","text":"Enabling backups for Vaultwarden is a simple process. Please review the attached backup bash script, which facilitates the transfer of Vaultwarden data to another virtual machine. Additionally, there is a cleanup bash script designed to retain only the most recent file in the other VM, deleting all others. Feel free to modify the scripts as necessary to suit your specific requirements. Backup script: #!/bin/bash docker-compose down datestamp=$(date +%m-%d-%Y) zip -9 -r /home/scn/backups/${datestamp}.zip /opt/vw-data* scp -i ~/.ssh-comm/id_rsa /home/scn/backups/${datestamp}.zip azureuser@[IP address]:~/backups/ docker-compose up -d Cleanup Script: #!/bin/bash # Define the directory containing backup files backup_dir=~/backups # Go to the backup directory cd \"$backup_dir\" || exit # Find and delete older backup files (excluding the latest day) find . -type f -name '*.zip' ! -mtime -1 -exec rm {} + # Exit exit 0","title":"Section 12: Data Backup"},{"location":"tutorials/proxmox-vaultwarden-deployment/#section-13-using-the-backup","text":"To restore a data backup to the original virtual machine, simply unzip the file and delete the existing contents of /opt/vw-data . Then, transfer the contents of your zip file into this directory. Perform a quick restart of the container, and you will have successfully restored the version of the backup you selected.","title":"Section 13: Using the Backup"},{"location":"tutorials/software/","text":"Our Software Here is a list of the software that we use to deploy, maintain, and plan our network sites. Networking Local Services We use the CoLTE project maintained by the University of Washington ICTD Lab to provide services such as network monitoring, web-based administration, and local web and DNS serving/caching. Evolved Packet Core (EPC) Our EPC is powered by Open5GS , an open-source project for 4G and 5G core networks. Currently all of our networks are 4G networks. Spectrum Access System (SAS) We have a partnership with Google SAS to gain access to CBRS spectrum. Learn more about our SAS setup here . Network Monitoring and Alerting We use LibreNMS and SNMPd to monitor our nodes and provide alerting. Our Baicells-specific Network Manager setup is documented here , and our instructions for configuring a new node can be found here . Field Measurement Network Performance Measurement Tool The LCL Network Performance Measurement Tool is an Android App in development that will measure a variety of network metrics, including but not limited to ping, upload/download speed, signal strength. We will use this tool to easily capture and upload network metrics in the field so that we can provide better estimates of what kind of Internet access that our users can expect to receive. Network Cell Info Lite Network Cell Info Lite is an Android App on the Google Playstore that is free to use (with advertisements) and is capable of taking network metric measurements and recording them to upload. This is an option that we use but are not satisfied with for many reasons, which is why we are developing our own app. Site Planning Google Earth We primarily use the Google Earth Pro desktop application to do a rough line-of-sight evaluation. We perform what is called a \"viewshed analysis\" that allows us to determine what is visible from a specific point on Earth (e.g. a rooftop). Ubiquiti Line of Sight A web-based line of sight tool provided by Ubiquiti that contains helpful altitude data and diagrams. A drawback is that it is specialized to provide data for Ubiquiti devices only. Other resources Facebook ISP Toolbox Line of Sight A web-based line of sight tool provided by Facebook Connectivity that utilizes public LiDAR data. Unfortunately LiDAR data for the Seattle area is not present yet, although there is data for some areas in Tacoma. Facebook ISP Toolbox Market Evaluator A web-based market evaluator provided by Facebook Connectivity that can be used to provide more context about the areas around potential network sites. It offers information about other service providers in the area, average household income, median speeds, and current lowest broadband price available.","title":"Software Overview"},{"location":"tutorials/software/#our-software","text":"Here is a list of the software that we use to deploy, maintain, and plan our network sites.","title":"Our Software"},{"location":"tutorials/software/#networking","text":"","title":"Networking"},{"location":"tutorials/software/#local-services","text":"We use the CoLTE project maintained by the University of Washington ICTD Lab to provide services such as network monitoring, web-based administration, and local web and DNS serving/caching.","title":"Local Services"},{"location":"tutorials/software/#evolved-packet-core-epc","text":"Our EPC is powered by Open5GS , an open-source project for 4G and 5G core networks. Currently all of our networks are 4G networks.","title":"Evolved Packet Core (EPC)"},{"location":"tutorials/software/#spectrum-access-system-sas","text":"We have a partnership with Google SAS to gain access to CBRS spectrum. Learn more about our SAS setup here .","title":"Spectrum Access System (SAS)"},{"location":"tutorials/software/#network-monitoring-and-alerting","text":"We use LibreNMS and SNMPd to monitor our nodes and provide alerting. Our Baicells-specific Network Manager setup is documented here , and our instructions for configuring a new node can be found here .","title":"Network Monitoring and Alerting"},{"location":"tutorials/software/#field-measurement","text":"","title":"Field Measurement"},{"location":"tutorials/software/#network-performance-measurement-tool","text":"The LCL Network Performance Measurement Tool is an Android App in development that will measure a variety of network metrics, including but not limited to ping, upload/download speed, signal strength. We will use this tool to easily capture and upload network metrics in the field so that we can provide better estimates of what kind of Internet access that our users can expect to receive.","title":"Network Performance Measurement Tool"},{"location":"tutorials/software/#network-cell-info-lite","text":"Network Cell Info Lite is an Android App on the Google Playstore that is free to use (with advertisements) and is capable of taking network metric measurements and recording them to upload. This is an option that we use but are not satisfied with for many reasons, which is why we are developing our own app.","title":"Network Cell Info Lite"},{"location":"tutorials/software/#site-planning","text":"","title":"Site Planning"},{"location":"tutorials/software/#google-earth","text":"We primarily use the Google Earth Pro desktop application to do a rough line-of-sight evaluation. We perform what is called a \"viewshed analysis\" that allows us to determine what is visible from a specific point on Earth (e.g. a rooftop).","title":"Google Earth"},{"location":"tutorials/software/#ubiquiti-line-of-sight","text":"A web-based line of sight tool provided by Ubiquiti that contains helpful altitude data and diagrams. A drawback is that it is specialized to provide data for Ubiquiti devices only.","title":"Ubiquiti Line of Sight"},{"location":"tutorials/software/#other-resources","text":"","title":"Other resources"},{"location":"tutorials/software/#facebook-isp-toolbox-line-of-sight","text":"A web-based line of sight tool provided by Facebook Connectivity that utilizes public LiDAR data. Unfortunately LiDAR data for the Seattle area is not present yet, although there is data for some areas in Tacoma.","title":"Facebook ISP Toolbox Line of Sight"},{"location":"tutorials/software/#facebook-isp-toolbox-market-evaluator","text":"A web-based market evaluator provided by Facebook Connectivity that can be used to provide more context about the areas around potential network sites. It offers information about other service providers in the area, average household income, median speeds, and current lowest broadband price available.","title":"Facebook ISP Toolbox Market Evaluator"},{"location":"tutorials/librenms/backup/","text":"Backing Up In the future when we want to back up the rrd folder of a docker install, you just need to copy the compose/librenms/rrd folder. If you want to back up the database, you need to go into the container called librenms_db and do a mysqldump with the user librenms with the database librenms and whatever password you set, probably in the environment variables of the compose file of the deployment This means something like mysqldump librenms -u librenms --password= > librenms.sql","title":"Backing Up"},{"location":"tutorials/librenms/backup/#backing-up","text":"In the future when we want to back up the rrd folder of a docker install, you just need to copy the compose/librenms/rrd folder. If you want to back up the database, you need to go into the container called librenms_db and do a mysqldump with the user librenms with the database librenms and whatever password you set, probably in the environment variables of the compose file of the deployment This means something like mysqldump librenms -u librenms --password= > librenms.sql","title":"Backing Up"},{"location":"tutorials/librenms/deploy/","text":"Deploying I wrote a script to deploy libreNMS with the configuration that SCN uses. The repo is here Software requirements Only tested on debian and ubuntu. Not sure what else it works on but it could work on other linux distros Steps Install docker if it is not installed already Install docker compose if it is not installed already Instal unzip if it is not installed already Check out this repo If you want to restore a previous install, provide a sqldump named librenms.sql flat in this checked out repo. There is a helper script called get_database_from_currently_running_server.sh to get the database off of the non dockerized install (needs ssh access to the server) If you want to restore the graphs too, you can provide a file named rrd.zip flat in the checked out repo which is just the rrd folder ziped up. There is a helper script called get_rrd_zip_from_currently_running_server.sh to get the rrd zip from the non dockerized install (needs ssh access to the server) Run ./deploy.sh builds the librenms image builds the database image with/without the backup Starts the service using docker compose . This creates 2 shared volumes in the compose directory The librenms folder is for the librenms docker images to share configuration data including rrd files The db volume is the database unzips the rrd folder in the rrd directory of the shared librenms volume The UI will run on port 8000","title":"Deploying"},{"location":"tutorials/librenms/deploy/#deploying","text":"I wrote a script to deploy libreNMS with the configuration that SCN uses. The repo is here","title":"Deploying"},{"location":"tutorials/librenms/deploy/#software-requirements","text":"Only tested on debian and ubuntu. Not sure what else it works on but it could work on other linux distros","title":"Software requirements"},{"location":"tutorials/librenms/deploy/#steps","text":"Install docker if it is not installed already Install docker compose if it is not installed already Instal unzip if it is not installed already Check out this repo If you want to restore a previous install, provide a sqldump named librenms.sql flat in this checked out repo. There is a helper script called get_database_from_currently_running_server.sh to get the database off of the non dockerized install (needs ssh access to the server) If you want to restore the graphs too, you can provide a file named rrd.zip flat in the checked out repo which is just the rrd folder ziped up. There is a helper script called get_rrd_zip_from_currently_running_server.sh to get the rrd zip from the non dockerized install (needs ssh access to the server) Run ./deploy.sh builds the librenms image builds the database image with/without the backup Starts the service using docker compose . This creates 2 shared volumes in the compose directory The librenms folder is for the librenms docker images to share configuration data including rrd files The db volume is the database unzips the rrd folder in the rrd directory of the shared librenms volume The UI will run on port 8000","title":"Steps"},{"location":"tutorials/librenms/upgrade/","text":"Upgrading Upgrading can be segmented into 2 parts. The container OSses and the service OS Each container runs an OS - The Maria db container is based on ubuntu, so you can just do sudo apt update and sudo apt upgrade when executing bash on the container - The Redis container for some reason only has an ash executable installed on the container. Also it runs on alpine so it can be updated using apk update and apk upgrade - The libreNMS and the libreNMS dispatcher container is instantiaated on the same container which is on alpine, and uses bash. Update as usual for alpine installs. Service I think that libreNMS vends a script called daily.sh (librenms docs here ) that is added to the cron, but cron is not running on docker containers since each container only runs one process. Even if we manually run daily.sh, there are errors. I think that the docs also give a manually manual way to update, by doing a git clone, but since the librenms files were not pulled using git, we cant use this way. I tried using rsync to overwrite the old files with the new files, but there are some issues. The nuclear option can be used, which is remove the containers, build new updated ones, and start that, but this will include a small outage Go to the compose directory and run sudo docker compose down to stop and remove all the containers. We store data (rrd files and the database) in a docker volume inside the compose directory anyway so we should not need to worry about removing containers removing any data Go to the librenms_image directory, change the version of the image to the latest version here run sudo docker build . -t scn-librenms , which should build the new image go to the db_image directory and update the Dockerfile's version to the latest version here run sudo docker build . -t scn_mariadb_librenms go to the compose directory and update the compose.yml file to use the latest redis release here Then you should be able to start the service with a sudo docker compose -f compose/compose.yml up -d The service should come up as it was before. If it does not, you may have to do a ./lnms migrate","title":"Upgrading"},{"location":"tutorials/librenms/upgrade/#upgrading","text":"Upgrading can be segmented into 2 parts. The container OSses and the service","title":"Upgrading"},{"location":"tutorials/librenms/upgrade/#os","text":"Each container runs an OS - The Maria db container is based on ubuntu, so you can just do sudo apt update and sudo apt upgrade when executing bash on the container - The Redis container for some reason only has an ash executable installed on the container. Also it runs on alpine so it can be updated using apk update and apk upgrade - The libreNMS and the libreNMS dispatcher container is instantiaated on the same container which is on alpine, and uses bash. Update as usual for alpine installs.","title":"OS"},{"location":"tutorials/librenms/upgrade/#service","text":"I think that libreNMS vends a script called daily.sh (librenms docs here ) that is added to the cron, but cron is not running on docker containers since each container only runs one process. Even if we manually run daily.sh, there are errors. I think that the docs also give a manually manual way to update, by doing a git clone, but since the librenms files were not pulled using git, we cant use this way. I tried using rsync to overwrite the old files with the new files, but there are some issues. The nuclear option can be used, which is remove the containers, build new updated ones, and start that, but this will include a small outage Go to the compose directory and run sudo docker compose down to stop and remove all the containers. We store data (rrd files and the database) in a docker volume inside the compose directory anyway so we should not need to worry about removing containers removing any data Go to the librenms_image directory, change the version of the image to the latest version here run sudo docker build . -t scn-librenms , which should build the new image go to the db_image directory and update the Dockerfile's version to the latest version here run sudo docker build . -t scn_mariadb_librenms go to the compose directory and update the compose.yml file to use the latest redis release here Then you should be able to start the service with a sudo docker compose -f compose/compose.yml up -d The service should come up as it was before. If it does not, you may have to do a ./lnms migrate","title":"Service"}]}
\ No newline at end of file
+{"config":{"indexing":"full","lang":["en"],"min_search_length":3,"prebuild_index":false,"separator":"[\\s\\-]+"},"docs":[{"location":"","text":"Seattle Community Network Docs Welcome to the documentation website for the Seattle Community Network ! If you're looking for our main website, it is located at https://www.seattlecommunitynetwork.org . You're in the Right Place Seattle Community Network has a place for everyone . Whether you'd like to join to get free Internet , get involved to help out your community, learn some skills so that you can get a job, or all of the above! PRO TIP We are a community . It's in our name! So, why not start by joining our community ? It's easy. What's here? Some topics you can find on this website include: FAQ - get the answers to some common questions. Community - get involved and learn more about our community, our rules, and what we're up to. Learn - gain some new skills that you can use to help out with our networks. Infrastructure - get the details on how our networks work behind the scenes.","title":"Home"},{"location":"#seattle-community-network-docs","text":"Welcome to the documentation website for the Seattle Community Network ! If you're looking for our main website, it is located at https://www.seattlecommunitynetwork.org .","title":"Seattle Community Network Docs"},{"location":"#youre-in-the-right-place","text":"Seattle Community Network has a place for everyone . Whether you'd like to join to get free Internet , get involved to help out your community, learn some skills so that you can get a job, or all of the above! PRO TIP We are a community . It's in our name! So, why not start by joining our community ? It's easy.","title":"You're in the Right Place"},{"location":"#whats-here","text":"Some topics you can find on this website include: FAQ - get the answers to some common questions. Community - get involved and learn more about our community, our rules, and what we're up to. Learn - gain some new skills that you can use to help out with our networks. Infrastructure - get the details on how our networks work behind the scenes.","title":"What's here?"},{"location":"community/code-of-conduct/","text":"Code of Conduct The Seattle Community Network (SCN) is dedicated to fostering an environment in which everyone can participate in our meetups, installs, online spaces, and any other community event. We believe that diversity in our community is critical and should be celebrated. We welcome everyone of any race, age, gender, nationality, gender identity and expression, sexual orientation, disability, physical appearance, body size, religion, education, and skill level. The SCN community and experience often extends outside those spaces. Members meet in person to collaborate on projects, attend related meetups or conferences together, and communicate on social media. Abusive or unwelcoming behavior between SCN Members still has a profound impact on individuals and on the community when it happens beyond our events and online forums. We will use our discretion when deciding whether to enforce this code of conduct after reports of such behavior happening outside of our spaces, taking into account the impact on the individual Members involved as well as the impact on the community at large. Types of Behavior Encouraged Behavior All participants are expected to: be considerate, respectful, and collaborative. Specifically we expect participants to: Demonstrate empathy, kindness, and patience toward other people Assume the best intentions from others Be respectful of differing opinions, viewpoints, and experiences Give and gracefully accept constructive feedback Accept responsibility and apologize to those affected by our mistakes, and learn from the experience Focus on what is best not just for us as individuals, but for the overall community Unacceptable Behavior The following types of behavior are unacceptable at SCN, both online and in-person, and constitute code of conduct violations. Abusive Behavior Harassment Offensive verbal comments related to gender, sexual orientation, disability, physical appearance, body size, race, nationality, immigration status, language, religion, or education level Sexual images in public spaces, unwelcome sexual or romantic attention, and inappropriate physical contact. Threats Threating someone physically or verbally. For example, threatening to publicize sensitive information about someone's personal life Hacking Any kind of malicious or harmful behavior towards other network users and their devices/data/property, or towards the network and its equipment or normal functioning. For example, DDOS attacks or unauthorized remote access. Unwelcoming Behavior Blatant -isms Saying things that are explicitly racist, sexist, homophobic, etc. For example, arguing that some people are less intelligent because of their gender, race or religion. Subtle -isms and small mistakes made in conversation are not code of conduct violations. However, repeating something after it has been pointed out to you that you made a member feel unwelcome, broke a social rule or antagonizing or arguing with someone who has pointed out your subtle -ism is considered unwelcoming behavior and is not allowed in SCN. Maliciousness towards other members Deliberately attempting to make others feel bad, name-calling, singling out others for derision or exclusion. For example, telling somone they're not technical enough or that they don't belong in SCN. Being especially unpleasant For example, if we've received reports from multiple members of annoying, rude, or especially distracting behavior. For example, repeatedly engaging in bad faith arguments, talking down to people, or excluding people from participation. Reporting Please report code of conduct violations either to the event organizer, by emailing lcl@seattlecommunitynetwork.org or by alerting moderators on Discord with the @moderators group tag. All of our moderators are volunteers, and will response with their best effort. However, if you provide your name, or contact info we promise to respond within two business days. How to Report In your report, please include: Subject line \"[SCN Code of Conduct Violation Report]\" followed by descriptive subject Your name This is incredibly helpful for us to be able to follow up with you, and ask questions to better understand the situation. You are welcome to report anonymously. Please only use this option if you really need to, and know that we might not be able to take action without knowing who you are. In any case, provide an email address so we can correspond with you about the report. A detailed description of what happened If the violation happened online, please link to or send us the relevant text. If the violation happened in person, please detail exactly what the other person said or did. In order to take action, we need to know the concrete actions that someone took. Where and when the incident happened Any other relevant context. Do you have examples of a pattern of similar behavior? Do you have a relationship with this person outside of SCN? If/how you've already responded - this lets us know the current state of the situation. Why to Report You are responsible for making SCN a safe and comfortable space for everyone. Everyone in our community shares this responsibility. Our volunteer Moderators are not around all the time, so we cannot enforce the code of conduct without your help. The consequences for SCN of not reporting bad behavior outweigh the consequences for one person reporting it. We sometimes hear \u201cI don\u2019t want X person to meet consequences because I told someone about their bad behavior.\u201d Consider the impact on everyone else at SCN of letting their behavior continue unchecked. SCN only works as a self-directed, community-driven effort because of shared trust between members. Reporting code of conduct violations helps us identify when this trust is broken, to prevent that from happening in the future. Enforcement Guidelines Moderators will follow these Community Impact Guidelines in determining the consequences for any action they deem in violation of this Code of Conduct. Correction Community Impact: Unwelcoming behavior. Use of inappropriate language or other behavior deemed unprofessional or unwelcome in the community. Consequence: A private, written warning from moderators, providing clarity around the nature of the violation and an explanation of why the behavior was inappropriate. A public or private apology may be requested in the venue where the behavior took place, for example on Discord or at the event. Warning Community Impact: A violation through a single incident of abusive behavior or series of unwelcoming behaviors. Consequence: A warning with consequences for continued behavior. No interaction with the people involved, including unsolicited interaction with those enforcing the Code of Conduct, for a specified period of time. This includes avoiding interactions in community spaces as well as external channels like social media. Violating these terms may lead to a temporary or permanent ban. Temporary Ban Community Impact: A serious violation of community standards, including sustained unwelcoming behavior. Consequence: A temporary ban from any sort of participation, interaction, or public communication with the community for a specified period of time. No public or private interaction with the people involved, including unsolicited interaction with those enforcing the Code of Conduct, is allowed during this period. Violating these terms may lead to a permanent ban. Permanent Ban Community Impact: Demonstrating a pattern of violation of community standards, including sustained unwelcoming behavior, harassment or threatening of an individual, or aggression toward or disparagement of classes of individuals. Consequence: A permanent ban from any sort of participation, or public interaction within the community. Discussion If you have questions about any aspect of the code of conduct, or want to propose amending it, please contact the @moderators group, or drop in to the public #governance channel on Discord. Attribution Taken almost verbatim from the NYC Mesh Code of Conduct . NYC Mesh CoC Attribution: Most of this is from the Recurse Center CoC. Other parts are from Strange Loop(community goals), Contributor Covenant (portion of the community goals, encouraged behaviors, enforcement guidelines), and the Toronto Mesh/Geek Feminism (guidelines for moderators).","title":"Code of Conduct"},{"location":"community/code-of-conduct/#code-of-conduct","text":"The Seattle Community Network (SCN) is dedicated to fostering an environment in which everyone can participate in our meetups, installs, online spaces, and any other community event. We believe that diversity in our community is critical and should be celebrated. We welcome everyone of any race, age, gender, nationality, gender identity and expression, sexual orientation, disability, physical appearance, body size, religion, education, and skill level. The SCN community and experience often extends outside those spaces. Members meet in person to collaborate on projects, attend related meetups or conferences together, and communicate on social media. Abusive or unwelcoming behavior between SCN Members still has a profound impact on individuals and on the community when it happens beyond our events and online forums. We will use our discretion when deciding whether to enforce this code of conduct after reports of such behavior happening outside of our spaces, taking into account the impact on the individual Members involved as well as the impact on the community at large.","title":"Code of Conduct"},{"location":"community/code-of-conduct/#types-of-behavior","text":"","title":"Types of Behavior"},{"location":"community/code-of-conduct/#encouraged-behavior","text":"All participants are expected to: be considerate, respectful, and collaborative. Specifically we expect participants to: Demonstrate empathy, kindness, and patience toward other people Assume the best intentions from others Be respectful of differing opinions, viewpoints, and experiences Give and gracefully accept constructive feedback Accept responsibility and apologize to those affected by our mistakes, and learn from the experience Focus on what is best not just for us as individuals, but for the overall community","title":"Encouraged Behavior"},{"location":"community/code-of-conduct/#unacceptable-behavior","text":"The following types of behavior are unacceptable at SCN, both online and in-person, and constitute code of conduct violations.","title":"Unacceptable Behavior"},{"location":"community/code-of-conduct/#abusive-behavior","text":"Harassment Offensive verbal comments related to gender, sexual orientation, disability, physical appearance, body size, race, nationality, immigration status, language, religion, or education level Sexual images in public spaces, unwelcome sexual or romantic attention, and inappropriate physical contact. Threats Threating someone physically or verbally. For example, threatening to publicize sensitive information about someone's personal life Hacking Any kind of malicious or harmful behavior towards other network users and their devices/data/property, or towards the network and its equipment or normal functioning. For example, DDOS attacks or unauthorized remote access.","title":"Abusive Behavior"},{"location":"community/code-of-conduct/#unwelcoming-behavior","text":"Blatant -isms Saying things that are explicitly racist, sexist, homophobic, etc. For example, arguing that some people are less intelligent because of their gender, race or religion. Subtle -isms and small mistakes made in conversation are not code of conduct violations. However, repeating something after it has been pointed out to you that you made a member feel unwelcome, broke a social rule or antagonizing or arguing with someone who has pointed out your subtle -ism is considered unwelcoming behavior and is not allowed in SCN. Maliciousness towards other members Deliberately attempting to make others feel bad, name-calling, singling out others for derision or exclusion. For example, telling somone they're not technical enough or that they don't belong in SCN. Being especially unpleasant For example, if we've received reports from multiple members of annoying, rude, or especially distracting behavior. For example, repeatedly engaging in bad faith arguments, talking down to people, or excluding people from participation.","title":"Unwelcoming Behavior"},{"location":"community/code-of-conduct/#reporting","text":"Please report code of conduct violations either to the event organizer, by emailing lcl@seattlecommunitynetwork.org or by alerting moderators on Discord with the @moderators group tag. All of our moderators are volunteers, and will response with their best effort. However, if you provide your name, or contact info we promise to respond within two business days.","title":"Reporting"},{"location":"community/code-of-conduct/#how-to-report","text":"In your report, please include: Subject line \"[SCN Code of Conduct Violation Report]\" followed by descriptive subject Your name This is incredibly helpful for us to be able to follow up with you, and ask questions to better understand the situation. You are welcome to report anonymously. Please only use this option if you really need to, and know that we might not be able to take action without knowing who you are. In any case, provide an email address so we can correspond with you about the report. A detailed description of what happened If the violation happened online, please link to or send us the relevant text. If the violation happened in person, please detail exactly what the other person said or did. In order to take action, we need to know the concrete actions that someone took. Where and when the incident happened Any other relevant context. Do you have examples of a pattern of similar behavior? Do you have a relationship with this person outside of SCN? If/how you've already responded - this lets us know the current state of the situation.","title":"How to Report"},{"location":"community/code-of-conduct/#why-to-report","text":"You are responsible for making SCN a safe and comfortable space for everyone. Everyone in our community shares this responsibility. Our volunteer Moderators are not around all the time, so we cannot enforce the code of conduct without your help. The consequences for SCN of not reporting bad behavior outweigh the consequences for one person reporting it. We sometimes hear \u201cI don\u2019t want X person to meet consequences because I told someone about their bad behavior.\u201d Consider the impact on everyone else at SCN of letting their behavior continue unchecked. SCN only works as a self-directed, community-driven effort because of shared trust between members. Reporting code of conduct violations helps us identify when this trust is broken, to prevent that from happening in the future.","title":"Why to Report"},{"location":"community/code-of-conduct/#enforcement-guidelines","text":"Moderators will follow these Community Impact Guidelines in determining the consequences for any action they deem in violation of this Code of Conduct.","title":"Enforcement Guidelines"},{"location":"community/code-of-conduct/#correction","text":"Community Impact: Unwelcoming behavior. Use of inappropriate language or other behavior deemed unprofessional or unwelcome in the community. Consequence: A private, written warning from moderators, providing clarity around the nature of the violation and an explanation of why the behavior was inappropriate. A public or private apology may be requested in the venue where the behavior took place, for example on Discord or at the event.","title":"Correction"},{"location":"community/code-of-conduct/#warning","text":"Community Impact: A violation through a single incident of abusive behavior or series of unwelcoming behaviors. Consequence: A warning with consequences for continued behavior. No interaction with the people involved, including unsolicited interaction with those enforcing the Code of Conduct, for a specified period of time. This includes avoiding interactions in community spaces as well as external channels like social media. Violating these terms may lead to a temporary or permanent ban.","title":"Warning"},{"location":"community/code-of-conduct/#temporary-ban","text":"Community Impact: A serious violation of community standards, including sustained unwelcoming behavior. Consequence: A temporary ban from any sort of participation, interaction, or public communication with the community for a specified period of time. No public or private interaction with the people involved, including unsolicited interaction with those enforcing the Code of Conduct, is allowed during this period. Violating these terms may lead to a permanent ban.","title":"Temporary Ban"},{"location":"community/code-of-conduct/#permanent-ban","text":"Community Impact: Demonstrating a pattern of violation of community standards, including sustained unwelcoming behavior, harassment or threatening of an individual, or aggression toward or disparagement of classes of individuals. Consequence: A permanent ban from any sort of participation, or public interaction within the community.","title":"Permanent Ban"},{"location":"community/code-of-conduct/#discussion","text":"If you have questions about any aspect of the code of conduct, or want to propose amending it, please contact the @moderators group, or drop in to the public #governance channel on Discord.","title":"Discussion"},{"location":"community/code-of-conduct/#attribution","text":"Taken almost verbatim from the NYC Mesh Code of Conduct . NYC Mesh CoC Attribution: Most of this is from the Recurse Center CoC. Other parts are from Strange Loop(community goals), Contributor Covenant (portion of the community goals, encouraged behaviors, enforcement guidelines), and the Toronto Mesh/Geek Feminism (guidelines for moderators).","title":"Attribution"},{"location":"community/community-networking-toolkit/","text":"Community Networking Toolkit This is a toolkit/resource guide for anyone interested in starting up their own community network. Recommended Deployment Kit Here is a spreadsheet containing a bunch of tools and equipment that you should bring to network deployments. This was created by Esther Jang who has a lot of practical experience deploying sites. This spreadsheet is color-coded into different categories based on how important they are to have! Ethernet Crimping Ethernet crimping is an important skill for network site installations. The length of an ethernet cable connection is only truly known once you're on site so it is useful to be able to quickly cut ethernet cable to the desired length and crimp it. Our Guide to Crimping Workshop Slides Crimping Video Cable Testing Video (first 7 min only for basics) Ethernet Color Coding Diagrams Both the T-568A and the T-568B standard Straight-Through cables are used most often as patch cords for your Ethernet connections. If you require a cable to connect two Ethernet devices directly together without a hub or when you connect two hubs together, you will need to use a Crossover cable instead. Internet Society (ISOC) Materials Introduction to Community Networks All-aspects Community Networking Guides AlterMundi (Spanish Language) NYC Mesh - How to start a community network NYC Mesh Docs Telecommunications Reclaimed - Linked from NYC Mesh guide Start your own ISP This site is dedicated to helping you start your own Internet Service Provider. Specifically this guide is about building a Wireless ISP (WISP). Commotion Construction Kit The Commotion Construction Kit is a set of documentation tools that the Open Technology Institute has used in workshops around the world and at home. It is a \u201cdo it ourselves\u201d guide to building community wireless networks. Neighborhood Network Construction Kit The Neighborhood Network Construction Kit is a set of documentation tools that the Open Technology Institute has used in workshops around the world and at home. It is a \u201cdo it ourselves\u201d guide to building community wireless networks. Many of these activities were first released as part of the Commotion project. Community Technology Field Guide A collective resource for digital stewardship, digital justice and community infrastructure. These resources emphasize self-governance, participatory learning, collaborative design and sustainability. Building Broadband Commons - Tools for Planners and Communities Next Century City - Becoming Broadband Ready, a Toolkit for Communities Wireless Networking in the Developing World - Online Book Wireless Networking in the Developing World is a free book about designing, implementing, and maintaining low-cost wireless networks. Community Networks in Comics It is not easy to explain the concepts behind community networks, both the technical characteristics of radio frequency networks and the social and human aspects of community technologies. Teaching a workshop for popular groups using colonizing terms and methodologies can increase the existing barrier between people and a technology that was not created for their interests. With this in mind, images and analogies are powerful tools to make it easier to explain a technical term or an idea. We reject the premise that to do so would in any way underestimate people\u2019s ability to understand technical matters. Building Consentful Tech Zine In 2017, Una Lee, Dann Toliver, and their design firm And Also Too published the Building Consentful Tech Zine as a provocation on how to think about and design for consentfulness. This framing really resonated with our group, so we expanded it into a project where we prototype what this looks like in practice (and learned some interaction design methodologies on the way)! Report on Digital Skill Sets for Diverse Users The City of Seattle, in partnership with Technology and Social Change Group (TASCHA), developed a set of Digital Equity Indicators that helps measure Seattle\u2019s progress in meeting the initiative's goals. What digital skills do existing frameworks and curricula cover? What digital skills should the City and partners recommend to digital skill instructors to teach and promote? Do these resources have corresponding assessments to help assess individuals\u2019 digital skill abilities? Worksheet for Digital Skills for Diverse Users A list of 74 skills identified by TASCHA (see above resource) to include in digital equity curriculums Report on current state of Detroit Community Network In this case study, we focus on Detroit and the predominantly Black and lower-income neighborhood of the North End as an example of innovative, community-scale projects that are locally generated. New Community Networks by Douglas Schuler Online book about building and socially sustaining community networks, based on Doug Schuler's experiences with the Seattle Community Network project in the 90's (1996)","title":"Community Networking Toolkit"},{"location":"community/community-networking-toolkit/#community-networking-toolkit","text":"This is a toolkit/resource guide for anyone interested in starting up their own community network.","title":"Community Networking Toolkit"},{"location":"community/community-networking-toolkit/#recommended-deployment-kit","text":"Here is a spreadsheet containing a bunch of tools and equipment that you should bring to network deployments. This was created by Esther Jang who has a lot of practical experience deploying sites. This spreadsheet is color-coded into different categories based on how important they are to have!","title":"Recommended Deployment Kit"},{"location":"community/community-networking-toolkit/#ethernet-crimping","text":"Ethernet crimping is an important skill for network site installations. The length of an ethernet cable connection is only truly known once you're on site so it is useful to be able to quickly cut ethernet cable to the desired length and crimp it. Our Guide to Crimping Workshop Slides Crimping Video Cable Testing Video (first 7 min only for basics) Ethernet Color Coding Diagrams Both the T-568A and the T-568B standard Straight-Through cables are used most often as patch cords for your Ethernet connections. If you require a cable to connect two Ethernet devices directly together without a hub or when you connect two hubs together, you will need to use a Crossover cable instead.","title":"Ethernet Crimping"},{"location":"community/community-networking-toolkit/#internet-society-isoc-materials","text":"Introduction to Community Networks","title":"Internet Society (ISOC) Materials"},{"location":"community/community-networking-toolkit/#all-aspects-community-networking-guides","text":"AlterMundi (Spanish Language) NYC Mesh - How to start a community network NYC Mesh Docs Telecommunications Reclaimed - Linked from NYC Mesh guide Start your own ISP This site is dedicated to helping you start your own Internet Service Provider. Specifically this guide is about building a Wireless ISP (WISP). Commotion Construction Kit The Commotion Construction Kit is a set of documentation tools that the Open Technology Institute has used in workshops around the world and at home. It is a \u201cdo it ourselves\u201d guide to building community wireless networks. Neighborhood Network Construction Kit The Neighborhood Network Construction Kit is a set of documentation tools that the Open Technology Institute has used in workshops around the world and at home. It is a \u201cdo it ourselves\u201d guide to building community wireless networks. Many of these activities were first released as part of the Commotion project. Community Technology Field Guide A collective resource for digital stewardship, digital justice and community infrastructure. These resources emphasize self-governance, participatory learning, collaborative design and sustainability. Building Broadband Commons - Tools for Planners and Communities Next Century City - Becoming Broadband Ready, a Toolkit for Communities Wireless Networking in the Developing World - Online Book Wireless Networking in the Developing World is a free book about designing, implementing, and maintaining low-cost wireless networks. Community Networks in Comics It is not easy to explain the concepts behind community networks, both the technical characteristics of radio frequency networks and the social and human aspects of community technologies. Teaching a workshop for popular groups using colonizing terms and methodologies can increase the existing barrier between people and a technology that was not created for their interests. With this in mind, images and analogies are powerful tools to make it easier to explain a technical term or an idea. We reject the premise that to do so would in any way underestimate people\u2019s ability to understand technical matters. Building Consentful Tech Zine In 2017, Una Lee, Dann Toliver, and their design firm And Also Too published the Building Consentful Tech Zine as a provocation on how to think about and design for consentfulness. This framing really resonated with our group, so we expanded it into a project where we prototype what this looks like in practice (and learned some interaction design methodologies on the way)! Report on Digital Skill Sets for Diverse Users The City of Seattle, in partnership with Technology and Social Change Group (TASCHA), developed a set of Digital Equity Indicators that helps measure Seattle\u2019s progress in meeting the initiative's goals. What digital skills do existing frameworks and curricula cover? What digital skills should the City and partners recommend to digital skill instructors to teach and promote? Do these resources have corresponding assessments to help assess individuals\u2019 digital skill abilities? Worksheet for Digital Skills for Diverse Users A list of 74 skills identified by TASCHA (see above resource) to include in digital equity curriculums Report on current state of Detroit Community Network In this case study, we focus on Detroit and the predominantly Black and lower-income neighborhood of the North End as an example of innovative, community-scale projects that are locally generated. New Community Networks by Douglas Schuler Online book about building and socially sustaining community networks, based on Doug Schuler's experiences with the Seattle Community Network project in the 90's (1996)","title":"All-aspects Community Networking Guides"},{"location":"community/join/","text":"Join Us Seattle Community Network has a place for everyone . Whether you'd like to join to get free Internet, get involved to help out your community, learn some skills so that you can get a job, or all of the above! PRO TIP Do everything on this page! Our community is spread out in a lot of different places, so doing everything is the best way to make sure you don't miss out. Join our Discord! Discord is a messaging platform that we use to stay in touch with each other, organize our different teams, and update everyone on last minute things. This is a MUST do if you don't want to get left out! Follow these steps to join our Discord server: Click the invite link to enter the Discord server. Introduce yourself on the #introductions channel and friend request one of the moderators so they can chat with you (you can write @moderators in your message to get their attention). They will need to add a role for you as a \"member\" so you can stay on the server before you log out, otherwise you will have to be invited and join again. Install Discord on your computer , Android , or iOS device to always stay up-to-date. Chat with someone! The best way to get involved with the network is to find someone that can direct you! Most of our work happens in teams. Here's how to join a team . Subscribe to our Google calendar! On our Google calendar we post regular occurring meetings and any impromptu events like social events, emergency repairs, site visits, etc. This is one of the only places to find out about the meetings our various teams are having! Join using one of these options: Use this link that should prompt you to add the calendar to your Google account Use this ICS file to manually add the calendar via the iCalendar format. View the calendar here Follow our social media! Our social media team makes posts about upcoming meetings, social events, and they also occasionally make educational posts! Don't miss out and follow us on Instagram , Facebook , and Twitter . Visit our Community Lab Space! See the Space for details.","title":"Join Us"},{"location":"community/join/#join-us","text":"Seattle Community Network has a place for everyone . Whether you'd like to join to get free Internet, get involved to help out your community, learn some skills so that you can get a job, or all of the above! PRO TIP Do everything on this page! Our community is spread out in a lot of different places, so doing everything is the best way to make sure you don't miss out.","title":"Join Us"},{"location":"community/join/#join-our-discord","text":"Discord is a messaging platform that we use to stay in touch with each other, organize our different teams, and update everyone on last minute things. This is a MUST do if you don't want to get left out!","title":"Join our Discord!"},{"location":"community/join/#follow-these-steps-to-join-our-discord-server","text":"Click the invite link to enter the Discord server. Introduce yourself on the #introductions channel and friend request one of the moderators so they can chat with you (you can write @moderators in your message to get their attention). They will need to add a role for you as a \"member\" so you can stay on the server before you log out, otherwise you will have to be invited and join again. Install Discord on your computer , Android , or iOS device to always stay up-to-date.","title":"Follow these steps to join our Discord server:"},{"location":"community/join/#chat-with-someone","text":"The best way to get involved with the network is to find someone that can direct you! Most of our work happens in teams. Here's how to join a team .","title":"Chat with someone!"},{"location":"community/join/#subscribe-to-our-google-calendar","text":"On our Google calendar we post regular occurring meetings and any impromptu events like social events, emergency repairs, site visits, etc. This is one of the only places to find out about the meetings our various teams are having! Join using one of these options: Use this link that should prompt you to add the calendar to your Google account Use this ICS file to manually add the calendar via the iCalendar format. View the calendar here","title":"Subscribe to our Google calendar!"},{"location":"community/join/#follow-our-social-media","text":"Our social media team makes posts about upcoming meetings, social events, and they also occasionally make educational posts! Don't miss out and follow us on Instagram , Facebook , and Twitter .","title":"Follow our social media!"},{"location":"community/join/#visit-our-community-lab-space","text":"See the Space for details.","title":"Visit our Community Lab Space!"},{"location":"community/mission-vision-values/","text":"Mission, Vision, and Values Mission LCL seeks to democratize knowledge, skills, and resources to enable people to establish and run their own local, community-centered, and community-owned Internet access networks and digital infrastructure. Vision We envision a world where no one is excluded from access to the Internet, and where anyone can achieve the expertise and capability to bring communications infrastructure to their community and improve their quality of life. Values We value the ability to access the Internet and all public information and digital resources therein as a human right. - Digital privacy of our users and partner organizations - Collaboration, especially with the communities and organizations we work with - Care, consideration, allyship, and peer mentorship between individuals within our organization - Education, sharing, and capacity-building- emphasize teaching and dissemination of information and skills - Openness, transparency, and accountability of our organization and its processes - Democratization and inclusiveness of decision processes among stakeholders - Long-term sustainability of our technology deployments and community structures - Equity in planning for resource allocation, programming, and contribution","title":"Mission, Vision, Values"},{"location":"community/mission-vision-values/#mission-vision-and-values","text":"","title":"Mission, Vision, and Values"},{"location":"community/mission-vision-values/#mission","text":"LCL seeks to democratize knowledge, skills, and resources to enable people to establish and run their own local, community-centered, and community-owned Internet access networks and digital infrastructure.","title":"Mission"},{"location":"community/mission-vision-values/#vision","text":"We envision a world where no one is excluded from access to the Internet, and where anyone can achieve the expertise and capability to bring communications infrastructure to their community and improve their quality of life.","title":"Vision"},{"location":"community/mission-vision-values/#values","text":"We value the ability to access the Internet and all public information and digital resources therein as a human right. - Digital privacy of our users and partner organizations - Collaboration, especially with the communities and organizations we work with - Care, consideration, allyship, and peer mentorship between individuals within our organization - Education, sharing, and capacity-building- emphasize teaching and dissemination of information and skills - Openness, transparency, and accountability of our organization and its processes - Democratization and inclusiveness of decision processes among stakeholders - Long-term sustainability of our technology deployments and community structures - Equity in planning for resource allocation, programming, and contribution","title":"Values"},{"location":"community/partners/","text":"Our Partners Althea ALTSpace API Chaya (WiFi is a Lifeline) Black Brilliance Research Project Breakfast Group City of Seattle IT Compassion8 Innovation /dev/hack Filipino Community of Seattle Internet Archive Internet Society King County Library System Low Income Housing Institute Nickelsville Seattle Makers Seattle Public Schools Tacoma Cooperative Network Tacoma Public Library The Silent Task Force University of Washington","title":"Our Partners"},{"location":"community/partners/#our-partners","text":"Althea ALTSpace API Chaya (WiFi is a Lifeline) Black Brilliance Research Project Breakfast Group City of Seattle IT Compassion8 Innovation /dev/hack Filipino Community of Seattle Internet Archive Internet Society King County Library System Low Income Housing Institute Nickelsville Seattle Makers Seattle Public Schools Tacoma Cooperative Network Tacoma Public Library The Silent Task Force University of Washington","title":"Our Partners"},{"location":"community/space/","text":"Seattle Community Network Lab Space We now have a newly opened community network lab and hack space, co-located with the gracious and welcoming /dev/hack hackerspace in Seattle, WA, with whom we share mutual membership. Address: 4534 1/2 University Way NE, Seattle WA 98105 SCN Lab Space Membership is for 24/7 keyholder access to the space only, and is absolutely not required to volunteer with us. Members can bring in guests at any time. Here are the current member application and policies .","title":"SCN Community Lab Space"},{"location":"community/space/#seattle-community-network-lab-space","text":"We now have a newly opened community network lab and hack space, co-located with the gracious and welcoming /dev/hack hackerspace in Seattle, WA, with whom we share mutual membership. Address: 4534 1/2 University Way NE, Seattle WA 98105 SCN Lab Space Membership is for 24/7 keyholder access to the space only, and is absolutely not required to volunteer with us. Members can bring in guests at any time. Here are the current member application and policies .","title":"Seattle Community Network Lab Space"},{"location":"community/teams/","text":"Join a Team As a volunteer-run community network, we are always in need of extra hands. If you're interested in helping out, check out what our teams are working on here! Feel free to have informational meetings with the respective team leads to learn more about how you can help. There's no commitment required and we welcome you to take on as much work as you have the capacity for. Outreach Our outreach team is responsible for finding new site host partners, finding users, and maintaining communications with our current partners. Message the #outreach channel in Discord and contact Esther Jang to learn more about how you can get involved. This is the perfect team for you if any of the following apply to you: Experience with community organizing Have community connections in the Greater Seattle Area Have cultural humility and experience partnering with marginalized communities Have the ability to translate and/or interpret into non-English languages common in the Seattle area such as Spanish, Vietnamese, Somali, Oromo, Khmer, and more. As of July 2021, the primary objective of the outreach team is to get connected with users for our network sites that fit any of the following criteria: Unemployed Seniors Housing-unstable or houseless Non-English speaking Social Media Our social media team is in charge of our various accounts on Instagram , Facebook , and Twitter . They also develop branding and marketing materials for our various projects. Message the #social-media channel in Discord and contact Firn Tieanklin to learn more about how you can get involved. You should join this team if you have experience in or are interested in practicing any of the following skills/technologies: - Canva - Design - Marketing - Photography/Videography Web Development Our web development team is working on redesigning and developing our new website. Message the #website channel in Discord to learn more about how you can get involved. You should join this team if you have experience in or are interested in learning any of the following skills/technologies: HTML/CSS Javascript Bootstrap React Redux Web Design (Using Figma) Mobile App Development Our mobile app development team is currently developing an Android app to record cell network performance metrics during our field tests. Message the #measurement channel in Discord and contact Zhennan Zhou to learn more about how you can get involved. You should join this team if you have experience in or are interested in learning any of the following skills/technologies: Android app development iOS app development Java Object oriented programming Open source development, Git, and GitHub Education Our education team plays a core role in our community networks as they enable our networks to be community-owned and operated. The education team is responsible for developing educational materials, running workshops, and teaching our Digital Steward cohorts. Message the #digital-stewards channel in Discord and contact Esther Jang to learn more about how you can get involved. You should join this team if you have experience in or are interested in learning any of the following skills/technologies: Teaching Curriculum development Computer networks, LTE networks, and community networks Linux Community organizing Fundraising Our fundraising team is currently setting up a crowdfunding platform to raise money for various expenses that this project requires. Our fundraising team is also working on applying for various community grants and research grants. Message the #funding channel in Discord and contact Esther Jang to learn more about how you can get involved. Accounting & Legal Local Connectivity Lab, the nonprofit organizing that is incubating this project, often runs into accounting and legal challenges. If you are willing to provide pro bono services to benefit the community network, please contact Esther Jang at lcl@seattlecommunitynetwork.org.","title":"Join a Team"},{"location":"community/teams/#join-a-team","text":"As a volunteer-run community network, we are always in need of extra hands. If you're interested in helping out, check out what our teams are working on here! Feel free to have informational meetings with the respective team leads to learn more about how you can help. There's no commitment required and we welcome you to take on as much work as you have the capacity for.","title":"Join a Team"},{"location":"community/teams/#outreach","text":"Our outreach team is responsible for finding new site host partners, finding users, and maintaining communications with our current partners. Message the #outreach channel in Discord and contact Esther Jang to learn more about how you can get involved. This is the perfect team for you if any of the following apply to you: Experience with community organizing Have community connections in the Greater Seattle Area Have cultural humility and experience partnering with marginalized communities Have the ability to translate and/or interpret into non-English languages common in the Seattle area such as Spanish, Vietnamese, Somali, Oromo, Khmer, and more. As of July 2021, the primary objective of the outreach team is to get connected with users for our network sites that fit any of the following criteria: Unemployed Seniors Housing-unstable or houseless Non-English speaking","title":"Outreach"},{"location":"community/teams/#social-media","text":"Our social media team is in charge of our various accounts on Instagram , Facebook , and Twitter . They also develop branding and marketing materials for our various projects. Message the #social-media channel in Discord and contact Firn Tieanklin to learn more about how you can get involved. You should join this team if you have experience in or are interested in practicing any of the following skills/technologies: - Canva - Design - Marketing - Photography/Videography","title":"Social Media"},{"location":"community/teams/#web-development","text":"Our web development team is working on redesigning and developing our new website. Message the #website channel in Discord to learn more about how you can get involved. You should join this team if you have experience in or are interested in learning any of the following skills/technologies: HTML/CSS Javascript Bootstrap React Redux Web Design (Using Figma)","title":"Web Development"},{"location":"community/teams/#mobile-app-development","text":"Our mobile app development team is currently developing an Android app to record cell network performance metrics during our field tests. Message the #measurement channel in Discord and contact Zhennan Zhou to learn more about how you can get involved. You should join this team if you have experience in or are interested in learning any of the following skills/technologies: Android app development iOS app development Java Object oriented programming Open source development, Git, and GitHub","title":"Mobile App Development"},{"location":"community/teams/#education","text":"Our education team plays a core role in our community networks as they enable our networks to be community-owned and operated. The education team is responsible for developing educational materials, running workshops, and teaching our Digital Steward cohorts. Message the #digital-stewards channel in Discord and contact Esther Jang to learn more about how you can get involved. You should join this team if you have experience in or are interested in learning any of the following skills/technologies: Teaching Curriculum development Computer networks, LTE networks, and community networks Linux Community organizing","title":"Education"},{"location":"community/teams/#fundraising","text":"Our fundraising team is currently setting up a crowdfunding platform to raise money for various expenses that this project requires. Our fundraising team is also working on applying for various community grants and research grants. Message the #funding channel in Discord and contact Esther Jang to learn more about how you can get involved.","title":"Fundraising"},{"location":"community/teams/#accounting-legal","text":"Local Connectivity Lab, the nonprofit organizing that is incubating this project, often runs into accounting and legal challenges. If you are willing to provide pro bono services to benefit the community network, please contact Esther Jang at lcl@seattlecommunitynetwork.org.","title":"Accounting & Legal"},{"location":"community/tech-help/","text":"Community Tech Help There are several ways to get community-based tech support from the SCN community, such as the Help Desk . You can use any of these methods to request Internet service from us, request general technology or computer help, or contact us about any other topic. Join our Discord! The FASTEST way to get support will be to join the #support channel on our Discord , a messaging platform that we use to organize. Follow these steps to join Discord: Join our Discord server via the invite link. You will need to log in or create an account to join, and a moderator will need to assign you a role before you are allowed to join permanently. Install Discord for your computer , Android , or iOS device to stay up-to-date on conversations. When posting to the #support channel, describe your question or problem in as much detail as you can. Someone from the community will most likely respond within a few hours. If you would like to get to know the community, introduce yourself in the #introductions channel! How did you hear about SCN and why are you interested? (More complete instructions can be found here ). Community-Run Help Desk The Seattle Community Network organizes a community-run tech help desk supported by the Black Brilliance Research Project's (BBR's) Digital Stewards Program and the Filipino Community of Seattle (FCS). Our current in-person help desk hours are on Fridays at 3-5 pm starting on 2/18/2022, located in the Filipino Community Village Integrated Learning Center (ILC) . Filipino Community Village Integrated Learning Center address: 5727 37th Ave S, Seattle, WA 98118 Our help desk is best-effort and mainly volunteer-based, so our virtual hours availability may be highly variable. Please check our available hours and sign up for an appointment slot using the calendar link below if you can (or contact us another way if that doesn't work), as it helps the volunteers plan for our time. However, you may also drop in during our scheduled calendar hours without an appointment. Our Help Desk Calendar : You can sign up for an appointment slot for any staffed volunteer hours indicated on the calendar. Phone Number (Voicemail-only except during staffed Community Tech Help hours): (253) 655-7221 You may also send text messages to this number, which will be checked during staffed hours. Inquiries about getting connected to our Internet service can also be sent here. Email address for general Tech Support: support@seattlecommunitynetwork.org Email address for SCN Internet service-related support: help@seattlecommunitynetwork.org Help Desk Volunteers We are actively recruiting more volunteers to help us run the help desk virtually, whenever and wherever that you are available. Join our team by simply signing up on this interest form , we need you! Please let us know if you have additional questions or concerns in the #support channel on our Discord . Documentation As always, please do not hesitate to consult our docs for any information, or submit an issue on the docs site github if there is information missing that you would like to see. Also feel free to message the Discord for the same purpose.","title":"Community Tech Help"},{"location":"community/tech-help/#community-tech-help","text":"There are several ways to get community-based tech support from the SCN community, such as the Help Desk . You can use any of these methods to request Internet service from us, request general technology or computer help, or contact us about any other topic.","title":"Community Tech Help"},{"location":"community/tech-help/#join-our-discord","text":"The FASTEST way to get support will be to join the #support channel on our Discord , a messaging platform that we use to organize.","title":"Join our Discord!"},{"location":"community/tech-help/#follow-these-steps-to-join-discord","text":"Join our Discord server via the invite link. You will need to log in or create an account to join, and a moderator will need to assign you a role before you are allowed to join permanently. Install Discord for your computer , Android , or iOS device to stay up-to-date on conversations. When posting to the #support channel, describe your question or problem in as much detail as you can. Someone from the community will most likely respond within a few hours. If you would like to get to know the community, introduce yourself in the #introductions channel! How did you hear about SCN and why are you interested? (More complete instructions can be found here ).","title":"Follow these steps to join Discord:"},{"location":"community/tech-help/#community-run-help-desk","text":"The Seattle Community Network organizes a community-run tech help desk supported by the Black Brilliance Research Project's (BBR's) Digital Stewards Program and the Filipino Community of Seattle (FCS). Our current in-person help desk hours are on Fridays at 3-5 pm starting on 2/18/2022, located in the Filipino Community Village Integrated Learning Center (ILC) . Filipino Community Village Integrated Learning Center address: 5727 37th Ave S, Seattle, WA 98118 Our help desk is best-effort and mainly volunteer-based, so our virtual hours availability may be highly variable. Please check our available hours and sign up for an appointment slot using the calendar link below if you can (or contact us another way if that doesn't work), as it helps the volunteers plan for our time. However, you may also drop in during our scheduled calendar hours without an appointment. Our Help Desk Calendar : You can sign up for an appointment slot for any staffed volunteer hours indicated on the calendar. Phone Number (Voicemail-only except during staffed Community Tech Help hours): (253) 655-7221 You may also send text messages to this number, which will be checked during staffed hours. Inquiries about getting connected to our Internet service can also be sent here. Email address for general Tech Support: support@seattlecommunitynetwork.org Email address for SCN Internet service-related support: help@seattlecommunitynetwork.org","title":"Community-Run Help Desk"},{"location":"community/tech-help/#help-desk-volunteers","text":"We are actively recruiting more volunteers to help us run the help desk virtually, whenever and wherever that you are available. Join our team by simply signing up on this interest form , we need you! Please let us know if you have additional questions or concerns in the #support channel on our Discord .","title":"Help Desk Volunteers"},{"location":"community/tech-help/#documentation","text":"As always, please do not hesitate to consult our docs for any information, or submit an issue on the docs site github if there is information missing that you would like to see. Also feel free to message the Discord for the same purpose.","title":"Documentation"},{"location":"contribute/contribute/","text":"Contribute to SCN Docs Looking to help? If you wanna share resources and help improve our docs, this page will get you started! Our docs are designed so that anyone can contribute. If this page isn't enough, contact one of us and we'll be able to help you! Our documentation uses MkDocs ReadTheDocs theme (links at the bottom of the page) Editing process To edit this documentation you should: Get your own copy of the repo Modify the documentation in your own repo (for more information see section on Local Development) Submit a pull request Wait for someone to review and approve the request. You can also nudge someone who has access to approve it. The rest of this page will explain all the details you need to know about the directory structure, markdown, and other quirks for editing this documentation. Make sure to read everything! Markdown files All our documentation is stored in 'Markdown' files so that they can be easily modified and changed without heavy technical knowledge. Markdown Editors A nice and simple online editor is StackEdit which will let you type in markdown and see what it would look like in realtime in split-screen. Another option is HackMD which has the same features as StackEdit but it also allows you to connect to your own GitHub repo and pull/push. This is a nice option if you are uncomfortable with using Git from the command line. Using MkDocs MkDocs is pretty simple, just install it through pip then you can run mkdocs serve to locally view the website it will generate. Each directory has a .pages file that declares the order each file/folder in that directory will show up. Children pages are implicit in the directory structure If you need static files for any of your pages, you should put them in the assets folder within the top level docs folder For example, for the cable-crimping page, the images for the tutorial are located in the \"assets/cable-crimping\" folder. These images can then be referenced relatively with the following standard markdown image syntax: ![RJ45 Crimping Tool](../assets/cable-crimping/kit-crimping-tool.jpg) Deployment The default branch of the repo is gh-pages-src which is where development should be done. One of the things that means is that pull requests will request to be merged by default into this branch. When a merge happens, a github workflow is set up (see .github/workflows) to listen to new commits, and then transform the source to something that can be served by a static file server. These build artifacts are automatically comitted to the branch gh-pages whose latest commit is what our documentation site serves.","title":"Contribute to SCN Docs"},{"location":"contribute/contribute/#contribute-to-scn-docs","text":"","title":"Contribute to SCN Docs"},{"location":"contribute/contribute/#looking-to-help","text":"If you wanna share resources and help improve our docs, this page will get you started! Our docs are designed so that anyone can contribute. If this page isn't enough, contact one of us and we'll be able to help you! Our documentation uses MkDocs ReadTheDocs theme (links at the bottom of the page)","title":"Looking to help?"},{"location":"contribute/contribute/#editing-process","text":"To edit this documentation you should: Get your own copy of the repo Modify the documentation in your own repo (for more information see section on Local Development) Submit a pull request Wait for someone to review and approve the request. You can also nudge someone who has access to approve it. The rest of this page will explain all the details you need to know about the directory structure, markdown, and other quirks for editing this documentation. Make sure to read everything!","title":"Editing process"},{"location":"contribute/contribute/#markdown-files","text":"All our documentation is stored in 'Markdown' files so that they can be easily modified and changed without heavy technical knowledge.","title":"Markdown files"},{"location":"contribute/contribute/#markdown-editors","text":"A nice and simple online editor is StackEdit which will let you type in markdown and see what it would look like in realtime in split-screen. Another option is HackMD which has the same features as StackEdit but it also allows you to connect to your own GitHub repo and pull/push. This is a nice option if you are uncomfortable with using Git from the command line.","title":"Markdown Editors"},{"location":"contribute/contribute/#using-mkdocs","text":"MkDocs is pretty simple, just install it through pip then you can run mkdocs serve to locally view the website it will generate. Each directory has a .pages file that declares the order each file/folder in that directory will show up. Children pages are implicit in the directory structure If you need static files for any of your pages, you should put them in the assets folder within the top level docs folder For example, for the cable-crimping page, the images for the tutorial are located in the \"assets/cable-crimping\" folder. These images can then be referenced relatively with the following standard markdown image syntax: ![RJ45 Crimping Tool](../assets/cable-crimping/kit-crimping-tool.jpg)","title":"Using MkDocs"},{"location":"contribute/contribute/#deployment","text":"The default branch of the repo is gh-pages-src which is where development should be done. One of the things that means is that pull requests will request to be merged by default into this branch. When a merge happens, a github workflow is set up (see .github/workflows) to listen to new commits, and then transform the source to something that can be served by a static file server. These build artifacts are automatically comitted to the branch gh-pages whose latest commit is what our documentation site serves.","title":"Deployment"},{"location":"faq/about/","text":"About Seattle Community Network Seattle Community Network (SCN) is a community network dedicated to providing fair access to underserved communities all across the Puget Sound. SCN is a project of Local Connectivity Lab, a 501(c)(3) registered non-profit that works to share free or low-cost broadband access in higher-need areas throughout the Puget Sound region, making use of existing network infrastructure such as buildings and fiber-optic cables to extend coverage to more people. As a community network, we rely on the help of local residents such as yourself to maintain and grow the network. Joining us is a great way to become an active member of your own community, make friends, and learn valuable technical skills.","title":"What is the Seattle Community Network?"},{"location":"faq/about/#about-seattle-community-network","text":"Seattle Community Network (SCN) is a community network dedicated to providing fair access to underserved communities all across the Puget Sound. SCN is a project of Local Connectivity Lab, a 501(c)(3) registered non-profit that works to share free or low-cost broadband access in higher-need areas throughout the Puget Sound region, making use of existing network infrastructure such as buildings and fiber-optic cables to extend coverage to more people. As a community network, we rely on the help of local residents such as yourself to maintain and grow the network. Joining us is a great way to become an active member of your own community, make friends, and learn valuable technical skills.","title":"About Seattle Community Network"},{"location":"faq/connection/","text":"How do I get Internet from the Seattle Community Network? Eligibility The Seattle Community Network exists to provide free or low-cost internet to low-income and in-need users. We prioritize serving the following groups: low-income families of students unemployed adults (looking for work) majority non-English speaking adults/families seniors Registration To connect to the internet through the Seattle Community Network, you will need to register with us. To register, you can: - Email lcl@seattlecommunitynetwork.org - Contact us by phone at (253) 655-7221 and leaving a voice mail or text. Hardware Once your registration is processed, you will receive the necessary hardware to connect to the network.","title":"How do I get Internet?"},{"location":"faq/connection/#how-do-i-get-internet-from-the-seattle-community-network","text":"","title":"How do I get Internet from the Seattle Community Network?"},{"location":"faq/connection/#eligibility","text":"The Seattle Community Network exists to provide free or low-cost internet to low-income and in-need users. We prioritize serving the following groups: low-income families of students unemployed adults (looking for work) majority non-English speaking adults/families seniors","title":"Eligibility"},{"location":"faq/connection/#registration","text":"To connect to the internet through the Seattle Community Network, you will need to register with us. To register, you can: - Email lcl@seattlecommunitynetwork.org - Contact us by phone at (253) 655-7221 and leaving a voice mail or text.","title":"Registration"},{"location":"faq/connection/#hardware","text":"Once your registration is processed, you will receive the necessary hardware to connect to the network.","title":"Hardware"},{"location":"faq/help/","text":"How can I Help? Volunteer! SCN is run completely by volunteers. There are many ways you can help, and no technology skills are required. We need help with everything from setting up network hardware and developing software to community outreach and fundraising. If you want to help, we can use your talents! First, make sure you get connected with our community . Next, why not Join a Team or Contribute to SCN Docs ?","title":"How can I Help?"},{"location":"faq/help/#how-can-i-help","text":"","title":"How can I Help?"},{"location":"faq/help/#volunteer","text":"SCN is run completely by volunteers. There are many ways you can help, and no technology skills are required. We need help with everything from setting up network hardware and developing software to community outreach and fundraising. If you want to help, we can use your talents! First, make sure you get connected with our community . Next, why not Join a Team or Contribute to SCN Docs ?","title":"Volunteer!"},{"location":"faq/how/","text":"How Does the Seattle Community Network Work? The Seattle Community Network partners with the University of Washington to share free or low-cost internet access with areas of higher need. The Seattle Community Network (SCN) is a wireless Internet access network using 4G LTE and WiFi technologies, providing public access from partner locations such as libraries, schools, businesses, and community centers. The Internet connection at these sites is shared wirelessly to nearby devices using the 4G LTE (cell-phone) data standard, which can be used by certain phones and hotspots (also known as Customer Premises Equipment or CPE). Individual users can connect to this signal using SCN-provided (or other compatible) devices to create a local WiFi network in their home. Some of our installed sites utilize a portion of the University of Washington's internet bandwidth, sharing it out to further neighborhoods via point-to-point wireless links. Some sites use other upstream internet service providers (ISPs) such as Lumen. The network is completely created, managed, and maintained by volunteers with a range of diverse skills in information technology and beyond. All infrastructure is paid for by generous donations from sponsors and the public. Speaking of which, why not volunteer or donate ?","title":"How does SCN Work?"},{"location":"faq/how/#how-does-the-seattle-community-network-work","text":"The Seattle Community Network partners with the University of Washington to share free or low-cost internet access with areas of higher need. The Seattle Community Network (SCN) is a wireless Internet access network using 4G LTE and WiFi technologies, providing public access from partner locations such as libraries, schools, businesses, and community centers. The Internet connection at these sites is shared wirelessly to nearby devices using the 4G LTE (cell-phone) data standard, which can be used by certain phones and hotspots (also known as Customer Premises Equipment or CPE). Individual users can connect to this signal using SCN-provided (or other compatible) devices to create a local WiFi network in their home. Some of our installed sites utilize a portion of the University of Washington's internet bandwidth, sharing it out to further neighborhoods via point-to-point wireless links. Some sites use other upstream internet service providers (ISPs) such as Lumen. The network is completely created, managed, and maintained by volunteers with a range of diverse skills in information technology and beyond. All infrastructure is paid for by generous donations from sponsors and the public. Speaking of which, why not volunteer or donate ?","title":"How Does the Seattle Community Network Work?"},{"location":"faq/site/","text":"About This Website The Seattle Community Network Docs website is the central hub for information about our community and networks. Here, we describe our infrastructure, how to set-up hardware and software, how you can start your own community network, our community rules, and more. This website is maintained by our volunteers, much like the rest of our services. This means you can help us improve it by adding missing information, clarifying confusing points, or even just fixing typos you notice while you\u2019re reading. See Contribute to SCN Docs to learn more about how you can contribute to this website. If you are looking for our main website, it is located at www.seattlecommunitynetwork.org .","title":"What is this site?"},{"location":"faq/site/#about-this-website","text":"The Seattle Community Network Docs website is the central hub for information about our community and networks. Here, we describe our infrastructure, how to set-up hardware and software, how you can start your own community network, our community rules, and more. This website is maintained by our volunteers, much like the rest of our services. This means you can help us improve it by adding missing information, clarifying confusing points, or even just fixing typos you notice while you\u2019re reading. See Contribute to SCN Docs to learn more about how you can contribute to this website. If you are looking for our main website, it is located at www.seattlecommunitynetwork.org .","title":"About This Website"},{"location":"faq/what/","text":"What is a Community Network? \"Community Networks (CNs) are crowd-sourced collaborative networks, developed in a bottom-up fashion by groups of individuals \u2013 i.e. communities \u2013 that design, develop and manage the network infrastructure as a common resource. Importantly, at the centre of CNs and the socio-economic ecosystems they generate lay the communities and their members, who are essential to initiate, maintain and guarantee the success of these connectivity efforts.\" Source: Building Community Network Policies: A Collaborative Governance towards Enabling Frameworks","title":"What is a Community Network?"},{"location":"faq/what/#what-is-a-community-network","text":"\"Community Networks (CNs) are crowd-sourced collaborative networks, developed in a bottom-up fashion by groups of individuals \u2013 i.e. communities \u2013 that design, develop and manage the network infrastructure as a common resource. Importantly, at the centre of CNs and the socio-economic ecosystems they generate lay the communities and their members, who are essential to initiate, maintain and guarantee the success of these connectivity efforts.\" Source: Building Community Network Policies: A Collaborative Governance towards Enabling Frameworks","title":"What is a Community Network?"},{"location":"faq/why/","text":"Why Have a Community Network? Internet access is a foundational component of many aspects of modern life, nearly as important as electricity and water service. Though internet service is generally available in many areas of the United States, there are still areas that are underserved because of a variety of geographic and socio-economic factors, or simply because traditional internet service providers do not find it profitable to install and maintain the necessary infrastructure to serve some areas with adequate internet. Community networks attempt to address this digital divide by connecting underserved communities. Because a community network is created, managed, and maintained by volunteers, it is able to serve areas that may not have other affordable internet options.","title":"Why have a Community Network?"},{"location":"faq/why/#why-have-a-community-network","text":"Internet access is a foundational component of many aspects of modern life, nearly as important as electricity and water service. Though internet service is generally available in many areas of the United States, there are still areas that are underserved because of a variety of geographic and socio-economic factors, or simply because traditional internet service providers do not find it profitable to install and maintain the necessary infrastructure to serve some areas with adequate internet. Community networks attempt to address this digital divide by connecting underserved communities. Because a community network is created, managed, and maintained by volunteers, it is able to serve areas that may not have other affordable internet options.","title":"Why Have a Community Network?"},{"location":"infrastructure/grafana-log-dashboard/","text":"Developed By: Rudra Prakash Singh, Esther Jang This guide walks you through the process of setting up a Grafana Server Log Monitoring Dashboard, including the installation and configuration of Grafana, Loki, and Promtail for log aggregation and visualization. It also covers setting up scripts for automating log retrieval and dashboard updates. Step 1: Install Grafana via CLI Install Grafana on your server using the following instructions for Debian-based systems: Follow the installation guide here: Grafana Installation on Debian Once installed, start Grafana and make sure it's accessible via a port (default: 3000 ). After Grafana is running, create an admin account. Once logged in, you'll land on the Grafana homepage. Step 2: Install Loki Install Loki by following the official instructions for Docker: Loki Installation via Docker Step 3: Create a Docker Compose File for Loki To set up Loki with Grafana, create a docker-compose.yml file: version: \"3\" # The version can be removed if you're using a recent Docker Compose version. services: grafana: image: grafana/grafana:latest ports: - \"3000:3000\" networks: - loki volumes: - grafana-data:/path # [CHANGE THIS LINE] Adding persistence for Grafana data loki: image: grafana/loki:latest ports: - \"3100:3100\" networks: - loki volumes: - ./path # [CHANGE THIS LINE] Local directory for Loki data user: \"10001\" # Run Loki as the appropriate user to avoid permission issues promtail: image: grafana/promtail:latest command: \"-config.file=/etc/promtail/config.yaml\" # [CHANGE THIS LINE] networks: - loki volumes: - \"/var/log:/var/log\" # [CHANGE THIS LINE] Mounting host logs networks: loki: volumes: grafana-data: # Declaring the volume for Grafana Step 4: Install Promtail Install Promtail by following the official instructions: Promtail Installation Guide Step 5: Configure Data Sources (Logs) To aggregate logs from other servers, we set up a method of transferring logs to the Grafana server. The logs are pulled into the Grafana server, where they are processed and rendered on a Grafana dashboard. Here\u2019s the updated section of the README with the requested changes marked. The rest remains unchanged. Step 5: Configure Data Sources (Logs) 5.1: Write a Bash Script to Pull Logs Here\u2019s an example of a script ( transfer_logs.sh ) to pull logs from another server: #!/bin/bash # Define variables REMOTE_SERVER=\"root@server_ip\" # [CHANGE THIS LINE] Remote server IP SSH_KEY_PATH=\"path\" # [CHANGE THIS LINE] Path to SSH key DEST_DIR=\"path\" # [CHANGE THIS LINE] Destination directory on the Grafana server # Define paths for logs DOCKER_LOG=\"path/to/docker/log\" # [CHANGE THIS LINE] Path to Docker log on remote server NGINX_LOG=\"path/to/nginx/log\" # [CHANGE THIS LINE] Path to NGINX log on remote server SYSLOG=\"path/to/syslog\" # [CHANGE THIS LINE] Path to syslog on remote server # Create directories if they don't exist mkdir -p \"$DEST_DIR/docker\" \"$DEST_DIR/nginx\" \"$DEST_DIR/syslog\" # Transfer logs echo \"Transferring Docker log...\" ssh -i $SSH_KEY_PATH $REMOTE_SERVER \"cat $DOCKER_LOG\" > \"$DEST_DIR/docker/docker.log\" echo \"Transferring NGINX log...\" ssh -i $SSH_KEY_PATH $REMOTE_SERVER \"cat $NGINX_LOG\" > \"$DEST_DIR/nginx/error.log\" echo \"Transferring syslog...\" ssh -i $SSH_KEY_PATH $REMOTE_SERVER \"cat $SYSLOG\" > \"$DEST_DIR/syslog/syslog.log\" echo \"All logs have been successfully transferred.\" 5.2: Configure Promtail to Scrape Logs Next, create a promtail-config.yaml file to let Promtail know where the logs are located: server: http_listen_port: 9080 grpc_listen_port: 0 positions: filename: /tmp/positions.yaml clients: - url: http://server_ip:3100/loki/api/v1/push # [CHANGE THIS LINE] Loki's URL scrape_configs: - job_name: docker_logs static_configs: labels: job: docker __path__: /path/to/logs/on/grafana/server/docker/*.log # [CHANGE THIS LINE] Path to Docker logs - job_name: nginx_logs static_configs: labels: job: nginx __path__: /path/to/logs/on/grafana/server/nginx/*.log # [CHANGE THIS LINE] Path to NGINX logs - job_name: syslog_logs static_configs: labels: job: syslog __path__: /path/to/logs/on/grafana/server/syslog/*.log # [CHANGE THIS LINE] Path to syslog logs Step 6: Configure Grafana to Use Loki Open Grafana\u2019s homepage and click the three vertical lines in the top-left corner. Navigate to Data Sources , then click Add Data Source . Select Loki as the data source type. Define the URL of your Loki instance, which is typically http://localhost:3100 . Click Save & Test . You should see a success message confirming the connection. Step 7: Explore Data in Grafana Go to the Explore section in Grafana. Use label filters and run queries to see the logs coming from Promtail. The labels in the filters correspond to the labels defined in the promtail-config.yaml . Step 8: Create a Dashboard On the left sidebar in Grafana, click Dashboards > New Dashboard . Click Add Panel to create a new panel. Under Data Source , select Loki . Write queries to retrieve logs for display. Use different labels to filter log data as needed. Choose a visualization type (e.g., Logs ). Repeat the process to add more visualizations, then adjust the layout and size to suit your needs. Save the dashboard once you are satisfied with the layout. Step 9: Automate Log Retrieval and Update Dashboard To make the process of pulling logs and updating the Grafana dashboard more automated, create two Python scripts: 9.1: transfer_server.py This script triggers the Promtail process to start log scraping when accessed via an HTTP request: from http.server import BaseHTTPRequestHandler, HTTPServer import subprocess COMMAND = \"sudo ./promtail-linux-amd64 -config.file=promtail-config.yaml\" class RequestHandler(BaseHTTPRequestHandler): def do_GET(self): if self.path == \"/run\": try: subprocess.Popen(COMMAND, shell=True) self.send_response(200) self.end_headers() self.wfile.write(b\"Command executed successfully.\") except Exception as e: self.send_response(500) self.end_headers() self.wfile.write(f\"Error executing command: {e}\".encode()) else: self.send_response(404) self.end_headers() self.wfile.write(b\"Not found.\") if __name__ == \"__main__\": server_address = ('server_ip', 8081) httpd = HTTPServer(server_address, RequestHandler) print(\"Server running on http://server_ip. Access /run to execute the command.\") httpd.serve_forever() 9.2: server.py This script pulls the logs by executing the previously created bash script: from http.server import BaseHTTPRequestHandler, HTTPServer import subprocess class ScriptHandler(BaseHTTPRequestHandler): def do_GET(self): script_path = \"/path/to/transfer_logs.sh\" # [CHANGE THIS LINE] try: subprocess.run([script_path], check=True) self.send_response(200) self.send_header(\"Content-type\", \"text/html\") self.end_headers() self.wfile.write(b\"Logs Pulled Successfully.\") except subprocess.CalledProcessError: self.send_response(500) self.send_header(\"Content-type\", \"text/html\") self.end_headers() self.wfile.write(b\"Failed to pull logs.\") def run(server_class=HTTPServer, handler_class=ScriptHandler, port=8080): server_address = ('', port) httpd = server_class(server_address, handler_class) print(f\"Starting http server on port {port}\") httpd.serve_forever() if __name__ == \"__main__\": run() Run both Python scripts in the background using nohup : nohup python3 transfer_server.py > transfer_server.log 2>&1 & nohup python3 server.py > server.log 2>&1 & Step 10: Add Buttons to Grafana Dashboard In Grafana, go to Settings > Links . Add the links to the above Python scripts with the appropriate port ( 8080 for log pulling and 8081 for triggering Promtail). This will enable users to pull logs instantly as they wish. Make sure promtail activation button is run first when opening dashboard, and then pulling logs button after.","title":"Grafana Log Dashboard Guide"},{"location":"infrastructure/grafana-log-dashboard/#developed-by-rudra-prakash-singh-esther-jang","text":"This guide walks you through the process of setting up a Grafana Server Log Monitoring Dashboard, including the installation and configuration of Grafana, Loki, and Promtail for log aggregation and visualization. It also covers setting up scripts for automating log retrieval and dashboard updates.","title":"Developed By: Rudra Prakash Singh, Esther Jang"},{"location":"infrastructure/grafana-log-dashboard/#step-1-install-grafana-via-cli","text":"Install Grafana on your server using the following instructions for Debian-based systems: Follow the installation guide here: Grafana Installation on Debian Once installed, start Grafana and make sure it's accessible via a port (default: 3000 ). After Grafana is running, create an admin account. Once logged in, you'll land on the Grafana homepage.","title":"Step 1: Install Grafana via CLI"},{"location":"infrastructure/grafana-log-dashboard/#step-2-install-loki","text":"Install Loki by following the official instructions for Docker: Loki Installation via Docker","title":"Step 2: Install Loki"},{"location":"infrastructure/grafana-log-dashboard/#step-3-create-a-docker-compose-file-for-loki","text":"To set up Loki with Grafana, create a docker-compose.yml file: version: \"3\" # The version can be removed if you're using a recent Docker Compose version. services: grafana: image: grafana/grafana:latest ports: - \"3000:3000\" networks: - loki volumes: - grafana-data:/path # [CHANGE THIS LINE] Adding persistence for Grafana data loki: image: grafana/loki:latest ports: - \"3100:3100\" networks: - loki volumes: - ./path # [CHANGE THIS LINE] Local directory for Loki data user: \"10001\" # Run Loki as the appropriate user to avoid permission issues promtail: image: grafana/promtail:latest command: \"-config.file=/etc/promtail/config.yaml\" # [CHANGE THIS LINE] networks: - loki volumes: - \"/var/log:/var/log\" # [CHANGE THIS LINE] Mounting host logs networks: loki: volumes: grafana-data: # Declaring the volume for Grafana","title":"Step 3: Create a Docker Compose File for Loki"},{"location":"infrastructure/grafana-log-dashboard/#step-4-install-promtail","text":"Install Promtail by following the official instructions: Promtail Installation Guide","title":"Step 4: Install Promtail"},{"location":"infrastructure/grafana-log-dashboard/#step-5-configure-data-sources-logs","text":"To aggregate logs from other servers, we set up a method of transferring logs to the Grafana server. The logs are pulled into the Grafana server, where they are processed and rendered on a Grafana dashboard. Here\u2019s the updated section of the README with the requested changes marked. The rest remains unchanged.","title":"Step 5: Configure Data Sources (Logs)"},{"location":"infrastructure/grafana-log-dashboard/#step-5-configure-data-sources-logs_1","text":"","title":"Step 5: Configure Data Sources (Logs)"},{"location":"infrastructure/grafana-log-dashboard/#51-write-a-bash-script-to-pull-logs","text":"Here\u2019s an example of a script ( transfer_logs.sh ) to pull logs from another server: #!/bin/bash # Define variables REMOTE_SERVER=\"root@server_ip\" # [CHANGE THIS LINE] Remote server IP SSH_KEY_PATH=\"path\" # [CHANGE THIS LINE] Path to SSH key DEST_DIR=\"path\" # [CHANGE THIS LINE] Destination directory on the Grafana server # Define paths for logs DOCKER_LOG=\"path/to/docker/log\" # [CHANGE THIS LINE] Path to Docker log on remote server NGINX_LOG=\"path/to/nginx/log\" # [CHANGE THIS LINE] Path to NGINX log on remote server SYSLOG=\"path/to/syslog\" # [CHANGE THIS LINE] Path to syslog on remote server # Create directories if they don't exist mkdir -p \"$DEST_DIR/docker\" \"$DEST_DIR/nginx\" \"$DEST_DIR/syslog\" # Transfer logs echo \"Transferring Docker log...\" ssh -i $SSH_KEY_PATH $REMOTE_SERVER \"cat $DOCKER_LOG\" > \"$DEST_DIR/docker/docker.log\" echo \"Transferring NGINX log...\" ssh -i $SSH_KEY_PATH $REMOTE_SERVER \"cat $NGINX_LOG\" > \"$DEST_DIR/nginx/error.log\" echo \"Transferring syslog...\" ssh -i $SSH_KEY_PATH $REMOTE_SERVER \"cat $SYSLOG\" > \"$DEST_DIR/syslog/syslog.log\" echo \"All logs have been successfully transferred.\"","title":"5.1: Write a Bash Script to Pull Logs"},{"location":"infrastructure/grafana-log-dashboard/#52-configure-promtail-to-scrape-logs","text":"Next, create a promtail-config.yaml file to let Promtail know where the logs are located: server: http_listen_port: 9080 grpc_listen_port: 0 positions: filename: /tmp/positions.yaml clients: - url: http://server_ip:3100/loki/api/v1/push # [CHANGE THIS LINE] Loki's URL scrape_configs: - job_name: docker_logs static_configs: labels: job: docker __path__: /path/to/logs/on/grafana/server/docker/*.log # [CHANGE THIS LINE] Path to Docker logs - job_name: nginx_logs static_configs: labels: job: nginx __path__: /path/to/logs/on/grafana/server/nginx/*.log # [CHANGE THIS LINE] Path to NGINX logs - job_name: syslog_logs static_configs: labels: job: syslog __path__: /path/to/logs/on/grafana/server/syslog/*.log # [CHANGE THIS LINE] Path to syslog logs","title":"5.2: Configure Promtail to Scrape Logs"},{"location":"infrastructure/grafana-log-dashboard/#step-6-configure-grafana-to-use-loki","text":"Open Grafana\u2019s homepage and click the three vertical lines in the top-left corner. Navigate to Data Sources , then click Add Data Source . Select Loki as the data source type. Define the URL of your Loki instance, which is typically http://localhost:3100 . Click Save & Test . You should see a success message confirming the connection.","title":"Step 6: Configure Grafana to Use Loki"},{"location":"infrastructure/grafana-log-dashboard/#step-7-explore-data-in-grafana","text":"Go to the Explore section in Grafana. Use label filters and run queries to see the logs coming from Promtail. The labels in the filters correspond to the labels defined in the promtail-config.yaml .","title":"Step 7: Explore Data in Grafana"},{"location":"infrastructure/grafana-log-dashboard/#step-8-create-a-dashboard","text":"On the left sidebar in Grafana, click Dashboards > New Dashboard . Click Add Panel to create a new panel. Under Data Source , select Loki . Write queries to retrieve logs for display. Use different labels to filter log data as needed. Choose a visualization type (e.g., Logs ). Repeat the process to add more visualizations, then adjust the layout and size to suit your needs. Save the dashboard once you are satisfied with the layout.","title":"Step 8: Create a Dashboard"},{"location":"infrastructure/grafana-log-dashboard/#step-9-automate-log-retrieval-and-update-dashboard","text":"To make the process of pulling logs and updating the Grafana dashboard more automated, create two Python scripts:","title":"Step 9: Automate Log Retrieval and Update Dashboard"},{"location":"infrastructure/grafana-log-dashboard/#91-transfer_serverpy","text":"This script triggers the Promtail process to start log scraping when accessed via an HTTP request: from http.server import BaseHTTPRequestHandler, HTTPServer import subprocess COMMAND = \"sudo ./promtail-linux-amd64 -config.file=promtail-config.yaml\" class RequestHandler(BaseHTTPRequestHandler): def do_GET(self): if self.path == \"/run\": try: subprocess.Popen(COMMAND, shell=True) self.send_response(200) self.end_headers() self.wfile.write(b\"Command executed successfully.\") except Exception as e: self.send_response(500) self.end_headers() self.wfile.write(f\"Error executing command: {e}\".encode()) else: self.send_response(404) self.end_headers() self.wfile.write(b\"Not found.\") if __name__ == \"__main__\": server_address = ('server_ip', 8081) httpd = HTTPServer(server_address, RequestHandler) print(\"Server running on http://server_ip. Access /run to execute the command.\") httpd.serve_forever()","title":"9.1: transfer_server.py"},{"location":"infrastructure/grafana-log-dashboard/#92-serverpy","text":"This script pulls the logs by executing the previously created bash script: from http.server import BaseHTTPRequestHandler, HTTPServer import subprocess class ScriptHandler(BaseHTTPRequestHandler): def do_GET(self): script_path = \"/path/to/transfer_logs.sh\" # [CHANGE THIS LINE] try: subprocess.run([script_path], check=True) self.send_response(200) self.send_header(\"Content-type\", \"text/html\") self.end_headers() self.wfile.write(b\"Logs Pulled Successfully.\") except subprocess.CalledProcessError: self.send_response(500) self.send_header(\"Content-type\", \"text/html\") self.end_headers() self.wfile.write(b\"Failed to pull logs.\") def run(server_class=HTTPServer, handler_class=ScriptHandler, port=8080): server_address = ('', port) httpd = server_class(server_address, handler_class) print(f\"Starting http server on port {port}\") httpd.serve_forever() if __name__ == \"__main__\": run() Run both Python scripts in the background using nohup : nohup python3 transfer_server.py > transfer_server.log 2>&1 & nohup python3 server.py > server.log 2>&1 &","title":"9.2: server.py"},{"location":"infrastructure/grafana-log-dashboard/#step-10-add-buttons-to-grafana-dashboard","text":"In Grafana, go to Settings > Links . Add the links to the above Python scripts with the appropriate port ( 8080 for log pulling and 8081 for triggering Promtail). This will enable users to pull logs instantly as they wish. Make sure promtail activation button is run first when opening dashboard, and then pulling logs button after.","title":"Step 10: Add Buttons to Grafana Dashboard"},{"location":"learn/cable-crimping/","text":"Crimping Ethernet Cables In this article, you'll all about crimping ethernet cables! What is crimping an ethernet cable? Crimping an ethernet cable is the process of attaching connectors onto the ends of ethernet cables. This process is also called 'RJ45 crimping' because RJ45 is the name of the connectors that are used for ethernet cables, and they are what is being crimped. Why? Setting up networks involves setting up long ethernet cable connections between different devices. Instead of buying premade ethernet cables of varying lengths (e.g. 5ft, 10ft, 50ft, etc.), it's more practical to just have a big spool of cabling that we can roll out and cut to the exact length we need. Therefore we need to be able to attach RJ45 connectors to the ends of these cut cables so that we can actually plug them in! Crimping Kit Here are some tools you should have in your crimping kit! RJ45 Crimping Tool An RJ45 crimping tool is the most essential tool. Although it's technically possible to crimp ethernet cables without this specialized tool, it's not very practical for crimping lots of cables. Its primary utility is to do the actual 'crimping' part of compressing/crimping the tiny gold pins in the RJ45 connector onto the ethernet cables. It also has blades that can be used to cut or strip wires. Cable Stripper Cable strippers are used to take off the protecting shielding around cables and expose the inner wires. You can also do the same thing with a simple blade or pair of scissors. The trickiest part about stripping cables is trying to avoid cutting the inner wires! RJ45 Connectors RJ45 connectors are required for crimping because they feature the 8 golden pins that get crimped onto the 8 wires of the ethernet cable. They are what get plugged into ethernet ports! They also feature a latch/clip that locks the ethernet cable into the port once it is plugged in. RJ45 Boots RJ45 boots can be optionally used to protect the RJ45 connector. It provides insulation and prevents the cable from being breaking easily. They have to put slipped onto the cable before you put on the RJ45 connectors though! RJ45 Cable Tester RJ45 cable testers allow you to guarantee that you did the job correctly! They have two pieces that separate from each other, and you plug each end of your crimped ethernet cable into the port on each piece. Then you turn it on and the cable tester will test the connection for all 8 pins. If there are any missing lights on any of the pins, it means that you messed up somewhere and have to restart! How to Crimp an Ethernet Cable Assuming you have a crimping kit and an ethernet cable that needs to be crimped, here are all the steps! Step 0) Slip on the RJ45 boot (optional) Step 1) Strip the cable Push the cable into the razor slot of the strip tool and turn it around the cable to make an even cut around the sheath. Careful not to nick the wires inside! Unwrap the blue foil shielding and plastic to uncover the twisted wire pairs. Push the copper grounding wire to the side. (Ignore the white string.) Step 2) Organize the wires In this step, you'll be taking the 8 colored wires inside the ethernet cable and putting them into the correct ordering of colors. NOTE This is the hardest part of crimping! The wires are small and are hard to control. Take your time and make sure you do this step correctly! Otherwise you might have to go back and restart. Step 2.1) Untwist the wires There should be 4 pairs of wires: green, brown, orange, and blue. Each pair has a solid-colored wire and a striped-colored wire. Untwist these pairs and separate them into the 8 wires. Step 2.2) Straighten out wires After untwisting the wires, they are probably still kinked and look like they want to be twisted. In this step, you should carefully grab all the wires and try to straighten them out by pulling on them. This will prevent the wires from moving around later on. WARNING Don't break off the wires! Step 2.3) Lay out wires in order With your straightened out wires, put them into the correct order! Make sure that the wires are all flat and in line with each other. The ordering for these wires is: 1. Striped orange 2. Solid orange 3. Striped green 4. Solid blue 5. Striped blue 6. Solid green 7. Striped brown 8. Solid brown TIP After laying them out in order, straighten them out again as a group! This will help keep the wires together. Step 2.4) Trim the wires Trim the wires evenly to about 1/2 inch in length using scissors or the blade of your crimping tool. You want to make sure you have enough room for the wires to reach the end of the RJ45 connector. But also try to have room for the shielding of the cable to be inserted into the connector too. TIP You can put the wires side-by-side to the RJ45 connector to see how long you should cut it. Look at the next step to see what the final product looks like. TIP If you don't have the shielding inside of the connector, it makes it easier for the wires to snap off later, which is bad. TIP Make sure that you cut the wires evenly! Step 3) Slide wires into RJ45 connector Carefully slide your 8 wires into the connector. Make sure that the clip is facing away from you! If it is really hard to slide it into the connector, you probably didn't straighten out the wires enough in step 2.2 or 2.3. MORE INFO Inserting the wires with the clip facing away from you is the standard. However, you could technically do it in 'reverse' and insert the wires with the clip facing you, as long as you do it on both ends of the cable. You shouldn't do this in practice though because others would get confused when looking at your cable. Step 4) Crimp it Push the RJ45 connector into the slot of your crimping tool for RJ45 connectors. The slot should be labeled something like \"8P\" for the 8-pin RJ45 connector that you're using. In this step, you're doing the actual 'crimping' part and crimping/compressing/stabbing the 8 golden pins on the RJ45 connector into the 8 colored wires. TIP Squeeze as hard as you can! You need to make sure that all 8 pins are crimped. Step 5) Test it Slide the two pieces of the tester apart and plug each of the cable ends into either piece. Turn the switch to \u201cOn\u201d or \u201cSlow.\u201d If it's working, all 8 numbers should be flashing green. If any of them are not showing green, it means something is wrong and you have to redo it! The RJ45 connector can't be reused once it's crimped, so you should just cut the end off and start back at step 1. If everything is green, then you're done! If you had a cable boot, you can push the boots onto the RJ45 connector now. Resources Workshop Slides ISOC ICS Training Workshop Videos Crimping Tutorial (2 mins) Cable Testing Only need first 7 minutes for the basics Websites Color Coding Diagrams Crimping Comic From People's Open Network + sudomesh Shopping Crimping Kit ($23) Comes with a nice case Might need to buy your own batteries for cable tester Crimping Kit ($17) Might need to buy your own batteries for cable tester","title":"Crimping Ethernet Cables"},{"location":"learn/cable-crimping/#crimping-ethernet-cables","text":"In this article, you'll all about crimping ethernet cables!","title":"Crimping Ethernet Cables"},{"location":"learn/cable-crimping/#what-is-crimping-an-ethernet-cable","text":"Crimping an ethernet cable is the process of attaching connectors onto the ends of ethernet cables. This process is also called 'RJ45 crimping' because RJ45 is the name of the connectors that are used for ethernet cables, and they are what is being crimped.","title":"What is crimping an ethernet cable?"},{"location":"learn/cable-crimping/#why","text":"Setting up networks involves setting up long ethernet cable connections between different devices. Instead of buying premade ethernet cables of varying lengths (e.g. 5ft, 10ft, 50ft, etc.), it's more practical to just have a big spool of cabling that we can roll out and cut to the exact length we need. Therefore we need to be able to attach RJ45 connectors to the ends of these cut cables so that we can actually plug them in!","title":"Why?"},{"location":"learn/cable-crimping/#crimping-kit","text":"Here are some tools you should have in your crimping kit!","title":"Crimping Kit"},{"location":"learn/cable-crimping/#rj45-crimping-tool","text":"An RJ45 crimping tool is the most essential tool. Although it's technically possible to crimp ethernet cables without this specialized tool, it's not very practical for crimping lots of cables. Its primary utility is to do the actual 'crimping' part of compressing/crimping the tiny gold pins in the RJ45 connector onto the ethernet cables. It also has blades that can be used to cut or strip wires.","title":"RJ45 Crimping Tool"},{"location":"learn/cable-crimping/#cable-stripper","text":"Cable strippers are used to take off the protecting shielding around cables and expose the inner wires. You can also do the same thing with a simple blade or pair of scissors. The trickiest part about stripping cables is trying to avoid cutting the inner wires!","title":"Cable Stripper"},{"location":"learn/cable-crimping/#rj45-connectors","text":"RJ45 connectors are required for crimping because they feature the 8 golden pins that get crimped onto the 8 wires of the ethernet cable. They are what get plugged into ethernet ports! They also feature a latch/clip that locks the ethernet cable into the port once it is plugged in.","title":"RJ45 Connectors"},{"location":"learn/cable-crimping/#rj45-boots","text":"RJ45 boots can be optionally used to protect the RJ45 connector. It provides insulation and prevents the cable from being breaking easily. They have to put slipped onto the cable before you put on the RJ45 connectors though!","title":"RJ45 Boots"},{"location":"learn/cable-crimping/#rj45-cable-tester","text":"RJ45 cable testers allow you to guarantee that you did the job correctly! They have two pieces that separate from each other, and you plug each end of your crimped ethernet cable into the port on each piece. Then you turn it on and the cable tester will test the connection for all 8 pins. If there are any missing lights on any of the pins, it means that you messed up somewhere and have to restart!","title":"RJ45 Cable Tester"},{"location":"learn/cable-crimping/#how-to-crimp-an-ethernet-cable","text":"Assuming you have a crimping kit and an ethernet cable that needs to be crimped, here are all the steps!","title":"How to Crimp an Ethernet Cable"},{"location":"learn/cable-crimping/#step-0-slip-on-the-rj45-boot-optional","text":"","title":"Step 0) Slip on the RJ45 boot (optional)"},{"location":"learn/cable-crimping/#step-1-strip-the-cable","text":"Push the cable into the razor slot of the strip tool and turn it around the cable to make an even cut around the sheath. Careful not to nick the wires inside! Unwrap the blue foil shielding and plastic to uncover the twisted wire pairs. Push the copper grounding wire to the side. (Ignore the white string.)","title":"Step 1) Strip the cable"},{"location":"learn/cable-crimping/#step-2-organize-the-wires","text":"In this step, you'll be taking the 8 colored wires inside the ethernet cable and putting them into the correct ordering of colors. NOTE This is the hardest part of crimping! The wires are small and are hard to control. Take your time and make sure you do this step correctly! Otherwise you might have to go back and restart.","title":"Step 2) Organize the wires"},{"location":"learn/cable-crimping/#step-21-untwist-the-wires","text":"There should be 4 pairs of wires: green, brown, orange, and blue. Each pair has a solid-colored wire and a striped-colored wire. Untwist these pairs and separate them into the 8 wires.","title":"Step 2.1) Untwist the wires"},{"location":"learn/cable-crimping/#step-22-straighten-out-wires","text":"After untwisting the wires, they are probably still kinked and look like they want to be twisted. In this step, you should carefully grab all the wires and try to straighten them out by pulling on them. This will prevent the wires from moving around later on. WARNING Don't break off the wires!","title":"Step 2.2) Straighten out wires"},{"location":"learn/cable-crimping/#step-23-lay-out-wires-in-order","text":"With your straightened out wires, put them into the correct order! Make sure that the wires are all flat and in line with each other. The ordering for these wires is: 1. Striped orange 2. Solid orange 3. Striped green 4. Solid blue 5. Striped blue 6. Solid green 7. Striped brown 8. Solid brown TIP After laying them out in order, straighten them out again as a group! This will help keep the wires together.","title":"Step 2.3) Lay out wires in order"},{"location":"learn/cable-crimping/#step-24-trim-the-wires","text":"Trim the wires evenly to about 1/2 inch in length using scissors or the blade of your crimping tool. You want to make sure you have enough room for the wires to reach the end of the RJ45 connector. But also try to have room for the shielding of the cable to be inserted into the connector too. TIP You can put the wires side-by-side to the RJ45 connector to see how long you should cut it. Look at the next step to see what the final product looks like. TIP If you don't have the shielding inside of the connector, it makes it easier for the wires to snap off later, which is bad. TIP Make sure that you cut the wires evenly!","title":"Step 2.4) Trim the wires"},{"location":"learn/cable-crimping/#step-3-slide-wires-into-rj45-connector","text":"Carefully slide your 8 wires into the connector. Make sure that the clip is facing away from you! If it is really hard to slide it into the connector, you probably didn't straighten out the wires enough in step 2.2 or 2.3. MORE INFO Inserting the wires with the clip facing away from you is the standard. However, you could technically do it in 'reverse' and insert the wires with the clip facing you, as long as you do it on both ends of the cable. You shouldn't do this in practice though because others would get confused when looking at your cable.","title":"Step 3) Slide wires into RJ45 connector"},{"location":"learn/cable-crimping/#step-4-crimp-it","text":"Push the RJ45 connector into the slot of your crimping tool for RJ45 connectors. The slot should be labeled something like \"8P\" for the 8-pin RJ45 connector that you're using. In this step, you're doing the actual 'crimping' part and crimping/compressing/stabbing the 8 golden pins on the RJ45 connector into the 8 colored wires. TIP Squeeze as hard as you can! You need to make sure that all 8 pins are crimped.","title":"Step 4) Crimp it"},{"location":"learn/cable-crimping/#step-5-test-it","text":"Slide the two pieces of the tester apart and plug each of the cable ends into either piece. Turn the switch to \u201cOn\u201d or \u201cSlow.\u201d If it's working, all 8 numbers should be flashing green. If any of them are not showing green, it means something is wrong and you have to redo it! The RJ45 connector can't be reused once it's crimped, so you should just cut the end off and start back at step 1. If everything is green, then you're done! If you had a cable boot, you can push the boots onto the RJ45 connector now.","title":"Step 5) Test it"},{"location":"learn/cable-crimping/#resources","text":"","title":"Resources"},{"location":"learn/cable-crimping/#workshop-slides","text":"ISOC ICS Training Workshop","title":"Workshop Slides"},{"location":"learn/cable-crimping/#videos","text":"Crimping Tutorial (2 mins) Cable Testing Only need first 7 minutes for the basics","title":"Videos"},{"location":"learn/cable-crimping/#websites","text":"Color Coding Diagrams Crimping Comic From People's Open Network + sudomesh","title":"Websites"},{"location":"learn/cable-crimping/#shopping","text":"Crimping Kit ($23) Comes with a nice case Might need to buy your own batteries for cable tester Crimping Kit ($17) Might need to buy your own batteries for cable tester","title":"Shopping"},{"location":"learn/lte-networks/","text":"LTE Networks Our network uses a 4G LTE network architecture. Understanding everything is a huge challenge, but understanding it at a high-level is very achievable. Consider exploring all of these links as they all complement each other well! Helpful videos How Cell Service Actually Works Broad overview of cellular technologies, from the very basics up to advanced topics, in only 20 minutes AT&T Archives Video: AMPS Old video from 1978 about an older version of cell networks (AMPS) Very very high quality and gives good background on cellular networks Learn 4G LTE Network Architecture Quick high-level overview of 4G LTE architecture Only shows diagrams How does your mobile phone work? Very good visual for the entire system of how cell phones work today Has 3d animation so it's easier to understand conceptually Doesn't go over LTE architecture specifically Driving Factors of LTE Architecture Gain more understanding of the context around LTE architecture Helpful articles YaleBTS LTE Concepts Explains basically ALL the parts of the LTE architecture TutorialsPoint LTE Network Architecture Gives overview of LTE architecture Not very detailed, but it's a good introduction to the individual components of LTE Open5GS Introduction Documentation for Open5GS, the repo that our networks rely on This is the most applicable to our specific network because it's what we actually use.","title":"LTE Networks"},{"location":"learn/lte-networks/#lte-networks","text":"Our network uses a 4G LTE network architecture. Understanding everything is a huge challenge, but understanding it at a high-level is very achievable. Consider exploring all of these links as they all complement each other well!","title":"LTE Networks"},{"location":"learn/lte-networks/#helpful-videos","text":"How Cell Service Actually Works Broad overview of cellular technologies, from the very basics up to advanced topics, in only 20 minutes AT&T Archives Video: AMPS Old video from 1978 about an older version of cell networks (AMPS) Very very high quality and gives good background on cellular networks Learn 4G LTE Network Architecture Quick high-level overview of 4G LTE architecture Only shows diagrams How does your mobile phone work? Very good visual for the entire system of how cell phones work today Has 3d animation so it's easier to understand conceptually Doesn't go over LTE architecture specifically Driving Factors of LTE Architecture Gain more understanding of the context around LTE architecture","title":"Helpful videos"},{"location":"learn/lte-networks/#helpful-articles","text":"YaleBTS LTE Concepts Explains basically ALL the parts of the LTE architecture TutorialsPoint LTE Network Architecture Gives overview of LTE architecture Not very detailed, but it's a good introduction to the individual components of LTE Open5GS Introduction Documentation for Open5GS, the repo that our networks rely on This is the most applicable to our specific network because it's what we actually use.","title":"Helpful articles"},{"location":"learn/networking/","text":"Learn about Computer Networks This page is currently in development. For now, please view our lesson on computer networks from our Digital Stewards curriculum here . TODO","title":"Networking"},{"location":"learn/networking/#learn-about-computer-networks","text":"This page is currently in development. For now, please view our lesson on computer networks from our Digital Stewards curriculum here . TODO","title":"Learn about Computer Networks"},{"location":"learn/wireless-communication/","text":"Crash Course in Wireless Communication Authored by: Dominick Ta Last updated: June 18th, 2021 TODO: [ ] Expand on transmit/receiving in antennas section [ ] Finish communication section [ ] Finish protocols section This is a crash course in wireless communication: the magical way that we humans send information (e.g. music, messages, text, videos) to each other over long distances, without a wire. Wireless communication is primarily powered by radio waves, a physical thing that we as humans cannot see or touch. In this article you will gain a layman's understanding of how wireless communication works. Specifically, this article will cover the following broad topics: Radio waves and the physics behind it Antennas How data is communicated via radio waves Examples of wireless communication technologies This is not meant to be a comprehensive article, so there will be a lot of simplifications, analogies, and informal explanations. Please let me know at domta@cs.uw.edu if you see any inaccuracies, misconceptions, or misnomers. Radio waves Radio waves are just oscillations of energy that exist throughout our environment. They can be generated naturally by lightning, or artifically by equipment made by humans such as cell phones. The technical definition of radio waves are that they are a form of 'electromagnetic radiation'. Other types of electromagnetic radiation include visible light (what we get from the sun), infrared, and X-rays. How radio waves are created To understand why radio waves are considered a type of electromagnetic radiation, it is helpful to know how we generate radio waves. This section is not important to fully understand, but it is good to skim to have a basic idea of how this stuff works. We create radio waves by moving electrons back and forth within an electrically conductive object (an object made of material that allows electrons to move freely, such as metals). This works because electrons have special properties: All electrons have ' electric fields ' surrounding them that attracts and repels other charged particles. All moving electrons produce ' magnetic fields ' that are the basis for how magnets work. Therefore, when electrons move there are two fields (electric & magnetic) present that combine to create creates an ' electromagnetic field '. By moving an electron back and forth in an oscillating (repetitive) motion, these electromagnetic fields are constantly being disturbed/moved in a way that creates electromagnetic waves or equivalently, electromagnetic radiation . In this GIF below, we see the charge of an antenna changing, representing electrons moving back and forth within the antenna. This creates pulsating electromagnetic waves. Note: in this particular GIF, it is actually only showing the pulsating electric fields. In this GIF below, we are able to fully see an electromagnetic wave with a 3D representation. The red component of the wave represents the electric field, while the blue component represents the magnetic field. Notice how they are perpendicular to each other! This is also why the GIF above didn't show both fields: it was a 2D representation! In this section, we learned about radio waves. In essence, you can just think of radio waves as physical phenomenon that look like these sine waves: With the proper hardware and knowledge, we can create any type of wave we want! We can vary frequencies (how fast the waves go by), amplitudes (how tall/powerful the waves are), and phases (what position within the loop the wave is in). Frequency & Wavelength It turns out that a fundamental characteristic of any given radio wave is its frequency. Therefore, it's important to know what 'frequency' means, and how it relates to the concept of 'wavelength'. Frequency is a measurement of how often something happens. In the case of radio waves, it measures how many cycles of a radio wave occurs in a certain amonut of time. Frequency is measured in the units of hertz (Hz) , which represents cycles per second. If we had a radio wave that passed through 10 complete cycles in a minute, it would have a frequency of 0.16Hz (10 cycles per 60 seconds). Wavelength measures the physical length of a single cycle in a radio wave. If we could see radio waves and measure it, and we saw that there was a distance of 10-feet between two of the peaks in a radio wave, then that radio wave would have a wavelength of 10 feet. In the image above, we can see a natural relationship between frequency and wavelength: a faster frequency means that you will have shorter wavelengths! Or conversely, longer wavelengths means that there is a slower frequency! When one value goes up, the other value has to go down; this is called an inverse relationship . So if I told you that I had a radio wave with a very high frequency, you could figure out that my radio wave has very small wavelengths. And actually, if I told you exactly what frequency my radio waves travelled at, you'd be able to figure out the exact size of the wavelength! For example, if I told you I had a radio wave with a frequency of 10Hz, you would be able to figure out that my radio wave has a wavelength of approximately 30,000,000 meters. This is because radio waves are a physical thing, so they always travel through air at the same speed: the speed of light. This means we can consistently convert back and forth between frequency and wavelength with some basic algebra. The basic equation, where c is the speed of light (3.0 x 10^8 m/s), is: frequency (Hz) * wavelength (m) = c So given a radio wave with a frequency of 10Hz, to solve for wavelength, I just need to take the speed of light and divide by 10! 30,000,000 divided by 10 gives a value of a wavelength of 30,000,000 meters. To summarize this section, frequency and wavelength are important properties of radio waves. Although they describe different aspects of a radio wave, they are essentially synonymous because we can easily convert between the two. When people are talking about radio waves, you may hear them talk in terms of frequencies (e.g. megahertz, gigahertz) or you may hear them talk in terms of wavelengths (e.g. meters). In the next section, we'll see why exactly frequency is such an important characteristic of radio waves. How we distinguish between radio waves An important thing to remember about radio waves is that nowadays they surround us everywhere we go! Radio waves are powerful because they can go through obstacles like walls, and they can potentially propagate over huge distances at a relatively cheap cost. Radio waves are used to communicate information in technologies such as GPS, WiFi, Bluetooth, cell phones, music radio stations, and more. The problem with this is that these radio waves interfere with each other and combine together to become a jumbled mess! They are all co-existing within the same space, and they can't avoid each other. In real life we don't get to have nice, simple, isolated radio wave like in the previous sections, we get a mix of radio waves coming all at once! And somehow, we have to find and narrow down the signal we care about. Imagine you are at an airport and you're trying to talk to your friend, but it is super crowded and theres people talking and shouting all around you. It would be super hard to hear your friend and have a conversation! (In this situation the people represent devices that use radio waves, the sound waves represent radio waves, and the voices & words represent the data we want to transmit) But if your friend talks loud enough, even though your ear is full of noise from everyone else in the airport, you can still figure out what your friend is trying to tell you. This is because you're smart enough to recognize what your friend's voice sounds like and you can focus on that voice. We can do the same thing with radio waves of different frequencies! (Being able to focus on your friend's specific voice is analogous to being able to focus on only radio waves of a specific frequency) In the image below, we can see a red radio wave. This radio wave is actually the combination of 5 radio waves of different frequencies! In the blue, we see this same signal analyzed and split into the individual components, located at its respective frequencies. (Analogy: 5 people talking at the same time, what your ears hear is the red. Your brain recognizing that these are 5 different voices is the blue) The mathematical process of going from the red representation (the signal in the time domain) to the blue representation (the signal in the frequency domain) is called the \"Discrete Fourier Transform\". You may also hear about something called the \"Fast Fourier Transform\" which is the discrete fourier transform, but a very clever and fast way to calculate it. (Intuitively, the DFT/FFT is essentially comparing a bunch of sine waves of varying frequencies to the signal detected, and calculating how similar they are. This would be like your brain iterating through all possible human voices and checking to see how strongly your ears hear that particular voice) This means that even though there may be a jumbled mess of radio waves surrounding us at all times, if they are radio waves of different frequencies, we are able to distinguish between all these different frequencies using some old fashioned engineering. This non-trivial fact is what allows our world to have so many different types of devices communicating wirelessly all at the same time! They are all using radio waves, all in the same space, but at different frequencies! This is why radio waves are identified by their frequency (or wavelength). Summary In this section on radio waves, we learned about what they are, the basics of how they're produced, frequency & wavelength, and how we distinguish between different radio waves co-existing in the same space. These are the fundamental concepts behind the physics of radio waves that engineers take advantage of. In the next section on antennas, we will learn what they are and how they are used to efficiently propagate/send radio waves. In another section, we will learn more about how exactly we manipulate radio waves to convey the information we want to send. Antennas We use antennas in our everyday lives, but most people don't know how they work. We use antennas on cars, on buildings, and even within our computers and phones! How they work Material properties Antennas are all made up of electrically conductive material. This usually means antennas are made out of metals like copper. Materials that are electrically conductive allow electrons to freely move throughout it. The opposite type of material would be electrically insulating material. As a real-life analogy, imagine a typical swimming pool filled with water. A normal pool like this allows people to freely swim through it! In this analogy the water represents electrically conductive material and people represent electrons. Now imagine a piece of copper metal as being that pool of water. Because copper is electrically conductive, electrons can freely move through it! An analogy for an electrically insulating material would be a swimming pool filled with jello/pudding/gelatin. If someone tried diving into that pool, they wouldn't get very far and it'd be super hard or impossible to swim through it. In this analogy the jello/pudding/gelatin represents electrically insulating material and people represent electrons. Now imagine a piece of plastic being that pool of water. Because plastic is electrically insulating, eletrons are mostly stuck where they are inside the plastic! Taking advantage of moving electrons Antennas need to be electrically conductive because they transmit and receive radio waves by taking advantage of the movement of electrons. In the above section on \"How radio waves are created\" we learned that radio waves are generated by moving an electron back and forth in an oscillating (repetitive) motion. This oscillation of electrons occurs in the antennas. If antennas weren't electrically conductive, these electrons wouldn't be able to move and create these radio waves! How transmitting with an antenna works In order to transmit with an antenna, the antenna needs to be connected to an electrical component that can control the movement of these electrons. TODO: expand/clarify? How receiving with an antenna works Antennas receive radio signals passively. As the electromagnetic fields are manipulated in the environment around an antenna, the electrons in the antenna move accordingly (because of how the physics of it work). By monitoring the movement of these electrons, the respective radio wave can be captured. TODO: expand/clarify? Communicating with radio waves How do we as humans harness this power of manipulating radio waves as communication? We agree on a bunch of different rules and conventions on how we will manipulating these radio waves to convey information efficiently and responsibly. In the United States, most of these rules are established and enforced by the Federal Communications Commission (FCC). An analogy To lay a conceptual foundation for this relatively abstract section, here is an analogy. Suppose we have two friends with the simple names of \"A\" and \"B\" that want to talk to each other over a distance, but they cant see, hear, or touch each other over that distance. The only way method of communication they have is a really long piece of rope between them. So once they travel far away from each other, they will each be holding one end of the rope and will be trying to communicate. But before they travel far away from each other, they need to talk to each other to figure out a set of rules of communication so that they can understand each other when they feel the rope moving. When coming up with these rules for communication, one of the first things that A & B need to do is come up with a language. Because A & B really like computers, they chose the language of computers: binary. They chose this language because it is super simple and effective; it only has two letters (1 and 0) and you can send tons of information by being clever with 1s and 0s (thats what computers do). Now the next thing that A & B needs to do is figure out how to use the rope to send these 1s and 0s. Here are some ideas they brainstormed together: * If the rope is moving up and down (oscillating), then that is considered a 1. If the rope is not moving, then that is considered a 0. * If the rope is oscillating super fast then that's a 1, but if the rope is oscillating slowly then that's a 0. * If the rope is oscillating super fast then that's a 0, but if the rope is oscillating slowly then that's a 1. * If the rope is oscillating with a big height then that's a 1, but if the rope is oscillating with small height then that's a 0. A & B realized two properties of the movement of the rope that they could capture: (1) frequency, how fast the rope is oscillating, and (2) amplitude, how tall the rope is when its oscillating. The term for manipulating these properties is \"modulation\". This makes sense because a dictionary definition of modulation is \"to adjust\"; modulation is just a fancy word for changing. In this analogy, the material/medium of communication was the rope. But in our context, the material/medium of communication is radio waves. Both of these materials have frequency and amplitude that can be modulated to send information, and demodulated to receive that information. In the next section, we'll learn about frequency and amplitude modulation. We'll also learn about some other types of modulation that don't have a direct real-life connection to ropes. Modulation Frequency modulation Amplitude modulation Other modulation schemes Frequency allocation Baseband signal and carrier signals Bandwidth Bands and Channels Wireless Communication Protocols In the previous section on \"Communicating with Radio Waves\", we learned how we are able to transmit messages wirelessly over radio waves via modulation. We understood this through our analogy with friends A & B who came up with a way to send letters in their binary language (1 and 0) through a rope. Assuming they were able to do this successfully, they could send long streams of messages that look something like \"101011100101010101010\". But that's still not enough! They need to come up with a 'protocol' for deciphering what this message actually means! For example, they could come up with a simple protocol for sending messages about how their day went. * The first 3 letters would represent how their day went: \"101\" could mean that they had a good day, and \"010\" could mean that they had a bad day, and maybe \"110\" means that their day went okay. * The next 3 letters would represent the weather: \"100\" could mean that it was sunny and \"101\" could mean that it was rainy. We have these same types of protocols in real life that are much more complicated. They are carefully designed to ensure security (can people intercept messages?), reliability (what if the message gets messed up in certain places?), and efficiency (how much useful data can we send at a time?). WiFi Bluetooth Cellular communication","title":"Wireless Communication"},{"location":"learn/wireless-communication/#crash-course-in-wireless-communication","text":"Authored by: Dominick Ta Last updated: June 18th, 2021 TODO: [ ] Expand on transmit/receiving in antennas section [ ] Finish communication section [ ] Finish protocols section This is a crash course in wireless communication: the magical way that we humans send information (e.g. music, messages, text, videos) to each other over long distances, without a wire. Wireless communication is primarily powered by radio waves, a physical thing that we as humans cannot see or touch. In this article you will gain a layman's understanding of how wireless communication works. Specifically, this article will cover the following broad topics: Radio waves and the physics behind it Antennas How data is communicated via radio waves Examples of wireless communication technologies This is not meant to be a comprehensive article, so there will be a lot of simplifications, analogies, and informal explanations. Please let me know at domta@cs.uw.edu if you see any inaccuracies, misconceptions, or misnomers.","title":"Crash Course in Wireless Communication"},{"location":"learn/wireless-communication/#radio-waves","text":"Radio waves are just oscillations of energy that exist throughout our environment. They can be generated naturally by lightning, or artifically by equipment made by humans such as cell phones. The technical definition of radio waves are that they are a form of 'electromagnetic radiation'. Other types of electromagnetic radiation include visible light (what we get from the sun), infrared, and X-rays.","title":"Radio waves"},{"location":"learn/wireless-communication/#how-radio-waves-are-created","text":"To understand why radio waves are considered a type of electromagnetic radiation, it is helpful to know how we generate radio waves. This section is not important to fully understand, but it is good to skim to have a basic idea of how this stuff works. We create radio waves by moving electrons back and forth within an electrically conductive object (an object made of material that allows electrons to move freely, such as metals). This works because electrons have special properties: All electrons have ' electric fields ' surrounding them that attracts and repels other charged particles. All moving electrons produce ' magnetic fields ' that are the basis for how magnets work. Therefore, when electrons move there are two fields (electric & magnetic) present that combine to create creates an ' electromagnetic field '. By moving an electron back and forth in an oscillating (repetitive) motion, these electromagnetic fields are constantly being disturbed/moved in a way that creates electromagnetic waves or equivalently, electromagnetic radiation . In this GIF below, we see the charge of an antenna changing, representing electrons moving back and forth within the antenna. This creates pulsating electromagnetic waves. Note: in this particular GIF, it is actually only showing the pulsating electric fields. In this GIF below, we are able to fully see an electromagnetic wave with a 3D representation. The red component of the wave represents the electric field, while the blue component represents the magnetic field. Notice how they are perpendicular to each other! This is also why the GIF above didn't show both fields: it was a 2D representation! In this section, we learned about radio waves. In essence, you can just think of radio waves as physical phenomenon that look like these sine waves: With the proper hardware and knowledge, we can create any type of wave we want! We can vary frequencies (how fast the waves go by), amplitudes (how tall/powerful the waves are), and phases (what position within the loop the wave is in).","title":"How radio waves are created"},{"location":"learn/wireless-communication/#frequency-wavelength","text":"It turns out that a fundamental characteristic of any given radio wave is its frequency. Therefore, it's important to know what 'frequency' means, and how it relates to the concept of 'wavelength'. Frequency is a measurement of how often something happens. In the case of radio waves, it measures how many cycles of a radio wave occurs in a certain amonut of time. Frequency is measured in the units of hertz (Hz) , which represents cycles per second. If we had a radio wave that passed through 10 complete cycles in a minute, it would have a frequency of 0.16Hz (10 cycles per 60 seconds). Wavelength measures the physical length of a single cycle in a radio wave. If we could see radio waves and measure it, and we saw that there was a distance of 10-feet between two of the peaks in a radio wave, then that radio wave would have a wavelength of 10 feet. In the image above, we can see a natural relationship between frequency and wavelength: a faster frequency means that you will have shorter wavelengths! Or conversely, longer wavelengths means that there is a slower frequency! When one value goes up, the other value has to go down; this is called an inverse relationship . So if I told you that I had a radio wave with a very high frequency, you could figure out that my radio wave has very small wavelengths. And actually, if I told you exactly what frequency my radio waves travelled at, you'd be able to figure out the exact size of the wavelength! For example, if I told you I had a radio wave with a frequency of 10Hz, you would be able to figure out that my radio wave has a wavelength of approximately 30,000,000 meters. This is because radio waves are a physical thing, so they always travel through air at the same speed: the speed of light. This means we can consistently convert back and forth between frequency and wavelength with some basic algebra. The basic equation, where c is the speed of light (3.0 x 10^8 m/s), is: frequency (Hz) * wavelength (m) = c So given a radio wave with a frequency of 10Hz, to solve for wavelength, I just need to take the speed of light and divide by 10! 30,000,000 divided by 10 gives a value of a wavelength of 30,000,000 meters. To summarize this section, frequency and wavelength are important properties of radio waves. Although they describe different aspects of a radio wave, they are essentially synonymous because we can easily convert between the two. When people are talking about radio waves, you may hear them talk in terms of frequencies (e.g. megahertz, gigahertz) or you may hear them talk in terms of wavelengths (e.g. meters). In the next section, we'll see why exactly frequency is such an important characteristic of radio waves.","title":"Frequency & Wavelength"},{"location":"learn/wireless-communication/#how-we-distinguish-between-radio-waves","text":"An important thing to remember about radio waves is that nowadays they surround us everywhere we go! Radio waves are powerful because they can go through obstacles like walls, and they can potentially propagate over huge distances at a relatively cheap cost. Radio waves are used to communicate information in technologies such as GPS, WiFi, Bluetooth, cell phones, music radio stations, and more. The problem with this is that these radio waves interfere with each other and combine together to become a jumbled mess! They are all co-existing within the same space, and they can't avoid each other. In real life we don't get to have nice, simple, isolated radio wave like in the previous sections, we get a mix of radio waves coming all at once! And somehow, we have to find and narrow down the signal we care about. Imagine you are at an airport and you're trying to talk to your friend, but it is super crowded and theres people talking and shouting all around you. It would be super hard to hear your friend and have a conversation! (In this situation the people represent devices that use radio waves, the sound waves represent radio waves, and the voices & words represent the data we want to transmit) But if your friend talks loud enough, even though your ear is full of noise from everyone else in the airport, you can still figure out what your friend is trying to tell you. This is because you're smart enough to recognize what your friend's voice sounds like and you can focus on that voice. We can do the same thing with radio waves of different frequencies! (Being able to focus on your friend's specific voice is analogous to being able to focus on only radio waves of a specific frequency) In the image below, we can see a red radio wave. This radio wave is actually the combination of 5 radio waves of different frequencies! In the blue, we see this same signal analyzed and split into the individual components, located at its respective frequencies. (Analogy: 5 people talking at the same time, what your ears hear is the red. Your brain recognizing that these are 5 different voices is the blue) The mathematical process of going from the red representation (the signal in the time domain) to the blue representation (the signal in the frequency domain) is called the \"Discrete Fourier Transform\". You may also hear about something called the \"Fast Fourier Transform\" which is the discrete fourier transform, but a very clever and fast way to calculate it. (Intuitively, the DFT/FFT is essentially comparing a bunch of sine waves of varying frequencies to the signal detected, and calculating how similar they are. This would be like your brain iterating through all possible human voices and checking to see how strongly your ears hear that particular voice) This means that even though there may be a jumbled mess of radio waves surrounding us at all times, if they are radio waves of different frequencies, we are able to distinguish between all these different frequencies using some old fashioned engineering. This non-trivial fact is what allows our world to have so many different types of devices communicating wirelessly all at the same time! They are all using radio waves, all in the same space, but at different frequencies! This is why radio waves are identified by their frequency (or wavelength).","title":"How we distinguish between radio waves"},{"location":"learn/wireless-communication/#summary","text":"In this section on radio waves, we learned about what they are, the basics of how they're produced, frequency & wavelength, and how we distinguish between different radio waves co-existing in the same space. These are the fundamental concepts behind the physics of radio waves that engineers take advantage of. In the next section on antennas, we will learn what they are and how they are used to efficiently propagate/send radio waves. In another section, we will learn more about how exactly we manipulate radio waves to convey the information we want to send.","title":"Summary"},{"location":"learn/wireless-communication/#antennas","text":"We use antennas in our everyday lives, but most people don't know how they work. We use antennas on cars, on buildings, and even within our computers and phones!","title":"Antennas"},{"location":"learn/wireless-communication/#how-they-work","text":"","title":"How they work"},{"location":"learn/wireless-communication/#material-properties","text":"Antennas are all made up of electrically conductive material. This usually means antennas are made out of metals like copper. Materials that are electrically conductive allow electrons to freely move throughout it. The opposite type of material would be electrically insulating material. As a real-life analogy, imagine a typical swimming pool filled with water. A normal pool like this allows people to freely swim through it! In this analogy the water represents electrically conductive material and people represent electrons. Now imagine a piece of copper metal as being that pool of water. Because copper is electrically conductive, electrons can freely move through it! An analogy for an electrically insulating material would be a swimming pool filled with jello/pudding/gelatin. If someone tried diving into that pool, they wouldn't get very far and it'd be super hard or impossible to swim through it. In this analogy the jello/pudding/gelatin represents electrically insulating material and people represent electrons. Now imagine a piece of plastic being that pool of water. Because plastic is electrically insulating, eletrons are mostly stuck where they are inside the plastic!","title":"Material properties"},{"location":"learn/wireless-communication/#taking-advantage-of-moving-electrons","text":"Antennas need to be electrically conductive because they transmit and receive radio waves by taking advantage of the movement of electrons. In the above section on \"How radio waves are created\" we learned that radio waves are generated by moving an electron back and forth in an oscillating (repetitive) motion. This oscillation of electrons occurs in the antennas. If antennas weren't electrically conductive, these electrons wouldn't be able to move and create these radio waves!","title":"Taking advantage of moving electrons"},{"location":"learn/wireless-communication/#how-transmitting-with-an-antenna-works","text":"In order to transmit with an antenna, the antenna needs to be connected to an electrical component that can control the movement of these electrons. TODO: expand/clarify?","title":"How transmitting with an antenna works"},{"location":"learn/wireless-communication/#how-receiving-with-an-antenna-works","text":"Antennas receive radio signals passively. As the electromagnetic fields are manipulated in the environment around an antenna, the electrons in the antenna move accordingly (because of how the physics of it work). By monitoring the movement of these electrons, the respective radio wave can be captured. TODO: expand/clarify?","title":"How receiving with an antenna works"},{"location":"learn/wireless-communication/#communicating-with-radio-waves","text":"How do we as humans harness this power of manipulating radio waves as communication? We agree on a bunch of different rules and conventions on how we will manipulating these radio waves to convey information efficiently and responsibly. In the United States, most of these rules are established and enforced by the Federal Communications Commission (FCC).","title":"Communicating with radio waves"},{"location":"learn/wireless-communication/#an-analogy","text":"To lay a conceptual foundation for this relatively abstract section, here is an analogy. Suppose we have two friends with the simple names of \"A\" and \"B\" that want to talk to each other over a distance, but they cant see, hear, or touch each other over that distance. The only way method of communication they have is a really long piece of rope between them. So once they travel far away from each other, they will each be holding one end of the rope and will be trying to communicate. But before they travel far away from each other, they need to talk to each other to figure out a set of rules of communication so that they can understand each other when they feel the rope moving. When coming up with these rules for communication, one of the first things that A & B need to do is come up with a language. Because A & B really like computers, they chose the language of computers: binary. They chose this language because it is super simple and effective; it only has two letters (1 and 0) and you can send tons of information by being clever with 1s and 0s (thats what computers do). Now the next thing that A & B needs to do is figure out how to use the rope to send these 1s and 0s. Here are some ideas they brainstormed together: * If the rope is moving up and down (oscillating), then that is considered a 1. If the rope is not moving, then that is considered a 0. * If the rope is oscillating super fast then that's a 1, but if the rope is oscillating slowly then that's a 0. * If the rope is oscillating super fast then that's a 0, but if the rope is oscillating slowly then that's a 1. * If the rope is oscillating with a big height then that's a 1, but if the rope is oscillating with small height then that's a 0. A & B realized two properties of the movement of the rope that they could capture: (1) frequency, how fast the rope is oscillating, and (2) amplitude, how tall the rope is when its oscillating. The term for manipulating these properties is \"modulation\". This makes sense because a dictionary definition of modulation is \"to adjust\"; modulation is just a fancy word for changing. In this analogy, the material/medium of communication was the rope. But in our context, the material/medium of communication is radio waves. Both of these materials have frequency and amplitude that can be modulated to send information, and demodulated to receive that information. In the next section, we'll learn about frequency and amplitude modulation. We'll also learn about some other types of modulation that don't have a direct real-life connection to ropes.","title":"An analogy"},{"location":"learn/wireless-communication/#modulation","text":"","title":"Modulation"},{"location":"learn/wireless-communication/#frequency-modulation","text":"","title":"Frequency modulation"},{"location":"learn/wireless-communication/#amplitude-modulation","text":"","title":"Amplitude modulation"},{"location":"learn/wireless-communication/#other-modulation-schemes","text":"","title":"Other modulation schemes"},{"location":"learn/wireless-communication/#frequency-allocation","text":"","title":"Frequency allocation"},{"location":"learn/wireless-communication/#baseband-signal-and-carrier-signals","text":"","title":"Baseband signal and carrier signals"},{"location":"learn/wireless-communication/#bandwidth","text":"","title":"Bandwidth"},{"location":"learn/wireless-communication/#bands-and-channels","text":"","title":"Bands and Channels"},{"location":"learn/wireless-communication/#wireless-communication-protocols","text":"In the previous section on \"Communicating with Radio Waves\", we learned how we are able to transmit messages wirelessly over radio waves via modulation. We understood this through our analogy with friends A & B who came up with a way to send letters in their binary language (1 and 0) through a rope. Assuming they were able to do this successfully, they could send long streams of messages that look something like \"101011100101010101010\". But that's still not enough! They need to come up with a 'protocol' for deciphering what this message actually means! For example, they could come up with a simple protocol for sending messages about how their day went. * The first 3 letters would represent how their day went: \"101\" could mean that they had a good day, and \"010\" could mean that they had a bad day, and maybe \"110\" means that their day went okay. * The next 3 letters would represent the weather: \"100\" could mean that it was sunny and \"101\" could mean that it was rainy. We have these same types of protocols in real life that are much more complicated. They are carefully designed to ensure security (can people intercept messages?), reliability (what if the message gets messed up in certain places?), and efficiency (how much useful data can we send at a time?).","title":"Wireless Communication Protocols"},{"location":"learn/wireless-communication/#wifi","text":"","title":"WiFi"},{"location":"learn/wireless-communication/#bluetooth","text":"","title":"Bluetooth"},{"location":"learn/wireless-communication/#cellular-communication","text":"","title":"Cellular communication"},{"location":"tutorials/enb-setup/","text":"Step 2: eNodeB and SAS Setup Introduction Despite CBRS being a relatively open frequency band, the processes for spectrum access are still somewhat opaque and require significant capital investment and/or ISP-level resources to set up. To clarify this process, here\u2019s a step by step walkthrough tutorial of the setup of a Baicells eNodeB (eNB) base station running in the Citizen\u2019s Broadband Radio Service (CBRS) spectrum band (or band 48). Before following this tutorial, you should have completed the setup of a LTE Evolved Packet Core (EPC) to control your eNB, for which the setup of an open source version based on open5gs is outlined in this tutorial . I. Get set up with a Spectrum Access System (SAS) A. Why get set up with a SAS? Current FCC regulations require all CBRS equipment (called a CBSD) to be registered on a Spectrum Access System (SAS) that coordinates all spectrum assignments and ensures that no transmissions interfere with each other. This will likely require a commercial agreement with a SAS provider such as Google, Federated Wireless, etc. This tutorial uses the Google SAS. B. CPI License At least one member of your team will require \u201cCertified Professional Installer\u201d (CPI) training and license in order to hold legal responsibility for and sign off on device installations. Most SAS providers will offer training at about $500 for both an online training course and the certification exam. If you aren\u2019t able to get someone on your team certified, be sure to collaborate with a CPI! Feel free to contact us at the Local Connectivity Lab if you need support for your community project in this regard, and we can figure out what is feasible. The following are some links and helpful notes about this process: * https://wifidevan.wordpress.com/cbrs-certified-professional-installer-cpi-study-notes/ * https://alliancecorporation.ca/webinars/webinars-webinars/cbrs-for-beginners-part-2-by-commscope/ * https://cbrs.wirelessinnovation.org/acronyms C. SAS Pricing Agreements For Google, the price options provided us in summer 2020 were: Fixed Wireless SAS services are billed per link/household so you pay for each CPE (Customer Premises Equipment) CBSD registered with SAS. CBSDs that operate as base stations are free of charge. Price Per Customer Link $2.25/month. Mobility/Private LTE (price is based on CBSD categoris) Category A CBSD max transmit capability: 30 dBm/10 MHz = 20 dBm/MHz or \u201c1 Watt\u201d mounted under 6m Height Above Average Terrain measured 3-16 km away from site $2.67/month Category B CBSD max transmit capability: Maximum EIRP of 47 dBm/10 MHz = 37 dBm/MHz or \u201c50 Watt\" $13.33/month. D. SAS Registration CBSDs must register their transmit capabilities with the SAS using either the \u201cone-step\u201d or \u201cmulti-step\u201d process. The one-step process requires you to input all installation parameters and sign them with the CPI certificate all on the base station itself, or via a cloud domain proxy such as used by Baicells. Not all base stations support this and the interfaces for doing so might vary widely, so \u201cmulti-step\u201d is typically recommended. II. Register device in SAS portal This tutorial will be walking through steps following the specifics of the Google SAS portal interface, but the steps should be generalizable to other SAS portals. A. Once you have an account on an SAS service, register your devices on their portal or dashboard. The Google SAS portal can be found at: https://wirelessconnectivity.google.com/sas/ B. Our Setup Our test setup in the lab includes: 1W Baicells Nova 233 base station in the CBRS band mounted on the 6th floor balcony of our UW computer science building. Alpha Wireless 18 dBi-gain panel antenna with a beamwidth of 65 degrees (model AW3014-T4), mounted straight ahead and not tilted down. C. Example Configuration An example configuration for this setup is shown below. The configuration screen is a right-hand sidebar next to the map view, hence the unwieldy aspect ratio. Explanation of parameters: CBSD Category (A or B): Defined by rules in Section I.C above User ID Specified by the SAS provider when you register FCC ID and Serial Number: Both the radio and antenna model must be pre-authorized for use with CBRS by the FCC. The FCC ID is used to identify this approved device type. The serial number specifies the exact device identity. Both can usually be found on the outside of the device (circled in image below). Beamforming Gain, Beamwidth Based on antenna specs in II.B EIRP Effective Isotropic Radiated Power of your system including both the base station radio and antenna. For a Cat B CBSD, this must be 46 dBm/10 MHz=36 dBm/MHz or lower. Calculate this value by adding the max transmit power (actually power density per MHz) of the base station, in our case 28 dBm, to the antenna beamforming gain, in our case 18 dBi; 28+18=36 dBm/MHz. For the units requested by the Google interface, add 10 to this value to specify power per 10 MHz instead of per MHz. Height Specified in terms of height Above Ground Level (AGL) which you can measure using a rangefinder/ measuring tape/ building plan, or in height Above Mean Sea Level (AMSL). Not in terms of HAAT as in the Cat A/B definition. Must be accurate to within 3 m. Azimuth Refers to the compass heading/ direction that the antenna is pointing (set this to 0 for an omnidirectional antenna). This FCC tool is extremely helpful for calculating the azimuth based on the antenna\u2019s gps location and that of a structure you are pointing it at. You can get these GPS coordinates via Google Maps or Google Earth. Air Interface E_UTRA is the LTE radio standard used by our Baicells box. The only \u201csupported spec\u201d currently available for Baicells is FFS (according to a forum post, linked here). Location: In the Google interface, set the site location in GPS coordinates under the tab labeled with the map pin icon. (not shown) Parameters under \"CBSD Info\" Call Sign As far as I can tell, this can be any reasonable alphanumeric string as long as it is unique and matches the value of the \u201ccall sign\u201d parameter as sent over by the eNB or domain proxy. You will set this in the SAS interface as well as either the eNB or Baicells Cloud Core (they all need to match). Others These should match the settings with the same name on the eNB\u2019s local management portal, shown on the \u201cBasic Info\u201d page in section IV.A below. D. CPI Signature When the parameters are all filled out, click the big red \u201cReady for CPI\u201d button at the bottom of the panel (not shown here). On the CPI\u2019s version of the interface, it will provide a place to \u201csign\u201d the configuration with their CPI certificate, which they will upload to the interface. This must happen before the device can get a spectrum grant. E. Status Tab After the CPI signs the eNB configuration, under the \u201cStatus\u201d tab (visible in the config panel), you should see \u201cNot yet Registered\u201d (or a similar message) because the eNB has not checked in to the Google SAS yet with its matching parameters to complete the multi-step process. If something has otherwise gone wrong, you\u2019ll see an error message here. F. Other helpful links Google CBSD registration and deregistration Elevation finder tool with map III. Steps in Baicells Cloud interface A. Make a Baicells OMC account. Due to Baicells\u2019 use of a \u201cdomain proxy\u201d for their SAS requests, you will need to make a new user account in the Baicells Operators Management Console (OMC): https://cloudcore.baicells.com:4443/ This is distinct from their paid \u201cCloud Core\u201d service which we will not be using in this tutorial, although the management portal is the same. B. Take note of the CloudKey Once you have made an account, note the 6-letter \u201cCloudKey\u201d in the upper right corner of the screen (circled in red). This will need to be inputted into the local eNB management portal for the eNB to check into the Cloud OMC. On your version of this portal, if you\u2019re doing this for the first time, you shouldn\u2019t see any eNBs already present. C. Set your SAS service provider. Navigate to Advance\u2192SAS in the left hand menu, and then click the gear icon on the upper right corner, which has the hover text \u201cSettings.\u201d IV. Steps in Baicells management interface A. Local Management Portal The Baicells eNodeB (eNB) is best managed through the browser-based management portal; the current command line interface is accessible but extremely limited. The default IP address of the management portal (and that of most Baicells equipment I\u2019ve seen) is 192.168.150.1, and the default login credentials are admin/admin. I would recommend changing the admin login credentials to be more secure. Connect your computer to the eNB via Ethernet, and navigate to this IP address in your browser (using http://192.168.150.1, not https). Baicells Initial Login Screen: BTS Info\u2192\u201cBasic Info\u201d Page visible upon login: B. Upgrade firmware Upgrade the firmware to the latest firmware version that supports SAS functionality, or verify that it is already up to date. You can check the official firmware page under the correct eNB model. The Nova 233 CBRS small cell we\u2019re using is model mBS1105. The latest firmware version after which SAS is officially supported is BaiBS_RTS_3.6.6.IMG (as of Feb 2021), for which the direct download is available here . Do not skip this step, otherwise none of the following steps will work right. C. Get everything connected Once the firmware is upgraded, you will want to get the eNB connected to your local LTE core network (EPC) as well as to the Internet so it can contact the necessary SAS infrastructure. 1. Configure Internet Access (WAN) Navigate to the Network\u2192WAN/LAN/VLAN tab on the left hand menu. We will set the WAN interface IP address to 192.168.151.1, since the Baicells console requires (for whatever reason) a different subnet for the WAN as opposed to the LAN. Then we will connect the eNB to an Ethernet port on the EPC that has the IP address 192.168.151.2 (as set up in our previous tutorial), which will act as the eNB\u2019s Internet gateway. Don\u2019t forget to hit \u201cSave\u201d after each change you make in this interface. 2. Check Internet access At this point, if the EPC is configured correctly to pass eNB traffic to the Internet, the eNB should be able to ping an arbitrary IP address. To test this, navigate to the Network\u2192Diagnostics tab on the left hand menu and select \u201cPing\u201d under the \u201cMethod of Diagnostics\u201d dropdown menu. Set the \u201cTarget IP Domain\u201d to be a highly reachable IP address on the Internet such as 1.1.1.1, which is the CloudFlare DNS server. Press \u201cImplement.\u201d If the result is \u201cFail!\u201d as in the screenshot, there is likely something wrong with your eNB\u2019s Internet connection through the EPC; you should fix this issue before continuing. 3. Reboot as needed If a message appears that the eNB needs a reboot after the new settings are saved, navigate to the Reboot tab in the left hand menu and perform the reboot (Warm Reset is fine). 4. Attach to Baicells OMC To configure the eNB to talk to the OMC as discussed in the prior section, navigate to the BTS Setting\u2192Management Server tab in the management console and enter the CloudKey. Within a few minutes, the eNB should appear in your Baicells Cloud OMC console, and the \u201cBasic Info\u201d page should show that the OMC is \u201cConnected.\u201d 5. Disable IPsec For our purposes we will not be using IPsec between our EPC and eNB; the default IPSec configured is used for the Baicells Cloud EPC which we are not using. Navigate to the Network\u2192\u201cMME&IPSec Binding\u201d menu tab and set \u201cIPSec Status\u201d to \u201cDisable.\u201d You may also delete the IPSec tunnels as shown below. 6. Disable GPS Sync when testing indoors. Navigate to the \u201cBTS Setting\u201d\u2192\u201cSync Setting\u201d menu and disable both \u201cForced Sync\u201d and \u201cGPS Sync Switch,\u201d in case you need to work with the base station in a location where you don\u2019t have a strong GPS signal. Some base stations will not start up normally or attach to the EPC unless they get a GPS signal, and we should avoid this behavior. 7. Change the MME settings Change the MME settings. Since we are using our local EPC, we will need to change the MME settings to reflect our MME\u2019s IP address, on which it is listening for eNBs to attach, as well as other configurations. Navigate to the BTS Info\u2192Quick Setting tab on the left hand menu. Disable RF You should set the \u201cRF Status\u201d setting to \u201cDisable\u201d before you change the MME IP, because attaching to the MME will normally cause the eNB\u2019s radio to turn on. Since we have not enabled the eNB to ask for spectrum coordinated by the SAS yet, turning on the radio may cause unwanted interference on someone else\u2019s network. PLMN setting Remove the existing \u201cPLMN ID\u201d (by clicking the trash can symbol) and set it to the value that you have configured in your EPC. In our networks, we use \u201c91054\u201d as our PLMN, so add this as a \u201cPrimary\u201d and \u201cNotReserved\u201d PLMN by entering the number in the text box and clicking the \u201c+\u201d button. MME IP address Remove the existing MME IP associated with the old PLMN. Add the new MME IP address, in our case 192.168.150.2, by entering it in the text box and clicking \u201c+\u201d. This MME IP should be associated with the newly added PLMN by default. Save the changes and reboot the eNB (Warm Reset); after the reboot has finished (within a few minutes), the eNB should attach to the MME. If you navigate to BTS Info\u2192Basic Info, you should see the MME Status change from \u201cNot Connected\u201d to \u201cConnected.\u201d If you are looking at the MME logs on the EPC, you will also see the record that an eNB has attached. 8. Enable SAS SAS should only be enabled after successfully attaching the eNB to the MME. Unfortunately, when SAS is enabled, the eNB will not attach to the MME unless it has a currently valid authorization to transmit on a certain frequency. However, until it is attached to an MME, the Baicells Cloud OMC will not provide it this authorization. So we need to have SAS disabled first with the RF also disabled, attach the eNB to the MME, and then enable SAS. Choose \u201cMulti-step\u201d under \u201cSAS Registration Type,\u201d as specified in Section I.E. Also choose \u201cB\u201d under \u201ccategory,\u201d and write in the other parameters to match the ones with the same name in the Google SAS configuration. After you click \u201cSave,\u201d SAS should be enabled immediately. You should see the SAS enabled status change in the Baicells Cloud OMC. If all goes smoothly, your device should get an authorization to transmit within a few minutes and the radio should turn on! 9. Check Baicells CLOUD OMC to debug issues You can check the status of the SAS authorization process in the Cloud OMC. Here you can find logs (upper right corner of SAS screen, shown in the screenshot below) with any error messages that may have occurred in the process. Errors can be caused by invalid or non-matching parameter values, lack of CPI signature, lack of spectrum availability, etc. In more difficult cases, after device registration the SAS may not respond to spectrum inquiries without sending any clear error messages. I have encountered this scenario when requesting spectrum around midnight, which may have been caused by brief database unavailability during the daily \u201cSAS Sync\u201d or IAP. My recommendation is to avoid requesting a new spectrum grant after 11 pm PST. If you change anything about the equipment used on site or the location/orientation of the equipment, you need to change the SAS registration, have it re-signed by the CPI, and use the Baicells OMC to re-request a new spectrum authorization- this process is described in the following section. V. How to change location, antenna properties, etc. after deployment As an example, this section will show how you would change the equipment\u2019s location upon moving from test site to deployment site. Get the new GPS location either manually using Google Maps/Earth, or automatically using Baicells OMC\u2019s GPS reading for the eNB if available. Google SAS steps In the upper right hand corner of the Google SAS configuration for the deployed equipment (long narrow right side panel for a particular site), press the unlock button (shaped like a padlock) to make the configuration editable. To edit the site location, click on the map pin icon in the upper left corner of this same right hand configuration panel to enter the location panel. Enter the new GPS coordinates in the box. After your changes, lock the site configuration again. (If the red \u201cReady for CPI\u201d button appears again at the bottom of the main configuration panel, go ahead and click it to prompt the CPI to sign.) You may have to wait a few minutes or hours for the changes to sync to the CPI\u2019s SAS database view. If after a while the CPI still cannot see the location change, ask them to enter the new GPS coordinates in their own interface and re-sign the configuration. Baicells Cloud OMC steps On the Baicells OMC, navigate to the Advance\u2192SAS screen where you can see the list of CBRS devices and their SAS status. Click on the 3 dots ( \u2807) symbol before the serial number for a particular device and click on \u201cProcedure\u201d to enter the SAS procedure screen. On the Procedure screen, you can see the most recent SAS logs, relinquish and re-request active spectrum authorizations, or de-register and re-register devices. First click on the \u201cAuthorized\u201d icon and click on the \u201cRelinquishment req\u201d button to relinquish the current spectrum authorization. Then the latter two icons will become greyed out, but the device will remain registered. We will need to fully de-register and re-register the device with the new parameters. Click the \u201cRegistered\u201d icon and then the \u201cDe-register\u201d button when it appears to de-register the device. Once the device is in the \u201cUnregistered\u201d state, click the \u201cUnregistered\u201d icon and then click the \u201cRegister req\u201d button when it appears. If all goes well, the device should re-register, and also request and receive a new grant (completing the full procedure) within a few moments.","title":"Step 2. eNodeB and SAS Setup"},{"location":"tutorials/enb-setup/#step-2-enodeb-and-sas-setup","text":"","title":"Step 2: eNodeB and SAS Setup"},{"location":"tutorials/enb-setup/#introduction","text":"Despite CBRS being a relatively open frequency band, the processes for spectrum access are still somewhat opaque and require significant capital investment and/or ISP-level resources to set up. To clarify this process, here\u2019s a step by step walkthrough tutorial of the setup of a Baicells eNodeB (eNB) base station running in the Citizen\u2019s Broadband Radio Service (CBRS) spectrum band (or band 48). Before following this tutorial, you should have completed the setup of a LTE Evolved Packet Core (EPC) to control your eNB, for which the setup of an open source version based on open5gs is outlined in this tutorial .","title":"Introduction"},{"location":"tutorials/enb-setup/#i-get-set-up-with-a-spectrum-access-system-sas","text":"","title":"I. Get set up with a Spectrum Access System (SAS)"},{"location":"tutorials/enb-setup/#a-why-get-set-up-with-a-sas","text":"Current FCC regulations require all CBRS equipment (called a CBSD) to be registered on a Spectrum Access System (SAS) that coordinates all spectrum assignments and ensures that no transmissions interfere with each other. This will likely require a commercial agreement with a SAS provider such as Google, Federated Wireless, etc. This tutorial uses the Google SAS.","title":"A. Why get set up with a SAS?"},{"location":"tutorials/enb-setup/#b-cpi-license","text":"At least one member of your team will require \u201cCertified Professional Installer\u201d (CPI) training and license in order to hold legal responsibility for and sign off on device installations. Most SAS providers will offer training at about $500 for both an online training course and the certification exam. If you aren\u2019t able to get someone on your team certified, be sure to collaborate with a CPI! Feel free to contact us at the Local Connectivity Lab if you need support for your community project in this regard, and we can figure out what is feasible. The following are some links and helpful notes about this process: * https://wifidevan.wordpress.com/cbrs-certified-professional-installer-cpi-study-notes/ * https://alliancecorporation.ca/webinars/webinars-webinars/cbrs-for-beginners-part-2-by-commscope/ * https://cbrs.wirelessinnovation.org/acronyms","title":"B. CPI License"},{"location":"tutorials/enb-setup/#c-sas-pricing-agreements","text":"For Google, the price options provided us in summer 2020 were: Fixed Wireless SAS services are billed per link/household so you pay for each CPE (Customer Premises Equipment) CBSD registered with SAS. CBSDs that operate as base stations are free of charge. Price Per Customer Link $2.25/month. Mobility/Private LTE (price is based on CBSD categoris) Category A CBSD max transmit capability: 30 dBm/10 MHz = 20 dBm/MHz or \u201c1 Watt\u201d mounted under 6m Height Above Average Terrain measured 3-16 km away from site $2.67/month Category B CBSD max transmit capability: Maximum EIRP of 47 dBm/10 MHz = 37 dBm/MHz or \u201c50 Watt\" $13.33/month.","title":"C. SAS Pricing Agreements"},{"location":"tutorials/enb-setup/#d-sas-registration","text":"CBSDs must register their transmit capabilities with the SAS using either the \u201cone-step\u201d or \u201cmulti-step\u201d process. The one-step process requires you to input all installation parameters and sign them with the CPI certificate all on the base station itself, or via a cloud domain proxy such as used by Baicells. Not all base stations support this and the interfaces for doing so might vary widely, so \u201cmulti-step\u201d is typically recommended.","title":"D. SAS Registration"},{"location":"tutorials/enb-setup/#ii-register-device-in-sas-portal","text":"This tutorial will be walking through steps following the specifics of the Google SAS portal interface, but the steps should be generalizable to other SAS portals.","title":"II. Register device in SAS portal"},{"location":"tutorials/enb-setup/#a-once-you-have-an-account-on-an-sas-service-register-your-devices-on-their-portal-or-dashboard","text":"The Google SAS portal can be found at: https://wirelessconnectivity.google.com/sas/","title":"A. Once you have an account on an SAS service, register your devices on their portal or dashboard."},{"location":"tutorials/enb-setup/#b-our-setup","text":"Our test setup in the lab includes: 1W Baicells Nova 233 base station in the CBRS band mounted on the 6th floor balcony of our UW computer science building. Alpha Wireless 18 dBi-gain panel antenna with a beamwidth of 65 degrees (model AW3014-T4), mounted straight ahead and not tilted down.","title":"B. Our Setup"},{"location":"tutorials/enb-setup/#c-example-configuration","text":"An example configuration for this setup is shown below. The configuration screen is a right-hand sidebar next to the map view, hence the unwieldy aspect ratio. Explanation of parameters: CBSD Category (A or B): Defined by rules in Section I.C above User ID Specified by the SAS provider when you register FCC ID and Serial Number: Both the radio and antenna model must be pre-authorized for use with CBRS by the FCC. The FCC ID is used to identify this approved device type. The serial number specifies the exact device identity. Both can usually be found on the outside of the device (circled in image below). Beamforming Gain, Beamwidth Based on antenna specs in II.B EIRP Effective Isotropic Radiated Power of your system including both the base station radio and antenna. For a Cat B CBSD, this must be 46 dBm/10 MHz=36 dBm/MHz or lower. Calculate this value by adding the max transmit power (actually power density per MHz) of the base station, in our case 28 dBm, to the antenna beamforming gain, in our case 18 dBi; 28+18=36 dBm/MHz. For the units requested by the Google interface, add 10 to this value to specify power per 10 MHz instead of per MHz. Height Specified in terms of height Above Ground Level (AGL) which you can measure using a rangefinder/ measuring tape/ building plan, or in height Above Mean Sea Level (AMSL). Not in terms of HAAT as in the Cat A/B definition. Must be accurate to within 3 m. Azimuth Refers to the compass heading/ direction that the antenna is pointing (set this to 0 for an omnidirectional antenna). This FCC tool is extremely helpful for calculating the azimuth based on the antenna\u2019s gps location and that of a structure you are pointing it at. You can get these GPS coordinates via Google Maps or Google Earth. Air Interface E_UTRA is the LTE radio standard used by our Baicells box. The only \u201csupported spec\u201d currently available for Baicells is FFS (according to a forum post, linked here). Location: In the Google interface, set the site location in GPS coordinates under the tab labeled with the map pin icon. (not shown) Parameters under \"CBSD Info\" Call Sign As far as I can tell, this can be any reasonable alphanumeric string as long as it is unique and matches the value of the \u201ccall sign\u201d parameter as sent over by the eNB or domain proxy. You will set this in the SAS interface as well as either the eNB or Baicells Cloud Core (they all need to match). Others These should match the settings with the same name on the eNB\u2019s local management portal, shown on the \u201cBasic Info\u201d page in section IV.A below.","title":"C. Example Configuration"},{"location":"tutorials/enb-setup/#d-cpi-signature","text":"When the parameters are all filled out, click the big red \u201cReady for CPI\u201d button at the bottom of the panel (not shown here). On the CPI\u2019s version of the interface, it will provide a place to \u201csign\u201d the configuration with their CPI certificate, which they will upload to the interface. This must happen before the device can get a spectrum grant.","title":"D. CPI Signature"},{"location":"tutorials/enb-setup/#e-status-tab","text":"After the CPI signs the eNB configuration, under the \u201cStatus\u201d tab (visible in the config panel), you should see \u201cNot yet Registered\u201d (or a similar message) because the eNB has not checked in to the Google SAS yet with its matching parameters to complete the multi-step process. If something has otherwise gone wrong, you\u2019ll see an error message here.","title":"E. Status Tab"},{"location":"tutorials/enb-setup/#f-other-helpful-links","text":"Google CBSD registration and deregistration Elevation finder tool with map","title":"F. Other helpful links"},{"location":"tutorials/enb-setup/#iii-steps-in-baicells-cloud-interface","text":"","title":"III. Steps in Baicells Cloud interface"},{"location":"tutorials/enb-setup/#a-make-a-baicells-omc-account","text":"Due to Baicells\u2019 use of a \u201cdomain proxy\u201d for their SAS requests, you will need to make a new user account in the Baicells Operators Management Console (OMC): https://cloudcore.baicells.com:4443/ This is distinct from their paid \u201cCloud Core\u201d service which we will not be using in this tutorial, although the management portal is the same.","title":"A. Make a Baicells OMC account."},{"location":"tutorials/enb-setup/#b-take-note-of-the-cloudkey","text":"Once you have made an account, note the 6-letter \u201cCloudKey\u201d in the upper right corner of the screen (circled in red). This will need to be inputted into the local eNB management portal for the eNB to check into the Cloud OMC. On your version of this portal, if you\u2019re doing this for the first time, you shouldn\u2019t see any eNBs already present.","title":"B. Take note of the CloudKey"},{"location":"tutorials/enb-setup/#c-set-your-sas-service-provider","text":"Navigate to Advance\u2192SAS in the left hand menu, and then click the gear icon on the upper right corner, which has the hover text \u201cSettings.\u201d","title":"C. Set your SAS service provider."},{"location":"tutorials/enb-setup/#iv-steps-in-baicells-management-interface","text":"","title":"IV. Steps in Baicells management interface"},{"location":"tutorials/enb-setup/#a-local-management-portal","text":"The Baicells eNodeB (eNB) is best managed through the browser-based management portal; the current command line interface is accessible but extremely limited. The default IP address of the management portal (and that of most Baicells equipment I\u2019ve seen) is 192.168.150.1, and the default login credentials are admin/admin. I would recommend changing the admin login credentials to be more secure. Connect your computer to the eNB via Ethernet, and navigate to this IP address in your browser (using http://192.168.150.1, not https). Baicells Initial Login Screen: BTS Info\u2192\u201cBasic Info\u201d Page visible upon login:","title":"A. Local Management Portal"},{"location":"tutorials/enb-setup/#b-upgrade-firmware","text":"Upgrade the firmware to the latest firmware version that supports SAS functionality, or verify that it is already up to date. You can check the official firmware page under the correct eNB model. The Nova 233 CBRS small cell we\u2019re using is model mBS1105. The latest firmware version after which SAS is officially supported is BaiBS_RTS_3.6.6.IMG (as of Feb 2021), for which the direct download is available here . Do not skip this step, otherwise none of the following steps will work right.","title":"B. Upgrade firmware"},{"location":"tutorials/enb-setup/#c-get-everything-connected","text":"Once the firmware is upgraded, you will want to get the eNB connected to your local LTE core network (EPC) as well as to the Internet so it can contact the necessary SAS infrastructure.","title":"C. Get everything connected"},{"location":"tutorials/enb-setup/#1-configure-internet-access-wan","text":"Navigate to the Network\u2192WAN/LAN/VLAN tab on the left hand menu. We will set the WAN interface IP address to 192.168.151.1, since the Baicells console requires (for whatever reason) a different subnet for the WAN as opposed to the LAN. Then we will connect the eNB to an Ethernet port on the EPC that has the IP address 192.168.151.2 (as set up in our previous tutorial), which will act as the eNB\u2019s Internet gateway. Don\u2019t forget to hit \u201cSave\u201d after each change you make in this interface.","title":"1. Configure Internet Access (WAN)"},{"location":"tutorials/enb-setup/#2-check-internet-access","text":"At this point, if the EPC is configured correctly to pass eNB traffic to the Internet, the eNB should be able to ping an arbitrary IP address. To test this, navigate to the Network\u2192Diagnostics tab on the left hand menu and select \u201cPing\u201d under the \u201cMethod of Diagnostics\u201d dropdown menu. Set the \u201cTarget IP Domain\u201d to be a highly reachable IP address on the Internet such as 1.1.1.1, which is the CloudFlare DNS server. Press \u201cImplement.\u201d If the result is \u201cFail!\u201d as in the screenshot, there is likely something wrong with your eNB\u2019s Internet connection through the EPC; you should fix this issue before continuing.","title":"2. Check Internet access"},{"location":"tutorials/enb-setup/#3-reboot-as-needed","text":"If a message appears that the eNB needs a reboot after the new settings are saved, navigate to the Reboot tab in the left hand menu and perform the reboot (Warm Reset is fine).","title":"3. Reboot as needed"},{"location":"tutorials/enb-setup/#4-attach-to-baicells-omc","text":"To configure the eNB to talk to the OMC as discussed in the prior section, navigate to the BTS Setting\u2192Management Server tab in the management console and enter the CloudKey. Within a few minutes, the eNB should appear in your Baicells Cloud OMC console, and the \u201cBasic Info\u201d page should show that the OMC is \u201cConnected.\u201d","title":"4. Attach to Baicells OMC"},{"location":"tutorials/enb-setup/#5-disable-ipsec","text":"For our purposes we will not be using IPsec between our EPC and eNB; the default IPSec configured is used for the Baicells Cloud EPC which we are not using. Navigate to the Network\u2192\u201cMME&IPSec Binding\u201d menu tab and set \u201cIPSec Status\u201d to \u201cDisable.\u201d You may also delete the IPSec tunnels as shown below.","title":"5. Disable IPsec"},{"location":"tutorials/enb-setup/#6-disable-gps-sync-when-testing-indoors","text":"Navigate to the \u201cBTS Setting\u201d\u2192\u201cSync Setting\u201d menu and disable both \u201cForced Sync\u201d and \u201cGPS Sync Switch,\u201d in case you need to work with the base station in a location where you don\u2019t have a strong GPS signal. Some base stations will not start up normally or attach to the EPC unless they get a GPS signal, and we should avoid this behavior.","title":"6. Disable GPS Sync when testing indoors."},{"location":"tutorials/enb-setup/#7-change-the-mme-settings","text":"Change the MME settings. Since we are using our local EPC, we will need to change the MME settings to reflect our MME\u2019s IP address, on which it is listening for eNBs to attach, as well as other configurations. Navigate to the BTS Info\u2192Quick Setting tab on the left hand menu. Disable RF You should set the \u201cRF Status\u201d setting to \u201cDisable\u201d before you change the MME IP, because attaching to the MME will normally cause the eNB\u2019s radio to turn on. Since we have not enabled the eNB to ask for spectrum coordinated by the SAS yet, turning on the radio may cause unwanted interference on someone else\u2019s network. PLMN setting Remove the existing \u201cPLMN ID\u201d (by clicking the trash can symbol) and set it to the value that you have configured in your EPC. In our networks, we use \u201c91054\u201d as our PLMN, so add this as a \u201cPrimary\u201d and \u201cNotReserved\u201d PLMN by entering the number in the text box and clicking the \u201c+\u201d button. MME IP address Remove the existing MME IP associated with the old PLMN. Add the new MME IP address, in our case 192.168.150.2, by entering it in the text box and clicking \u201c+\u201d. This MME IP should be associated with the newly added PLMN by default. Save the changes and reboot the eNB (Warm Reset); after the reboot has finished (within a few minutes), the eNB should attach to the MME. If you navigate to BTS Info\u2192Basic Info, you should see the MME Status change from \u201cNot Connected\u201d to \u201cConnected.\u201d If you are looking at the MME logs on the EPC, you will also see the record that an eNB has attached.","title":"7. Change the MME settings"},{"location":"tutorials/enb-setup/#8-enable-sas","text":"SAS should only be enabled after successfully attaching the eNB to the MME. Unfortunately, when SAS is enabled, the eNB will not attach to the MME unless it has a currently valid authorization to transmit on a certain frequency. However, until it is attached to an MME, the Baicells Cloud OMC will not provide it this authorization. So we need to have SAS disabled first with the RF also disabled, attach the eNB to the MME, and then enable SAS. Choose \u201cMulti-step\u201d under \u201cSAS Registration Type,\u201d as specified in Section I.E. Also choose \u201cB\u201d under \u201ccategory,\u201d and write in the other parameters to match the ones with the same name in the Google SAS configuration. After you click \u201cSave,\u201d SAS should be enabled immediately. You should see the SAS enabled status change in the Baicells Cloud OMC. If all goes smoothly, your device should get an authorization to transmit within a few minutes and the radio should turn on!","title":"8. Enable SAS"},{"location":"tutorials/enb-setup/#9-check-baicells-cloud-omc-to-debug-issues","text":"You can check the status of the SAS authorization process in the Cloud OMC. Here you can find logs (upper right corner of SAS screen, shown in the screenshot below) with any error messages that may have occurred in the process. Errors can be caused by invalid or non-matching parameter values, lack of CPI signature, lack of spectrum availability, etc. In more difficult cases, after device registration the SAS may not respond to spectrum inquiries without sending any clear error messages. I have encountered this scenario when requesting spectrum around midnight, which may have been caused by brief database unavailability during the daily \u201cSAS Sync\u201d or IAP. My recommendation is to avoid requesting a new spectrum grant after 11 pm PST. If you change anything about the equipment used on site or the location/orientation of the equipment, you need to change the SAS registration, have it re-signed by the CPI, and use the Baicells OMC to re-request a new spectrum authorization- this process is described in the following section.","title":"9. Check Baicells CLOUD OMC to debug issues"},{"location":"tutorials/enb-setup/#v-how-to-change-location-antenna-properties-etc-after-deployment","text":"As an example, this section will show how you would change the equipment\u2019s location upon moving from test site to deployment site. Get the new GPS location either manually using Google Maps/Earth, or automatically using Baicells OMC\u2019s GPS reading for the eNB if available. Google SAS steps In the upper right hand corner of the Google SAS configuration for the deployed equipment (long narrow right side panel for a particular site), press the unlock button (shaped like a padlock) to make the configuration editable. To edit the site location, click on the map pin icon in the upper left corner of this same right hand configuration panel to enter the location panel. Enter the new GPS coordinates in the box. After your changes, lock the site configuration again. (If the red \u201cReady for CPI\u201d button appears again at the bottom of the main configuration panel, go ahead and click it to prompt the CPI to sign.) You may have to wait a few minutes or hours for the changes to sync to the CPI\u2019s SAS database view. If after a while the CPI still cannot see the location change, ask them to enter the new GPS coordinates in their own interface and re-sign the configuration. Baicells Cloud OMC steps On the Baicells OMC, navigate to the Advance\u2192SAS screen where you can see the list of CBRS devices and their SAS status. Click on the 3 dots ( \u2807) symbol before the serial number for a particular device and click on \u201cProcedure\u201d to enter the SAS procedure screen. On the Procedure screen, you can see the most recent SAS logs, relinquish and re-request active spectrum authorizations, or de-register and re-register devices. First click on the \u201cAuthorized\u201d icon and click on the \u201cRelinquishment req\u201d button to relinquish the current spectrum authorization. Then the latter two icons will become greyed out, but the device will remain registered. We will need to fully de-register and re-register the device with the new parameters. Click the \u201cRegistered\u201d icon and then the \u201cDe-register\u201d button when it appears to de-register the device. Once the device is in the \u201cUnregistered\u201d state, click the \u201cUnregistered\u201d icon and then click the \u201cRegister req\u201d button when it appears. If all goes well, the device should re-register, and also request and receive a new grant (completing the full procedure) within a few moments.","title":"V. How to change location, antenna properties, etc. after deployment"},{"location":"tutorials/epc-setup/","text":"Introduction and Overview LTE Architecture The LTE Evolved Packet Core (EPC) provides core software functions such as subscriber management and routing user traffic to the Internet. It connects to the radio \"base station\", called the eNodeB (eNB), which then talks to the User Equipment (UE)- i.e., your cell phone or access device. The most important component to know about in the LTE core is the \"MME,\" which manages the process of the eNB and any end-user devices attaching themselves to the network (you can think of this as \"signing on\") so they can start sending data. In the case of users, the MME has to ask the HSS software component (essentially a user database) for credentials (shared secret keys unique to each user) to verify that a given SIM card is allowed to join the network. The MME is the software component whose output logs you should check on first for error messages if something is going wrong with the network. SCN currently runs the LTE-specific components of the Open5GS 4G/5G Non-Standalone (NSA) core. You can find more detailed documentation and diagrams of the Open5GS software architecture at the Open5GS Quickstart page. Their software supports both 4G and 5G, and you only need to run a subset of the software components for 4G. Operating System Support In SCN we will typically perform these installation steps using a fresh install of Ubuntu 22.04 on an x86-64-based computer; however, any operating system that open5gs supports should work. Note: When you're installing Ubuntu, we suggest choosing the \"minimal install\" option that doesn\u2019t install extra unnecessary software. In prior installs this has led to version conflicts. Software Components As of November 2024, in the Open5GS software package , the LTE-specific components (which run on Ubuntu as systemd services) are as follows: MME - Mobility Management Entity: open5gs-mmed.service HSS - Home Subscriber Server: open5gs-hssd.service PCRF - Policy and Charging Rules Function: open5gs-pcrfd.service SGWC - Serving Gateway Control Plane: open5gs-sgwcd.service SGWU - Serving Gateway User Plane: open5gs-sgwud.service PGWC/SMF - Packet Gateway Control Plane / (component contained in Open5GS SMF): open5gs-smfd.service PGWU/UPF - Packet Gateway User Plane / (component contained in Open5GS UPF): open5gs-upfd.service We would also recommend running the optional WebUI (Web User Interface) service: open5gs-webui.service . The following steps will walk you through this installation process. Step 1: Install Open5GS (Notes and Pointers) Install Open5GS following the Open5GS Quickstart documentation based on your operating system and desired implementation (e.g. \"bare metal\" directly on the operating system vs. Docker ). There are even VoLTE and Dockerized VoLTE implementations of Open5GS. A similar step-by-step tutorial to this one can be found here . In SCN we have run Open5GS successfully using Ubuntu 20.04 and 22.04, on bare metal or in Virtual Machines, installed via the apt package manager (see Step \"2. Install Open5GS with a Package Manager\" of the Quickstart ). First install MongoDB as described in the Quickstart. Then follow instructions under the \"Ubuntu\" section to install Open5GS via apt. Note: If installing over a ssh connection, we recommend using tmux or another program in case you get disconnected from the session in the process. Configure MME and SGWU Note that for our LTE setup, the MME and SGWU are the only components whose config files you will really need to change from the defaults. MME Edit the /etc/open5gs/mme.yaml file (as root or using sudo ) as follows: - Under mme: -> s1ap: -> server: -> address: , set the IP address you will assign to the network interface (likely an ethernet port) on your EPC computer which will be connecting to the eNB. In this tutorial (to match with the Network Configuration section that follows), we will use 192.168.150.1 . - Under both mme: -> gummei: and mme: -> tai: , you will need to change the plmn_id: ( mcc: and mnc: values) to match the PLMN you are using for your network. In SCN we use 315 for the MCC and 010 for the MNC, as explained in the \"Quick explanation\" below. Quick explanation: \"PLMN\" refers to the Public Land Mobile Network , in which every network has to have a unique carrier ID defined by the 3-digit \"mobile country code (MCC)\" and a 2 or 3-digit \"mobile network code (MNC)\". Alternately, for iPhone compatibility in the US, SCN uses the CBRS \"private LTE\" PLMN assigned by Apple as described in this doc . Note that for the purposes of eNB config later, the Tracking Area Code (or TAC) listed under mme: -> tai: -> tac: will need to match the TAC number configured on the eNB (using the default of 1 is fine). Optional: Edit network_name: (full and short) and mme_name: as desired. One of these names will show up on smartphones' lock screens as the \"carrier\" when the phone is attached to the network. SGWU Edit the /etc/open5gs/sgwu.yaml file (as root or using sudo ) as follows: - Under sgwu: -> gtpu: -> server: -> address: , set the IP address you will assign to the network interface on your EPC computer which will be connecting to the eNB (this should be the same as the IP address of the MME set above, if the MME and SGWU are running on the same machine). In this tutorial we will use 192.168.150.1 . As mentioned in the Quickstart, after changing the config files, you will need to restart the corresponding Open5GS daemons: sudo systemctl restart open5gs-mmed sudo systemctl restart open5gs-sgwud However, the MME will likely not start correctly until networking is configured, as described below. Step 2: Configure Networking Remember to follow all the network configuration steps in the Open5GS Quickstart documentation . For SCN's Ubuntu machines, this means: Allowing IP forwarding on your machine, e.g. via the following command: sudo sysctl -w net.ipv4.ip_forward=1 Using Netplan to configure network interfaces with IP addresses in the desired way. Setting up NAT rules using iptables so that traffic from the eNB can reach the Internet and vice versa The latter two steps are explained in detail below. Netplan Configuration A. Recommended For this recommended configuration, we require an EPC machine with 2 or more ethernet ports ( in our case , the ethernet interfaces corresponding to these ports are named enp1s0 and enp4s0). The ethernet port named \"enp1s0\" is used as the WAN port, which accesses upstream networks and eventually the Internet. It is physically connected via an ethernet cable to a router that can give it Internet access (e.g. our ISP's router). The one named \"enp4s0\" will connect to our private LTE network, and is physically connected via an ethernet cable to the eNB radio. (Our mini-PC model has 4 ethernet ports.) To enter the appropriate values in your case , you will need to figure out the names of your computer's ethernet interfaces. Use the command ip a on the command line. A list of network interfaces will appear in the terminal. Find the ones corresponding to your ethernet ports (their names usually start with \u201ceth,\u201d \u201cenp,\u201d or \u201cenx\u201d). For Ubuntu 22.04, we're currently using the Netplan program to manage our network configuration. Create a file in the /etc/netplan directory (i.e. a folder) named 99-open5gs-config.yaml , and add the following lines, substituting the correct interface names and subnets for your configuration: network: ethernets: enp1s0: # name of interface used for upstream network dhcp4: yes enp4s0: # name of interface going to the eNB dhcp4: no addresses: - 192.168.150.2/24 # list all downstream networks - 192.168.151.2/24 version: 2 Note: Netplan will apply configuration files in this directory in the numerical order of the filename prefix (ie., 00-*, 01-*, etc.). Any interfaces configured in an earlier file will be overwritten by higher-numbered configuration files, so we create a file with the prefix 99-* in order to supersede all other configuration files. Quick explanation: In order to get Internet connectivity to the EPC, we configure the \"upstream\" or \"WAN\" ethernet interface (enp1s0) to request an IP address via DHCP from an upstream router it's connected to (as your computer usually does when you plug it into a typical home router), which passes its traffic to and from the global Internet. That's why we have the line dhcp4: yes under our interface name enp1s0 . We don't need this interface to have any other IP addresses. The \"downstream\" ethernet interface (enp4s0) connected to the eNB is assigned two IP addresses and subnets, which are configured statically ( not by DHCP, hence the dhcp4: no ). In our case, we need this interface to talk to the Baicells Nova 233 eNB we use. Our eNB has the default local (LAN) IP address of 192.168.150.1 . We also need to set its WAN address (for whatever reason this is required to be different) to 192.168.151.1 , as in this eNB setup tutorial . That's why we have the addresses: section that sets the static IP addresses of the EPC to 192.168.150.2/24 and 192.168.151.2/24 . Since these IP addresses are in the same subnet as the eNB IP addresses, they will be able to talk to each other automatically without a router in between helping to route communications packets between the two addresses. Below we also provide an alternate configuration in case you do not yet have a machine with 2 ethernet ports or a USB to ethernet adapter dongle. However, only the first configuration is recommended for deployments for security reasons. The alternative should be used for testing only . B. NOT Recommended for deployment If you don\u2019t yet have a machine with 2 ethernet ports or a USB to ethernet adapter dongle, you can temporarily use a machine with a single ethernet port along with a simple switch or router. If using a simple switch, you can follow the same instructions but connect all three of the EPC, eNB, and upstream Internet router to the switch. If using a router, you may instead need to configure the router to assign 2 private static IPs to each of the EPC (i.e. 192.168.150.2 , 192.168.151.2 ) and eNB (i.e. 192.168.150.1 , 192.168.151.1 ), such that it will correctly NAT upstream traffic and also route local traffic between the EPC and eNB. # Network config EPC with single ethernet card # A switch is used to connect all devices network: ethernets: enp1s0: # name of ethernet interface dhcp4: true addresses: - 192.168.150.2/24 # list all downstream networks - 192.168.151.2/24 version: 2 Once this file (or your router configuration) has been modified, restart the network daemon to apply the configuration changes: sudo netplan try and if the Netplan syntax check succeeds, hit the Enter or Return key to accept the configuration change. If the eNB will be plugged into its own dedicated EPC ethernet port, as in the recommended configuration above, you may need to connect that EPC ethernet port to something (e.g. the eNB, a switch, another machine) via an ethernet cable to wake the interface up (so that it becomes active and takes on the assigned IP addresses). This is because the open5gs MME needs to \"bind\" (or associate) its S1 interface to one of those IP addresses (in this case 192.168.0.2 ). Until those IP addresses exist on your machine, the MME will continually throw errors if you try to run it. Setting iptables NAT rules to connect the eNB to the Internet As explained above, the eNB currently has the IP addresses 192.168.150.1 and 192.168.151.1 -- private IP addresses that cannot be used on the public Internet. Therefore, to successfully route the eNB's network traffic to the Internet, we have to add a routing rule in the EPC computer that performs NAT, allowing packets from the eNB's subnet to exit the WAN port of the EPC masquerading as coming from the EPC's IP address to the upstream network. There might be an easier way to do this, but we've found the cleanest and most reliable way so far to be using the iptables command line tool. In the Terminal on the EPC, run the following command to add a NAT rule for the eNB's subnet: sudo iptables -t nat -A POSTROUTING -s 192.168.151.0/24 -j MASQUERADE Quick explanation: The -t nat option tells IPTables to install the rule in the correct \"table\" containing all the NAT rules, and the -A option means we're A dding the rule as opposed to D eleting it ( -D ). POSTROUTING is the \"chain,\" or particular list of rules, that this type of NAT rule should go in (more on that here and in this diagram if you're interested). -s 192.168.151.0/24 means that we're applying this rule to packets from the S ource IP addresses described by the subnet 192.168.151.0/24 . -j MASQUERADE means the action we'll be J umping to as a result of this rule is \"masquerading\" the source IP address as my EPC's WAN IP address. 'Persist' IPTables Configuration We use IPTables rules to make sure packets are routed correctly within the EPC. IPTables rules must be made persistent across reboots with the iptables-persistent package: sudo apt install iptables-persistent Installation of this package will save the current iptables rules to its configuration file, /etc/iptables/rules.v4 . Note: iptables-persistent reads the contents of this file at boot and applies all iptables rules it contains. If you need to update the rules, or re-apply manually, you may use the following commands. This should not be necessary under normal circumstances: sudo iptables-save > /etc/iptables/rules.v4 sudo iptables-restore < /etc/iptables/rules.v4 Step 3: Start and monitor Open5GS software services Ubuntu\u2019s built-in logging and monitoring services can be used to monitor the core network services. For example, for seeing the output logs of the MME software component we described in the first section, run the following command in the Terminal: sudo journalctl -f -u open5gs-mmed.service OR sudo systemctl status open5gs-mmed.service Tab complete may be able to fill in the service name for systemctl at least. Learning to read output logs is really important for managing software infrastructure! Simply Googling output messages that seem important but that you don't understand can be a good first step to figuring out how a system is working. Another interesting tool to investigate is Wireshark , which is essentially a graphical user interface (GUI) version of the tcpdump command line tool that can show you the communications packets flowing through the various network cards on your computer. Here are some more useful commands for managing systemd services, which can be used to start, stop, and reload the software components after you've changed their configuration or they've run into errors and need to be restarted: sudo systemctl start open5gs-mmed.service sudo systemctl stop open5gs-mmed.service sudo systemctl restart open5gs-mmed.service sudo systemctl status open5gs-* The following command will start only the systemd services required for LTE. However, you do not need to stop or disable the other components of the 5G core for it to run 4G LTE network hardware correctly- the full Open5GS 5G core is backwards compatible with LTE hardware if you configure the LTE components correctly. sudo systemctl start open5gs-hssd.service open5gs-mmed.service open5gs-sgwud.service open5gs-sgwcd.service open5gs-pcrfd.service open5gs-upfd.service open5gs-smfd.service Install and Start the WebUI The WebUI is another systemd service and runs by default on your local computer at port 9999. It requires some more dependencies to install, such as nodejs (see Step \"3. Install the WebUI of Open5GS\" in the Quickstart ). You can reach it by navigating to http://localhost:9999 in your web browser. If not already started, start it with the following command: sudo systemctl start open5gs-webui.service The default WebUI login credentials are as follows: - Username : admin - Password : 1423 Step 4: Add Users to Open5GS database (Note that an important pre-condition to adding users is to have SIM cards or eSIMs to give to the users for authentication, along with their respective IMSIs and secret keys to register them onto the EPC. These must be procured separately. WIP- We will endeavor to make guides for these processes available soon.) You can manage users using the Open5GS WebUI, or using a script provided in the Open5GS GitHub repository . Our preferred strategy is to use the script, which supports automation better and does not require the WebUI to be running. Clone the repository into the EPC machine: git clone https://github.com/open5gs/open5gs.git The script can be found in misc/db/open5gs-dbctl from the top level of the repository ( open5gs folder). For example, you could run a command to add a user like this from within the open5gs/misc/db folder: sudo ./open5gs-dbctl add 460660003400030 192.168.20.30 0x00112233445566778899AABBCCDDEEFF 0x000102030405060708090A0B0C0D0E0F Running the ./open5gs-dbctl command on its own will output a list of allowed command syntax, of which the following can be particularly handy: - add {imsi key opc}: adds a user to the database with default values - add {imsi ip key opc}: adds a user to the database with default values and a IPv4 address for the UE - remove {imsi}: removes a user from the database - static_ip {imsi ip4}: adds a static IP assignment to an already-existing user - add_ue_with_apn {imsi key opc apn}: adds a user to the database with a specific apn The help text also tells you that \"default values are as follows: APN \"internet\", dl_bw/ul_bw 1 Gbps, PGW address is 127.0.0.3, IPv4 only\". Step 5: Maintenance and Management Updating Open5GS WIP: We are working on an Ansible-based management script for updates and will post updates as they occur. Backup and Restore WIP: We are working on our backup and restore strategies and will update this with a repo soon. Deprecated: CoLTE/EPC (LTE Core Network) Setup Our core networks formerly used the CoLTE project maintained by the UW ICTD Lab . For information on how to install and configure CoLTE, visit the tutorial we wrote with them, on which this document is based. Comments and Feedback Please get in touch with us at support@seattlecommunitynetwork.org if you have questions or feedback about this tutorial! We want your feedback so we can make this better.","title":"Step 1. LTE Core Network Setup"},{"location":"tutorials/epc-setup/#introduction-and-overview","text":"","title":"Introduction and Overview"},{"location":"tutorials/epc-setup/#lte-architecture","text":"The LTE Evolved Packet Core (EPC) provides core software functions such as subscriber management and routing user traffic to the Internet. It connects to the radio \"base station\", called the eNodeB (eNB), which then talks to the User Equipment (UE)- i.e., your cell phone or access device. The most important component to know about in the LTE core is the \"MME,\" which manages the process of the eNB and any end-user devices attaching themselves to the network (you can think of this as \"signing on\") so they can start sending data. In the case of users, the MME has to ask the HSS software component (essentially a user database) for credentials (shared secret keys unique to each user) to verify that a given SIM card is allowed to join the network. The MME is the software component whose output logs you should check on first for error messages if something is going wrong with the network. SCN currently runs the LTE-specific components of the Open5GS 4G/5G Non-Standalone (NSA) core. You can find more detailed documentation and diagrams of the Open5GS software architecture at the Open5GS Quickstart page. Their software supports both 4G and 5G, and you only need to run a subset of the software components for 4G.","title":"LTE Architecture"},{"location":"tutorials/epc-setup/#operating-system-support","text":"In SCN we will typically perform these installation steps using a fresh install of Ubuntu 22.04 on an x86-64-based computer; however, any operating system that open5gs supports should work. Note: When you're installing Ubuntu, we suggest choosing the \"minimal install\" option that doesn\u2019t install extra unnecessary software. In prior installs this has led to version conflicts.","title":"Operating System Support"},{"location":"tutorials/epc-setup/#software-components","text":"As of November 2024, in the Open5GS software package , the LTE-specific components (which run on Ubuntu as systemd services) are as follows: MME - Mobility Management Entity: open5gs-mmed.service HSS - Home Subscriber Server: open5gs-hssd.service PCRF - Policy and Charging Rules Function: open5gs-pcrfd.service SGWC - Serving Gateway Control Plane: open5gs-sgwcd.service SGWU - Serving Gateway User Plane: open5gs-sgwud.service PGWC/SMF - Packet Gateway Control Plane / (component contained in Open5GS SMF): open5gs-smfd.service PGWU/UPF - Packet Gateway User Plane / (component contained in Open5GS UPF): open5gs-upfd.service We would also recommend running the optional WebUI (Web User Interface) service: open5gs-webui.service . The following steps will walk you through this installation process.","title":"Software Components"},{"location":"tutorials/epc-setup/#step-1-install-open5gs-notes-and-pointers","text":"Install Open5GS following the Open5GS Quickstart documentation based on your operating system and desired implementation (e.g. \"bare metal\" directly on the operating system vs. Docker ). There are even VoLTE and Dockerized VoLTE implementations of Open5GS. A similar step-by-step tutorial to this one can be found here . In SCN we have run Open5GS successfully using Ubuntu 20.04 and 22.04, on bare metal or in Virtual Machines, installed via the apt package manager (see Step \"2. Install Open5GS with a Package Manager\" of the Quickstart ). First install MongoDB as described in the Quickstart. Then follow instructions under the \"Ubuntu\" section to install Open5GS via apt. Note: If installing over a ssh connection, we recommend using tmux or another program in case you get disconnected from the session in the process.","title":"Step 1: Install Open5GS (Notes and Pointers)"},{"location":"tutorials/epc-setup/#configure-mme-and-sgwu","text":"Note that for our LTE setup, the MME and SGWU are the only components whose config files you will really need to change from the defaults.","title":"Configure MME and SGWU"},{"location":"tutorials/epc-setup/#mme","text":"Edit the /etc/open5gs/mme.yaml file (as root or using sudo ) as follows: - Under mme: -> s1ap: -> server: -> address: , set the IP address you will assign to the network interface (likely an ethernet port) on your EPC computer which will be connecting to the eNB. In this tutorial (to match with the Network Configuration section that follows), we will use 192.168.150.1 . - Under both mme: -> gummei: and mme: -> tai: , you will need to change the plmn_id: ( mcc: and mnc: values) to match the PLMN you are using for your network. In SCN we use 315 for the MCC and 010 for the MNC, as explained in the \"Quick explanation\" below. Quick explanation: \"PLMN\" refers to the Public Land Mobile Network , in which every network has to have a unique carrier ID defined by the 3-digit \"mobile country code (MCC)\" and a 2 or 3-digit \"mobile network code (MNC)\". Alternately, for iPhone compatibility in the US, SCN uses the CBRS \"private LTE\" PLMN assigned by Apple as described in this doc . Note that for the purposes of eNB config later, the Tracking Area Code (or TAC) listed under mme: -> tai: -> tac: will need to match the TAC number configured on the eNB (using the default of 1 is fine). Optional: Edit network_name: (full and short) and mme_name: as desired. One of these names will show up on smartphones' lock screens as the \"carrier\" when the phone is attached to the network.","title":"MME"},{"location":"tutorials/epc-setup/#sgwu","text":"Edit the /etc/open5gs/sgwu.yaml file (as root or using sudo ) as follows: - Under sgwu: -> gtpu: -> server: -> address: , set the IP address you will assign to the network interface on your EPC computer which will be connecting to the eNB (this should be the same as the IP address of the MME set above, if the MME and SGWU are running on the same machine). In this tutorial we will use 192.168.150.1 . As mentioned in the Quickstart, after changing the config files, you will need to restart the corresponding Open5GS daemons: sudo systemctl restart open5gs-mmed sudo systemctl restart open5gs-sgwud However, the MME will likely not start correctly until networking is configured, as described below.","title":"SGWU"},{"location":"tutorials/epc-setup/#step-2-configure-networking","text":"Remember to follow all the network configuration steps in the Open5GS Quickstart documentation . For SCN's Ubuntu machines, this means: Allowing IP forwarding on your machine, e.g. via the following command: sudo sysctl -w net.ipv4.ip_forward=1 Using Netplan to configure network interfaces with IP addresses in the desired way. Setting up NAT rules using iptables so that traffic from the eNB can reach the Internet and vice versa The latter two steps are explained in detail below.","title":"Step 2: Configure Networking"},{"location":"tutorials/epc-setup/#netplan-configuration","text":"","title":"Netplan Configuration"},{"location":"tutorials/epc-setup/#a-recommended","text":"For this recommended configuration, we require an EPC machine with 2 or more ethernet ports ( in our case , the ethernet interfaces corresponding to these ports are named enp1s0 and enp4s0). The ethernet port named \"enp1s0\" is used as the WAN port, which accesses upstream networks and eventually the Internet. It is physically connected via an ethernet cable to a router that can give it Internet access (e.g. our ISP's router). The one named \"enp4s0\" will connect to our private LTE network, and is physically connected via an ethernet cable to the eNB radio. (Our mini-PC model has 4 ethernet ports.) To enter the appropriate values in your case , you will need to figure out the names of your computer's ethernet interfaces. Use the command ip a on the command line. A list of network interfaces will appear in the terminal. Find the ones corresponding to your ethernet ports (their names usually start with \u201ceth,\u201d \u201cenp,\u201d or \u201cenx\u201d). For Ubuntu 22.04, we're currently using the Netplan program to manage our network configuration. Create a file in the /etc/netplan directory (i.e. a folder) named 99-open5gs-config.yaml , and add the following lines, substituting the correct interface names and subnets for your configuration: network: ethernets: enp1s0: # name of interface used for upstream network dhcp4: yes enp4s0: # name of interface going to the eNB dhcp4: no addresses: - 192.168.150.2/24 # list all downstream networks - 192.168.151.2/24 version: 2 Note: Netplan will apply configuration files in this directory in the numerical order of the filename prefix (ie., 00-*, 01-*, etc.). Any interfaces configured in an earlier file will be overwritten by higher-numbered configuration files, so we create a file with the prefix 99-* in order to supersede all other configuration files. Quick explanation: In order to get Internet connectivity to the EPC, we configure the \"upstream\" or \"WAN\" ethernet interface (enp1s0) to request an IP address via DHCP from an upstream router it's connected to (as your computer usually does when you plug it into a typical home router), which passes its traffic to and from the global Internet. That's why we have the line dhcp4: yes under our interface name enp1s0 . We don't need this interface to have any other IP addresses. The \"downstream\" ethernet interface (enp4s0) connected to the eNB is assigned two IP addresses and subnets, which are configured statically ( not by DHCP, hence the dhcp4: no ). In our case, we need this interface to talk to the Baicells Nova 233 eNB we use. Our eNB has the default local (LAN) IP address of 192.168.150.1 . We also need to set its WAN address (for whatever reason this is required to be different) to 192.168.151.1 , as in this eNB setup tutorial . That's why we have the addresses: section that sets the static IP addresses of the EPC to 192.168.150.2/24 and 192.168.151.2/24 . Since these IP addresses are in the same subnet as the eNB IP addresses, they will be able to talk to each other automatically without a router in between helping to route communications packets between the two addresses. Below we also provide an alternate configuration in case you do not yet have a machine with 2 ethernet ports or a USB to ethernet adapter dongle. However, only the first configuration is recommended for deployments for security reasons. The alternative should be used for testing only .","title":"A. Recommended"},{"location":"tutorials/epc-setup/#b-not-recommended-for-deployment","text":"If you don\u2019t yet have a machine with 2 ethernet ports or a USB to ethernet adapter dongle, you can temporarily use a machine with a single ethernet port along with a simple switch or router. If using a simple switch, you can follow the same instructions but connect all three of the EPC, eNB, and upstream Internet router to the switch. If using a router, you may instead need to configure the router to assign 2 private static IPs to each of the EPC (i.e. 192.168.150.2 , 192.168.151.2 ) and eNB (i.e. 192.168.150.1 , 192.168.151.1 ), such that it will correctly NAT upstream traffic and also route local traffic between the EPC and eNB. # Network config EPC with single ethernet card # A switch is used to connect all devices network: ethernets: enp1s0: # name of ethernet interface dhcp4: true addresses: - 192.168.150.2/24 # list all downstream networks - 192.168.151.2/24 version: 2 Once this file (or your router configuration) has been modified, restart the network daemon to apply the configuration changes: sudo netplan try and if the Netplan syntax check succeeds, hit the Enter or Return key to accept the configuration change. If the eNB will be plugged into its own dedicated EPC ethernet port, as in the recommended configuration above, you may need to connect that EPC ethernet port to something (e.g. the eNB, a switch, another machine) via an ethernet cable to wake the interface up (so that it becomes active and takes on the assigned IP addresses). This is because the open5gs MME needs to \"bind\" (or associate) its S1 interface to one of those IP addresses (in this case 192.168.0.2 ). Until those IP addresses exist on your machine, the MME will continually throw errors if you try to run it.","title":"B. NOT Recommended for deployment"},{"location":"tutorials/epc-setup/#setting-iptables-nat-rules-to-connect-the-enb-to-the-internet","text":"As explained above, the eNB currently has the IP addresses 192.168.150.1 and 192.168.151.1 -- private IP addresses that cannot be used on the public Internet. Therefore, to successfully route the eNB's network traffic to the Internet, we have to add a routing rule in the EPC computer that performs NAT, allowing packets from the eNB's subnet to exit the WAN port of the EPC masquerading as coming from the EPC's IP address to the upstream network. There might be an easier way to do this, but we've found the cleanest and most reliable way so far to be using the iptables command line tool. In the Terminal on the EPC, run the following command to add a NAT rule for the eNB's subnet: sudo iptables -t nat -A POSTROUTING -s 192.168.151.0/24 -j MASQUERADE Quick explanation: The -t nat option tells IPTables to install the rule in the correct \"table\" containing all the NAT rules, and the -A option means we're A dding the rule as opposed to D eleting it ( -D ). POSTROUTING is the \"chain,\" or particular list of rules, that this type of NAT rule should go in (more on that here and in this diagram if you're interested). -s 192.168.151.0/24 means that we're applying this rule to packets from the S ource IP addresses described by the subnet 192.168.151.0/24 . -j MASQUERADE means the action we'll be J umping to as a result of this rule is \"masquerading\" the source IP address as my EPC's WAN IP address.","title":"Setting iptables NAT rules to connect the eNB to the Internet"},{"location":"tutorials/epc-setup/#persist-iptables-configuration","text":"We use IPTables rules to make sure packets are routed correctly within the EPC. IPTables rules must be made persistent across reboots with the iptables-persistent package: sudo apt install iptables-persistent Installation of this package will save the current iptables rules to its configuration file, /etc/iptables/rules.v4 . Note: iptables-persistent reads the contents of this file at boot and applies all iptables rules it contains. If you need to update the rules, or re-apply manually, you may use the following commands. This should not be necessary under normal circumstances: sudo iptables-save > /etc/iptables/rules.v4 sudo iptables-restore < /etc/iptables/rules.v4","title":"'Persist' IPTables Configuration"},{"location":"tutorials/epc-setup/#step-3-start-and-monitor-open5gs-software-services","text":"Ubuntu\u2019s built-in logging and monitoring services can be used to monitor the core network services. For example, for seeing the output logs of the MME software component we described in the first section, run the following command in the Terminal: sudo journalctl -f -u open5gs-mmed.service OR sudo systemctl status open5gs-mmed.service Tab complete may be able to fill in the service name for systemctl at least. Learning to read output logs is really important for managing software infrastructure! Simply Googling output messages that seem important but that you don't understand can be a good first step to figuring out how a system is working. Another interesting tool to investigate is Wireshark , which is essentially a graphical user interface (GUI) version of the tcpdump command line tool that can show you the communications packets flowing through the various network cards on your computer. Here are some more useful commands for managing systemd services, which can be used to start, stop, and reload the software components after you've changed their configuration or they've run into errors and need to be restarted: sudo systemctl start open5gs-mmed.service sudo systemctl stop open5gs-mmed.service sudo systemctl restart open5gs-mmed.service sudo systemctl status open5gs-* The following command will start only the systemd services required for LTE. However, you do not need to stop or disable the other components of the 5G core for it to run 4G LTE network hardware correctly- the full Open5GS 5G core is backwards compatible with LTE hardware if you configure the LTE components correctly. sudo systemctl start open5gs-hssd.service open5gs-mmed.service open5gs-sgwud.service open5gs-sgwcd.service open5gs-pcrfd.service open5gs-upfd.service open5gs-smfd.service","title":"Step 3: Start and monitor Open5GS software services"},{"location":"tutorials/epc-setup/#install-and-start-the-webui","text":"The WebUI is another systemd service and runs by default on your local computer at port 9999. It requires some more dependencies to install, such as nodejs (see Step \"3. Install the WebUI of Open5GS\" in the Quickstart ). You can reach it by navigating to http://localhost:9999 in your web browser. If not already started, start it with the following command: sudo systemctl start open5gs-webui.service The default WebUI login credentials are as follows: - Username : admin - Password : 1423","title":"Install and Start the WebUI"},{"location":"tutorials/epc-setup/#step-4-add-users-to-open5gs-database","text":"(Note that an important pre-condition to adding users is to have SIM cards or eSIMs to give to the users for authentication, along with their respective IMSIs and secret keys to register them onto the EPC. These must be procured separately. WIP- We will endeavor to make guides for these processes available soon.) You can manage users using the Open5GS WebUI, or using a script provided in the Open5GS GitHub repository . Our preferred strategy is to use the script, which supports automation better and does not require the WebUI to be running. Clone the repository into the EPC machine: git clone https://github.com/open5gs/open5gs.git The script can be found in misc/db/open5gs-dbctl from the top level of the repository ( open5gs folder). For example, you could run a command to add a user like this from within the open5gs/misc/db folder: sudo ./open5gs-dbctl add 460660003400030 192.168.20.30 0x00112233445566778899AABBCCDDEEFF 0x000102030405060708090A0B0C0D0E0F Running the ./open5gs-dbctl command on its own will output a list of allowed command syntax, of which the following can be particularly handy: - add {imsi key opc}: adds a user to the database with default values - add {imsi ip key opc}: adds a user to the database with default values and a IPv4 address for the UE - remove {imsi}: removes a user from the database - static_ip {imsi ip4}: adds a static IP assignment to an already-existing user - add_ue_with_apn {imsi key opc apn}: adds a user to the database with a specific apn The help text also tells you that \"default values are as follows: APN \"internet\", dl_bw/ul_bw 1 Gbps, PGW address is 127.0.0.3, IPv4 only\".","title":"Step 4: Add Users to Open5GS database"},{"location":"tutorials/epc-setup/#step-5-maintenance-and-management","text":"","title":"Step 5: Maintenance and Management"},{"location":"tutorials/epc-setup/#updating-open5gs","text":"WIP: We are working on an Ansible-based management script for updates and will post updates as they occur.","title":"Updating Open5GS"},{"location":"tutorials/epc-setup/#backup-and-restore","text":"WIP: We are working on our backup and restore strategies and will update this with a repo soon.","title":"Backup and Restore"},{"location":"tutorials/epc-setup/#deprecated-colteepc-lte-core-network-setup","text":"Our core networks formerly used the CoLTE project maintained by the UW ICTD Lab . For information on how to install and configure CoLTE, visit the tutorial we wrote with them, on which this document is based.","title":"Deprecated: CoLTE/EPC (LTE Core Network) Setup"},{"location":"tutorials/epc-setup/#comments-and-feedback","text":"Please get in touch with us at support@seattlecommunitynetwork.org if you have questions or feedback about this tutorial! We want your feedback so we can make this better.","title":"Comments and Feedback"},{"location":"tutorials/grafana-log-dashboard/","text":"Developed By: Rudra Prakash Singh, Esther Jang This guide walks you through the process of setting up a Grafana Server Log Monitoring Dashboard, including the installation and configuration of Grafana, Loki, and Promtail for log aggregation and visualization. It also covers setting up scripts for automating log retrieval and dashboard updates. Step 1: Install Grafana via CLI Install Grafana on your server using the following instructions for Debian-based systems: Follow the installation guide here: Grafana Installation on Debian Once installed, start Grafana and make sure it's accessible via a port (default: 3000 ). After Grafana is running, create an admin account. Once logged in, you'll land on the Grafana homepage. Step 2: Install Loki Install Loki by following the official instructions for Docker: Loki Installation via Docker Step 3: Create a Docker Compose File for Loki To set up Loki with Grafana, create a docker-compose.yml file: version: \"3\" # The version can be removed if you're using a recent Docker Compose version. services: grafana: image: grafana/grafana:latest ports: - \"3000:3000\" networks: - loki volumes: - grafana-data:/path # [CHANGE THIS LINE] Adding persistence for Grafana data loki: image: grafana/loki:latest ports: - \"3100:3100\" networks: - loki volumes: - ./path # [CHANGE THIS LINE] Local directory for Loki data user: \"10001\" # Run Loki as the appropriate user to avoid permission issues promtail: image: grafana/promtail:latest command: \"-config.file=/etc/promtail/config.yaml\" # [CHANGE THIS LINE] networks: - loki volumes: - \"/var/log:/var/log\" # [CHANGE THIS LINE] Mounting host logs networks: loki: volumes: grafana-data: # Declaring the volume for Grafana Step 4: Install Promtail Install Promtail by following the official instructions: Promtail Installation Guide Step 5: Configure Data Sources (Logs) To aggregate logs from other servers, we set up a method of transferring logs to the Grafana server. The logs are pulled into the Grafana server, where they are processed and rendered on a Grafana dashboard. Here\u2019s the updated section of the README with the requested changes marked. The rest remains unchanged. Step 5: Configure Data Sources (Logs) 5.1: Write a Bash Script to Pull Logs Here\u2019s an example of a script ( transfer_logs.sh ) to pull logs from another server: #!/bin/bash # Define variables REMOTE_SERVER=\"root@server_ip\" # [CHANGE THIS LINE] Remote server IP SSH_KEY_PATH=\"path\" # [CHANGE THIS LINE] Path to SSH key DEST_DIR=\"path\" # [CHANGE THIS LINE] Destination directory on the Grafana server # Define paths for logs DOCKER_LOG=\"path/to/docker/log\" # [CHANGE THIS LINE] Path to Docker log on remote server NGINX_LOG=\"path/to/nginx/log\" # [CHANGE THIS LINE] Path to NGINX log on remote server SYSLOG=\"path/to/syslog\" # [CHANGE THIS LINE] Path to syslog on remote server # Create directories if they don't exist mkdir -p \"$DEST_DIR/docker\" \"$DEST_DIR/nginx\" \"$DEST_DIR/syslog\" # Transfer logs echo \"Transferring Docker log...\" ssh -i $SSH_KEY_PATH $REMOTE_SERVER \"cat $DOCKER_LOG\" > \"$DEST_DIR/docker/docker.log\" echo \"Transferring NGINX log...\" ssh -i $SSH_KEY_PATH $REMOTE_SERVER \"cat $NGINX_LOG\" > \"$DEST_DIR/nginx/error.log\" echo \"Transferring syslog...\" ssh -i $SSH_KEY_PATH $REMOTE_SERVER \"cat $SYSLOG\" > \"$DEST_DIR/syslog/syslog.log\" echo \"All logs have been successfully transferred.\" 5.2: Configure Promtail to Scrape Logs Next, create a promtail-config.yaml file to let Promtail know where the logs are located: server: http_listen_port: 9080 grpc_listen_port: 0 positions: filename: /tmp/positions.yaml clients: - url: http://server_ip:3100/loki/api/v1/push # [CHANGE THIS LINE] Loki's URL scrape_configs: - job_name: docker_logs static_configs: labels: job: docker __path__: /path/to/logs/on/grafana/server/docker/*.log # [CHANGE THIS LINE] Path to Docker logs - job_name: nginx_logs static_configs: labels: job: nginx __path__: /path/to/logs/on/grafana/server/nginx/*.log # [CHANGE THIS LINE] Path to NGINX logs - job_name: syslog_logs static_configs: labels: job: syslog __path__: /path/to/logs/on/grafana/server/syslog/*.log # [CHANGE THIS LINE] Path to syslog logs Step 6: Configure Grafana to Use Loki Open Grafana\u2019s homepage and click the three vertical lines in the top-left corner. Navigate to Data Sources , then click Add Data Source . Select Loki as the data source type. Define the URL of your Loki instance, which is typically http://localhost:3100 . Click Save & Test . You should see a success message confirming the connection. Step 7: Explore Data in Grafana Go to the Explore section in Grafana. Use label filters and run queries to see the logs coming from Promtail. The labels in the filters correspond to the labels defined in the promtail-config.yaml . Step 8: Create a Dashboard On the left sidebar in Grafana, click Dashboards > New Dashboard . Click Add Panel to create a new panel. Under Data Source , select Loki . Write queries to retrieve logs for display. Use different labels to filter log data as needed. Choose a visualization type (e.g., Logs ). Repeat the process to add more visualizations, then adjust the layout and size to suit your needs. Save the dashboard once you are satisfied with the layout. Step 9: Automate Log Retrieval and Update Dashboard To make the process of pulling logs and updating the Grafana dashboard more automated, create two Python scripts: 9.1: transfer_server.py This script triggers the Promtail process to start log scraping when accessed via an HTTP request: from http.server import BaseHTTPRequestHandler, HTTPServer import subprocess COMMAND = \"sudo ./promtail-linux-amd64 -config.file=promtail-config.yaml\" class RequestHandler(BaseHTTPRequestHandler): def do_GET(self): if self.path == \"/run\": try: subprocess.Popen(COMMAND, shell=True) self.send_response(200) self.end_headers() self.wfile.write(b\"Command executed successfully.\") except Exception as e: self.send_response(500) self.end_headers() self.wfile.write(f\"Error executing command: {e}\".encode()) else: self.send_response(404) self.end_headers() self.wfile.write(b\"Not found.\") if __name__ == \"__main__\": server_address = ('server_ip', 8081) httpd = HTTPServer(server_address, RequestHandler) print(\"Server running on http://server_ip. Access /run to execute the command.\") httpd.serve_forever() 9.2: server.py This script pulls the logs by executing the previously created bash script: from http.server import BaseHTTPRequestHandler, HTTPServer import subprocess class ScriptHandler(BaseHTTPRequestHandler): def do_GET(self): script_path = \"/path/to/transfer_logs.sh\" # [CHANGE THIS LINE] try: subprocess.run([script_path], check=True) self.send_response(200) self.send_header(\"Content-type\", \"text/html\") self.end_headers() self.wfile.write(b\"Logs Pulled Successfully.\") except subprocess.CalledProcessError: self.send_response(500) self.send_header(\"Content-type\", \"text/html\") self.end_headers() self.wfile.write(b\"Failed to pull logs.\") def run(server_class=HTTPServer, handler_class=ScriptHandler, port=8080): server_address = ('', port) httpd = server_class(server_address, handler_class) print(f\"Starting http server on port {port}\") httpd.serve_forever() if __name__ == \"__main__\": run() Run both Python scripts in the background using nohup : nohup python3 transfer_server.py > transfer_server.log 2>&1 & nohup python3 server.py > server.log 2>&1 & Step 10: Add Buttons to Grafana Dashboard In Grafana, go to Settings > Links . Add the links to the above Python scripts with the appropriate port ( 8080 for log pulling and 8081 for triggering Promtail). This will enable users to pull logs instantly as they wish. Make sure promtail activation button is run first when opening dashboard, and then pulling logs button after.","title":"Grafana Log Dashboard Guide"},{"location":"tutorials/grafana-log-dashboard/#developed-by-rudra-prakash-singh-esther-jang","text":"This guide walks you through the process of setting up a Grafana Server Log Monitoring Dashboard, including the installation and configuration of Grafana, Loki, and Promtail for log aggregation and visualization. It also covers setting up scripts for automating log retrieval and dashboard updates.","title":"Developed By: Rudra Prakash Singh, Esther Jang"},{"location":"tutorials/grafana-log-dashboard/#step-1-install-grafana-via-cli","text":"Install Grafana on your server using the following instructions for Debian-based systems: Follow the installation guide here: Grafana Installation on Debian Once installed, start Grafana and make sure it's accessible via a port (default: 3000 ). After Grafana is running, create an admin account. Once logged in, you'll land on the Grafana homepage.","title":"Step 1: Install Grafana via CLI"},{"location":"tutorials/grafana-log-dashboard/#step-2-install-loki","text":"Install Loki by following the official instructions for Docker: Loki Installation via Docker","title":"Step 2: Install Loki"},{"location":"tutorials/grafana-log-dashboard/#step-3-create-a-docker-compose-file-for-loki","text":"To set up Loki with Grafana, create a docker-compose.yml file: version: \"3\" # The version can be removed if you're using a recent Docker Compose version. services: grafana: image: grafana/grafana:latest ports: - \"3000:3000\" networks: - loki volumes: - grafana-data:/path # [CHANGE THIS LINE] Adding persistence for Grafana data loki: image: grafana/loki:latest ports: - \"3100:3100\" networks: - loki volumes: - ./path # [CHANGE THIS LINE] Local directory for Loki data user: \"10001\" # Run Loki as the appropriate user to avoid permission issues promtail: image: grafana/promtail:latest command: \"-config.file=/etc/promtail/config.yaml\" # [CHANGE THIS LINE] networks: - loki volumes: - \"/var/log:/var/log\" # [CHANGE THIS LINE] Mounting host logs networks: loki: volumes: grafana-data: # Declaring the volume for Grafana","title":"Step 3: Create a Docker Compose File for Loki"},{"location":"tutorials/grafana-log-dashboard/#step-4-install-promtail","text":"Install Promtail by following the official instructions: Promtail Installation Guide","title":"Step 4: Install Promtail"},{"location":"tutorials/grafana-log-dashboard/#step-5-configure-data-sources-logs","text":"To aggregate logs from other servers, we set up a method of transferring logs to the Grafana server. The logs are pulled into the Grafana server, where they are processed and rendered on a Grafana dashboard. Here\u2019s the updated section of the README with the requested changes marked. The rest remains unchanged.","title":"Step 5: Configure Data Sources (Logs)"},{"location":"tutorials/grafana-log-dashboard/#step-5-configure-data-sources-logs_1","text":"","title":"Step 5: Configure Data Sources (Logs)"},{"location":"tutorials/grafana-log-dashboard/#51-write-a-bash-script-to-pull-logs","text":"Here\u2019s an example of a script ( transfer_logs.sh ) to pull logs from another server: #!/bin/bash # Define variables REMOTE_SERVER=\"root@server_ip\" # [CHANGE THIS LINE] Remote server IP SSH_KEY_PATH=\"path\" # [CHANGE THIS LINE] Path to SSH key DEST_DIR=\"path\" # [CHANGE THIS LINE] Destination directory on the Grafana server # Define paths for logs DOCKER_LOG=\"path/to/docker/log\" # [CHANGE THIS LINE] Path to Docker log on remote server NGINX_LOG=\"path/to/nginx/log\" # [CHANGE THIS LINE] Path to NGINX log on remote server SYSLOG=\"path/to/syslog\" # [CHANGE THIS LINE] Path to syslog on remote server # Create directories if they don't exist mkdir -p \"$DEST_DIR/docker\" \"$DEST_DIR/nginx\" \"$DEST_DIR/syslog\" # Transfer logs echo \"Transferring Docker log...\" ssh -i $SSH_KEY_PATH $REMOTE_SERVER \"cat $DOCKER_LOG\" > \"$DEST_DIR/docker/docker.log\" echo \"Transferring NGINX log...\" ssh -i $SSH_KEY_PATH $REMOTE_SERVER \"cat $NGINX_LOG\" > \"$DEST_DIR/nginx/error.log\" echo \"Transferring syslog...\" ssh -i $SSH_KEY_PATH $REMOTE_SERVER \"cat $SYSLOG\" > \"$DEST_DIR/syslog/syslog.log\" echo \"All logs have been successfully transferred.\"","title":"5.1: Write a Bash Script to Pull Logs"},{"location":"tutorials/grafana-log-dashboard/#52-configure-promtail-to-scrape-logs","text":"Next, create a promtail-config.yaml file to let Promtail know where the logs are located: server: http_listen_port: 9080 grpc_listen_port: 0 positions: filename: /tmp/positions.yaml clients: - url: http://server_ip:3100/loki/api/v1/push # [CHANGE THIS LINE] Loki's URL scrape_configs: - job_name: docker_logs static_configs: labels: job: docker __path__: /path/to/logs/on/grafana/server/docker/*.log # [CHANGE THIS LINE] Path to Docker logs - job_name: nginx_logs static_configs: labels: job: nginx __path__: /path/to/logs/on/grafana/server/nginx/*.log # [CHANGE THIS LINE] Path to NGINX logs - job_name: syslog_logs static_configs: labels: job: syslog __path__: /path/to/logs/on/grafana/server/syslog/*.log # [CHANGE THIS LINE] Path to syslog logs","title":"5.2: Configure Promtail to Scrape Logs"},{"location":"tutorials/grafana-log-dashboard/#step-6-configure-grafana-to-use-loki","text":"Open Grafana\u2019s homepage and click the three vertical lines in the top-left corner. Navigate to Data Sources , then click Add Data Source . Select Loki as the data source type. Define the URL of your Loki instance, which is typically http://localhost:3100 . Click Save & Test . You should see a success message confirming the connection.","title":"Step 6: Configure Grafana to Use Loki"},{"location":"tutorials/grafana-log-dashboard/#step-7-explore-data-in-grafana","text":"Go to the Explore section in Grafana. Use label filters and run queries to see the logs coming from Promtail. The labels in the filters correspond to the labels defined in the promtail-config.yaml .","title":"Step 7: Explore Data in Grafana"},{"location":"tutorials/grafana-log-dashboard/#step-8-create-a-dashboard","text":"On the left sidebar in Grafana, click Dashboards > New Dashboard . Click Add Panel to create a new panel. Under Data Source , select Loki . Write queries to retrieve logs for display. Use different labels to filter log data as needed. Choose a visualization type (e.g., Logs ). Repeat the process to add more visualizations, then adjust the layout and size to suit your needs. Save the dashboard once you are satisfied with the layout.","title":"Step 8: Create a Dashboard"},{"location":"tutorials/grafana-log-dashboard/#step-9-automate-log-retrieval-and-update-dashboard","text":"To make the process of pulling logs and updating the Grafana dashboard more automated, create two Python scripts:","title":"Step 9: Automate Log Retrieval and Update Dashboard"},{"location":"tutorials/grafana-log-dashboard/#91-transfer_serverpy","text":"This script triggers the Promtail process to start log scraping when accessed via an HTTP request: from http.server import BaseHTTPRequestHandler, HTTPServer import subprocess COMMAND = \"sudo ./promtail-linux-amd64 -config.file=promtail-config.yaml\" class RequestHandler(BaseHTTPRequestHandler): def do_GET(self): if self.path == \"/run\": try: subprocess.Popen(COMMAND, shell=True) self.send_response(200) self.end_headers() self.wfile.write(b\"Command executed successfully.\") except Exception as e: self.send_response(500) self.end_headers() self.wfile.write(f\"Error executing command: {e}\".encode()) else: self.send_response(404) self.end_headers() self.wfile.write(b\"Not found.\") if __name__ == \"__main__\": server_address = ('server_ip', 8081) httpd = HTTPServer(server_address, RequestHandler) print(\"Server running on http://server_ip. Access /run to execute the command.\") httpd.serve_forever()","title":"9.1: transfer_server.py"},{"location":"tutorials/grafana-log-dashboard/#92-serverpy","text":"This script pulls the logs by executing the previously created bash script: from http.server import BaseHTTPRequestHandler, HTTPServer import subprocess class ScriptHandler(BaseHTTPRequestHandler): def do_GET(self): script_path = \"/path/to/transfer_logs.sh\" # [CHANGE THIS LINE] try: subprocess.run([script_path], check=True) self.send_response(200) self.send_header(\"Content-type\", \"text/html\") self.end_headers() self.wfile.write(b\"Logs Pulled Successfully.\") except subprocess.CalledProcessError: self.send_response(500) self.send_header(\"Content-type\", \"text/html\") self.end_headers() self.wfile.write(b\"Failed to pull logs.\") def run(server_class=HTTPServer, handler_class=ScriptHandler, port=8080): server_address = ('', port) httpd = server_class(server_address, handler_class) print(f\"Starting http server on port {port}\") httpd.serve_forever() if __name__ == \"__main__\": run() Run both Python scripts in the background using nohup : nohup python3 transfer_server.py > transfer_server.log 2>&1 & nohup python3 server.py > server.log 2>&1 &","title":"9.2: server.py"},{"location":"tutorials/grafana-log-dashboard/#step-10-add-buttons-to-grafana-dashboard","text":"In Grafana, go to Settings > Links . Add the links to the above Python scripts with the appropriate port ( 8080 for log pulling and 8081 for triggering Promtail). This will enable users to pull logs instantly as they wish. Make sure promtail activation button is run first when opening dashboard, and then pulling logs button after.","title":"Step 10: Add Buttons to Grafana Dashboard"},{"location":"tutorials/hardware/","text":"Our Hardware This page will be an overview of some of the core pieces of hardware that we use to deploy our sites. This page is in development, please contact us at lcl@seattlecommunitynetwork.org if you would like to learn more about the hardware we use. TODO Network Site Equipment Base Station (eNodeB) Baicells Nova 233 3.5GHz 1W Gen2 More info here Panel Antennas (eNodeB) Alpha Wireless, 3.3-3.8GHz, 2x2 MIMO, 18dBi, +/-45\u00b0, 65\u00b0 More info here Core Network Computer (EPC) Qotom Mini PC Q190G4N S07 Key features: - 4 ethernet ports - designed to be run 24/7 - small and quiet - cheap More info here User Access Devices LTE Consumer Premises Equipment (CPE) Baicells Atom OD04 3.5GHz 14dBi More info here Outdoor WiFi Router Mikrotik OmniTIK 5 PoE ac Outdoor router of choice for NYC Mesh, so it has been tried and tested. Good balance of quality and price. More info here Home WiFi Router TP-Link Archer A5 Router More info here CBRS-Compatible Unlocked Smartphone We purchase refurbished Google Pixel 4 smartphones because they are affordable, provide all necessary smartphone features, and are CBRS-compatible. Note that purchasing CBRS-compatible phones can be a logistical challenge. We've experienced trouble purchasing from vendors that send incorrect models of phones that don't support CBRS band and we had to go back and forth. Test your phones before distributing them! Here is one spot to purchase refurbished phones.","title":"Hardware Overview"},{"location":"tutorials/hardware/#our-hardware","text":"This page will be an overview of some of the core pieces of hardware that we use to deploy our sites. This page is in development, please contact us at lcl@seattlecommunitynetwork.org if you would like to learn more about the hardware we use.","title":"Our Hardware"},{"location":"tutorials/hardware/#todo","text":"","title":"TODO"},{"location":"tutorials/hardware/#network-site-equipment","text":"","title":"Network Site Equipment"},{"location":"tutorials/hardware/#base-station-enodeb","text":"Baicells Nova 233 3.5GHz 1W Gen2 More info here","title":"Base Station (eNodeB)"},{"location":"tutorials/hardware/#panel-antennas-enodeb","text":"Alpha Wireless, 3.3-3.8GHz, 2x2 MIMO, 18dBi, +/-45\u00b0, 65\u00b0 More info here","title":"Panel Antennas (eNodeB)"},{"location":"tutorials/hardware/#core-network-computer-epc","text":"Qotom Mini PC Q190G4N S07 Key features: - 4 ethernet ports - designed to be run 24/7 - small and quiet - cheap More info here","title":"Core Network Computer (EPC)"},{"location":"tutorials/hardware/#user-access-devices","text":"","title":"User Access Devices"},{"location":"tutorials/hardware/#lte-consumer-premises-equipment-cpe","text":"Baicells Atom OD04 3.5GHz 14dBi More info here","title":"LTE Consumer Premises Equipment (CPE)"},{"location":"tutorials/hardware/#outdoor-wifi-router","text":"Mikrotik OmniTIK 5 PoE ac Outdoor router of choice for NYC Mesh, so it has been tried and tested. Good balance of quality and price. More info here","title":"Outdoor WiFi Router"},{"location":"tutorials/hardware/#home-wifi-router","text":"TP-Link Archer A5 Router More info here","title":"Home WiFi Router"},{"location":"tutorials/hardware/#cbrs-compatible-unlocked-smartphone","text":"We purchase refurbished Google Pixel 4 smartphones because they are affordable, provide all necessary smartphone features, and are CBRS-compatible. Note that purchasing CBRS-compatible phones can be a logistical challenge. We've experienced trouble purchasing from vendors that send incorrect models of phones that don't support CBRS band and we had to go back and forth. Test your phones before distributing them! Here is one spot to purchase refurbished phones.","title":"CBRS-Compatible Unlocked Smartphone"},{"location":"tutorials/librenms-manager-setup/","text":"LibreNMS Network Manager Configuration Seattle Community Networks uses SNMP to monitor network nodes. LibreNMS is used for Network Management, Dashboard generation and Alerting. LibreNMS Manager Installation: Install LibreNMS Install and Configure LibreNMS on Ubuntu with nginx Network-Specific Configuration: Change active user to librenms: sudo su - librenms Edit /opt/librenms/config.php: '); $config['auth_mechanism'] = \"mysql\"; # default, other options: ldap, http-auth $config['nets'][] = \"10.0.0.0/24\"; # Replace with your Management Network Subdomain $config['rrd_purge'] = 0; $config['enable_billing'] = 1; $config['show_services'] = 1; As user 'librenms', run /opt/librenms/snmp-scan.php, to scan the configured network for snmp hosts Adding Baicells OS configuration to LibreNMS As user 'librenms' on the librenms server, create the following files and update their contents accordingly: * For OS detection, ~librenms/includes/definitions/rts.yaml: os: rts text: 'Baicells RTS' type: network icon: rts over: - { graph: device_bits, text: 'Device Traffic' } - { graph: device_processor, text: 'CPU Usage' } - { graph: device_mempool, text: 'Memory Usage' } discovery: - sysDescr: - 'CELL' For defining custom RTS OS sensors, ~librenms/includes/definitions/discovery/rts.yaml: mib: BAICELLS-MIB modules: os: hardware: BAICELLS-MIB::hardwareVersion.0 serial: BAICELLS-MIB::sn.0 version: BAICELLS-MIB::softwareVersion.0 sensors: count: data: - oid: ulThroughput num_oid: '.1.3.6.1.4.1.53058.190.7.{{ $index }}' descr: 'Upload Throughput' group: 'Throughput' index: 'ulthroughput.{{ $index }}' - oid: dlThroughput num_oid: '.1.3.6.1.4.1.53058.190.8.{{ $index }}' descr: 'Download Throughput' group: 'Throughput' index: 'dlThroughput.{{ $index }}' - oid: ulPrbUtilization num_oid: '.1.3.6.1.4.1.53058.190.9.{{ $index }}' descr: 'Upload PRB Utilization' group: 'Utilization' index: 'ulPrbUtilization{{ $index }}' - oid: dlPrbUtilization num_oid: '.1.3.6.1.4.1.53058.190.10.{{ $index }}' descr: 'Download PRB Utilization' group: 'Utilization' index: 'dlPrbUtilization.{{ $index }}' frequency: data: - oid: carrierBwMhz num_oid: '.1.3.6.1.4.1.53058.100.7.{{ $index }}' divisor: 5 descr: 'Carrier Bandwidth' index: 'carrierBwMhz.{{ $index }}' percent: data: - oid: eRABEstablishSuccessRate num_oid: '.1.3.6.1.4.1.53058.190.3.{{ $index }}' descr: 'ERAB Establishment Success Rate' group: 'LTE' index: 'eRABEstablishSuccessRate.{{ $index }}' - oid: hoSuccInterEnbS1Rate num_oid: '.1.3.6.1.4.1.53058.190.4.{{ $index }}' descr: 'Inter MME S1 Handover Success Rate' group: 'LTE' index: 'heSuccInterEnbS1Rate.{{ $index }}' - oid: hoSuccInterEnbRate num_oid: '.1.3.6.1.4.1.53058.190.5.{{ $index }}' descr: 'Inter MME Handover Success Rate' group: 'LTE' index: 'hoSuccInterEnbRate.{{ $index }}' - oid: rrcBuildSuccessRate num_oid: '.1.3.6.1.4.1.53058.190.6.{{ $index }}' descr: 'RRC Build Success Rate' group: 'LTE' index: 'rrcBuildSuccessRate.{{ $index }}' For defining a custom OS class to use Wireless sensors, ~librenms/LibreNMS/OS/Rts.php (note: pay attention to capitalization) getDeviceId(), $oid, 'rts', 1, 'UE Connections') ); } } A nice looking logo, ~librenms/html/images/os/rts.png Download an example Baicells Logo Here Download the baicells mib from this link , and save it to ~librenms/mibs/BAICELLS-MIB (note: no file extension)","title":"Network Monitoring 1. LibreNMS Network Manager Configuration"},{"location":"tutorials/librenms-manager-setup/#librenms-network-manager-configuration","text":"Seattle Community Networks uses SNMP to monitor network nodes. LibreNMS is used for Network Management, Dashboard generation and Alerting.","title":"LibreNMS Network Manager Configuration"},{"location":"tutorials/librenms-manager-setup/#librenms-manager-installation","text":"Install LibreNMS Install and Configure LibreNMS on Ubuntu with nginx","title":"LibreNMS Manager Installation:"},{"location":"tutorials/librenms-manager-setup/#network-specific-configuration","text":"Change active user to librenms: sudo su - librenms Edit /opt/librenms/config.php: '); $config['auth_mechanism'] = \"mysql\"; # default, other options: ldap, http-auth $config['nets'][] = \"10.0.0.0/24\"; # Replace with your Management Network Subdomain $config['rrd_purge'] = 0; $config['enable_billing'] = 1; $config['show_services'] = 1; As user 'librenms', run /opt/librenms/snmp-scan.php, to scan the configured network for snmp hosts","title":"Network-Specific Configuration:"},{"location":"tutorials/librenms-manager-setup/#adding-baicells-os-configuration-to-librenms","text":"As user 'librenms' on the librenms server, create the following files and update their contents accordingly: * For OS detection, ~librenms/includes/definitions/rts.yaml: os: rts text: 'Baicells RTS' type: network icon: rts over: - { graph: device_bits, text: 'Device Traffic' } - { graph: device_processor, text: 'CPU Usage' } - { graph: device_mempool, text: 'Memory Usage' } discovery: - sysDescr: - 'CELL' For defining custom RTS OS sensors, ~librenms/includes/definitions/discovery/rts.yaml: mib: BAICELLS-MIB modules: os: hardware: BAICELLS-MIB::hardwareVersion.0 serial: BAICELLS-MIB::sn.0 version: BAICELLS-MIB::softwareVersion.0 sensors: count: data: - oid: ulThroughput num_oid: '.1.3.6.1.4.1.53058.190.7.{{ $index }}' descr: 'Upload Throughput' group: 'Throughput' index: 'ulthroughput.{{ $index }}' - oid: dlThroughput num_oid: '.1.3.6.1.4.1.53058.190.8.{{ $index }}' descr: 'Download Throughput' group: 'Throughput' index: 'dlThroughput.{{ $index }}' - oid: ulPrbUtilization num_oid: '.1.3.6.1.4.1.53058.190.9.{{ $index }}' descr: 'Upload PRB Utilization' group: 'Utilization' index: 'ulPrbUtilization{{ $index }}' - oid: dlPrbUtilization num_oid: '.1.3.6.1.4.1.53058.190.10.{{ $index }}' descr: 'Download PRB Utilization' group: 'Utilization' index: 'dlPrbUtilization.{{ $index }}' frequency: data: - oid: carrierBwMhz num_oid: '.1.3.6.1.4.1.53058.100.7.{{ $index }}' divisor: 5 descr: 'Carrier Bandwidth' index: 'carrierBwMhz.{{ $index }}' percent: data: - oid: eRABEstablishSuccessRate num_oid: '.1.3.6.1.4.1.53058.190.3.{{ $index }}' descr: 'ERAB Establishment Success Rate' group: 'LTE' index: 'eRABEstablishSuccessRate.{{ $index }}' - oid: hoSuccInterEnbS1Rate num_oid: '.1.3.6.1.4.1.53058.190.4.{{ $index }}' descr: 'Inter MME S1 Handover Success Rate' group: 'LTE' index: 'heSuccInterEnbS1Rate.{{ $index }}' - oid: hoSuccInterEnbRate num_oid: '.1.3.6.1.4.1.53058.190.5.{{ $index }}' descr: 'Inter MME Handover Success Rate' group: 'LTE' index: 'hoSuccInterEnbRate.{{ $index }}' - oid: rrcBuildSuccessRate num_oid: '.1.3.6.1.4.1.53058.190.6.{{ $index }}' descr: 'RRC Build Success Rate' group: 'LTE' index: 'rrcBuildSuccessRate.{{ $index }}' For defining a custom OS class to use Wireless sensors, ~librenms/LibreNMS/OS/Rts.php (note: pay attention to capitalization) getDeviceId(), $oid, 'rts', 1, 'UE Connections') ); } } A nice looking logo, ~librenms/html/images/os/rts.png Download an example Baicells Logo Here Download the baicells mib from this link , and save it to ~librenms/mibs/BAICELLS-MIB (note: no file extension)","title":"Adding Baicells OS configuration to LibreNMS"},{"location":"tutorials/librenms-setup/","text":"LibreNMS Agent Configuration Adding a New Node to LibreNMS Both the eNodeB and the EPC must be configured individually in order for them to report statistics to the SNMP Manager. Since the eNodeB is not directly accessible from the management VPN, we configure an SNMP proxy on the EPC to pass SNMP statistics to the Management host. EPC SNMP Configuration Install snmpd to the EPC node: $ sudo apt install snmpd Modify /etc/snmp/snmpd.conf: sysLocation sysContact lcl@seattlecommunitynetwork.org sysServices 72 master agentx agentAddress udp:161 com2sec readonly com2sec -Cn ctx_baicells readonly enodeb group readonlygroup v2c readonly view all included .1 access readonlygroup \"\" v2c noauth exact all none none access readonlygroup ctx_baicells v2c noauth prefix all none none proxy -Cn ctx_baicells -v 2c -c private 192.168.151.1 .1.3 This configuration allows us to access SNMP data on the EPC with the standard community string (refer to internal standards documentation). but will proxy the Baicells SNMP data when we send the community string \u2018enodeb\u2019 Update the snmpd service file to automatically restart snmpd on crash: Edit /lib/systemd/system/snmpd.service, modify the 'ExecStart' line, and add the 'ExecReload', 'Restart', and 'RestartSec' lines: [Unit] Description=Simple Network Management Protocol (SNMP) Daemon. After=network.target ConditionPathExists=/etc/snmp/snmpd.conf [Service] Type=simple ExecStartPre=/bin/mkdir -p /var/run/agentx ExecStart=/usr/sbin/snmpd -LO2w -u Debian-snmp -g Debian-snmp -I -smux,mteTrigger,mteTriggerConf -f -p /run/snmpd.pid ExecReload=/bin/kill -HUP $MAINPID Restart=on-failure RestartSec=5s [Install] WantedBy=multi-user.target Enable and restart snmpd: Sudo systemctl daemon-reload sudo systemctl enable snmpd sudo systemctl restart snmpd Baicells SNMP configuration Log into the Baicells configuration console: https:// From the left menu, select System Select SNMP Under \u2018SNMP Switch,\u2019 select \u2018Enable\u2019 Configure the following options: Community String: private Contact: lcl@seattlecommunitynetwork.org Location: \\ (String should not have any spaces) Source: Any Adding the Node to LibreNMS If the EPC is running, librenms should be able to auto-discover it. Run this command from a shell on the management host: sudo -u librenms lnms scan LibreNMS should print a status message that it was able to add a new device. When first discovered, the EPC will show up generically as it\u2019s ip address. Edit the hostname, but clicking \u2018Edit Device\u2019 (gear icon): Click the red pencil icon, and change the ip address to the hostname Fill \u2018Overwrite IP\u2019 with the EPC IP address Note: If the IP is not changed to the hostname, you will not be able to add the eNodeB by it\u2019s IP address The Baicells eNB needs to be added manually: From LibreNMS, select Devices and click \u201cAdd Device\u201d Add a new device, with the following configurations: Hostname: Community: \u2018enodeb\u2019 Force Add: On Note: If you receive an error message stating that a device with the specified IP already exists, make sure that you have successfully changed the eNodeB\u2019s hostname per the previous step. Once the device is added, click the \u2018Edit Device\u2019 icon (gear icon) and update the following values: Display name: \\ Overwrite device contact: lcl@seattlecommunitynetwork.org Other helpful notes: Baicells eNB config guide How to SSH into Baicells eNB: SSH using port 27149 (username same as normal web-based login) Convert the MAC address of this eNB to link local address: http://www.sput.nl/internet/ipv6/ll-mac.html","title":"Network Monitoring 2. LibreNMS Agent Configuration"},{"location":"tutorials/librenms-setup/#librenms-agent-configuration","text":"","title":"LibreNMS Agent Configuration"},{"location":"tutorials/librenms-setup/#adding-a-new-node-to-librenms","text":"Both the eNodeB and the EPC must be configured individually in order for them to report statistics to the SNMP Manager. Since the eNodeB is not directly accessible from the management VPN, we configure an SNMP proxy on the EPC to pass SNMP statistics to the Management host.","title":"Adding a New Node to LibreNMS"},{"location":"tutorials/librenms-setup/#epc-snmp-configuration","text":"Install snmpd to the EPC node: $ sudo apt install snmpd Modify /etc/snmp/snmpd.conf: sysLocation sysContact lcl@seattlecommunitynetwork.org sysServices 72 master agentx agentAddress udp:161 com2sec readonly com2sec -Cn ctx_baicells readonly enodeb group readonlygroup v2c readonly view all included .1 access readonlygroup \"\" v2c noauth exact all none none access readonlygroup ctx_baicells v2c noauth prefix all none none proxy -Cn ctx_baicells -v 2c -c private 192.168.151.1 .1.3 This configuration allows us to access SNMP data on the EPC with the standard community string (refer to internal standards documentation). but will proxy the Baicells SNMP data when we send the community string \u2018enodeb\u2019 Update the snmpd service file to automatically restart snmpd on crash: Edit /lib/systemd/system/snmpd.service, modify the 'ExecStart' line, and add the 'ExecReload', 'Restart', and 'RestartSec' lines: [Unit] Description=Simple Network Management Protocol (SNMP) Daemon. After=network.target ConditionPathExists=/etc/snmp/snmpd.conf [Service] Type=simple ExecStartPre=/bin/mkdir -p /var/run/agentx ExecStart=/usr/sbin/snmpd -LO2w -u Debian-snmp -g Debian-snmp -I -smux,mteTrigger,mteTriggerConf -f -p /run/snmpd.pid ExecReload=/bin/kill -HUP $MAINPID Restart=on-failure RestartSec=5s [Install] WantedBy=multi-user.target Enable and restart snmpd: Sudo systemctl daemon-reload sudo systemctl enable snmpd sudo systemctl restart snmpd","title":"EPC SNMP Configuration"},{"location":"tutorials/librenms-setup/#baicells-snmp-configuration","text":"Log into the Baicells configuration console: https:// From the left menu, select System Select SNMP Under \u2018SNMP Switch,\u2019 select \u2018Enable\u2019 Configure the following options: Community String: private Contact: lcl@seattlecommunitynetwork.org Location: \\ (String should not have any spaces) Source: Any","title":"Baicells SNMP configuration"},{"location":"tutorials/librenms-setup/#adding-the-node-to-librenms","text":"If the EPC is running, librenms should be able to auto-discover it. Run this command from a shell on the management host: sudo -u librenms lnms scan LibreNMS should print a status message that it was able to add a new device. When first discovered, the EPC will show up generically as it\u2019s ip address. Edit the hostname, but clicking \u2018Edit Device\u2019 (gear icon): Click the red pencil icon, and change the ip address to the hostname Fill \u2018Overwrite IP\u2019 with the EPC IP address Note: If the IP is not changed to the hostname, you will not be able to add the eNodeB by it\u2019s IP address The Baicells eNB needs to be added manually: From LibreNMS, select Devices and click \u201cAdd Device\u201d Add a new device, with the following configurations: Hostname: Community: \u2018enodeb\u2019 Force Add: On Note: If you receive an error message stating that a device with the specified IP already exists, make sure that you have successfully changed the eNodeB\u2019s hostname per the previous step. Once the device is added, click the \u2018Edit Device\u2019 icon (gear icon) and update the following values: Display name: \\ Overwrite device contact: lcl@seattlecommunitynetwork.org","title":"Adding the Node to LibreNMS"},{"location":"tutorials/librenms-setup/#other-helpful-notes","text":"Baicells eNB config guide How to SSH into Baicells eNB: SSH using port 27149 (username same as normal web-based login) Convert the MAC address of this eNB to link local address: http://www.sput.nl/internet/ipv6/ll-mac.html","title":"Other helpful notes:"},{"location":"tutorials/peering/","text":"Public ASN Peering Local Connectivity Lab operates AS54429 Our peering Policy is Yes Please contact us to peer with our network. Note this network is our public ASN, not the Seattle Community Network itself. If you would like to join the network visit our connect page. Seattle Community Network (SCN) is a community network dedicated to providing fair access to underserved communities all across the Puget Sound. Learn more on our FAQ . Peering Policy Local Connectivity Lab has an open peering policy. We have no requirements in terms of traffic, size, support/SLA, etc. We operate both IPv4 and IPv6. Peering via both protocols is appreciated. Locations Building Address Ports Westin 2001 6th Avenue, Seattle, WA 1G / 10G Exchanges Exchange City IPv4 IPv6 ASNs Routes Speed Seattle Internet Exchange (SIX) Seattle, WA 206.81.81.150 2001:504:16::d49d 336 ~192K 10G Peering Data ASN: 54429 Peering Contact: tech@seattlecommunitynetwork.org PeerDB Page: https://as54429.peeringdb.com As we are a non-profit, please consider providing as many routes as possible, including upstream or other routes.","title":"Public ASN Peering"},{"location":"tutorials/peering/#public-asn-peering","text":"","title":"Public ASN Peering"},{"location":"tutorials/peering/#local-connectivity-lab-operates-as54429","text":"","title":"Local Connectivity Lab operates AS54429"},{"location":"tutorials/peering/#our-peering-policy-is-yes","text":"Please contact us to peer with our network. Note this network is our public ASN, not the Seattle Community Network itself. If you would like to join the network visit our connect page. Seattle Community Network (SCN) is a community network dedicated to providing fair access to underserved communities all across the Puget Sound. Learn more on our FAQ .","title":"Our peering Policy is Yes"},{"location":"tutorials/peering/#peering-policy","text":"Local Connectivity Lab has an open peering policy. We have no requirements in terms of traffic, size, support/SLA, etc. We operate both IPv4 and IPv6. Peering via both protocols is appreciated.","title":"Peering Policy"},{"location":"tutorials/peering/#locations","text":"Building Address Ports Westin 2001 6th Avenue, Seattle, WA 1G / 10G","title":"Locations"},{"location":"tutorials/peering/#exchanges","text":"Exchange City IPv4 IPv6 ASNs Routes Speed Seattle Internet Exchange (SIX) Seattle, WA 206.81.81.150 2001:504:16::d49d 336 ~192K 10G","title":"Exchanges"},{"location":"tutorials/peering/#peering-data","text":"ASN: 54429 Peering Contact: tech@seattlecommunitynetwork.org PeerDB Page: https://as54429.peeringdb.com As we are a non-profit, please consider providing as many routes as possible, including upstream or other routes.","title":"Peering Data"},{"location":"tutorials/proxmox-vaultwarden-deployment/","text":"Deployed by: Esther Jang, Paul Phillion, Rudra Singh Section 1: What is Proxmox? Proxmox VE (Virtual Environment) is an open-source server management platform designed to deploy and manage virtual machines (VMs) and containers. It integrates KVM hypervisor and LXC containers, enabling users to manage virtual infrastructure through a web-based interface. Section 2: Access Requirements for Proxmox VE at Seattle Community Network To submit a request for a SCN self-hosted Proxmox VM on our private cloud, please fill out this form . If you are working on a project for SCN and need access to the Proxmox VE, please continue reading. Next, you will need access to the OpenVPN. Proxmox VE can only be accessed on the VPN. Specific details can be obtained from the SCN discord. Once connected to the VPN, a specific IP will be provided for you to access the Proxmox VE, where you can input your credentials. Section 3: Setting up your VM Install SSH Install Keys Test SSH CLI Section 4: SSH Troubleshooting Please let the SCN discord know if you have trouble SSH'ing in. A useful command during setup was sudo ufw status . If it is active, use ufw disable . The expected status should be inactive. If that still doesn\u2019t work, try restarting the VM from the Proxmox VE. Section 5: Beginning Deployment: Vaultwarden docker pull vaultwarden/server:latest docker run -d --name vaultwarden -v /vw-data/:/data/ --restart unless-stopped -p 80:80 vaultwarden/server:latest Section 6: Docker Compose Create a Docker Compose file: version: \"3\" services: vaultwarden: container_name: vaultwarden hostname: vaultwarden9 ports: - \"127.0.0.1:8080:80\" environment: - LOG_FILE=/log/access.log - LOG_LEVEL=info - EXTENDED_LOGGING=true image: vaultwarden/server:latest restart: unless-stopped volumes: - /opt/vw-data:/data - /var/log/vw:/log To start and run your container application in detached mode, use: docker-compose up -d docker-compose start docker-compose stop docker-compose restart Section 7: Azure DNS For this deployment, we're utilizing a public IP address. This address must be configured within Azure DNS to point to our chosen domain name. Navigate to Home - Microsoft Azure with your account. Open \u201cDNS zones\u201d. If you were using a private IP, you would use \u201cPrivate DNS zones\u201d. We will be creating a subdomain under seattlecommunitynetwork.org. Click on that, and under DNS management, click recordsets, and click add. Insert the beginning of the subdomain name, which in our case is \u201cvaultwarden\u201d. Below, under IP address, insert your IP, and create your new subdomain. Section 8: Enabling Nginx sudo apt update sudo apt install nginx sudo systemctl enable nginx sudo systemctl start nginx Next, go to /etc/nginx/sites-enabled/default . Delete everything inside default and paste this: # The `upstream` directives ensure that you have a http/1.1 connection # This enables the keepalive option and better performance # # Define the server IP and ports here. upstream vaultwarden-default { zone vaultwarden-default 64k; server 127.0.0.1:8080; keepalive 2; } # Needed to support websocket connections # See: https://nginx.org/en/docs/http/websocket.html # Instead of \"close\" as stated in the above link we send an empty value. # Else all keepalive connections will not work. map $http_upgrade $connection_upgrade { default upgrade; '' \"\"; } # Redirect HTTP to HTTPS server { listen 80; listen [::]:80; server_name vaultwarden.seattlecommunitynetwork.org; if ($host = vaultwarden.seattlecommunitynetwork.org) { return 301 https://$host$request_uri; } return 404; } server { # For older versions of nginx appened http2 to the listen line after ssl and remove `http2 on` listen 443 ssl; listen [::]:443 ssl; # http2 on; server_name vaultwarden.seattlecommunitynetwork.org; # Specify SSL Config when needed ssl_certificate /etc/path...; ssl_certificate_key /etc/path...; ssl_trusted_certificate /etc/path...; client_max_body_size 525M; location / { proxy_http_version 1.1; proxy_set_header Upgrade $http_upgrade; proxy_set_header Connection $connection_upgrade; proxy_set_header Host $host; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; proxy_set_header X-Forwarded-Proto $scheme; proxy_pass http://vaultwarden-default; } # Optionally add extra authentication besides the ADMIN_TOKEN # Remove the comments below `#` and create the htpasswd_file to have it active # #location /admin { # See: https://docs.nginx.com/nginx/admin-guide/security-controls/configuring-http-basic-authentication/ #auth_basic \"Administrator's Area\"; #3auth_basic_user_file /path/to/htpasswd_file; #proxy_http_version 1.1; #proxy_set_header Upgrade $http_upgrade; #proxy_set_header Connection $connection_upgrade; #proxy_set_header Host $host; #proxy_set_header X-Real-IP $remote_addr; #proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; #proxy_set_header X-Forwarded-Proto $scheme; #proxy_pass http://vaultwarden-default; } } Section 9: Obtain SSL Certificates sudo apt install certbot python3-certbot-nginx sudo certbot --nginx -d vaultwarden.seattlecommunitynetwork.org Certbot will modify your Nginx configuration to handle HTTPS and redirect from HTTP to HTTPS. Ensure that you copy the file paths provided at the conclusion of the certbot process into the default nginx configuration file, replacing the corresponding comments with these paths. Section 10: Ensure Everything is Running sudo systemctl status nginx Section 11: Additional Features Enabling admin panel: Go back to /etc/nginx/sites-enabled/default and uncomment the admin section at the bottom. Follow directions at Nginx Admin Guide to encrypt your admin password as a .env file (preferably using argon CLI). Once done, make sure you create a .env file in the directory where the compose file is with VAULTWARDEN_ADMIN_TOKEN=[insert your hashed admin token] . Then in your compose, add these two lines under environment: - ADMIN_TOKEN=${VAULTWARDEN_ADMIN_TOKEN} - DOMAIN=https://vaultwarden.seattlecommunitynetwork.org Restart the container and try logging into https://vaultwarden.seattlecommunitynetwork.org/admin . Once logged in, SMTP and 2FA enabling settings can be configured on the home page. Section 12: Data Backup Enabling backups for Vaultwarden is a simple process. Please review the attached backup bash script, which facilitates the transfer of Vaultwarden data to another virtual machine. Additionally, there is a cleanup bash script designed to retain only the most recent file in the other VM, deleting all others. Feel free to modify the scripts as necessary to suit your specific requirements. Backup script: #!/bin/bash docker-compose down datestamp=$(date +%m-%d-%Y) zip -9 -r /home/scn/backups/${datestamp}.zip /opt/vw-data* scp -i ~/.ssh-comm/id_rsa /home/scn/backups/${datestamp}.zip azureuser@[IP address]:~/backups/ docker-compose up -d Cleanup Script: #!/bin/bash # Define the directory containing backup files backup_dir=~/backups # Go to the backup directory cd \"$backup_dir\" || exit # Find and delete older backup files (excluding the latest day) find . -type f -name '*.zip' ! -mtime -1 -exec rm {} + # Exit exit 0 Section 13: Using the Backup To restore a data backup to the original virtual machine, simply unzip the file and delete the existing contents of /opt/vw-data . Then, transfer the contents of your zip file into this directory. Perform a quick restart of the container, and you will have successfully restored the version of the backup you selected.","title":"Proxmox Deployment Guide - Vaultwarden"},{"location":"tutorials/proxmox-vaultwarden-deployment/#deployed-by-esther-jang-paul-phillion-rudra-singh","text":"","title":"Deployed by: Esther Jang, Paul Phillion, Rudra Singh"},{"location":"tutorials/proxmox-vaultwarden-deployment/#section-1-what-is-proxmox","text":"Proxmox VE (Virtual Environment) is an open-source server management platform designed to deploy and manage virtual machines (VMs) and containers. It integrates KVM hypervisor and LXC containers, enabling users to manage virtual infrastructure through a web-based interface.","title":"Section 1: What is Proxmox?"},{"location":"tutorials/proxmox-vaultwarden-deployment/#section-2-access-requirements-for-proxmox-ve-at-seattle-community-network","text":"To submit a request for a SCN self-hosted Proxmox VM on our private cloud, please fill out this form . If you are working on a project for SCN and need access to the Proxmox VE, please continue reading. Next, you will need access to the OpenVPN. Proxmox VE can only be accessed on the VPN. Specific details can be obtained from the SCN discord. Once connected to the VPN, a specific IP will be provided for you to access the Proxmox VE, where you can input your credentials.","title":"Section 2: Access Requirements for Proxmox VE at Seattle Community Network"},{"location":"tutorials/proxmox-vaultwarden-deployment/#section-3-setting-up-your-vm","text":"","title":"Section 3: Setting up your VM"},{"location":"tutorials/proxmox-vaultwarden-deployment/#install-ssh","text":"","title":"Install SSH"},{"location":"tutorials/proxmox-vaultwarden-deployment/#install-keys","text":"","title":"Install Keys"},{"location":"tutorials/proxmox-vaultwarden-deployment/#test-ssh-cli","text":"","title":"Test SSH CLI"},{"location":"tutorials/proxmox-vaultwarden-deployment/#section-4-ssh-troubleshooting","text":"Please let the SCN discord know if you have trouble SSH'ing in. A useful command during setup was sudo ufw status . If it is active, use ufw disable . The expected status should be inactive. If that still doesn\u2019t work, try restarting the VM from the Proxmox VE.","title":"Section 4: SSH Troubleshooting"},{"location":"tutorials/proxmox-vaultwarden-deployment/#section-5-beginning-deployment-vaultwarden","text":"docker pull vaultwarden/server:latest docker run -d --name vaultwarden -v /vw-data/:/data/ --restart unless-stopped -p 80:80 vaultwarden/server:latest","title":"Section 5: Beginning Deployment: Vaultwarden"},{"location":"tutorials/proxmox-vaultwarden-deployment/#section-6-docker-compose","text":"Create a Docker Compose file: version: \"3\" services: vaultwarden: container_name: vaultwarden hostname: vaultwarden9 ports: - \"127.0.0.1:8080:80\" environment: - LOG_FILE=/log/access.log - LOG_LEVEL=info - EXTENDED_LOGGING=true image: vaultwarden/server:latest restart: unless-stopped volumes: - /opt/vw-data:/data - /var/log/vw:/log To start and run your container application in detached mode, use: docker-compose up -d docker-compose start docker-compose stop docker-compose restart","title":"Section 6: Docker Compose"},{"location":"tutorials/proxmox-vaultwarden-deployment/#section-7-azure-dns","text":"For this deployment, we're utilizing a public IP address. This address must be configured within Azure DNS to point to our chosen domain name. Navigate to Home - Microsoft Azure with your account. Open \u201cDNS zones\u201d. If you were using a private IP, you would use \u201cPrivate DNS zones\u201d. We will be creating a subdomain under seattlecommunitynetwork.org. Click on that, and under DNS management, click recordsets, and click add. Insert the beginning of the subdomain name, which in our case is \u201cvaultwarden\u201d. Below, under IP address, insert your IP, and create your new subdomain.","title":"Section 7: Azure DNS"},{"location":"tutorials/proxmox-vaultwarden-deployment/#section-8-enabling-nginx","text":"sudo apt update sudo apt install nginx sudo systemctl enable nginx sudo systemctl start nginx Next, go to /etc/nginx/sites-enabled/default . Delete everything inside default and paste this: # The `upstream` directives ensure that you have a http/1.1 connection # This enables the keepalive option and better performance # # Define the server IP and ports here. upstream vaultwarden-default { zone vaultwarden-default 64k; server 127.0.0.1:8080; keepalive 2; } # Needed to support websocket connections # See: https://nginx.org/en/docs/http/websocket.html # Instead of \"close\" as stated in the above link we send an empty value. # Else all keepalive connections will not work. map $http_upgrade $connection_upgrade { default upgrade; '' \"\"; } # Redirect HTTP to HTTPS server { listen 80; listen [::]:80; server_name vaultwarden.seattlecommunitynetwork.org; if ($host = vaultwarden.seattlecommunitynetwork.org) { return 301 https://$host$request_uri; } return 404; } server { # For older versions of nginx appened http2 to the listen line after ssl and remove `http2 on` listen 443 ssl; listen [::]:443 ssl; # http2 on; server_name vaultwarden.seattlecommunitynetwork.org; # Specify SSL Config when needed ssl_certificate /etc/path...; ssl_certificate_key /etc/path...; ssl_trusted_certificate /etc/path...; client_max_body_size 525M; location / { proxy_http_version 1.1; proxy_set_header Upgrade $http_upgrade; proxy_set_header Connection $connection_upgrade; proxy_set_header Host $host; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; proxy_set_header X-Forwarded-Proto $scheme; proxy_pass http://vaultwarden-default; } # Optionally add extra authentication besides the ADMIN_TOKEN # Remove the comments below `#` and create the htpasswd_file to have it active # #location /admin { # See: https://docs.nginx.com/nginx/admin-guide/security-controls/configuring-http-basic-authentication/ #auth_basic \"Administrator's Area\"; #3auth_basic_user_file /path/to/htpasswd_file; #proxy_http_version 1.1; #proxy_set_header Upgrade $http_upgrade; #proxy_set_header Connection $connection_upgrade; #proxy_set_header Host $host; #proxy_set_header X-Real-IP $remote_addr; #proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; #proxy_set_header X-Forwarded-Proto $scheme; #proxy_pass http://vaultwarden-default; } }","title":"Section 8: Enabling Nginx"},{"location":"tutorials/proxmox-vaultwarden-deployment/#section-9-obtain-ssl-certificates","text":"sudo apt install certbot python3-certbot-nginx sudo certbot --nginx -d vaultwarden.seattlecommunitynetwork.org Certbot will modify your Nginx configuration to handle HTTPS and redirect from HTTP to HTTPS. Ensure that you copy the file paths provided at the conclusion of the certbot process into the default nginx configuration file, replacing the corresponding comments with these paths.","title":"Section 9: Obtain SSL Certificates"},{"location":"tutorials/proxmox-vaultwarden-deployment/#section-10-ensure-everything-is-running","text":"sudo systemctl status nginx","title":"Section 10: Ensure Everything is Running"},{"location":"tutorials/proxmox-vaultwarden-deployment/#section-11-additional-features","text":"Enabling admin panel: Go back to /etc/nginx/sites-enabled/default and uncomment the admin section at the bottom. Follow directions at Nginx Admin Guide to encrypt your admin password as a .env file (preferably using argon CLI). Once done, make sure you create a .env file in the directory where the compose file is with VAULTWARDEN_ADMIN_TOKEN=[insert your hashed admin token] . Then in your compose, add these two lines under environment: - ADMIN_TOKEN=${VAULTWARDEN_ADMIN_TOKEN} - DOMAIN=https://vaultwarden.seattlecommunitynetwork.org Restart the container and try logging into https://vaultwarden.seattlecommunitynetwork.org/admin . Once logged in, SMTP and 2FA enabling settings can be configured on the home page.","title":"Section 11: Additional Features"},{"location":"tutorials/proxmox-vaultwarden-deployment/#section-12-data-backup","text":"Enabling backups for Vaultwarden is a simple process. Please review the attached backup bash script, which facilitates the transfer of Vaultwarden data to another virtual machine. Additionally, there is a cleanup bash script designed to retain only the most recent file in the other VM, deleting all others. Feel free to modify the scripts as necessary to suit your specific requirements. Backup script: #!/bin/bash docker-compose down datestamp=$(date +%m-%d-%Y) zip -9 -r /home/scn/backups/${datestamp}.zip /opt/vw-data* scp -i ~/.ssh-comm/id_rsa /home/scn/backups/${datestamp}.zip azureuser@[IP address]:~/backups/ docker-compose up -d Cleanup Script: #!/bin/bash # Define the directory containing backup files backup_dir=~/backups # Go to the backup directory cd \"$backup_dir\" || exit # Find and delete older backup files (excluding the latest day) find . -type f -name '*.zip' ! -mtime -1 -exec rm {} + # Exit exit 0","title":"Section 12: Data Backup"},{"location":"tutorials/proxmox-vaultwarden-deployment/#section-13-using-the-backup","text":"To restore a data backup to the original virtual machine, simply unzip the file and delete the existing contents of /opt/vw-data . Then, transfer the contents of your zip file into this directory. Perform a quick restart of the container, and you will have successfully restored the version of the backup you selected.","title":"Section 13: Using the Backup"},{"location":"tutorials/software/","text":"Our Software Here is a list of the software that we use to deploy, maintain, and plan our network sites. Networking Local Services We use the CoLTE project maintained by the University of Washington ICTD Lab to provide services such as network monitoring, web-based administration, and local web and DNS serving/caching. Evolved Packet Core (EPC) Our EPC is powered by Open5GS , an open-source project for 4G and 5G core networks. Currently all of our networks are 4G networks. Spectrum Access System (SAS) We have a partnership with Google SAS to gain access to CBRS spectrum. Learn more about our SAS setup here . Network Monitoring and Alerting We use LibreNMS and SNMPd to monitor our nodes and provide alerting. Our Baicells-specific Network Manager setup is documented here , and our instructions for configuring a new node can be found here . Field Measurement Network Performance Measurement Tool The LCL Network Performance Measurement Tool is an Android App in development that will measure a variety of network metrics, including but not limited to ping, upload/download speed, signal strength. We will use this tool to easily capture and upload network metrics in the field so that we can provide better estimates of what kind of Internet access that our users can expect to receive. Network Cell Info Lite Network Cell Info Lite is an Android App on the Google Playstore that is free to use (with advertisements) and is capable of taking network metric measurements and recording them to upload. This is an option that we use but are not satisfied with for many reasons, which is why we are developing our own app. Site Planning Google Earth We primarily use the Google Earth Pro desktop application to do a rough line-of-sight evaluation. We perform what is called a \"viewshed analysis\" that allows us to determine what is visible from a specific point on Earth (e.g. a rooftop). Ubiquiti Line of Sight A web-based line of sight tool provided by Ubiquiti that contains helpful altitude data and diagrams. A drawback is that it is specialized to provide data for Ubiquiti devices only. Other resources Facebook ISP Toolbox Line of Sight A web-based line of sight tool provided by Facebook Connectivity that utilizes public LiDAR data. Unfortunately LiDAR data for the Seattle area is not present yet, although there is data for some areas in Tacoma. Facebook ISP Toolbox Market Evaluator A web-based market evaluator provided by Facebook Connectivity that can be used to provide more context about the areas around potential network sites. It offers information about other service providers in the area, average household income, median speeds, and current lowest broadband price available.","title":"Software Overview"},{"location":"tutorials/software/#our-software","text":"Here is a list of the software that we use to deploy, maintain, and plan our network sites.","title":"Our Software"},{"location":"tutorials/software/#networking","text":"","title":"Networking"},{"location":"tutorials/software/#local-services","text":"We use the CoLTE project maintained by the University of Washington ICTD Lab to provide services such as network monitoring, web-based administration, and local web and DNS serving/caching.","title":"Local Services"},{"location":"tutorials/software/#evolved-packet-core-epc","text":"Our EPC is powered by Open5GS , an open-source project for 4G and 5G core networks. Currently all of our networks are 4G networks.","title":"Evolved Packet Core (EPC)"},{"location":"tutorials/software/#spectrum-access-system-sas","text":"We have a partnership with Google SAS to gain access to CBRS spectrum. Learn more about our SAS setup here .","title":"Spectrum Access System (SAS)"},{"location":"tutorials/software/#network-monitoring-and-alerting","text":"We use LibreNMS and SNMPd to monitor our nodes and provide alerting. Our Baicells-specific Network Manager setup is documented here , and our instructions for configuring a new node can be found here .","title":"Network Monitoring and Alerting"},{"location":"tutorials/software/#field-measurement","text":"","title":"Field Measurement"},{"location":"tutorials/software/#network-performance-measurement-tool","text":"The LCL Network Performance Measurement Tool is an Android App in development that will measure a variety of network metrics, including but not limited to ping, upload/download speed, signal strength. We will use this tool to easily capture and upload network metrics in the field so that we can provide better estimates of what kind of Internet access that our users can expect to receive.","title":"Network Performance Measurement Tool"},{"location":"tutorials/software/#network-cell-info-lite","text":"Network Cell Info Lite is an Android App on the Google Playstore that is free to use (with advertisements) and is capable of taking network metric measurements and recording them to upload. This is an option that we use but are not satisfied with for many reasons, which is why we are developing our own app.","title":"Network Cell Info Lite"},{"location":"tutorials/software/#site-planning","text":"","title":"Site Planning"},{"location":"tutorials/software/#google-earth","text":"We primarily use the Google Earth Pro desktop application to do a rough line-of-sight evaluation. We perform what is called a \"viewshed analysis\" that allows us to determine what is visible from a specific point on Earth (e.g. a rooftop).","title":"Google Earth"},{"location":"tutorials/software/#ubiquiti-line-of-sight","text":"A web-based line of sight tool provided by Ubiquiti that contains helpful altitude data and diagrams. A drawback is that it is specialized to provide data for Ubiquiti devices only.","title":"Ubiquiti Line of Sight"},{"location":"tutorials/software/#other-resources","text":"","title":"Other resources"},{"location":"tutorials/software/#facebook-isp-toolbox-line-of-sight","text":"A web-based line of sight tool provided by Facebook Connectivity that utilizes public LiDAR data. Unfortunately LiDAR data for the Seattle area is not present yet, although there is data for some areas in Tacoma.","title":"Facebook ISP Toolbox Line of Sight"},{"location":"tutorials/software/#facebook-isp-toolbox-market-evaluator","text":"A web-based market evaluator provided by Facebook Connectivity that can be used to provide more context about the areas around potential network sites. It offers information about other service providers in the area, average household income, median speeds, and current lowest broadband price available.","title":"Facebook ISP Toolbox Market Evaluator"},{"location":"tutorials/librenms/backup/","text":"Backing Up In the future when we want to back up the rrd folder of a docker install, you just need to copy the compose/librenms/rrd folder. If you want to back up the database, you need to go into the container called librenms_db and do a mysqldump with the user librenms with the database librenms and whatever password you set, probably in the environment variables of the compose file of the deployment This means something like mysqldump librenms -u librenms --password= > librenms.sql","title":"Backing Up"},{"location":"tutorials/librenms/backup/#backing-up","text":"In the future when we want to back up the rrd folder of a docker install, you just need to copy the compose/librenms/rrd folder. If you want to back up the database, you need to go into the container called librenms_db and do a mysqldump with the user librenms with the database librenms and whatever password you set, probably in the environment variables of the compose file of the deployment This means something like mysqldump librenms -u librenms --password= > librenms.sql","title":"Backing Up"},{"location":"tutorials/librenms/deploy/","text":"Deploying I wrote a script to deploy libreNMS with the configuration that SCN uses. The repo is here Software requirements Only tested on debian and ubuntu. Not sure what else it works on but it could work on other linux distros Steps Install docker if it is not installed already Install docker compose if it is not installed already Instal unzip if it is not installed already Check out this repo If you want to restore a previous install, provide a sqldump named librenms.sql flat in this checked out repo. There is a helper script called get_database_from_currently_running_server.sh to get the database off of the non dockerized install (needs ssh access to the server) If you want to restore the graphs too, you can provide a file named rrd.zip flat in the checked out repo which is just the rrd folder ziped up. There is a helper script called get_rrd_zip_from_currently_running_server.sh to get the rrd zip from the non dockerized install (needs ssh access to the server) Run ./deploy.sh builds the librenms image builds the database image with/without the backup Starts the service using docker compose . This creates 2 shared volumes in the compose directory The librenms folder is for the librenms docker images to share configuration data including rrd files The db volume is the database unzips the rrd folder in the rrd directory of the shared librenms volume The UI will run on port 8000","title":"Deploying"},{"location":"tutorials/librenms/deploy/#deploying","text":"I wrote a script to deploy libreNMS with the configuration that SCN uses. The repo is here","title":"Deploying"},{"location":"tutorials/librenms/deploy/#software-requirements","text":"Only tested on debian and ubuntu. Not sure what else it works on but it could work on other linux distros","title":"Software requirements"},{"location":"tutorials/librenms/deploy/#steps","text":"Install docker if it is not installed already Install docker compose if it is not installed already Instal unzip if it is not installed already Check out this repo If you want to restore a previous install, provide a sqldump named librenms.sql flat in this checked out repo. There is a helper script called get_database_from_currently_running_server.sh to get the database off of the non dockerized install (needs ssh access to the server) If you want to restore the graphs too, you can provide a file named rrd.zip flat in the checked out repo which is just the rrd folder ziped up. There is a helper script called get_rrd_zip_from_currently_running_server.sh to get the rrd zip from the non dockerized install (needs ssh access to the server) Run ./deploy.sh builds the librenms image builds the database image with/without the backup Starts the service using docker compose . This creates 2 shared volumes in the compose directory The librenms folder is for the librenms docker images to share configuration data including rrd files The db volume is the database unzips the rrd folder in the rrd directory of the shared librenms volume The UI will run on port 8000","title":"Steps"},{"location":"tutorials/librenms/upgrade/","text":"Upgrading Upgrading can be segmented into 2 parts. The container OSses and the service OS Each container runs an OS - The Maria db container is based on ubuntu, so you can just do sudo apt update and sudo apt upgrade when executing bash on the container - The Redis container for some reason only has an ash executable installed on the container. Also it runs on alpine so it can be updated using apk update and apk upgrade - The libreNMS and the libreNMS dispatcher container is instantiaated on the same container which is on alpine, and uses bash. Update as usual for alpine installs. Service I think that libreNMS vends a script called daily.sh (librenms docs here ) that is added to the cron, but cron is not running on docker containers since each container only runs one process. Even if we manually run daily.sh, there are errors. I think that the docs also give a manually manual way to update, by doing a git clone, but since the librenms files were not pulled using git, we cant use this way. I tried using rsync to overwrite the old files with the new files, but there are some issues. The nuclear option can be used, which is remove the containers, build new updated ones, and start that, but this will include a small outage Go to the compose directory and run sudo docker compose down to stop and remove all the containers. We store data (rrd files and the database) in a docker volume inside the compose directory anyway so we should not need to worry about removing containers removing any data Go to the librenms_image directory, change the version of the image to the latest version here run sudo docker build . -t scn-librenms , which should build the new image go to the db_image directory and update the Dockerfile's version to the latest version here run sudo docker build . -t scn_mariadb_librenms go to the compose directory and update the compose.yml file to use the latest redis release here Then you should be able to start the service with a sudo docker compose -f compose/compose.yml up -d The service should come up as it was before. If it does not, you may have to do a ./lnms migrate","title":"Upgrading"},{"location":"tutorials/librenms/upgrade/#upgrading","text":"Upgrading can be segmented into 2 parts. The container OSses and the service","title":"Upgrading"},{"location":"tutorials/librenms/upgrade/#os","text":"Each container runs an OS - The Maria db container is based on ubuntu, so you can just do sudo apt update and sudo apt upgrade when executing bash on the container - The Redis container for some reason only has an ash executable installed on the container. Also it runs on alpine so it can be updated using apk update and apk upgrade - The libreNMS and the libreNMS dispatcher container is instantiaated on the same container which is on alpine, and uses bash. Update as usual for alpine installs.","title":"OS"},{"location":"tutorials/librenms/upgrade/#service","text":"I think that libreNMS vends a script called daily.sh (librenms docs here ) that is added to the cron, but cron is not running on docker containers since each container only runs one process. Even if we manually run daily.sh, there are errors. I think that the docs also give a manually manual way to update, by doing a git clone, but since the librenms files were not pulled using git, we cant use this way. I tried using rsync to overwrite the old files with the new files, but there are some issues. The nuclear option can be used, which is remove the containers, build new updated ones, and start that, but this will include a small outage Go to the compose directory and run sudo docker compose down to stop and remove all the containers. We store data (rrd files and the database) in a docker volume inside the compose directory anyway so we should not need to worry about removing containers removing any data Go to the librenms_image directory, change the version of the image to the latest version here run sudo docker build . -t scn-librenms , which should build the new image go to the db_image directory and update the Dockerfile's version to the latest version here run sudo docker build . -t scn_mariadb_librenms go to the compose directory and update the compose.yml file to use the latest redis release here Then you should be able to start the service with a sudo docker compose -f compose/compose.yml up -d The service should come up as it was before. If it does not, you may have to do a ./lnms migrate","title":"Service"}]}
\ No newline at end of file
diff --git a/tutorials/epc-setup/index.html b/tutorials/epc-setup/index.html
index d32b109..663de70 100644
--- a/tutorials/epc-setup/index.html
+++ b/tutorials/epc-setup/index.html
@@ -191,10 +191,10 @@
MME
Edit the /etc/open5gs/mme.yaml
file (as root or using sudo
) as follows:
- Under mme:
-> s1ap:
-> server:
-> address:
, set the IP address you will assign to the network interface (likely an ethernet port) on your EPC computer which will be connecting to the eNB. In this tutorial (to match with the Network Configuration section that follows), we will use 192.168.150.1
.
-- Under both mme:
-> gummei:
and mme:
-> tai:
, you will need to change the plmn_id
(mcc
and mnc
values) to match the PLMN you are using for your network.
-- Note that for the purposes of eNB config later, the Tracking Area Code (or TAC) listed under tai:
-> tac:
will need to match the TAC number configured on the eNB (using the default of 1 is fine).
+- Under both mme:
-> gummei:
and mme:
-> tai:
, you will need to change the plmn_id:
(mcc:
and mnc:
values) to match the PLMN you are using for your network. In SCN we use 315
for the MCC and 010
for the MNC, as explained in the "Quick explanation" below.
Quick explanation: "PLMN" refers to the Public Land Mobile Network, in which every network has to have a unique carrier ID defined by the 3-digit "mobile country code (MCC)" and a 2 or 3-digit "mobile network code (MNC)". Alternately, for iPhone compatibility in the US, SCN uses the CBRS "private LTE" PLMN assigned by Apple as described in this doc.
+- Note that for the purposes of eNB config later, the Tracking Area Code (or TAC) listed under
mme:
-> tai:
-> tac:
will need to match the TAC number configured on the eNB (using the default of 1 is fine).
- Optional: Edit
network_name:
(full and short) and mme_name:
as desired. One of these names will show up on smartphones' lock screens as the "carrier" when the phone is attached to the network.
SGWU