Author Archives: manuel

Get script directory in Bash

If you need to get the script directory of an executed bash script you can use the following snippet to cd to the script directory:

#!/bin/bash
DIR="$( cd "$( dirname "${BASH_SOURCE[0]}" )" >/dev/null 2>&1 && pwd )"
cd "$DIR" || exit 1

Add docker to unattended-upgrades in ubuntu 20.04

If you want your server to install docker updates automatically then you need to add the docker repository to the list of allowed origins. Otherwise docker updates will stay untouched by unattended-update which will looks similar to this when you login and check which updates need to be installed. Had that quite some times until I decided to look into this.

sudo apt dist-upgrade 
...
The following packages will be upgraded:
  containerd.io docker-ce docker-ce-cli

As you can see all docker packages (coming from https://download.docker.com/linux/ubuntu) weren’t updated. This happens because this origin isn’t in the allowed origin list of unattended-upgrade. You can see metadata of the repository by running

apt-cache policy

There you will find an entry like this

 500 https://download.docker.com/linux/ubuntu focal/stable amd64 Packages
     release o=Docker,a=focal,l=Docker CE,c=stable,b=amd64
     origin download.docker.com

The important part is the o and a in this definition. Those state the origin and the archive.

To allow the docker repo as an origin you need to open /etc/apt/apt.conf.d/50unattended-upgrades with root access and add

"Docker:${distro_codename}";

to the list in Unattended-Upgrade::Allowed-Origins. The syntax is short for “origin:archive”.

Here the allowed origins list from my file as an example:

Unattended-Upgrade::Allowed-Origins {
        "${distro_id}:${distro_codename}";
        "${distro_id}:${distro_codename}-security";
        "${distro_id}ESMApps:${distro_codename}-apps-security";
        "${distro_id}ESM:${distro_codename}-infra-security";
        "${distro_id}:${distro_codename}-updates";
        "Docker:${distro_codename}";
};

I replaced the archive name focal with the variable distro_codename like the existing examples also did. This will help in a future dist upgrade if you plan to upgrade your os for example with the next lts version.

With those changes in place unattended-upgrade should also install updates for docker from now on.

The same procedure can be followed to add other repositories to this list as well.

Teamspeak server

If you want to host your own teamspeak server this can be done quite easily with a server and docker-compose. Here is the example I tried:

version: '3.1'
services:
  teamspeak:
    image: teamspeak
    restart: always
    ports:
      - 9987:9987/udp
      - 10011:10011
      - 30033:30033
    environment:
      TS3SERVER_DB_PLUGIN: ts3db_mariadb
      TS3SERVER_DB_SQLCREATEPATH: create_mariadb
      TS3SERVER_DB_HOST: db
      TS3SERVER_DB_USER: root
      TS3SERVER_DB_PASSWORD: tsmysqlpass
      TS3SERVER_DB_NAME: teamspeak
      TS3SERVER_DB_WAITUNTILREADY: 30
      TS3SERVER_LICENSE: accept
  db:
    image: mariadb
    restart: always
    environment:
      MYSQL_ROOT_PASSWORD: tsmysqlpass
      MYSQL_DATABASE: teamspeak

You will need a dns entry or the ip of the server to connect with your teamspeak client. With the client you can then add a password to protect the server. I didn’t find a docker config to set it.

ATTENTION: If you don’t secure the server with credentials it will be open for everybody.

Nextcloud fix installation

After some updates the installation/the database needs to be fixed. This can be done with the command line tool on a debian system where the installation belongs to the apache user www-data:

cd <installdir>
sudo -u www-data php occ db:add-missing-indices
sudo -u www-data php occ db:add-missing-columns

Resize mp4 with ffmpeg

Zoom didn’t want to accept a background video so I tried to find a way to shrink its size to 1080p. There is a simple command to do that with ffmpeg:

ffmpeg -i original.mp4 -vf scale=1920:1080 new_1080p.mp4

DaVinci Resolve 16 Linux mp4/h.264 encode/decode

DaVinci Resolve doesn’t support import or export of mp4 format on Linux. It is working on Windows 10, but I really don’t want to switch to boot into Windows for rendering.

So i looked around and found a workflow for using Resolve under Linux: ffmpeg is my tool of choice to change formats so that Resolve is able to load and write my videos.

My recordings from OBS are saved as mkv as proposed by an OBS warning in the recording settings.

mkv to mov

ffmpeg -i input.mkv -map 0:0 -map 0:1 -map 0:2 -vcodec dnxhd -acodec:0 pcm_s16le -acodec:1 pcm_s16le -s 1920x1080 -r 30000/1001 -b:v 36M -pix_fmt yuv422p -f mov output.mov

After converting the recording to the mov format DaVinci Resolve 16 is able to use the file with all audio tracks.

mp4 to mov

If I get videos from other sources most of the time its in mp4 format. With the following command I convert the mp4 to DaVinci Resolve usable mov:

ffmpeg -i input.mp4 -vcodec dnxhd -acodec pcm_s16le -s 1920x1080 -r 30000/1001 -b:v 36M -pix_fmt yuv422p -f mov output.mov

mov to mp4

In DaVinci Resolve 16 I export my videos with mov format and then convert them to youtube ready mp4 with this command:

ffmpeg -i input.mov -vf yadif -codec:v libx264 -crf 1 -bf 2 -flags +cgop -pix_fmt yuv420p -codec:a aac -strict -2 -b:a 384k -r:a 48000 -movflags faststart output.mp4

TLDR

DaVinci Resolve 16 does NOT support h.264 en-/decoding on Linux and you have to transcode your videos for example with ffmpeg as shown above. Transcoding is quite fast also on my 6 year old machine.

Windows ln style softlinks with mklink

You can use softlinks (linux: ln -s source target) under windows.

MKLINK [[/D] | [/H] | [/J]] Link Target

        /D      Creates a directory symbolic link.  Default is a file
                symbolic link.
        /H      Creates a hard link instead of a symbolic link.
        /J      Creates a Directory Junction.
        Link    Specifies the new symbolic link name.
        Target  Specifies the path (relative or absolute) that the new link
                refers to.

The example mklink /D jdk11 jdk-11.0.7.10-hotspot will create a softlink with name jdk11 to folder jdk-11.0.7.10-hotspot in the same directory.

Update

This page now also supports translations. I am going to try writing posts in English and German from now. Old pages won’t be translated unless somebody requests it.

How NOT to offer a product

Its quite common to offer freemium software with missing premium features but writing a paid product (without a free version at all) that targets to send personal data over a network and make users upgrade from the basic to pro version to at least have their private data encrypted is an absolute no-go in my opinion. I cut out the relevant part of the offer. Basic version is 29 and pro 39 USD.