diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml
index e3385bbc5cb858f46142c1640f89c353e498ed47..0f7b41908ac7506217f4948c14694afe53c66a3f 100644
--- a/.gitlab-ci.yml
+++ b/.gitlab-ci.yml
@@ -11,6 +11,31 @@ before_script:
   - uname -a
   - python3 -m pylint --version
   - python3 -m coverage --version
+  - echo "${CI_COMMIT_TAG}" | grep -qE "v[0-9]+[.][0-9]+[.][0-9]+.*" && export UFFD_PACKAGE_VERSION="${CI_COMMIT_TAG#v}" || export UFFD_PACKAGE_VERSION="${CI_COMMIT_SHA}"
+
+build:pip:
+  stage: build
+  script:
+  - pip3 install build
+  - PACKAGE_VERSION="${UFFD_PACKAGE_VERSION}" python3 -m build
+  artifacts:
+    paths:
+      - dist/*
+
+build:apt:
+  stage: build
+  script:
+    - apt update
+    - apt-get install -y python3-all debhelper python3-pip git-buildpackage
+    - export PYBUILD_INSTALL_ARGS="--install-lib=/usr/share/uffd/ --install-scripts=/usr/share/uffd/"
+    - gbp dch --ignore-branch --debian-tag=v%\(version\)s
+    - dpkg-buildpackage -us -uc
+    - mkdir build
+    - mv ../*.deb build/
+  artifacts:
+    paths:
+      - build/*.deb
+      - debian/changelog
 
 db_migrations_updated:
   stage: test
@@ -72,12 +97,22 @@ trans_de:
   - ./update_translations.sh de
   coverage: '/^TOTAL.*\s+(\d+\%)$/'
 
-publish-pip:
+publish:pip:
   stage: deploy
   script:
-  - pip3 install build twine
-  - PACKAGE_VERSION="${CI_COMMIT_TAG#v}" python3 -m build
+  - pip3 install twine
   - TWINE_USERNAME="${GITLABPKGS_USERNAME}" TWINE_PASSWORD="${GITLABPKGS_PASSWORD}" python3 -m twine upload --repository-url ${CI_API_V4_URL}/projects/${CI_PROJECT_ID}/packages/pypi dist/*
   - TWINE_USERNAME="${PYPI_USERNAME}" TWINE_PASSWORD="${PYPI_PASSWORD}" python3 -m twine upload dist/*
+  dependencies:
+  - build:pip
+  rules:
+    - if: '$CI_COMMIT_TAG =~ /v[0-9]+[.][0-9]+[.][0-9]+.*/'
+
+publish:apt:
+  stage: deploy
+  script:
+  - exit 0
+  dependencies:
+  - build:apt
   rules:
     - if: '$CI_COMMIT_TAG =~ /v[0-9]+[.][0-9]+[.][0-9]+.*/'
diff --git a/MANIFEST.in b/MANIFEST.in
new file mode 100644
index 0000000000000000000000000000000000000000..d5e3a5620cdb7519a75ec4684c8ce53e8751f3ce
--- /dev/null
+++ b/MANIFEST.in
@@ -0,0 +1,6 @@
+include setup.py
+graft migrations/*
+graft uffd/templates
+graft uffd/*/templates
+graft uffd/static/
+graft uffd/translations/
diff --git a/README.md b/README.md
index a4ded7a174b281ddf4c57da2fcb8c8262458e80f..9d28e898abf0ea8867e25f2b24fa4544ed53aa81 100644
--- a/README.md
+++ b/README.md
@@ -41,27 +41,7 @@ Please note that the mocked LDAP functionality is very limited and many uffd fea
 ## deployment
 
 Use uwsgi. Make sure to run `flask db upgrade` after every update!
-
-### example uwsgi config
-
-```
-[uwsgi]
-plugin = python3
-env = PYTHONIOENCODING=UTF-8
-env = LANG=en_GB.utf8
-env = TZ=Europe/Berlin
-manage-script-name = true
-chdir = /var/www/uffd
-module = uffd:create_app()
-
-uid = uffd
-gid = uffd
-
-vacuum = true
-die-on-term = true
-
-hook-pre-app = exec:FLASK_APP=uffd flask db upgrade
-```
+For an example uwsgi config, see our [uswgi.ini](uwsgi.ini). You might find our [nginx include file](nginx.include.conf) helpfull to setup a web server infront of uwsgi.
 
 ## python style conventions
 
@@ -114,7 +94,7 @@ The userinfo endpoint returns json data with the following structure:
 
 ## Translation
 
-The web frontend is translated in the following Languages:
+The web frontend is initially written in English and translated in the following Languages:
 
 ![status](https://git.cccv.de/uffd/uffd/badges/master/coverage.svg?job=trans_de&key_text=DE)
 
diff --git a/debian/changelog b/debian/changelog
new file mode 100644
index 0000000000000000000000000000000000000000..8ec8f739601766e7ae19ea48b4213e6f0dcbdf49
--- /dev/null
+++ b/debian/changelog
@@ -0,0 +1,5 @@
+uffd (0.1.2) unstable; urgency=medium
+
+  * Initial release.
+
+ -- Andreas Valder <nd@cccv.de>  Fri, 31 Jul 2021 23:02:31 +0200
diff --git a/debian/control b/debian/control
new file mode 100644
index 0000000000000000000000000000000000000000..5d85a101a4013f352c8c8cbc2072b0cd4cb703a4
--- /dev/null
+++ b/debian/control
@@ -0,0 +1,30 @@
+Source: uffd
+Section: python
+Priority: optional
+Maintainer: CCCV <it@cccv.de>
+Build-Depends:
+ debhelper-compat (= 12),
+ dh-python,
+ python3-all,
+ python3-setuptools,
+Standards-Version: 4.5.0
+Homepage: https://git.cccv.de/uffd/uffd
+Vcs-Git: https://git.cccv.de/uffd/uffd.git
+
+Package: uffd
+Architecture: any
+Depends:
+ ${misc:Depends},
+ ${python3:Depends},
+ python3-ldap3,
+ python3-flask,
+ python3-flask-sqlalchemy,
+ python3-flask-migrate,
+ python3-qrcode,
+ python3-fido2,
+ python3-flask-oauthlib,
+ python3-flask-babel,
+ nginx,
+ uwsgi,
+ uwsgi-plugin-python3,
+Description: UserFerwaltungsFrontend: Ldap based single sign on and user management web software
diff --git a/debian/rules b/debian/rules
new file mode 100755
index 0000000000000000000000000000000000000000..51a9034e3c8913ad57ee436eff66e6672db65310
--- /dev/null
+++ b/debian/rules
@@ -0,0 +1,7 @@
+#!/usr/bin/make -f
+export DH_VERBOSE = 1
+
+export PYBUILD_NAME=uffd
+
+%:
+	dh $@ --with python3 --buildsystem pybuild
diff --git a/debian/uffd.dirs b/debian/uffd.dirs
new file mode 100644
index 0000000000000000000000000000000000000000..fe0717b32952f5901bbf6a2eedf34b63f4e32fb3
--- /dev/null
+++ b/debian/uffd.dirs
@@ -0,0 +1,3 @@
+/etc/uffd
+/var/lib/uffd
+/usr/share/uffd/uffd/instance
diff --git a/debian/uffd.install b/debian/uffd.install
new file mode 100644
index 0000000000000000000000000000000000000000..f58a61a6f2db82fd56f8b66fbbb4a660e0709835
--- /dev/null
+++ b/debian/uffd.install
@@ -0,0 +1,2 @@
+uwsgi.ini		/etc/uwsgi/apps-available/uffd.ini
+nginx.include.conf	/etc/nginx/snippets/uffd-locations.conf
diff --git a/debian/uffd.links b/debian/uffd.links
new file mode 100644
index 0000000000000000000000000000000000000000..d9fac40f8366c725a68a6d9a734298014bdf50f1
--- /dev/null
+++ b/debian/uffd.links
@@ -0,0 +1 @@
+/usr/share/uffd/uffd/instance/config.py /etc/uffd/config.py
diff --git a/nginx.include.conf b/nginx.include.conf
new file mode 100644
index 0000000000000000000000000000000000000000..f2896894d88d15054c4c93f90670b7aa9c70e6fa
--- /dev/null
+++ b/nginx.include.conf
@@ -0,0 +1,7 @@
+location / {
+	uwsgi_pass unix:///run/uwsgi/app/uffd/socket;
+	include uwsgi_params;
+}
+location /static {
+	alias /usr/share/uffd/uffd/static;
+}
diff --git a/setup.py b/setup.py
index ead7fb04ff725f357d14ebfa1ee564458f91187f..12287a2f31eb52ca6c333e7072b4145ac4d4d13d 100644
--- a/setup.py
+++ b/setup.py
@@ -25,6 +25,7 @@ setup(
 	author_email='it@cccv.de',
 	license='AGPL3',
 	packages=find_packages(),
+	include_package_data=True,
 	zip_safe=False,
 	python_requires='>=3.7',
 )
diff --git a/uwsgi.ini b/uwsgi.ini
new file mode 100644
index 0000000000000000000000000000000000000000..1ccf819f936aecbd36dc5f21612b761d68967f76
--- /dev/null
+++ b/uwsgi.ini
@@ -0,0 +1,15 @@
+[uwsgi]
+plugin = python3
+env = PYTHONIOENCODING=UTF-8
+env = LANG=en_GB.utf8
+env = TZ=Europe/Berlin
+manage-script-name = true
+chdir = /usr/share/uffd
+module = uffd:create_app()
+
+uid = uffd
+gid = uffd
+
+vacuum = true
+
+hook-pre-app = exec:FLASK_APP=uffd flask db upgrade