aboutsummaryrefslogtreecommitdiffstatshomepage
diff options
context:
space:
mode:
-rw-r--r--.github/workflows/debian.yml26
-rw-r--r--.github/workflows/ppa.yml34
-rw-r--r--debian/.gitignore1
-rw-r--r--debian/Dockerfile52
-rw-r--r--debian/Makefile93
-rw-r--r--debian/README.Debian53
-rw-r--r--debian/changelog365
-rw-r--r--debian/control14
-rw-r--r--debian/copyright39
-rw-r--r--debian/docker-compose.yml13
-rw-r--r--debian/gbp.conf15
l---------debian/linux-status.service1
-rwxr-xr-xdebian/rules3
-rw-r--r--debian/source/format1
-rw-r--r--debian/source/include-binaries1
15 files changed, 711 insertions, 0 deletions
diff --git a/.github/workflows/debian.yml b/.github/workflows/debian.yml
new file mode 100644
index 0000000..000225e
--- /dev/null
+++ b/.github/workflows/debian.yml
@@ -0,0 +1,26 @@
+name: Packages (Debian)
+
+on:
+ push:
+ workflow_dispatch:
+
+jobs:
+ test:
+ runs-on: ubuntu-latest
+ name: Binary package
+ steps:
+ - name: Checkout
+ uses: actions/checkout@v7
+ with:
+ # Fetch tags, required for gbp.
+ fetch-depth: 0
+ - name: Install dependencies
+ run: sudo make -C debian deps
+ - name: Build binary package
+ run: make -C debian bin/test
+ - name: Upload binary package
+ uses: actions/upload-artifact@v7
+ with:
+ name: build-area
+ path: debian/build-area/
+ if-no-files-found: error
diff --git a/.github/workflows/ppa.yml b/.github/workflows/ppa.yml
new file mode 100644
index 0000000..0db46e7
--- /dev/null
+++ b/.github/workflows/ppa.yml
@@ -0,0 +1,34 @@
+name: Publish (Launchpad)
+
+on:
+ push:
+ workflow_dispatch:
+
+jobs:
+ test:
+ runs-on: ubuntu-latest
+ name: Upload to PPA
+ steps:
+ - name: Checkout
+ uses: actions/checkout@v7
+ with:
+ # Fetch tags, required for gbp.
+ fetch-depth: 0
+ - name: Import GPG key
+ uses: crazy-max/ghaction-import-gpg@v7
+ with:
+ gpg_private_key: '${{ secrets.GPG_PRIVATE_KEY }}'
+ passphrase: '${{ secrets.GPG_PASSPHRASE }}'
+ - name: Install dependencies
+ run: sudo make -C debian deps
+ - name: Create cowbuilder image
+ run: sudo make -C debian dist/create
+ - name: Build binary package
+ run: make -C debian dist
+ - name: Clean the build area
+ run: make -C debian clean
+ - name: Build source package
+ run: make -C debian src
+ - name: Upload to PPA
+ if: startsWith(github.ref, 'refs/tags/debian/')
+ run: make -C debian upload
diff --git a/debian/.gitignore b/debian/.gitignore
new file mode 100644
index 0000000..96bfb9e
--- /dev/null
+++ b/debian/.gitignore
@@ -0,0 +1 @@
+build-area/
diff --git a/debian/Dockerfile b/debian/Dockerfile
new file mode 100644
index 0000000..c29c56e
--- /dev/null
+++ b/debian/Dockerfile
@@ -0,0 +1,52 @@
+FROM ubuntu:focal
+
+ENV GPG_KEY="09AEA2BAD52882A1AF9D6042F218DB829A9905B5"
+ENV DEBFULLNAME="Egor Tensin"
+ENV DEBEMAIL="egor@tensin.name"
+
+ARG UID=1000
+ARG GID=1000
+
+RUN if ! id -n -g "$GID" ; then \
+ groupadd -g "$GID" builder ; \
+ fi
+
+RUN if ! id -n -u "$UID" ; then \
+ useradd -u "$UID" -g "$GID" --shell /bin/bash --create-home builder && \
+ passwd -d builder ; \
+ fi
+
+RUN apt update && \
+ DEBIAN_FRONTEND=noninteractive apt install -y --no-install-recommends \
+ dirmngr \
+ gpg \
+ gpg-agent \
+ git \
+ make \
+ sudo
+
+# I'd prefer to run everything as root, but some bright person decided to
+# hardcode sudo usage in git-pbuilder (https://manpages.org/git-pbuilder):
+#
+# > In this case, it calls cowbuilder (or the configured builder as described above) _using sudo_
+#
+RUN echo 'ALL ALL=(ALL) NOPASSWD: ALL' > /etc/sudoers
+
+COPY ["prelude.mk", "/"]
+COPY ["debian/Makefile", "/deps/"]
+RUN make -C /deps deps
+
+USER "$UID:$GID"
+
+RUN git config --global user.name "$DEBFULLNAME" && \
+ git config --global user.email "$DEBEMAIL"
+
+ENV GNUPGHOME=/tmp/gnupg
+RUN mkdir -p -- "$GNUPGHOME" && \
+ chmod 0700 "$GNUPGHOME"
+
+RUN gpg --keyserver hkp://keyserver.ubuntu.com/ --recv-keys "0x$GPG_KEY" && \
+ echo "$GPG_KEY:6:" | gpg --import-ownertrust
+
+COPY [".", "/app"]
+WORKDIR /app/debian
diff --git a/debian/Makefile b/debian/Makefile
new file mode 100644
index 0000000..60f652c
--- /dev/null
+++ b/debian/Makefile
@@ -0,0 +1,93 @@
+include ../prelude.mk
+
+PPA_OWNER ?= egor-tensin
+PPA_NAME ?= linux-status
+GPG_KEY ?= 09AEA2BAD52882A1AF9D6042F218DB829A9905B5
+DIST ?= focal
+
+$(eval $(call noexpand,PPA_OWNER))
+$(eval $(call noexpand,PPA_NAME))
+$(eval $(call noexpand,GPG_KEY))
+$(eval $(call noexpand,DIST))
+
+this_dir := $(dir $(realpath $(firstword $(MAKEFILE_LIST))))
+root := $(this_dir)/..
+build_area := $(this_dir)/build-area
+
+.PHONY: docker
+docker:
+ uid="$$( stat -c '%u' . )" && \
+ gid="$$( stat -c '%g' . )" && \
+ docker compose build --build-arg UID="$$uid" --build-arg GID="$$gid"
+ docker compose run --rm builder
+ docker compose down -v
+
+.PHONY: deps
+deps:
+ apt update
+ DEBIAN_FRONTEND=noninteractive apt install -y --no-install-recommends \
+ build-essential \
+ cowbuilder \
+ devscripts \
+ dh-make \
+ dput \
+ fakeroot \
+ git-buildpackage \
+ openssh-client \
+ sudo
+
+.PHONY: dch
+dch:
+ gbp dch --distribution=unstable --commit
+
+.PHONY: changelog
+changelog: dch
+
+.PHONY: tag
+tag:
+ gbp tag
+
+.PHONY: push
+push:
+ env GIT_SSH_COMMAND='ssh -o UserKnownHostsFile=/dev/null -o StrictHostKeyChecking=no' gbp push
+
+.PHONY: src/test
+src/test:
+ cd -- '$(call escape,$(root))' && gbp buildpackage -S --no-sign --git-ignore-new
+
+.PHONY: src
+src:
+ cd -- '$(call escape,$(root))' && gbp buildpackage -S '-k0x$(call escape,$(GPG_KEY))' --changes-option=-sa
+
+.PHONY: bin/test
+bin/test:
+ cd -- '$(call escape,$(root))' && gbp buildpackage -b --no-sign --git-ignore-new
+
+.PHONY: bin
+bin:
+ cd -- '$(call escape,$(root))' && gbp buildpackage -b '-k0x$(call escape,$(GPG_KEY))'
+
+.PHONY: dist/create
+dist/create:
+ cd -- '$(call escape,$(root))' && env 'DIST=$(call escape,$(DIST))' git-pbuilder create
+
+.PHONY: dist/update
+dist/update:
+ cd -- '$(call escape,$(root))' && env 'DIST=$(call escape,$(DIST))' git-pbuilder update
+
+.PHONY: dist/test
+dist/test:
+ cd -- '$(call escape,$(root))' && gbp buildpackage --git-pbuilder '--git-dist=$(call escape,$(DIST))' --git-ignore-new
+
+.PHONY: dist
+dist:
+ cd -- '$(call escape,$(root))' && gbp buildpackage --git-pbuilder '--git-dist=$(call escape,$(DIST))'
+ cd -- '$(call escape,$(root))' && debsign '-k0x$(call escape,$(GPG_KEY))' --debs-dir '$(call escape,$(build_area))'
+
+.PHONY: upload
+upload:
+ find '$(call escape,$(build_area))' -type f -name '*.changes' -exec dput '$(call escape,ppa:$(PPA_OWNER)/$(PPA_NAME)/ubuntu/$(DIST))' {} ';'
+
+.PHONY: clean
+clean:
+ rm -rf -- '$(call escape,$(build_area))'
diff --git a/debian/README.Debian b/debian/README.Debian
new file mode 100644
index 0000000..73e057e
--- /dev/null
+++ b/debian/README.Debian
@@ -0,0 +1,53 @@
+linux-status for Debian
+----------------------
+
+There's a Dockerfile to make maintenance easier. To start, run `make docker`;
+on exit from the shell, the container will be brought down.
+
+There're a bunch of useful one-liners in Makefile. Everything is built in
+debian/build-area/.
+
+ * Merge the new version to the debian branch (cannot be a lightweight tag for
+ the gbp tools to work):
+
+ git merge TAG
+
+ * Add a changelog entry & tag it:
+
+ make changelog
+ make tag
+
+ * To test, make a source package:
+
+ make src # Or:
+ make src/test # Ignores uncommitted changes.
+
+ * To test, make a binary package:
+
+ make bin # Or:
+ make bin/test # Ignores uncommmited changes.
+
+ * You can push the changes to GitHub now:
+
+ make push
+
+ The rest should be taken care of by GitHub Actions. Otherwise, you can
+ upload the package to Launchpad manually as described below.
+
+ * Upload the source package to the PPA:
+
+ make upload
+
+ To make the package available for different Ubuntu distributions, copy the
+ package binaries on Launchpad. I dread the day when this becomes
+ impossible.
+
+ * Make a binary package using pbuilder (useful for testing that the package
+ builds on a particular distribution):
+
+ make DIST=focal dist/create
+ make DIST=focal dist/update
+ make DIST=focal dist
+ make DIST=focal dist/test # Ignores uncommitted changes.
+
+ -- Egor Tensin <egor@tensin.name> Mon, 08 Mar 2021 07:33:14 +0000
diff --git a/debian/changelog b/debian/changelog
new file mode 100644
index 0000000..6a43aa6
--- /dev/null
+++ b/debian/changelog
@@ -0,0 +1,365 @@
+linux-status (2.4.13-1) unstable; urgency=medium
+
+ * test: rework using the approach from my other projects
+ * workflows/ci: move AUR setup steps to aur:Makefile
+ * workflows/ci: minor formatting fixes
+ * workflows: add some comments
+ * debian: ditch Vagrant, switch to Docker
+
+ -- Egor Tensin <egor@tensin.name> Sun, 04 Oct 2026 16:41:39 +0000
+
+linux-status (2.4.11-1) unstable; urgency=medium
+
+ * consistent prelude.mk
+ * Makefile: fix Debian builds
+
+ -- Egor Tensin <egor@tensin.name> Mon, 28 Sep 2026 15:48:05 +0000
+
+linux-status (2.4.10-1) unstable; urgency=medium
+
+ * remove .git-blame-ignore-revs from export-ignore
+ * debian/Makefile: remove unused stuff
+ * add Makefile with install: target
+ * workflows/ci: don't publish to AUR on Debian tags
+ * switch builds to `make install`
+
+ -- Egor Tensin <egor@tensin.name> Mon, 28 Sep 2026 07:26:48 +0000
+
+linux-status (2.4.8-1) unstable; urgency=medium
+
+ [ Egor Tensin ]
+ * workflows/ci: passwordless sudo for builder
+
+ [ dependabot[bot] ]
+ * build(deps): bump actions/checkout from 6 to 7
+
+ [ dependabot[bot] ]
+ * build(deps): bump actions/checkout from 6 to 7
+
+ [ dependabot[bot] ]
+ * build(deps): bump actions/setup-python from 6 to 7
+
+ [ dependabot[bot] ]
+ * build(deps): bump actions/setup-python from 6 to 7
+ * remove annoying trailing period from repo URLs
+ * debian: modernize apt usage
+ * debian: fix gbp dch
+ * debian: add changelog target to Makefile
+ * debian: fix the tag target & add push target
+ * debian: add a comment to gbp.conf
+ * debian: prettier Makefile
+ * debian/README: actualize
+
+ -- Egor Tensin <egor@tensin.name> Thu, 24 Sep 2026 15:10:31 +0000
+
+linux-status (2.4.7-1) unstable; urgency=medium
+
+ [ Egor Tensin ]
+ * workflows/ci: update Python versions
+ * workflows/ci: upgrade action & Python versions
+ * debian: update GPG key
+ * workflows: upgrade actions
+ * debian: error out if required Vagrant plugins are not installed
+ * add dependabot.yml
+ * workflows/ci: remove on: pull_request
+ * workflows: remove on: pull_request
+ * workflows/ci: run the Black linter
+ * reformat files in accordance with Black
+ * workflows/ci: lint in a separate job
+ * workflows/ci: use default Black settings
+ * add .git-blame-ignore-revs
+ * dependabot: enable for branch "debian"
+
+ [ dependabot[bot] ]
+ * build(deps): bump actions/checkout from 6 to 7
+
+ [ dependabot[bot] ]
+ * build(deps): bump actions/checkout from 6 to 7
+
+ [ dependabot[bot] ]
+ * build(deps): bump crazy-max/ghaction-import-gpg from 6 to 7
+
+ [ dependabot[bot] ]
+ * build(deps): bump actions/upload-artifact from 6 to 7
+ * workflows/ci: allow linting to fail on non-master branches
+ * workflows/ci: add a job to publish to AUR
+
+ -- Egor Tensin <egor@tensin.name> Sat, 20 Jun 2026 15:47:28 +0000
+
+linux-status (2.4.6-1) unstable; urgency=medium
+
+ * workflows/ci: upgrade actions
+ * workflows: upgrade actions
+
+ -- Egor Tensin <egor@tensin.name> Sun, 28 Jan 2024 11:53:59 +0000
+
+linux-status (2.4.5-1) unstable; urgency=medium
+
+ * workflows/ci: ditch Bionic
+ * html: display container running time, even if unhealthy
+ * html: add a comment with a reference link
+ * switch to egor@tensin.name
+ * debian: switch to egor@tensin.name
+
+ -- Egor Tensin <egor@tensin.name> Sun, 10 Dec 2023 09:05:45 +0000
+
+linux-status (2.4.4-1) unstable; urgency=medium
+
+ * switch to tensin.name
+
+ -- Egor Tensin <Egor.Tensin@gmail.com> Fri, 01 Dec 2023 20:49:45 +0000
+
+linux-status (2.4.3-1) unstable; urgency=medium
+
+ * top: fix -E/-e arguments on newer top's
+
+ -- Egor Tensin <Egor.Tensin@gmail.com> Mon, 14 Aug 2023 23:58:50 +0000
+
+linux-status (2.4.2-1) unstable; urgency=medium
+
+ * html: prevent power buttons from jumping
+
+ -- Egor Tensin <Egor.Tensin@gmail.com> Fri, 28 Jul 2023 03:48:30 +0000
+
+linux-status (2.4.1-1) unstable; urgency=medium
+
+ * expose thermal info via /thermal
+ * test: check thermal info
+ * html: tweak styling
+ * update example screenshot
+
+ -- Egor Tensin <Egor.Tensin@gmail.com> Thu, 27 Jul 2023 22:43:00 +0000
+
+linux-status (2.4-1) unstable; urgency=medium
+
+ * debian/Makefile: move the prelude to prelude.mk
+ * debian/README: update
+ * add thermal sensor readings from /sys/class/thermal
+
+ -- Egor Tensin <Egor.Tensin@gmail.com> Thu, 27 Jul 2023 18:56:09 +0000
+
+linux-status (2.3.2-3) unstable; urgency=medium
+
+ * debian: force inclusion of the original sources
+
+ -- Egor Tensin <Egor.Tensin@gmail.com> Sat, 04 Feb 2023 21:17:24 +0000
+
+linux-status (2.3.2-2) unstable; urgency=medium
+
+ * workflows/ppa: do it for commits also
+ * workflows: prettify?
+ * debian/Makefile: use cd instead of pushd
+ * debian/Makefile: escape entire argument (including $(DIST))
+ * debian/Makefile: use long options
+ * debian/Makefile: install vim as a dependency
+ * debian: disable build system auto-detection
+
+ -- Egor Tensin <Egor.Tensin@gmail.com> Sat, 04 Feb 2023 20:56:09 +0000
+
+linux-status (2.3.2-1) unstable; urgency=medium
+
+ * workflows/ci: upgrade actions
+ * workflows: upgrade actions
+ * update URLs
+ * fix preludes in bash scripts
+ * workflows/ci: fix Python 3.6 tests
+ * debian/README: update
+
+ -- Egor Tensin <Egor.Tensin@gmail.com> Sat, 04 Feb 2023 20:30:30 +0000
+
+linux-status (2.3.1-1) unstable; urgency=medium
+
+ * sort Docker containers by name
+
+ -- Egor Tensin <Egor.Tensin@gmail.com> Mon, 10 Oct 2022 08:24:40 +0200
+
+linux-status (2.3-1) unstable; urgency=medium
+
+ * log real client IP address
+
+ -- Egor Tensin <Egor.Tensin@gmail.com> Thu, 30 Jun 2022 12:46:16 +0500
+
+linux-status (2.2.1-1) unstable; urgency=medium
+
+ * update URLs
+
+ -- Egor Tensin <Egor.Tensin@gmail.com> Sun, 22 May 2022 11:01:08 +0200
+
+linux-status (2.2-2) unstable; urgency=medium
+
+ * debian/Makefile: add commit target
+
+ -- Egor Tensin <Egor.Tensin@gmail.com> Sat, 30 Apr 2022 00:05:18 +0200
+
+linux-status (2.2-1) unstable; urgency=medium
+
+ * html: show modals for power mgmt failures
+
+ -- Egor Tensin <Egor.Tensin@gmail.com> Fri, 29 Apr 2022 23:50:49 +0200
+
+linux-status (2.1.3-1) unstable; urgency=medium
+
+ * README: update
+ * index.html: update my link
+ * debian/Makefile: export NAME and EMAIL
+
+ -- Egor Tensin <Egor.Tensin@gmail.com> Fri, 15 Apr 2022 12:09:23 +0300
+
+linux-status (2.1.2-1) unstable; urgency=medium
+
+ * index.html: footer didn't stick to the bottom
+
+ -- Egor Tensin <Egor.Tensin@gmail.com> Mon, 11 Apr 2022 12:58:25 +0000
+
+linux-status (2.1.1-1) unstable; urgency=medium
+
+ * index.html: commands closer to buttons
+ * index.html: get rid of stupid # <a>nchors
+ * index.html: hostname header too large on mobile
+ * index.html: shorten commands
+
+ -- Egor Tensin <Egor.Tensin@gmail.com> Mon, 11 Apr 2022 11:42:00 +0000
+
+linux-status (2.1-1) unstable; urgency=medium
+
+ * src: shorter import
+ * app.py: print HTTP status when CGIing
+ * support disallowing power requests
+
+ -- Egor Tensin <Egor.Tensin@gmail.com> Mon, 11 Apr 2022 09:44:06 +0000
+
+linux-status (2.0-1) unstable; urgency=medium
+
+ * server.py: minor refactoring
+ * test/test.sh: use the port variable
+ * test: catch possible undetected failures
+ * app.py: refactoring
+ * app.py: add Docker container status
+ * index.html: add Docker status section
+ * README: update
+ * upgrade Bootstrap & jQuery
+ * index.html: two-space CSS indent
+ * index.html: use Bootstrap utilities
+ * put things into proper directories
+ * test: fix paths
+ * README: update
+ * index.html: display placeholders if no data
+ * index.html: use flexbox for header
+ * index.html: add a footer
+ * README: update
+ * index.html: get rid of extra whitespace
+ * README: update
+ * debian: update package description
+ * debian: update copyrights
+ * debian: fix paths
+
+ -- Egor Tensin <Egor.Tensin@gmail.com> Mon, 11 Apr 2022 01:57:09 +0000
+
+linux-status (1.2-2) unstable; urgency=medium
+
+ * debian/README: rearrange items
+ * debian/Makefile: consistent prelude
+
+ -- Egor Tensin <Egor.Tensin@gmail.com> Wed, 06 Apr 2022 08:35:56 +0000
+
+linux-status (1.2-1) unstable; urgency=medium
+
+ * app.py: fix loginctl output parsing
+ * dump exceptions to browser's console
+ * app.py: include command's output in the exception
+ * test/test.sh: print curl output on failure
+ * app.py: don't query user info if no users
+ * app.py: don't do systemctl --user if no user instance
+ * workflows/ci: run tests as root also
+
+ -- Egor Tensin <Egor.Tensin@gmail.com> Mon, 24 Jan 2022 23:41:33 +0000
+
+linux-status (1.1.0-1) unstable; urgency=medium
+
+ * fix whitespace
+ * top: run with -E/-e if supported
+
+ -- Egor Tensin <Egor.Tensin@gmail.com> Sun, 03 Oct 2021 23:51:18 +0000
+
+linux-status (1.0.1-1) unstable; urgency=medium
+
+ * README: badges for all workflows
+ * workflows/test: linting
+ * workflows/test: test w/ latest Python
+ * workflows/test -> workflows/ci
+ * workflows/ci: rename to "CI"
+ * index.html: safer DOM generation using jQuery
+ * debian/Makefile: apt scripting best practices
+ * debian/README: update
+
+ -- Egor Tensin <Egor.Tensin@gmail.com> Sun, 03 Oct 2021 15:54:26 +0000
+
+linux-status (1.0-3) unstable; urgency=medium
+
+ * debian/Makefile: fix grammar
+ * debian: install whole directories
+
+ -- Egor Tensin <Egor.Tensin@gmail.com> Thu, 29 Apr 2021 12:44:31 +0000
+
+linux-status (1.0-2) unstable; urgency=medium
+
+ * debian: Makefile best practices
+ * workflows/debian: error out if no files to upload
+ * workflows/ppa: rename the workflow
+
+ -- Egor Tensin <Egor.Tensin@gmail.com> Sun, 18 Apr 2021 11:52:40 +0000
+
+linux-status (1.0-1) unstable; urgency=medium
+
+ * test/test.sh: longer startup timeout
+ * workflows/test.yml: tweak step names
+
+ -- Egor Tensin <Egor.Tensin@gmail.com> Sat, 13 Mar 2021 07:19:40 +0000
+
+linux-status (0.0.2-3) unstable; urgency=medium
+
+ * debian: gbp buildpackage --git-ignore-branch
+ * workflows: tweak step names
+
+ -- Egor Tensin <Egor.Tensin@gmail.com> Fri, 12 Mar 2021 20:50:55 +0000
+
+linux-status (0.0.2-2) unstable; urgency=medium
+
+ * debian: add GitHub workflow
+ * debian: GitHub workflow to upload to PPA
+
+ -- Egor Tensin <Egor.Tensin@gmail.com> Fri, 12 Mar 2021 20:31:07 +0000
+
+linux-status (0.0.2-1) unstable; urgency=medium
+
+ * README: update
+ * img: update example.png
+ * debian: update package description
+ * debian: add example.png to include-binaries
+
+ -- Egor Tensin <Egor.Tensin@gmail.com> Mon, 08 Mar 2021 08:18:03 +0000
+
+linux-status (0.0.1-3) unstable; urgency=medium
+
+ * debian: target the lowest denominator bionic
+ * debian: lint Vagrantfile
+ * debian: add README.Debian
+ * debian: add `make dch` command
+
+ -- Egor Tensin <Egor.Tensin@gmail.com> Mon, 08 Mar 2021 07:55:46 +0000
+
+linux-status (0.0.1-2) unstable; urgency=medium
+
+ * debian: lower debhelper-compat level
+ * debian: add Vagrantfile for building packages
+ * debian: more one-liners in Makefile
+ * debian: set DEB* variables in Vagrantfile
+ * debian: add `make tag` command
+
+ -- Egor Tensin <Egor.Tensin@gmail.com> Sun, 07 Mar 2021 23:02:18 +0000
+
+linux-status (0.0.1-1) unstable; urgency=medium
+
+ * Initial release.
+
+ -- Egor Tensin <Egor.Tensin@gmail.com> Sat, 06 Mar 2021 19:48:48 +0000
diff --git a/debian/control b/debian/control
new file mode 100644
index 0000000..246f405
--- /dev/null
+++ b/debian/control
@@ -0,0 +1,14 @@
+Source: linux-status
+Section: admin
+Priority: optional
+Maintainer: Egor Tensin <egor@tensin.name>
+Build-Depends: debhelper-compat (= 10)
+Standards-Version: 4.4.1
+Homepage: https://github.com/egor-tensin/linux-status
+
+Package: linux-status
+Architecture: all
+Depends: python3, ${misc:Depends}
+Description: Simple Linux server monitoring
+ Shows your `top`, Docker container status, systemd units & timers, allows you
+ to reboot the server, etc.
diff --git a/debian/copyright b/debian/copyright
new file mode 100644
index 0000000..cb44f28
--- /dev/null
+++ b/debian/copyright
@@ -0,0 +1,39 @@
+Format: https://www.debian.org/doc/packaging-manuals/copyright-format/1.0/
+Upstream-Name: linux-status
+Upstream-Contact: Egor Tensin <egor@tensin.name>
+Source: https://github.com/egor-tensin/linux-status
+
+Files: *
+Copyright: 2018-2023 Egor Tensin <egor@tensin.name>
+License: MIT
+
+Files: debian/*
+Copyright: 2021-2023 Egor Tensin <egor@tensin.name>
+License: MIT
+
+Files: html/css/bootstrap.min.css html/js/bootstrap.bundle.min.js
+Copyright: 2011-2021 The Bootstrap Authors
+License: MIT
+
+Files: html/js/jquery.min.js
+Copyright: JS Foundation and other contributors
+License: MIT
+
+License: MIT
+ Permission is hereby granted, free of charge, to any person obtaining a
+ copy of this software and associated documentation files (the "Software"),
+ to deal in the Software without restriction, including without limitation
+ the rights to use, copy, modify, merge, publish, distribute, sublicense,
+ and/or sell copies of the Software, and to permit persons to whom the
+ Software is furnished to do so, subject to the following conditions:
+ .
+ The above copyright notice and this permission notice shall be included
+ in all copies or substantial portions of the Software.
+ .
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
+ OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+ MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
+ IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY
+ CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
+ TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
+ SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
diff --git a/debian/docker-compose.yml b/debian/docker-compose.yml
new file mode 100644
index 0000000..9e38238
--- /dev/null
+++ b/debian/docker-compose.yml
@@ -0,0 +1,13 @@
+services:
+ builder:
+ build:
+ context: ..
+ dockerfile: debian/Dockerfile
+ cap_add:
+ - SYS_ADMIN
+ environment:
+ SSH_AUTH_SOCK: /ssh-agent.sock
+ volumes:
+ - '../:/app'
+ - /run/user/1000/gnupg/S.gpg-agent.extra:/tmp/gnupg/S.gpg-agent
+ - "${SSH_AUTH_SOCK}:/ssh-agent.sock"
diff --git a/debian/gbp.conf b/debian/gbp.conf
new file mode 100644
index 0000000..a752c4b
--- /dev/null
+++ b/debian/gbp.conf
@@ -0,0 +1,15 @@
+[DEFAULT]
+upstream-branch = master
+upstream-tag = v%(version)s
+ignore-branch = True
+# ^^^ Needed for GitHub Actions runs, because they check out in detached HEAD
+# mode.
+debian-branch = debian
+debian-tag = debian/v%(version)s
+pristine-tar = False
+export-dir = debian/build-area/
+
+[dch]
+dch-opt = --upstream
+# ^^^ Don't append "ubuntu1" to the version.
+commit-msg = debian: v%(version)s
diff --git a/debian/linux-status.service b/debian/linux-status.service
new file mode 120000
index 0000000..e104dba
--- /dev/null
+++ b/debian/linux-status.service
@@ -0,0 +1 @@
+../dist/systemd/linux-status.service \ No newline at end of file
diff --git a/debian/rules b/debian/rules
new file mode 100755
index 0000000..cbe925d
--- /dev/null
+++ b/debian/rules
@@ -0,0 +1,3 @@
+#!/usr/bin/make -f
+%:
+ dh $@
diff --git a/debian/source/format b/debian/source/format
new file mode 100644
index 0000000..163aaf8
--- /dev/null
+++ b/debian/source/format
@@ -0,0 +1 @@
+3.0 (quilt)
diff --git a/debian/source/include-binaries b/debian/source/include-binaries
new file mode 100644
index 0000000..1acac09
--- /dev/null
+++ b/debian/source/include-binaries
@@ -0,0 +1 @@
+doc/example.png