This is an old revision of the document!
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/)
msmtp-mtaprovides/usr/sbin/sendmailso system mail (cron, unattended-upgrades, etc.) goes through msmtp.mailutilsprovides themailCLI for quick tests.
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:
port 465- keep
tls on - add
tls_starttls off
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:
apt-daily.timerapt-daily-upgrade.timer
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/)
Sending mail to …mail returned: 0
A notification email should arrive even if there are:
No packages found that can be upgraded unattended and no pending auto-removals
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:
Packages that will be upgraded: … All upgrades installed- or
No packages found that can be upgraded unattended and no pending auto-removals
In both cases a mail report should have been sent. [std](https://std.rocks/gnulinux_debian_auto_update.html)
If something fails:
- Mail errors:
tail -n 50 /var/log/msmtp.log
- Apt / unattended-upgrades errors:
journalctl -u apt-daily-upgrade.service -n 50
7. Minimal checklist
- Install:
apt install unattended-upgrades msmtp msmtp-mta mailutils
- Configure
/etc/msmtprc(and optional/etc/msmtp-aliases,/etc/mail.rc); test with:echo test | msmtp -d you@example.comecho test | mail -s “test” you@example.com
- Set in
/etc/apt/apt.conf.d/50unattended-upgrades:Unattended-Upgrade::Mail “you@example.com”;Unattended-Upgrade::MailReport “always”;
- Enable timers:
systemctl enable –now apt-daily.timer apt-daily-upgrade.timer
- Test unattended-upgrades:
unattended-upgrades –dry-run –debugsystemctl start apt-daily-upgrade.service
:!: 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
