diff --git a/extras/packaging/Jenkinsfile b/extras/packaging/Jenkinsfile
index 48761c5eabaa8ca0cab7398084464baf95d5c229..d1040fad66c65c29af804b982fb7da0c3e536474 100644
--- a/extras/packaging/Jenkinsfile
+++ b/extras/packaging/Jenkinsfile
@@ -84,47 +84,57 @@ pipeline {
             }
         }
         stage('Build distributions') {
-            parallel {
-                stage('Ubuntu 22.04') {
-                    steps {
-                        dir('extras/packaging') {
-                            sh """
-                                target="ubuntu-22"
-                                mkdir -p "\$target"
-                                docker build -t "dhtnet-builder:\$target" -f "gnu-linux/\$target.Dockerfile" --build-arg PKG_NAME="$FOLDER_NAME" .
-                                docker run --rm \
-                                    -v "\$(pwd)/\$target/":/build/artifacts \
-                                    -e PKG_NAME="$FOLDER_NAME" "dhtnet-builder:\$target"
-                            """
-                        }
+            matrix {
+                axes {
+                    axis {
+                        name 'TARGET'
+                        values 'ubuntu_22.04', 'ubuntu_24.04', 'debian_12'/*, 'fedora_39', 'fedora_40', 'almalinux_9'*/
                     }
                 }
-                stage('Ubuntu 24.04') {
-                    steps {
-                        dir('extras/packaging') {
-                            sh """
-                                target="ubuntu-24"
-                                mkdir -p "\$target"
-                                docker build -t "dhtnet-builder:\$target" -f "gnu-linux/\$target.Dockerfile" --build-arg PKG_NAME="$FOLDER_NAME" .
-                                docker run --rm \
-                                    -v "\$(pwd)/\$target/":/build/artifacts \
-                                    -e PKG_NAME="$FOLDER_NAME" "dhtnet-builder:\$target"
-                            """
+                stages {
+                    stage('Build') {
+                        steps {
+                            dir('extras/packaging') {
+                                sh """
+                                    target="${TARGET}"
+                                    mkdir -p "\$target"
+                                    docker build -t "dhtnet-builder:\$target" -f "gnu-linux/\$target.Dockerfile" --build-arg PKG_NAME="$FOLDER_NAME" .
+                                    docker run --rm \
+                                        -v "\$(pwd)/\$target/":/build/artifacts \
+                                        -e PKG_NAME="$FOLDER_NAME" "dhtnet-builder:\$target"
+                                """
+                            }
                         }
                     }
                 }
-                stage('Debian 12') {
-                    steps {
-                        dir('extras/packaging') {
-                            sh """
-                                target="debian-12"
-                                mkdir -p "\$target"
-                                docker build -t "dhtnet-builder:\$target" -f "gnu-linux/\$target.Dockerfile" --build-arg PKG_NAME="$FOLDER_NAME" .
-                                docker run --rm \
-                                    -v "\$(pwd)/\$target/":/build/artifacts \
-                                    -e PKG_NAME="$FOLDER_NAME" "dhtnet-builder:\$target"
-                            """
-                        }
+            }
+        }
+        stage('Publish to dhtnet.sfl.io') {
+            steps {
+                dir('extras/packaging') {
+                    sshagent(credentials: [JENKINS_SSH_KEY, DL_SSH_KEY]) {
+                        sh """
+                            mkdir -p publish
+                            cp -R --parents ubuntu_*/dhtnet_*.deb publish/
+                            cp -R --parents debian_*/dhtnet_*.deb publish/
+                            # cp -R --parents fedora_*/dhtnet-*.rpm publish/
+                            # cp -R --parents almalinux_*/dhtnet-*.rpm publish/
+
+                            rm -Rf publish/**/*debug*
+                            rm -Rf publish/**/*.src.*
+
+                            if [ -f "\${SSH_IDENTITY_FILE}" ]; then
+                                export RSYNC_RSH="ssh -i \${SSH_IDENTITY_FILE}"
+                            fi
+
+                            echo "##########################"
+                            echo "## deploying repository ##"
+                            echo "##########################"
+                            echo "Using RSYNC_RSH='\${RSYNC_RSH}'"
+                            rsync --archive --recursive --verbose \
+                                --delete publish/ \
+                                "${REMOTE_HOST}:/srv/repository/dhtnet/$PUBLISH_CHANNEL"
+                        """
                     }
                 }
             }
diff --git a/extras/packaging/build_packages.sh b/extras/packaging/build_packages.sh
index 38e50f2dcef6c3e226e1ac4624ff31fb37d2cda8..95588ca50df1b1fcd8e3d2a3add89a873a36fc44 100755
--- a/extras/packaging/build_packages.sh
+++ b/extras/packaging/build_packages.sh
@@ -1,13 +1,14 @@
 #!/bin/bash
 set -e
 
+# move pwd to the directory of this script (extras/packaging)
+cd "$(dirname "$0")" || exit 1
+
 PKG_NAME=dhtnet
-PKG_VERSION="$(head -1 extras/packaging/build.version | grep -o '^[0-9\.]\+$' -)"
+PKG_VERSION="$(head -1 build.version | grep -o '^[0-9\.]\+$' -)"
 
 FOLDER_NAME="${PKG_NAME}-${PKG_VERSION}"
 
-# move pwd to the directory of this script (extras/packaging)
-cd "$(dirname "$0")" || exit 1
 
 rm -Rf "${FOLDER_NAME}"
 rm -f -- *${PKG_NAME}-${PKG_VERSION}.tar.gz
@@ -20,9 +21,9 @@ rm -Rf "../../dependencies/restinio"
 (cd ../.. && git submodule update --init --recursive)
 
 build_ubuntu=false
-build_ubuntu20=false
-build_ubuntu22=false
-build_ubuntu24=false
+build_ubuntu20_04=false
+build_ubuntu22_04=false
+build_ubuntu24_04=false
 build_debian=false
 build_debian10=false
 build_debian11=false
@@ -31,45 +32,45 @@ build_debian12=false
 parse_args() {
     while [ "$1" != "" ]; do
         case $1 in
-            -u | --ubuntu )         build_ubuntu=true
-                                    build_ubuntu20=true
-                                    build_ubuntu22=true
-                                    build_ubuntu24=true
-                                    ;;
-            -u20 | --ubuntu20 )     build_ubuntu20=true
-                                    build_ubuntu=true
-                                    ;;
-            -u22 | --ubuntu22 )     build_ubuntu22=true
-                                    build_ubuntu=true
-                                    ;;
-            -u24 | --ubuntu24 )     build_ubuntu24=true
-                                    build_ubuntu=true
-                                    ;;
-            -d | --debian )         build_debian=true
-                                    build_debian10=true
-                                    build_debian11=true
-                                    build_debian12=true
-                                    ;;
-            -d10 | --debian10 )     build_debian10=true
-                                    build_debian=true
-                                    ;;
-            -d11 | --debian11 )     build_debian11=true
-                                    build_debian=true
-                                    ;;
-            -d12 | --debian12 )     build_debian12=true
-                                    build_debian=true
-                                    ;;
-            -a | --all )            build_ubuntu=true
-                                    # not working: build_ubuntu20=true
-                                    build_ubuntu22=true
-                                    build_ubuntu24=true
-                                    build_debian=true
-                                    # not working: build_debian10=true
-                                    # not working: build_debian11=true
-                                    build_debian12=true
-                                    ;;
-            * )                     echo "Argument '$1' is not recognized"
-                                    ;;
+            -u | --ubuntu )                     build_ubuntu=true
+                                                build_ubuntu20_04=true
+                                                build_ubuntu22_04=true
+                                                build_ubuntu24_04=true
+                                                ;;
+            -u20 | -u20.04 | --ubuntu20.04 )    build_ubuntu20_04=true
+                                                build_ubuntu=true
+                                                ;;
+            -u22 | -u22.04 | --ubuntu22.04 )    build_ubuntu22_04=true
+                                                build_ubuntu=true
+                                                ;;
+            -u24 | -u24.04 | --ubuntu24.04 )    build_ubuntu24_04=true
+                                                build_ubuntu=true
+                                                ;;
+            -d | --debian )                     build_debian=true
+                                                build_debian10=true
+                                                build_debian11=true
+                                                build_debian12=true
+                                                ;;
+            -d10 | --debian10 )                 build_debian10=true
+                                                build_debian=true
+                                                ;;
+            -d11 | --debian11 )                 build_debian11=true
+                                                build_debian=true
+                                                ;;
+            -d12 | --debian12 )                 build_debian12=true
+                                                build_debian=true
+                                                ;;
+            -a | --all )                        build_ubuntu=true
+                                                # not working: build_ubuntu20=true
+                                                build_ubuntu22_04=true
+                                                build_ubuntu24_04=true
+                                                build_debian=true
+                                                # not working: build_debian10=true
+                                                # not working: build_debian11=true
+                                                build_debian12=true
+                                                ;;
+            * )                                 echo "Argument '$1' is not recognized"
+                                                ;;
         esac
         shift
     done
@@ -127,29 +128,29 @@ build_target() {
 }
 
 # build Ubuntu package (deb-*)
-if [ "$build_ubuntu24" == true ]; then
-    build_target "ubuntu-24"
+if [ "$build_ubuntu24_04" == true ]; then
+    build_target "ubuntu_24.04"
 fi
 
-if [ "$build_ubuntu22" == true ]; then
-    build_target "ubuntu-22"
+if [ "$build_ubuntu22_04" == true ]; then
+    build_target "ubuntu_22.04"
 fi
 
-if [ "$build_ubuntu20" == true ]; then
-    build_target "ubuntu-20"
+if [ "$build_ubuntu20_04" == true ]; then
+    build_target "ubuntu_20.04"
 fi
 
 # build Debian package (deb-*)
 if [ "$build_debian12" == true ]; then
-    build_target "debian-12"
+    build_target "debian_12"
 fi
 
 if [ "$build_debian11" == true ]; then
-    build_target "debian-11"
+    build_target "debian_11"
 fi
 
 if [ "$build_debian10" == true ]; then
-    build_target "debian-10"
+    build_target "debian_10"
 fi
 
 
diff --git a/extras/packaging/gnu-linux/debian-10.Dockerfile b/extras/packaging/gnu-linux/debian_10.Dockerfile
similarity index 100%
rename from extras/packaging/gnu-linux/debian-10.Dockerfile
rename to extras/packaging/gnu-linux/debian_10.Dockerfile
diff --git a/extras/packaging/gnu-linux/debian-11.Dockerfile b/extras/packaging/gnu-linux/debian_11.Dockerfile
similarity index 100%
rename from extras/packaging/gnu-linux/debian-11.Dockerfile
rename to extras/packaging/gnu-linux/debian_11.Dockerfile
diff --git a/extras/packaging/gnu-linux/debian-12.Dockerfile b/extras/packaging/gnu-linux/debian_12.Dockerfile
similarity index 100%
rename from extras/packaging/gnu-linux/debian-12.Dockerfile
rename to extras/packaging/gnu-linux/debian_12.Dockerfile
diff --git a/extras/packaging/gnu-linux/ubuntu-20.Dockerfile b/extras/packaging/gnu-linux/ubuntu_20.04.Dockerfile
similarity index 100%
rename from extras/packaging/gnu-linux/ubuntu-20.Dockerfile
rename to extras/packaging/gnu-linux/ubuntu_20.04.Dockerfile
diff --git a/extras/packaging/gnu-linux/ubuntu-22.Dockerfile b/extras/packaging/gnu-linux/ubuntu_22.04.Dockerfile
similarity index 100%
rename from extras/packaging/gnu-linux/ubuntu-22.Dockerfile
rename to extras/packaging/gnu-linux/ubuntu_22.04.Dockerfile
diff --git a/extras/packaging/gnu-linux/ubuntu-24.Dockerfile b/extras/packaging/gnu-linux/ubuntu_24.04.Dockerfile
similarity index 100%
rename from extras/packaging/gnu-linux/ubuntu-24.Dockerfile
rename to extras/packaging/gnu-linux/ubuntu_24.04.Dockerfile