Eigener URL Shortener mit YOURLS, MariaDB und Nginx
3 min read

Eigener URL Shortener mit YOURLS, MariaDB und Nginx

Dienste wie bit.ly kennt jeder, mit YOURLS gibt es eine OpenSource Variante, die sich bei Bedarf jeder selbst installieren kann.
Eigener URL Shortener mit YOURLS, MariaDB und Nginx

Dienste wie bit.ly kennt jeder, mit YOURLS gibt es eine OpenSource Variante, die sich bei Bedarf jeder selbst installieren kann. Genau das werde ich im folgenden Beitrag zeigen und auf etwaige Besonderheiten näher eingehen.

Installation

Zuerst wird das System auf den aktuellen Stand gebracht, anschließend werden die benötigten Module nachinstalliert. Vorab benötigt wird lediglich ein Datenbank Server (hier MariaDB in version 10.5) sowie nginx als Webserver.

apt update && apt upgrade -y && apt install php php-fpm php-cli php-json php-mysql php-zip php-gd php-mbstring php-curl php-xml php-pear php-bcmath git unzip wget -y

Erstellen der Datenbank

Zuerst wird sich am Datenbankserver angemeldet, anschließend eine neue Datenbank erstellt und sämtliche Rechte an den neu erstellten User übergeben. Zuletzt wird die Datenbank aktualisiert, damit die eben getätigten Änderungen sofort wirksam werden.

# Anmeldung
mysql
# Erstellen der Datenbank
CREATE DATABASE yourlsdb;

# Übergeben der Rechte
MariaDB [(none)]> GRANT ALL PRIVILEGES ON yourlsdb.* TO 'yourls'@'localhost' IDENTIFIED BY "supersecurepassword";

# Änderungen sofort wirksam machen
FLUSH PRIVILEGES;

# Verlassen
EXIT;
SQL Befehle zum Erstellen der Datenbank

Im Anschluss daran, kann YOURLS von Github bezogen werden, zuvor sollte aber noch ins Webroot gewechselt werden:
cd /var/www/
git clone https://github.com/YOURLS/YOURLS.git

Danach kann in das eben geclonte Repository gewechselt werden, wo die weitere Konfiguration erledigt wird:
cd YOURLS/user/

Hier muss die Dummy Datei config-sample.php zur fertigen config.php kopiert werden:
cp config-sample.php config.php
Danach öffnet man die Datei zur weiteren Bearbeitung:
nano config.php

/** MySQL database username */
define( 'YOURLS_DB_USER', 'yourls' );
 
/** MySQL database password */
define( 'YOURLS_DB_PASS', 'password' );
 
/** The name of the database for YOURLS
 ** Use lower case letters [a-z], digits [0-9] and underscores [_] only */
define( 'YOURLS_DB_NAME', 'yourlsdb' );
 
/** MySQL hostname.
 ** If using a non standard port, specify it like 'hostname:port', eg. 'localhost:9999' or '127.0.0.1:666' */
define( 'YOURLS_DB_HOST', 'localhost' );
 
/** MySQL tables prefix
 ** YOURLS will create tables using this prefix (eg `yourls_url`, `yourls_options`, ...)
 ** Use lower case letters [a-z], digits [0-9] and underscores [_] only */
define( 'YOURLS_DB_PREFIX', 'yourls_' );
 
define( 'YOURLS_SITE', 'http://yourls.linuxbuz.com' );
$yourls_user_passwords = array(
        'admin' => 'adminpassword',

Anschließend setzen wir die Berechtigungen noch neu, um mögliche Sicherheitsrisiken zu minimieren. Der User www-data ist hierbei der User zum Betrieb des Webservers:

chown -R www-data:www-data /var/www/YOURLS
chmod -R 775 /var/www/YOURLS
Anpassen der Berechtigungen innerhalb des Webroot

Nginx Konfiguration

Jetzt fehlt lediglich noch die nginx Konfigurationsdatei, diese habe ich hier nach entsprechendem Muster aus dem Github Repo angepasst:

Die Datei wird unter /etc/nginx/conf.d/ angelegt:

nano linkshortener.conf

server {
  listen 80;
  # TODO
  server_name .b717.click;

  location / {
  	return 301 https://b717.click$request_uri;
  }

}

server {
   listen 443 ssl http2;
   # TODO
   server_name b717.click;
   root /var/www/YOURLS;
   
   # TODO
   # SSL ECC
   ssl_certificate /etc/letsencrypt/b717.click/ecc/fullchain.pem;
   ssl_certificate_key /etc/letsencrypt/b717.click/ecc/key.pem;

   index index.php index.html index.htm;
   location / {
    try_files $uri $uri/ /yourls-loader.php$is_args$args;
   }

# TODO
# logging
    access_log              /var/log/nginx/b717.click.access.log;
    error_log               /var/log/nginx/b717.click.error.log warn;
  
 # security
add_header X-Frame-Options           "SAMEORIGIN" always;
add_header X-XSS-Protection          "1; mode=block" always;
add_header X-Content-Type-Options    "nosniff" always;
add_header Referrer-Policy           "no-referrer-when-downgrade" always;
add_header Strict-Transport-Security "max-age=31536000; includeSubDomains" always;

# . files
location ~ /\.(?!well-known) {
    deny all;
}


  location ~ \.php$ {
    try_files $uri =404;
    fastcgi_split_path_info ^(.+\.php)(/.+)$;
    fastcgi_index index.php;
    fastcgi_param  SCRIPT_FILENAME  $document_root$fastcgi_script_name;
    fastcgi_pass unix:/var/run/php/php7.4-fpm.sock;
    include fastcgi_params;
  }
}
nginx Konfiguration

In der obigen Datei müssen die Zeilen die mit # TODO gekennzeichnet sind noch angepasst werden, wie etwa euer Domain Name für den passenden URL Shortener, oder eure Pfade zu den jeweiligen SSL Zertifikaten.

Im Anschluss daran kann mit nginx -t geprüft werden, ob es noch Fehler in der Konfiguration gibt. Lautet die Rückmeldung wie folgt:

nginx: the configuration file /etc/nginx/nginx.conf syntax is ok
nginx: configuration file /etc/nginx/nginx.conf test is successful

muss der Webserver nur noch neu gestartet werden, bevor im Webinstaller fortgefahren werden kann.
Da der Check der Konfiguration ohne Fehler durchgelaufen ist, wird der Webserver mit systemctl restart nginx neu gestartet.

Der Webinstaller ist unter https://domain.tld/admin erreichbar und ist mit einem Klick auf "Install Yourls" abgeschlossen.

Anschließend erfolgt die Anmeldung mit den vorher vergebenen Credentials aus der config.php.