diff --git a/README.md b/README.md index e42a56f..82ad73a 100644 --- a/README.md +++ b/README.md @@ -1,3 +1,21 @@ # BoxyBSD -BoxyBSD.com website \ No newline at end of file + +




+ + + +## Table of Content +- [BoxyBSD](#boxybsd) + - [Table of Content](#table-of-content) + - [General](#general) + - [Content](#content) + +## General +BoxyBSD is a free BSD-focused hosting solution and service for the community. At BoxyBSD, we believe in the power of open-source technology and the principles of the BSD and open-source communities, which prioritize providing free and open solutions to all. + +Our project is driven by a dedication to fostering education, exploration, and experimentation within the realm of BSD-based systems. We offer a range of free services, including virtual machine (VM) hosting, shell hosting, email hosting, and web hosting, all built on BSD-focused solutions. Therefore, BoxyBSD is fully a non-profit project. + + +## Content +This repository contains everything around BoxyBSD.com. It holds the content of the website but also the utilities to create the resource objects. \ No newline at end of file diff --git a/website/_assets/css/dark.css b/website/_assets/css/dark.css new file mode 100644 index 0000000..31222a2 --- /dev/null +++ b/website/_assets/css/dark.css @@ -0,0 +1,47 @@ +body { + background-color: #000000; +} + +img { + max-width: 100%; + height: auto; + } + + a:link, a:visited { + color: #d3d3d3; + text-decoration: underline dotted; + } + + a:hover, a:active { + color: #d3d3d3; + text-decoration: underline dotted; + } + + header section, footer section, manpage { + color: #d3d3d3; + font-size: 14px; + font-family: "Courier New", monospace; + margin-left: 0%; + max-width: 40em; + } + + main, nav section, name section { + color: #d3d3d3; + max-width: 60em; + font-size: 14px; + font-family: "Courier New", monospace; + margin-left: 5%; + margin-right: auto; + padding: 0 0.5em; + } + + code { + color: #d3d3d3; + max-width: 60em; + font-size: 14px; + font-style: italic; + font-family: "Courier New", monospace; + margin-left: 10%; + margin-right: auto; + padding: 0 0.5em; + } diff --git a/website/_assets/css/grey.css b/website/_assets/css/grey.css new file mode 100644 index 0000000..2ed2045 --- /dev/null +++ b/website/_assets/css/grey.css @@ -0,0 +1,47 @@ +body { + background-color: #3d3d3d; +} + +img { + max-width: 100%; + height: auto; + } + + a:link, a:visited { + color: #d3d3d3; + text-decoration: underline dotted; + } + + a:hover, a:active { + color: #d3d3d3; + text-decoration: underline dotted; + } + + header section, footer section, manpage { + color: #d3d3d3; + font-size: 14px; + font-family: "Courier New", monospace; + margin-left: 0%; + max-width: 40em; + } + + main, nav section, name section { + color: #d3d3d3; + max-width: 60em; + font-size: 14px; + font-family: "Courier New", monospace; + margin-left: 5%; + margin-right: auto; + padding: 0 0.5em; + } + + code { + color: #d3d3d3; + max-width: 60em; + font-size: 14px; + font-style: italic; + font-family: "Courier New", monospace; + margin-left: 10%; + margin-right: auto; + padding: 0 0.5em; + } diff --git a/website/_assets/css/grey_blue.css b/website/_assets/css/grey_blue.css new file mode 100644 index 0000000..cfee0ce --- /dev/null +++ b/website/_assets/css/grey_blue.css @@ -0,0 +1,47 @@ +body { + background-color: #3d3d3d; +} + +img { + max-width: 100%; + height: auto; + } + + a:link, a:visited { + color: #6082B6; + text-decoration: underline dotted; + } + + a:hover, a:active { + color: #6082B6; + text-decoration: underline dotted; + } + + header section, footer section, manpage { + color: #6082B6; + font-size: 14px; + font-family: "Courier New", monospace; + margin-left: 0%; + max-width: 40em; + } + + main, nav section, name section { + color: #6082B6; + max-width: 60em; + font-size: 14px; + font-family: "Courier New", monospace; + margin-left: 5%; + margin-right: auto; + padding: 0 0.5em; + } + + code { + color: #6082B6; + max-width: 60em; + font-size: 14px; + font-style: italic; + font-family: "Courier New", monospace; + margin-left: 10%; + margin-right: auto; + padding: 0 0.5em; + } diff --git a/website/_assets/css/light.css b/website/_assets/css/light.css new file mode 100644 index 0000000..dae5bca --- /dev/null +++ b/website/_assets/css/light.css @@ -0,0 +1,40 @@ +img { + max-width: 100%; + height: auto; + } + + a:link, a:visited { + color: #6d6d6d; + text-decoration: none + } + + a:hover, a:active { + color: #6d6d6d; + text-decoration: underline + } + + header section, footer section, manpage { + font-size: 14px; + font-family: "Courier New", monospace; + margin-left: 0%; + max-width: 40em; + } + + main, nav section, name section { + max-width: 60em; + font-size: 14px; + font-family: "Courier New", monospace; + margin-left: 5%; + margin-right: auto; + padding: 0 0.5em; + } + + code { + max-width: 60em; + font-size: 14px; + font-style: italic; + font-family: "Courier New", monospace; + margin-left: 10%; + margin-right: auto; + padding: 0 0.5em; + } diff --git a/website/_assets/files/gpg.key b/website/_assets/files/gpg.key new file mode 100644 index 0000000..f92cd99 --- /dev/null +++ b/website/_assets/files/gpg.key @@ -0,0 +1,77 @@ +-----BEGIN PGP PUBLIC KEY BLOCK----- + +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 +=9+F9 +-----END PGP PUBLIC KEY BLOCK----- diff --git a/website/_assets/img/boxybsd.jpg b/website/_assets/img/boxybsd.jpg new file mode 100644 index 0000000..606b3cc Binary files /dev/null and b/website/_assets/img/boxybsd.jpg differ diff --git a/website/_assets/img/favicon.ico b/website/_assets/img/favicon.ico new file mode 100644 index 0000000..c453c91 Binary files /dev/null and b/website/_assets/img/favicon.ico differ diff --git a/website/_templates/feed.xml b/website/_templates/feed.xml new file mode 100644 index 0000000..09bca31 --- /dev/null +++ b/website/_templates/feed.xml @@ -0,0 +1,17 @@ + + + + +{{ title }} +{{ site_url }}/ +{{ description }} + + {{ logo_site }} + {{ title }} + {{ site_url }}/ + + +{{ content }} + + + diff --git a/website/_templates/item.html b/website/_templates/item.html new file mode 100644 index 0000000..93c5b90 --- /dev/null +++ b/website/_templates/item.html @@ -0,0 +1,5 @@ +
+{{ title }} ({{ date }}):
+{{ summary }} .... [read more] +
+
diff --git a/website/_templates/item.xml b/website/_templates/item.xml new file mode 100644 index 0000000..4df1310 --- /dev/null +++ b/website/_templates/item.xml @@ -0,0 +1,14 @@ + +{{ title }} +{{ site_url }}/{{ blog }}/{{ slug }}/ +{{ site_url }}/{{ blog }}/{{ slug }}/ + + +{{ summary }} ... +

+

Read More

+]]> +
+{{ rfc_2822_date }} +
diff --git a/website/_templates/list.html b/website/_templates/list.html new file mode 100644 index 0000000..37898f0 --- /dev/null +++ b/website/_templates/list.html @@ -0,0 +1,3 @@ +{{ title }} +

+{{ content }} diff --git a/website/_templates/page.html b/website/_templates/page.html new file mode 100644 index 0000000..e84c7fa --- /dev/null +++ b/website/_templates/page.html @@ -0,0 +1,80 @@ + + + + {{ title }} | {{ subtitle }} + + + + + + + + + + + + + + + + + + + + + + + + + + + + NAME
+
+ + +
+ + {{ name }} + +
+
+ + +
OPTIONS
+
+ + + + + +
CONTENT
+
+ +
+{{ content }} +
+ + + + + diff --git a/website/_templates/page_tags.html b/website/_templates/page_tags.html new file mode 100644 index 0000000..bab6586 --- /dev/null +++ b/website/_templates/page_tags.html @@ -0,0 +1,82 @@ + + + + {{ title }} | {{ subtitle }} + + + + + + + + + + + + + + + + + + + + + + + + + + + + NAME
+
+ + +
+ + {{ name }} + +
+
+ + +
OPTIONS
+
+ + + + + +
CONTENT
+
+ +
+{{ content }} +
+ + +
TAGS
+
+ +
+{{ keywords }} +
+ + + + + diff --git a/website/_templates/post.html b/website/_templates/post.html new file mode 100644 index 0000000..bdd941c --- /dev/null +++ b/website/_templates/post.html @@ -0,0 +1,4 @@ +
+{{ title }} ({{ date }}):
+{{ content }} +
diff --git a/website/blog.conf b/website/blog.conf new file mode 100644 index 0000000..199db79 --- /dev/null +++ b/website/blog.conf @@ -0,0 +1,31 @@ +[general] +name: BoxyBSD +description: BoxyBSD is a non-profit VM & service provider for the open-source community with a focus on BSD based Systems like FreeBSD, OpenBSD and NetBSD. BoxyBSD also provides additional services like webhosting, git, email and DNS solutions for open-source projects to give valuable things back to the community. BoxyBSD is a project of gyptazy. +keywords: boxybsd, gyptazy, hosting, free vm, free vms, freebsd, netbsd, openbsd, community, open-source, virtual machines, hosting, non-profit +keywords_show: meta +robots: index,follow +subtitle: BoxyBSD - BSD focused hosting +author: admin +copyright: BoxyBSD +preview_words: 150 +logo_site: https://boxybsd.com/boxybsd.jpg +logo_favicon: https://boxybsd.com/boxybsd.jpg +logo_apple_touch: https://boxybsd.com/boxybsd.jpg + +[social] +mastodon: https://mastodon.bsd.cafe/@BoxyBSD +twitter: @BoxyBSD +github: manpageblog + +[opengraph] +image_width: 800 +image_height: 375 + +[processing] +site_url: https://boxybsd.com +base_path: +assets: _assets +template_path: _templates +output_path: docroot +output_from_scratch: force +theme: dark diff --git a/website/content/_index.html b/website/content/_index.html new file mode 100644 index 0000000..6e8dd32 --- /dev/null +++ b/website/content/_index.html @@ -0,0 +1,21 @@ + + + + +Welcome +

+Welcome to BoxyBSD, your destination for free BSD-focused solutions and services for the community. At BoxyBSD, we believe in the power of open-source technology and the +principles of the BSD and open-source communities, which prioritize providing free and open solutions to all. +

+Our project is driven by a dedication to fostering education, exploration, and experimentation within the realm of BSD-based systems. We offer a range of free services, +including virtual machine (VM) hosting, email hosting, and web hosting, all built on BSD-focused solutions. Therefore, BoxyBSD is fully a non-profit project. +

+By providing these services at no cost, we aim to empower enthusiasts, students, and professionals to gain hands-on experience without the financial barriers typically +associated with setting up and managing virtual environments. Whether you're looking to delve into the intricacies of BSD systems, learn about system administration, +networking, or security practices, BoxyBSD provides a safe and controlled environment for your exploration. +

+In addition to our VM hosting services, we also offer secure email and web hosting solutions with state of the art technologies. +

+Join us at BoxyBSD and be part of a community committed to advancing knowledge, collaboration, and the principles of open-source technology. Experience the freedom +to learn, experiment, and innovate with BoxyBSD today. +

diff --git a/website/content/about.html b/website/content/about.html new file mode 100644 index 0000000..f8d47c7 --- /dev/null +++ b/website/content/about.html @@ -0,0 +1,16 @@ + + + +About +

+Like probably the most ones I started with Wordpress which is a pretty cool but also a very bloated software for a personal blog. +Running such a software requires multiple application with different dependencies, continuous updates and more resources on the +system to serve the whole content. Creating additional backups of the docroot and the database require additional time and efforts. +All of this is not really necessary when the content is more or less static and comments are deactivated or not used. A flat file +approach provides the optional possibility to run and keep everything in git. Generated HTML pages can easily be served even on +low resource systems. While this way of blogging mostly targets tech-enthusiasts that are already working on Unix-like systems the +idea was to provide a blog engine in a layout and theming of a Unix-like `man page` (manual page). Man pages always align to the +same formatting based on troff which make man pages look always the same. While man pages provide information of a cli command +the idea was to adapt this to a blog. A blog also provides information and especially when serving tech related content it makes +much sense to provide it in a similar way. This is the story of how manpageblog was born. +

diff --git a/website/content/abuse.html b/website/content/abuse.html new file mode 100644 index 0000000..d3d6449 --- /dev/null +++ b/website/content/abuse.html @@ -0,0 +1,6 @@ + + + +Abuse +

+

diff --git a/website/content/blog/2023-11-11-manpageblog-release-1-0.md b/website/content/blog/2023-11-11-manpageblog-release-1-0.md new file mode 100644 index 0000000..42b5bb7 --- /dev/null +++ b/website/content/blog/2023-11-11-manpageblog-release-1-0.md @@ -0,0 +1,29 @@ + + + + +manpageblog finally got its first release. With version +1.0 a public release is now present. A small, lightweight blog engine written in Python and offers several advantages +in a look of a man page (Unix like manual page). Firstly, it provides simplicity and ease of use, making it accessible even for users with limited technical knowledge. The lightweight nature ensures quick installation and minimal resource consumption, making it suitable for various hosting environments. No database is needed at all. +Firstly, it provides simplicity and ease of use, making it accessible even for users with limited technical knowledge. +The lightweight nature ensures quick installation and minimal resource consumption, making it suitable for various hosting environments. +

+Python's readability and straightforward syntax make the blog engine easy to customize and extend, allowing users +to tailor it to their specific needs. Additionally, being Python-based means leveraging a vast ecosystem of libraries +and frameworks, enhancing the blog's functionality without unnecessary complexity. +

+The lightweight nature also contributes to faster loading times, improving user experience and search engine rankings. +Overall, a small, lightweight blog engine in Python combines simplicity, flexibility, and efficiency, making it an +ideal choice for those prioritizing a streamlined and customizable blogging experience. + +Of course, manpageblog also supports regular html tags and code markers which makes it ideal to use for DevOps and developers. +

+ + + + + + +

+Now, you can start blogging. More information can be found on manpageblog.
+Download: manpageblog diff --git a/website/content/blog/2023-11-13-manpageblog-now-available-in-freebsd-ports.md b/website/content/blog/2023-11-13-manpageblog-now-available-in-freebsd-ports.md new file mode 100644 index 0000000..de510db --- /dev/null +++ b/website/content/blog/2023-11-13-manpageblog-now-available-in-freebsd-ports.md @@ -0,0 +1,9 @@ + + + + +manpageblog can now also be installed by the FreeBSD Ports. +Thanks to Stefan E. for pushing manpageblog to the ports. +

+FreeBSD Ports is a system for managing and installing software packages on FreeBSD, a Unix-like operating system. The Ports +Collection is a set of makefiles and scripts that simplify the process of compiling and installing third-party software on FreeBSD. diff --git a/website/content/blog/2023-11-15-manpageblog-release-1-1.md b/website/content/blog/2023-11-15-manpageblog-release-1-1.md new file mode 100644 index 0000000..8a554ac --- /dev/null +++ b/website/content/blog/2023-11-15-manpageblog-release-1-1.md @@ -0,0 +1,19 @@ + + + + +manpageblog just got released in version 1.1 Version 1.1 comes along with +several bug fixes and some new features.

+ +Features
+* Open Graph support (for sharing on social media paltforms)
+* Logo support in RSS feed
+
+Fixes
+* Validate if option are set from config
+* Dynamic word-wrap limit now works
+* Adjusted documentation
+ +
+Now, you can start blogging. More information can be found on manpageblog.
+Download: manpageblog diff --git a/website/content/blog/2023-11-21-manpageblog-in-the-1-mb-website-club.md b/website/content/blog/2023-11-21-manpageblog-in-the-1-mb-website-club.md new file mode 100644 index 0000000..ebd6d5c --- /dev/null +++ b/website/content/blog/2023-11-21-manpageblog-in-the-1-mb-website-club.md @@ -0,0 +1,11 @@ + + + + +manpageblog is now part of the 1MB Club, a collection of performance-focused web pages. +The 1MB Club is a growing collection of performance-focused web pages weighing less than 1 megabyte. Therefore, the goal +is to get back to slim and performant but also content rich web pages again.

+ +About the 1MB Club
+The internet has become a bloated mess. Massive JavaScript libraries. Countless client-side queries. Overly complex frontend frameworks. +But we can make a difference - no matter how small it may seem. 1MB Club is a growing collection of performance-focused web pages found across the internet. All member websites weigh less than 1 megabyte in page size. diff --git a/website/content/blog/2023-11-22-manpageblog-release-1-2.md b/website/content/blog/2023-11-22-manpageblog-release-1-2.md new file mode 100644 index 0000000..ea5511b --- /dev/null +++ b/website/content/blog/2023-11-22-manpageblog-release-1-2.md @@ -0,0 +1,19 @@ + + + + +manpageblog just got released in version 1.2 Version 1.2 comes along with +several bug fixes and some new features.

+ +Features
+* Add Twitter card support
+* Add dynamic favicon support
+* Add apple-touch favicon support
+* Add grey-scale theme
+
+Fixes
+* Fixed missing language type in html element
+ +
+Now, you can start blogging. More information can be found on manpageblog.
+Download: manpageblog diff --git a/website/content/blog/2023-12-15-manpageblock-container-image-for-docker-podman.md b/website/content/blog/2023-12-15-manpageblock-container-image-for-docker-podman.md new file mode 100644 index 0000000..094c089 --- /dev/null +++ b/website/content/blog/2023-12-15-manpageblock-container-image-for-docker-podman.md @@ -0,0 +1,24 @@ + + + + +manpageblog can now also be tested in a Container image which is supported by Docker, Podman, etc. +This allows people do test manpageblog without any other dependencies before switching. The Dockerfile can also be found within the GitHub project. +

+Resources:
+ + + + + + + + + + + + + + + +
Name Version  Container Image Preview Source
manpageblog 1.2  cnt-reg.gyptazy.ch/gyptazy/manpageblog:1.2 manpageblog GitHub
diff --git a/website/content/blog/2024-01-09-manpageblog-release-1-3.md b/website/content/blog/2024-01-09-manpageblog-release-1-3.md new file mode 100644 index 0000000..f099e38 --- /dev/null +++ b/website/content/blog/2024-01-09-manpageblog-release-1-3.md @@ -0,0 +1,20 @@ + + + + + +manpageblog just got released in version 1.3 Version 1.3 comes along with +several bug fixes and some new features.

+ +Features
+* Add meta keyword support
+* Add tag support
+* Add robot support
+* Add blue/grey theme
+
+Fixes
+* Fixed rendering issue
+ +
+Now, you can start blogging. More information can be found on manpageblog.
+Download: manpageblog diff --git a/website/content/blog/2024-01-14-manpageblog-release-1-3-1.md b/website/content/blog/2024-01-14-manpageblog-release-1-3-1.md new file mode 100644 index 0000000..2601bc2 --- /dev/null +++ b/website/content/blog/2024-01-14-manpageblog-release-1-3-1.md @@ -0,0 +1,15 @@ + + + + + +manpageblog just got released in version 1.3.1 Version 1.3.1 comes along with +a bug fixe regarding the RSS feed.

+ +Fixes
+* Fixed missing xmlns rss atom feed
+* Fixed missing atomic url in each element
+ +
+Now, you can start blogging. More information can be found on manpageblog.
+Download: manpageblog diff --git a/website/content/contact.html b/website/content/contact.html new file mode 100644 index 0000000..3e33f21 --- /dev/null +++ b/website/content/contact.html @@ -0,0 +1,30 @@ + + + +Contact +

+We are thrilled that you are interested in reaching out to us! At BoxyBSD, we strive to make it as easy as possible for +you to connect with us regarding any inquiries, feedback, or collaborations you may have in mind. Your thoughts and +questions are important to us, and we're here to assist you every step of the way. Every request is important but there +might be some cases which might be more important (e.g. someone is abusing the service) where we kindly ask you to use +the corresponding addresses. +

+ +Email
+Support: support@boxybsd.com
+Abuse:   abuse@boxybsd.com
+NOC:     noc@boxybsd.com
+GPG:     362A 53C0 E41C BCE8 9C18  7117 217A 875C FA93 FBF9 (download)
+
+ +Community Chat
+We also have a community chat available on the BSD Cafe's Matrix instance. Join us there to engage in discussions and connect with fellow enthusiasts.
+#boxybsd:bsd.cafe +

+ +Social Media
+You can also find this project on the Fediverse (Mastodon) and Twitter:
+Twitter: twitter.com/BoxyBSD
+Fediverse: mastodon.bsd.cafe/@BoxyBSD +

+

diff --git a/website/content/donate.html b/website/content/donate.html new file mode 100644 index 0000000..78041a0 --- /dev/null +++ b/website/content/donate.html @@ -0,0 +1,12 @@ + + + +Donate +

+BoxyBSD is currently in its nascent stages, eager to gauge community reception before soliciting donations. +As the project gains traction and establishes itself as a stable, long-term endeavor, contributions may be +considered. At present, refraining from donation collection prevents any perception of sudden closure or +suspicion in the event of unforeseen circumstances. The focus remains on fostering trust and sustainability +within the community before financial support is sought.

+Instead of donating, you may have a look at sponsoring the project with hardware resources. See also our FAQ. +

diff --git a/website/content/faq.html b/website/content/faq.html new file mode 100644 index 0000000..1bab76a --- /dev/null +++ b/website/content/faq.html @@ -0,0 +1,77 @@ + + + +FAQ +

+Can I get a new BSD based VM?
+Yes - but it takes some time. This project is free and the resources are limited. Each hypervisor will only run +a limited amount of free VMs. Slots will be freed when someone cancels the VM or a new host node gets attached +to the cluster. I still have to pay for the resources that you are using for free which means I cannot simply +add new nodes. +

+ +Can I choose an OS?
+You can choose between the following OS:
+  * FreeBSD 14
+  * OpenBSD 7.5
+  * NetBSD 10
+  * Open Indiana (beta) +

+ +Where are the systems hosted?
+All VMs are hosted in Germany. Unfortunately, it depends on the usage of the host nodes +where new VMs are created. The systems are located all over Germany - a VM may be created +in Nürnberg (hosted on netcup, Hetzner), Frankfurt (Maincubes, ProHosting24), Düsseldorf (Plusserver, PawHost). +

+ +Where are IP subnets located & hosted?
+No native IP subnets are used for this service. All IP subnets are assigned by AS6939 (Hurricane Electric LLC). +Different tunnel pops provide different subnets in different countries. Currently, it can be served from Germany, Switzerland, USA and Dschibuti (Africa). +

+ +Traffic & Bandwidth?
+Traffic is needed and you should do what you need to do but please do not generate unnecessary traffic. Please do not provide any download portals and do not run P2P sharing systems like Torrent. +This is currently stated as "fair use" traffic but may change at any time. The host nodes are connected with multiple Gbit interfaces but each VM is limited to 10Mbit. If there is any reason to get more bandwidth, please contact us. +

+ +How do we get support?
+For further support you can write an email to support@boxybsd.com. You may also find more help +in the Matrix channel on the BSD.Cafe server:
+#boxybsd:bsd.cafe +

+ +Can we donate?
+Please see the current status of donations at donate. +

+ +Can we sponsor?
+Yes, sponsoring is absolutely appreciated! If you are working in or for an AS (Autonomous System) or in a data center and can provide hardware resources with a minimum of 32GB memory and 500GB disk space, including upstream and at least a single +/48 IPv6 subnet, this can be integrated into the BoxyBSD project. Please get in touch with the project via our contact page. +

+ +Are there things forbidden?
+The initial idea of this project is to provide a valuable platform for people interested in BSD and open-source. This means, that it +should also be used and treated in this way - for research and learning. Do not waste resources (especially network traffic)! You should +also take care for your instance and keep it up to date and secure.
+Strongly forbidden is everything which results into illegal activities (e.g., hacking, ddos etc.) but also annoying things like port scanning +of foreign systems and so on. Every kind of pornographic material is forbidden and also running TOR nodes, Torrent etc.. +

+ +Can the hosting and service be terminated?
+Yes, the services may be terminated at any time without any further notice! +

+ +Are there backups?
+No! YOU are responsible for your instance and backups. +

+ +What CMS are you using?
+This project runs on manpageblog which is free and open-source. You can find the source on +github but it is also available in the FreeBSD ports. +

+ +Who is behind this project?
+This project is founded and driven by gyptazy. I'm a BSD user for more than +15 years and belive in the strenght of the community. You can also find me on Twitter and the Fediverse. +

+

diff --git a/website/content/imprint.html b/website/content/imprint.html new file mode 100644 index 0000000..88fb733 --- /dev/null +++ b/website/content/imprint.html @@ -0,0 +1,13 @@ + + + +Imprint +

+BoxyBSD
+Duesseldorferstrasse 68
+41460 Neuss
+Germany

+ +Phone: +41 44 500 87 44
+Email: support@boxybsd.com +

diff --git a/website/content/privacy_policy.html b/website/content/privacy_policy.html new file mode 100644 index 0000000..719cf78 --- /dev/null +++ b/website/content/privacy_policy.html @@ -0,0 +1,177 @@ + + + +Privacy Policy +

Last updated: April 07, 2024

+

This Privacy Policy describes Our policies and procedures on the collection, use and disclosure of Your information when You use the Service and tells You about Your privacy rights and how the law protects You.

+

We use Your Personal data to provide and improve the Service. By using the Service, You agree to the collection and use of information in accordance with this Privacy Policy. This Privacy Policy has been created with the help of the Privacy Policy Generator.

+

Interpretation and Definitions

+

Interpretation

+

The words of which the initial letter is capitalized have meanings defined under the following conditions. The following definitions shall have the same meaning regardless of whether they appear in singular or in plural.

+

Definitions

+

For the purposes of this Privacy Policy:

+ +

Collecting and Using Your Personal Data

+

Types of Data Collected

+

Personal Data

+

While using Our Service, We may ask You to provide Us with certain personally identifiable information that can be used to contact or identify You. Personally identifiable information may include, but is not limited to:

+ +

Usage Data

+

Usage Data is collected automatically when using the Service.

+

Usage Data may include information such as Your Device's Internet Protocol address (e.g. IP address), browser type, browser version, the pages of our Service that You visit, the time and date of Your visit, the time spent on those pages, unique device identifiers and other diagnostic data.

+

When You access the Service by or through a mobile device, We may collect certain information automatically, including, but not limited to, the type of mobile device You use, Your mobile device unique ID, the IP address of Your mobile device, Your mobile operating system, the type of mobile Internet browser You use, unique device identifiers and other diagnostic data.

+

We may also collect information that Your browser sends whenever You visit our Service or when You access the Service by or through a mobile device.

+

Tracking Technologies and Cookies

+

We use Cookies and similar tracking technologies to track the activity on Our Service and store certain information. Tracking technologies used are beacons, tags, and scripts to collect and track information and to improve and analyze Our Service. The technologies We use may include:

+ +

Cookies can be "Persistent" or "Session" Cookies. Persistent Cookies remain on Your personal computer or mobile device when You go offline, while Session Cookies are deleted as soon as You close Your web browser. Learn more about cookies on the Privacy Policies website article.

+

We use both Session and Persistent Cookies for the purposes set out below:

+ +

For more information about the cookies we use and your choices regarding cookies, please visit our Cookies Policy or the Cookies section of our Privacy Policy.

+

Use of Your Personal Data

+

The Company may use Personal Data for the following purposes:

+ +

We may share Your personal information in the following situations:

+ +

Retention of Your Personal Data

+

The Company will retain Your Personal Data only for as long as is necessary for the purposes set out in this Privacy Policy. We will retain and use Your Personal Data to the extent necessary to comply with our legal obligations (for example, if we are required to retain your data to comply with applicable laws), resolve disputes, and enforce our legal agreements and policies.

+

The Company will also retain Usage Data for internal analysis purposes. Usage Data is generally retained for a shorter period of time, except when this data is used to strengthen the security or to improve the functionality of Our Service, or We are legally obligated to retain this data for longer time periods.

+

Transfer of Your Personal Data

+

Your information, including Personal Data, is processed at the Company's operating offices and in any other places where the parties involved in the processing are located. It means that this information may be transferred to — and maintained on — computers located outside of Your state, province, country or other governmental jurisdiction where the data protection laws may differ than those from Your jurisdiction.

+

Your consent to this Privacy Policy followed by Your submission of such information represents Your agreement to that transfer.

+

The Company will take all steps reasonably necessary to ensure that Your data is treated securely and in accordance with this Privacy Policy and no transfer of Your Personal Data will take place to an organization or a country unless there are adequate controls in place including the security of Your data and other personal information.

+

Delete Your Personal Data

+

You have the right to delete or request that We assist in deleting the Personal Data that We have collected about You.

+

Our Service may give You the ability to delete certain information about You from within the Service.

+

You may update, amend, or delete Your information at any time by signing in to Your Account, if you have one, and visiting the account settings section that allows you to manage Your personal information. You may also contact Us to request access to, correct, or delete any personal information that You have provided to Us.

+

Please note, however, that We may need to retain certain information when we have a legal obligation or lawful basis to do so.

+

Disclosure of Your Personal Data

+

Business Transactions

+

If the Company is involved in a merger, acquisition or asset sale, Your Personal Data may be transferred. We will provide notice before Your Personal Data is transferred and becomes subject to a different Privacy Policy.

+

Law enforcement

+

Under certain circumstances, the Company may be required to disclose Your Personal Data if required to do so by law or in response to valid requests by public authorities (e.g. a court or a government agency).

+

Other legal requirements

+

The Company may disclose Your Personal Data in the good faith belief that such action is necessary to:

+ +

Security of Your Personal Data

+

The security of Your Personal Data is important to Us, but remember that no method of transmission over the Internet, or method of electronic storage is 100% secure. While We strive to use commercially acceptable means to protect Your Personal Data, We cannot guarantee its absolute security.

+

Children's Privacy

+

Our Service does not address anyone under the age of 13. We do not knowingly collect personally identifiable information from anyone under the age of 13. If You are a parent or guardian and You are aware that Your child has provided Us with Personal Data, please contact Us. If We become aware that We have collected Personal Data from anyone under the age of 13 without verification of parental consent, We take steps to remove that information from Our servers.

+

If We need to rely on consent as a legal basis for processing Your information and Your country requires consent from a parent, We may require Your parent's consent before We collect and use that information.

+

Links to Other Websites

+

Our Service may contain links to other websites that are not operated by Us. If You click on a third party link, You will be directed to that third party's site. We strongly advise You to review the Privacy Policy of every site You visit.

+

We have no control over and assume no responsibility for the content, privacy policies or practices of any third party sites or services.

+

Changes to this Privacy Policy

+

We may update Our Privacy Policy from time to time. We will notify You of any changes by posting the new Privacy Policy on this page.

+

We will let You know via email and/or a prominent notice on Our Service, prior to the change becoming effective and update the "Last updated" date at the top of this Privacy Policy.

+

You are advised to review this Privacy Policy periodically for any changes. Changes to this Privacy Policy are effective when they are posted on this page.

+

Contact Us

+

If you have any questions about this Privacy Policy, You can contact us:

+ +

diff --git a/website/content/shell.html b/website/content/shell.html new file mode 100644 index 0000000..eb28f99 --- /dev/null +++ b/website/content/shell.html @@ -0,0 +1,38 @@ + + + +Shell +

+This shared systems platform provides users with Unix shell accounts for various purposes such as experimentation, collaboration, and learning. +It offers a diverse range of services including email, web hosting, and programming environments. Users can connect to the related system via SSH +and utilize its resources to explore the world of Unix, networking, and programming. Instead of having to manage a full virtual machine it often +might even be enough to have a dedicated user account to run unix applications. + + + + + + + + + + + + + + + + + + + + +
Community Nick
Email
Login name
SSH Pubkey
OS
+ + + I Agree Terms & Conditions (TOS).
+ + +

+ +

diff --git a/website/content/sponsors.html b/website/content/sponsors.html new file mode 100644 index 0000000..c3e31ae --- /dev/null +++ b/website/content/sponsors.html @@ -0,0 +1,19 @@ + + + +Sponsors +

+Sponsoring is absolutely appreciated! If you're involved with an Autonomous System (AS) or work within a data center, your support +in providing hardware resources with at least 32GB memory and 500GB disk space, along with upstream and a single /48 IPv6 subnet, is +appreciated to the BoxyBSD project. Your contribution will enhance the development and capabilities of our project. +Please reach out to us through our contact page to discuss how you can be involved. +

+ +Current Sponsors
+ + + + + +
gyptazy.ch    gyptazy logo
+

diff --git a/website/content/status.html b/website/content/status.html new file mode 100644 index 0000000..6a5edc7 --- /dev/null +++ b/website/content/status.html @@ -0,0 +1,6 @@ + + + +Status +

+

diff --git a/website/content/toc.html b/website/content/toc.html new file mode 100644 index 0000000..ed22001 --- /dev/null +++ b/website/content/toc.html @@ -0,0 +1,36 @@ + + + +Terms and Conditions +

+By using BoxyBSD, you agree to comply with and be bound by these Terms. If you do not agree to these Terms, you may not use our services. +

+Service Description
+BoxyBSD offers free hosting services for individuals and organizations to host their websites and applications. +

+Service Termination
+BoxyBSD reserves the right to terminate its services at any time, without prior notice. This termination may occur on any day and for any reason, including but not limited to technical issues, operational changes, or violations of these Terms. +

+Service Availability
+While BoxyBSD strives to provide uninterrupted service, we make no guarantee regarding the availability or continuity of our services. Interruptions may occur due to factors beyond our control, including but not limited to server maintenance, network issues, or cyber attacks. +

+User Responsibilities
+* Users are solely responsible for the content they host on BoxyBSD servers.
+* Users must comply with all applicable laws and regulations while using our services.
+* Users must not engage in any activity that may disrupt or interfere with the proper functioning of BoxyBSD servers or networks.
+* Limitation of Liability: In no event shall BoxyBSD, its affiliates, or its partners be liable for any direct, indirect, incidental, special, or consequential damages arising out of or in any way connected with the use of our services. +

+Indemnification
+Users agree to indemnify and hold BoxyBSD, its affiliates, and its partners harmless from any claims, losses, damages, liabilities, and expenses (including legal fees) arising out of or in connection with their use of BoxyBSD services. +

+Modification of Terms
+BoxyBSD reserves the right to modify these Terms at any time. Users will be notified of any changes to the Terms, and continued use of our services after such notification constitutes acceptance of the modified Terms. +

+Governing Law
+These Terms shall be governed by and construed in accordance with the laws of [Jurisdiction], without regard to its conflict of law principles. +

+Contact Us
+If you have any questions or concerns about these Terms, please contact us at support@boxybsd.com. +

+By using BoxyBSD services, you acknowledge that you have read, understood, and agree to be bound by these Terms and Conditions. +

\ No newline at end of file diff --git a/website/content/vserver.html b/website/content/vserver.html new file mode 100644 index 0000000..5e5bdfc --- /dev/null +++ b/website/content/vserver.html @@ -0,0 +1,55 @@ + + + +vServer / VM +

+Our platform offers free virtual machines (VMs) leveraging resource leftovers from our infrastructure. Located across Germany, our +systems provide a reliable and accessible environment for BSD enthusiasts to explore, experiment, and innovate. At BoxyBSD, we +understand the importance of flexibility and choice. That's why we offer optional IP subnets from different allocations, allowing +users to tailor their experience to their specific needs and preferences. + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Community Nick
Email
OS
ARCH
CPU
RAM
HDD
IP
NET
+ + + I Agree Terms & Conditions (TOS).
+ + +

+Note: Due to the enormous interest, there are currently no slots available for the time being. As soon as new Hypervisors are available, additional VMs can be provisioned. +

diff --git a/website/dynamic/abuse.php b/website/dynamic/abuse.php new file mode 100644 index 0000000..997dda1 --- /dev/null +++ b/website/dynamic/abuse.php @@ -0,0 +1,162 @@ +"; + } + else{ + $error = "Could not create abuse report. Please try again."; + } + } + } +?> + + + + + + Abuse | BoxyBSD - BSD focused hosting + + + + + + + + + + + + + + + + + + + + + + + + + + + + NAME
+
+ + +
+ + BoxyBSD + +
+
+ + +
OPTIONS
+
+ + + + + +
CONTENT
+
+ +
+Abuse
+At BoxyBSD, we prioritize the safety and security of our platform and users. Our abuse policy aims to create a safe and conducive environment +for all users while ensuring the integrity of our services. +By adhering to these principles and policies, we aim to foster a secure and trustworthy environment for all our users, +promoting responsible usage of our services while mitigating potential risks associated with abuse. + +

Prohibited Activities
+We strictly prohibit any activities that violate our terms of service, including but not limited to:
+  * Illegal or malicious activities such as hacking, phishing, or spreading malware.
+  * Spamming or sending unsolicited emails.
+  * Hosting or distributing illegal content.
+  * Hosting or distributing copyrighted materials without proper authorization.
+  * Engaging in activities that cause harm to our infrastructure or other users. + +

Response to Abuse Reports
+Upon receiving an abuse report, we promptly investigates the issue to verify its validity and assess the severity. +Depending on the nature of the abuse, we take appropriate actions, which may include:
+  * Suspension or termination of the offending account.
+  * Removal of offending content.
+  * Cooperation with law enforcement authorities if the abuse involves illegal activities. + +

Report Abuse
+We encourage our users and third parties to report any instances of abuse or violations of our policies promptly. Reports +can be submitted through our dedicated channels in Matrix or email. We take all reports seriously and investigate them thoroughly. +For abuse reports please immediately reach out to us by email (abuse@boxybsd.com) or fill out the following form:

+ + ".$success.""; + } + else { ?> +
+

+ + +   
+
+ +  
+
+ +
+
+ + + + +

+ + '.$error.''; + } ?> +
+ + + + + \ No newline at end of file diff --git a/website/dynamic/status.php b/website/dynamic/status.php new file mode 100644 index 0000000..fff24a5 --- /dev/null +++ b/website/dynamic/status.php @@ -0,0 +1,103 @@ + + + + Abuse | BoxyBSD - BSD focused hosting + + + + + + + + + + + + + + + + + + + + + + + + + + + + NAME
+
+ + +
+ + BoxyBSD + +
+
+ + +
OPTIONS
+
+ + + + + +
CONTENT
+
+ +
+Status
+

+ + + +

+Smokeping
+Google:
+ +

+Cloudflare:
+ +

+BSDCafe:
+ +

+HE.net:
+ +

+
+ + + + + diff --git a/website/manpageblog b/website/manpageblog new file mode 100755 index 0000000..8ef6387 --- /dev/null +++ b/website/manpageblog @@ -0,0 +1,300 @@ +#!/usr/bin/env python3 + +# Copyright (c) 2023 Florian Paul Azim Hoberg @gyptazy +# All rights reserved +# +# This software is a derivative of the original makesite.py. +# The license text of the original makesite.py is included below. +# The MIT License (MIT) +# +# Copyright (c) 2018-2022 Sunaina Pai +# +# Permission is hereby granted, free of charge, to any person obtaining +# a copy of this software and associated documentation files (the +# "Software"), to deal in the Software without restriction, including +# without limitation the rights to use, copy, modify, merge, publish, +# distribute, sublicense, and/or sell copies of the Software, and to +# permit persons to whom the Software is furnished to do so, subject to +# the following conditions: +# +# The above copyright notice and this permission notice shall be +# included in all copies or substantial portions of the Software. +# +# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +# EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +# MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. +# IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY +# CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, +# TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE +# SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + + +import argparse +import configparser +import datetime +import glob +import json +import os +import re +import sys +import shutil +import sys + + +def parse_arguments(): + """ Parse arguments by cli input """ + args_parser = argparse.ArgumentParser(description='manpageblog', usage='%(prog)s') + args_parser.add_argument('-c', '--config', default='blog.conf', type=str, help='Path to manpageblog config file.', required=False) + return args_parser.parse_args() + + +def parse_config(config_file): + """ Parse config file for manpageblog """ + try: + config = configparser.ConfigParser() + config.read(config_file) + return config + except configparser.ParsingError: + log('Error parsing config file: Impossible to parse file.') + sys.exit(2) + except KeyError: + log('Error parsing config file: Key/Value not found.') + sys.exit(2) + + +def validate(config): + """ Validate config file for mandatory options """ + log_error = False + + if len(config['general']['name']) == 0: + log('Error: Mandatory field "name" missing.') + log_error = True + + if len(config['general']['description']) == 0: + log('Error: Mandatory field "description" missing.') + log_error = True + + if len(config['general']['subtitle']) == 0: + log('Error: Mandatory field "subtitle" missing.') + log_error = True + + if len(config['processing']['site_url']) == 0: + log('Error: Mandatory field "site_url" missing.') + log_error = True + + if len(config['processing']['assets']) == 0: + log('Error: Mandatory field "assets" missing.') + log_error = True + + if len(config['processing']['template_path']) == 0: + log('Error: Mandatory field "template_path" missing.') + log_error = True + + if len(config['processing']['output_path']) == 0: + log('Error: Mandatory field "output_path" missing.') + log_error = True + + if log_error: + sys.exit(1) + + +def fread(file_name): + """ Read file and close the file """ + with open(file_name, 'r') as f: + return f.read() + + +def fwrite(file_name, text): + """ Write content to file and close the file """ + basedir = os.path.dirname(file_name) + if not os.path.isdir(basedir): + os.makedirs(basedir) + + with open(file_name, 'w') as f: + f.write(text) + + +def log(msg, *args): + """ Log message with specified arguments """ + sys.stderr.write(msg.format(*args) + '\n') + + +def truncate(text, words): + """ Remove tags and truncate text to the specified number of words """ + return ' '.join(re.sub('(?s)<.*?>', ' ', text).split()[:words]) + + +def read_headers(text): + """ Parse headers in text and yield (key, value, end-index) tuples """ + for match in re.finditer(r'\s*\s*|.+', text): + if not match.group(1): + break + yield match.group(1), match.group(2), match.end() + + +def rfc_2822_format(date_str): + """ Convert yyyy-mm-dd date string to RFC 2822 format date string """ + d = datetime.datetime.strptime(date_str, '%Y-%m-%d') + return d.strftime('%a, %d %b %Y %H:%M:%S +0000') + + +def read_content(filename): + """ Read content and metadata from file into a dictionary """ + text = fread(filename) + + # Read metadata and save it in a dictionary. + date_slug = os.path.basename(filename).split('.')[0] + match = re.search(r'^(?:(\d\d\d\d-\d\d-\d\d)-)?(.+)$', date_slug) + content = { + 'date': match.group(1) or '1970-01-01', + 'slug': match.group(2), + } + + # Read headers. + end = 0 + for key, val, end in read_headers(text): + content[key] = val + + # Separate content from headers. + text = text[end:] + + # Convert Markdown content to HTML. + if filename.endswith(('.md', '.mkd', '.mkdn', '.mdown', '.markdown')): + try: + from markdown_it import MarkdownIt + md = MarkdownIt() + text = md.render(text) + except ImportError as error: + log('WARNING: Cannot render Markdown in {}: {}', filename, str(error)) + + # Update the dictionary with content and RFC 2822 date. + content.update({ + 'content': text, + 'rfc_2822_date': rfc_2822_format(content['date']) + }) + + return content + + +def render(template, **params): + """ Replace placeholders in template with values from params """ + return re.sub(r'{{\s*([^}\s]+)\s*}}', + lambda match: str(params.get(match.group(1), match.group(0))), + template) + + +def make_pages(src, dst, layout, **params): + """ Generate pages from page content """ + items = [] + + for src_path in glob.glob(src): + content = read_content(src_path) + + page_params = dict(params, **content) + + # Populate placeholders in content if content-rendering is enabled. + if page_params.get('render') == 'yes': + rendered_content = render(page_params['content'], **page_params) + page_params['content'] = rendered_content + content['content'] = rendered_content + + items.append(content) + + dst_path = render(dst, **page_params) + output = render(layout, **page_params) + + log('Rendering {} => {} ...', src_path, dst_path) + fwrite(dst_path, output) + + return sorted(items, key=lambda x: x['date'], reverse=True) + + +def make_list(config, posts, dst, list_layout, item_layout, **params): + """ Generate list page for a blog """ + items = [] + + for post in posts: + item_params = dict(params, **post) + item_params['summary'] = truncate(post['content'], int(config['general'].get('preview_words', 150))) + item = render(item_layout, **item_params) + items.append(item) + + params['content'] = ''.join(items) + dst_path = render(dst, **params) + output = render(list_layout, **params) + + log('Rendering list => {} ...', dst_path) + fwrite(dst_path, output) + + +def main(): + """ Run manpageblog """ + arguments = parse_arguments() + config = parse_config(arguments.config) + validate(config) + + # Create a new directory from scratch + # WARNING: If enabled this will remove the whole directory including all files! + # Since parsing a string from ini would always result in true we make an explicit + # check for the word 'force' + if config['processing']['output_from_scratch'] == 'force': + if os.path.isdir(config['processing']['output_path']): + shutil.rmtree(config['processing']['output_path']) + shutil.copytree(config['processing']['assets'], f"{config['processing']['output_path']}/assets") + + # Remap vars from config + params = { + '_version': '1.1', + 'name': config['general']['name'], + 'description': config['general']['description'], + 'keywords': config['general'].get('keywords', 'unknown'), + 'keywords_show': config['general'].get('keywords_show', 'meta'), + 'robots': config['general'].get('robots', 'noindex,nofollow'), + 'subtitle': config['general']['subtitle'], + 'author': config['general'].get('author', 'unknown'), + 'copyright': config['general'].get('copyright', 'manpageblog'), + 'logo_site': config['general'].get('logo_site', ''), + 'logo_favicon': config['general'].get('logo_favicon', ''), + 'logo_apple_touch': config['general'].get('logo_apple_touch', ''), + 'profile_mastodon': config['social'].get('mastodon', 'unknown'), + 'profile_twitter': config['social'].get('twitter', 'unknown'), + 'image_width': config['opengraph'].get('image_width', '800'), + 'image_height': config['opengraph'].get('image_hight', '375'), + 'profile_github': config['social'].get('github', 'unknown'), + 'site_url': config['processing']['site_url'], + 'base_path': config['processing']['base_path'], + 'theme': config['processing'].get('theme', 'light'), + 'current_year': datetime.datetime.now().year + } + + # Load layouts + if params.get('keywords_show') != 'meta': + page_layout = fread(f'{config["processing"]["template_path"]}/page_tags.html') + else: + page_layout = fread(f'{config["processing"]["template_path"]}/page.html') + post_layout = fread(f'{config["processing"]["template_path"]}/post.html') + list_layout = fread(f'{config["processing"]["template_path"]}/list.html') + item_layout = fread(f'{config["processing"]["template_path"]}/item.html') + feed_xml = fread(f'{config["processing"]["template_path"]}/feed.xml') + item_xml = fread(f'{config["processing"]["template_path"]}/item.xml') + + # Combine layouts to form final layouts + post_layout = render(page_layout, content=post_layout) + list_layout = render(page_layout, content=list_layout) + + # Create site pages + make_pages('content/_index.html', config['processing']['output_path']+'/index.html', page_layout, **params) + make_pages('content/[!_]*.html', config['processing']['output_path']+'/{{ slug }}/index.html', page_layout, **params) + + # Create blogs + blog_posts = make_pages('content/blog/*.md', config['processing']['output_path']+'/blog/{{ slug }}/index.html', post_layout, blog='blog', **params) + + # Create blog list pages + make_list(config, blog_posts, config['processing']['output_path']+'/blog/index.html', list_layout, item_layout, blog='blog', title='Blog', **params) + + # Create RSS feeds + make_list(config, blog_posts, config['processing']['output_path']+'/blog/rss.xml', feed_xml, item_xml, blog='blog', title='Blog', **params) + + +if __name__ == '__main__': + main() diff --git a/website/scripts/create.sh b/website/scripts/create.sh new file mode 100644 index 0000000..e69de29