Table of Contents

Raspberry Pi 4

Python-Pandas-Plotly

Path: /workspace/Python-Pandas-Plotly/

docker build -t python-pandas-plotly -f Dockerfile .
docker run -d --name Python-Pandas-Plotly -p 5000:5000 -it python-pandas-plotly

docker exec -it Python-Pandas-Plotly /bin/bash

DB Load and Backup

DB Load

$ cat /home/pi/fuelwatcher/db_load.sh
#!/bin/bash

sleep $[ ( $RANDOM % 720 )  + 1 ]s

python3 /home/pi/fuelwatcher/rss_download.py >> /home/pi/fuelwatcher/logs/rss_download_`date +%Y-%m-%dT%H-%M-%S`.log
python3 /home/pi/fuelwatcher/db_load_file.py >> /home/pi/fuelwatcher/logs/db_load_file_`date +%Y-%m-%dT%H-%M-%S`.log
python3 /workspace/fuelwatcher/generate-all.py >> /home/pi/fuelwatcher/logs/generate-all_`date +%Y-%m-%dT%H-%M-%S`.log ; /home/pi/fuelwatcher/file_upload.sh 2>&1 | tee /home/pi/fuelwatcher/logs/file_upload_`date +%Y-%m-%dT%H-%M-%S`.log

tail /home/pi/fuelwatcher/logs/*_`date +%Y-%m-%d`*.log >>/tmp/tail_`date +%Y-%m-%d`.txt

docker exec FW_PostgreSQL /bin/bash -c /var/lib/postgresql/data/scripts/query.sh >>/tmp/tail_`date +%Y-%m-%d`.txt

sleep 20

mail -s "DB Load logs - `date +%Y-%m-%d`" dbload@seanys.com </tmp/tail_`date +%Y-%m-%d`.txt
$ cat /home/pi/fuelwatcher/file_upload.sh
#!/bin/sh
#  @author:       Alexandre Plennevaux
#  @description:  MIRROR DISTANT FOLDER TO LOCAL FOLDER VIA FTP
#  @FoundAt:      https://gist.github.com/pixeline/0f9f922cffb5a6bba97a


# FTP LOGIN
HOST='seanys.com'
USER='XXXXXXXXXX'
PASSWORD='XXXXXXXXXXXXXXX'

# DISTANT DIRECTORY
REMOTE_DIR='/fueltracker'

#LOCAL DIRECTORY
LOCAL_DIR='/workspace/fuelwatcher/pages'

# RUNTIME!
echo
echo "Starting upload $REMOTE_DIR from $HOST to $LOCAL_DIR"
date

lftp -u "$USER","$PASSWORD" $HOST <<EOF
set ftp:ssl-force true
set ftp:ssl-protect-data true
set ssl:verify-certificate no
# transfer starts now...
lcd $LOCAL_DIR
cd $REMOTE_DIR
mput -P 4 *.html
exit
EOF
echo
echo "Transfer finished"
date
$ cat /var/lib/docker/volumes/fw_stack_postgres-data/_data/scripts/query.sh
#!/bin/bash

echo -e "\n\n"
echo "SET TIMEZONE='Australia/Perth';SELECT count(*), date FROM fuelwatcher.FUELWATCHER.DATE_PRICE WHERE DATE > CURRENT_DATE AT TIME ZONE '+8' + TIME '06:00' - interval '4 day' group by date ORDER BY date DESC;" | psql fuelwatcher

Backup

# cat /var/lib/docker/volumes/fw_stack_postgres-data/_data/scripts/backup.sh
#!/bin/bash

pg_dumpall > /var/lib/postgresql/data/backups/FW_PostgreSQL_all_`date +%Y-%m-%dT%H-%M-%S`.bak
$ cat /home/pi/fuelwatcher/pg_backup.sh
#!/bin/bash

docker exec -it FW_PostgreSQL /bin/bash -c /var/lib/postgresql/data/scripts/backup.sh

sudo rsync -av /var/lib/docker/volumes/fw_stack_postgres-data/_data/backups/ /media/usb/backup/postgresql/backups/

# Do we want to gzip all the files?
# sudo find . -maxdepth 1 -type f ! -name '*.gz' -exec gzip "{}" \;

mail -s "PostgreSQL backup log - `date +%Y-%m-%d`" dbload@seanys.com </tmp/pg_backup_`date +%Y-%m-%d`.txt

Permissions fix

postgres@482ecde1f1c1:/$ ls -la /var/lib/postgresql/data/
drwxr-xr-x  2 root     root      4096 Nov 24 16:31 backups

root@rpi64:~# rm -Rf /var/lib/docker/volumes/fw_stack_postgres-data/_data/backups/

root@rpi64:~# docker exec -it FW_PostgreSQL /bin/bash

postgres@482ecde1f1c1:/$ mkdir /var/lib/postgresql/data/backups

postgres@482ecde1f1c1:/$ ls -la /var/lib/postgresql/data/
drwxr-xr-x  2 postgres postgres  4096 Dec 14 04:56 backups

Alternate solution (still incomplete)

/etc/fstab

//kargath.local/Backups /workspace/backups cifs credentials=/home/pi/.cifscredz,uid=pi,gid=pi 0 0

crontab

$ crontab -l
25 6 * * * /home/pi/fuelwatcher/db_load.sh
00 8 * * * /home/pi/fuelwatcher/pg_backup.sh

# FreeDNS update
4,24,44 * * * * sleep 37 ; wget -O - http://freedns.afraid.org/dynamic/update.php?bWhnM3BXVzRmQXhMZEhIcnpTaFFsVUphOjE5MjE0OTE1 >> /tmp/freedns_phlaange_my_to.log 2>&1

NGINX (Cloud)

/workspace/Cloud/docker-compose.yml

version: '3.8'
services:
  app:
    image: 'jc21/nginx-proxy-manager:latest'
    container_name: nginx
    restart: unless-stopped
    ports:
      - '8180:80'
      - '8181:81'
      - '8143:443'
    volumes:
      - ./data:/data
      - ./letsencrypt:/etc/letsencrypt

Console

docker exec -it -u 0 nginx /bin/bash

/workspace/Cloud/rebuild

#!/bin/bash

SCRIPT_DIR="$( cd "$( dirname "${BASH_SOURCE[0]}" )" &> /dev/null && pwd )"
echo "Script directory: $SCRIPT_DIR"

docker ps --format "{{.ID}}\t{{.Names}}" | grep -i nginx | awk '{print $1}' | xargs docker stop
docker ps -a --format "{{.ID}}\t{{.Names}}" | grep -i nginx | awk '{print $1}' | xargs docker container rm
docker image ls | grep -i nginx | awk '{print $3}'|xargs docker rmi

cd $SCRIPT_DIR
docker-compose build; docker-compose up -d

/workspace/Cloud/reload

#!/bin/bash

SCRIPT_DIR="$( cd "$( dirname "${BASH_SOURCE[0]}" )" &> /dev/null && pwd )"
echo "Script directory: $SCRIPT_DIR"

docker ps --format "{{.ID}}\t{{.Names}}" | grep -i nginx | awk '{print $1}' | xargs docker stop
docker ps -a --format "{{.ID}}\t{{.Names}}" | grep -i nginx | awk '{print $1}' | xargs docker container rm

cd $SCRIPT_DIR
docker-compose build; docker-compose up -d

Mail

# apt-get install mailutils

exim4

# dpkg-reconfigure exim4-config
$ sudo cat /etc/exim4/update-exim4.conf.conf

dc_eximconfig_configtype='satellite'
dc_other_hostnames='rpi64'
dc_local_interfaces='127.0.0.1 ; ::1'
dc_readhost='rpi64'
dc_relay_domains=''
dc_minimaldns='true'
dc_relay_nets=''
dc_smarthost='mail.seanys.com'
CFILEMODE='644'
dc_use_split_config='false'
dc_hide_mailname='true'
dc_mailname_in_oh='true'
dc_localdelivery='mail_spool'
root@rpi64:~# cat /etc/exim4/
$ sudo cat /etc/exim4/passwd.client

# password file used when the local exim is authenticating to a remote
# host as a client.
#
# see exim4_passwd_client(5) for more documentation
#
# Example:
### target.mail.server.example:login:password
seanys.com:seanys:XXXXXXXXXXXXXXXXXXX

References

DNS Utils

sudo apt-get install dnsutils

Python bits

$ sudo apt-get install python3-pip
$ sudo pip3 install config plotly pandas icecream feedparser psycopg2 sqlalchemy

…and maybe

$ sudo apt install python3-psycopg2

Mount USB

Just skip the “umask” bits.

References

How to format and mount a USB drive on Raspberry Pi? - https://raspberrytips.com/format-mount-usb-drive/

SWAP resize

sudo dphys-swapfile swapoff
free
               total        used        free      shared  buff/cache   available
Mem:         3885396      890640     1523260       76904     1471496     2842400
Swap:              0           0           0

sudo nano /etc/dphys-swapfile
sudo dphys-swapfile setup
want /var/swap=2048MByte, checking existing: deleting wrong size file (268435456), generating swapfile ... of 2048MBytes
sudo dphys-swapfile swapon
sudo reboot

ZRAM (not used on RPi64)

ZRAM is a RAM based compressed, swap mem kernel module

# remove the old dphys version
$ sudo /etc/init.d/dphys-swapfile stop
$ sudo apt-get remove --purge dphys-swapfile
# install zram
$ sudo wget -O /usr/bin/zram.sh https://raw.githubusercontent.com/novaspirit/rpi_zram/master/zram.sh
# set autoload
$ sudo nano /etc/rc.local
# add the next line before exit 0
/usr/bin/zram.sh &
# save with <Ctrl+X>, <Y> and <Enter>

$ sudo chmod +x /usr/bin/zram.sh
$ sudo nano /usr/bin/zram.sh
# alter the limit with * 2
mem=$(( ($totalmem / $cores)* 1024 * 2))
# save with <Ctrl+X>, <Y> and <Enter>
$ sudo reboot

Docker and Docker-Compose

curl -sSL https://get.docker.com | sh
sudo usermod -aG docker pi
sudo apt-get install libffi-dev libssl-dev
sudo apt install python3-dev
sudo apt-get install -y python3 python3-pip
sudo pip3 install docker-compose
sudo systemctl enable docker

References

Format a USB-connected drive

fdisk /dev/sdb
mkfs -t ext4 /dev/sdb1
mount /dev/sdb1 /media/ssd/

References

Apache2 / PHP

Apache 2

apt install apache2 -y
usermod -a -G www-data pi
chown -R -f www-data:www-data /var/www/html

PHP

7

apt install php7.4 libapache2-mod-php7.4 php7.4-mbstring php7.4-mysql php7.4-curl php7.4-gd php7.4-zip php7.4-xml -y

8.1

curl https://packages.sury.org/php/apt.gpg | sudo tee /usr/share/keyrings/suryphp-archive-keyring.gpg >/dev/null
echo "deb [signed-by=/usr/share/keyrings/suryphp-archive-keyring.gpg] https://packages.sury.org/php/ $(lsb_release -cs) main" | sudo tee /etc/apt/sources.list.d/sury-php.list
sudo apt update
sudo apt install php8.1-cli

References

GitList

wget https://github.com/klaussilveira/gitlist/releases/download/2.0.0/gitlist-2.0.0.zip
unzip gitlist-2.0.0.zip
cd 
rsync -av /workspace/PHP/gitlist/* /var/www/html/
mkdir /var/www/html/cache
chown www-data.www-data /var/www/html/cache/
nano config.ini-example
diff config.ini config.ini-example
4c4
< repositories[] = '/media/usb/repo/' ; Path to your repositories
---
> repositories[] = '/home/git/repositories/' ; Path to your repositories

Argon ONE

ARGON ONE Pi 4 Power Button Functions

The following chart will help with the Power button functions. Once the script is installed, it will work with Pi OS 32/64-Bit and within RetroPie.

PI 4 STATE ACTION
OFF Short Press Turn ON
ON Long Press (>= 3s) Soft Shutdown and Power Cut
ON Short press (<3s) Nothing
ON Double tap Reboot
ON Long Press (>= 5s) Forced Shutdown

Fan control script

Installation

curl https://download.argon40.com/argon1.sh | bash 

Run

argonone-config
--------------------------------------
Argon One Fan Speed Configuration Tool
--------------------------------------
WARNING: This will remove existing configuration.
Press Y to continue:y
Thank you.

Select fan mode:
  1. Always on
  2. Adjust to temperatures (55C, 60C, and 65C)
  3. Customize behavior
  4. Cancel
NOTE: You can also edit /etc/argononed.conf directly
Enter Number (1-4):3

Please provide fan speeds and temperature pairs

Provide minimum temperature (in Celsius) then [ENTER]:44
Provide fan speed for 44C (0-100) then [ENTER]:20
* Fan speed will be set to 20 once temperature reaches 44 C

Provide minimum temperature (in Celsius) then [ENTER]:54
Provide fan speed for 54C (0-100) then [ENTER]:45
* Fan speed will be set to 45 once temperature reaches 54 C

Provide minimum temperature (in Celsius) then [ENTER]:65
Provide fan speed for 65C (0-100) then [ENTER]:65
* Fan speed will be set to 65 once temperature reaches 65 C

Provide minimum temperature (in Celsius) then [ENTER]:75
Provide fan speed for 75C (0-100) then [ENTER]:100
* Fan speed will be set to 100 once temperature reaches 75 C

Provide minimum temperature (in Celsius) then [ENTER]:

Thank you!  We saved 4 pairs.
Changes should take effect now.

Settings before and after crash prevention attempt

$ cat /etc/argononed.conf
#
# Argon One Fan Speed Configuration
#
# Min Temp=Fan Speed
48=15
55=45
65=65
75=100
$ cat /etc/argononed.conf
#
# Argon One Fan Speed Configuration
#
# Min Temp=Fan Speed
44=20
54=45
65=65
75=100

References

Azure SQL Edge

docker-compose.yml

# docker-compose.yml:
version: '3'
services:
  mssql:
    image: mcr.microsoft.com/azure-sql-edge
    container_name: "MSSQL"
    user: root
    restart: always
    environment:
      ACCEPT_EULA: Y
      MSSQL_SA_PASSWORD: GRoup--22
    volumes:
      - ./data/mssql/data/:/var/opt/mssql/data
      - ./data/mssql/log/:/var/opt/mssql/log
      - ./data/mssql/secrets/:/var/opt/mssql/secrets
    ports:
      - 1433:1433

References

Temperature reading on Webmin

sudo apt install lm-sensors

RPiMonitor

sudo apt-get install dirmngr
sudo apt-key adv --recv-keys --keyserver keyserver.ubuntu.com 2C0D3C0F
sudo wget http://goo.gl/vewCLL -O /etc/apt/sources.list.d/rpimonitor.list
sudo apt-get update
sudo apt-get install rpimonitor
sudo /etc/init.d/rpimonitor update

Modifications

/etc/rpimonitor/data.conf

include=/etc/rpimonitor/template/wlan.conf

/etc/rpimonitor/template/sdcard.conf

...
static.8.source=df /boot/firmware
static.8.regexp=\S+\s+(\d+).*\/boot/firmware$
...
dynamic.7.source=df /boot/firmware
dynamic.7.regexp=\S+\s+\d+\s+(\d+).*\/boot/firmware$
...

Restart

sudo service rpimonitor restart

References

Calibre (stopped, waste of time)

/etc/fstab

//lordaeron.local/Docs2 /media/media    cifs    credentials=/home/pi/.smb,uid=pi,gid=pi,vers=1.0 0 0

Add content

Beware: copies files into “database”

xvfb-run calibredb add /media/media/eBooks/Tintin/ --library-path /media/ssd/calibredb

Run server

calibre-server --with-library ~/calibre-library

References

Fixes

References

Install logs