At SharpeTronics, accessible from https://www.sharpetronics.com, one of our main priorities is the privacy of our visitors. This Privacy Policy document contains types of information that is collected and recorded by SharpeTronics and how we use it.
\n\n
If you have additional questions or require more information about our Privacy Policy, do not hesitate to contact us.
\n\n
This Privacy Policy applies only to our online activities and is valid for visitors to our website with regards to the information that they shared and/or collect in SharpeTronics. This policy is not applicable to any information collected offline or via channels other than this website.
\n\n
Consent
\n\n
By using our website, you hereby consent to our Privacy Policy and agree to its terms.
\n\n
Information we collect
\n\n
The personal information that you are asked to provide, and the reasons why you are asked to provide it, will be made clear to you at the point we ask you to provide your personal information.
\n
If you contact us directly, we may receive additional information about you such as your name, email address, phone number, the contents of the message and/or attachments you may send us, and any other information you may choose to provide.
\n
When you register for an Account, we may ask for your contact information, including items such as name, company name, address, email address, and telephone number.
\n\n
How we use your information
\n\n
We use the information we collect in various ways, including to:
\n\n
\n
Provide, operate, and maintain our webste
\n
Improve, personalize, and expand our webste
\n
Understand and analyze how you use our webste
\n
Develop new products, services, features, and functionality
\n
Communicate with you, either directly or through one of our partners, including for customer service, to provide you with updates and other information relating to the webste, and for marketing and promotional purposes
\n
Send you emails
\n
Find and prevent fraud
\n
\n\n
Log Files
\n\n
SharpeTronics follows a standard procedure of using log files. These files log visitors when they visit websites. All hosting companies do this and a part of hosting services' analytics. The information collected by log files include internet protocol (IP) addresses, browser type, Internet Service Provider (ISP), date and time stamp, referring/exit pages, and possibly the number of clicks. These are not linked to any information that is personally identifiable. The purpose of the information is for analyzing trends, administering the site, tracking users' movement on the website, and gathering demographic information.
\n\n
Cookies and Web Beacons
\n\n
Like any other website, SharpeTronics uses 'cookies'. These cookies are used to store information including visitors' preferences, and the pages on the website that the visitor accessed or visited. The information is used to optimize the users' experience by customizing our web page content based on visitors' browser type and/or other information.
Some of advertisers on our site may use cookies and web beacons. Our advertising partners are listed below. Each of our advertising partners has their own Privacy Policy for their policies on user data. For easier access, we hyperlinked to their Privacy Policies below.
You may consult this list to find the Privacy Policy for each of the advertising partners of SharpeTronics.
\n\n
Third-party ad servers or ad networks uses technologies like cookies, JavaScript, or Web Beacons that are used in their respective advertisements and links that appear on SharpeTronics, which are sent directly to users' browser. They automatically receive your IP address when this occurs. These technologies are used to measure the effectiveness of their advertising campaigns and/or to personalize the advertising content that you see on websites that you visit.
\n\n
Note that SharpeTronics has no access to or control over these cookies that are used by third-party advertisers.
\n\n
Third Party Privacy Policies
\n\n
SharpeTronics's Privacy Policy does not apply to other advertisers or websites. Thus, we are advising you to consult the respective Privacy Policies of these third-party ad servers for more detailed information. It may include their practices and instructions about how to opt-out of certain options.
\n\n
You can choose to disable cookies through your individual browser options. To know more detailed information about cookie management with specific web browsers, it can be found at the browsers' respective websites.
\n\n
CCPA Privacy Rights (Do Not Sell My Personal Information)
\n\n
Under the CCPA, among other rights, California consumers have the right to:
\n
Request that a business that collects a consumer's personal data disclose the categories and specific pieces of personal data that a business has collected about consumers.
\n
Request that a business delete any personal data about the consumer that a business has collected.
\n
Request that a business that sells a consumer's personal data, not sell the consumer's personal data.
\n
If you make a request, we have one month to respond to you. If you would like to exercise any of these rights, please contact us.
\n\n
GDPR Data Protection Rights
\n\n
We would like to make sure you are fully aware of all of your data protection rights. Every user is entitled to the following:
\n
The right to access – You have the right to request copies of your personal data. We may charge you a small fee for this service.
\n
The right to rectification – You have the right to request that we correct any information you believe is inaccurate. You also have the right to request that we complete the information you believe is incomplete.
\n
The right to erasure – You have the right to request that we erase your personal data, under certain conditions.
\n
The right to restrict processing – You have the right to request that we restrict the processing of your personal data, under certain conditions.
\n
The right to object to processing – You have the right to object to our processing of your personal data, under certain conditions.
\n
The right to data portability – You have the right to request that we transfer the data that we have collected to another organization, or directly to you, under certain conditions.
\n
If you make a request, we have one month to respond to you. If you would like to exercise any of these rights, please contact us.
\n\n
Children's Information
\n\n
Another part of our priority is adding protection for children while using the internet. We encourage parents and guardians to observe, participate in, and/or monitor and guide their online activity.
\n\n
SharpeTronics does not knowingly collect any Personal Identifiable Information from children under the age of 13. If you think that your child provided this kind of information on our website, we strongly encourage you to contact us immediately and we will do our best efforts to promptly remove such information from our records.
","createdAt":"2022-05-24T19:09:12.005Z","updatedAt":"2022-05-27T23:04:12.211Z","publishedAt":"2022-05-24T19:09:15.806Z","locale":"en","layout":"post","image_alt":"An image of a gradient of colours.","slug":"our-privacy-policy","image":{"data":null},"category":{"data":{"id":4,"attributes":{"name":"Legal","createdAt":"2022-05-23T23:43:35.164Z","updatedAt":"2022-05-23T23:43:35.164Z","locale":"en"}}},"tags":{"data":[{"id":20,"attributes":{"tag":"Privacy","createdAt":"2022-05-24T19:04:25.700Z","updatedAt":"2022-05-24T19:04:25.700Z","locale":"en"}}]},"author":{"data":{"id":1,"attributes":{"createdAt":"2022-05-23T23:00:27.098Z","updatedAt":"2022-05-25T06:09:51.505Z","publishedAt":"2022-05-23T23:03:41.945Z","locale":"en","name":"Charles"}}},"seo":[],"localizations":{"data":[]}}},{"id":9,"attributes":{"title":"Our Terms & Conditions","date":"2020-02-03","subheading":"Our rules and regulations.","content":"
Terms and Conditions
\n\n
Welcome to SharpeTronics!
\n\n
These terms and conditions outline the rules and regulations for the use of SharpeTronics's Website, located at https://www.sharpetronics.com.
\n\n
By accessing this website we assume you accept these terms and conditions. Do not continue to use SharpeTronics if you do not agree to take all of the terms and conditions stated on this page.
\n\n
The following terminology applies to these Terms and Conditions, Privacy Statement and Disclaimer Notice and all Agreements: \"Client\", \"You\" and \"Your\" refers to you, the person log on this website and compliant to the Company’s terms and conditions. \"The Company\", \"Ourselves\", \"We\", \"Our\" and \"Us\", refers to our Company. \"Party\", \"Parties\", or \"Us\", refers to both the Client and ourselves. All terms refer to the offer, acceptance and consideration of payment necessary to undertake the process of our assistance to the Client in the most appropriate manner for the express purpose of meeting the Client’s needs in respect of provision of the Company’s stated services, in accordance with and subject to, prevailing law of Netherlands. Any use of the above terminology or other words in the singular, plural, capitalization and/or he/she or they, are taken as interchangeable and therefore as referring to same.
\n\n
Cookies
\n\n
We employ the use of cookies. By accessing SharpeTronics, you agreed to use cookies in agreement with the SharpeTronics's Privacy Policy.
\n\n
Most interactive websites use cookies to let us retrieve the user’s details for each visit. Cookies are used by our website to enable the functionality of certain areas to make it easier for people visiting our website. Some of our affiliate/advertising partners may also use cookies.
\n\n
License
\n\n
Unless otherwise stated, SharpeTronics and/or its licensors own the intellectual property rights for all material on SharpeTronics. All intellectual property rights are reserved. You may access this from SharpeTronics for your own personal use subjected to restrictions set in these terms and conditions.
\n\n
You must not:
\n
\n
Republish material from SharpeTronics
\n
Sell, rent or sub-license material from SharpeTronics
\n
Reproduce, duplicate or copy material from SharpeTronics
\n
Redistribute content from SharpeTronics
\n
\n\n
This Agreement shall begin on the date hereof.
\n\n
Parts of this website offer an opportunity for users to post and exchange opinions and information in certain areas of the website. SharpeTronics does not filter, edit, publish or review Comments prior to their presence on the website. Comments do not reflect the views and opinions of SharpeTronics,its agents and/or affiliates. Comments reflect the views and opinions of the person who post their views and opinions. To the extent permitted by applicable laws, SharpeTronics shall not be liable for the Comments or for any liability, damages or expenses caused and/or suffered as a result of any use of and/or posting of and/or appearance of the Comments on this website.
\n\n
SharpeTronics reserves the right to monitor all Comments and to remove any Comments which can be considered inappropriate, offensive or causes breach of these Terms and Conditions.
\n\n
You warrant and represent that:
\n\n
\n
You are entitled to post the Comments on our website and have all necessary licenses and consents to do so;
\n
The Comments do not invade any intellectual property right, including without limitation copyright, patent or trademark of any third party;
\n
The Comments do not contain any defamatory, libelous, offensive, indecent or otherwise unlawful material which is an invasion of privacy
\n
The Comments will not be used to solicit or promote business or custom or present commercial activities or unlawful activity.
\n
\n\n
You hereby grant SharpeTronics a non-exclusive license to use, reproduce, edit and authorize others to use, reproduce and edit any of your Comments in any and all forms, formats or media.
\n\n
Hyperlinking to our Content
\n\n
The following organizations may link to our Website without prior written approval:
\n\n
\n
Government agencies;
\n
Search engines;
\n
News organizations;
\n
Online directory distributors may link to our Website in the same manner as they hyperlink to the Websites of other listed businesses; and
\n
System wide Accredited Businesses except soliciting non-profit organizations, charity shopping malls, and charity fundraising groups which may not hyperlink to our Web site.
\n
\n\n
These organizations may link to our home page, to publications or to other Website information so long as the link: (a) is not in any way deceptive; (b) does not falsely imply sponsorship, endorsement or approval of the linking party and its products and/or services; and (c) fits within the context of the linking party’s site.
\n\n
We may consider and approve other link requests from the following types of organizations:
\n\n
\n
commonly-known consumer and/or business information sources;
\n
dot.com community sites;
\n
associations or other groups representing charities;
\n
online directory distributors;
\n
internet portals;
\n
accounting, law and consulting firms; and
\n
educational institutions and trade associations.
\n
\n\n
We will approve link requests from these organizations if we decide that: (a) the link would not make us look unfavorably to ourselves or to our accredited businesses; (b) the organization does not have any negative records with us; (c) the benefit to us from the visibility of the hyperlink compensates the absence of SharpeTronics; and (d) the link is in the context of general resource information.
\n\n
These organizations may link to our home page so long as the link: (a) is not in any way deceptive; (b) does not falsely imply sponsorship, endorsement or approval of the linking party and its products or services; and (c) fits within the context of the linking party’s site.
\n\n
If you are one of the organizations listed in paragraph 2 above and are interested in linking to our website, you must inform us by sending an e-mail to SharpeTronics. Please include your name, your organization name, contact information as well as the URL of your site, a list of any URLs from which you intend to link to our Website, and a list of the URLs on our site to which you would like to link. Wait 2-3 weeks for a response.
\n\n
Approved organizations may hyperlink to our Website as follows:
\n\n
\n
By use of our corporate name; or
\n
By use of the uniform resource locator being linked to; or
\n
By use of any other description of our Website being linked to that makes sense within the context and format of content on the linking party’s site.
\n
\n\n
No use of SharpeTronics's logo or other artwork will be allowed for linking absent a trademark license agreement.
\n\n
iFrames
\n\n
Without prior approval and written permission, you may not create frames around our Webpages that alter in any way the visual presentation or appearance of our Website.
\n\n
Content Liability
\n\n
We shall not be hold responsible for any content that appears on your Website. You agree to protect and defend us against all claims that is rising on your Website. No link(s) should appear on any Website that may be interpreted as libelous, obscene or criminal, or which infringes, otherwise violates, or advocates the infringement or other violation of, any third party rights.
\n\n
Your Privacy
\n\n
Please read Privacy Policy
\n\n
Reservation of Rights
\n\n
We reserve the right to request that you remove all links or any particular link to our Website. You approve to immediately remove all links to our Website upon request. We also reserve the right to amen these terms and conditions and it’s linking policy at any time. By continuously linking to our Website, you agree to be bound to and follow these linking terms and conditions.
\n\n
Removal of links from our website
\n\n
If you find any link on our Website that is offensive for any reason, you are free to contact and inform us any moment. We will consider requests to remove links but we are not obligated to or so or to respond to you directly.
\n\n
We do not ensure that the information on this website is correct, we do not warrant its completeness or accuracy; nor do we promise to ensure that the website remains available or that the material on the website is kept up to date.
\n\n
Disclaimer
\n\n
To the maximum extent permitted by applicable law, we exclude all representations, warranties and conditions relating to our website and the use of this website. Nothing in this disclaimer will:
\n\n
\n
limit or exclude our or your liability for death or personal injury;
\n
limit or exclude our or your liability for fraud or fraudulent misrepresentation;
\n
limit any of our or your liabilities in any way that is not permitted under applicable law; or
\n
exclude any of our or your liabilities that may not be excluded under applicable law.
\n
\n\n
The limitations and prohibitions of liability set in this Section and elsewhere in this disclaimer: (a) are subject to the preceding paragraph; and (b) govern all liabilities arising under the disclaimer, including liabilities arising in contract, in tort and for breach of statutory duty.
\n\n
As long as the website and the information and services on the website are provided free of charge, we will not be liable for any loss or damage of any nature.
","createdAt":"2022-05-24T19:10:35.588Z","updatedAt":"2022-05-27T23:06:06.756Z","publishedAt":"2022-05-24T19:11:47.498Z","locale":"en","layout":"post","image_alt":"An image with a gradient of colours.","slug":"our-terms-and-conditions","image":{"data":null},"category":{"data":{"id":4,"attributes":{"name":"Legal","createdAt":"2022-05-23T23:43:35.164Z","updatedAt":"2022-05-23T23:43:35.164Z","locale":"en"}}},"tags":{"data":[{"id":21,"attributes":{"tag":"Terms & Conditions","createdAt":"2022-05-24T19:11:00.524Z","updatedAt":"2022-05-24T19:11:25.416Z","locale":"en"}}]},"author":{"data":{"id":1,"attributes":{"createdAt":"2022-05-23T23:00:27.098Z","updatedAt":"2022-05-25T06:09:51.505Z","publishedAt":"2022-05-23T23:03:41.945Z","locale":"en","name":"Charles"}}},"seo":[],"localizations":{"data":[]}}},{"id":10,"attributes":{"title":"image placeholder test","date":"2022-06-23","subheading":"test for ","content":"test wrfa g asdfa asdf asdf asdf test wrfa g asdfa asdf asdf asdf test wrfa g asdfa asdf asdf asdf test wrfa g asdfa asdf asdf asdf test wrfa g asdfa asdf asdf asdf test wrfa g asdfa asdf asdf asdf test wrfa g asdfa asdf asdf asdf test wrfa g asdfa asdf asdf asdf test wrfa g asdfa asdf asdf asdf test wrfa g asdfa asdf asdf asdf test wrfa g asdfa asdf asdf asdf test wrfa g asdfa asdf asdf asdf test wrfa g asdfa asdf asdf asdf test wrfa g asdf","createdAt":"2022-06-17T04:21:38.398Z","updatedAt":"2022-06-18T01:42:40.587Z","publishedAt":"2022-06-17T04:22:06.492Z","locale":"en","layout":"post","image_alt":"an image with a short desc.","slug":"image-placeholder-test","image":{"data":null},"category":{"data":{"id":4,"attributes":{"name":"Legal","createdAt":"2022-05-23T23:43:35.164Z","updatedAt":"2022-05-23T23:43:35.164Z","locale":"en"}}},"tags":{"data":[{"id":3,"attributes":{"tag":"Jekyll","createdAt":"2022-05-23T22:53:53.119Z","updatedAt":"2022-05-23T22:53:53.119Z","locale":"en"}}]},"author":{"data":{"id":1,"attributes":{"createdAt":"2022-05-23T23:00:27.098Z","updatedAt":"2022-05-25T06:09:51.505Z","publishedAt":"2022-05-23T23:03:41.945Z","locale":"en","name":"Charles"}}},"seo":[],"localizations":{"data":[]}}}],"meta":{"pagination":{"page":1,"pageSize":25,"pageCount":1,"total":9}}}
\ No newline at end of file
+{"data":[{"id":2,"attributes":{"title":"Welcome To An Appalachian Technology Company","date":"2021-01-03","subheading":"Where light travels at high altitudes.","content":"Welcome to SharpeTronics, where light travels at high altitudes. We are a mountain made company in the Appalachians of West Virginia that strives with software and hardware technologies. We are statewide leaders in our area of expertise and invite you to support local business.\n\nOur mission is to enable a modern web architecture that empowers the user and enables accessibility for both beginners and experts. We are a technology business that challenges the status quo of web development and shares technical knowledge for both local and remote stations.\n\nOur commitment to you is quality satisfaction, affordable and lightweight performance for worldwide availability with no strings attached.\n\nWe provide solutions that create resilient, secure and portable online infrastructure built to last the future, while enabling straight-forward seamless integration's for happy developers and editors alike.\n\nWe say NO to the complex insecurities and inaccessible culture created around hefty JavaScript frameworks like Angular, React or heavy database integration's like WordPress or Joomla. These structures create more resistance than needed and end up crafting solutions that are complicated, costly and unfriendly.\n\nOur web stack delivers headless content management, worldwide availability, resiliency, accessibility and scalability, while maintaining simplicity, affordability and lightning performance. We remove unneeded barriers and strengthen connections between the user and developer.\n\nSome keywords that are associated with our software stack include: JAMstack, progressive web apps (PWA), content management systems (CMS), ecommerce, newsletters and static websites. If you are eager to learn, get in touch or join our team, please contact us via email. We are available 5 days a week Monday - Friday.","createdAt":"2022-05-23T22:45:37.912Z","updatedAt":"2022-07-26T21:59:35.122Z","publishedAt":"2022-05-23T22:46:00.086Z","locale":"en","layout":"post","image_alt":"WV Sky Seneca Rocks","slug":"welcome-to-an-appalachian-technology-company","image":{"data":{"id":32,"attributes":{"name":"wv-seneca-rocks-sky.webp","alternativeText":"wv-seneca-rocks-sky.webp","caption":"wv-seneca-rocks-sky.webp","width":840,"height":473,"formats":{"thumbnail":{"name":"thumbnail_wv-seneca-rocks-sky.webp","hash":"thumbnail_wv_seneca_rocks_sky_0d5928baa9","ext":".webp","mime":"image/webp","path":null,"width":245,"height":138,"size":4.86,"url":"/uploads/thumbnail_wv_seneca_rocks_sky_0d5928baa9.webp"}},"hash":"wv_seneca_rocks_sky_0d5928baa9","ext":".webp","mime":"image/webp","size":133.89,"url":"/uploads/wv_seneca_rocks_sky_0d5928baa9.webp","previewUrl":null,"provider":"local","provider_metadata":null,"createdAt":"2022-07-10T00:03:13.505Z","updatedAt":"2022-07-10T00:03:13.505Z"}}},"category":{"data":{"id":2,"attributes":{"name":"Company","createdAt":"2022-05-23T22:36:07.950Z","updatedAt":"2022-05-23T22:36:07.950Z","locale":"en"}}},"author":{"data":{"id":1,"attributes":{"createdAt":"2022-05-23T23:00:27.098Z","updatedAt":"2022-05-25T06:09:51.505Z","publishedAt":"2022-05-23T23:03:41.945Z","locale":"en","name":"Charles"}}},"tags":{"data":[{"id":5,"attributes":{"tag":"Celebration","createdAt":"2022-05-24T18:36:29.844Z","updatedAt":"2022-07-26T21:37:36.503Z","locale":"en"}}]},"localizations":{"data":[]}}},{"id":3,"attributes":{"title":"SharpeTronics Inc. Becomes Official","date":"2021-03-17","subheading":"Winding Roads","content":"We as in SharpeTronics Inc. are proud to announce our business is official with the mountain state of West Virginia on March 17, 2021.\n\nWe also have our very own mailbox provided by the beloved Postmaster.\n\nFurthermore, we now have pillars in place to begin building and creating avenues to bee of service with our community. It has been a long road to this point and we have many more to travel.","createdAt":"2022-05-23T22:49:27.194Z","updatedAt":"2022-07-26T21:59:25.990Z","publishedAt":"2022-05-23T22:55:33.074Z","locale":"en","layout":"post","image_alt":"An image of a pillar holding up a building.","slug":"sharpe-tronics-inc-becomes-official","image":{"data":{"id":28,"attributes":{"name":"pillars-face-art.webp","alternativeText":"pillars-face-art.webp","caption":"pillars-face-art.webp","width":840,"height":560,"formats":{"thumbnail":{"name":"thumbnail_pillars-face-art.webp","hash":"thumbnail_pillars_face_art_973bf824dd","ext":".webp","mime":"image/webp","path":null,"width":234,"height":156,"size":2.66,"url":"/uploads/thumbnail_pillars_face_art_973bf824dd.webp"}},"hash":"pillars_face_art_973bf824dd","ext":".webp","mime":"image/webp","size":33.33,"url":"/uploads/pillars_face_art_973bf824dd.webp","previewUrl":null,"provider":"local","provider_metadata":null,"createdAt":"2022-07-10T00:03:13.006Z","updatedAt":"2022-07-10T00:03:13.006Z"}}},"category":{"data":{"id":2,"attributes":{"name":"Company","createdAt":"2022-05-23T22:36:07.950Z","updatedAt":"2022-05-23T22:36:07.950Z","locale":"en"}}},"author":{"data":{"id":1,"attributes":{"createdAt":"2022-05-23T23:00:27.098Z","updatedAt":"2022-05-25T06:09:51.505Z","publishedAt":"2022-05-23T23:03:41.945Z","locale":"en","name":"Charles"}}},"tags":{"data":[{"id":5,"attributes":{"tag":"Celebration","createdAt":"2022-05-24T18:36:29.844Z","updatedAt":"2022-07-26T21:37:36.503Z","locale":"en"}}]},"localizations":{"data":[]}}},{"id":4,"attributes":{"title":"Big Startups Without Big Tech","date":"2021-06-29","subheading":"Liquid Democracy Empowering Network Users","content":"Welcome to the Blockchain Internet called DFINITY. In my spare time, I have been tinkering and learning **Motoko**. It is a language built for the Internet Computer (IC) that can be used to interface applications, websites and other various software.\n\nMotoko is a programming typed language that compiles into WebAssembly (WA) and is created by **Andreas Rossberg** & the **Dfinity Foundation**\n\n> \"To offer a seamless developer experience, we wanted to create a specialized programming language, called Motoko, that is designed to directly support the programming model of the Internet Computer, making it easier to efficiently build applications and take advantage of some of the more unusual features of this platform.\" -Andreas Rossberg\n\n\nTo begin development of the open decentralized Internet called Dfinity, I needed to install the Software Developer Kit (SDK).\nI ran into a few challenges initially with using the **\"dfx\"** command after installing. I needed to setup my PATH and let **.bashrc** know where the program dfx is installed.\nKnowing how to do this is important and enables more flow with development. Normally, these things are done by default when installing the program, but in unique scenarios, the installed location of that application may not be added to your .bashrc or profile.\n\n\n### Let's begin,\n\n0. Open up Linux terminal\n1. `nano ~/.bashrc`\n2. Scroll down to end of page and type the following code to add \"dfx\" command to your profile or .bashrc.\n3. Rerun the updated .bashrc or .profile script via . ~/.bashrc, then test *\"dfx --version\"* again.\n```\n# DFINITY MOTOKO\nexport PATH=$HOME/bin:$PATH.\n```\n\n\nWhat we have enabled here is the command **\"dfx --version\"** to work without having to type the entire path to execute the dfx program.\nAs an example, without setting up our PATH, we would type the full path of where the program is located in the terminal; this would be **\"/home/username/bin/dfx --version\"** to run the program each time we need it.\n\n*If for some reason your dfx installed in a different location, all you need to do is run \"which dfx\" and it will provide the installed location of that program.*\n\nI hope this quick tutorial aided in your Linux administration talents. I will begin sharing short tutorials like this. It will enable my own glossary of experience and also aid in other curious programmers and Linux users seeking answers. 🖖\n\n#### Sources:\n* Internet Computer Genesis Launch Event - - Premiered May 7, 2021\n* The Dfinity Foundation - \n* Adding a Path to the Linux PATH variable - - May 13th, 2021","createdAt":"2022-05-24T18:42:06.163Z","updatedAt":"2022-07-26T21:59:18.496Z","publishedAt":"2022-05-24T18:42:07.859Z","locale":"en","layout":"post","image_alt":"An image of interconnecting objects","slug":"big-startups-without-big-tech","image":{"data":{"id":29,"attributes":{"name":"decentralized.webp","alternativeText":"decentralized.webp","caption":"decentralized.webp","width":840,"height":630,"formats":{"thumbnail":{"name":"thumbnail_decentralized.webp","hash":"thumbnail_decentralized_385bd5a376","ext":".webp","mime":"image/webp","path":null,"width":208,"height":156,"size":2.21,"url":"/uploads/thumbnail_decentralized_385bd5a376.webp"}},"hash":"decentralized_385bd5a376","ext":".webp","mime":"image/webp","size":41.65,"url":"/uploads/decentralized_385bd5a376.webp","previewUrl":null,"provider":"local","provider_metadata":null,"createdAt":"2022-07-10T00:03:13.067Z","updatedAt":"2022-07-10T00:03:13.067Z"}}},"category":{"data":{"id":3,"attributes":{"name":"How-to","createdAt":"2022-05-23T22:36:20.735Z","updatedAt":"2022-06-25T17:31:07.838Z","locale":"en"}}},"author":{"data":{"id":1,"attributes":{"createdAt":"2022-05-23T23:00:27.098Z","updatedAt":"2022-05-25T06:09:51.505Z","publishedAt":"2022-05-23T23:03:41.945Z","locale":"en","name":"Charles"}}},"tags":{"data":[{"id":6,"attributes":{"tag":"Blockchain","createdAt":"2022-05-24T18:37:55.927Z","updatedAt":"2022-05-24T18:38:40.924Z","locale":"en"}},{"id":7,"attributes":{"tag":"Linux","createdAt":"2022-05-24T18:41:22.140Z","updatedAt":"2022-05-24T18:41:22.140Z","locale":"en"}}]},"localizations":{"data":[]}}},{"id":5,"attributes":{"title":"Linux VPS Hardening","date":"2021-07-26","subheading":"Initializing a secure environment","content":"### Planting Seeds\n\nAdministration of a virtual private Linux server (VPS) without a GUI cpanel is the only way to go. Going through any graphical user interface (GUI) to run critical services for your company is like playing the telephone game. Securing our environment begins at the terminal & from terminal experience we create a deeper learning experience for ourselves and build confidence along the way.\n\nThis article will extrapolate on initializing a Ubuntu Linux VPS for the first time and how we secure our environment through the terminal. No Windows or MacOS pancakes here; only Linux.\n\nWhen beginning a new server or garden, the soil is most important; we create an environment to protect and maximize growth potential. The VPS provider may give you an OS they installed, but I always create a fresh install myself.\n\n### Logging in via SSH\n\n##### Creating RSA Public Key\nBefore you are able to login with SSH, you will most likely have to generate and add a RSA public key.\n\n`ssh-keygen -t rsa -b 4096`\n\n##### Copy / Paste Public Key\nAfter key is generated, we display the public key and add it to VPS account. *Optionally, you may have to add the key with ssh-copy-id user@ip_address.*\n\n`cat ~/.ssh/id_rsa.pub`\n\n```\nssh-rsa AAAEXAMPLECAQDBn0Z88lqrtya0Nd7yYtP/1o90vwVxjvCm/txb+SW85JRRnrI616d2iWwtVCSiUX0s59FfIPxUJl6vPqmxY40DIrX9KZijVpaq/TzWXh2ktCTjT6uBNMBRz/2lxP3w2AZov65dygjW5eQT9K9YB13dr1B4RkQMmUW5xiFbdHM0WzBYM2CMtE+lnmebn7m+B3DcvNkuGdT9Qw1/J24dTuNJSzJXVxzTOTlnVKOVSp1NWzu0USFI6dkrz8YImSgP9hQX970zTnzQ1Ctei4xlR/IiCpVGG6zWeV4oT3sLf4E9mk9eYF/wU0AdA3mQ68yZvv+Bhlc75e9kmUFe+JbctKR4YaKGY6K6K/F1tHrKYkASEkfQQ0KJU/ez/wtSf21A6Z2bM/Gg28f/6owfIMPWnYuB9VOLqkdIHFUot40uMi9CBvkdwH69zAQfz4jFvmu588klE0usBclGAFs78KM6YWaXHYjHdWVRIUrAqdZw1IP0uYS3uSBUPsbBG/Aq0V+22dg8U5DSu5XmwLB5jT+3c4ScqH3kY5tomRLe+2Dx4K+mAHpgtf10xL6Ayx2y0GFZCf+LB1Va3Trk3ChcaKRF5KvyayFQNSY4AfA47B90asdv== user@hostname\n```\n\n##### SSH into VPS\nNext, we login to our VPS and specify -i what key to use. The -i is only needed if you have more than one key. The -v displays verbose or details of what the command is doing in the terminal.\n\n`ssh -i ~/.ssh/id_rsa root@123.123.123.123`\n\nSuccess! Now, we are able to update and upgrade our packages.\n\n### Prepping Linux Environment\n\n##### Update Sources & Packages\n`apt-get update && apt-get upgrade`\n\n##### Disable Ubuntu Sudo Timeout\nIn Ubuntu, sudo has a timeout built in for ease of use. I personally remove this timeout; without knowing you are using sudo will create all kinds of headaches in the future. When you make use of root privileges, we must explicitly type sudo each command.\n\n`sudo visudo`\n\nadd `Defaults env_reset, timestamp_timeout=00`\n\n### Setting Up The Firewall\nAfter we have logged in via SSH for root user account. I recommend installing a powerful firewall called: **ufw**\n\n`apt-get install ufw`\n\n`ufw status`\n\n`ufw allow ssh`\n\nDisplay the status of the firewall and determine if ssh has been allowed. If nomenclature *ssh* doesn't add the ports, we do this manually with ufw allow 22/udp & ufw all 22/tcp. Port 22 is the common port SSH server makes use of; we are able to change this port for extra hardening, but for the sake of this tutorial, we will use port 22.\n`ufw status`\n\n```\nTo Action From\n-- ------ ----\n22/tcp ALLOW Anywhere \n22/udp ALLOW Anywhere\n```\n\nNow, we enable the firewall **after** we allow port 22. The SSH connection should remain open. If it closes, SSH back into your VPS.\n`ufw enable`\n\n##### Check If Port Is Open\nOnce telnet is ran, ssh information should populate\n`telnet 123.123.123.123 22`\n\n```\nTrying 123.123.123.123...\nConnected to 123.123.123.123.\nEscape character is '^]'.\nSSH-X.0-OpenSSH_X.2p1 Ubuntu-Xubuntu0.2\n\nInvalid SSH identification string.\nConnection closed by foreign host.\n```\n\n### Creating New Users & Permissions\n\nTo further expand on the garden, we must define a secure space for each plant or service we are running. To manage each service, like dns, mail, gitea, etc... we create a new user for each of these environments. This separation is important for operational security (OPSEC).\n\n`adduser username` *Note: If we want to use Dockerfile or auto script without prompts, we make use of the **useradd** command.*\n\n```\nAdding user `username' ...\nAdding new group `username' (1003) ...\nAdding new user `username' (1002) with group `username' ...\nCreating home directory `/home/username' ...\nCopying files from `/etc/skel' ...\nNew password: \n```\n\nNext, if the user should have sudo permission, we do the following.\n\n`usermod -a -G sudo username`\n\n##### Prove User was Created\n\n`cat /etc/passwd`\n\n```\n...\nusername:x:1001:1002:User Name,,,:/home/username:/bin/bash\n...\n```\n\n##### Logging In with New Username\n\n`su username`\n\n##### Update SSH Config\n`sudo nano /etc/ssh/sshd_config`\n\nAdd sudo to the **AllowGroups** like so:\n\n`AllowGroups wheel root sudo`\n\nNext, we disable root login since we will only have root privileges when using sudo.\n\n`PermitRootLogin no`\n\n##### SSH Directory Creation For New Username\nCreating new user access to SSH login.\nWhen you connect to new username@ip, the vps user needs the public key for verification of authorized user. Authorized users with correct **private key** will be able to login to vps via ssh protocol.\n\n`mkdir ~/.ssh`\n\n`nano ~/.ssh/authorized_keys`\n\nPaste your public key we created earlier into the authorized_keys file.\n\n##### Update file & folder permissions\n\n`chmod 700 ~/.ssh`\n\n`chmod 600 ~/.ssh/authorized_keys`\n\n##### Restart SSH service\n\n`sudo service ssh restart`\n\n`exit`\n\nIn conclusion, we are now able to login via SSH with new user and have also disabled root user logins.\nThis process will have to be done for each user that is created.\n\n### Backups with Rsync Superpowers!\n\nAfter all our hard work and focus, we should backup our VPS and create scheduled routines. Depending on your use case, I would recommend at least weekly backups.\n\nThe following command is quite complex, but, essentially we are discarding folders we don't need, backing up the entire VPS to our local machine and preserving all permissions and file integrity from the VPS.\n\n- rsync - A fast, versatile, local and remote file-copying utility\n- -aAXv - The files are transferred in \"archive\" mode, which ensures that symbolic links, devices, permissions, ownerships, modification times, ACLs, and extended attributes are preserved.\n- / - Source directory\n- --exclude - Excludes the given directories from backup.\n\n```\nsudo rsync -aAXv --rsh=\"ssh -i /home/user/.ssh/id_rsa\" --recursive --progress --exclude={\"/dev/*\",\"/proc/*\",\"/sys/*\",\"/tmp/*\",\"/run/*\",\"/mnt/*\",\"/media/*\",\"/lost+found\",\"/backups/*\"} user@123.123.123.123:/ /home/user/VPS/Backups/\n```\n\n#### Sources:\n* Full System Backup Using Rsync - \n","createdAt":"2022-05-24T18:46:21.906Z","updatedAt":"2022-07-26T23:46:50.374Z","publishedAt":"2022-05-24T18:46:31.369Z","locale":"en","layout":"post","image_alt":"an image of a hooded individual typing on a keyboard","slug":"linux-vps-hardening","image":{"data":{"id":30,"attributes":{"name":"linux-admin.webp","alternativeText":"linux-admin.webp","caption":"linux-admin.webp","width":840,"height":560,"formats":{"thumbnail":{"name":"thumbnail_linux-admin.webp","hash":"thumbnail_linux_admin_0def8999f2","ext":".webp","mime":"image/webp","path":null,"width":234,"height":156,"size":5.06,"url":"/uploads/thumbnail_linux_admin_0def8999f2.webp"}},"hash":"linux_admin_0def8999f2","ext":".webp","mime":"image/webp","size":56.06,"url":"/uploads/linux_admin_0def8999f2.webp","previewUrl":null,"provider":"local","provider_metadata":null,"createdAt":"2022-07-10T00:03:13.075Z","updatedAt":"2022-07-10T00:03:13.075Z"}}},"category":{"data":{"id":3,"attributes":{"name":"How-to","createdAt":"2022-05-23T22:36:20.735Z","updatedAt":"2022-06-25T17:31:07.838Z","locale":"en"}}},"author":{"data":{"id":1,"attributes":{"createdAt":"2022-05-23T23:00:27.098Z","updatedAt":"2022-05-25T06:09:51.505Z","publishedAt":"2022-05-23T23:03:41.945Z","locale":"en","name":"Charles"}}},"tags":{"data":[{"id":7,"attributes":{"tag":"Linux","createdAt":"2022-05-24T18:41:22.140Z","updatedAt":"2022-05-24T18:41:22.140Z","locale":"en"}},{"id":20,"attributes":{"tag":"Privacy","createdAt":"2022-05-24T19:04:25.700Z","updatedAt":"2022-06-28T05:02:32.666Z","locale":"en"}},{"id":30,"attributes":{"tag":"Security","createdAt":"2022-07-26T23:46:28.774Z","updatedAt":"2022-07-26T23:46:28.774Z","locale":"en"}}]},"localizations":{"data":[]}}},{"id":6,"attributes":{"title":"Configure a Static Qt5 from Source on Ubuntu 18.04 with X11 Support","date":"2021-11-11","subheading":"Compiling & Configuring Qt from Source","content":"### Configure, Build, Install & Setup Qt 5.15.2 Source on Ubuntu 18.04 with X11 Support\n\nThis tutorial will teach you how to compile from source via CLI (command-line interface) and enable customization for building Qt5 apps on different operating systems andor hardware architectures like RPI400. \n\nWhen compiling Qt5 yourself, you are empowered with a configuration that is constant throughout the Linux Universe. This process is also very similar with compiling Qt apps on your (AArch64) ARM64 devices like RPi 400, Rock64 & PineBook64.\n\n*Note: This tutorial doesn't include json Qtwebengine*\n\n### What is Qt?\n\"Qt is a cross-platform application development framework for desktop, embedded and mobile.\" [Qt Wiki]\n\n### What is a Static Qt? \nIn general, a static Qt option includes libraries locally. This aids in having an application run on different versions of Linux distros. When the application is compiled, we check the app with *ldd yourapp* to list what the binary is dependent on to run. Essentially, the Qt libraries are included in the binary. Decovar.dev has a great explanation on advantages and disadvantages of building a static Qt. [At last, let's build Qt statically]\n\n### Let's Begin!\n\n#### Remove & purge all Qt packages\n```\nsudo apt -y remove qt5* libqt5* qtcreator && sudo autoremove\n```\n\n#### Download Qt 5.15.2 Source to qt5-sources folder\n```\nmkdir qt5-sources && cd qt5-sources && mkdir build-shadow\n\nwget https://download.qt.io/official_releases/qt/5.15/5.15.2/single/qt-everywhere-src-5.15.2.tar.xz\n```\n\n##### Verify MD5 hash\n```\nmd5sum qt-everywhere-src-5.15.2.tar.xz\n```\n```\ne1447db4f06c841d8947f0a6ce83a7b5 qt-everywhere-src-5.15.2.tar.xz\n```\n\n##### Un-tar Qt5 archive\n```\ntar xf qt-everywhere-src-5.15.2.tar.xz\n```\n\n##### Move into build-shadow directory to configure your Qt 5.15.2\n```\ncd build-shadow\n```\n\n#### Install Qt5 Minimal Dependencies\n```\nsudo apt update\n\nsudo apt install build-essential libfontconfig1-dev libdbus-1-dev libfreetype6-dev libicu-dev libinput-dev libxkbcommon-dev libsqlite3-dev libssl-dev libpng-dev libjpeg-dev libglib2.0-dev\n```\n\n##### (Optional) Install VC4 Drivers for RPi 4 type devices (i.e. cortex-a53 & cortex-a72)\n```\nsudo apt install libgles2-mesa-dev libgbm-dev libdrm-dev\n```\n#### (Optional) Install X11 Support Dependencies\n```\nsudo apt install libx11-dev libxcb1-dev libxext-dev libxi-dev libxcomposite-dev libxcursor-dev libxtst-dev libxrandr-dev libfontconfig1-dev libfreetype6-dev libx11-xcb-dev libxext-dev libxfixes-dev libxi-dev libxrender-dev libxcb1-dev libxcb-glx0-dev libxcb-keysyms1-dev libxcb-image0-dev libxcb-shm0-dev libxcb-icccm4-dev libxcb-sync-dev libxcb-xfixes0-dev libxcb-shape0-dev libxcb-randr0-dev libxcb-render-util0-dev libxcb-util0-dev libxcb-xinerama0-dev libxcb-xkb-dev libxkbcommon-dev libxkbcommon-x11-dev\n```\n\n#### Configure Qt 5.15.2\n```\n../qt-everywhere-src-5.15.2/configure -static -release -openssl-linked -opensource -confirm-license -qt-zlib -qt-libpng -bundled-xcb-xinput \\\n-skip qtlocation -skip qtmacextras -skip qtpurchasing -skip qtscript -skip qtsensors -skip qtserialbus -skip qtserialport -skip qtspeech -skip qtdatavis3d -skip qtdoc -skip qtcharts -skip qtdeclarative -skip qt3d -skip qtwebengine -skip qtandroidextras -skip qtwebview -skip qtgamepad -skip qtquickcontrols -skip qtquickcontrols2 -skip qtremoteobjects -skip qtwebview -skip qtwebchannel -skip qtwebglplugin \\\n-nomake examples -nomake tests -feature-fontconfig -no-feature-getentropy -v\n```\n\n*If you would like to see a full list of options, we can do **../qt-everywhere-src-5.15.2/configure -h**\n\n##### Make the configuration *(-j 4 is number of cpus you want to use)*\n```\nmake -j 4\n```\n\n##### Install Qt5 into: *(default) /usr/local/*\n```\nsudo make install\n```\n*Note: Check and make sure ./configure has required deps; if you installed the deps, but still receiving errors, remove config.cache and ./configure again.*\n\n**Tip:** *If you want to view your configuration summary, you may do so via nano config.summary from build-shadow directory*\n\n#### Update profile to know where Qt5.15.2 bins are\n```\nnano ~/.bashrc\n```\n\n##### Add this at the bottom of your .bashrc file.\n```\n# set PATH for Qt 5.15.2\nexport PATH=\"/usr/local/Qt-5.15.2/bin:$PATH\"\n```\n\n##### Reload your ~/.bashrc file & create new shell window.\n```\nsource ~/.bashrc\nCTRL+SHIFT+T\nALT+1\nexit\n```\n##### Verify Qt 5.15.2 has been installed\n```\nqmake --version\n```\n\n```\nQMake version 3.1\nUsing Qt version 5.15.2 in /usr/local/Qt-5.15.2/lib\n```\n#### Build your happy Qt5 app\n\n```\n./build.sh\n```\n#### Support & Questions\n[sharpetronics.github](https://github.com/SharpeTronics/sharpetronics.github.io/issues)\n\n\n\n#### References\n[tal.org/rpi](https://www.tal.org/tutorials/building-qt-515-raspberry-pi)\n\n[doc.qt.io/qtmodules](https://doc.qt.io/qt-5/qtmodules.html)\n\n[wiki.qt.io/about](https://wiki.qt.io/About_Qt)\n\n[why-build-qt-statically](https://decovar.dev/blog/2018/02/17/build-qt-statically/#why-build-qt-statically)","createdAt":"2022-05-24T18:58:56.643Z","updatedAt":"2022-07-26T21:58:26.141Z","publishedAt":"2022-05-24T18:58:58.215Z","locale":"en","layout":"post","image_alt":"An image of a gold computer circuit.","slug":"configure-a-static-qt5-from-source-on-ubuntu-18-04-with-x11-support","image":{"data":{"id":33,"attributes":{"name":"quantum-qt5.webp","alternativeText":"quantum-qt5.webp","caption":"quantum-qt5.webp","width":840,"height":560,"formats":{"thumbnail":{"name":"thumbnail_quantum-qt5.webp","hash":"thumbnail_quantum_qt5_95dcd080f1","ext":".webp","mime":"image/webp","path":null,"width":234,"height":156,"size":15.03,"url":"/uploads/thumbnail_quantum_qt5_95dcd080f1.webp"}},"hash":"quantum_qt5_95dcd080f1","ext":".webp","mime":"image/webp","size":218.16,"url":"/uploads/quantum_qt5_95dcd080f1.webp","previewUrl":null,"provider":"local","provider_metadata":null,"createdAt":"2022-07-10T00:03:13.508Z","updatedAt":"2022-07-10T00:03:13.508Z"}}},"category":{"data":{"id":3,"attributes":{"name":"How-to","createdAt":"2022-05-23T22:36:20.735Z","updatedAt":"2022-06-25T17:31:07.838Z","locale":"en"}}},"author":{"data":{"id":1,"attributes":{"createdAt":"2022-05-23T23:00:27.098Z","updatedAt":"2022-05-25T06:09:51.505Z","publishedAt":"2022-05-23T23:03:41.945Z","locale":"en","name":"Charles"}}},"tags":{"data":[{"id":7,"attributes":{"tag":"Linux","createdAt":"2022-05-24T18:41:22.140Z","updatedAt":"2022-05-24T18:41:22.140Z","locale":"en"}},{"id":8,"attributes":{"tag":"VPS","createdAt":"2022-05-24T18:43:17.764Z","updatedAt":"2022-05-24T18:43:17.764Z","locale":"en"}},{"id":12,"attributes":{"tag":"ARM64","createdAt":"2022-05-24T18:48:59.059Z","updatedAt":"2022-05-24T18:49:33.499Z","locale":"en"}},{"id":14,"attributes":{"tag":"AArch64","createdAt":"2022-05-24T18:51:19.600Z","updatedAt":"2022-05-24T18:52:04.452Z","locale":"en"}},{"id":15,"attributes":{"tag":"X11","createdAt":"2022-05-24T18:52:58.701Z","updatedAt":"2022-05-24T18:52:58.701Z","locale":"en"}}]},"localizations":{"data":[]}}},{"id":7,"attributes":{"title":"Setup a Secure NGINX HTTPS Web Server with Let's Encrypt + Strapi 4.0 Headless CMS","date":"2021-12-27","subheading":"Static Websites with CMS","content":"## General\nFor this tutorial, we will launch a secure SSL NGINX web server for your website domain example.org and enable an API to be consumed from the subdomain i.e. api.example.org with Strapi 4.0. \n\n*Tip:* For each reference, I add the **[reference name]** in brackets at the end of the \"transmission.\" **[AWK example]**\n \n## Requirements: \n- a Ubuntu Linux 20.04 VPS with SSH access\n- CLI knowledge\n- a registered web domain i.e. example.org\n- Basic knowledge of DNS and managing a VPS with SSH \n\n## Dependencies & Packages\n- NodeJS v12 or v14 (v14 is recommended for Strapi 4.0)\n- Npm v6+ & Yarn (Yarn is optional)\n- Certbot with Let's Encrypt\n- Nano editor\n\n## Prepare Operating System \nLet's Begin! We begin by installing nginx, certbot and verifying versions Strapi needs. Keep in mind, if you are reading this from the future, the versions will change.\n\n### Update System\n\n```sudo apt update```\n\n### Install Nginx Certbot Packages\n\n```sudo apt install certbot python3-certbot-nginx```\n\n### Install NGINX & verify version \n\n```sudo apt install nginx```\n\n```node -v && nginx -v```\n\n**Tip:** Strapi recommends nodejs v14, but v12 works.\n\n### Install Yarn (Corepack) \n```npm i -g corepack``` **[Install Yarn]**\n\n## Configure NGINX \nNext, we will configure your newly installed Nginx server. By default the configurations are located at: /etc/nginx/ & /etc/nginx/sites-available/. To keep things tidy and organized, we create a new api.example.org conf for each domain we are publicly facing to WWW. \n\n### Make Directory & Copy Default HTML page \n\n```sudo mkdir -p /var/www/api.example.org/html/```\n\n```sudo cp -R /var/www/html/index.nginx-debian.html /var/www/api.example.org/html/index.html```\n\n### Duplicate Default Config \n\n```sudo cp /etc/nginx/sites-available/default /etc/nginx/sites-available/api.example.org```\n\n### Update NGINX api.example.org Config File\n\nThe **Proxy Config** is important and allows the Strapi 4.0 server to run with nginx. In general, the rest allows SSL and redirects all HTTP traffic to HTTPS, plus denies automated user-agents like wget.\n```\nserver {\n # Redirect all HTTP requests to HTTPS\n listen 80;\n server_name _;\n return 301 https://$host$request_uri;\n\n # Deny Automated User-Agents\n if ($http_user_agent ~* (netcrawl|npbot|malicious|LWP::Simple|BBBike|wget)) {\n return 403;\n }\n}\n\nserver {\n # Listen HTTPS\n listen 443 ssl http2; # managed by Certbot\n listen [::]:443 ssl http2;\n server_name api.example.org www.api.example.org;\n\n # sites document root\n root /var/www/api.example.org/html;\n index index.html index.htm;\n\n # SSL Config\n ssl_certificate /etc/letsencrypt/live/api.example.org/fullchain.pem; # managed by Certbot\n ssl_certificate_key /etc/letsencrypt/live/api.example.org/privkey.pem; # managed by Certbot\n include /etc/letsencrypt/options-ssl-nginx.conf; # managed by Certbot\n ssl_dhparam /etc/letsencrypt/ssl-dhparams.pem; # managed by Certbot\n\n # Proxy Config\n location / {\n proxy_pass http://strapi;\n proxy_http_version 1.1;\n proxy_set_header X-Forwarded-Host $host;\n proxy_set_header X-Forwarded-Server $host;\n proxy_set_header X-Real-IP $remote_addr;\n proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;\n proxy_set_header X-Forwarded-Proto $scheme;\n proxy_set_header Host $http_host;\n proxy_set_header Upgrade $http_upgrade;\n proxy_set_header Connection \"Upgrade\";\n proxy_pass_request_headers on;\n }\n\n}\n\n```\n``` CTRL+X, then Y for Yes to save```\n\n### Symbolic Link to sites-enabled\nThis creates a 'mirror' like reference to the sites-available folder. \n\n```sudo ln -s /etc/nginx/sites-available/api.exampleorg /etc/nginx/sites-enabled/```\n\n#### Verify Symbolic Link \n```ls /etc/nginx/sites-enabled/```\n\n## DNS Configuration\nWe now point our domain to the server we are hosting our Strapi on. i.e. 123.123.1.1\n\n### Update DNS Settings\nDepending on your DNS provider or maybe you have your own Domain Name Server, we point our DNS settings for example.org to 123.123.1.1 as type A. I personally recommend Cloudflare.\n\n## Create SSL Certs\nWe run the automated tool Certbot and create all the needed files and update our *api.example.org* configuration file. \n\n### Run Certbot\n```sudo certbot --nginx```\n\n```Choose api.example.org for the site to create certs. for.```\n\n```Choose option 1 to disable auto redirect HTTP traffic to HTTPS since we already redirected the traffic manually.```\n\n**Note** sudo certbot renew --dry-run will test for automatic renewal for your certs. [Certbot Insturctions]\n\n### Verify api.example.org Updated with Correct Domain\n\n```sudo nano /etc/nginx/sites-enabled/api.example.org```\n\n### Test Config & Restart Nginx\n\n```sudo nginx -t```\n\n```sudo systemctl restart nginx```\n\n## Firewall Configuration\nAllow public to connect via HTTPS, we need to open up ports 80 & 443 (HTTP & HTTPS).\n\n### Allow UFW Ports for Public Traffic\n```sudo ufw allow HTTPS```\n\n```sudo ufw allow HTTP```\n\n### Verify Status & Reload UFW\n```sudo ufw status```\n\n```sudo ufw reload```\n\n**Tip** sudo ufw allow 'Nginx Full' opens both port 80 & 443 (For SSL / TLS encryption).\n\n## Getting Started with Strapi\nNow, we must install Strapi 4.0 on the server and launch the Strapi server.\n\n### Strapi Default Installation\nGoto desired place to install Strapi project i.e. ~/development/my-strapi-project, then,\n\n```yarn create strapi-app my-project```\n\n**Note:** The default Strapi installation uses SQLite as the database. You are able to use other databases like PostgreSQL. See **[Strapi Installation]** for more details.\n\n### Launch Strapi Development Server\n\n```yarn develop```\n\n### Launch Strapi from Domain URL \n\n```Goto: api.example.com via web browser of your choice.```\n\n```Follow the instructions and continue creating a new Strapi administrator.```\n\n#### References:\n[Nginx Strapi Configuration](https://docs.strapi.io/developer-docs/latest/setup-deployment-guides/deployment/optional-software/nginx-proxy.html#nginx-upstream)\n\n[Strapi Installation](https://docs.strapi.io/developer-docs/latest/setup-deployment-guides/installation/cli.html#creating-a-strapi-project)\n\n[Nginx Server Blocks](https://www.digitalocean.com/community/tutorials/how-to-set-up-nginx-server-blocks-virtual-hosts-on-ubuntu-16-04)\n\n[Install Yarn](https://yarnpkg.com/getting-started/install)\n\n[Certbot Insturctions](https://certbot.eff.org/instructions?ws=nginx&os=ubuntufocal)\n\n#### Donations Are Welcome\n[Cash App](https://cash.app/$sharpeee)","createdAt":"2022-05-24T19:03:47.148Z","updatedAt":"2022-07-26T23:45:25.185Z","publishedAt":"2022-05-24T19:03:48.499Z","locale":"en","layout":"post","image_alt":"An image of two pair of holiday cheer feet.","slug":"setup-a-secure-nginx-https-web-server-with-let-s-encrypt-strapi-4-0-headless-cms","image":{"data":{"id":31,"attributes":{"name":"santa-rudolph-unsplash.webp","alternativeText":"santa-rudolph-unsplash.webp","caption":"santa-rudolph-unsplash.webp","width":840,"height":560,"formats":{"thumbnail":{"name":"thumbnail_santa-rudolph-unsplash.webp","hash":"thumbnail_santa_rudolph_unsplash_0ae8e3d5a7","ext":".webp","mime":"image/webp","path":null,"width":234,"height":156,"size":7.82,"url":"/uploads/thumbnail_santa_rudolph_unsplash_0ae8e3d5a7.webp"}},"hash":"santa_rudolph_unsplash_0ae8e3d5a7","ext":".webp","mime":"image/webp","size":120.3,"url":"/uploads/santa_rudolph_unsplash_0ae8e3d5a7.webp","previewUrl":null,"provider":"local","provider_metadata":null,"createdAt":"2022-07-10T00:03:13.317Z","updatedAt":"2022-07-10T00:03:13.317Z"}}},"category":{"data":{"id":3,"attributes":{"name":"How-to","createdAt":"2022-05-23T22:36:20.735Z","updatedAt":"2022-06-25T17:31:07.838Z","locale":"en"}}},"author":{"data":{"id":1,"attributes":{"createdAt":"2022-05-23T23:00:27.098Z","updatedAt":"2022-05-25T06:09:51.505Z","publishedAt":"2022-05-23T23:03:41.945Z","locale":"en","name":"Charles"}}},"tags":{"data":[{"id":2,"attributes":{"tag":"Nginx","createdAt":"2022-05-23T22:52:52.842Z","updatedAt":"2022-05-23T22:53:02.776Z","locale":"en"}},{"id":4,"attributes":{"tag":"Strapi","createdAt":"2022-05-23T22:54:08.940Z","updatedAt":"2022-05-23T22:54:08.940Z","locale":"en"}},{"id":18,"attributes":{"tag":"Headless CMS","createdAt":"2022-05-24T19:02:57.051Z","updatedAt":"2022-05-24T19:02:57.051Z","locale":"en"}},{"id":19,"attributes":{"tag":"JAMstack","createdAt":"2022-05-24T19:03:16.627Z","updatedAt":"2022-06-28T05:02:47.969Z","locale":"en"}}]},"localizations":{"data":[]}}},{"id":8,"attributes":{"title":"Our Privacy Policy","date":"2020-02-03","subheading":"Your data is always yours.","content":"
Privacy Policy for SharpeTronics.com, Inc.
\n\n
At SharpeTronics, accessible from https://www.sharpetronics.com, one of our main priorities is the privacy of our visitors. This Privacy Policy document contains types of information that is collected and recorded by SharpeTronics and how we use it.
\n\n
If you have additional questions or require more information about our Privacy Policy, do not hesitate to contact us.
\n\n
This Privacy Policy applies only to our online activities and is valid for visitors to our website with regards to the information that they shared and/or collect in SharpeTronics. This policy is not applicable to any information collected offline or via channels other than this website.
\n\n
Consent
\n\n
By using our website, you hereby consent to our Privacy Policy and agree to its terms.
\n\n
Information we collect
\n\n
The personal information that you are asked to provide, and the reasons why you are asked to provide it, will be made clear to you at the point we ask you to provide your personal information.
\n
If you contact us directly, we may receive additional information about you such as your name, email address, phone number, the contents of the message and/or attachments you may send us, and any other information you may choose to provide.
\n
When you register for an Account, we may ask for your contact information, including items such as name, company name, address, email address, and telephone number.
\n\n
How we use your information
\n\n
We use the information we collect in various ways, including to:
\n\n
\n
Provide, operate, and maintain our webste
\n
Improve, personalize, and expand our webste
\n
Understand and analyze how you use our webste
\n
Develop new products, services, features, and functionality
\n
Communicate with you, either directly or through one of our partners, including for customer service, to provide you with updates and other information relating to the webste, and for marketing and promotional purposes
\n
Send you emails
\n
Find and prevent fraud
\n
\n\n
Log Files
\n\n
SharpeTronics follows a standard procedure of using log files. These files log visitors when they visit websites. All hosting companies do this and a part of hosting services' analytics. The information collected by log files include internet protocol (IP) addresses, browser type, Internet Service Provider (ISP), date and time stamp, referring/exit pages, and possibly the number of clicks. These are not linked to any information that is personally identifiable. The purpose of the information is for analyzing trends, administering the site, tracking users' movement on the website, and gathering demographic information.
\n\n
Cookies and Web Beacons
\n\n
Like any other website, SharpeTronics uses 'cookies'. These cookies are used to store information including visitors' preferences, and the pages on the website that the visitor accessed or visited. The information is used to optimize the users' experience by customizing our web page content based on visitors' browser type and/or other information.
Some of advertisers on our site may use cookies and web beacons. Our advertising partners are listed below. Each of our advertising partners has their own Privacy Policy for their policies on user data. For easier access, we hyperlinked to their Privacy Policies below.
You may consult this list to find the Privacy Policy for each of the advertising partners of SharpeTronics.
\n\n
Third-party ad servers or ad networks uses technologies like cookies, JavaScript, or Web Beacons that are used in their respective advertisements and links that appear on SharpeTronics, which are sent directly to users' browser. They automatically receive your IP address when this occurs. These technologies are used to measure the effectiveness of their advertising campaigns and/or to personalize the advertising content that you see on websites that you visit.
\n\n
Note that SharpeTronics has no access to or control over these cookies that are used by third-party advertisers.
\n\n
Third Party Privacy Policies
\n\n
SharpeTronics's Privacy Policy does not apply to other advertisers or websites. Thus, we are advising you to consult the respective Privacy Policies of these third-party ad servers for more detailed information. It may include their practices and instructions about how to opt-out of certain options.
\n\n
You can choose to disable cookies through your individual browser options. To know more detailed information about cookie management with specific web browsers, it can be found at the browsers' respective websites.
\n\n
CCPA Privacy Rights (Do Not Sell My Personal Information)
\n\n
Under the CCPA, among other rights, California consumers have the right to:
\n
Request that a business that collects a consumer's personal data disclose the categories and specific pieces of personal data that a business has collected about consumers.
\n
Request that a business delete any personal data about the consumer that a business has collected.
\n
Request that a business that sells a consumer's personal data, not sell the consumer's personal data.
\n
If you make a request, we have one month to respond to you. If you would like to exercise any of these rights, please contact us.
\n\n
GDPR Data Protection Rights
\n\n
We would like to make sure you are fully aware of all of your data protection rights. Every user is entitled to the following:
\n
The right to access – You have the right to request copies of your personal data. We may charge you a small fee for this service.
\n
The right to rectification – You have the right to request that we correct any information you believe is inaccurate. You also have the right to request that we complete the information you believe is incomplete.
\n
The right to erasure – You have the right to request that we erase your personal data, under certain conditions.
\n
The right to restrict processing – You have the right to request that we restrict the processing of your personal data, under certain conditions.
\n
The right to object to processing – You have the right to object to our processing of your personal data, under certain conditions.
\n
The right to data portability – You have the right to request that we transfer the data that we have collected to another organization, or directly to you, under certain conditions.
\n
If you make a request, we have one month to respond to you. If you would like to exercise any of these rights, please contact us.
\n\n
Children's Information
\n\n
Another part of our priority is adding protection for children while using the internet. We encourage parents and guardians to observe, participate in, and/or monitor and guide their online activity.
\n\n
SharpeTronics does not knowingly collect any Personal Identifiable Information from children under the age of 13. If you think that your child provided this kind of information on our website, we strongly encourage you to contact us immediately and we will do our best efforts to promptly remove such information from our records.
","createdAt":"2022-05-24T19:09:12.005Z","updatedAt":"2022-07-26T23:50:29.914Z","publishedAt":"2022-05-24T19:09:15.806Z","locale":"en","layout":"post","image_alt":"An image of a gradient of colours.","slug":"our-privacy-policy","image":{"data":{"id":40,"attributes":{"name":"terms.webp","alternativeText":"terms.webp","caption":"terms.webp","width":461,"height":215,"formats":{"thumbnail":{"name":"thumbnail_terms.webp","hash":"thumbnail_terms_48bec2a697","ext":".webp","mime":"image/webp","path":null,"width":245,"height":114,"size":0.38,"url":"/uploads/thumbnail_terms_48bec2a697.webp"}},"hash":"terms_48bec2a697","ext":".webp","mime":"image/webp","size":7.68,"url":"/uploads/terms_48bec2a697.webp","previewUrl":null,"provider":"local","provider_metadata":null,"createdAt":"2022-07-26T23:49:53.892Z","updatedAt":"2022-07-26T23:49:53.892Z"}}},"category":{"data":{"id":4,"attributes":{"name":"Legal","createdAt":"2022-05-23T23:43:35.164Z","updatedAt":"2022-05-23T23:43:35.164Z","locale":"en"}}},"author":{"data":{"id":1,"attributes":{"createdAt":"2022-05-23T23:00:27.098Z","updatedAt":"2022-05-25T06:09:51.505Z","publishedAt":"2022-05-23T23:03:41.945Z","locale":"en","name":"Charles"}}},"tags":{"data":[{"id":5,"attributes":{"tag":"Celebration","createdAt":"2022-05-24T18:36:29.844Z","updatedAt":"2022-07-26T21:37:36.503Z","locale":"en"}},{"id":20,"attributes":{"tag":"Privacy","createdAt":"2022-05-24T19:04:25.700Z","updatedAt":"2022-06-28T05:02:32.666Z","locale":"en"}},{"id":21,"attributes":{"tag":"Terms & Conditions","createdAt":"2022-05-24T19:11:00.524Z","updatedAt":"2022-06-28T05:02:23.148Z","locale":"en"}}]},"localizations":{"data":[]}}},{"id":9,"attributes":{"title":"Our Terms & Conditions","date":"2020-02-03","subheading":"Our rules and regulations.","content":"
Terms and Conditions
\n\n
Welcome to SharpeTronics!
\n\n
These terms and conditions outline the rules and regulations for the use of SharpeTronics's Website, located at https://www.sharpetronics.com.
\n\n
By accessing this website we assume you accept these terms and conditions. Do not continue to use SharpeTronics if you do not agree to take all of the terms and conditions stated on this page.
\n\n
The following terminology applies to these Terms and Conditions, Privacy Statement and Disclaimer Notice and all Agreements: \"Client\", \"You\" and \"Your\" refers to you, the person log on this website and compliant to the Company’s terms and conditions. \"The Company\", \"Ourselves\", \"We\", \"Our\" and \"Us\", refers to our Company. \"Party\", \"Parties\", or \"Us\", refers to both the Client and ourselves. All terms refer to the offer, acceptance and consideration of payment necessary to undertake the process of our assistance to the Client in the most appropriate manner for the express purpose of meeting the Client’s needs in respect of provision of the Company’s stated services, in accordance with and subject to, prevailing law of Netherlands. Any use of the above terminology or other words in the singular, plural, capitalization and/or he/she or they, are taken as interchangeable and therefore as referring to same.
\n\n
Cookies
\n\n
We employ the use of cookies. By accessing SharpeTronics, you agreed to use cookies in agreement with the SharpeTronics's Privacy Policy.
\n\n
Most interactive websites use cookies to let us retrieve the user’s details for each visit. Cookies are used by our website to enable the functionality of certain areas to make it easier for people visiting our website. Some of our affiliate/advertising partners may also use cookies.
\n\n
License
\n\n
Unless otherwise stated, SharpeTronics and/or its licensors own the intellectual property rights for all material on SharpeTronics. All intellectual property rights are reserved. You may access this from SharpeTronics for your own personal use subjected to restrictions set in these terms and conditions.
\n\n
You must not:
\n
\n
Republish material from SharpeTronics
\n
Sell, rent or sub-license material from SharpeTronics
\n
Reproduce, duplicate or copy material from SharpeTronics
\n
Redistribute content from SharpeTronics
\n
\n\n
This Agreement shall begin on the date hereof.
\n\n
Parts of this website offer an opportunity for users to post and exchange opinions and information in certain areas of the website. SharpeTronics does not filter, edit, publish or review Comments prior to their presence on the website. Comments do not reflect the views and opinions of SharpeTronics,its agents and/or affiliates. Comments reflect the views and opinions of the person who post their views and opinions. To the extent permitted by applicable laws, SharpeTronics shall not be liable for the Comments or for any liability, damages or expenses caused and/or suffered as a result of any use of and/or posting of and/or appearance of the Comments on this website.
\n\n
SharpeTronics reserves the right to monitor all Comments and to remove any Comments which can be considered inappropriate, offensive or causes breach of these Terms and Conditions.
\n\n
You warrant and represent that:
\n\n
\n
You are entitled to post the Comments on our website and have all necessary licenses and consents to do so;
\n
The Comments do not invade any intellectual property right, including without limitation copyright, patent or trademark of any third party;
\n
The Comments do not contain any defamatory, libelous, offensive, indecent or otherwise unlawful material which is an invasion of privacy
\n
The Comments will not be used to solicit or promote business or custom or present commercial activities or unlawful activity.
\n
\n\n
You hereby grant SharpeTronics a non-exclusive license to use, reproduce, edit and authorize others to use, reproduce and edit any of your Comments in any and all forms, formats or media.
\n\n
Hyperlinking to our Content
\n\n
The following organizations may link to our Website without prior written approval:
\n\n
\n
Government agencies;
\n
Search engines;
\n
News organizations;
\n
Online directory distributors may link to our Website in the same manner as they hyperlink to the Websites of other listed businesses; and
\n
System wide Accredited Businesses except soliciting non-profit organizations, charity shopping malls, and charity fundraising groups which may not hyperlink to our Web site.
\n
\n\n
These organizations may link to our home page, to publications or to other Website information so long as the link: (a) is not in any way deceptive; (b) does not falsely imply sponsorship, endorsement or approval of the linking party and its products and/or services; and (c) fits within the context of the linking party’s site.
\n\n
We may consider and approve other link requests from the following types of organizations:
\n\n
\n
commonly-known consumer and/or business information sources;
\n
dot.com community sites;
\n
associations or other groups representing charities;
\n
online directory distributors;
\n
internet portals;
\n
accounting, law and consulting firms; and
\n
educational institutions and trade associations.
\n
\n\n
We will approve link requests from these organizations if we decide that: (a) the link would not make us look unfavorably to ourselves or to our accredited businesses; (b) the organization does not have any negative records with us; (c) the benefit to us from the visibility of the hyperlink compensates the absence of SharpeTronics; and (d) the link is in the context of general resource information.
\n\n
These organizations may link to our home page so long as the link: (a) is not in any way deceptive; (b) does not falsely imply sponsorship, endorsement or approval of the linking party and its products or services; and (c) fits within the context of the linking party’s site.
\n\n
If you are one of the organizations listed in paragraph 2 above and are interested in linking to our website, you must inform us by sending an e-mail to SharpeTronics. Please include your name, your organization name, contact information as well as the URL of your site, a list of any URLs from which you intend to link to our Website, and a list of the URLs on our site to which you would like to link. Wait 2-3 weeks for a response.
\n\n
Approved organizations may hyperlink to our Website as follows:
\n\n
\n
By use of our corporate name; or
\n
By use of the uniform resource locator being linked to; or
\n
By use of any other description of our Website being linked to that makes sense within the context and format of content on the linking party’s site.
\n
\n\n
No use of SharpeTronics's logo or other artwork will be allowed for linking absent a trademark license agreement.
\n\n
iFrames
\n\n
Without prior approval and written permission, you may not create frames around our Webpages that alter in any way the visual presentation or appearance of our Website.
\n\n
Content Liability
\n\n
We shall not be hold responsible for any content that appears on your Website. You agree to protect and defend us against all claims that is rising on your Website. No link(s) should appear on any Website that may be interpreted as libelous, obscene or criminal, or which infringes, otherwise violates, or advocates the infringement or other violation of, any third party rights.
\n\n
Your Privacy
\n\n
Please read Privacy Policy
\n\n
Reservation of Rights
\n\n
We reserve the right to request that you remove all links or any particular link to our Website. You approve to immediately remove all links to our Website upon request. We also reserve the right to amen these terms and conditions and it’s linking policy at any time. By continuously linking to our Website, you agree to be bound to and follow these linking terms and conditions.
\n\n
Removal of links from our website
\n\n
If you find any link on our Website that is offensive for any reason, you are free to contact and inform us any moment. We will consider requests to remove links but we are not obligated to or so or to respond to you directly.
\n\n
We do not ensure that the information on this website is correct, we do not warrant its completeness or accuracy; nor do we promise to ensure that the website remains available or that the material on the website is kept up to date.
\n\n
Disclaimer
\n\n
To the maximum extent permitted by applicable law, we exclude all representations, warranties and conditions relating to our website and the use of this website. Nothing in this disclaimer will:
\n\n
\n
limit or exclude our or your liability for death or personal injury;
\n
limit or exclude our or your liability for fraud or fraudulent misrepresentation;
\n
limit any of our or your liabilities in any way that is not permitted under applicable law; or
\n
exclude any of our or your liabilities that may not be excluded under applicable law.
\n
\n\n
The limitations and prohibitions of liability set in this Section and elsewhere in this disclaimer: (a) are subject to the preceding paragraph; and (b) govern all liabilities arising under the disclaimer, including liabilities arising in contract, in tort and for breach of statutory duty.
\n\n
As long as the website and the information and services on the website are provided free of charge, we will not be liable for any loss or damage of any nature.
","createdAt":"2022-05-24T19:10:35.588Z","updatedAt":"2022-07-26T23:49:57.383Z","publishedAt":"2022-05-24T19:11:47.498Z","locale":"en","layout":"post","image_alt":"An image with a gradient of colours.","slug":"our-terms-and-conditions","image":{"data":{"id":40,"attributes":{"name":"terms.webp","alternativeText":"terms.webp","caption":"terms.webp","width":461,"height":215,"formats":{"thumbnail":{"name":"thumbnail_terms.webp","hash":"thumbnail_terms_48bec2a697","ext":".webp","mime":"image/webp","path":null,"width":245,"height":114,"size":0.38,"url":"/uploads/thumbnail_terms_48bec2a697.webp"}},"hash":"terms_48bec2a697","ext":".webp","mime":"image/webp","size":7.68,"url":"/uploads/terms_48bec2a697.webp","previewUrl":null,"provider":"local","provider_metadata":null,"createdAt":"2022-07-26T23:49:53.892Z","updatedAt":"2022-07-26T23:49:53.892Z"}}},"category":{"data":{"id":4,"attributes":{"name":"Legal","createdAt":"2022-05-23T23:43:35.164Z","updatedAt":"2022-05-23T23:43:35.164Z","locale":"en"}}},"author":{"data":{"id":1,"attributes":{"createdAt":"2022-05-23T23:00:27.098Z","updatedAt":"2022-05-25T06:09:51.505Z","publishedAt":"2022-05-23T23:03:41.945Z","locale":"en","name":"Charles"}}},"tags":{"data":[{"id":5,"attributes":{"tag":"Celebration","createdAt":"2022-05-24T18:36:29.844Z","updatedAt":"2022-07-26T21:37:36.503Z","locale":"en"}},{"id":20,"attributes":{"tag":"Privacy","createdAt":"2022-05-24T19:04:25.700Z","updatedAt":"2022-06-28T05:02:32.666Z","locale":"en"}},{"id":21,"attributes":{"tag":"Terms & Conditions","createdAt":"2022-05-24T19:11:00.524Z","updatedAt":"2022-06-28T05:02:23.148Z","locale":"en"}}]},"localizations":{"data":[]}}},{"id":11,"attributes":{"title":"How to Setup a Secure Docker Drone Runner with Drone CI","date":"2022-06-23","subheading":"BeeYoop BeeDeepBoom Weeop DEEpaEEya","content":"> BeeYoop BeeDeepBoom Weeop DEEpaEEya\n\nIn general, this article describes how to setup SSL with a Drone Runner. This is part II of a part I series. If you would like to learn how-to setup the Drone Server, please visit: [Setup Drone CI Server](https://www.sharpetronics.com/blog/tutorials/2022/06/23/how-to-setup-a-docker-drone-ci-with-https/).\n\nThis part II creates a pipeline runner with a Docker machine; what that means is, like GitHub Actions, but with Drone super powers. The configuration file is stored as `.drone.yml` in the root of your site directory and drone server uses that application yml file to do a series of commands or actions within the virtual docker machine.\n\nThis is empowering because you can automate a fresh build every time. Also, you create a **drone trigger** for when you push to a branch master as an example. Here is the configuration of all the possible things you can do. [Docker Pipelines Overview](https://docs.drone.io/pipeline/docker/overview/)\n\n**Note 1:** If you see a [name-goes-here], I am linking to the references I shared below.\n**Note 2:** If you want to use Docker Engine without sudo, follow this url: [Linux Docker Post-Install](https://docs.docker.com/engine/install/linux-postinstall/)\n\n### Requirements\n- Basic Linux CLI knowledge\n- A hardened remote SSH server [see Linux VPS hardening](https://sharpetronics.com/blog/tutorials/2021/07/26/linux-vps-hardening-init/)\n- A running Gitea server: Git with a cup of tea\n- [Docker Engine](https://docs.docker.com/engine/install/)\n- a basic understanding of how to use Docker Engine\n- basic Nginx, Gitea and Certbot/Let's Encrypt experience\n- openssl\n- a running drone ci server [see part I](https://www.sharpetronics.com/blog/tutorials/2022/06/23/how-to-setup-a-docker-drone-ci-with-https/)\n\n### Let's Begin!\n\n#### Pull docker image from dockerhub\n`docker pull drone/drone-runner-docker:1`\n\n#### Make public access to repo in drone GUI\nFor testing, I made sure the repo was publicly available.\n\n\n\n### Launch a Secure Docker Drone Runner\n\nFor the **DRONE_RPC_SECRET** use the same ssl secret we created in Part I. See [Configuration](https://docs.drone.io/runner/docker/configuration/reference/) for a complete list of configuration options.\n\nPlease see the reference to understand what this docker config is doing. That is important for you to do yourself.\n\n```\ndocker run --detach \\\n --volume=/var/run/docker.sock:/var/run/docker.sock \\\n --env=DRONE_RPC_PROTO=https \\\n --env=DRONE_RPC_HOST=drone.example.com \\\n --env=DRONE_RPC_SECRET=bea26a2221fd8090ea38720fc445eca6 \\\n --env=DRONE_RUNNER_CAPACITY=2 \\\n --env=DRONE_RUNNER_NAME=st-runner \\\n --env=DRONE_UI_USERNAME=youruserhere \\\n --env=DRONE_UI_PASSWORD=yourpasshere \\\n --env=DRONE_DEBUG=true \\\n --env=DRONE_TRACE=true \\\n --publish=3000:3000 \\\n --restart=always \\\n --name=st-drone-runner \\\n drone/drone-runner-docker:1\n```\n\n#### A Pipeline Config Example\n\nAn example of a custom pipeline I have created. I ain't going to explain this to you in detail; I expect you to determine your own pipeline and this is only for a reference point. Essentially, what you will be doing is launching your own virtual machine for your specific use case scenario.\n\nIn this example, on drone.example.com, I have created a secret pass that needs to be passed to the virtual machine so I can package the build aka **_site** only, then auto push to www_data branch on my git server. Furthermore, I **rsync** this data through an ssh tunnel to a **Gitea Pages** server that serves the **WWW or edge** data.\n\n**Note: 3:** The example configuration is a **.drone.yml** file stored in the root of your site project.\n\n```\n---\nkind: pipeline\ntype: docker\nname: build\n\nworkspace:\n path: /drone/src\n\nplatform:\n os: linux\n arch: amd64\n\ntrigger:\n branch:\n - master\n\nsteps:\n- name: build-website\n image: ruby:latest\n environment:\n SSH_USER:\n from_secret: ssh_user\n SSH_HOST:\n from_secret: ssh_host\n NO_HOSTKEY:\n from_secret: no_hostkey\n privileged: false\n volumes:\n - name: jekyll\n path: /srv/jekyll\n\n commands:\n # general vm information for debugging\n - whoami\n - pwd\n - gem environment\n```\n\n#### Verify\n```\ndocker logs st-drone-runner\n\nINFO[0000] starting the server\nINFO[0000] successfully pinged the remote server\n```\n#### Stop & Start Container\n```\nsudo docker container stop st-drone-ssl\nsudo docker container start st-drone-ssl\n```\n### References\n- [Drone Runner Configuration](https://docs.drone.io/runner/docker/configuration/reference/)\n- [Drone Runner Docker Installation](https://docs.drone.io/runner/docker/installation/linux/)\n- [Docker Pipelines Overview](https://docs.drone.io/pipeline/docker/overview/)\n- [Unsplash - Nice M Nshuti](https://unsplash.com/@nietzsche99)\n\n### Support\n\nIf you have any questions, concerns, want to say hi, please join the following channel: [SharpeTronics Discord Support Channel]({{ site.data.social.discord_invite }}) Eventually, I plan on having a commenting system on here..\n\n### Want to buy me a coffee?\nRecently, I have had many folk as about **how to send me a donation**. If you want to give back andor support my efforts, I have shared various ways to donate. Thank You!\n\n- [Cash App]({{ site.data.payment.cashapp_acct }})\n- [Venmo]({{ site.data.payment.venmo_acct }})\n- [Open Collective]({{ site.data.payment.open_collective }})\n","createdAt":"2022-06-28T04:43:27.074Z","updatedAt":"2022-07-27T01:16:56.341Z","publishedAt":"2022-06-28T04:48:30.304Z","locale":"en","layout":"post","image_alt":"Black and white still image of C3PO","slug":"how-to-setup-a-secure-docker-drone-runner-with-drone-ci","image":{"data":{"id":41,"attributes":{"name":"c3po-a-friend-in-need.webp","alternativeText":"c3po-a-friend-in-need.webp","caption":"c3po-a-friend-in-need.webp","width":840,"height":560,"formats":{"thumbnail":{"name":"thumbnail_c3po-a-friend-in-need.webp","hash":"thumbnail_c3po_a_friend_in_need_74a237a413","ext":".webp","mime":"image/webp","path":null,"width":234,"height":156,"size":5.17,"url":"/uploads/thumbnail_c3po_a_friend_in_need_74a237a413.webp"}},"hash":"c3po_a_friend_in_need_74a237a413","ext":".webp","mime":"image/webp","size":69.93,"url":"/uploads/c3po_a_friend_in_need_74a237a413.webp","previewUrl":null,"provider":"local","provider_metadata":null,"createdAt":"2022-07-27T01:16:22.722Z","updatedAt":"2022-07-27T01:16:22.722Z"}}},"category":{"data":{"id":3,"attributes":{"name":"How-to","createdAt":"2022-05-23T22:36:20.735Z","updatedAt":"2022-06-25T17:31:07.838Z","locale":"en"}}},"author":{"data":{"id":1,"attributes":{"createdAt":"2022-05-23T23:00:27.098Z","updatedAt":"2022-05-25T06:09:51.505Z","publishedAt":"2022-05-23T23:03:41.945Z","locale":"en","name":"Charles"}}},"tags":{"data":[{"id":7,"attributes":{"tag":"Linux","createdAt":"2022-05-24T18:41:22.140Z","updatedAt":"2022-05-24T18:41:22.140Z","locale":"en"}},{"id":22,"attributes":{"tag":"Drone CI","createdAt":"2022-06-28T04:44:07.447Z","updatedAt":"2022-06-28T05:02:13.008Z","locale":"en"}},{"id":23,"attributes":{"tag":"Docker","createdAt":"2022-06-28T04:45:46.384Z","updatedAt":"2022-06-28T05:02:05.555Z","locale":"en"}}]},"localizations":{"data":[]}}},{"id":12,"attributes":{"title":"How to Setup a Docker Drone CI with HTTPS","date":"2022-06-23","subheading":"Obiwon Can Oh Be! A digital C3-PO working beside you!","content":"> R2D2, you know better than to trust a strange computer! [beeps]\n\nIn general, this Drone server enables continuous integration (CI) and is a stepping stone for continuous delivery (CD), including gh-pages and gh-actions like functionality.\n\nFor this to function correctly, you will need to have a working instance of Gitea running on your own system.\n\nThis tutorial doesn't guide you on how-to create your own HTTPS server using Let's Encrypt and Certbot. I have added the certbot resource below [Setting Up HTTPS Certs] I will document this in more detail in the near future. However, this article is similar to how to get https on your server setup.\n[How-to get HTTPS on your server](https://sharpetronics.com/blog/tutorials/2021/12/27/setup-nginx-https-web-server-with-lets-encrypt-plus-strapi-4.0-headless-cms/)\n\nAs a stack developer and business owner, I am working on so many things! It is difficult to remember everything, so documentation is critical for me to remember.\n\n**Note 1:** If you see a [name-goes-here], I am linking to the references shared at the end of the article.\n**Note 2:** Be sure your firewall `sudo ufw status` allows port 80 and 443. `sudo ufw allow http` && `sudo ufw allow https`.\n**Note 3:** If you want to use Docker Engine without sudo, follow this url: [Linux Docker Post-Install](https://docs.docker.com/engine/install/linux-postinstall/)\n\n### Requirements\n- Basic Linux CLI knowledge\n- A hardened remote SSH server [see Linux VPS hardening](https://sharpetronics.com/blog/tutorials/2021/07/26/linux-vps-hardening-init/)\n- A running Gitea server: Git with a cup of tea\n- [Docker Engine](https://docs.docker.com/engine/install/)\n- a basic understanding of how to use Docker Engine\n- basic Nginx, Gitea and Certbot/Let's Encrypt experience\n- openssl\n\n### Let's Begin!\n\n#### Preparing the Environment\n\n##### Creating our super-duper-shared secret\n```\nopenssl rand -hex 16\nbea26a2221fd8090ea38720fc445eca6\n```\n\n##### Creating an OAuth application on Gitea\n1. Goto your git.example.com and login\n2. Navigate to your profile settings (not the administrator settings, but personal profile)\n3. At the top below the main navigation bar, click on **Applications**\n4. Scroll down to the bottom of the page and create a new App name and Redirect URI\n```\nApplications Name: drone\nRedirect URI: https://drone.example.com/login\n```\n5. Click **Create Application**\n6. Copy and save your **Client Secret**; you will only be able to see this secret one time.\n7. In the next section, we will use these credentials to authenticate with Gitea and launch the Drone server.\n\n#### Create & configure the Docker Container\n\n##### Download docker drone image from Dockerhub\n`docker pull drone/drone:2`\n`docker image`\n\n##### Begin configuring and starting drone\n\n*The below command creates a container and starts the Docker runner. Remember to replace the environment variables below with your Drone server details.*\n```\ndocker run \\\n --volume=/var/lib/drone:/data \\\n --env=DRONE_TLS_AUTOCERT=true \\\n --env=DRONE_HTTP_SSL_REDIRECT=true \\\n --env=DRONE_HTTP_SSL_TEMPORARY_REDIRECT=true \\\n --env=DRONE_HTTP_SSL_HOST=drone.example.com \\\n --env=DRONE_HTTP_STS_SECONDS=315360000 \\\n --env=DRONE_SERVER_CERT=/etc/letsencrypt/live/drone.example.com/fullchain.pem \\\n --env=DRONE_SERVER_KEY=/etc/letsencrypt/live/drone.example.com/privkey.pem \\\n --env=DRONE_GITEA_SERVER=https://git.example.com \\\n --env=DRONE_GITEA_CLIENT_ID=e69c443c-6bc2-4a35-000b-a2f36a885400 \\\n --env=DRONE_GITEA_CLIENT_SECRET=3aY2000000c2Np7zX4e1Z9nlYhelENfX7nmWyxsgVixRg \\\n --env=DRONE_RPC_SECRET=bea26a2221fd80900000038720fc445eca6 \\\n --env=DRONE_SERVER_HOST=drone.example.com \\\n --env=DRONE_SERVER_PROTO=https \\\n --env=DRONE_USER_FILTER=gitea-user-account \\\n --publish=80:80 \\\n --publish=443:443 \\\n --restart=always \\\n --detach=true \\\n --name=st-drone-ssl \\\n drone/drone:2\n ```\n\n###### Going the extra yards\nAfter you create the docker container, it will automatically restart to remember your configuration, but if you create a shell script, you are able to `./shell-script.sh` and run the Docker image.\n\n```\nvi shell-script.sh\ncopy/paste docker config via CTRL+SHIFT+V\ndouble check for typos\nhit ESC\npress SHIFT+Z,Z (saves and quits)\nchmod +x shell-script.sh (makes script executable)\nthen, run the script with: ./shell-script.sh\n```\n\n#### Verify\n```\ndocker logs st-drone-ssl\n\nINFO[0000] starting the server\nINFO[0000] successfully pinged the remote server\n```\n\n#### Stop & Start Container\n```\nsudo docker container stop st-drone-ssl\nsudo docker container start st-drone-ssl\n```\n\n### Part II - Configure a Drone Runner Pipeline with Docker Engine\n\nThis article will be shared at a later date.\n\n### References\n\n- [Setting up HTTPS certs](https://certbot.eff.org/instructions)\n- [Drone Configuration Options](https://docs.drone.io/server/reference/)\n- [Drone Gitea Setup](https://docs.drone.io/server/provider/gitea/)\n- [Drone Server Docker Installation](https://docs.drone.io/server/provider/gitea/)\n- [What is CI/CD](https://www.infoworld.com/article/3271126/what-is-cicd-continuous-integration-and-continuous-delivery-explained.html)\n- [Unsplash - Studbee](https://unsplash.com/@studbee)\n\n### Support\n\nIf you have any questions, concerns, want to say hi, please join the following channel: [SharpeTronics Discord Support Channel]({{ site.data.social.discord_invite }}) Eventually, I plan on having a commenting system on here..\n\n### Donations\nRecently, I have had many folk as about **how to send me a donation**. If you want to give back andor support my efforts, I have shared various ways to donate. Thank You!\n\n- [Cash App]({{ site.data.payment.cashapp_acct }})\n- [Venmo]({{ site.data.payment.venmo_acct }})\n- [Open Collective]({{ site.data.payment.open_collective }})\n","createdAt":"2022-06-28T04:52:56.626Z","updatedAt":"2022-07-27T01:17:12.513Z","publishedAt":"2022-06-28T04:54:14.470Z","locale":"en","layout":"post","image_alt":"Skywalker with R2D2","slug":"how-to-setup-a-docker-drone-ci-with-https","image":{"data":{"id":42,"attributes":{"name":"r2d2-skywalker.webp","alternativeText":"r2d2-skywalker.webp","caption":"r2d2-skywalker.webp","width":840,"height":560,"formats":{"thumbnail":{"name":"thumbnail_r2d2-skywalker.webp","hash":"thumbnail_r2d2_skywalker_c84e2364fe","ext":".webp","mime":"image/webp","path":null,"width":234,"height":156,"size":5.05,"url":"/uploads/thumbnail_r2d2_skywalker_c84e2364fe.webp"}},"hash":"r2d2_skywalker_c84e2364fe","ext":".webp","mime":"image/webp","size":57.35,"url":"/uploads/r2d2_skywalker_c84e2364fe.webp","previewUrl":null,"provider":"local","provider_metadata":null,"createdAt":"2022-07-27T01:16:22.740Z","updatedAt":"2022-07-27T01:16:22.740Z"}}},"category":{"data":{"id":3,"attributes":{"name":"How-to","createdAt":"2022-05-23T22:36:20.735Z","updatedAt":"2022-06-25T17:31:07.838Z","locale":"en"}}},"author":{"data":{"id":1,"attributes":{"createdAt":"2022-05-23T23:00:27.098Z","updatedAt":"2022-05-25T06:09:51.505Z","publishedAt":"2022-05-23T23:03:41.945Z","locale":"en","name":"Charles"}}},"tags":{"data":[{"id":2,"attributes":{"tag":"Nginx","createdAt":"2022-05-23T22:52:52.842Z","updatedAt":"2022-05-23T22:53:02.776Z","locale":"en"}},{"id":7,"attributes":{"tag":"Linux","createdAt":"2022-05-24T18:41:22.140Z","updatedAt":"2022-05-24T18:41:22.140Z","locale":"en"}},{"id":8,"attributes":{"tag":"VPS","createdAt":"2022-05-24T18:43:17.764Z","updatedAt":"2022-05-24T18:43:17.764Z","locale":"en"}},{"id":22,"attributes":{"tag":"Drone CI","createdAt":"2022-06-28T04:44:07.447Z","updatedAt":"2022-06-28T05:02:13.008Z","locale":"en"}},{"id":23,"attributes":{"tag":"Docker","createdAt":"2022-06-28T04:45:46.384Z","updatedAt":"2022-06-28T05:02:05.555Z","locale":"en"}}]},"localizations":{"data":[]}}},{"id":13,"attributes":{"title":"Compiling Fresh XMPP Ejabberd Server Binaries 22.05 on Ubuntu 20.04 with Erlang OTP 24","date":"2022-06-21","subheading":"Creating and host your own end-to-end encryption Instant Messenger app","content":"# Compiling ejabberd v22.05\n### A XMPP server based on Erlang/OTP 24\n\n**Note 1:** I personally took it upon myself to use the following format [Example-Reference] to *tag* references.\n\nIn this article, I will be sharing a *HOWTO* create your own end-to-end encrypted instant messenger(IM) XMPP service for your Company, family xor community. Having ownership of your data requires **work** and this setup allows any Human in the world to protect their digital data from those who sell it for profit.\n\n> \"Ejabberd is a complete open-source XMPP-based messaging solution that is for all human beings, but ideal for governments, police, military, banks, insurance, finance, and healthcare companies that value privacy and security.\"\n\nThe minimal cost is less than $100 per year and is portable with the *nifty* config option -with-rebar; this option packages the whole app for transport.\n\n### Configure & compile Ejabberd\n\nPlease see [Ejabberd Configure] for setting up your Linux environment.\n\n#### Requirements\n- A remove server that has been hardened [Linux VPS Hardening](https://www.sharpetronics.com/blog/tutorials/2021/07/26/linux-vps-hardening-init/)\n- Linux CLI knowledge\n- Patience\n\n#### Operating System\n- This article is tested with `cat /etc/os-release` VERSION=\"20.04.4 LTS (Focal Fossa)\"\n\n#### Dependencies:\n- GNU Make `make -v`\n- GCC `sudo apt install build-essential && gcc -v`\n- Libexpat 1.95 or higher `sudo apt install -y expat && libexpat-dev`\n- Libyaml 0.1.4 or higher `sudo apt install -y libyaml-dev`\n- Erlang/OTP 19.3 or higher. We recommend using Erlang OTP 21.2. `sudo apt install -y erlang && erl -v`\n- OpenSSL 1.0.0 or higher, for STARTTLS, SASL and SSL encryption. `sudo apt install -y libssl-dev`\n- Zlib 1.2.3 or higher. Optional. For Zlib Stream Compression `sudo apt install -y zlib1g && zlib1g-dev`\n- ImageMagick’s Convert program and Ghostscript fonts. Optional. For CAPTCHA challenges. `sudo apt install -y imagemagick`\n\n- PAM library. *Optional*. For PAM Authentication\n- Elixir 1.10.3 or higher. *Optional*. For Elixir Development\n\n#### Extras Deps I needed\n- **PostgreSQL** `sudo apt install -y postgresql postgresql-contrib && sudo systemctl start postgresql.service`\n- **Erlang-dev** I had too also install erlang-dev for *erl_nif.h* was missing `sudo apt install -y erlang-dev`\n- **eunit_autoexport** was missing at compile `sudo apt-get install -y erlang-eunit`\n- **erlang-parsetools** was needed to create and assemble the 22.05.tar.gz. `sudo apt-get install -y erlang-parsetools`\n\n### Clone Ejabberd 22.05\n```\ngit clone https://github.com/processone/ejabberd.git && cd ejabberd\ngit checkout tags/22.05 -b branch-name-example && git status\n```\n**Note 2-3:** the latest stable release is 22.05 on June 21, 2022. Verify you are on branch-name-example.\n\n#### We begin compiling and installng **ejabberd** after the environment is ready\n\nBelow, I had to create my **configure** file with *autogen*. The **configure** options I have included are: postgresql database (default: mysql), zlib compression algos (optional), extra dev tools (optional) and rebar for packaging everything into one portable app.(optional) To see more options, please visit: [Ejabberd Configure](https://github.com/processone/ejabberd/blob/22.05/COMPILE.md)\n\n```\n./autogen.sh\n./configure --enable-pgsql --with-rebar=rebar3 --enable-tools --enable-zlib --enable-debug\nmake rel\n```\n**Note 4-6:** if you want to clean up the make after errors, use *make distclean* for dev files and clean for binaries. You are also able to see all the options for make via `make help`. Make rel creates a static portable binary release; no need to sudo make install, simply launch the app from the directory.\n\n### Eureka! :party-hat\n```\n===> Release successfully assembled: _build/prod/rel/ejabberd\n===> Building release tarball ejabberd-22.05.tar.gz...\n===> Tarball successfully created: _build/prod/rel/ejabberd/ejabberd-22.05.tar.gz\n```\n### Prepare Ejabberd Binary\n\nAfter we have successfully compiled ejabberd binaries on our own system, we have a system to create fresh binaries that are portable on the fly! Furthermore, we rename the ejabberd folder to ejabberd_builder and copy the created tar.gz to desired location.\n\n```\ncd .. && mv ejabberd ejabberd_builder\ncp _build/prod/rel/ejabberd/ejabberd-22.05.tar.gz ~/nodes/\n\n```\n\n### Launch Ejabberd\n\nNext, we untar or extract the data into the appropriate directory.\n```\ncd ~/nodes/ && mkdir ejabberd-20.05\ntar -xvkf ejabberd-20.05.tar.gz -C ./ejabberd-20.05\ncd ejabberd-20.05/ && ls bin/\n./bin/ejabberdctl start\n./bin/ejabberdctl status\n```\n\n> NOW, the hard part... configuration of your fresh ejabberd binaries.\n\nAs you may have noticed, **ejabberdctl** status failed to start. This is because we now have to configure the server.\n\n##### PART II - TBA\n\n### References:\n\n- [Ejabberd Source](https://github.com/processone/ejabberd/blob/22.05/COMPILE.md)\n- [Ejabberd Compile](https://docs.ejabberd.im/admin/installation/#source-code)\n- [Ejabberd Features](https://www.ejabberd.im/)\n- [Ejabberd Configure](https://www.process-one.net/blog/how-to-configure-ejabberd-to-get-100-in-xmpp-compliance-test/)\n- [Linux VPS Hardening](https://www.sharpetronics.com/blog/tutorials/2021/07/26/linux-vps-hardening-init/)\n- [OMEMO Extension](https://conversations.im/omemo/)\n- [XMPP Servers](https://xmpp.org/software/servers/)\n\n### Support\n\nIf you have any questions, concerns, want to say hi, please join the following channel: [SharpeTronics Discord Support Channel]({{ site.data.social.discord_invite }}) Eventually, I plan on having a commenting system on here..\n\n### Want to buy me a coffee?\nRecently, I have had many folk as about **how to send me a donation**. If you want to give back andor support my efforts, I have shared various ways to donate. Thank You!\n\n- [Cash App]({{ site.data.payment.cashapp_acct }})\n- [Venmo]({{ site.data.payment.venmo_acct }})\n- [Open Collective]({{ site.data.payment.open_collective }})\n","createdAt":"2022-06-28T04:58:46.469Z","updatedAt":"2022-07-26T23:44:56.813Z","publishedAt":"2022-06-28T05:07:39.217Z","locale":"en","layout":"post","image_alt":"Compiling Fresh XMPP Ejabberd Server Binaries 22.05 on Ubuntu 20.04 with Erlang OTP 24","slug":"compiling-fresh-xmpp-ejabberd-server-binaries-22-05-on-ubuntu-20-04-with-erlang-otp-24","image":{"data":{"id":26,"attributes":{"name":"ejabberd-in-the-jungle.webp","alternativeText":"ejabberd-in-the-jungle.webp","caption":"ejabberd-in-the-jungle.webp","width":800,"height":533,"formats":{"thumbnail":{"name":"thumbnail_ejabberd-in-the-jungle.webp","hash":"thumbnail_ejabberd_in_the_jungle_8a9f00e089","ext":".webp","mime":"image/webp","path":null,"width":234,"height":156,"size":12.89,"url":"/uploads/thumbnail_ejabberd_in_the_jungle_8a9f00e089.webp"}},"hash":"ejabberd_in_the_jungle_8a9f00e089","ext":".webp","mime":"image/webp","size":193.12,"url":"/uploads/ejabberd_in_the_jungle_8a9f00e089.webp","previewUrl":null,"provider":"local","provider_metadata":null,"createdAt":"2022-06-28T05:05:25.886Z","updatedAt":"2022-06-28T05:05:25.886Z"}}},"category":{"data":{"id":5,"attributes":{"name":"Devops","createdAt":"2022-06-25T17:30:49.319Z","updatedAt":"2022-06-25T17:30:49.319Z","locale":"en"}}},"author":{"data":{"id":1,"attributes":{"createdAt":"2022-05-23T23:00:27.098Z","updatedAt":"2022-05-25T06:09:51.505Z","publishedAt":"2022-05-23T23:03:41.945Z","locale":"en","name":"Charles"}}},"tags":{"data":[{"id":7,"attributes":{"tag":"Linux","createdAt":"2022-05-24T18:41:22.140Z","updatedAt":"2022-05-24T18:41:22.140Z","locale":"en"}},{"id":24,"attributes":{"tag":"XMPP","createdAt":"2022-06-28T04:59:04.893Z","updatedAt":"2022-06-28T05:01:59.802Z","locale":"en"}},{"id":26,"attributes":{"tag":"Ejabberd","createdAt":"2022-06-28T04:59:48.449Z","updatedAt":"2022-06-28T05:01:46.373Z","locale":"en"}}]},"localizations":{"data":[]}}},{"id":14,"attributes":{"title":"Update your Strapi CMS with your own Favicon","date":"2022-07-12","subheading":"How-to replace the favicon","content":" In this article, we will be replacing the Strapi favicon with your own favicon. This same process is similar to how we replace the login logo `AuthLogo` and menu logo with `MenuLogo`. For more details, please visit Strapi documentations example configuration. [Strapi Documents] \n\n> **Tip:** This same process may be used to replace the login logo `AuthLogo` and menu logo with `MenuLogo`. \n> For more details, please visit [Strapi Documents](https://docs.strapi.io/developer-docs/latest/development/admin-customization.html#logos)\n\n1. Create an extensions folder at:\n`src/admin/extensions/`\n\n2. Upload your favicon into:\n`src/admin/extensions/`\n\n3. Replace the **favicon.ico** at:\n`Strapi app root` with custom favicon.ico\n\n4. Update your `src/admin/app.js` with the following:\n\n```\n// path: src/admin/app.js\n\nimport favicon from './extensions/favicon.png';\n\nexport default {\n config: {\n // replace favicon with custom icon\n head: {\n favicon: favicon,\n },\n }\n}\n```\n5. Rebuild, run & revisit your Strapi app\n `yarn build && yarn develop`\n\n> **Note:** \n> Be certain that the cached favicon is cleared. It can be cached in your web browser and also with your domain management\n> tool like Cloudflare's CDN\n\n#### References\n[Strapi Documents](https://docs.strapi.io/developer-docs/latest/development/admin-customization.html#configuration-options)\n","createdAt":"2022-07-26T22:44:54.138Z","updatedAt":"2022-07-26T23:43:50.383Z","publishedAt":"2022-07-26T22:46:38.914Z","locale":"en","layout":"post","image_alt":"Macguyvering Strapi","slug":"update-your-strapi-cms-with-your-own-favicon","image":{"data":{"id":39,"attributes":{"name":"code.webp","alternativeText":"code.webp","caption":"code.webp","width":840,"height":560,"formats":{"thumbnail":{"name":"thumbnail_code.webp","hash":"thumbnail_code_eff0ff4f77","ext":".webp","mime":"image/webp","path":null,"width":234,"height":156,"size":7.08,"url":"/uploads/thumbnail_code_eff0ff4f77.webp"}},"hash":"code_eff0ff4f77","ext":".webp","mime":"image/webp","size":61.87,"url":"/uploads/code_eff0ff4f77.webp","previewUrl":null,"provider":"local","provider_metadata":null,"createdAt":"2022-07-26T22:52:02.655Z","updatedAt":"2022-07-26T22:52:02.655Z"}}},"category":{"data":{"id":3,"attributes":{"name":"How-to","createdAt":"2022-05-23T22:36:20.735Z","updatedAt":"2022-06-25T17:31:07.838Z","locale":"en"}}},"author":{"data":{"id":1,"attributes":{"createdAt":"2022-05-23T23:00:27.098Z","updatedAt":"2022-05-25T06:09:51.505Z","publishedAt":"2022-05-23T23:03:41.945Z","locale":"en","name":"Charles"}}},"tags":{"data":[{"id":4,"attributes":{"tag":"Strapi","createdAt":"2022-05-23T22:54:08.940Z","updatedAt":"2022-05-23T22:54:08.940Z","locale":"en"}},{"id":27,"attributes":{"tag":"Configure","createdAt":"2022-07-26T23:34:25.125Z","updatedAt":"2022-07-26T23:34:25.125Z","locale":"en"}},{"id":29,"attributes":{"tag":"Contribute","createdAt":"2022-07-26T23:35:32.216Z","updatedAt":"2022-07-26T23:35:32.216Z","locale":"en"}}]},"localizations":{"data":[]}}}],"meta":{"pagination":{"page":1,"pageSize":25,"pageCount":1,"total":12}}}
\ No newline at end of file
diff --git a/_includes/footer.html b/_includes/footer.html
index 6d954b2..55c425f 100644
--- a/_includes/footer.html
+++ b/_includes/footer.html
@@ -12,10 +12,10 @@
Imagined by humans, built with Jekyll,
hosted by SharpeTronics
- This work is licensed under a Creative Commons Attribution-NonCommercial-ShareAlike 4.0 International License.
+ {{ site.data.global.license_shorthand }}
Join our occasional newsletter for product launches, availability, job openings, and news.
We provide value to communities and businesses in a friendly super awesome way.
-
diff --git a/_layouts/journal_single.html b/_layouts/journal_single.html
deleted file mode 100644
index 574f536..0000000
--- a/_layouts/journal_single.html
+++ /dev/null
@@ -1,42 +0,0 @@
----
-layout: default
-pagination:
- enabled: false
----
-{% comment %}
- This layout is the single page of a blog post.
-{% endcomment %}
-
-
-
diff --git a/_layouts/post.html b/_layouts/post.html
index ad8ae0e..5c416a3 100644
--- a/_layouts/post.html
+++ b/_layouts/post.html
@@ -1,16 +1,42 @@
---
layout: default
+pagination:
+ enabled: false
---
{% comment %}
- This layout is a post with pagination.
+ This layout is the single page of a blog post.
{% endcomment %}
-
+
+
diff --git a/_layouts/journals.html b/_layouts/posts.html
similarity index 85%
rename from _layouts/journals.html
rename to _layouts/posts.html
index e5e5fba..947e30f 100644
--- a/_layouts/journals.html
+++ b/_layouts/posts.html
@@ -5,15 +5,8 @@ layout: post
This layout is the posts index (a collection of all blog posts).
{% endcomment %}
-
-
-
{{ page.title }}
-
{{ page.sub_title }}
-
-
-
{% for post in paginator.posts %}
@@ -35,11 +28,13 @@ layout: post
diff --git a/_layouts/shop_single.html b/_layouts/product.html
similarity index 100%
rename from _layouts/shop_single.html
rename to _layouts/product.html
diff --git a/_layouts/shop.html b/_layouts/products.html
similarity index 89%
rename from _layouts/shop.html
rename to _layouts/products.html
index f77c7cf..97a170e 100644
--- a/_layouts/shop.html
+++ b/_layouts/products.html
@@ -15,12 +15,6 @@ layout: post
-
-
-
{{ page.title }}
-
{{ page.sub_title }}
-
-
diff --git a/_plugins/env.rb b/_plugins/env.rb
deleted file mode 100644
index 9c3311f..0000000
--- a/_plugins/env.rb
+++ /dev/null
@@ -1,8 +0,0 @@
-module Jekyll
- class EnvVariables < Generator
- def generate(site)
- site.config['env'] = {}
- ENV.each_pair { |k, v| site.config['env'][k] = v }
- end
- end
-end
diff --git a/_plugins/ext.rb b/_plugins/ext.rb
deleted file mode 100644
index 6b6d588..0000000
--- a/_plugins/ext.rb
+++ /dev/null
@@ -1,6 +0,0 @@
-# _plugins/ext.rb allows you to define custom plugins and/or require
-# plugins that otherwise wouldn't work with Jekyll
-
-# Activate jekyll-tagging
-# https://github.com/pattex/jekyll-tagging
-require 'jekyll/tagging'
diff --git a/_plugins/jekyll-api/lib/a-get-collections.rb b/_plugins/jekyll-api/lib/a-get-collections.rb
new file mode 100644
index 0000000..93198dc
--- /dev/null
+++ b/_plugins/jekyll-api/lib/a-get-collections.rb
@@ -0,0 +1,113 @@
+# This software gathers all collection types from an API and saves that data into Jekyll _data/ folder.
+# Copyright (C) SharpeTronics, Inc. 2013-2023
+
+# Author(s): Charles Sharpe(@odinzu_me)
+# License: GPLv3
+# Version: 1
+
+# This is Free Software released under GPLv3. Any misuse of this software
+# will be followed up with GPL enforcement via Software Freedom Law Center:
+# https://www.softwarefreedom.org/
+
+# If you incorporate or include any code from SharpeTronics, Inc., your
+# code must be licensed as GPLv3 (not GPLv2 or MIT)
+
+# The GPLv3 software license applies to the code directly included in this source distribution.
+# See the LICENSE & COPYING file for full information.
+
+# Dependencies downloaded as part of the build process may be covered by other open-source licenses.
+
+# We are open to granting a more permissive (such as MIT or Apache 2.0) license to SharpeTronics, Inc.
+# software on a *case-by-case* basis, for an agreed upon price. Please contact
+# info@sharpetronics.com if you are interested.
+
+# If you would like to contribute to this code, please follow GPLv3 guidelines.
+# as an example, after making changes to the software (Called a Fork) and credit the original copyright holder as the creator with your credit added to theirs.
+
+require 'json' # https://ruby-doc.org/stdlib-3.0.2/libdoc/json/rdoc/JSON.html
+require 'fileutils' # https://ruby-doc.org/stdlib-2.4.1/libdoc/fileutils/rdoc/FileUtils.html
+require 'yaml' # load jekyll yaml config
+require 'faraday' # https://lostisland.github.io/faraday/usage/
+require 'httpx/adapters/faraday' # https://honeyryderchuck.gitlab.io/httpx/
+require 'addressable/uri' # https://github.com/sporkmonger/addressable If you need to normalize URIs, e.g. http://www.詹姆斯.com/
+require 'faraday/multipart' # https://github.com/lostisland/faraday-multipart
+
+Jekyll.logger.debug "A Ruby bot be building this...[*_-]\n".green.bold
+# prepare uri & load _config.yml into config_yml object
+config_yml = "_config.yml"
+f = YAML.load(File.read(config_yml.to_s)) # r - read file
+api_endpoint = f['api']['endpoint']
+endpoint_query = f['api']['endpoint_query']
+endpoint_ext = f['api']['endpoint_ext']
+Jekyll.logger.debug "DEBUG: API_ENDPDOINT for GET COLLECTIONS: " "#{api_endpoint}".to_s.yellow.bold
+
+# create directory _data/posts/ if doesn't exist
+if not Dir.exist?(f['api']['collections']['posts']['type'].to_s)
+ puts "folder does not exist, let's create a new folder in Jekyll called: _data/posts/ ".yellow
+ Dir.mkdir (f['api']['collections']['posts']['type'].to_s)
+end
+# create file.json if doesn't exist
+if not File.exist?(f['api']['collections']['posts']['filepath'])
+ puts "file does not exist, let's create a new file".yellow.bold
+ File.write(f['api']['collections']['posts']['filepath'], 'A Ruby bot be building this...[*_-]\n')
+end
+
+# authenticated or public API data
+# import API_TOKEN from the environment. e.g. export API_TOKEN=example
+api_token = ENV['API_TOKEN']
+# check if api_token is auth or unauth
+if api_token === nil
+ # logs data to screen
+ puts "ENV DEBUG: API_TOKEN FAILED! Testing a public request without a bearer token... ".red
+ options = {
+ headers: ""
+ }
+ else
+ # build the connection to the API
+ api_builder = Faraday.new do |builder|
+ # add the class directly instead of using lookups
+ builder.use Faraday::Request::UrlEncoded
+ builder.use Faraday::Response::RaiseError
+
+ # add by symbol, lookup from Faraday::Request
+ # Faraday::Response and Faraday::Adapter registries
+ builder.request :authorization, 'Bearer Token', api_token # include bearer token "options" and authenticated header
+ builder.request :json # encode req bodies as JSON and automatically set the Content-Type header
+ builder.response :json # decode response bodies as JSON
+
+ builder.adapter :httpx # must add adapter; default is Net:HTTP see README.md
+ end
+ Jekyll.logger.debug "HTTP DEBUG: BULIDING CONNECTION: #{api_builder}".to_s.yellow.bold
+ # logs auth status to screen
+ puts ""
+ puts "API_TOKEN SUCCESS! Getting the authenticated data...".green
+ puts ""
+ end # close if/else
+
+# TODO: add ['products'] collection
+# parses through local Jekyll _config.yml file and gets collection `type`
+#products_path = "[:site].config['api']['collections']['products']['type']"
+posts_path = f['api']['collections']['posts']['type']
+Jekyll.logger.debug "CONFIG DEBUG: JEKYLL CONFIG TYPE PATH: " "#{posts_path}".to_s.yellow.bold
+
+# populate all data to have image data available in Strapi
+# TODO: update this to work with any URL API in _config.yml; e.g. some API's don't need static /api like Strapi CMS
+uri = "#{api_endpoint}#{endpoint_ext}#{posts_path}#{endpoint_query}"
+Jekyll.logger.debug "HTTP DEBUG: URI: " "#{uri}".to_s.yellow
+
+# the actual GET with header data; retrieve all json data from API
+api_connect = api_builder.get(uri)
+Jekyll.logger.debug "HTTP DEBUG: THE COLLECTION IS: #{posts_path} WITH STATUS CODE: #{api_connect.status}".to_s.yellow.bold
+
+# api request variable passing uri and storing inside response var
+# response = api_request(uri)
+json_data = api_connect.body
+Jekyll.logger.debug "HTTP DEBUG: IS JSON DATA EMPTY? #{json_data.empty?}".to_s.yellow
+#Jekyll.logger.debug "DEBUG: STOUT JSON DATA: #{json_data}".to_s.yellow.bold
+
+# opens the file and writes the data to the file
+Jekyll.logger.debug "WRITING RAW JSON DATA TO FILE...".yellow.bold
+File.write('./_data/posts/index.json', JSON.dump(json_data))
+puts ""
+Jekyll.logger.debug "SUCCESS! JSON FILE DOWNLOADED...".green
+puts ""
diff --git a/_plugins/jekyll-api/lib/b-generate-documents.rb b/_plugins/jekyll-api/lib/b-generate-documents.rb
new file mode 100644
index 0000000..23843a9
--- /dev/null
+++ b/_plugins/jekyll-api/lib/b-generate-documents.rb
@@ -0,0 +1,192 @@
+# This software gathers all collection types from an API and saves that data into Jekyll _data/ folder.
+# Copyright (C) SharpeTronics, Inc. 2013-2023
+
+# Author(s): Charles Sharpe(@odinzu_me)
+# License: GPLv3
+# Version: 1
+
+# This is Free Software released under GPLv3. Any misuse of this software
+# will be followed up with GPL enforcement via Software Freedom Law Center:
+# https://www.softwarefreedom.org/
+
+# If you incorporate or include any code from SharpeTronics, Inc., your
+# code must be licensed as GPLv3 (not GPLv2 or MIT)
+
+# The GPLv3 software license applies to the code directly included in this source distribution.
+# See the LICENSE & COPYING file for full information.
+
+# Dependencies downloaded as part of the build process may be covered by other open-source licenses.
+
+# We are open to granting a more permissive (such as MIT or Apache 2.0) license to SharpeTronics, Inc.
+# software on a *case-by-case* basis, for an agreed upon price. Please contact
+# info@sharpetronics.com if you are interested.
+
+# If you would like to contribute to this code, please follow GPLv3 guidelines.
+# as an example, after making changes to the software (Called a Fork) and credit the original copyright holder as the creator with your credit added to theirs.
+
+require 'fileutils' # https://ruby-doc.org/stdlib-2.4.1/libdoc/fileutils/rdoc/FileUtils.html
+require 'json' # https://ruby-doc.org/stdlib-3.0.2/libdoc/json/rdoc/JSON.html
+require 'yaml' # load jekyll yaml config
+
+module Jekyll
+ # initialize variables
+ product_path = "collections/_products/"
+ post_path = "collections/_posts/"
+ file_ending = ".md"
+
+ # load _config.yml
+ config_yml = "_config.yml"
+ f = YAML.load(File.read(config_yml.to_s)) # r - read file
+ Jekyll.logger.debug "DOCUMENT DEBUG: Is config empty? " "#{config_yml.empty?}".to_s.yellow
+
+ # set filepath, load the json, then parse through json file in _data/posts/index.json
+ json_post_path = f['api']['collections']['posts']['filepath']
+ # must read data into memory before parsing file
+ read_json = File.read(json_post_path) # read json for all posts
+ #json_product_path = f['api']['collections']['products']['path']
+ # TODO: update for products also
+ parsed_file = JSON.parse(read_json.to_s) # returns a hash
+
+ # cache / check and download all collection post data
+ collection_ids = parsed_file["data"]
+ # loop through each collection id
+ collection_ids.each do |id|
+ #puts "#{id}".yellow # output collection id for debug
+
+ # store json specific data for each post
+ # check if title date is empty
+ if id["attributes"]["title"] === nil
+ Jekyll.logger.debug "ERROR: title is empty; does API post have title?".to_s.red
+ else
+ title = id["attributes"]["title"]
+ Jekyll.logger.debug "DOCUMENT DEBUG: Collection Title: " "#{title}".to_s.yellow.bold
+ end
+
+ # store slug into object
+ slug = id["attributes"]["slug"]
+ Jekyll.logger.debug "DOCUMENT DEBUG: Collection Slug: " "#{slug}".to_s.yellow
+
+ # check if sub_heading data is empty
+ if id["attributes"]["subheading"] === nil
+ Jekyll.logger.debug "ERROR: subheading is empty; does API post have subheading?".to_s.red
+ else
+ sub_heading = id["attributes"]["subheading"]
+ Jekyll.logger.debug "DOCUMENT DEBUG: Collection Subheading: " "#{sub_heading}".to_s.yellow.bold
+ end
+
+ # check if date data is empty
+ if id["attributes"]["date"] === nil
+ Jekyll.logger.debug "ERROR: date is empty; does API post have date?".to_s.red
+ else
+ date = id["attributes"]["date"]
+ Jekyll.logger.debug "DOCUMENT DEBUG: Collection Date: " "#{date}".to_s.yellow
+ end
+
+ # check if layout data is empty
+ if id["attributes"]["layout"] === nil
+ Jekyll.logger.debug "ERROR: layout is empty; does API post have layout?".to_s.red
+ else
+ layout = id["attributes"]["layout"]
+ Jekyll.logger.debug "DOCUMENT DEBUG: Collection Layout: " "#{layout}".to_s.yellow.bold
+ end
+ # check if author data is empty
+ puts "#{id}"
+ if "#{id["attributes"]["author"]}".empty? || nil
+ Jekyll.logger.debug "ERROR: author is empty; does API post have author?".to_s.red
+ else
+ author = id["attributes"]["author"]["data"]["attributes"]["name"]
+ Jekyll.logger.debug "DOCUMENT DEBUG: Collection Author: " "#{author}".to_s.yellow
+ end
+
+ # check if image data is empty
+ if "#{id["attributes"]["image"]}".empty? || nil || "#{id["attributes"]["image"]["data"]}".empty?
+ Jekyll.logger.debug "ERROR: banner_image url is empty; does API post have banner image url?".to_s.red
+ else
+ banner_image = id["attributes"]["image"]["data"]["attributes"]["url"]
+ Jekyll.logger.debug "DOCUMENT DEBUG: Collection Banner Image: " "#{banner_image}".to_s.yellow.bold
+ end
+
+ # check if banner_image_alt data is empty
+ if id["attributes"]["image_alt"] === nil
+ Jekyll.logger.debug "ERROR: banner_image_alt is empty; does API post have banner_image_alt?".to_s.red
+ else
+ banner_image_alt = id["attributes"]["image_alt"]
+ Jekyll.logger.debug "DOCUMENT DEBUG: Collection Banner Image Alt-text: " "#{banner_image_alt}".to_s.yellow
+ end
+
+ # check if tags data is empty
+ if "#{id["attributes"]["tags"]}".empty? || nil
+ Jekyll.logger.debug "ERROR: tags is empty; does API post have tags?".to_s.red
+ else
+ # an array for storing multiple input
+ tags = id["attributes"]["tags"]["data"]
+ # loop through all tags
+ tags.each do |tag|
+ puts ""
+ Jekyll.logger.debug "DOCUMENT DEBUG: Collection Tag(s): " "#{tag}".to_s.yellow
+ end
+ puts "" # pretty debug spacing
+ end
+
+ # check if category data is empty
+ if "#{id["attributes"]["category"]}".empty? || nil
+ Jekyll.logger.debug "ERROR: category is empty; does API post have a category?".to_s.red
+ else
+ category = id["attributes"]["category"]["data"]["attributes"]["name"]
+ Jekyll.logger.debug "DOCUMENT DEBUG: Collection Category: " "#{category}".to_s.yellow.bold
+ end
+
+ # check if content data is empty
+ if id["attributes"]["content"] === nil
+ Jekyll.logger.debug "ERROR: content is empty; does API post have content?".to_s.red
+ else
+ content = id["attributes"]["content"]
+ Jekyll.logger.debug "DOCUMENT DEBUG: Collection Raw Content: " "#{content}".to_s.yellow
+ end
+
+ # create the filename
+ file_name = "#{date}-#{slug}#{file_ending}"
+
+ # let us put humpty dumpty back together again!
+ # create a new collection type post *.md
+ p = File.open( "#{post_path}#{file_name}","w" )
+
+ # file content in Jekyll yaml formatting
+ p.puts "---"
+ p.puts "layout: #{layout}"
+ p.puts "date: #{date}"
+ p.puts "author: #{author}"
+ p.puts "banner_image: #{banner_image}" # the banner images are downloaded from API in image-filter.rb.
+ p.puts "banner_image_alt: #{banner_image_alt}"
+ p.puts "title: #{title}"
+
+ if sub_heading != nil
+ p.puts "sub_heading: #{sub_heading}"
+ end
+ # add tags without json formatting in pretty format
+ p.print "tags: " # pretty debug
+
+ if "#{id["attributes"]["tags"]}".empty? || nil
+ Jekyll.logger.debug "ERROR: tags is empty; does API post have tags?".to_s.red
+ else
+ tags = id["attributes"]["tags"]["data"]
+ # loop through all tags
+ tags.each do |tag|
+ p.print tag["attributes"]["tag"]
+ p.print ", "
+ end
+ p.puts "" # pretty debug spacing
+ end
+
+ if "#{id["attributes"]["category"]}".empty? || nil
+ Jekyll.logger.debug "ERROR: category is empty; does API post have a category?".to_s.red
+ else
+ category = id["attributes"]["category"]["data"]["attributes"]["name"]
+ p.puts "category: " "#{category}"
+ end
+
+ p.puts "---" # close .yaml file frontmatter
+ p.puts "#{content}" # write post content
+ p.close # close the file; stop writing
+ end
+end
diff --git a/_plugins/jekyll-api/lib/c-download-images.rb b/_plugins/jekyll-api/lib/c-download-images.rb
new file mode 100644
index 0000000..673e17b
--- /dev/null
+++ b/_plugins/jekyll-api/lib/c-download-images.rb
@@ -0,0 +1,132 @@
+# This software gathers all collection types from an API and saves that data into Jekyll _data/ folder.
+# Copyright (C) SharpeTronics, Inc. 2013-2023
+
+# Author(s): Charles Sharpe(@odinzu_me)
+# License: GPLv3
+# Version: 1
+
+# This is Free Software released under GPLv3. Any misuse of this software
+# will be followed up with GPL enforcement via Software Freedom Law Center:
+# https://www.softwarefreedom.org/
+
+# If you incorporate or include any code from SharpeTronics, Inc., your
+# code must be licensed as GPLv3 (not GPLv2 or MIT)
+
+# The GPLv3 software license applies to the code directly included in this source distribution.
+# See the LICENSE & COPYING file for full information.
+
+# Dependencies downloaded as part of the build process may be covered by other open-source licenses.
+
+# We are open to granting a more permissive (such as MIT or Apache 2.0) license to SharpeTronics, Inc.
+# software on a *case-by-case* basis, for an agreed upon price. Please contact
+# info@sharpetronics.com if you are interested.
+
+# If you would like to contribute to this code, please follow GPLv3 guidelines.
+# as an example, after making changes to the software (Called a Fork) and credit the original copyright holder as the creator with your credit added to theirs.
+
+require 'fileutils' # https://ruby-doc.org/stdlib-2.4.1/libdoc/fileutils/rdoc/FileUtils.html
+require 'yaml' # load jekyll yaml config
+require 'faraday' # https://lostisland.github.io/faraday/usage/
+require 'faraday/multipart' # https://github.com/lostisland/faraday-multipart
+require 'httpx/adapters/faraday' # https://honeyryderchuck.gitlab.io/httpx/
+
+# load and verify _config.yml
+config_yml = "_config.yml"
+f = YAML.load(File.read(config_yml.to_s)) # r - read file
+api_endpoint = f['api']['endpoint']
+Jekyll.logger.debug "CONFIG DEBUG: API_ENDPDOINT: " "#{api_endpoint}".to_s.yellow
+media_dir = f['api']['local_media_dir']
+Jekyll.logger.debug "CONFIG DEBUG: MEDIA DIR: " "#{media_dir}".to_s.yellow.bold
+output = f['api']['output']
+Jekyll.logger.debug "CONFIG DEBUG: OUTPUT CONFIG: " "#{output}".to_s.yellow
+
+# check if output is true or false in _config.yml
+if "#{output}" === "false" || nil
+ Jekyll.logger.debug "CONFIG DEBUG: CONFIG FAILED TO LOAD".to_s.yellow
+else
+ # create image directory if doesn't exist
+ if not Dir.exist?(f['api']['local_media_dir'].to_s)
+ Jekyll.logger.info "the image directory does not exist, I am going to create one".to_s.red
+ Dir.mkdir f['api']['local_media_dir'].to_s
+ end
+
+# All images are downloaded from EACH NEW collection
+# Each collection is parsed through the local _data json
+# Furthermore, the url is pieced together on each collection type like a post or product.
+
+# prepare http api connection
+api_builder = Faraday.new do |builder|
+ # add by symbol, lookup from Faraday::Request,
+ # Faraday::Response and Faraday::Adapter registries
+ builder.adapter :httpx # must add adapter; default is Net:HTTP
+ #builder.request :authorization, options
+ builder.request :multipart
+ # identical, but add the class directly instead of using lookups
+ builder.use Faraday::Response::RaiseError
+end
+Jekyll.logger.debug "HTTP DEBUG: BULIDING CONNECTION: #{api_builder}".to_s.yellow
+
+# load file, then parse through json file in _data/posts/index.json
+# add new collections here
+json_post_path = f['api']['collections']['posts']['filepath']
+Jekyll.logger.debug "JSON DEBUG: GET JSON CONFIG PATH: " "#{json_post_path}".to_s.yellow.bold
+# TODO: add product_path to parsed_json_file
+#json_product_path = f['api']['collections']['products']['path']
+#Jekyll.logger.debug "DEBUG: OUTPUT CONFIG: " "#{json_product_path}".to_s.yellow
+
+# TODO: add extra error log if file is missing
+read_json = File.read(json_post_path) # read json for all posts
+#Jekyll.logger.debug "DEBUG: READ JSON FILE: " "#{read_json}".to_s.yellow.bold # basic debug test
+
+parsed_json_file = JSON.parse(read_json.to_s) # returns json hash
+Jekyll.logger.debug "JSON DEBUG: IS parsed_json_file EMPTY? " "#{parsed_json_file.empty?}".to_s.yellow # basic debug test
+
+# cache / check and download all collection image data
+collection_ids = parsed_json_file["data"]
+ # loop through each collection id
+ collection_ids.each do |id|
+ #puts "#{id}".yellow # output collection id for debug
+
+ # get image_url
+ if "#{id["attributes"]["image"]}".to_s.empty? || nil || "#{id["attributes"]["image"]["data"]}".to_s.empty?
+ Jekyll.logger.debug "ERROR: IMAGE DATA EMPTY for COLLECTION: " "#{id["attributes"]["title"]}".to_s.red # basic debug test
+ else
+ # set uri_path
+ uri_path = "#{api_endpoint}""#{id["attributes"]["image"]["data"]["attributes"]["url"]}"
+ Jekyll.logger.debug "HTTP DEBUG: URI_PATH:" "#{uri_path}".to_s.yellow.bold
+
+ # get file_name
+ file_name = "#{id["attributes"]["image"]["data"]["attributes"]["hash"]}"
+
+ # prepare file
+ file_ext = File.extname(uri_path) # get file extension from API
+ Jekyll.logger.debug "FILE DEBUG: THE FILE EXTENSION NAME " "#{file_ext}".to_s.yellow.bold # basic debug test
+
+ # TODO: add image modified time to each API image
+ #puts File.exist?(media_dir + file_name + file_ext) #debug if File exists
+ if File.exist?(media_dir + file_name + file_ext) === false
+
+ # where the magic happens; download a new image
+ image = api_builder.get(uri_path)
+ Jekyll.logger.debug "DOWNLOADING... IMAGE URL IS: " "#{id["attributes"]["image"]["data"]["attributes"]["url"]}".to_s.green # basic debug test
+ Jekyll.logger.debug "HTTP DEBUG: A NEW IMAGE HTTP(S) RESPONSE: " "#{image.status}\n" "#{image.headers}\n".to_s.yellow # debug http response status
+
+ # only save file if data exists
+ file_exist = File.exist?(media_dir + file_name + file_ext) # file already exists? then, TODO: skip
+ Jekyll.logger.debug "FILE DEBUG: DOES FILE ALREADY EXIST? " "#{file_exist}".to_s.yellow # basic debug test
+
+ # TODO: enable to work with Windows NTFS File Systems
+ #file_ctime = File.ctime(media_dir + file_name + file_ext) # in NTFS (Windows) returns creation time (birthtime)
+ #Jekyll.logger.debug "DEBUG: WHEN WAS FILE LAST MODIFIED? " "#{file_ctime}".to_s.yellow # basic debug test
+
+ c = File.open(file_name + file_ext, 'w') # w - Create an empty file for writing.
+ c.write(image.body)
+ c.close
+ FileUtils.mv "#{c.path}", "#{media_dir}"
+ Jekyll.logger.debug "FILE DEBUG: THE WHOLE FILE NAME " "#{file_name}" "#{file_ext}".to_s.yellow.bold # basic debug test
+ else
+ Jekyll.logger.debug "WARNING: FILE ALREADY EXISTS - SKIPPING".to_s.red.bold # basic debug test
+ end
+ end # end if output = true
+ end
+end
diff --git a/_plugins/strapi/get-collections.rb b/_plugins/strapi/get-collections.rb
deleted file mode 100644
index 64bb987..0000000
--- a/_plugins/strapi/get-collections.rb
+++ /dev/null
@@ -1,71 +0,0 @@
-# Copyright SharpeTronics, LLC. 2013-2022
-# Author: Charles Sharpe
-# License: None
-
-require 'httparty'
-require 'json'
-require 'down'
-
-class Post
- include HTTParty
-
- def initialize
- # base url for remote server
- @api_url = "https://dash.sharpetronics.com/api"
- end
-
- def all
- # create directory & file if doesn't exist
- if not Dir.exist?('_data/posts/')
- puts "_data/posts/ directory does not exist, I am going to create one".yellow
- Dir.mkdir '_data/posts/'
- end
-
- if not File.exist?('./_data/posts/index.json')
- puts "_data/posts/index.json file does not exist, I am going to create one".yellow
- File.write('./_data/posts/index.json', 'amazing json data placeholder')
- end
-
- # import STRAPI_TOKEN from the environment. export STRAPI_TOKEN=example
- strapi_token = ENV['STRAPI_TOKEN']
- # check if strapi_token is auth or unauth
- if strapi_token==nil
- # logs data to screen
- puts "STRAPI_TOKEN FAILED, trying an unauthenticated request...".red
- options = {
- headers: ""
- }
- else
- options = {
- # pass authorization header token from ENV
- headers: {
- 'Authorization' =>"Bearer #{strapi_token}",
- 'Accept' => 'application/json'
- },
- format: :json
- }
- # set response with all posts data
- response = self.class.get("#{@api_url}/posts?populate=*", options)
- # logs data to screen
- puts "STRAPI_TOKEN SUCCESS! Getting the authenticated data...".green
- # turn http data into a string for json
- res = response.to_s
- # stdout pretty json on jekyll build
- puts JSON.pretty_generate(JSON.parse(res))
- # write raw json data to file
- data_hash = JSON.parse(res)
- File.write('./_data/posts/index.json', JSON.dump(data_hash))
-
- # download image data to uploads/:year/:image-url
- #url = @api_url.res
- #Down.download(res, destination: "uploads/#{input['name']}")
-
- # not being used
- #file = File.read('./_data/posts/index.json')
- end
- end
-end
-# create new Post class
-post = Post.new
-# debug post.all from def all method
-puts post.all
diff --git a/_plugins/tags/base_64/base64_filter.rb b/_plugins/tags/base_64/base64_filter.rb
deleted file mode 100644
index 1f416b9..0000000
--- a/_plugins/tags/base_64/base64_filter.rb
+++ /dev/null
@@ -1,12 +0,0 @@
-require "base64"
-
-module Base64Filter
- def base64_encode (input)
- Base64.encode64(input)
- end
- def base64_decode (input)
- Base64.decode64(input)
- end
-end
-
-Liquid::Template.register_filter(Base64Filter) # register filter globally
diff --git a/_plugins/tags/cms_get_image/cms_get-image.rb b/_plugins/tags/cms_get_image/cms_get-image.rb
deleted file mode 100644
index 14b24d7..0000000
--- a/_plugins/tags/cms_get_image/cms_get-image.rb
+++ /dev/null
@@ -1,47 +0,0 @@
-# frozen_string_literal: true
-require "down"
-
-module Jekyll
- class StrapiStaticFile < Jekyll::StaticFile
- def initialize(site, base, dir, name, collection = nil)
- @site = site
- @base = base
- @dir = dir
- @name = name
- @collection = collection
- # TODO: Check if user can change 'assets' path
- @relative_path = File.join(*["assets", @name].compact)
- @extname = File.extname(@name)
- end
- end
-
- module StrapiImageFilter
- def asset_url(input)
- # Sometimes to make this output visible in tests debug must be change for info
- # Need to find switch of logging level during rake test TODO: <===
- Jekyll.logger.debug "StrapiImageFilter 000 input:" " ==> YES"
- Jekyll.logger.debug "StrapiImageFilter 111 input:" "#{input}"
- Jekyll.logger.debug "StrapiImageFilter 222 context REGISTERS:" "#{@context.registers}"
- strapi_endpoint = @context.registers[:site].config['strapi']['endpoint']
- Jekyll.logger.debug "StrapiImageFilter strapi_endpoint:" "#{strapi_endpoint}"
-
- uri_path = "#{strapi_endpoint}#{input['url']}"
- if not Dir.exist?('_tmp_assets')
- # TODO: Check if there is not ability to overwrite from the _config
- Jekyll.logger.info "_tmp_assets directory does not exist, I am going to create one"
- Dir.mkdir '_tmp_assets'
- end
- ##
- # TODO: Investigate if there is a better way to download binaries
- # Check if we need authenticate to get medias
- Down.download(uri_path, destination: "_tmp_assets/#{input['name']}")
- ##
- # To perform copying of the assets in the cycle of Jenkins
- # https://jekyllrb.com/docs/rendering-process/
- site = Jekyll.sites.first
- site.static_files << StrapiStaticFile.new(site, site.source, "_tmp_assets", "#{input['name']}")
- "/assets/#{input['name']}"
- end
- end
-end
-Liquid::Template.register_filter(Jekyll::StrapiImageFilter)
diff --git a/_plugins/tags/reading_time/reading_time.rb b/_plugins/tags/reading_time/reading_time.rb
deleted file mode 100644
index d99f03e..0000000
--- a/_plugins/tags/reading_time/reading_time.rb
+++ /dev/null
@@ -1,18 +0,0 @@
-# Outputs the reading time
-
-# Read this in “about 4 minutes”
-# Put into your _plugins dir in your Jekyll site
-# Usage: Read this in about {{ page.content | reading_time }}
-
-module ReadingTimeFilter
- def reading_time( input )
- words_per_minute = 180
-
- words = input.split.size;
- minutes = ( words / words_per_minute ).floor
- minutes_label = minutes === 1 ? " minute" : " minutes"
- minutes > 0 ? "about #{minutes} #{minutes_label}" : "less than 1 minute"
- end
-end
-
-Liquid::Template.register_filter(ReadingTimeFilter)
diff --git a/api/pages.json b/api-example/pages.json
similarity index 100%
rename from api/pages.json
rename to api-example/pages.json
diff --git a/api/posts.json b/api-example/posts.json
similarity index 100%
rename from api/posts.json
rename to api-example/posts.json
diff --git a/api/products.json b/api-example/products.json
similarity index 100%
rename from api/products.json
rename to api-example/products.json
diff --git a/assets/icons/apple-touch-icon.png b/assets/icons/apple-touch-icon.png
new file mode 100644
index 0000000..2952187
Binary files /dev/null and b/assets/icons/apple-touch-icon.png differ
diff --git a/assets/icons/my-logo-blk.png b/assets/icons/my-logo-blk.png
deleted file mode 100644
index 76a5786..0000000
Binary files a/assets/icons/my-logo-blk.png and /dev/null differ
diff --git a/assets/icons/my-logo.png b/assets/icons/my-logo.png
deleted file mode 100644
index 02ba390..0000000
Binary files a/assets/icons/my-logo.png and /dev/null differ
diff --git a/assets/icons/favicon_bak.ico b/assets/icons/old_favicon.ico
similarity index 100%
rename from assets/icons/favicon_bak.ico
rename to assets/icons/old_favicon.ico
diff --git a/assets/images/logo.svg b/assets/images/logo.svg
new file mode 100644
index 0000000..a22c3e7
--- /dev/null
+++ b/assets/images/logo.svg
@@ -0,0 +1,1297 @@
+
+
diff --git a/assets/images/st_logo125.svg b/assets/images/st_logo125.svg
index 8a448c7..758ba90 100644
--- a/assets/images/st_logo125.svg
+++ b/assets/images/st_logo125.svg
@@ -1,12 +1,5 @@
diff --git a/collections/_legal/2020-02-03-privacy-policy.md b/collections/_posts/2020-02-03-our-privacy-policy.md
similarity index 97%
rename from collections/_legal/2020-02-03-privacy-policy.md
rename to collections/_posts/2020-02-03-our-privacy-policy.md
index 3d1a2d0..10f02f4 100644
--- a/collections/_legal/2020-02-03-privacy-policy.md
+++ b/collections/_posts/2020-02-03-our-privacy-policy.md
@@ -1,17 +1,13 @@
---
-layout: journal_single
-
-author: Charles #case sensitive, please use capitalization for names.
-
-title: Privacy Policy
+layout: post
+date: 2020-02-03
+author: Charles
+banner_image: /uploads/terms_48bec2a697.webp
+banner_image_alt: An image of a gradient of colours.
+title: Our Privacy Policy
sub_heading: Your data is always yours.
-
-banner_image: "/assets/images/pic01.jpg" #Size of banner_image 840x341
-banner_image_alt: "privacy policy"
-
+tags: Celebration, Privacy, Terms & Conditions,
category: Legal
-tag: Legal
-
---
Privacy Policy for SharpeTronics.com, Inc.
diff --git a/collections/_legal/2020-02-03-terms-conditions.md b/collections/_posts/2020-02-03-our-terms-and-conditions.md
similarity index 97%
rename from collections/_legal/2020-02-03-terms-conditions.md
rename to collections/_posts/2020-02-03-our-terms-and-conditions.md
index 2c0c64d..45e791f 100644
--- a/collections/_legal/2020-02-03-terms-conditions.md
+++ b/collections/_posts/2020-02-03-our-terms-and-conditions.md
@@ -1,17 +1,13 @@
---
-layout: journal_single
-
-author: Charles #case sensitive, please use capitalization for names.
-
-title: Terms & Conditions
+layout: post
+date: 2020-02-03
+author: Charles
+banner_image: /uploads/terms_48bec2a697.webp
+banner_image_alt: An image with a gradient of colours.
+title: Our Terms & Conditions
sub_heading: Our rules and regulations.
-
-banner_image: "/assets/images/pic01.jpg" #Size of banner_image 840x341
-banner_image_alt: "terms and conditions"
-
+tags: Celebration, Privacy, Terms & Conditions,
category: Legal
-tag: Legal
-
---
Terms and Conditions
diff --git a/collections/_posts/2021-01-3-sharpetronics-welcomes-you.md b/collections/_posts/2021-01-03-welcome-to-an-appalachian-technology-company.md
similarity index 89%
rename from collections/_posts/2021-01-3-sharpetronics-welcomes-you.md
rename to collections/_posts/2021-01-03-welcome-to-an-appalachian-technology-company.md
index 91a39a2..5c595f8 100644
--- a/collections/_posts/2021-01-3-sharpetronics-welcomes-you.md
+++ b/collections/_posts/2021-01-03-welcome-to-an-appalachian-technology-company.md
@@ -1,16 +1,13 @@
---
-layout: journal_single
-
-author: Charles #case sensitive, please use capitalization for names.
-
+layout: post
+date: 2021-01-03
+author: Charles
+banner_image: /uploads/wv_seneca_rocks_sky_0d5928baa9.webp
+banner_image_alt: WV Sky Seneca Rocks
title: Welcome To An Appalachian Technology Company
sub_heading: Where light travels at high altitudes.
-
-banner_image: "/uploads/2021/wv-seneca-rocks-sky.webp" #Size of banner_image 840x341
-banner_image_alt: "WV Sky Seneca Rocks"
-
+tags: Celebration,
category: Company
-tag: General
---
Welcome to SharpeTronics, where light travels at high altitudes. We are a mountain made company in the Appalachians of West Virginia that strives with software and hardware technologies. We are statewide leaders in our area of expertise and invite you to support local business.
diff --git a/collections/_posts/2021-03-17-sharpetronics-inc-becomes-official.md b/collections/_posts/2021-03-17-sharpe-tronics-inc-becomes-official.md
similarity index 68%
rename from collections/_posts/2021-03-17-sharpetronics-inc-becomes-official.md
rename to collections/_posts/2021-03-17-sharpe-tronics-inc-becomes-official.md
index a1ba9a9..74d05c4 100644
--- a/collections/_posts/2021-03-17-sharpetronics-inc-becomes-official.md
+++ b/collections/_posts/2021-03-17-sharpe-tronics-inc-becomes-official.md
@@ -1,19 +1,14 @@
---
-layout: journal_single
-
-author: Charles #case sensitive, please use capitalization for names.
-
+layout: post
+date: 2021-03-17
+author: Charles
+banner_image: /uploads/pillars_face_art_973bf824dd.webp
+banner_image_alt: An image of a pillar holding up a building.
title: SharpeTronics Inc. Becomes Official
sub_heading: Winding Roads
-
-banner_image: "/uploads/2021/pillars-face-art.webp" #Size of banner_image 840x473
-banner_image_alt: "Building Pillar"
-
+tags: Celebration,
category: Company
-tag: General
---
-
-
We as in SharpeTronics Inc. are proud to announce our business is official with the mountain state of West Virginia on March 17, 2021.
We also have our very own mailbox provided by the beloved Postmaster.
diff --git a/collections/_posts/2021-06-29-big-startups-without-big-tech.md b/collections/_posts/2021-06-29-big-startups-without-big-tech.md
index 4fda035..1e96fc3 100644
--- a/collections/_posts/2021-06-29-big-startups-without-big-tech.md
+++ b/collections/_posts/2021-06-29-big-startups-without-big-tech.md
@@ -1,19 +1,14 @@
---
-layout: journal_single
-
-author: Charles #case sensitive, please use capitalization for names.
-
+layout: post
+date: 2021-06-29
+author: Charles
+banner_image: /uploads/decentralized_385bd5a376.webp
+banner_image_alt: An image of interconnecting objects
title: Big Startups Without Big Tech
sub_heading: Liquid Democracy Empowering Network Users
-
-banner_image: "/uploads/2021/decentralized.webp" #Size of banner_image 840x473
-banner_image_alt: "Decentralized Internet Dfinity"
-
-category: Tutorials
-tag: Linux, Motoko, Installation
+tags: Blockchain, Linux,
+category: How-to
---
-
-
Welcome to the Blockchain Internet called DFINITY. In my spare time, I have been tinkering and learning **Motoko**. It is a language built for the Internet Computer (IC) that can be used to interface applications, websites and other various software.
Motoko is a programming typed language that compiles into WebAssembly (WA) and is created by **Andreas Rossberg** & the **Dfinity Foundation**
@@ -49,14 +44,3 @@ I hope this quick tutorial aided in your Linux administration talents. I will be
* Internet Computer Genesis Launch Event - - Premiered May 7, 2021
* The Dfinity Foundation -
* Adding a Path to the Linux PATH variable - - May 13th, 2021
-
-### Support
-
-If you have any questions, concerns, want to say hi, please join the following channel: [SharpeTronics Discord Support Channel]({{ site.data.social.discord_invite }}) Eventually, I plan on having a commenting system on here..
-
-### Want to buy me a coffee?
-Recently, I have had many folk as about **how to send me a donation**. If you want to give back andor support my efforts, I have shared various ways to donate. Thank You!
-
-- [Cash App]({{ site.data.payment.cashapp_acct }})
-- [Venmo]({{ site.data.payment.venmo_acct }})
-- [Open Collective]({{ site.data.payment.open_collective }})
diff --git a/collections/_posts/2021-07-26-linux-vps-hardening-init.md b/collections/_posts/2021-07-26-linux-vps-hardening.md
similarity index 88%
rename from collections/_posts/2021-07-26-linux-vps-hardening-init.md
rename to collections/_posts/2021-07-26-linux-vps-hardening.md
index 58be560..91581be 100644
--- a/collections/_posts/2021-07-26-linux-vps-hardening-init.md
+++ b/collections/_posts/2021-07-26-linux-vps-hardening.md
@@ -1,16 +1,13 @@
---
-layout: journal_single
-
-author: Charles #case sensitive, please use capitalization for names.
-
+layout: post
+date: 2021-07-26
+author: Charles
+banner_image: /uploads/linux_admin_0def8999f2.webp
+banner_image_alt: an image of a hooded individual typing on a keyboard
title: Linux VPS Hardening
sub_heading: Initializing a secure environment
-
-banner_image: "/uploads/2021/linux-admin.webp" #Size of banner_image 840x473
-banner_image_alt: "Decentralized Internet Dfinity"
-
-category: Tutorials
-tag: Linux, VPS, Administration
+tags: Linux, Privacy, Security,
+category: How-to
---
### Planting Seeds
@@ -103,7 +100,7 @@ Adding new group `username' (1003) ...
Adding new user `username' (1002) with group `username' ...
Creating home directory `/home/username' ...
Copying files from `/etc/skel' ...
-New password:
+New password:
```
Next, if the user should have sudo permission, we do the following.
@@ -177,14 +174,3 @@ sudo rsync -aAXv --rsh="ssh -i /home/user/.ssh/id_rsa" --recursive --progress --
#### Sources:
* Full System Backup Using Rsync -
-
-### Support
-
-If you have any questions, concerns, want to say hi, please join the following channel: [SharpeTronics Discord Support Channel]({{ site.data.social.discord_invite }}) Eventually, I plan on having a commenting system on here..
-
-### Want to buy me a coffee?
-Recently, I have had many folk as about **how to send me a donation**. If you want to give back andor support my efforts, I have shared various ways to donate. Thank You!
-
-- [Cash App]({{ site.data.payment.cashapp_acct }})
-- [Venmo]({{ site.data.payment.venmo_acct }})
-- [Open Collective]({{ site.data.payment.open_collective }})
diff --git a/collections/_posts/2021-11-11-configure-build-install-qt5-15-2-source-on-ubuntu-with-X11-support.md b/collections/_posts/2021-11-11-configure-a-static-qt5-from-source-on-ubuntu-18-04-with-x11-support.md
similarity index 84%
rename from collections/_posts/2021-11-11-configure-build-install-qt5-15-2-source-on-ubuntu-with-X11-support.md
rename to collections/_posts/2021-11-11-configure-a-static-qt5-from-source-on-ubuntu-18-04-with-x11-support.md
index 516570c..69e0bbd 100644
--- a/collections/_posts/2021-11-11-configure-build-install-qt5-15-2-source-on-ubuntu-with-X11-support.md
+++ b/collections/_posts/2021-11-11-configure-a-static-qt5-from-source-on-ubuntu-18-04-with-x11-support.md
@@ -1,22 +1,17 @@
---
-layout: journal_single
-
-author: Charles #case sensitive, please use capitalization for names.
-
+layout: post
+date: 2021-11-11
+author: Charles
+banner_image: /uploads/quantum_qt5_95dcd080f1.webp
+banner_image_alt: An image of a gold computer circuit.
title: Configure a Static Qt5 from Source on Ubuntu 18.04 with X11 Support
sub_heading: Compiling & Configuring Qt from Source
-
-banner_image: "/uploads/2021/quantum-qt5.webp" #Size of banner_image 840x473
-banner_image_alt: "Qt5 Compile"
-
-category: Tutorials
-tag: Linux, ARM64, RPi 400, Qt5
-
-updated: December 4, 2021
+tags: Linux, VPS, ARM64, AArch64, X11,
+category: How-to
---
### Configure, Build, Install & Setup Qt 5.15.2 Source on Ubuntu 18.04 with X11 Support
-This tutorial will teach you how to compile from source via CLI (command-line interface) and enable customization for building Qt5 apps on different operating systems andor hardware architectures like RPI400.
+This tutorial will teach you how to compile from source via CLI (command-line interface) and enable customization for building Qt5 apps on different operating systems andor hardware architectures like RPI400.
When compiling Qt5 yourself, you are empowered with a configuration that is constant throughout the Linux Universe. This process is also very similar with compiling Qt apps on your (AArch64) ARM64 devices like RPi 400, Rock64 & PineBook64.
@@ -25,7 +20,7 @@ When compiling Qt5 yourself, you are empowered with a configuration that is cons
### What is Qt?
"Qt is a cross-platform application development framework for desktop, embedded and mobile." [Qt Wiki]
-### What is a Static Qt?
+### What is a Static Qt?
In general, a static Qt option includes libraries locally. This aids in having an application run on different versions of Linux distros. When the application is compiled, we check the app with *ldd yourapp* to list what the binary is dependent on to run. Essentially, the Qt libraries are included in the binary. Decovar.dev has a great explanation on advantages and disadvantages of building a static Qt. [At last, let's build Qt statically]
### Let's Begin!
@@ -130,6 +125,9 @@ Using Qt version 5.15.2 in /usr/local/Qt-5.15.2/lib
```
./build.sh
```
+#### Support & Questions
+[sharpetronics.github](https://github.com/SharpeTronics/sharpetronics.github.io/issues)
+

#### References
@@ -140,14 +138,3 @@ Using Qt version 5.15.2 in /usr/local/Qt-5.15.2/lib
[wiki.qt.io/about](https://wiki.qt.io/About_Qt)
[why-build-qt-statically](https://decovar.dev/blog/2018/02/17/build-qt-statically/#why-build-qt-statically)
-
-### Support
-
-If you have any questions, concerns, want to say hi, please join the following channel: [SharpeTronics Discord Support Channel]({{ site.data.social.discord_invite }}) Eventually, I plan on having a commenting system on here..
-
-### Want to buy me a coffee?
-Recently, I have had many folk as about **how to send me a donation**. If you want to give back andor support my efforts, I have shared various ways to donate. Thank You!
-
-- [Cash App]({{ site.data.payment.cashapp_acct }})
-- [Venmo]({{ site.data.payment.venmo_acct }})
-- [Open Collective]({{ site.data.payment.open_collective }})
diff --git a/collections/_posts/2021-12-27-setup-nginx-https-web-server-with-lets-encrypt-plus-strapi-4.0-headless-cms.md b/collections/_posts/2021-12-27-setup-a-secure-nginx-https-web-server-with-let-s-encrypt-strapi-4-0-headless-cms.md
similarity index 82%
rename from collections/_posts/2021-12-27-setup-nginx-https-web-server-with-lets-encrypt-plus-strapi-4.0-headless-cms.md
rename to collections/_posts/2021-12-27-setup-a-secure-nginx-https-web-server-with-let-s-encrypt-strapi-4-0-headless-cms.md
index 0c8c64f..a385668 100644
--- a/collections/_posts/2021-12-27-setup-nginx-https-web-server-with-lets-encrypt-plus-strapi-4.0-headless-cms.md
+++ b/collections/_posts/2021-12-27-setup-a-secure-nginx-https-web-server-with-let-s-encrypt-strapi-4-0-headless-cms.md
@@ -1,30 +1,24 @@
---
-layout: journal_single
-
-author: Charles #case sensitive, please use capitalization for names.
-
+layout: post
+date: 2021-12-27
+author: Charles
+banner_image: /uploads/santa_rudolph_unsplash_0ae8e3d5a7.webp
+banner_image_alt: An image of two pair of holiday cheer feet.
title: Setup a Secure NGINX HTTPS Web Server with Let's Encrypt + Strapi 4.0 Headless CMS
sub_heading: Static Websites with CMS
-
-banner_image: "/uploads/2021/santa-rudolph-unsplash.webp" #Size of banner_image 840x560
-banner_image_alt: "Qt5 Compile"
-
-category: Tutorials
-tag: Linux, Strapi, Nginx, JAMstack
-
-updated: December 27, 2021
+tags: Nginx, Strapi, Headless CMS, JAMstack,
+category: How-to
---
-
## General
-For this tutorial, we will launch a secure SSL NGINX web server for your website domain example.org and enable an API to be consumed from the subdomain i.e. api.example.org with Strapi 4.0.
+For this tutorial, we will launch a secure SSL NGINX web server for your website domain example.org and enable an API to be consumed from the subdomain i.e. api.example.org with Strapi 4.0.
*Tip:* For each reference, I add the **[reference name]** in brackets at the end of the "transmission." **[AWK example]**
-
-## Requirements:
+
+## Requirements:
- a Ubuntu Linux 20.04 VPS with SSH access
- CLI knowledge
- a registered web domain i.e. example.org
-- Basic knowledge of DNS and managing a VPS with SSH
+- Basic knowledge of DNS and managing a VPS with SSH
## Dependencies & Packages
- NodeJS v12 or v14 (v14 is recommended for Strapi 4.0)
@@ -32,7 +26,7 @@ For this tutorial, we will launch a secure SSL NGINX web server for your website
- Certbot with Let's Encrypt
- Nano editor
-## Prepare Operating System
+## Prepare Operating System
Let's Begin! We begin by installing nginx, certbot and verifying versions Strapi needs. Keep in mind, if you are reading this from the future, the versions will change.
### Update System
@@ -43,7 +37,7 @@ Let's Begin! We begin by installing nginx, certbot and verifying versions Strapi
```sudo apt install certbot python3-certbot-nginx```
-### Install NGINX & verify version
+### Install NGINX & verify version
```sudo apt install nginx```
@@ -51,26 +45,25 @@ Let's Begin! We begin by installing nginx, certbot and verifying versions Strapi
**Tip:** Strapi recommends nodejs v14, but v12 works.
-### Install Yarn (Corepack)
+### Install Yarn (Corepack)
```npm i -g corepack``` **[Install Yarn]**
-## Configure NGINX
-Next, we will configure your newly installed Nginx server. By default the configurations are located at: /etc/nginx/ & /etc/nginx/sites-available/. To keep things tidy and organized, we create a new api.example.org conf for each domain we are publicly facing to WWW.
+## Configure NGINX
+Next, we will configure your newly installed Nginx server. By default the configurations are located at: /etc/nginx/ & /etc/nginx/sites-available/. To keep things tidy and organized, we create a new api.example.org conf for each domain we are publicly facing to WWW.
-### Make Directory & Copy Default HTML page
+### Make Directory & Copy Default HTML page
```sudo mkdir -p /var/www/api.example.org/html/```
```sudo cp -R /var/www/html/index.nginx-debian.html /var/www/api.example.org/html/index.html```
-### Duplicate Default Config
+### Duplicate Default Config
```sudo cp /etc/nginx/sites-available/default /etc/nginx/sites-available/api.example.org```
### Update NGINX api.example.org Config File
The **Proxy Config** is important and allows the Strapi 4.0 server to run with nginx. In general, the rest allows SSL and redirects all HTTP traffic to HTTPS, plus denies automated user-agents like wget.
-
```
server {
# Redirect all HTTP requests to HTTPS
@@ -121,11 +114,11 @@ server {
``` CTRL+X, then Y for Yes to save```
### Symbolic Link to sites-enabled
-This creates a 'mirror' like reference to the sites-available folder.
+This creates a 'mirror' like reference to the sites-available folder.
```sudo ln -s /etc/nginx/sites-available/api.exampleorg /etc/nginx/sites-enabled/```
-#### Verify Symbolic Link
+#### Verify Symbolic Link
```ls /etc/nginx/sites-enabled/```
## DNS Configuration
@@ -135,7 +128,7 @@ We now point our domain to the server we are hosting our Strapi on. i.e. 123.123
Depending on your DNS provider or maybe you have your own Domain Name Server, we point our DNS settings for example.org to 123.123.1.1 as type A. I personally recommend Cloudflare.
## Create SSL Certs
-We run the automated tool Certbot and create all the needed files and update our *api.example.org* configuration file.
+We run the automated tool Certbot and create all the needed files and update our *api.example.org* configuration file.
### Run Certbot
```sudo certbot --nginx```
@@ -185,7 +178,7 @@ Goto desired place to install Strapi project i.e. ~/development/my-strapi-projec
```yarn develop```
-### Launch Strapi from Domain URL
+### Launch Strapi from Domain URL
```Goto: api.example.com via web browser of your choice.```
@@ -202,13 +195,5 @@ Goto desired place to install Strapi project i.e. ~/development/my-strapi-projec
[Certbot Insturctions](https://certbot.eff.org/instructions?ws=nginx&os=ubuntufocal)
-### Support
-
-If you have any questions, concerns, want to say hi, please join the following channel: [SharpeTronics Discord Support Channel]({{ site.data.social.discord_invite }}) Eventually, I plan on having a commenting system on here..
-
-### Want to buy me a coffee?
-Recently, I have had many folk as about **how to send me a donation**. If you want to give back andor support my efforts, I have shared various ways to donate. Thank You!
-
-- [Cash App]({{ site.data.payment.cashapp_acct }})
-- [Venmo]({{ site.data.payment.venmo_acct }})
-- [Open Collective]({{ site.data.payment.open_collective }})
+#### Donations Are Welcome
+[Cash App](https://cash.app/$sharpeee)
diff --git a/collections/_posts/2022-06-21-compiling-fresh-xmpp-ejabberd-server-binaries.md b/collections/_posts/2022-06-21-compiling-fresh-xmpp-ejabberd-server-binaries-22-05-on-ubuntu-20-04-with-erlang-otp-24.md
similarity index 93%
rename from collections/_posts/2022-06-21-compiling-fresh-xmpp-ejabberd-server-binaries.md
rename to collections/_posts/2022-06-21-compiling-fresh-xmpp-ejabberd-server-binaries-22-05-on-ubuntu-20-04-with-erlang-otp-24.md
index f7b43ba..4a1008e 100644
--- a/collections/_posts/2022-06-21-compiling-fresh-xmpp-ejabberd-server-binaries.md
+++ b/collections/_posts/2022-06-21-compiling-fresh-xmpp-ejabberd-server-binaries-22-05-on-ubuntu-20-04-with-erlang-otp-24.md
@@ -1,19 +1,14 @@
---
-layout: journal_single
-
-author: Charles #case sensitive, please use capitalization for names.
-
-title: Compiling Fresh XMPP Ejabberd Server Binaries 22.05 on Ubuntu 20.04 with Erlang OTP 24
+layout: post
+date: 2022-06-21
+author: Charles
+banner_image: /uploads/ejabberd_in_the_jungle_8a9f00e089.webp
+banner_image_alt: Compiling Fresh XMPP Ejabberd Server Binaries 22.05 on Ubuntu 20.04 with Erlang OTP 24
+title: Compiling Fresh XMPP Ejabberd Server Binaries 22.05 on Ubuntu 20.04 with Erlang OTP 24
sub_heading: Creating and host your own end-to-end encryption Instant Messenger app
-
-banner_image: "/uploads/2022/ejabberd-in-the-jungle.webp" #Size of banner_image 800x500
-banner_image_alt: "Ejabberd XMPP Server in the Jungle"
-
+tags: Linux, XMPP, Ejabberd,
category: Devops
-tag: xmpp, ejabberd, omemo, admin, privacy
---
-
-
# Compiling ejabberd v22.05
### A XMPP server based on Erlang/OTP 24
@@ -105,7 +100,7 @@ cd ejabberd-20.05/ && ls bin/
As you may have noticed, **ejabberdctl** status failed to start. This is because we now have to configure the server.
-##$# PART II - TBA
+##### PART II - TBA
### References:
diff --git a/collections/_posts/2022-06-23-how-to-setup-a-docker-drone-ci-with-https.md b/collections/_posts/2022-06-23-how-to-setup-a-docker-drone-ci-with-https.md
index a9cb35d..12abcc4 100644
--- a/collections/_posts/2022-06-23-how-to-setup-a-docker-drone-ci-with-https.md
+++ b/collections/_posts/2022-06-23-how-to-setup-a-docker-drone-ci-with-https.md
@@ -1,18 +1,14 @@
---
-layout: journal_single
-
-author: Charles #case sensitive, please use capitalization for names.
-
+layout: post
+date: 2022-06-23
+author: Charles
+banner_image: /uploads/r2d2_skywalker_c84e2364fe.webp
+banner_image_alt: Skywalker with R2D2
title: How to Setup a Docker Drone CI with HTTPS
sub_heading: Obiwon Can Oh Be! A digital C3-PO working beside you!
-
-banner_image: "/uploads/2022/r2d2-skywalker.webp" #Size of banner_image 840x473
-banner_image_alt: "Skywalker with R2D2"
-
-category: Tutorials
-tag: Linux, Drone, CI, How-to
+tags: Nginx, Linux, VPS, Drone CI, Docker,
+category: How-to
---
-
> R2D2, you know better than to trust a strange computer! [beeps]
In general, this Drone server enables continuous integration (CI) and is a stepping stone for continuous delivery (CD), including gh-pages and gh-actions like functionality.
@@ -138,7 +134,7 @@ This article will be shared at a later date.
If you have any questions, concerns, want to say hi, please join the following channel: [SharpeTronics Discord Support Channel]({{ site.data.social.discord_invite }}) Eventually, I plan on having a commenting system on here..
-### Want to buy me a coffee?
+### Donations
Recently, I have had many folk as about **how to send me a donation**. If you want to give back andor support my efforts, I have shared various ways to donate. Thank You!
- [Cash App]({{ site.data.payment.cashapp_acct }})
diff --git a/collections/_posts/2022-06-23-how-to-setup-a-secure-docker-drone-runner-with-drone-ci.md b/collections/_posts/2022-06-23-how-to-setup-a-secure-docker-drone-runner-with-drone-ci.md
index 57c33ed..7868e3a 100644
--- a/collections/_posts/2022-06-23-how-to-setup-a-secure-docker-drone-runner-with-drone-ci.md
+++ b/collections/_posts/2022-06-23-how-to-setup-a-secure-docker-drone-runner-with-drone-ci.md
@@ -1,18 +1,14 @@
---
-layout: journal_single
-
-author: Charles #case sensitive, please use capitalization for names.
-
+layout: post
+date: 2022-06-23
+author: Charles
+banner_image: /uploads/c3po_a_friend_in_need_74a237a413.webp
+banner_image_alt: Black and white still image of C3PO
title: How to Setup a Secure Docker Drone Runner with Drone CI
sub_heading: BeeYoop BeeDeepBoom Weeop DEEpaEEya
-
-banner_image: "/uploads/2022/c3po-a-friend-in-need.webp" #Size of banner_image 840x473
-banner_image_alt: "Black and white still image of C3PO"
-
-category: Tutorials
-tag: Linux, Drone, CI, How-to
+tags: Linux, Drone CI, Docker,
+category: How-to
---
-
> BeeYoop BeeDeepBoom Weeop DEEpaEEya
In general, this article describes how to setup SSL with a Drone Runner. This is part II of a part I series. If you would like to learn how-to setup the Drone Server, please visit: [Setup Drone CI Server](https://www.sharpetronics.com/blog/tutorials/2022/06/23/how-to-setup-a-docker-drone-ci-with-https/).
diff --git a/collections/_posts/2022-07-12-update-your-strapi-cms-with-your-own-favicon.md b/collections/_posts/2022-07-12-update-your-strapi-cms-with-your-own-favicon.md
new file mode 100644
index 0000000..49d6f2c
--- /dev/null
+++ b/collections/_posts/2022-07-12-update-your-strapi-cms-with-your-own-favicon.md
@@ -0,0 +1,50 @@
+---
+layout: post
+date: 2022-07-12
+author: Charles
+banner_image: /uploads/code_eff0ff4f77.webp
+banner_image_alt: Macguyvering Strapi
+title: Update your Strapi CMS with your own Favicon
+sub_heading: How-to replace the favicon
+tags: Strapi, Configure, Contribute,
+category: How-to
+---
+ In this article, we will be replacing the Strapi favicon with your own favicon. This same process is similar to how we replace the login logo `AuthLogo` and menu logo with `MenuLogo`. For more details, please visit Strapi documentations example configuration. [Strapi Documents]
+
+> **Tip:** This same process may be used to replace the login logo `AuthLogo` and menu logo with `MenuLogo`.
+> For more details, please visit [Strapi Documents](https://docs.strapi.io/developer-docs/latest/development/admin-customization.html#logos)
+
+1. Create an extensions folder at:
+`src/admin/extensions/`
+
+2. Upload your favicon into:
+`src/admin/extensions/`
+
+3. Replace the **favicon.ico** at:
+`Strapi app root` with custom favicon.ico
+
+4. Update your `src/admin/app.js` with the following:
+
+```
+// path: src/admin/app.js
+
+import favicon from './extensions/favicon.png';
+
+export default {
+ config: {
+ // replace favicon with custom icon
+ head: {
+ favicon: favicon,
+ },
+ }
+}
+```
+5. Rebuild, run & revisit your Strapi app
+ `yarn build && yarn develop`
+
+> **Note:**
+> Be certain that the cached favicon is cleared. It can be cached in your web browser and also with your domain management
+> tool like Cloudflare's CDN
+
+#### References
+[Strapi Documents](https://docs.strapi.io/developer-docs/latest/development/admin-customization.html#configuration-options)
diff --git a/collections/_products/2016-11-03-paper.md b/collections/_products/2016-11-03-paper.md
deleted file mode 100644
index a522d1e..0000000
--- a/collections/_products/2016-11-03-paper.md
+++ /dev/null
@@ -1,22 +0,0 @@
----
-layout: shop_single
-
-featured: 0 #starred, featured or simple for product pages display sections.
-
-author: Charles #case sensitive, please use capitalization for names.
-
-title: Our Most Recent Rest Product Title
-sub_heading: Maecenas faucibus mollis interdum. Vivamus sagittis lacus
-
-banner_image: "/assets/images/pic03.jpg" #Size of banner_image 840x341
-banner_image_alt: "image alt"
-
-category: Product
-tag: Electronics
-
----
-Maecenas faucibus mollis interdum. Vivamus sagittis lacus vel augue laoreet rutrum faucibus dolor auctor. Etiam porta sem malesuada magna mollis euismod.
-
-Cum sociis natoque penatibus et magnis dis parturient montes, nascetur ridiculus mus. Integer posuere erat a ante venenatis dapibus posuere velit aliquet. Maecenas faucibus mollis interdum. Vivamus sagittis lacus vel augue laoreet rutrum faucibus dolor auctor. Etiam porta sem malesuada magna mollis euismod.
-
-Integer posuere erat a ante venenatis dapibus posuere velit aliquet. Maecenas faucibus mollis interdum. Vivamus sagittis lacus vel augue laoreet rutrum faucibus dolor auctor. Etiam porta sem malesuada magna mollis euismod.
diff --git a/collections/_products/2018-02-03-example.md b/collections/_products/2018-02-03-example.md
deleted file mode 100644
index eee90c3..0000000
--- a/collections/_products/2018-02-03-example.md
+++ /dev/null
@@ -1,23 +0,0 @@
----
-layout: shop_single
-
-featured: true #starred, featured or simple for product pages display sections.
-
-
-author: Charles #case sensitive, please use capitalization for names.
-
-title: Our Most Recent Rest Product Title
-sub_heading: Maecenas faucibus mollis interdum. Vivamus sagittis lacus
-
-banner_image: "/assets/images/pic02.jpg" #Size of banner_image 840x341
-banner_image_alt: "image alt"
-
-category: Product
-tag: Electronics
-
----
-Maecenas faucibus mollis interdum. Vivamus sagittis lacus vel augue laoreet rutrum faucibus dolor auctor. Etiam porta sem malesuada magna mollis euismod.
-
-Cum sociis natoque penatibus et magnis dis parturient montes, nascetur ridiculus mus. Integer posuere erat a ante venenatis dapibus posuere velit aliquet. Maecenas faucibus mollis interdum. Vivamus sagittis lacus vel augue laoreet rutrum faucibus dolor auctor. Etiam porta sem malesuada magna mollis euismod.
-
-Integer posuere erat a ante venenatis dapibus posuere velit aliquet. Maecenas faucibus mollis interdum. Vivamus sagittis lacus vel augue laoreet rutrum faucibus dolor auctor. Etiam porta sem malesuada magna mollis euismod.
diff --git a/collections/_products/2018-12-03-towel.md b/collections/_products/2018-12-03-towel.md
deleted file mode 100644
index a522d1e..0000000
--- a/collections/_products/2018-12-03-towel.md
+++ /dev/null
@@ -1,22 +0,0 @@
----
-layout: shop_single
-
-featured: 0 #starred, featured or simple for product pages display sections.
-
-author: Charles #case sensitive, please use capitalization for names.
-
-title: Our Most Recent Rest Product Title
-sub_heading: Maecenas faucibus mollis interdum. Vivamus sagittis lacus
-
-banner_image: "/assets/images/pic03.jpg" #Size of banner_image 840x341
-banner_image_alt: "image alt"
-
-category: Product
-tag: Electronics
-
----
-Maecenas faucibus mollis interdum. Vivamus sagittis lacus vel augue laoreet rutrum faucibus dolor auctor. Etiam porta sem malesuada magna mollis euismod.
-
-Cum sociis natoque penatibus et magnis dis parturient montes, nascetur ridiculus mus. Integer posuere erat a ante venenatis dapibus posuere velit aliquet. Maecenas faucibus mollis interdum. Vivamus sagittis lacus vel augue laoreet rutrum faucibus dolor auctor. Etiam porta sem malesuada magna mollis euismod.
-
-Integer posuere erat a ante venenatis dapibus posuere velit aliquet. Maecenas faucibus mollis interdum. Vivamus sagittis lacus vel augue laoreet rutrum faucibus dolor auctor. Etiam porta sem malesuada magna mollis euismod.
diff --git a/collections/_products/2019-07-03-tea.md b/collections/_products/2019-07-03-tea.md
deleted file mode 100644
index e509c07..0000000
--- a/collections/_products/2019-07-03-tea.md
+++ /dev/null
@@ -1,22 +0,0 @@
----
-layout: shop_single
-
-featured: 0 #starred, featured or simple for product pages display sections.
-
-author: Charles #case sensitive, please use capitalization for names.
-
-title: Our Most Recent Rest Product Title
-sub_heading: Maecenas faucibus mollis interdum. Vivamus sagittis lacus
-
-banner_image: "/assets/images/pic01.jpg" #Size of banner_image 840x341
-banner_image_alt: "image alt"
-
-category: Product
-tag: Electronics
-
----
-Maecenas faucibus mollis interdum. Vivamus sagittis lacus vel augue laoreet rutrum faucibus dolor auctor. Etiam porta sem malesuada magna mollis euismod.
-
-Cum sociis natoque penatibus et magnis dis parturient montes, nascetur ridiculus mus. Integer posuere erat a ante venenatis dapibus posuere velit aliquet. Maecenas faucibus mollis interdum. Vivamus sagittis lacus vel augue laoreet rutrum faucibus dolor auctor. Etiam porta sem malesuada magna mollis euismod.
-
-Integer posuere erat a ante venenatis dapibus posuere velit aliquet. Maecenas faucibus mollis interdum. Vivamus sagittis lacus vel augue laoreet rutrum faucibus dolor auctor. Etiam porta sem malesuada magna mollis euismod.
diff --git a/collections/_products/2019-10-03-rocket.md b/collections/_products/2019-10-03-rocket.md
deleted file mode 100644
index e509c07..0000000
--- a/collections/_products/2019-10-03-rocket.md
+++ /dev/null
@@ -1,22 +0,0 @@
----
-layout: shop_single
-
-featured: 0 #starred, featured or simple for product pages display sections.
-
-author: Charles #case sensitive, please use capitalization for names.
-
-title: Our Most Recent Rest Product Title
-sub_heading: Maecenas faucibus mollis interdum. Vivamus sagittis lacus
-
-banner_image: "/assets/images/pic01.jpg" #Size of banner_image 840x341
-banner_image_alt: "image alt"
-
-category: Product
-tag: Electronics
-
----
-Maecenas faucibus mollis interdum. Vivamus sagittis lacus vel augue laoreet rutrum faucibus dolor auctor. Etiam porta sem malesuada magna mollis euismod.
-
-Cum sociis natoque penatibus et magnis dis parturient montes, nascetur ridiculus mus. Integer posuere erat a ante venenatis dapibus posuere velit aliquet. Maecenas faucibus mollis interdum. Vivamus sagittis lacus vel augue laoreet rutrum faucibus dolor auctor. Etiam porta sem malesuada magna mollis euismod.
-
-Integer posuere erat a ante venenatis dapibus posuere velit aliquet. Maecenas faucibus mollis interdum. Vivamus sagittis lacus vel augue laoreet rutrum faucibus dolor auctor. Etiam porta sem malesuada magna mollis euismod.
diff --git a/collections/_products/2020-01-03-phone.md b/collections/_products/2020-01-03-phone.md
deleted file mode 100644
index 178d018..0000000
--- a/collections/_products/2020-01-03-phone.md
+++ /dev/null
@@ -1,22 +0,0 @@
----
-layout: shop_single
-
-featured: 0 #starred, featured or simple for product pages display sections.
-
-author: Charles #case sensitive, please use capitalization for names.
-
-title: Our Most Recent Featured Product Title
-sub_heading: Maecenas faucibus mollis interdum. Vivamus sagittis lacus
-
-banner_image: "/assets/images/pic01.jpg" #Size of banner_image 840x341
-banner_image_alt: "image alt"
-
-category: Product
-tag: Electronics
-
----
-Maecenas faucibus mollis interdum. Vivamus sagittis lacus vel augue laoreet rutrum faucibus dolor auctor. Etiam porta sem malesuada magna mollis euismod.
-
-Cum sociis natoque penatibus et magnis dis parturient montes, nascetur ridiculus mus. Integer posuere erat a ante venenatis dapibus posuere velit aliquet. Maecenas faucibus mollis interdum. Vivamus sagittis lacus vel augue laoreet rutrum faucibus dolor auctor. Etiam porta sem malesuada magna mollis euismod.
-
-Integer posuere erat a ante venenatis dapibus posuere velit aliquet. Maecenas faucibus mollis interdum. Vivamus sagittis lacus vel augue laoreet rutrum faucibus dolor auctor. Etiam porta sem malesuada magna mollis euismod.
diff --git a/collections/_products/2020-02-07-ball.md b/collections/_products/2020-02-07-ball.md
deleted file mode 100644
index 178d018..0000000
--- a/collections/_products/2020-02-07-ball.md
+++ /dev/null
@@ -1,22 +0,0 @@
----
-layout: shop_single
-
-featured: 0 #starred, featured or simple for product pages display sections.
-
-author: Charles #case sensitive, please use capitalization for names.
-
-title: Our Most Recent Featured Product Title
-sub_heading: Maecenas faucibus mollis interdum. Vivamus sagittis lacus
-
-banner_image: "/assets/images/pic01.jpg" #Size of banner_image 840x341
-banner_image_alt: "image alt"
-
-category: Product
-tag: Electronics
-
----
-Maecenas faucibus mollis interdum. Vivamus sagittis lacus vel augue laoreet rutrum faucibus dolor auctor. Etiam porta sem malesuada magna mollis euismod.
-
-Cum sociis natoque penatibus et magnis dis parturient montes, nascetur ridiculus mus. Integer posuere erat a ante venenatis dapibus posuere velit aliquet. Maecenas faucibus mollis interdum. Vivamus sagittis lacus vel augue laoreet rutrum faucibus dolor auctor. Etiam porta sem malesuada magna mollis euismod.
-
-Integer posuere erat a ante venenatis dapibus posuere velit aliquet. Maecenas faucibus mollis interdum. Vivamus sagittis lacus vel augue laoreet rutrum faucibus dolor auctor. Etiam porta sem malesuada magna mollis euismod.
diff --git a/collections/_products/2020-02-15-block.md b/collections/_products/2020-02-15-block.md
deleted file mode 100644
index 178d018..0000000
--- a/collections/_products/2020-02-15-block.md
+++ /dev/null
@@ -1,22 +0,0 @@
----
-layout: shop_single
-
-featured: 0 #starred, featured or simple for product pages display sections.
-
-author: Charles #case sensitive, please use capitalization for names.
-
-title: Our Most Recent Featured Product Title
-sub_heading: Maecenas faucibus mollis interdum. Vivamus sagittis lacus
-
-banner_image: "/assets/images/pic01.jpg" #Size of banner_image 840x341
-banner_image_alt: "image alt"
-
-category: Product
-tag: Electronics
-
----
-Maecenas faucibus mollis interdum. Vivamus sagittis lacus vel augue laoreet rutrum faucibus dolor auctor. Etiam porta sem malesuada magna mollis euismod.
-
-Cum sociis natoque penatibus et magnis dis parturient montes, nascetur ridiculus mus. Integer posuere erat a ante venenatis dapibus posuere velit aliquet. Maecenas faucibus mollis interdum. Vivamus sagittis lacus vel augue laoreet rutrum faucibus dolor auctor. Etiam porta sem malesuada magna mollis euismod.
-
-Integer posuere erat a ante venenatis dapibus posuere velit aliquet. Maecenas faucibus mollis interdum. Vivamus sagittis lacus vel augue laoreet rutrum faucibus dolor auctor. Etiam porta sem malesuada magna mollis euismod.
diff --git a/collections/_products/2020-05-03-hoop.md b/collections/_products/2020-05-03-hoop.md
deleted file mode 100644
index 178d018..0000000
--- a/collections/_products/2020-05-03-hoop.md
+++ /dev/null
@@ -1,22 +0,0 @@
----
-layout: shop_single
-
-featured: 0 #starred, featured or simple for product pages display sections.
-
-author: Charles #case sensitive, please use capitalization for names.
-
-title: Our Most Recent Featured Product Title
-sub_heading: Maecenas faucibus mollis interdum. Vivamus sagittis lacus
-
-banner_image: "/assets/images/pic01.jpg" #Size of banner_image 840x341
-banner_image_alt: "image alt"
-
-category: Product
-tag: Electronics
-
----
-Maecenas faucibus mollis interdum. Vivamus sagittis lacus vel augue laoreet rutrum faucibus dolor auctor. Etiam porta sem malesuada magna mollis euismod.
-
-Cum sociis natoque penatibus et magnis dis parturient montes, nascetur ridiculus mus. Integer posuere erat a ante venenatis dapibus posuere velit aliquet. Maecenas faucibus mollis interdum. Vivamus sagittis lacus vel augue laoreet rutrum faucibus dolor auctor. Etiam porta sem malesuada magna mollis euismod.
-
-Integer posuere erat a ante venenatis dapibus posuere velit aliquet. Maecenas faucibus mollis interdum. Vivamus sagittis lacus vel augue laoreet rutrum faucibus dolor auctor. Etiam porta sem malesuada magna mollis euismod.
diff --git a/collections/_products/2020-06-03-cup.md b/collections/_products/2020-06-03-cup.md
deleted file mode 100644
index 2d6038c..0000000
--- a/collections/_products/2020-06-03-cup.md
+++ /dev/null
@@ -1,20 +0,0 @@
----
-layout: shop_single
-
-featured: 0 #starred, featured or simple for product pages display sections.
-
-author: Charles #case sensitive, please use capitalization for names.
-
-title: Product Title
-sub_heading: Maecenas faucibus mollis interdum. Vivamus sagittis lacus
-
-banner_image: "/assets/images/andy-holmes-EOAKUQcsFIU-unsplash.jpg" #Size of banner_image 840x341
-banner_image_alt: "image alt"
-
-category: Product
-tag: Electronics
----
-Maecenas faucibus mollis interdum. Vivamus sagittis lacus vel augue laoreet rutrum faucibus dolor auctor. Etiam porta sem malesuada magna mollis euismod.
-Cum sociis natoque penatibus et magnis dis parturient montes, nascetur ridiculus mus. Integer posuere erat a ante venenatis dapibus posuere velit aliquet. Maecenas faucibus mollis interdum. Vivamus sagittis lacus vel augue laoreet rutrum faucibus dolor auctor. Etiam porta sem malesuada magna mollis euismod.
-
-Integer posuere erat a ante venenatis dapibus posuere velit aliquet. Maecenas faucibus mollis interdum. Vivamus sagittis lacus vel augue laoreet rutrum faucibus dolor auctor. Etiam porta sem malesuada magna mollis euismod.
diff --git a/docker-compose.yml b/docker-compose.yml
index d2f8d0b..a6051be 100644
--- a/docker-compose.yml
+++ b/docker-compose.yml
@@ -73,5 +73,5 @@ services:
ports:
- 4000:4000
environment:
- - STRAPI_TOKEN=$STRAPI_TOKEN
+ - API_TOKEN=$API_TOKEN
command: jekyll serve --lsi --watch --verbose --trace
diff --git a/docs/artwork/logos/logo-blur/logo-bg/black-bg/apple-touch-icon.png b/docs/artwork/logos/logo-blur/logo-bg/black-bg/apple-touch-icon.png
new file mode 100644
index 0000000..2952187
Binary files /dev/null and b/docs/artwork/logos/logo-blur/logo-bg/black-bg/apple-touch-icon.png differ
diff --git a/docs/artwork/logos/logo-blur/logo-bg/black-bg/favicon.ico b/docs/artwork/logos/logo-blur/logo-bg/black-bg/favicon.ico
new file mode 100644
index 0000000..b0648f4
Binary files /dev/null and b/docs/artwork/logos/logo-blur/logo-bg/black-bg/favicon.ico differ
diff --git a/docs/artwork/logos/logo-blur/logo-bg/black-bg/favicon.png b/docs/artwork/logos/logo-blur/logo-bg/black-bg/favicon.png
new file mode 100644
index 0000000..2952187
Binary files /dev/null and b/docs/artwork/logos/logo-blur/logo-bg/black-bg/favicon.png differ
diff --git a/assets/icons/ST_50x64ico.svg b/docs/artwork/logos/logo-blur/logo-bg/black-bg/favicon.svg
similarity index 84%
rename from assets/icons/ST_50x64ico.svg
rename to docs/artwork/logos/logo-blur/logo-bg/black-bg/favicon.svg
index 4d949a5..bb11699 100644
--- a/assets/icons/ST_50x64ico.svg
+++ b/docs/artwork/logos/logo-blur/logo-bg/black-bg/favicon.svg
@@ -5,7 +5,7 @@
viewBox="0 0 29.828614 38.369174"
version="1.1"
id="svg1895"
- inkscape:export-filename="../../../../../../../../../run/user/1000/gvfs/google-drive:host=gmail.com,user=sharpetronics/0AJONyYjFZQTJUk9PVA/1_jtkrLWhWz9fEuLXWP98AivaU9-4j89t/1eb5h_xIdCA9Bk6dGkZnEIfzmBCIsJSCC/1k8F-G9zqHicOUxfRaDk3FPE-ZSPUY3WC/svg/st_logo50x64ico.svg"
+ inkscape:export-filename="../../../../../../../Pictures/st_apple-touch-icon.png"
inkscape:export-xdpi="49.383881"
inkscape:export-ydpi="49.383881"
inkscape:version="1.2 (dc2aedaf03, 2022-05-15)"
@@ -40,9 +40,9 @@
borderopacity="1.0"
inkscape:pageopacity="0"
inkscape:pageshadow="2"
- inkscape:zoom="2.8284271"
- inkscape:cx="-8.131728"
- inkscape:cy="135.05739"
+ inkscape:zoom="2"
+ inkscape:cx="515.75"
+ inkscape:cy="69.5"
inkscape:document-units="px"
inkscape:current-layer="svg1895"
inkscape:document-rotation="0"
@@ -89,21 +89,25 @@
id="layer2"
inkscape:label="Layer 2 Gray"
style="display:inline"
- transform="translate(-30.681616,2.6221575)">
+ transform="translate(-30.254351,2.5033373)">
+ ry="18.622572"
+ inkscape:export-filename="../../../../../../../Pictures/logo-cover/logo.svg"
+ inkscape:export-xdpi="106.44142"
+ inkscape:export-ydpi="106.44142" />
+ transform="matrix(1.5609103,0,0,1.5609103,5.2355727,6.8216601)"
+ inkscape:export-xdpi="106.44142"
+ inkscape:export-ydpi="106.44142"
+ style="display:inline;fill:none;stroke:#ffffff;stroke-width:2.20358;stroke-dasharray:none;stroke-opacity:0.99693"
+ inkscape:export-filename="../../../../../../../Pictures/logo-cover/logo.png">
+ inkscape:path-effect="#path-effect1766"
+ inkscape:export-filename="../icons/ST_50x64ico.svg"
+ inkscape:export-xdpi="49.383881"
+ inkscape:export-ydpi="49.383881" />
diff --git a/docs/artwork/logos/logo-blur/logo-bg/black-bg/logo.png b/docs/artwork/logos/logo-blur/logo-bg/black-bg/logo.png
new file mode 100644
index 0000000..9466b01
Binary files /dev/null and b/docs/artwork/logos/logo-blur/logo-bg/black-bg/logo.png differ
diff --git a/docs/artwork/logos/logo-blur/logo-bg/black-bg/logo.svg b/docs/artwork/logos/logo-blur/logo-bg/black-bg/logo.svg
new file mode 100644
index 0000000..8800b4c
--- /dev/null
+++ b/docs/artwork/logos/logo-blur/logo-bg/black-bg/logo.svg
@@ -0,0 +1,66 @@
+
+
diff --git a/docs/artwork/logos/logo-blur/logo-bg/white-bg/apple-touch-icon.png b/docs/artwork/logos/logo-blur/logo-bg/white-bg/apple-touch-icon.png
new file mode 100644
index 0000000..52a9653
Binary files /dev/null and b/docs/artwork/logos/logo-blur/logo-bg/white-bg/apple-touch-icon.png differ
diff --git a/docs/artwork/logos/logo-blur/logo-bg/white-bg/favicon.png b/docs/artwork/logos/logo-blur/logo-bg/white-bg/favicon.png
new file mode 100644
index 0000000..52a9653
Binary files /dev/null and b/docs/artwork/logos/logo-blur/logo-bg/white-bg/favicon.png differ
diff --git a/docs/artwork/logos/logo-blur/logo-bg/white-bg/favicon.svg b/docs/artwork/logos/logo-blur/logo-bg/white-bg/favicon.svg
new file mode 100644
index 0000000..e9a9ede
--- /dev/null
+++ b/docs/artwork/logos/logo-blur/logo-bg/white-bg/favicon.svg
@@ -0,0 +1,222 @@
+
+
diff --git a/docs/artwork/logos/logo-blur/logo-bg/white-bg/logo.png b/docs/artwork/logos/logo-blur/logo-bg/white-bg/logo.png
new file mode 100644
index 0000000..52a9653
Binary files /dev/null and b/docs/artwork/logos/logo-blur/logo-bg/white-bg/logo.png differ
diff --git a/docs/artwork/logos/logo-blur/logo-bg/white-bg/logo.svg b/docs/artwork/logos/logo-blur/logo-bg/white-bg/logo.svg
new file mode 100644
index 0000000..1582f80
--- /dev/null
+++ b/docs/artwork/logos/logo-blur/logo-bg/white-bg/logo.svg
@@ -0,0 +1,225 @@
+
+
diff --git a/docs/artwork/logos/logo-blur/logo-black/logo.png b/docs/artwork/logos/logo-blur/logo-black/logo.png
new file mode 100644
index 0000000..cca9b8a
Binary files /dev/null and b/docs/artwork/logos/logo-blur/logo-black/logo.png differ
diff --git a/docs/artwork/logos/logo-blur/logo-black/logo.svg b/docs/artwork/logos/logo-blur/logo-black/logo.svg
new file mode 100644
index 0000000..dc73db4
--- /dev/null
+++ b/docs/artwork/logos/logo-blur/logo-black/logo.svg
@@ -0,0 +1,54 @@
+
+
diff --git a/docs/artwork/logos/logo-blur/logo-white/apple-touch-icon.png b/docs/artwork/logos/logo-blur/logo-white/apple-touch-icon.png
new file mode 100644
index 0000000..5733e19
Binary files /dev/null and b/docs/artwork/logos/logo-blur/logo-white/apple-touch-icon.png differ
diff --git a/docs/artwork/logos/logo-blur/logo-white/favicon.png b/docs/artwork/logos/logo-blur/logo-white/favicon.png
new file mode 100644
index 0000000..5733e19
Binary files /dev/null and b/docs/artwork/logos/logo-blur/logo-white/favicon.png differ
diff --git a/docs/artwork/logos/logo-blur/logo-white/favicon.svg b/docs/artwork/logos/logo-blur/logo-white/favicon.svg
new file mode 100644
index 0000000..887b90c
--- /dev/null
+++ b/docs/artwork/logos/logo-blur/logo-white/favicon.svg
@@ -0,0 +1,124 @@
+
+
diff --git a/docs/artwork/logos/logo-blur/logo-white/logo.png b/docs/artwork/logos/logo-blur/logo-white/logo.png
new file mode 100644
index 0000000..f6705ba
Binary files /dev/null and b/docs/artwork/logos/logo-blur/logo-white/logo.png differ
diff --git a/docs/artwork/logos/logo-blur/logo-white/logo.svg b/docs/artwork/logos/logo-blur/logo-white/logo.svg
new file mode 100644
index 0000000..405e465
--- /dev/null
+++ b/docs/artwork/logos/logo-blur/logo-white/logo.svg
@@ -0,0 +1,124 @@
+
+
diff --git a/docs/artwork/logos/logo-detail/favicon.png b/docs/artwork/logos/logo-detail/favicon.png
new file mode 100644
index 0000000..2be3d01
Binary files /dev/null and b/docs/artwork/logos/logo-detail/favicon.png differ
diff --git a/docs/artwork/logos/logo-detail/favicon.svg b/docs/artwork/logos/logo-detail/favicon.svg
new file mode 100644
index 0000000..463d388
--- /dev/null
+++ b/docs/artwork/logos/logo-detail/favicon.svg
@@ -0,0 +1,829 @@
+
+
diff --git a/docs/artwork/logos/logo-detail/logo-black.png b/docs/artwork/logos/logo-detail/logo-black.png
new file mode 100644
index 0000000..af0ac9d
Binary files /dev/null and b/docs/artwork/logos/logo-detail/logo-black.png differ
diff --git a/docs/artwork/logos/logo-detail/logo-black.svg b/docs/artwork/logos/logo-detail/logo-black.svg
new file mode 100644
index 0000000..bd0ac3e
--- /dev/null
+++ b/docs/artwork/logos/logo-detail/logo-black.svg
@@ -0,0 +1,829 @@
+
+
diff --git a/docs/artwork/logos/logo-detail/logo-grey.png b/docs/artwork/logos/logo-detail/logo-grey.png
new file mode 100644
index 0000000..970bfa3
Binary files /dev/null and b/docs/artwork/logos/logo-detail/logo-grey.png differ
diff --git a/docs/artwork/logos/logo-detail/logo-white.png b/docs/artwork/logos/logo-detail/logo-white.png
new file mode 100644
index 0000000..ad3ff4f
Binary files /dev/null and b/docs/artwork/logos/logo-detail/logo-white.png differ
diff --git a/docs/artwork/logos/logo-detail/logo-white.svg b/docs/artwork/logos/logo-detail/logo-white.svg
new file mode 100644
index 0000000..3718261
--- /dev/null
+++ b/docs/artwork/logos/logo-detail/logo-white.svg
@@ -0,0 +1,829 @@
+
+
diff --git a/docs/artwork/logos/logo-detail/logo.svg b/docs/artwork/logos/logo-detail/logo.svg
new file mode 100644
index 0000000..e04edba
--- /dev/null
+++ b/docs/artwork/logos/logo-detail/logo.svg
@@ -0,0 +1,197 @@
+
+
diff --git a/humans.txt b/humans.txt
index 0480a2e..5192954 100644
--- a/humans.txt
+++ b/humans.txt
@@ -6,12 +6,12 @@ ____ __ ______
\/_____/\/_/\/_/\/__/\/_/\/_/ \ \ \/ \/____/ \/_/\/_/\/___/ \/_/\/_/\/_/\/____/\/___/
\ \_\
\/_/
-Owner: @csharpe_me (Charles Sharpe)
-Designer: @ajlkn, @csharpe_me
-Developer: @ajlkn, @csharpe_me
-Editor: @csharpe_me
-Engineering: @csharpe_me
-Quality Assurance: @csharpe_me
+Owner: @odinzu_me (Charles Sharpe)
+Designer: @ajlkn, @odinzu_me
+Developer: @ajlkn, @odinzu_me
+Editor: @odinzu_me
+Engineering: @odinzu_me
+Quality Assurance: @odinzu_me
The team, technology & tools behind this site.
@@ -19,7 +19,7 @@ The team, technology & tools behind this site.
SHARPETRONICS TEAM
--------
-Made with Cosmic love in West Virginia.
+Made with Cosmic LOVE in West Virginia.
Charles Sharpe (@csharpe_me)
csharpe.me
@@ -32,12 +32,18 @@ SPECIAL THANKS
@ajlkn
aj.lkn.io
+@strapijs
+strapi.io/
+
TECHNOLOGY
----------
Jekyll - Static site generator
jekyllrb.com
+Strapi - Headless Javascript CMS
+strapi.io/
+
Jekyll Plugins - Plugins created by Jekyll community
jekyll-menus, jekyll-paginate-v2
@@ -81,9 +87,6 @@ certbot.eff.org
Atom - Text editor
atom.io
-Figma - UI/UX collaboration editor
-figma.com
-
Drone CI - Automated software build and test.
drone.io
diff --git a/pages/legal/index.html b/pages/legal/index.html
deleted file mode 100644
index dd5313e..0000000
--- a/pages/legal/index.html
+++ /dev/null
@@ -1,11 +0,0 @@
----
-layout: journals
-title: Legal
-sub_title: A collection of legal documents.
-permalink: /legal/
-
-pagination:
- enabled: true
- collection: legal
- permalink: '/legal/:num/'
----
diff --git a/pages/journal/index.html b/pages/posts/index.html
similarity index 90%
rename from pages/journal/index.html
rename to pages/posts/index.html
index 59d9fa5..7196bec 100644
--- a/pages/journal/index.html
+++ b/pages/posts/index.html
@@ -1,5 +1,5 @@
---
-layout: journals
+layout: posts
title: Journal
sub_title: A collection of articles about technology.
permalink: /blog/
diff --git a/pages/products/index.html b/pages/products/index.html
index b50c813..73cdbc8 100644
--- a/pages/products/index.html
+++ b/pages/products/index.html
@@ -1,5 +1,5 @@
---
-layout: shop
+layout: products
title: Shop
sub_title: A collection of fine products.
permalink: /products/
diff --git a/uploads/2022/code.webp b/uploads/2022/code.webp
new file mode 100644
index 0000000..10500bb
Binary files /dev/null and b/uploads/2022/code.webp differ
diff --git a/uploads/c3po_a_friend_in_need_74a237a413.webp b/uploads/c3po_a_friend_in_need_74a237a413.webp
new file mode 100644
index 0000000..29f8930
Binary files /dev/null and b/uploads/c3po_a_friend_in_need_74a237a413.webp differ
diff --git a/uploads/code_eff0ff4f77.webp b/uploads/code_eff0ff4f77.webp
new file mode 100644
index 0000000..10500bb
Binary files /dev/null and b/uploads/code_eff0ff4f77.webp differ
diff --git a/uploads/decentralized_385bd5a376.webp b/uploads/decentralized_385bd5a376.webp
new file mode 100644
index 0000000..471a0c8
Binary files /dev/null and b/uploads/decentralized_385bd5a376.webp differ
diff --git a/uploads/ejabberd_in_the_jungle_8a9f00e089.webp b/uploads/ejabberd_in_the_jungle_8a9f00e089.webp
new file mode 100644
index 0000000..5afe7a3
Binary files /dev/null and b/uploads/ejabberd_in_the_jungle_8a9f00e089.webp differ
diff --git a/uploads/linux_admin_0def8999f2.webp b/uploads/linux_admin_0def8999f2.webp
new file mode 100644
index 0000000..2276519
Binary files /dev/null and b/uploads/linux_admin_0def8999f2.webp differ
diff --git a/uploads/pillars_face_art_973bf824dd.webp b/uploads/pillars_face_art_973bf824dd.webp
new file mode 100644
index 0000000..9e9b849
Binary files /dev/null and b/uploads/pillars_face_art_973bf824dd.webp differ
diff --git a/uploads/quantum_qt5_95dcd080f1.webp b/uploads/quantum_qt5_95dcd080f1.webp
new file mode 100644
index 0000000..c833f0e
Binary files /dev/null and b/uploads/quantum_qt5_95dcd080f1.webp differ
diff --git a/uploads/r2d2_skywalker_c84e2364fe.webp b/uploads/r2d2_skywalker_c84e2364fe.webp
new file mode 100644
index 0000000..91e7a9f
Binary files /dev/null and b/uploads/r2d2_skywalker_c84e2364fe.webp differ
diff --git a/uploads/santa_rudolph_unsplash_0ae8e3d5a7.webp b/uploads/santa_rudolph_unsplash_0ae8e3d5a7.webp
new file mode 100644
index 0000000..6a7b9ad
Binary files /dev/null and b/uploads/santa_rudolph_unsplash_0ae8e3d5a7.webp differ
diff --git a/uploads/terms_48bec2a697.webp b/uploads/terms_48bec2a697.webp
new file mode 100644
index 0000000..bde310d
Binary files /dev/null and b/uploads/terms_48bec2a697.webp differ
diff --git a/uploads/wv_seneca_rocks_sky_0d5928baa9.webp b/uploads/wv_seneca_rocks_sky_0d5928baa9.webp
new file mode 100644
index 0000000..748d486
Binary files /dev/null and b/uploads/wv_seneca_rocks_sky_0d5928baa9.webp differ