Reddit refuge, escentric engineer and serial hobbyist.

  • 2 Posts
  • 8 Comments
Joined 1Y ago
cake
Cake day: Jun 10, 2023

help-circle
rss

I understand that everyone doesn’t always have a perfect experience but I’ve been using the same instance of nextcloud for over 8 years I just keep upgrading and migrating. It just works. Only issues I’ve had is when Debian withholds updating php for too long or when they finally do all the config files for php get fucked and I have to redo them all.


I’m sorry but wireguard is not easy for beginners and the quick QR code generator in the command line was fantastic and light years ahead of fumbling around with getting config files securely to a mobile device.


I think a full resync then re-index will go fine. My setup is different in that I sync everything through Nextcloud and run a script that looks for changes and triggers an indexing scan in photoprism. That being said I’ve absolutely mutilated some photo prism databases (migrating servers, different folder names with the same content) and run full indexing and never ended up with duplicates. It’s very good at stacking and cleaning up the same files in the DB so long as there aren’t actual duplicates in the original storage. But again it might take 3 or more full scans to find and purge duplicates.


I am far from a photo prism expert but I can safely say the indexing algorithm is weird and takes multiple runs to finish. Logically I would expect to run it once and it would do everything in one scan but I’ve found it takes sometimes 3 to 5 full scans to update and properly catch up to major changes. It’s almost like it acknowledges big changes and documents it but waits for multiple passes before committing it. Also it does a really good job when scanning to look or duplicate images and stacking/repointing to the valid file. I would advise running the indexing another 2 or 3 times if you are confident the 31k files are actually on storage and just not showing up on the database.


Title says most of it. Spin electric scooters exited the Seattle market and abandoned their scooters all over the city and apparently they have a pi 4 in them!
fedilink

55W idle for 3 servers, network gear and UPS. I live in the US but electricity is still expensive and I try to keep everything efficient. My primary/most powerful server with 20TB of SSD only uses 22W idle.


I use Joplin notes to track my code revisions. It’s incredibly crude but it works and keeps my documention private and is also my wiki for each server so I know what the heck I setup and did.


Sorry, I forgot to post the scripts. I’m a meathead electrical engineer so I don’t use GIT or anything so here is the code dump. To summarize the setup’s software:

  • cron to run the script that turns the ethernet on and runs rsync to pull data from the server. I have 12 cron entries for the various months/dates/times to run.
  • python script to monitor the button presses for manually running a backup or turning the ethernet port back on
  • bash script that runs the rsync job to pull data from the primary server

The backup script is fairly boring, just runs rsync and pushes the rsync log files back to the primary server. If it fails it sends me an email before turning the ethernet back off and going black.

#So here is my python code that runs the button press:

#!/usr/bin/env python

import RPi.GPIO as GPIO
import subprocess
import time
from multiprocessing import Process


#when this script first runs, at boot, disable ethernet
time.sleep(5) #wait 5 seconds for system to boot, then try and disable ethernet.
subprocess.call(['/home/pi/ethernet_updown.sh'], shell=False)

GPIO.setmode(GPIO.BCM)
GPIO.setup(3, GPIO.IN, pull_up_down=GPIO.PUD_UP)
GPIO.setup(22, GPIO.OUT) #controls TFT display backlight
GPIO.setup(23, GPIO.IN) #pull up or down is optional, the TFT display buttons have a hardware 10k pull up. Measure low tranisitions 
GPIO.setup(24, GPIO.IN)


#watches the button mounted above the USB port, in the Pi's case. 
def case_button_watch():
    while True:
        GPIO.wait_for_edge(3, GPIO.FALLING)
        #wait 100ms then check if its still low, debounce timer
        time.sleep(.100)
        if GPIO.input(3) == GPIO.LOW:
            #do something as it's a button press
            print('Button is pressed!')
            time.sleep(.900)
            if GPIO.input(3) == GPIO.LOW:
                #if the button is pressed for over 1 second its a long press. Run the backup script
                print('Button long press (greater than 1 second), running an unscheduled backup')
                subprocess.call(['/home/pi/backup.sh'], shell=False)
            else:
                #the press was greater than 100mS but less than 1000mS, just toggle the ethernet
                print('Button short press (less than 1 second), toggling the ethernet')
                subprocess.call(['/home/pi/ethernet_updown.sh'], shell=False)
        else:
            #do nothing as its interference
            print('GPIO3 debounce failed, it was noise')

#watches the buttons in the TFT display 
def TFT_display_button1():
    while True:
        GPIO.wait_for_edge(23, GPIO.FALLING)
        #wait 100ms then check if its still low, debounce timer
        time.sleep(.100)
        if GPIO.input(23) == GPIO.LOW:
            #do something as it's a button press
            print('Button GPIO23 is pressed!')
            GPIO.output(22, GPIO.HIGH) #turn the backlight ON
        else:
            #do nothing as its interference
            print('GPIO23 debounce failed, it was noise')

#watches the buttons in the TFT display
def TFT_display_button2():
    while True:
        GPIO.wait_for_edge(24, GPIO.FALLING)
        #wait 100ms then check if its still low, debounce timer
        time.sleep(.100)
        if GPIO.input(24) == GPIO.LOW:
            #do something as it's a button press
            print('Button GPIO24 is pressed!')
            GPIO.output(22, GPIO.LOW) #turn the backlight OFF
        else:
            #do nothing as its interference
            print('GPIO24 debounce failed, it was noise')

if __name__ == '__main__':

    #run three parallel processes to watch all three buttons with software debounce
    proc1 = Process(target=case_button_watch)
    proc1.start()

    proc2 = Process(target=TFT_display_button1)
    proc2.start()

    proc3 = Process(target=TFT_display_button2)
    proc3.start()

#bash script that toggles the ethernet - if its on, it turns it off. if its off, it turns it on:

#!/bin/bash

if sudo ifconfig | grep 'eth0' | grep 'RUNNING' > /dev/null; 
then 
    wall -n "$(date +"%Y%m%d_%H%M%S"):Ethernet going down"
    sudo ifconfig eth0 down	
else 
    wall -n "$(date +"%Y%m%d_%H%M%S"):Ethernet going up"
    sudo ifconfig eth0 up
fi


Ghost Pi - an unconventional backup solution
I call this nonsense host ‘Ghost’, for me it’s similar to a tape backup solution. Fairly simple concept, it’s an old Pi1 + external mechanical drive that sits dormant with its ethernet off. Once a month, at a random time and random date it enables the ethernet, spins up the drive and pulls data from the main server to update its drive then goes black until next month. The only way to check or maintain the pi is a push button that toggles the ethernet interface. I slapped it together with some scrap wood, spare hardware and screwed it to a 2x4 in a dark corner of my basement. It’s my 5th string backup, the ultimate insurance policy because I’m mental.
fedilink