feature(website): Add initial content for BoxyBSD.com website

This commit is contained in:
Florian Paul Azim Hoberg 2024-05-14 14:47:41 +02:00
parent 4fd4e000e0
commit 280bd602ee
41 changed files with 1730 additions and 1 deletions

View file

@ -1,3 +1,21 @@
# BoxyBSD
BoxyBSD.com website
<img align="left" src="https://boxybsd.com/boxybsd.jpg"/>
<br><br><br><br><br>
## 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 <a href="https://boxybsd.com">BoxyBSD.com</a>. It holds the content of the website but also the utilities to create the resource objects.

View file

@ -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;
}

View file

@ -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;
}

View file

@ -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;
}

View file

@ -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;
}

View file

@ -0,0 +1,77 @@
-----BEGIN PGP PUBLIC KEY BLOCK-----
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
=9+F9
-----END PGP PUBLIC KEY BLOCK-----

Binary file not shown.

After

Width:  |  Height:  |  Size: 8 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 12 KiB

View file

@ -0,0 +1,17 @@
<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
<channel>
<title>{{ title }}</title>
<link>{{ site_url }}/</link>
<description>{{ description }}</description>
<image>
<url>{{ logo_site }}</url>
<title>{{ title }}</title>
<link>{{ site_url }}/</link>
</image>
{{ content }}
</channel>
</rss>

View file

@ -0,0 +1,5 @@
<article>
<b><a href="{{ base_path }}/{{ blog }}/{{ slug }}/">{{ title }}</a></b> <i>({{ date }})</i>:<br>
{{ summary }}&nbsp;<a class="more" href="{{ base_path }}/{{ blog }}/{{ slug }}/">...</a>. <a class="more" href="{{ base_path }}/{{ blog }}/{{ slug }}/">[read more]</a>
</article>
<br>

View file

@ -0,0 +1,14 @@
<item>
<title>{{ title }}</title>
<link>{{ site_url }}/{{ blog }}/{{ slug }}/</link>
<guid>{{ site_url }}/{{ blog }}/{{ slug }}/</guid>
<description>
<![CDATA[
<p>
{{ summary }}&nbsp;<a href="{{ site_url }}/{{ blog }}/{{ slug }}/">...</a>
</p>
<p><a href="{{ site_url }}/{{ blog }}/{{ slug }}/">Read More</a></p>
]]>
</description>
<pubDate>{{ rfc_2822_date }}</pubDate>
</item>

View file

@ -0,0 +1,3 @@
<b>{{ title }}</b>
<p></p>
{{ content }}

View file

@ -0,0 +1,80 @@
<!DOCTYPE html>
<html lang="en">
<head>
<title>{{ title }} | {{ subtitle }}</title>
<meta name="description" content="{{ meta_description }}"/>
<meta name="keywords" content="{{ keywords }}"/>
<meta name="robots" content="{{ robots }}">
<meta property="og:image" content="{{ image_url }}"/>
<meta property="og:title" content="{{ title }}"/>
<meta property="og:description" content="{{ meta_description }}"/>
<meta property="og:image:width" content="{{ image_width }}"/>
<meta property="og:image:height" content="{{ image_height }}"/>
<meta name="twitter:card" content="summary" />
<meta name="twitter:site" content="{{ profile_twitter }}" />
<meta name="twitter:title" content="{{ title }}" />
<meta name="twitter:description" content="{{ meta_description }}" />
<meta name="twitter:image" content="{{ image_url }}" />
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width">
<meta name="robots" content="INDEX,FOLLOW">
<meta name="generator" content="manpageblog {{ _version }}" />
<link rel="stylesheet" type="text/css" href="{{ base_path }}/assets/css/{{ theme }}.css">
<link rel="shortcut icon" type="image/png" href="{{ logo_favicon }}"/>
<link rel="icon" type="image/png" href="{{ logo_favicon }}"/>
<link rel="apple-touch-icon" href="{{ logo_apple_touch }}"/>
<link href="{{ profile_mastodon }}" rel="me">
</head>
<body id="{{ slug }}">
<manpage>
<b>NAME</b><br>
</manpage>
<name>
<section>
<span class="name">
{{ name }}
</span>
</section>
</name>
<manpage>
<br><b>OPTIONS</b><br>
</manpage>
<nav>
<section>
<span class="home">
<a href="{{ base_path }}/">[home]</a>
<a href="{{ base_path }}/vserver/">[vserver]</a>
<a href="{{ base_path }}/shell/">[shell]</a>
<a href="{{ base_path }}/status/">[status]</a>
<a href="{{ base_path }}/faq/">[faq]</a>
<a href="{{ base_path }}/abuse/">[abuse]</a>
<a href="{{ base_path }}/sponsors/">[sponsors]</a>
<a href="{{ base_path }}/donate/">[donate]</a>
<a href="{{ base_path }}/contact/">[contact]</a>
</span>
</section>
</nav>
<manpage>
<br><b>CONTENT</b><br>
</manpage>
<main>
{{ content }}
</main>
<footer>
<section>
<p>&copy; {{ current_year }} BoxyBSD - a <a href="https://gyptazy.ch">gyptazy</a> service.
<br><a href="{{ base_path }}/privacy_policy/">[privacy policy]</a> / <a href="{{ base_path }}/imprint/">[imprint]</a></p></p>
</section>
</footer>
</body>
</html>

View file

@ -0,0 +1,82 @@
<!DOCTYPE html>
<html lang="en">
<head>
<title>{{ title }} | {{ subtitle }}</title>
<meta name="description" content="{{ meta_description }}"/>
<meta name="keywords" content="{{ keywords }}"/>
<meta name="robots" content="{{ robots }}">
<meta property="og:image" content="{{ image_url }}"/>
<meta property="og:title" content="{{ title }}"/>
<meta property="og:description" content="{{ meta_description }}"/>
<meta property="og:image:width" content="{{ image_width }}"/>
<meta property="og:image:height" content="{{ image_height }}"/>
<meta name="twitter:card" content="summary" />
<meta name="twitter:site" content="{{ profile_twitter }}" />
<meta name="twitter:title" content="{{ title }}" />
<meta name="twitter:description" content="{{ meta_description }}" />
<meta name="twitter:image" content="{{ image_url }}" />
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width">
<meta name="robots" content="INDEX,FOLLOW">
<meta name="generator" content="manpageblog {{ _version }}" />
<link rel="stylesheet" type="text/css" href="{{ base_path }}/assets/css/{{ theme }}.css">
<link rel="shortcut icon" type="image/png" href="{{ logo_favicon }}"/>
<link rel="icon" type="image/png" href="{{ logo_favicon }}"/>
<link rel="apple-touch-icon" href="{{ logo_apple_touch }}"/>
<link href="{{ profile_mastodon }}" rel="me">
</head>
<body id="{{ slug }}">
<manpage>
<b>NAME</b><br>
</manpage>
<name>
<section>
<span class="name">
{{ name }}
</span>
</section>
</name>
<manpage>
<br><b>OPTIONS</b><br>
</manpage>
<nav>
<section>
<span class="home">
<a href="{{ base_path }}/">[home]</a>
<a href="{{ base_path }}/blog/">[blog]</a>
<a href="{{ base_path }}/about/">[about]</a>
<a href="{{ base_path }}/contact/">[contact]</a>
</span>
</section>
</nav>
<manpage>
<br><b>CONTENT</b><br>
</manpage>
<main>
{{ content }}
</main>
<manpage>
<br><b>TAGS</b><br>
</manpage>
<main>
{{ keywords }}
</main>
<footer>
<section>
<p>&copy; {{ current_year }} {{ copyright }}</p>
</section>
</footer>
</body>
</html>

View file

@ -0,0 +1,4 @@
<article>
<b><a href="{{ base_path }}/{{ blog }}/{{ slug }}/">{{ title }}</a></b> <i>({{ date }})</i></b>:<br>
{{ content }}
</article>

31
website/blog.conf Normal file
View file

@ -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

View file

@ -0,0 +1,21 @@
<!-- title: Welcome -->
<!-- meta_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 web hosting, 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, kostenlos, kostenfrei, ipv6 -->
<!-- image_url: https://cdn.gyptazy.ch/images/manpageblog.jpg -->
<b>Welcome</b>
<p>
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.
<br><br>
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.
<br><br>
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.
<br><br>
In addition to our VM hosting services, we also offer secure email and web hosting solutions with state of the art technologies.
<br><br>
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.
</p>

View file

@ -0,0 +1,16 @@
<!-- title: About -->
<!-- meta_description: Read the short story behind manpageblog and why it provides a man page layout. -->
<b>About</b>
<p>
Like probably the most ones I started with <i>Wordpress</i> 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 <i>docroot</i> 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 <i>troff</i> 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 <i>manpageblog</i> was born.
</p>

View file

@ -0,0 +1,6 @@
<!-- title: Abuse -->
<!-- meta_description: Abuse. -->
<b>Abuse</b>
<p>
</p>

View file

@ -0,0 +1,29 @@
<!-- title: manpageblog released in version 1.0 -->
<!-- meta_description: Initial release of manpageblog 1.0. A simple and static blog generator in manpage design written in Python. -->
<!-- image_url: https://cdn.gyptazy.ch/images/manpageblog.jpg -->
<a href="https://github.com/gyptazy/manpageblog">manpageblog</a> 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.
<br><br>
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.
<br><br>
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.
<br><br>
<code>
<!-- title: manpageblog released in version 1.0 -->
<!-- meta_description: Initial release of manpageblog 1.0. A simple and static blog generator in manpage design written in Python. -->
</code>
<br><br>
Now, you can start blogging. More information can be found on <a href="https://github.com/gyptazy/manpageblog">manpageblog</a>.<br>
<b>Download</b>: <a href="https://github.com/gyptazy/manpageblog">manpageblog</a>

View file

@ -0,0 +1,9 @@
<!-- title: manpageblog is now available in the FreeBSD Ports -->
<!-- meta_description: manpageblog is now also available in the FreeBSD Ports. -->
<!-- image_url: https://cdn.gyptazy.ch/images/manpageblog.jpg -->
<a href="https://github.com/gyptazy/manpageblog">manpageblog</a> can now also be installed by the FreeBSD Ports.
Thanks to <a href="https://github.com/stesser">Stefan E.</a> for pushing manpageblog to the <a href="https://www.freshports.org/www/manpageblog">ports</a>.
<br><br>
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.

View file

@ -0,0 +1,19 @@
<!-- title: manpageblog released in version 1.1 -->
<!-- meta_description: Initial release of manpageblog 1.1. A simple and static blog generator in manpage design written in Python. -->
<!-- image_url: https://cdn.gyptazy.ch/images/manpageblog.jpg -->
<a href="https://github.com/gyptazy/manpageblog">manpageblog</a> just got released in version 1.1 Version 1.1 comes along with
several bug fixes and some new features.<br><br>
<b>Features</b><br>
* Open Graph support (for sharing on social media paltforms)<br>
* Logo support in RSS feed<br>
<br>
<b>Fixes</b><br>
* Validate if option are set from config<br>
* Dynamic word-wrap limit now works<br>
* Adjusted documentation <br>
<br>
Now, you can start blogging. More information can be found on <a href="https://github.com/gyptazy/manpageblog">manpageblog</a>.<br>
<b>Download</b>: <a href="https://github.com/gyptazy/manpageblog">manpageblog</a>

View file

@ -0,0 +1,11 @@
<!-- title: manpageblog is now in the 1MB Club -->
<!-- meta_description: manpageblog is now part of the 1MB Club; a collection of performance-focused web pages. -->
<!-- image_url: https://cdn.gyptazy.ch/images/manpageblog.jpg -->
<a href="https://github.com/gyptazy/manpageblog">manpageblog</a> is now part of the <a href="https://1mb.club">1MB Club</a>, a collection of performance-focused web pages.
The <a href="https://1mb.club">1MB Club</a> 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.<br><br>
<b>About the 1MB Club</b><br>
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.

View file

@ -0,0 +1,19 @@
<!-- title: manpageblog released in version 1.2 -->
<!-- meta_description: Initial release of manpageblog 1.2. A simple and static blog generator in manpage design written in Python. -->
<!-- image_url: https://cdn.gyptazy.ch/images/manpageblog.jpg -->
<a href="https://github.com/gyptazy/manpageblog">manpageblog</a> just got released in version 1.2 Version 1.2 comes along with
several bug fixes and some new features.<br><br>
<b>Features</b><br>
* Add Twitter card support <br>
* Add dynamic favicon support<br>
* Add apple-touch favicon support<br>
* Add grey-scale theme<br>
<br>
<b>Fixes</b><br>
* Fixed missing language type in html element<br>
<br>
Now, you can start blogging. More information can be found on <a href="https://github.com/gyptazy/manpageblog">manpageblog</a>.<br>
<b>Download</b>: <a href="https://github.com/gyptazy/manpageblog">manpageblog</a>

View file

@ -0,0 +1,24 @@
<!-- title: manpageblog Container Image for Docker and Podman -->
<!-- meta_description: manpageblog can now also be tested in a Container (Docker/Podman) image. -->
<!-- image_url: https://cdn.gyptazy.ch/images/manpageblog.jpg -->
<a href="https://github.com/gyptazy/manpageblog">manpageblog</a> 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.
<br><br>
<b>Resources:</b><br>
<table>
<tr>
<td><b>Name</b></td>
<td><b>&nbsp;Version</b></td>
<td><b>&nbsp;&nbsp;Container Image</b></td>
<td><b>&nbsp;Preview</b></td>
<td><b>&nbsp;Source</b></td>
</tr>
<tr>
<td><a href="https://manpageblog.org">manpageblog</a></td>
<td>&nbsp;<a href="https://github.com/gyptazy/manpageblog/releases/tag/v1.2">1.2</a></td>
<td>&nbsp;&nbsp;cnt-reg.gyptazy.ch/gyptazy/manpageblog:1.2</td>
<td>&nbsp;<a href="https://manpageblog.org">manpageblog</a></td>
<td>&nbsp;<a href="https://github.com/gyptazy/manpageblog">GitHub</a></td>
</tr>
</table>

View file

@ -0,0 +1,20 @@
<!-- title: manpageblog released in version 1.3 -->
<!-- meta_description: Initial release of manpageblog 1.3. A simple and static blog generator in manpage design written in Python. -->
<!-- image_url: https://cdn.gyptazy.ch/images/manpageblog.jpg -->
<!-- keywords: manpageblog, version, version 1.3, 1.3, features, release, meta, keyword, robots, support, robot, blue, grey, theme -->
<a href="https://github.com/gyptazy/manpageblog">manpageblog</a> just got released in version 1.3 Version 1.3 comes along with
several bug fixes and some new features.<br><br>
<b>Features</b><br>
* Add meta keyword support <br>
* Add tag support<br>
* Add robot support<br>
* Add blue/grey theme<br>
<br>
<b>Fixes</b><br>
* Fixed rendering issue<br>
<br>
Now, you can start blogging. More information can be found on <a href="https://github.com/gyptazy/manpageblog">manpageblog</a>.<br>
<b>Download</b>: <a href="https://github.com/gyptazy/manpageblog">manpageblog</a>

View file

@ -0,0 +1,15 @@
<!-- title: manpageblog released in version 1.3.1 -->
<!-- meta_description: Initial release of manpageblog 1.3.1. A simple and static blog generator in manpage design written in Python. -->
<!-- image_url: https://cdn.gyptazy.ch/images/manpageblog.jpg -->
<!-- keywords: manpageblog, version, version 1.3.1, 1.3.1, features, release, meta, keyword, robots, support, robot, blue, grey, theme -->
<a href="https://github.com/gyptazy/manpageblog">manpageblog</a> just got released in version 1.3.1 Version 1.3.1 comes along with
a bug fixe regarding the RSS feed.<br><br>
<b>Fixes</b><br>
* Fixed missing xmlns rss atom feed<br>
* Fixed missing atomic url in each element<br>
<br>
Now, you can start blogging. More information can be found on <a href="https://github.com/gyptazy/manpageblog">manpageblog</a>.<br>
<b>Download</b>: <a href="https://github.com/gyptazy/manpageblog">manpageblog</a>

View file

@ -0,0 +1,30 @@
<!-- title: Contact -->
<!-- meta_description: Find all contact possibilities for BoxyBSD (including abuse & NOC) but also the community chat in Matrix. -->
<b>Contact</b>
<p>
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.
<br><br>
<b>Email</b><br>
Support: support@boxybsd.com<br>
Abuse: &nbsp;&nbsp;abuse@boxybsd.com<br>
NOC: &nbsp;&nbsp;&nbsp;&nbsp;noc@boxybsd.com<br>
GPG: &nbsp;&nbsp;&nbsp;&nbsp;362A 53C0 E41C BCE8 9C18  7117 217A 875C FA93 FBF9 (<a href="https://boxybsd.com/gpg.key">download</a>)<br>
<br>
<b>Community Chat</b><br>
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.<br>
<a href="https://matrix.to/#/#boxybsd:bsd.cafe">#boxybsd:bsd.cafe</a>
<br><br>
<b>Social Media</b><br>
You can also find this project on the Fediverse (Mastodon) and Twitter:<br>
Twitter: <a href="https://twitter.com/BoxyBSD">twitter.com/BoxyBSD</a><br>
Fediverse: <a href="https://mastodon.bsd.cafe/@BoxyBSD">mastodon.bsd.cafe/@BoxyBSD</a>
<br><br>
</p>

View file

@ -0,0 +1,12 @@
<!-- title: Donate -->
<!-- meta_description: Find our how to donate to the BoxyBSD project. -->
<b>Donate</b>
<p>
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.<br><br>
Instead of donating, you may have a look at sponsoring the project with hardware resources. See also our <a href="https://boxybsd.com/faq/">FAQ</a>.
</p>

77
website/content/faq.html Normal file
View file

@ -0,0 +1,77 @@
<!-- title: FAQ -->
<!-- meta_description: BoxyBSD FAQ - Get the answers to your questions. -->
<b>FAQ</b>
<p>
<b>Can I get a new BSD based VM?</b><br>
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.
<br><br>
<b>Can I choose an OS?</b><br>
You can choose between the following OS:<br>
&nbsp;&nbsp;* FreeBSD 14<br>
&nbsp;&nbsp;* OpenBSD 7.5<br>
&nbsp;&nbsp;* NetBSD 10 <br>
&nbsp;&nbsp;* Open Indiana (beta)
<br><br>
<b>Where are the systems hosted?</b><br>
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).
<br><br>
<b>Where are IP subnets located & hosted?</b><br>
No native IP subnets are used for this service. All IP subnets are assigned by <a href="https://he.net">AS6939 (Hurricane Electric LLC)</a>.
Different tunnel pops provide different subnets in different countries. Currently, it can be served from Germany, Switzerland, USA and Dschibuti (Africa).
<br><br>
<b>Traffic & Bandwidth?</b><br>
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.
<br><br>
<b>How do we get support?</b><br>
For further support you can write an email to <a href="mailto:support@boxybsd.com">support@boxybsd.com</a>. You may also find more help
in the Matrix channel on the BSD.Cafe server:<br>
<a href="https://matrix.to/#/#boxybsd:bsd.cafe">#boxybsd:bsd.cafe</a>
<br><br>
<b>Can we donate?</b><br>
Please see the current status of donations at <a href="https://boxybsd.com/donate/">donate</a>.
<br><br>
<b>Can we sponsor?</b><br>
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 <a href="/contact/">contact</a> page.
<br><br>
<b>Are there things forbidden?</b><br>
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.<br>
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..
<br><br>
<b>Can the hosting and service be terminated?</b><br>
Yes, the services may be terminated at any time without any further notice!
<br><br>
<b>Are there backups?</b><br>
No! YOU are responsible for your instance and backups.
<br><br>
<b>What CMS are you using?</b><br>
This project runs on <a href="https://manpageblog.org">manpageblog</a> which is free and open-source. You can find the source on
<a href="https://github.com/gyptazy/manpageblog">github</a> but it is also available in the <a href="https://www.freshports.org/www/manpageblog/">FreeBSD ports</a>.
<br><br>
<b>Who is behind this project?</b><br>
This project is founded and driven by <a href="https://gyptazy.ch">gyptazy</a>. I'm a BSD user for more than
15 years and belive in the strenght of the community. You can also find me on <a href="https://twitter.com/gyptazy">Twitter</a> and the <a href="https://gyptazy.ch/snac/gyptazy">Fediverse</a>.
<br><br>
</p>

View file

@ -0,0 +1,13 @@
<!-- title: Imprint -->
<!-- meta_description: BoxyBSD Imprint. -->
<b>Imprint</b>
<p>
BoxyBSD<br>
Duesseldorferstrasse 68<br>
41460 Neuss<br>
Germany<br><br>
Phone: +41 44 500 87 44<br>
Email: support@boxybsd.com
</p>

View file

@ -0,0 +1,177 @@
<!-- title: Privacy Policy -->
<!-- meta_description: BoxyBSD takes your data serious. See also more in our privacy policy. -->
<b>Privacy Policy</b>
<p>Last updated: April 07, 2024</p>
<p>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.</p>
<p>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 <a href="https://www.privacypolicies.com/privacy-policy-generator/" target="_blank">Privacy Policy Generator</a>.</p>
<h2>Interpretation and Definitions</h2>
<h3>Interpretation</h3>
<p>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.</p>
<h3>Definitions</h3>
<p>For the purposes of this Privacy Policy:</p>
<ul>
<li>
<p><strong>Account</strong> means a unique account created for You to access our Service or parts of our Service.</p>
</li>
<li>
<p><strong>Affiliate</strong> means an entity that controls, is controlled by or is under common control with a party, where &quot;control&quot; means ownership of 50% or more of the shares, equity interest or other securities entitled to vote for election of directors or other managing authority.</p>
</li>
<li>
<p><strong>Company</strong> (referred to as either &quot;the Company&quot;, &quot;We&quot;, &quot;Us&quot; or &quot;Our&quot; in this Agreement) refers to Boxy.</p>
</li>
<li>
<p><strong>Cookies</strong> are small files that are placed on Your computer, mobile device or any other device by a website, containing the details of Your browsing history on that website among its many uses.</p>
</li>
<li>
<p><strong>Country</strong> refers to: Nordrhein-Westfalen, Germany</p>
</li>
<li>
<p><strong>Device</strong> means any device that can access the Service such as a computer, a cellphone or a digital tablet.</p>
</li>
<li>
<p><strong>Personal Data</strong> is any information that relates to an identified or identifiable individual.</p>
</li>
<li>
<p><strong>Service</strong> refers to the Website.</p>
</li>
<li>
<p><strong>Service Provider</strong> means any natural or legal person who processes the data on behalf of the Company. It refers to third-party companies or individuals employed by the Company to facilitate the Service, to provide the Service on behalf of the Company, to perform services related to the Service or to assist the Company in analyzing how the Service is used.</p>
</li>
<li>
<p><strong>Usage Data</strong> refers to data collected automatically, either generated by the use of the Service or from the Service infrastructure itself (for example, the duration of a page visit).</p>
</li>
<li>
<p><strong>Website</strong> refers to Boxy, accessible from <a href="boxy.com" rel="external nofollow noopener" target="_blank">boxy.com</a></p>
</li>
<li>
<p><strong>You</strong> means the individual accessing or using the Service, or the company, or other legal entity on behalf of which such individual is accessing or using the Service, as applicable.</p>
</li>
</ul>
<h2>Collecting and Using Your Personal Data</h2>
<h3>Types of Data Collected</h3>
<h4>Personal Data</h4>
<p>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:</p>
<ul>
<li>
<p>Email address</p>
</li>
<li>
<p>Usage Data</p>
</li>
</ul>
<h4>Usage Data</h4>
<p>Usage Data is collected automatically when using the Service.</p>
<p>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.</p>
<p>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.</p>
<p>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.</p>
<h4>Tracking Technologies and Cookies</h4>
<p>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:</p>
<ul>
<li><strong>Cookies or Browser Cookies.</strong> A cookie is a small file placed on Your Device. You can instruct Your browser to refuse all Cookies or to indicate when a Cookie is being sent. However, if You do not accept Cookies, You may not be able to use some parts of our Service. Unless you have adjusted Your browser setting so that it will refuse Cookies, our Service may use Cookies.</li>
<li><strong>Web Beacons.</strong> Certain sections of our Service and our emails may contain small electronic files known as web beacons (also referred to as clear gifs, pixel tags, and single-pixel gifs) that permit the Company, for example, to count users who have visited those pages or opened an email and for other related website statistics (for example, recording the popularity of a certain section and verifying system and server integrity).</li>
</ul>
<p>Cookies can be &quot;Persistent&quot; or &quot;Session&quot; 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 <a href="https://www.privacypolicies.com/blog/privacy-policy-template/#Use_Of_Cookies_Log_Files_And_Tracking" target="_blank">Privacy Policies website</a> article.</p>
<p>We use both Session and Persistent Cookies for the purposes set out below:</p>
<ul>
<li>
<p><strong>Necessary / Essential Cookies</strong></p>
<p>Type: Session Cookies</p>
<p>Administered by: Us</p>
<p>Purpose: These Cookies are essential to provide You with services available through the Website and to enable You to use some of its features. They help to authenticate users and prevent fraudulent use of user accounts. Without these Cookies, the services that You have asked for cannot be provided, and We only use these Cookies to provide You with those services.</p>
</li>
<li>
<p><strong>Cookies Policy / Notice Acceptance Cookies</strong></p>
<p>Type: Persistent Cookies</p>
<p>Administered by: Us</p>
<p>Purpose: These Cookies identify if users have accepted the use of cookies on the Website.</p>
</li>
<li>
<p><strong>Functionality Cookies</strong></p>
<p>Type: Persistent Cookies</p>
<p>Administered by: Us</p>
<p>Purpose: These Cookies allow us to remember choices You make when You use the Website, such as remembering your login details or language preference. The purpose of these Cookies is to provide You with a more personal experience and to avoid You having to re-enter your preferences every time You use the Website.</p>
</li>
</ul>
<p>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.</p>
<h3>Use of Your Personal Data</h3>
<p>The Company may use Personal Data for the following purposes:</p>
<ul>
<li>
<p><strong>To provide and maintain our Service</strong>, including to monitor the usage of our Service.</p>
</li>
<li>
<p><strong>To manage Your Account:</strong> to manage Your registration as a user of the Service. The Personal Data You provide can give You access to different functionalities of the Service that are available to You as a registered user.</p>
</li>
<li>
<p><strong>For the performance of a contract:</strong> the development, compliance and undertaking of the purchase contract for the products, items or services You have purchased or of any other contract with Us through the Service.</p>
</li>
<li>
<p><strong>To contact You:</strong> To contact You by email, telephone calls, SMS, or other equivalent forms of electronic communication, such as a mobile application's push notifications regarding updates or informative communications related to the functionalities, products or contracted services, including the security updates, when necessary or reasonable for their implementation.</p>
</li>
<li>
<p><strong>To provide You</strong> with news, special offers and general information about other goods, services and events which we offer that are similar to those that you have already purchased or enquired about unless You have opted not to receive such information.</p>
</li>
<li>
<p><strong>To manage Your requests:</strong> To attend and manage Your requests to Us.</p>
</li>
<li>
<p><strong>For business transfers:</strong> We may use Your information to evaluate or conduct a merger, divestiture, restructuring, reorganization, dissolution, or other sale or transfer of some or all of Our assets, whether as a going concern or as part of bankruptcy, liquidation, or similar proceeding, in which Personal Data held by Us about our Service users is among the assets transferred.</p>
</li>
<li>
<p><strong>For other purposes</strong>: We may use Your information for other purposes, such as data analysis, identifying usage trends, determining the effectiveness of our promotional campaigns and to evaluate and improve our Service, products, services, marketing and your experience.</p>
</li>
</ul>
<p>We may share Your personal information in the following situations:</p>
<ul>
<li><strong>With Service Providers:</strong> We may share Your personal information with Service Providers to monitor and analyze the use of our Service, to contact You.</li>
<li><strong>For business transfers:</strong> We may share or transfer Your personal information in connection with, or during negotiations of, any merger, sale of Company assets, financing, or acquisition of all or a portion of Our business to another company.</li>
<li><strong>With Affiliates:</strong> We may share Your information with Our affiliates, in which case we will require those affiliates to honor this Privacy Policy. Affiliates include Our parent company and any other subsidiaries, joint venture partners or other companies that We control or that are under common control with Us.</li>
<li><strong>With business partners:</strong> We may share Your information with Our business partners to offer You certain products, services or promotions.</li>
<li><strong>With other users:</strong> when You share personal information or otherwise interact in the public areas with other users, such information may be viewed by all users and may be publicly distributed outside.</li>
<li><strong>With Your consent</strong>: We may disclose Your personal information for any other purpose with Your consent.</li>
</ul>
<h3>Retention of Your Personal Data</h3>
<p>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.</p>
<p>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.</p>
<h3>Transfer of Your Personal Data</h3>
<p>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.</p>
<p>Your consent to this Privacy Policy followed by Your submission of such information represents Your agreement to that transfer.</p>
<p>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.</p>
<h3>Delete Your Personal Data</h3>
<p>You have the right to delete or request that We assist in deleting the Personal Data that We have collected about You.</p>
<p>Our Service may give You the ability to delete certain information about You from within the Service.</p>
<p>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.</p>
<p>Please note, however, that We may need to retain certain information when we have a legal obligation or lawful basis to do so.</p>
<h3>Disclosure of Your Personal Data</h3>
<h4>Business Transactions</h4>
<p>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.</p>
<h4>Law enforcement</h4>
<p>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).</p>
<h4>Other legal requirements</h4>
<p>The Company may disclose Your Personal Data in the good faith belief that such action is necessary to:</p>
<ul>
<li>Comply with a legal obligation</li>
<li>Protect and defend the rights or property of the Company</li>
<li>Prevent or investigate possible wrongdoing in connection with the Service</li>
<li>Protect the personal safety of Users of the Service or the public</li>
<li>Protect against legal liability</li>
</ul>
<h3>Security of Your Personal Data</h3>
<p>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.</p>
<h2>Children's Privacy</h2>
<p>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.</p>
<p>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.</p>
<h2>Links to Other Websites</h2>
<p>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.</p>
<p>We have no control over and assume no responsibility for the content, privacy policies or practices of any third party sites or services.</p>
<h2>Changes to this Privacy Policy</h2>
<p>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.</p>
<p>We will let You know via email and/or a prominent notice on Our Service, prior to the change becoming effective and update the &quot;Last updated&quot; date at the top of this Privacy Policy.</p>
<p>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.</p>
<h2>Contact Us</h2>
<p>If you have any questions about this Privacy Policy, You can contact us:</p>
<ul>
<li>By email: privacy@boxybsd.com</li>
</ul>
</p>

View file

@ -0,0 +1,38 @@
<!-- title: Shell -->
<!-- meta_description: Find all contact possibilities for BoxyBSD (including abuse & NOC) but also the community chat in Matrix. -->
<b>Shell</b>
<p>
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.
<table>
<tr>
<td>Community Nick</td>
<td><input type="text" name="Email" value="" size="30" maxlength="50"></td>
</tr>
<tr>
<td>Email</td>
<td><input type="text" name="Email" value="" size="30" maxlength="50"></td>
</tr>
<td>Login name</td>
<td><input type="text" name="Email" value="" size="30" maxlength="50"></td>
</tr>
<td>SSH Pubkey</td>
<td><input type="text" name="sshpubkey" value="" size="30" maxlength="50"></td>
</tr>
<tr>
<td>OS</td>
<td><select><option>FreeBSD 14</option></select></td>
</tr>
</table>
<body onload="disableSubmit()">
<input type="checkbox" name="terms" id="terms" onchange="activateButton(this)"> I Agree Terms & Conditions (<a href="/toc/">TOS</a>).<br>
<input type="submit" name="submit" id="submit">
</body>
</p>
</p>

View file

@ -0,0 +1,19 @@
<!-- title: Sponsors -->
<!-- meta_description: Find all sponsors of the BoxyBSD project. -->
<b>Sponsors</b>
<p>
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.
<br><br>
<b>Current Sponsors</b><br>
<table>
<tr>
<td><a href="https://gyptazy.ch">gyptazy.ch</a></td>
<td>&nbsp;&nbsp;&nbsp;&nbsp;<img src="https://cdn.gyptazy.ch/images/gyptazy.png" alt="gyptazy logo" width="100" height="100"></td>
</tr>
</table>
</p>

View file

@ -0,0 +1,6 @@
<!-- title: Status -->
<!-- meta_description: Status page of BoxyBSD. -->
<b>Status</b>
<p>
</p>

36
website/content/toc.html Normal file
View file

@ -0,0 +1,36 @@
<!-- title: Terms and Conditions -->
<!-- meta_description: Find the terms and conditions of using BoxyBSD services. -->
<b>Terms and Conditions</b>
<p>
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.
<br><br>
<b>Service Description</b><br>
BoxyBSD offers free hosting services for individuals and organizations to host their websites and applications.
<br><br>
<b>Service Termination</b><br>
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.
<br><br>
<b>Service Availability</b><br>
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.
<br><br>
<b>User Responsibilities</b><br>
* Users are solely responsible for the content they host on BoxyBSD servers.<br>
* Users must comply with all applicable laws and regulations while using our services.<br>
* Users must not engage in any activity that may disrupt or interfere with the proper functioning of BoxyBSD servers or networks.<br>
* 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.
<br><br>
<b>Indemnification</b><br>
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.
<br><br>
<b>Modification of Terms</b><br>
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.
<br><br>
<b>Governing Law</b><br>
These Terms shall be governed by and construed in accordance with the laws of [Jurisdiction], without regard to its conflict of law principles.
<br><br>
<b>Contact Us</b><br>
If you have any questions or concerns about these Terms, please contact us at <a href="mailto:support@boxybsd.com">support@boxybsd.com</a>.
<br><br>
By using BoxyBSD services, you acknowledge that you have read, understood, and agree to be bound by these Terms and Conditions.
</p>

View file

@ -0,0 +1,55 @@
<!-- title: vServer / VM -->
<!-- meta_description: Get a free BSD based VM (vServer) for educational stuff. This service targets people that are new to BSD to provide a valuable solution for learning and testing. -->
<b>vServer / VM</b>
<p>
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.
<table>
<tr>
<td>Community Nick</td>
<td><input type="text" name="Email" value="" size="30" maxlength="50"></td>
</tr>
<tr>
<td>Email</td>
<td><input type="text" name="Email" value="" size="30" maxlength="50"></td>
</tr>
<tr>
<td>OS</td>
<td><select><option>FreeBSD 14</option><option>OpenBSD 9.5</option><option>NetBSD 10</option><option>Open Indiana (beta)</option></select></td>
</tr>
<tr>
<td>ARCH</td>
<td><select><option>AMD64</option></select></td>
</tr>
<tr>
<td>CPU</td>
<td><select><option>1</option></select></td>
</tr>
<tr>
<td>RAM</td>
<td><select><option>1 GB</option></select></td>
</tr>
<tr>
<td>HDD</td>
<td><select><option>10 GB</option></select></td>
</tr>
<tr>
<td>IP</td>
<td><select><option>IPv6 (free)</option><option>IPv4 + IPv6 (5$/Month)</option></select></td>
</tr>
<tr>
<td>NET</td>
<td><select><option>DE (2001:470:54d7:1337::/64)</option><option>CH (2001:470:b60b:1337::/64)</option><option>DJ (2600:70ff:d808:1337::/64)</option><option>USA (2001:470:8ba5:1337::/64)</option></select></td>
</tr>
</table>
<body onload="disableSubmit()">
<input type="checkbox" name="terms" id="terms" onchange="activateButton(this)"> I Agree Terms & Conditions (<a href="/toc/">TOS</a>).<br>
<input type="submit" name="submit" id="submit">
</body>
<br><br>
<i>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.</i>
</p>

162
website/dynamic/abuse.php Normal file
View file

@ -0,0 +1,162 @@
<?php
$empfaenger = "abuse@boxybsd.com";
if(isset($_REQUEST["submit"])){
if(empty($_REQUEST["name"]) || empty($_REQUEST["email"]) || empty($_REQUEST["nachricht"])){
$error = "Please fill out all fields.";
}
else{
$mailnachricht="Abuse report::\n";
$mailnachricht .= "Name: ".$_REQUEST["name"]."\n".
"E-Mail: ".$_REQUEST["email"]."\n".
"Datum: ".date("d.m.Y H:i")."\n".
"Auswahl: ".$_REQUEST["Auswahl"]."\n".
"\n\n".$_REQUEST["nachricht"]."\n";
$mailbetreff = "BoxyBSD Abuse Report: ".$_REQUEST["name"]." (".$_REQUEST["email"].")";
if(mail($empfaenger, $mailbetreff, $mailnachricht, 'From: support@boxybsd.com', '-f support@boxybsd.com')){
$success = "Your abuse report has been delivered. You will receive a reply after validating your report.<br>";
}
else{
$error = "Could not create abuse report. Please try again.";
}
}
}
?>
<!DOCTYPE html>
<html lang="en">
<head>
<title>Abuse | BoxyBSD - BSD focused hosting</title>
<meta name="description" content="Create an abuse report for systems and users located and hosted by BoxyBSD."/>
<meta name="keywords" content="boxybsd, gyptazy, hosting, free vm, free vms, freebsd, netbsd, openbsd, community, open-source, virtual machines, hosting, non-profit"/>
<meta name="robots" content="index,follow">
<meta property="og:image" content="https://boxybsd.com/boxybsd.jpg"/>
<meta property="og:title" content="Abuse"/>
<meta property="og:description" content="Abuse."/>
<meta property="og:image:width" content="800"/>
<meta property="og:image:height" content="375"/>
<meta name="twitter:card" content="summary" />
<meta name="twitter:site" content="@BoxyBSD" />
<meta name="twitter:title" content="Abuse" />
<meta name="twitter:description" content="Abuse." />
<meta name="twitter:image" content="https://boxybsd.com/boxybsd.jpg" />
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width">
<meta name="robots" content="INDEX,FOLLOW">
<meta name="generator" content="manpageblog 1.1" />
<link rel="stylesheet" type="text/css" href="/assets/css/dark.css">
<link rel="shortcut icon" type="image/png" href="https://boxybsd.com/boxybsd.jpg"/>
<link rel="icon" type="image/png" href="https://boxybsd.com/boxybsd.jpg"/>
<link rel="apple-touch-icon" href="https://boxybsd.com/boxybsd.jpg"/>
<link href="https://mastodon.bsd.cafe/@BoxyBSD" rel="me">
</head>
<body id="abuse">
<manpage>
<b>NAME</b><br>
</manpage>
<name>
<section>
<span class="name">
BoxyBSD
</span>
</section>
</name>
<manpage>
<br><b>OPTIONS</b><br>
</manpage>
<nav>
<section>
<span class="home">
<a href="/">[home]</a>
<a href="/vserver/">[vserver]</a>
<a href="/shell/">[shell]</a>
<a href="/status/">[status]</a>
<a href="/faq/">[faq]</a>
<a href="/abuse/">[abuse]</a>
<a href="/sponsors/">[sponsors]</a>
<a href="/donate/">[donate]</a>
<a href="/contact/">[contact]</a>
</span>
</section>
</nav>
<manpage>
<br><b>CONTENT</b><br>
</manpage>
<main>
<b>Abuse</b><br>
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.
<br><br><b>Prohibited Activities</b><br>
We strictly prohibit any activities that violate our terms of service, including but not limited to:<br>
&nbsp;&nbsp;* Illegal or malicious activities such as hacking, phishing, or spreading malware.<br>
&nbsp;&nbsp;* Spamming or sending unsolicited emails.<br>
&nbsp;&nbsp;* Hosting or distributing illegal content.<br>
&nbsp;&nbsp;* Hosting or distributing copyrighted materials without proper authorization.<br>
&nbsp;&nbsp;* Engaging in activities that cause harm to our infrastructure or other users.
<br><br><b>Response to Abuse Reports</b><br>
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:<br>
&nbsp;&nbsp;* Suspension or termination of the offending account.<br>
&nbsp;&nbsp;* Removal of offending content.<br>
&nbsp;&nbsp;* Cooperation with law enforcement authorities if the abuse involves illegal activities.
<br><br><b>Report Abuse</b><br>
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:<br><br>
<?php if(isset($success)){
echo "<div>".$success."</div>";
}
else { ?>
<form id="contactform" action="" method="post" class="pure-form pure-form-aligned">
<p>
<label for="name">Name</label>
&nbsp;&nbsp;&nbsp;<input id="name" name="name" required size="40" placeholder="Name"><br>
<br>
<label for="email">Email</label>
&nbsp;&nbsp;<input id="email" name="email" type="email" required size="40" placeholder="myemail@example.com"><br>
<br>
<label for="nachricht">Details</label>
<br>
<textarea id="nachricht" name="nachricht" required cols="39" rows="10" placeholder="Please include all needed details about the abuse report. What kind of abuse, time, date, source and destination addresses."></textarea><br>
<label for="submit"></label>
<button id="submit" name="submit" type="submit" class="pure-button pure-button-primary" onsubmit="validateForm()">Submit</button>
</form>
<script>
function validateForm(){
var form = document.getElementById("contactform");
return form.checkValidity();
}
</script>
<?php
}
if(isset($error)){
echo '<div class="error">'.$error.'</div>';
} ?>
</main>
<footer>
<section>
<p>&copy; 2024 BoxyBSD - a <a href="https://gyptazy.ch">gyptazy</a> service.
<br><a href="/privacy_policy/">[privacy policy]</a> / <a href="/imprint/">[imprint]</a></p></p>
</section>
</footer>
</body>
</html>

103
website/dynamic/status.php Normal file
View file

@ -0,0 +1,103 @@
<!DOCTYPE html>
<html lang="en">
<head>
<title>Abuse | BoxyBSD - BSD focused hosting</title>
<meta name="description" content="Status overview of the BoxyBSD systems."/>
<meta name="keywords" content="boxybsd, gyptazy, hosting, free vm, free vms, freebsd, netbsd, openbsd, community, open-source, virtual machines, hosting, non-profit"/>
<meta name="robots" content="index,follow">
<meta property="og:image" content="https://boxybsd.com/boxybsd.jpg"/>
<meta property="og:title" content="Abuse"/>
<meta property="og:description" content="Abuse."/>
<meta property="og:image:width" content="800"/>
<meta property="og:image:height" content="375"/>
<meta name="twitter:card" content="summary" />
<meta name="twitter:site" content="@BoxyBSD" />
<meta name="twitter:title" content="Abuse" />
<meta name="twitter:description" content="Abuse." />
<meta name="twitter:image" content="https://boxybsd.com/boxybsd.jpg" />
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width">
<meta name="robots" content="INDEX,FOLLOW">
<meta name="generator" content="manpageblog 1.1" />
<link rel="stylesheet" type="text/css" href="/assets/css/dark.css">
<link rel="shortcut icon" type="image/png" href="https://boxybsd.com/boxybsd.jpg"/>
<link rel="icon" type="image/png" href="https://boxybsd.com/boxybsd.jpg"/>
<link rel="apple-touch-icon" href="https://boxybsd.com/boxybsd.jpg"/>
<link href="https://mastodon.bsd.cafe/@BoxyBSD" rel="me">
</head>
<body id="abuse">
<manpage>
<b>NAME</b><br>
</manpage>
<name>
<section>
<span class="name">
BoxyBSD
</span>
</section>
</name>
<manpage>
<br><b>OPTIONS</b><br>
</manpage>
<nav>
<section>
<span class="home">
<a href="/">[home]</a>
<a href="/vserver/">[vserver]</a>
<a href="/shell/">[shell]</a>
<a href="/status/">[status]</a>
<a href="/faq/">[faq]</a>
<a href="/abuse/">[abuse]</a>
<a href="/sponsors/">[sponsors]</a>
<a href="/donate/">[donate]</a>
<a href="/contact/">[contact]</a>
</span>
</section>
</nav>
<manpage>
<br><b>CONTENT</b><br>
</manpage>
<main>
<b>Status</b><br>
<p>
<?php
$myfile = fopen("monitoring_status.txt", "r") or die("Unable to load monitoring output.");
echo '' . fread($myfile,filesize("monitoring_status.txt"))
. '';
fclose($myfile);
?>
<br><br>
<b>Smokeping</b><br>
Google:<br>
<img src="http://[2001:470:54d7:1337::2]/smokeping/images/Inet/google_mini.png">
<br><br>
Cloudflare:<br>
<img src="http://[2001:470:54d7:1337::2]/smokeping/images/Inet/cloudflare_mini.png">
<br><br>
BSDCafe:<br>
<img src="http://[2001:470:54d7:1337::2]/smokeping/images/Inet/BSDCafe_mini.png">
<br><br>
HE.net:<br>
<img src="http://[2001:470:54d7:1337::2]/smokeping/images/Inet/HE-Net_mini.png">
</p>
</main>
<footer>
<section>
<p>&copy; 2024 BoxyBSD - a <a href="https://gyptazy.ch">gyptazy</a> service.
<br><a href="/privacy_policy/">[privacy policy]</a> / <a href="/imprint/">[imprint]</a></p></p>
</section>
</footer>
</body>
</html>

300
website/manpageblog Executable file
View file

@ -0,0 +1,300 @@
#!/usr/bin/env python3
# Copyright (c) 2023 Florian Paul Azim Hoberg @gyptazy <gyptazy@gyptazy.ch>
# 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*(.+?)\s*:\s*(.+?)\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()

View file