# Uberspace

Die, die mit Pay what you want für Webhosting ein stabiles Business aufbauen konnten... Hut ab...

# how to ideally set up a new uberspace instance

1. create uberspace
2. create SSH key (with password, key longer than RSA 8192)
3. integrate SSH key into kitty (or your preferred program)
4. login SSH
5. ```
    uberspace tools version list php
    ```
6. ```
    uberspace tools version use php #(whatever is newest)
    ```
7. do the same thing with any other software you have to use (like MongoDB and so on) now: set the newest version BEFORE you begin projects.
8. ```
    uberspace web header set / Permissions-Policy "browsing-topics=()"
    ```
    
    (that's about Google Topics, formerly FLoC)
9. ```
    uberspace web domain add (your domain)
    ```
10. set DNS A records accordingly

planning to do WordPress? -&gt; [https://lab.uberspace.de/guide\_wordpress-bedrock/](https://lab.uberspace.de/guide_wordpress-bedrock/)

# Subdomains

<p class="callout danger">Im Manual von Uberspace wünscht man sich keine Subdomains. Sie überlasten Server weil sie tendenziell für einzelne Services stehen. Man bittet darum pro Funktion einen Space zu öffnen und nicht alles auf tendenziell niedrig bezahlten Pay-what-you-want-Servern zu lagern, weil das zwangsweise für alle auf dem Server schlechtere Performance bedeutet.</p>

### Subdomains einrichten

1. ```shell
    Uberspace web domain add subdomain.domain.tld
    ```
2. A (IPv4) und AAAA (IPv6) Record gemäß Output setzen. Falls gewünscht/möglich als Wildcard mit \*

#### Wenn Website (Apache) gewünscht

1. ```shell
    mkdir /var/www/virtual/$USER/subdomain
    ```

#### Wenn Service als Backend gewünscht

[https://manual.uberspace.de/web-backends/](https://manual.uberspace.de/web-backends/)

angepasst auf

```shell
uberspace web backend set subdomain.domain.tld --http --port <port>
```

#### Terminus

Subdomain = nur der Teil der die Subdomain bezeichnet (**ISABELL**.uber.space)

Domain = Domain (isabell.**UBER**.space)

tld = Top-Level-Domain (isabell.uber.**SPACE**)

<p class="callout info">Nach [Manual](https://manual.uberspace.de/web-domains/#subdomains) können Subdomains von Hauptdomains nicht in verschiedenen Uberspaces geteilt werden. (Auch wenn DNS-Einträge das splitten mehrerer Subdomains auf verschiedene Hosts theoretisch möglich machen würden)  
</p>

<p class="callout info">wenn mkdir nicht gemacht, landet subomain.domain.tld in /var/www/virtual/$USER/html ([src](https://twitter.com/hallouberspace/status/1516069606326161411))</p>

Gleiches natürlich dann auch mit Subdomains von uber.space oder mit Verkettung.

Beispiel: sub.isabell.uber.space

### Subdomains nach Wunsch aus Uberspace Manual

<p class="callout success">Zwei mal 2,50 € ist für die Lastverteilung besser als einmal 5 € für einen Space.</p>

1. [anderen Uberspace anlegen](https://wiki.notizlo.ch/books/uberspace/page/how-to-ideally-set-up-a-new-uberspace-instance)
2. uberspace web domain add subdomain.domain.tld
3. DNS record: subdomain im DNS record als A und AAAA gemäß output anlegen
4. gemäß der Info oben landet die Subdomain dann in /var/www/virtual/$USER/html

## Mailsubdomains

Ist mehr oder weniger das gleiche wie mit uberspace web domain add - nur dass web durch mail ersetzt wird.

# uberspace subcommands

just the console output of the commands to save it for later. Like manpages in the internet.

# Uberspace tools

###   


```shell
[$USER@$HOSTNAME ~]$ uberspace

Configure your Uberspace account.

usage: uberspace <sub-command> [options]
       uberspace --help

Possible commands:
  mail - Configure mail server.
  port - Open ports in the firewall for direct TCP or UDP connections.
  takeout - Help for 'takeout' (Beta)
  tools - Manage command line tools and programming languages.
  web - Configure web server.

[$USER@$HOSTNAME ~]$ uberspace tools

Manage command line tools and programming languages.

Possible commands:
  restart - Restart your running services.
  version - Manage installed versions of command line tools and programming languages.

[$USER@$HOSTNAME ~]$ uberspace tools restart

Restart your running services.

Possible commands:
  php - restart your php-fpm instance

[$USER@$HOSTNAME ~]$ uberspace tools version

Manage installed versions of command line tools and programming languages.

Possible commands:
  list - List available versions
  show - Show selected version
  use - Select version

[$USER@$HOSTNAME ~]$ uberspace tools version list
- couchdb
- erlang
- mongodb
- node
- php
- postgresql
- prolog
- ruby
- rust
[$USER@$SERVER ~]$ uberspace tools version show -h
usage: uberspace-tools-version-show [-h] [-v] feature

Show selected version

required arguments:
  feature        the feature which should be modified (e.g. php)

optional arguments:
  -h, --help     show this help message and exit
  -v, --verbose  run with a lot of debugging output
[$USER@$SERVER ~]$ uberspace tools version use -h
usage: uberspace-tools-version-use [-h] [-v] feature release

Select version

required arguments:
  feature        the feature which should be modified (e.g. php)
  release        release version number in the form of "Major" (e.g. "7") or
                 "Major.Minor" (e.g. "7.0") you wish to set

optional arguments:
  -h, --help     show this help message and exit
  -v, --verbose  run with a lot of debugging output
```

### available versions  


```shell
[$USER@$HOSTNAME ~]$ date
Wed 20 Apr 17:55:51 CEST 2022
[$USER@$HOSTNAME ~]$ uberspace tools version list couchdb
- 3
[$USER@$HOSTNAME ~]$ uberspace tools version list erlang
- 20
- 21
- 22
- 23
- 24
[$USER@$HOSTNAME ~]$ uberspace tools version list mongodb
- 4.0
- 4.2
- 4.4
- 5.0
[$USER@$HOSTNAME ~]$ uberspace tools version list node
- 12
- 14
- 16
[$USER@$HOSTNAME ~]$ uberspace tools version list php
- 7.4
- 8.0
- 8.1
[$USER@$HOSTNAME ~]$ uberspace tools version list postgresql
- 10
- 11
- 12
- 13
[$USER@$HOSTNAME ~]$ uberspace tools version list prolog
- stable
[$USER@$HOSTNAME ~]$ uberspace tools version list ruby
- 2.5
- 2.6
- 2.7
- 3.0
[$USER@$HOSTNAME ~]$ uberspace tools version list rust
- stable

```

someone should make a debugger for rust and call it wd40... (it's my joke from [over five years ago](https://devrant.com/rants/557405/debugger-for-rust-call-it-wd40) 😊)

# Uberspace mail

<p class="callout info">If there's no MX pointing to the Uberspace server, every mailbox will end up on @$USER.uber.space</p>

<p class="callout danger">adresses like ![📧](https://abs-0.twimg.com/emoji/v2/72x72/1f4e7.png "E-Mail Symbol")<span class="css-901oao css-16my406 r-poiln3 r-bcqeeo r-qvutc0">.$USER.uber.space (i.e. created as punycode variant xn--du8h are inconsistent between server and client. ([src](https://twitter.com/hallouberspace/status/1517965331305836544))  
Here I just have to experiment more.  
Because of the parallels to domains I assume that punycode can also be applied to mail addresses and that emojis can be used as normal ASCII chars.</span></p>

# Uberspace port



# Uberspace takeout



# Uberspace web

# ChatGPT Landingpage

### landing-chatgpt.php

```php

<html lang="de">
<head>
  <meta charset="UTF-8">
  <title>Wichtige Hinweise zu KI-generierten Links</title>
  <meta name="viewport" content="width=device-width, initial-scale=1">
  <style>
body{font-family:sans-serif;line-height:1.6;background-color:#f9f9f9;color:#333;max-width:700px;margin:3em auto;padding:2em;box-shadow:0 0 10px rgba(0,0,0,0.05)}h1{color:#c0392b}a{color:#2980b9}@media (prefers-color-scheme: dark){body{background-color:#1e1e1e;color:#f1f1f1}h1{color:#e74c3c}a{color:#81c8ff}.button{background-color:#3498db;color:white}.button:hover{background-color:#2980b9}.button,button.button,p[style]{color:inherit}.button{border:1px solid rgba(255,255,255,0.1)}}
  </style>
</head>
<body>

  <p style="margin-top: 2em; font-size: 0.9em; color: #777;">
    Diese Nachricht wird Ihnen im Sinne digitaler Aufklärung angezeigt.
  </p>
      
  <h1>Bitte beachten Sie:</h1>
  <p>Sie wurden über einen Link mit dem Zusatz <strong>?utm_source=chatgpt.com</strong> auf diese Website weitergeleitet.</p>

  <p>Das bedeutet, dass dieser Link möglicherweise von einer KI wie <strong>ChatGPT</strong> vorgeschlagen wurde.</p>
    <p>
    Diese Website möchte Sie sensibilisieren: <strong>Überprüfen Sie immer die Quelle und den Kontext</strong>, bevor Sie einer Empfehlung folgen.
  </p>

  <h2>Vertrauen Sie nicht blind!</h2>
  <p>Auch wenn Künstliche Intelligenz beeindruckende Texte erstellen kann, ist sie nicht unfehlbar. </p>
  <ul>
  <li>Links, die von KI-Systemen generiert werden, können sehr relevant wirken, aber in kleinen Details von der tatsächlichen Wahrheit abweichen oder nicht auf Ihren Anwendungszweck passen.</li>
    <li> Lesen Sie vollständige Artikel auf den vorsgeschlagenen Links und nicht nur die Bereiche auf die sich das KI-System offensichtlich bezieht.</li>
    </ul>
    
<h2>Grundlegende Funktionsweise von KI:</h2>
  <ul>
  <li>Eine künstliche Intelligenz hat <strong>keinerlei Themenkenntnis.</strong></li>
  <li>Die Hauptaufgabe einer KI besteht darin, jene <strong>Wortkombinationen zu finden</strong>, die mit hoher Wahrscheinlichkeit als passende Antwort auf Ihre Eingabe erscheinen.</li>
  <li>Um diese Aufgabe zu erfüllen kennt die KI <strong>Wahrscheinlichkeitswerte existierender Wortreihenfolgen</strong> einer sehr großen Datenbasis.</li>
  <li>Ihre KI-Ausgabe ist die <strong>wahrscheinlichste Wortreihenfolge die zu Ihrer Texteingabe passen könnte</strong>.</li>
  <li>Daher hat die Ausgabe Ihrer KI-Antwort nur etwas mit sprachlichen Wahrscheinlichkeiten zu tun, eine sachlich korrekte Ausgabe ist zwar häufig der Fall, aber nie das primäre Ziel der KI.</li>
  <li>Dies steht im Widerspruch zur Erwartung der meisten Anwender über die Funktionsweise von KI-Systemen.</li>
  </ul>



  <h2>Was Sie jetzt tun können:</h2>
  
<ul>
 <li>Nutzen Sie mithilfe der Textausgabe des KI-Systems zusätzlich klassische Internetsuchen wie Google.</li>
  <li>Gehen Sie zurück zur Startseite und suchen Sie mit der dortigen Suche nach Ihrem Thema.</li>
  <li>Stellen Sie sicher, dass Sie vertrauenswürdige Informationen konsumieren</li>
</ul>

<?php
$target = $_GET['target'] ?? '/';
$safeTarget = htmlspecialchars($target);
?>
<div style="margin-top: 2em;">
  <a href="<?= $safeTarget ?>" class="button">Trotzdem fortfahren</a>
  <a href="/" class="button">Startseite</a>
  <button onclick="history.back()" class="button">Zurück zur KI-Ausgabe</button>
</div>

<style>
.button{display:inline-block;margin:0.5em 0.5em 0.5em 0;padding:0.6em 1.2em;background-color:#2980b9;color:white;text-decoration:none;border-radius:4px;border:none;cursor:pointer;font-size:1em}.button:hover{background-color:#1f6691}button.button{font-family:inherit}
</style>

  <p style="margin-top: 2em; font-size: 0.9em; color: #777;">
    Diese Nachricht wird Ihnen im Sinne digitaler Aufklärung angezeigt.
  </p>
</body>
</html>
```

<details id="bkmrk-minified-%3C%21doctypeht"><summary>minified</summary>

```php
<!doctypehtml><html lang="de"><head><meta charset="UTF-8"><title>Wichtige Hinweise zu KI-generierten Links</title><meta content="width=device-width,initial-scale=1"name="viewport"><style>body{font-family:sans-serif;line-height:1.6;background-color:#f9f9f9;color:#333;max-width:700px;margin:3em auto;padding:2em;box-shadow:0 0 10px rgba(0,0,0,.05)}h1{color:#c0392b}a{color:#2980b9}@media (prefers-color-scheme:dark){body{background-color:#1e1e1e;color:#f1f1f1}h1{color:#e74c3c}a{color:#81c8ff}.button{background-color:#3498db;color:#fff}.button:hover{background-color:#2980b9}.button,button.button,p[style]{color:inherit}.button{border:1px solid rgba(255,255,255,.1)}}</style></head><body><p style="margin-top:2em;font-size:.9em;color:#777">Diese Nachricht wird Ihnen im Sinne digitaler Aufklärung angezeigt.</p><h1>Bitte beachten Sie:</h1><p>Sie wurden über einen Link mit dem Zusatz <strong>?utm_source=chatgpt.com</strong> auf diese Website weitergeleitet.</p><p>Das bedeutet, dass dieser Link möglicherweise von einer KI wie <strong>ChatGPT</strong> vorgeschlagen wurde.</p><p>Diese Website möchte Sie sensibilisieren: <strong>Überprüfen Sie immer die Quelle und den Kontext</strong>, bevor Sie einer Empfehlung folgen.</p><h2>Vertrauen Sie nicht blind!</h2><p>Auch wenn Künstliche Intelligenz beeindruckende Texte erstellen kann, ist sie nicht unfehlbar.</p><ul><li>Links, die von KI-Systemen generiert werden, können sehr relevant wirken, aber in kleinen Details von der tatsächlichen Wahrheit abweichen oder nicht auf Ihren Anwendungszweck passen.</li><li>Lesen Sie vollständige Artikel auf den vorsgeschlagenen Links und nicht nur die Bereiche auf die sich das KI-System offensichtlich bezieht.</li></ul><h2>Grundlegende Funktionsweise von KI:</h2><ul><li>Eine künstliche Intelligenz hat <strong>keinerlei Themenkenntnis.</strong></li><li>Die Hauptaufgabe einer KI besteht darin, jene <strong>Wortkombinationen zu finden</strong>, die mit hoher Wahrscheinlichkeit als passende Antwort auf Ihre Eingabe erscheinen.</li><li>Um diese Aufgabe zu erfüllen kennt die KI <strong>Wahrscheinlichkeitswerte existierender Wortreihenfolgen</strong> einer sehr großen Datenbasis.</li><li>Ihre KI-Ausgabe ist die <strong>wahrscheinlichste Wortreihenfolge die zu Ihrer Texteingabe passen könnte</strong>.</li><li>Daher hat die Ausgabe Ihrer KI-Antwort nur etwas mit sprachlichen Wahrscheinlichkeiten zu tun, eine sachlich korrekte Ausgabe ist zwar häufig der Fall, aber nie das primäre Ziel der KI.</li><li>Dies steht im Widerspruch zur Erwartung der meisten Anwender über die Funktionsweise von KI-Systemen.</li></ul><h2>Was Sie jetzt tun können:</h2><ul><li>Nutzen Sie mithilfe der Textausgabe des KI-Systems zusätzlich klassische Internetsuchen wie Google.</li><li>Gehen Sie zurück zur Startseite und suchen Sie mit der dortigen Suche nach Ihrem Thema.</li><li>Stellen Sie sicher, dass Sie vertrauenswürdige Informationen konsumieren</li></ul><?php $target=$_GET['target']?? '/';$safeTarget=htmlspecialchars($target); ?><div style="margin-top:2em"><a class="button"href="<?=$safeTarget?>">Trotzdem fortfahren</a> <a class="button"href="/">Startseite</a> <button class="button"onclick="history.back()">Zurück zur KI-Ausgabe</button></div><style>.button{display:inline-block;margin:.5em .5em .5em 0;padding:.6em 1.2em;background-color:#2980b9;color:#fff;text-decoration:none;border-radius:4px;border:none;cursor:pointer;font-size:1em}.button:hover{background-color:#1f6691}button.button{font-family:inherit}</style><p style="margin-top:2em;font-size:.9em;color:#777">Diese Nachricht wird Ihnen im Sinne digitaler Aufklärung angezeigt.</p></body></html>
```

</details>### .htaccess

```
RewriteEngine On

# Bei utm_source=chatgpt.com wird auf Landingpage geleitet, ursprünglichen Pfad als target übergeben
RewriteCond %{QUERY_STRING} (^|&)utm_source=chatgpt\.com(&|$)
RewriteRule ^(.*)$ /landing-chatgpt.php?target=%{REQUEST_URI} [R=302,L]
```

</body></html>