Table of Contents

Auto updates

Here's how to setup your debian to update automatically

This page describes how to set up automatic security updates with unattended-upgrades and email notifications via msmtp on Debian Linux systems. [std](https://std.rocks/gnulinux_debian_auto_update.html)

1. Install unattended-upgrades and msmtp

apt update
apt install -y unattended-upgrades msmtp msmtp-mta mailutils
dpkg-reconfigure -plow unattended-upgrades

Notes: [freundschafter](https://freundschafter.com/how-to-set-up-msmtp-on-debian-to-use-a-mailhoster-with-smtp/)

Check that sendmail points to msmtp:

readlink -f /usr/sbin/sendmail
# should be /usr/bin/msmtp or a msmtp-mta symlink

2. Configure msmtp

Create /etc/msmtprc:

cat >/etc/msmtprc <<'EOF'
# Global msmtp config
 
defaults
auth           on
tls            on
tls_trust_file /etc/ssl/certs/ca-certificates.crt
logfile        /var/log/msmtp.log
 
account        default
host           smtp.yourdomain.tld
port           587
from           unattended@yourdomain.tld
user           user@yourdomain.tld
password       CHANGE_ME
EOF
 
chmod 600 /etc/msmtprc
touch /var/log/msmtp.log
chmod 640 /var/log/msmtp.log

Adjust: host, port, from, user, and password for your SMTP provider. [gist.github](https://gist.github.com/movd/7a9e3db63d076f85d16c7dcde62fe401)

For providers using SMTPS (465/SSL) instead of STARTTLS on 587, change:

Optional: aliases for local users

Create /etc/msmtp-aliases:

cat >/etc/msmtp-aliases <<'EOF'
root:    user@yourdomain.tld
default: user@yourdomain.tld
EOF
 
chmod 600 /etc/msmtp-aliases

Add the aliases line inside /etc/msmtprc (in the account default block): [freundschafter](https://freundschafter.com/how-to-set-up-msmtp-on-debian-to-use-a-mailhoster-with-smtp/)

aliases /etc/msmtp-aliases

(optional) Make the mail(1) command use msmtp

Create /etc/mail.rc:

cat >/etc/mail.rc <<'EOF'
set sendmail="/usr/bin/msmtp -t"
set from=unattended@fortier.it
EOF

3. Test msmtp and CLI mail

Direct msmtp test

echo "Hello from $(hostname)" | msmtp -d user@yourdomain.tld

If there is a problem, inspect:

tail -n 50 /var/log/msmtp.log

for SMTP / TLS / auth errors. [manpages.debian](https://manpages.debian.org/testing/msmtp/msmtp.1.en.html)

Test via mail(1) (what unattended-upgrades uses)

echo "Test via mail from $(hostname)" | mail -s "msmtp mail test $(hostname)" arnaud@fortier.it

If this arrives, the system-wide mail path is working.

4. Configure unattended-upgrades mail and origins

Edit /etc/apt/apt.conf.d/50unattended-upgrades and make sure the following lines are present and not commented: [techlabs](https://techlabs.blog/categories/debian-linux/automatically-install-updates-using-unattended-upgrades-on-debian-11)

Unattended-Upgrade::Mail "user@yourdomain.tld";
Unattended-Upgrade::MailReport "always";

Typical Origins-Pattern for Debian 13 (adjust for Raspbian or other origins):

Unattended-Upgrade::Origins-Pattern {
        "origin=Debian,codename=${distro_codename},label=Debian";
        "origin=Debian,codename=${distro_codename}-security,label=Debian-Security";
        "origin=Debian,codename=${distro_codename}-updates,label=Debian";
};

5. Enable and check apt systemd timers

Enable the standard apt timers: [exampleconfig](https://exampleconfig.com/default/apt/etc-systemd-apt-daily-upgrade-timer)

systemctl enable --now apt-daily.timer apt-daily-upgrade.timer

List timers:

systemctl list-timers 'apt-daily*'

You should see:

with NEXT showing future times.

6. Live tests for unattended-upgrades

A. Manual debug run (immediate mail)

unattended-upgrades --dry-run --debug

At the end you should see lines similar to: [prezu](https://prezu.ca/post/unattended-upgrades-debian/)

A notification email should arrive even if there are:

B. Simulate a real timer run

Trigger the same service that the timer calls:

systemctl start apt-daily-upgrade.service
journalctl -u apt-daily-upgrade.service -n 50

Then check the unattended-upgrades log:

tail -n 50 /var/log/unattended-upgrades/unattended-upgrades.log

You should see either:

In both cases a mail report should have been sent. [std](https://std.rocks/gnulinux_debian_auto_update.html)

If something fails:

    tail -n 50 /var/log/msmtp.log
 
    journalctl -u apt-daily-upgrade.service -n 50
 

7. Minimal checklist

  1. Install:
    1. apt install unattended-upgrades msmtp msmtp-mta mailutils
  2. Configure /etc/msmtprc (and optional /etc/msmtp-aliases, /etc/mail.rc); test with:
    1. echo test | msmtp -d you@example.com
    2. echo test | mail -s “test” you@example.com
  3. Set in /etc/apt/apt.conf.d/50unattended-upgrades:
    1. Unattended-Upgrade::Mail “you@example.com”;
    2. Unattended-Upgrade::MailReport “always”;
  4. Enable timers:
    1. systemctl enable –now apt-daily.timer apt-daily-upgrade.timer
  5. Test unattended-upgrades:
    1. unattended-upgrades –dry-run –debug
    2. systemctl start apt-daily-upgrade.service

[techlabs](https://techlabs.blog/categories/debian-linux/automatically-install-updates-using-unattended-upgrades-on-debian-11)

:!: OLD :!: Below

Install

apt-get install -y unattended-upgrades apt-listchanges mailutils postfix

Config

vi /etc/apt/apt.conf.d/50unattended-upgrades
// Automatically upgrade packages from these (origin:archive) pairs
//
// Note that in Ubuntu security updates may pull in new dependencies
// from non-security sources (e.g. chromium). By allowing the release
// pocket these get automatically pulled in.
Unattended-Upgrade::Allowed-Origins {
        "${distro_id}:${distro_codename}";
        "${distro_id}:${distro_codename}-security";
        // Extended Security Maintenance; doesn't necessarily exist for
        // every release and this system may not have it installed, but if
        // available, the policy for updates is such that unattended-upgrades
        // should also install from here by default.
        //"${distro_id}ESMApps:${distro_codename}-apps-security";
        //"${distro_id}ESM:${distro_codename}-infra-security";
        "${distro_id}:${distro_codename}-updates";
        //"${distro_id}:${distro_codename}-proposed";
        //"${distro_id}:${distro_codename}-backports";
        "Docker:{distro_codename}";
};
// Send email to this address for problems or packages upgrades
// If empty or unset then no email is sent, make sure that you
// have a working mail setup on your system. A package that provides
// 'mailx' must be installed. E.g. "user@example.com"
Unattended-Upgrade::Mail "arnaud+XXXXXXXXX@fortier-family.com";
 
// Set this value to one of:
//    "always", "only-on-error" or "on-change"
// If this is not set, then any legacy MailOnlyOnError (boolean) value
// is used to chose between "only-on-error" and "on-change
Unattended-Upgrade::MailReport "on-change";
 
// Remove unused automatically installed kernel-related packages
// (kernel images, kernel headers and kernel version locked tools).
Unattended-Upgrade::Remove-Unused-Kernel-Packages "true";

Automate:

dpkg-reconfigure -plow unattended-upgrades

Mails:

dpkg-reconfigure postfix
systemctl reload postfix

Test:

unattended-upgrade -d

Reboot automatic when needed

vi /etc/apt/apt.conf.d/20auto-upgrades
APT::Periodic::Update-Package-Lists "1";
APT::Periodic::Unattended-Upgrade "1";

Daily check packages & upgrade

vi /etc/apt/apt.conf.d/50unattended-upgrades
...
Unattended-Upgrade::Automatic-Reboot "true";
Unattended-Upgrade::Automatic-Reboot-Time "02:00";
...
systemctl restart unattended-upgrades

Mail via msmtp

 apt install msmtp msmtp-mta mailutils
vi /etc/msmtprc
defaults
auth           on
tls            on
tls_starttls   off
tls_trust_file /etc/ssl/certs/ca-certificates.crt
 
# SMTP server config 
account        default
host           mail.fortier-family.com
port           465
from           arnaud+SERV@fortier-family.com
user           arnaud@fortier-family.com
password       *********LOL***********

Test:

echo "Test mail from $(hostname)" | mail -s "Test subject" arnaud+srv1@fortier-family.com

Kali

Following https://bugs.kali.org/view.php?id=8587
Change in /etc/apt/apt.conf.d/50unattended-upgrades

//        "origin=Debian,codename=${distro_codename},label=Debian-Security";
//        "origin=Debian,codename=${distro_codename}-security,label=Debian-Security";
 
        "origin=Kali,codename=${distro_codename}";

Ubuntu

A bug prevent SIGTERM to be sent properly to containers: https://bugs.launchpad.net/ubuntu/+source/docker.io-app/+bug/2079006 Let's make a service for that:

 vi /etc/systemd/system/docker-graceful-stop.service
[Unit]
Description=Gracefully stop Docker containers before system shutdown or reboot
DefaultDependencies=no
Before=shutdown.target reboot.target halt.target
Requires=docker.service
After=network.target docker.service
 
[Service]
Type=oneshot
ExecStart=/bin/true
ExecStop=/usr/bin/docker stop $(/usr/bin/docker ps -q)
RemainAfterExit=yes
TimeoutStopSec=300
 
[Install]
WantedBy=halt.target reboot.target shutdown.target
systemctl daemon-reload
systemctl enable docker-graceful-stop.service

As always it's not that simple…

apt-daily-upgrade.timer

systemctl list-timers apt-daily-upgrade.timer
systemctl edit apt-daily-upgrade.timer
[Timer]
OnCalendar=
OnCalendar=*-*-* 02:15
RandomizedDelaySec=0
Persistent=true
systemctl daemon-reload
systemctl restart apt-daily-upgrade.timer
systemctl list-timers apt-daily-upgrade.timer

apt-daily.timer

Of course… if you haven't apt-update before…

systemctl edit apt-daily.timer
[Timer]
OnCalendar=
OnCalendar=*-*-* 01:45
RandomizedDelaySec=0
Persistent=true
systemctl daemon-reload
systemctl restart apt-daily.timer
systemctl list-timers apt-daily.timer

Reference