Linux Backup di sistema e ripristino

Backup di sistema

Per creare il backup, puoi considerare quanto segue:

  • Specificare il percorso di output:
    bash:
    tar -cvpzf /mnt/backup/backup.tar.gz --exclude=/mnt/backup --one-file-system /
  • Aggiungere ulteriori esclusioni per evitare di includere dati temporanei o non necessari:
    bash
    tar -cvpzf /mnt/backup/backup.tar.gz \
    --exclude=/mnt/backup \
    --exclude=/proc \
    --exclude=/sys \
    --exclude=/dev \
    --exclude=/run \
    --exclude=/tmp \
    --exclude=/var/tmp \
    --one-file-system /

    In questo esempio:

    • /proc, /sys, /dev, /run: Queste sono directory virtuali usate dal sistema operativo e non contengono dati persistenti.
    • /tmp, /var/tmp: Queste directory contengono file temporanei che non sono necessari per un ripristino.

Ripristino del Backup

Nel caso dovessi ripristinare il backup, puoi fare qualcosa di simile:

  1. Avviare il sistema da un ambiente live (es. una live USB di Ubuntu).
  2. Montare il disco dove vuoi ripristinare il backup.
  3. Estrarre il backup:
    bash:
    tar -xvpzf /mnt/backup/backup.tar.gz -C /mnt/target-directory --numeric-owner
    • -C /mnt/target-directory: Specifica la directory dove estrarre il backup.
    • --numeric-owner: Mantiene i numeri UID e GID originali invece dei nomi degli utenti.

Ubuntu, clonare facilmente un progetto da GitHub

Clonare facilmente un progetto da GitHub direttamente nella cartella web di Ubuntu utilizzando la shell. Ecco come puoi farlo:

1. Accedi al Server via SSH

Accedi al server tramite SSH (se non lo hai già fatto):

ssh username@server_ip_address

2. Naviga nella Cartella Web

Naviga nella cartella web dove vuoi clonare il progetto. Supponendo che la tua directory web sia /var/www/lasciamidire.com/web, puoi usare il comando:

cd /var/www/lasciamidire.com/web

3. Clona il Repository da GitHub

Usa il comando git clone per clonare il repository GitHub nella cartella corrente. Ecco un esempio:

git clone https://github.com/username/repository-name.git

Sostituisci https://github.com/username/repository-name.git con l’URL del repository GitHub che vuoi clonare. Questo comando creerà una nuova cartella con il nome del repository nella directory web.

4. Opzionalmente, Rinomina la Cartella

Se vuoi che il contenuto del repository sia direttamente all’interno di una cartella specifica (ad esempio easy-pictograms), puoi rinominare la cartella o specificare il nome della cartella durante il clone:

git clone https://github.com/username/repository-name.git easy-pictograms

Questo comando clonerà il contenuto del repository nella cartella easy-pictograms.

5. Verifica il Clonaggio

Dopo che il processo di clonazione è completato, puoi verificare che il contenuto sia stato clonato correttamente:

ls easy-pictograms

6. Configurazione e Avvio dell’Applicazione

Dopo aver clonato il progetto, potresti dover installare le dipendenze e configurare l’applicazione prima di avviarla:

cd easy-pictograms
npm install
pm2 start npm --name "easy-pictograms" -- start

Questo avvierà l’applicazione usando PM2 con il nome easy-pictograms.

Note Aggiuntive

  • Permessi: Assicurati che i permessi delle directory siano correttamente impostati per l’utente o il processo che esegue il server web.
  • Ambiente: Se il repository include un file .env.example, potresti doverlo rinominare in .env e configurarlo con i parametri corretti.

Seguendo questi passaggi, potrai clonare il progetto da GitHub direttamente nella tua cartella web e configurarlo per l’esecuzione.

Linux Ubuntu Directory Structure Overview

Su un server Linux basato su Ubuntu, la struttura delle directory è organizzata secondo il Filesystem Hierarchy Standard (FHS), che definisce la disposizione e il contenuto delle directory principali. Ecco una panoramica delle directory più importanti:

  1. / (Root)
    • La radice del filesystem. Tutte le altre directory si trovano sotto questa directory.
  2. /bin
    • Contiene i binari essenziali per il sistema, utilizzati sia dagli utenti che dal sistema stesso. Ad esempio, ls, cp, mv, ecc.
  3. /boot
    • Contiene i file necessari per l’avvio del sistema, inclusi il kernel e i file di configurazione del bootloader (come GRUB).
  4. /dev
    • Contiene i file di dispositivo, che rappresentano le periferiche del sistema. Ad esempio, /dev/sda per il disco rigido, /dev/tty per i terminali, ecc.
  5. /etc
    • Contiene i file di configurazione del sistema. Ad esempio, passwd per gli utenti, fstab per i punti di montaggio, ecc.
  6. /home
    • Directory che contiene le home directory degli utenti. Ad esempio, /home/uby per l’utente “uby”.
  7. /lib
    • Contiene le librerie di sistema essenziali necessarie per eseguire i binari in /bin e /sbin.
  8. /media
    • Punti di montaggio per supporti rimovibili come CD, DVD, e unità USB.
  9. /mnt
    • Directory temporanea per montare file system. Solitamente utilizzata per montaggi temporanei di dispositivi.
  10. /opt
    • Utilizzata per installare pacchetti software aggiuntivi. Generalmente, software che non fanno parte della distribuzione standard.
  11. /proc
    • File system virtuale che fornisce informazioni sul sistema e sui processi in esecuzione. Ad esempio, /proc/cpuinfo contiene informazioni sulla CPU.
  12. /root
    • Home directory dell’utente root.
  13. /run
    • Directory per file di runtime che contengono dati variabili come i PID dei processi.
  14. /sbin
    • Contiene binari di sistema essenziali riservati all’amministratore di sistema. Ad esempio, ifconfig, iptables, ecc.
  15. /srv
    • Contiene dati specifici per i servizi forniti dal sistema. Ad esempio, dati per server web o FTP.
  16. /sys
    • File system virtuale che espone informazioni sul kernel, sui dispositivi e sui driver.
  17. /tmp
    • Directory per file temporanei, spesso pulita ad ogni riavvio del sistema.
  18. /usr
    • Contiene i programmi e le librerie per gli utenti. Questa directory ha diverse sottodirectory:
      • /usr/bin: Binari per tutti gli utenti.
      • /usr/sbin: Binari di sistema non essenziali.
      • /usr/lib: Librerie per i binari in /usr/bin e /usr/sbin.
      • /usr/local: Gerarchia per programmi installati localmente.
  19. /var
    • Contiene dati variabili come log, spool e file temporanei persistenti. Ad esempio:
      • /var/log: File di log.
      • /var/spool: Dati di spool per la posta, stampa, ecc.
      • /var/tmp: File temporanei che devono persistere tra i riavvii.

Questa struttura aiuta a mantenere il sistema organizzato e facilita la gestione e manutenzione del server.

PWA Example with Next.js, React, TypeScript, Tailwind CSS, Radix UI, and OneSignal

 

 

This project is a Progressive Web App (PWA) built with Next.js, React, and TypeScript. It uses Tailwind CSS for styling, Radix UI for accessible components, OneSignal for push notifications, and demonstrates access to the file system and webcam.

Installation

 

To get started with this project, clone the repository and install the dependencies:

git clone https://github.com/UbyXsofT/my-pwa-app.git
cd my-pwa-app
npm install

Development

 

To start the development server, run:

npm run dev

This will start the application in development mode at http://localhost:3000.

Build

 

o build the application for production, run:

npm run build

Features

 

  • Progressive Web App (PWA): Offline support and installable on devices.
  • Next.js: Server-side rendering and static site generation.
  • React & TypeScript: Modern – JavaScript framework with static typing.
  • Tailwind CSS: Utility-first CSS framework for rapid UI development.
  • Radix UI: Accessible, unstyled UI component library.
  • OneSignal: Push notifications.
  • File System Access: Demonstrates access to the file system.
  • Webcam Access: Demonstrates access to the webcam.

Usage

 

OneSignal Push Notifications

 

To set up OneSignal for push notifications, follow these steps:

1 – Download and unzip the OneSignal SDK: OneSignalSDK-v16-ServiceWorker.zip

2 – Add the unzipped files to the public directory of your project.

3 – Modify the _document.tsx to include OneSignalSDK:

//_document.tsx
import { Html, Head, Main, NextScript } from "next/document";

export default function Document() {
	return (
		<Html lang='en'>
			<Head>
				<link
					rel='manifest'
					href='/manifest.json'
				/>
				<link
					rel='apple-touch-icon'
					href='/icon.png'
				/>
				<meta
					name='theme-color'
					content='#fff'
				/>
				<script
					src='https://cdn.onesignal.com/sdks/web/v16/OneSignalSDK.page.js'
					async
				></script>
			</Head>
			<body>
				<Main />
				<NextScript />
			</body>
		</Html>
	);
}

4 – Initialize OneSignal in src/functions/onesignal.js:

//src/functions/onesignal.js
import OneSignal from "react-onesignal";

export default async function runOneSignal() {
	console.log("Inizializzazione OneSignal");
	try {
		await OneSignal.init({
			appId: "YOUR-ONESIGNAL-APP-ID",
			allowLocalhostAsSecureOrigin: true,
			serviceWorkerParam: {
				scope: "/",
				path: "/OneSignalSDKWorker.js",
			},
		});
		console.log("OneSignal inizializzato");
		OneSignal.Slidedown.promptPush();
		console.log("Prompt mostrato");
	} catch (error) {
		console.log("ONESIGNAL ERROR: ", error);
	}
}

5 – Call runOneSignal in src/pages/_app.tsx:

import "../src/styles/globals.css";
import { AppProps } from "next/app";
import { useEffect } from "react";
import runOneSignal from "../src/functions/onesignal";

function MyApp({ Component, pageProps }: AppProps) {
  useEffect(() => {
    runOneSignal();
  }, []);

  return <Component {...pageProps} />;
}

export default MyApp;

File System Access

 

To use the File System Access API, you can create a component that allows users to pick a file and read its content. Here’s an example of a file picker component:

import { ReactNode, useState } from "react";

const FileSystemComponent = () => {
	const [fileContent, setFileContent] = useState<string | ArrayBuffer | null>("");
	const handleFilePick = async () => {
		const [fileHandle] = await (window as any).showOpenFilePicker();
		const file = await fileHandle.getFile();
		const text = await file.text();
		setFileContent(text);
	};

	return (
		<div>
			<button
				style={{ margin: "20px" }}
				onClick={handleFilePick}
			>
				Pick a file
			</button>
			<pre>{fileContent as ReactNode}</pre>
		</div>
	);
};

export default FileSystemComponent;

Webcam Access

 

To access the webcam, you can create a component that uses the MediaDevices API. Here’s an example of a webcam component:

import React, { useRef, useEffect } from "react";

const CameraComponent: React.FC = () => {
	const videoRef = useRef<HTMLVideoElement>(null);

	useEffect(() => {
		const startCamera = async () => {
			if (videoRef.current) {
				try {
					const stream: MediaStream = await navigator.mediaDevices.getUserMedia({ video: true });
					if (videoRef.current) {
						videoRef.current.srcObject = stream;
					}
				} catch (err) {
					console.error("Error accessing camera: ", err);
				}
			}
		};

		startCamera();
	}, []);

	return (
		<video
			ref={videoRef}
			autoPlay
			style={{ width: "100%", height: "200px" }}
		/>
	);
};

export default CameraComponent;

Contributing

 

Contributions are always welcome!

See contributing.md for ways to get started.

Please adhere to this project’s code of conduct, please feel free to submit a pull request.

License

 

This project is licensed under the MIT License. See the LICENSE file for details.

Here is the source code project on GitHub

 

Lista di alcuni dei codici di stato HTTP comuni e il loro significato:

Di seguito è riportata una lista di alcuni dei codici di stato HTTP comuni e il loro significato:

  1. 1xx – Informational
    • 100: Continue
    • 101: Switching Protocols
  2. 2xx – Success
    • 200: OK
    • 201: Created
    • 204: No Content (nessun corpo dati nella risposta)
  3. 3xx – Redirection
    • 301: Moved Permanently
    • 302: Found / Temporary Redirect
    • 304: Not Modified
    • 307: Temporary Redirect
    • 308: Permanent Redirect
  4. 4xx – Client Errors
    • 400: Bad Request
    • 401: Unauthorized
    • 403: Forbidden
    • 404: Not Found
    • 409: Conflict
    • 429: Too Many Requests
  5. 5xx – Server Errors
    • 500: Internal Server Error
    • 501: Not Implemented
    • 502: Bad Gateway
    • 503: Service Unavailable
    • 504: Gateway Timeout

L’operatore modulo %

L’operatore % è chiamato operatore modulo. È un operatore matematico che restituisce il resto di una divisione.

Per esempio, se dividiamo 10 per 3, il risultato è 3 con un resto di 1. Quindi, 10 % 3 restituirà 1.

Quando usiamo l’operatore modulo con 2 (numero % 2), stiamo essenzialmente controllando se un numero è pari o dispari. Questo perché quando un numero è diviso per 2, il resto sarà 0 se il numero è pari (perché i numeri pari possono essere divisi in modo uniforme per 2) e 1 se il numero è dispari.

Quindi, index % 2 === 0 è un modo per controllare se l’indice è un numero pari. Se l’indice è pari, l’espressione restituirà true, altrimenti restituirà false.

React dichiarazione di un componente

Le dichiarazioni di un componente in React possono essere fatte in diverse forme, ma le principali sono le seguenti:

  1. Dichiarazione di funzione (Function Component):React
function MyComponent(props) {
  // Il tuo codice JSX e logica qui...
  return <div>Contenuto del componente</div>;
}

// Oppure usando la sintassi delle frecce (Arrow Function Component):
const MyComponent = (props) => {
  // Il tuo codice JSX e logica qui...
  return <div>Contenuto del componente</div>;
};

// Quando vuoi esportare il componente:
export function MyComponent(props) {
  // ...
}

// Oppure con la sintassi delle frecce:
export const MyComponent = (props) => {
  // ...
};
  1. Class Component:
import React, { Component } from 'react';

class MyComponent extends Component {
  render() {
    // Il tuo codice JSX e logica qui...
    return <div>Contenuto del componente</div>;
  }
}

export default MyComponent;
  1. Componente con la sintassi di classe e hooks:
import React, { useState, useEffect } from 'react';

const MyComponent = (props) => {
  // Utilizzo degli hooks per lo stato e gli effetti
  const [count, setCount] = useState(0);

  useEffect(() => {
    // Effetto eseguito dopo il render
    document.title = `Hai cliccato ${count} volte`;
  }, [count]);

  // Il tuo codice JSX e logica qui...
  return (
    <div>
      <p>Hai cliccato {count} volte</p>
      <button onClick={() => setCount(count + 1)}>Cliccami</button>
    </div>
  );
};

export default MyComponent;

In tutte queste forme, il componente renderizza l’output usando il codice JSX. Puoi utilizzare il tipo di dichiarazione che preferisci, ma i componenti con la sintassi delle funzioni sono più comuni grazie alla loro sintassi concisa e alla facilità di lettura. Con l’introduzione degli hooks, le classi stanno diventando sempre meno utilizzate per definire i componenti.

React-Redux in pillole! (1)

React Redux
  1. Store: Il punto centrale di Redux è lo store, che rappresenta lo stato globale dell’applicazione. Contiene tutti i dati dell’applicazione e offre metodi per accedere, aggiornare e gestire tali dati.
  2. Actions: Le azioni sono oggetti che descrivono un cambiamento nello stato dell’applicazione. Sono l’unico modo per modificare lo stato nello store. Un’azione ha un tipo che indica il tipo di cambiamento e può includere anche dati aggiuntivi necessari per effettuare il cambiamento.
  3. Reducers: I reducer sono delle funzioni pure che specificano come lo stato dell’applicazione viene modificato in risposta a un’azione. Ogni reducer gestisce un aspetto specifico dello stato e restituisce un nuovo stato basato sull’azione ricevuta. I reducer combinati vengono utilizzati per creare il riduttore radice che gestisce l’intero stato dell’applicazione.
  4. Dispatch: Dispatch è un metodo dello store che viene utilizzato per inviare un’azione al riduttore. Quando viene chiamato, lo store inoltra l’azione a tutti i riduttori registrati. I riduttori determinano se e come lo stato deve essere modificato in base all’azione.
  5. Subscribe: È possibile registrare funzioni di callback per essere avvisati ogni volta che lo stato dello store viene modificato. Questo può essere utile per aggiornare l’interfaccia utente in risposta a un cambiamento di stato.
  6. Connect: Il componente React può essere connesso allo store utilizzando il metodo connect di react-redux. Ciò consente al componente di accedere allo stato e alle azioni definite nello store e di essere automaticamente aggiornato quando lo stato cambia.

In sintesi, Redux offre un flusso unidirezionale dei dati, dove le azioni vengono inviate agli store, i riduttori elaborano le azioni per modificare lo stato e i componenti vengono aggiornati automaticamente quando lo stato cambia.