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
