<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="en">
	<id>https://www.r512.com/api.php?action=feedcontributions&amp;feedformat=atom&amp;user=Bacchas</id>
	<title>rbachwiki - User contributions [en]</title>
	<link rel="self" type="application/atom+xml" href="https://www.r512.com/api.php?action=feedcontributions&amp;feedformat=atom&amp;user=Bacchas"/>
	<link rel="alternate" type="text/html" href="https://www.r512.com/index.php/Special:Contributions/Bacchas"/>
	<updated>2026-05-08T14:21:27Z</updated>
	<subtitle>User contributions</subtitle>
	<generator>MediaWiki 1.37.1</generator>
	<entry>
		<id>https://www.r512.com/index.php?title=Setup_Mac_for_ssh_into_synology&amp;diff=2958</id>
		<title>Setup Mac for ssh into synology</title>
		<link rel="alternate" type="text/html" href="https://www.r512.com/index.php?title=Setup_Mac_for_ssh_into_synology&amp;diff=2958"/>
		<updated>2026-04-24T19:02:27Z</updated>

		<summary type="html">&lt;p&gt;Bacchas: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Set up Password-less Login ==&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;For an unattended script, your Mac needs to log in without a password. Open Terminal on your Mac:&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Generate a key:&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
 ssh-keygen -t ed25519 (Press Enter through all prompts).&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Copy it to the NAS:&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
 ssh-copy-id -i ~/.ssh/id_ed25519.pub your_nas_user@100.x.y.z&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Test it:&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
 ssh your_nas_user@100.x.y.z. If you get in without a password, you’re ready.&lt;br /&gt;
&lt;br /&gt;
== Fix Permissions on the Synology==&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Log in to your NAS with your password one last time and run these commands to restrict access to your home folder: &amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Set Home Directory to 755: SSH requires that your home directory is not writable by others.&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
 chmod 755 /volume1/homes/bacchas&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Set .ssh Folder to 700: This folder must be readable only by you.&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
 chmod 700 /volume1/homes/bacchas/.ssh&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Set authorized_keys to 600: The key file must be strictly protected.&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
 chmod 600 /volume1/homes/bacchas/.ssh/authorized_keys &lt;br /&gt;
&lt;br /&gt;
== Verify &amp;quot;User Home Service&amp;quot; is Enabled ==&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;SSH keys won&amp;#039;t work if the NAS isn&amp;#039;t correctly mapping your home directory. &amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;In DSM, go to Control Panel &amp;gt; User &amp;amp; Group &amp;gt; Advanced.&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Scroll down to User Home and ensure Enable user home service is checked. &amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&lt;br /&gt;
==Check Synology’s SSH Configuration ==&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Sometimes PubkeyAuthentication is disabled in the system config. &amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;On the NAS, edit the config file: &amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
 sudo vi /etc/ssh/sshd_config.&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Find these lines and ensure they are uncommented (no # at the start):&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
 PubkeyAuthentication yes&lt;br /&gt;
 AuthorizedKeysFile .ssh/authorized_keys&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;If you made changes, restart the service in Control Panel &amp;gt; Terminal &amp;amp; SNMP by unchecking and re-checking the Enable SSH service box. &amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&lt;br /&gt;
==Mac-Specific: Add Key to your SSH Agent==&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;On macOS, your terminal might not be &amp;quot;offering&amp;quot; the key automatically. Run this command on your Mac to manually add it to your current session:&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
 ssh-add ~/.ssh/id_ed25519 &lt;br /&gt;
&lt;br /&gt;
==How to Troubleshoot==&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;If it still asks for a password, run the connection in &amp;quot;verbose&amp;quot; mode on your Mac:&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
 ssh -vvv username@192.168.20.22&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Look for a line that says &amp;quot;debug1: Next authentication method: publickey&amp;quot;. If it says &amp;quot;Authentication refused: bad ownership or modes,&amp;quot; it means the permission fix in Step 1 didn&amp;#039;t stick or was applied to the wrong path. &amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&lt;br /&gt;
==Restart the Service==&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Changes to sshd_config do not take effect until the service restarts.&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Command: sudo &amp;#039;&amp;#039;&amp;#039; &lt;br /&gt;
 synosystemctl restart sshd.&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Alternative: Toggle &amp;quot;Enable SSH Service&amp;quot; off and back on in the DSM Control Panel. &amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&lt;br /&gt;
=Create config file=&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Create a config file in the ~/.ssh/config&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039; This file contains the host name and the path to the ssh keys&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Host wendy&lt;br /&gt;
	HostName 192.168.20.22&lt;br /&gt;
	User myname&lt;br /&gt;
	IdentityFile ~/.ssh/keyidfile&lt;br /&gt;
	IdentitiesOnly yes&lt;br /&gt;
&lt;br /&gt;
#for tailscale&lt;br /&gt;
&lt;br /&gt;
Host wendy-tailscale&lt;br /&gt;
	HostName 1.1.1.1&lt;br /&gt;
	User myname&lt;br /&gt;
	IdentityFile ~/.ssh/keyfile&lt;br /&gt;
        IdentitiesOnly yes&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==[[ Backup_script_on_mac_config_and_setup| Mac Setup]] - [[Bash| Bash menu]]-[[Main_Page| Home]]==&lt;br /&gt;
[[Category:Bash]]&lt;/div&gt;</summary>
		<author><name>Bacchas</name></author>
	</entry>
	<entry>
		<id>https://www.r512.com/index.php?title=Scripts_to_backup_to_synology_without_mounting_drives&amp;diff=2957</id>
		<title>Scripts to backup to synology without mounting drives</title>
		<link rel="alternate" type="text/html" href="https://www.r512.com/index.php?title=Scripts_to_backup_to_synology_without_mounting_drives&amp;diff=2957"/>
		<updated>2026-04-24T19:02:12Z</updated>

		<summary type="html">&lt;p&gt;Bacchas: /*  Mac Setup  Bash menu- Home */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;pre&amp;gt;&lt;br /&gt;
#!/bin/bash&lt;br /&gt;
# Use absolute paths for everything&lt;br /&gt;
RSYNC_BIN=&amp;quot;/usr/bin/rsync&amp;quot;&lt;br /&gt;
MKDIR_BIN=&amp;quot;/bin/mkdir&amp;quot;&lt;br /&gt;
&lt;br /&gt;
fdate=`date -I`&lt;br /&gt;
fname=&amp;quot;wendy_karaoke.txt&amp;quot;&lt;br /&gt;
LOG_FILE=&amp;quot;$HOME/Desktop/cronlogfiles/logs/$fname&amp;quot;&lt;br /&gt;
&lt;br /&gt;
# Create log directory if missing&lt;br /&gt;
mkdir -p &amp;quot;$HOME/Desktop/cronlogfiles/logs&amp;quot;&lt;br /&gt;
&lt;br /&gt;
# Log Header&lt;br /&gt;
{&lt;br /&gt;
  echo &amp;quot; &amp;quot;&lt;br /&gt;
  echo &amp;quot;***********************************************************&amp;quot;&lt;br /&gt;
  echo &amp;quot; &amp;quot;&lt;br /&gt;
  echo &amp;quot;------  $(date) --------&amp;quot;&lt;br /&gt;
  echo &amp;quot; &amp;quot;&lt;br /&gt;
} &amp;gt;&amp;gt; &amp;quot;$LOG_FILE&amp;quot;&lt;br /&gt;
&lt;br /&gt;
# THE FIX:&lt;br /&gt;
# 1. Changed &amp;#039;-avi&amp;#039; to &amp;#039;-av&amp;#039; (Removes the cryptic &amp;gt;f+++++ codes, showing only filenames)&lt;br /&gt;
# 2. Added &amp;#039;--modify-window=1&amp;#039; (Ignores tiny timestamp differences common on external drives)&lt;br /&gt;
rsync -av --delete --modify-window=1 \&lt;br /&gt;
  --omit-dir-times --no-perms --no-owner --no-group \&lt;br /&gt;
  --exclude={&amp;#039;.DS_Store&amp;#039;,&amp;#039;Thumbs.db&amp;#039;,&amp;#039;*.tmp&amp;#039;} \&lt;br /&gt;
  &amp;quot;/Volumes/owcv1/Karaoke/&amp;quot; \&lt;br /&gt;
  &amp;quot;wendy:/volume1/Karaoke_All_folders/&amp;quot; \&lt;br /&gt;
  &amp;gt;&amp;gt; &amp;quot;$LOG_FILE&amp;quot; 2&amp;gt;&amp;amp;1&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==[[ Backup_script_on_mac_config_and_setup| Mac Setup]] - [[Bash| Bash menu]]-[[Main_Page| Home]]==&lt;br /&gt;
[[Category:Bash]]&lt;/div&gt;</summary>
		<author><name>Bacchas</name></author>
	</entry>
	<entry>
		<id>https://www.r512.com/index.php?title=Setup_Mac_for_ssh_into_synology&amp;diff=2956</id>
		<title>Setup Mac for ssh into synology</title>
		<link rel="alternate" type="text/html" href="https://www.r512.com/index.php?title=Setup_Mac_for_ssh_into_synology&amp;diff=2956"/>
		<updated>2026-04-24T19:01:12Z</updated>

		<summary type="html">&lt;p&gt;Bacchas: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Set up Password-less Login ==&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;For an unattended script, your Mac needs to log in without a password. Open Terminal on your Mac:&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Generate a key:&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
 ssh-keygen -t ed25519 (Press Enter through all prompts).&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Copy it to the NAS:&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
 ssh-copy-id -i ~/.ssh/id_ed25519.pub your_nas_user@100.x.y.z&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Test it:&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
 ssh your_nas_user@100.x.y.z. If you get in without a password, you’re ready.&lt;br /&gt;
&lt;br /&gt;
== Fix Permissions on the Synology==&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Log in to your NAS with your password one last time and run these commands to restrict access to your home folder: &amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Set Home Directory to 755: SSH requires that your home directory is not writable by others.&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
 chmod 755 /volume1/homes/bacchas&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Set .ssh Folder to 700: This folder must be readable only by you.&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
 chmod 700 /volume1/homes/bacchas/.ssh&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Set authorized_keys to 600: The key file must be strictly protected.&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
 chmod 600 /volume1/homes/bacchas/.ssh/authorized_keys &lt;br /&gt;
&lt;br /&gt;
== Verify &amp;quot;User Home Service&amp;quot; is Enabled ==&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;SSH keys won&amp;#039;t work if the NAS isn&amp;#039;t correctly mapping your home directory. &amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;In DSM, go to Control Panel &amp;gt; User &amp;amp; Group &amp;gt; Advanced.&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Scroll down to User Home and ensure Enable user home service is checked. &amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&lt;br /&gt;
==Check Synology’s SSH Configuration ==&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Sometimes PubkeyAuthentication is disabled in the system config. &amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;On the NAS, edit the config file: &amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
 sudo vi /etc/ssh/sshd_config.&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Find these lines and ensure they are uncommented (no # at the start):&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
 PubkeyAuthentication yes&lt;br /&gt;
 AuthorizedKeysFile .ssh/authorized_keys&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;If you made changes, restart the service in Control Panel &amp;gt; Terminal &amp;amp; SNMP by unchecking and re-checking the Enable SSH service box. &amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&lt;br /&gt;
==Mac-Specific: Add Key to your SSH Agent==&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;On macOS, your terminal might not be &amp;quot;offering&amp;quot; the key automatically. Run this command on your Mac to manually add it to your current session:&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
 ssh-add ~/.ssh/id_ed25519 &lt;br /&gt;
&lt;br /&gt;
==How to Troubleshoot==&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;If it still asks for a password, run the connection in &amp;quot;verbose&amp;quot; mode on your Mac:&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
 ssh -vvv username@192.168.20.22&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Look for a line that says &amp;quot;debug1: Next authentication method: publickey&amp;quot;. If it says &amp;quot;Authentication refused: bad ownership or modes,&amp;quot; it means the permission fix in Step 1 didn&amp;#039;t stick or was applied to the wrong path. &amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&lt;br /&gt;
==Restart the Service==&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Changes to sshd_config do not take effect until the service restarts.&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Command: sudo &amp;#039;&amp;#039;&amp;#039; &lt;br /&gt;
 synosystemctl restart sshd.&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Alternative: Toggle &amp;quot;Enable SSH Service&amp;quot; off and back on in the DSM Control Panel. &amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&lt;br /&gt;
=Create config file=&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Create a config file in the ~/.ssh/config&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039; This file contains the host name and the path to the ssh keys&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Host wendy&lt;br /&gt;
	HostName 192.168.20.22&lt;br /&gt;
	User myname&lt;br /&gt;
	IdentityFile ~/.ssh/keyidfile&lt;br /&gt;
	IdentitiesOnly yes&lt;br /&gt;
&lt;br /&gt;
#for tailscale&lt;br /&gt;
&lt;br /&gt;
Host wendy-tailscale&lt;br /&gt;
	HostName 1.1.1.1&lt;br /&gt;
	User myname&lt;br /&gt;
	IdentityFile ~/.ssh/keyfile&lt;br /&gt;
        IdentitiesOnly yes&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==[[ Backup_script_on_mac_config_and_setup| Mac Setup]] [[Bash| Bash menu]]-[[Main_Page| Home]]==&lt;br /&gt;
[[Category:Bash]]&lt;/div&gt;</summary>
		<author><name>Bacchas</name></author>
	</entry>
	<entry>
		<id>https://www.r512.com/index.php?title=Setup_Mac_for_ssh_into_synology&amp;diff=2955</id>
		<title>Setup Mac for ssh into synology</title>
		<link rel="alternate" type="text/html" href="https://www.r512.com/index.php?title=Setup_Mac_for_ssh_into_synology&amp;diff=2955"/>
		<updated>2026-04-24T18:58:33Z</updated>

		<summary type="html">&lt;p&gt;Bacchas: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Set up Password-less Login ==&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;For an unattended script, your Mac needs to log in without a password. Open Terminal on your Mac:&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Generate a key:&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
 ssh-keygen -t ed25519 (Press Enter through all prompts).&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Copy it to the NAS:&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
 ssh-copy-id -i ~/.ssh/id_ed25519.pub your_nas_user@100.x.y.z&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Test it:&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
 ssh your_nas_user@100.x.y.z. If you get in without a password, you’re ready.&lt;br /&gt;
&lt;br /&gt;
== Fix Permissions on the Synology==&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Log in to your NAS with your password one last time and run these commands to restrict access to your home folder: &amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Set Home Directory to 755: SSH requires that your home directory is not writable by others.&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
 chmod 755 /volume1/homes/bacchas&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Set .ssh Folder to 700: This folder must be readable only by you.&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
 chmod 700 /volume1/homes/bacchas/.ssh&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Set authorized_keys to 600: The key file must be strictly protected.&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
 chmod 600 /volume1/homes/bacchas/.ssh/authorized_keys &lt;br /&gt;
&lt;br /&gt;
== Verify &amp;quot;User Home Service&amp;quot; is Enabled ==&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;SSH keys won&amp;#039;t work if the NAS isn&amp;#039;t correctly mapping your home directory. &amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;In DSM, go to Control Panel &amp;gt; User &amp;amp; Group &amp;gt; Advanced.&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Scroll down to User Home and ensure Enable user home service is checked. &amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&lt;br /&gt;
==Check Synology’s SSH Configuration ==&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Sometimes PubkeyAuthentication is disabled in the system config. &amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;On the NAS, edit the config file: &amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
 sudo vi /etc/ssh/sshd_config.&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Find these lines and ensure they are uncommented (no # at the start):&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
 PubkeyAuthentication yes&lt;br /&gt;
 AuthorizedKeysFile .ssh/authorized_keys&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;If you made changes, restart the service in Control Panel &amp;gt; Terminal &amp;amp; SNMP by unchecking and re-checking the Enable SSH service box. &amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&lt;br /&gt;
==Mac-Specific: Add Key to your SSH Agent==&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;On macOS, your terminal might not be &amp;quot;offering&amp;quot; the key automatically. Run this command on your Mac to manually add it to your current session:&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
 ssh-add ~/.ssh/id_ed25519 &lt;br /&gt;
&lt;br /&gt;
==How to Troubleshoot==&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;If it still asks for a password, run the connection in &amp;quot;verbose&amp;quot; mode on your Mac:&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
 ssh -vvv username@192.168.20.22&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Look for a line that says &amp;quot;debug1: Next authentication method: publickey&amp;quot;. If it says &amp;quot;Authentication refused: bad ownership or modes,&amp;quot; it means the permission fix in Step 1 didn&amp;#039;t stick or was applied to the wrong path. &amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=Create config file=&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Create a config file in the ~/.ssh/config&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039; This file contains the host name and the path to the ssh keys&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Host wendy&lt;br /&gt;
	HostName 192.168.20.22&lt;br /&gt;
	User myname&lt;br /&gt;
	IdentityFile ~/.ssh/keyidfile&lt;br /&gt;
	IdentitiesOnly yes&lt;br /&gt;
&lt;br /&gt;
#for tailscale&lt;br /&gt;
&lt;br /&gt;
Host wendy-tailscale&lt;br /&gt;
	HostName 1.1.1.1&lt;br /&gt;
	User myname&lt;br /&gt;
	IdentityFile ~/.ssh/keyfile&lt;br /&gt;
        IdentitiesOnly yes&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==[[ Backup_script_on_mac_config_and_setup| Mac Setup]] [[Bash| Bash menu]]-[[Main_Page| Home]]==&lt;br /&gt;
[[Category:Bash]]&lt;/div&gt;</summary>
		<author><name>Bacchas</name></author>
	</entry>
	<entry>
		<id>https://www.r512.com/index.php?title=Setup_Mac_for_ssh_into_synology&amp;diff=2954</id>
		<title>Setup Mac for ssh into synology</title>
		<link rel="alternate" type="text/html" href="https://www.r512.com/index.php?title=Setup_Mac_for_ssh_into_synology&amp;diff=2954"/>
		<updated>2026-04-24T18:54:30Z</updated>

		<summary type="html">&lt;p&gt;Bacchas: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Set up Password-less Login ==&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;For an unattended script, your Mac needs to log in without a password. Open Terminal on your Mac:&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Generate a key:&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
 ssh-keygen -t ed25519 (Press Enter through all prompts).&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Copy it to the NAS:&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
 ssh-copy-id -i ~/.ssh/id_ed25519.pub your_nas_user@100.x.y.z&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Test it:&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
 ssh your_nas_user@100.x.y.z. If you get in without a password, you’re ready.&lt;br /&gt;
&lt;br /&gt;
== Fix Permissions on the Synology==&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Log in to your NAS with your password one last time and run these commands to restrict access to your home folder: &amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Set Home Directory to 755: SSH requires that your home directory is not writable by others.&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
 chmod 755 /volume1/homes/bacchas&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Set .ssh Folder to 700: This folder must be readable only by you.&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
 chmod 700 /volume1/homes/bacchas/.ssh&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Set authorized_keys to 600: The key file must be strictly protected.&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
 chmod 600 /volume1/homes/bacchas/.ssh/authorized_keys &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=Create config file=&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Create a config file in the ~/.ssh/config&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039; This file contains the host name and the path to the ssh keys&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Host wendy&lt;br /&gt;
	HostName 192.168.20.22&lt;br /&gt;
	User myname&lt;br /&gt;
	IdentityFile ~/.ssh/keyidfile&lt;br /&gt;
	IdentitiesOnly yes&lt;br /&gt;
&lt;br /&gt;
#for tailscale&lt;br /&gt;
&lt;br /&gt;
Host wendy-tailscale&lt;br /&gt;
	HostName 1.1.1.1&lt;br /&gt;
	User myname&lt;br /&gt;
	IdentityFile ~/.ssh/keyfile&lt;br /&gt;
        IdentitiesOnly yes&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==[[ Backup_script_on_mac_config_and_setup| Mac Setup]] [[Bash| Bash menu]]-[[Main_Page| Home]]==&lt;br /&gt;
[[Category:Bash]]&lt;/div&gt;</summary>
		<author><name>Bacchas</name></author>
	</entry>
	<entry>
		<id>https://www.r512.com/index.php?title=Setup_Mac_for_ssh_into_synology&amp;diff=2953</id>
		<title>Setup Mac for ssh into synology</title>
		<link rel="alternate" type="text/html" href="https://www.r512.com/index.php?title=Setup_Mac_for_ssh_into_synology&amp;diff=2953"/>
		<updated>2026-04-24T18:52:52Z</updated>

		<summary type="html">&lt;p&gt;Bacchas: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Set up Password-less Login ==&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;For an unattended script, your Mac needs to log in without a password. Open Terminal on your Mac:&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Generate a key:&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
 ssh-keygen -t ed25519 (Press Enter through all prompts).&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Copy it to the NAS:&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
 ssh-copy-id -i ~/.ssh/id_ed25519.pub your_nas_user@100.x.y.z&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Test it:&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
 ssh your_nas_user@100.x.y.z. If you get in without a password, you’re ready.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=Create config file=&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Create a config file in the ~/.ssh/config&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039; This file contains the host name and the path to the ssh keys&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Host wendy&lt;br /&gt;
	HostName 192.168.20.22&lt;br /&gt;
	User myname&lt;br /&gt;
	IdentityFile ~/.ssh/keyidfile&lt;br /&gt;
	IdentitiesOnly yes&lt;br /&gt;
&lt;br /&gt;
#for tailscale&lt;br /&gt;
&lt;br /&gt;
Host wendy-tailscale&lt;br /&gt;
	HostName 1.1.1.1&lt;br /&gt;
	User myname&lt;br /&gt;
	IdentityFile ~/.ssh/keyfile&lt;br /&gt;
        IdentitiesOnly yes&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==[[ Backup_script_on_mac_config_and_setup| Mac Setup]] [[Bash| Bash menu]]-[[Main_Page| Home]]==&lt;br /&gt;
[[Category:Bash]]&lt;/div&gt;</summary>
		<author><name>Bacchas</name></author>
	</entry>
	<entry>
		<id>https://www.r512.com/index.php?title=Scripts_to_backup_to_synology_without_mounting_drives&amp;diff=2952</id>
		<title>Scripts to backup to synology without mounting drives</title>
		<link rel="alternate" type="text/html" href="https://www.r512.com/index.php?title=Scripts_to_backup_to_synology_without_mounting_drives&amp;diff=2952"/>
		<updated>2026-04-24T18:35:27Z</updated>

		<summary type="html">&lt;p&gt;Bacchas: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;pre&amp;gt;&lt;br /&gt;
#!/bin/bash&lt;br /&gt;
# Use absolute paths for everything&lt;br /&gt;
RSYNC_BIN=&amp;quot;/usr/bin/rsync&amp;quot;&lt;br /&gt;
MKDIR_BIN=&amp;quot;/bin/mkdir&amp;quot;&lt;br /&gt;
&lt;br /&gt;
fdate=`date -I`&lt;br /&gt;
fname=&amp;quot;wendy_karaoke.txt&amp;quot;&lt;br /&gt;
LOG_FILE=&amp;quot;$HOME/Desktop/cronlogfiles/logs/$fname&amp;quot;&lt;br /&gt;
&lt;br /&gt;
# Create log directory if missing&lt;br /&gt;
mkdir -p &amp;quot;$HOME/Desktop/cronlogfiles/logs&amp;quot;&lt;br /&gt;
&lt;br /&gt;
# Log Header&lt;br /&gt;
{&lt;br /&gt;
  echo &amp;quot; &amp;quot;&lt;br /&gt;
  echo &amp;quot;***********************************************************&amp;quot;&lt;br /&gt;
  echo &amp;quot; &amp;quot;&lt;br /&gt;
  echo &amp;quot;------  $(date) --------&amp;quot;&lt;br /&gt;
  echo &amp;quot; &amp;quot;&lt;br /&gt;
} &amp;gt;&amp;gt; &amp;quot;$LOG_FILE&amp;quot;&lt;br /&gt;
&lt;br /&gt;
# THE FIX:&lt;br /&gt;
# 1. Changed &amp;#039;-avi&amp;#039; to &amp;#039;-av&amp;#039; (Removes the cryptic &amp;gt;f+++++ codes, showing only filenames)&lt;br /&gt;
# 2. Added &amp;#039;--modify-window=1&amp;#039; (Ignores tiny timestamp differences common on external drives)&lt;br /&gt;
rsync -av --delete --modify-window=1 \&lt;br /&gt;
  --omit-dir-times --no-perms --no-owner --no-group \&lt;br /&gt;
  --exclude={&amp;#039;.DS_Store&amp;#039;,&amp;#039;Thumbs.db&amp;#039;,&amp;#039;*.tmp&amp;#039;} \&lt;br /&gt;
  &amp;quot;/Volumes/owcv1/Karaoke/&amp;quot; \&lt;br /&gt;
  &amp;quot;wendy:/volume1/Karaoke_All_folders/&amp;quot; \&lt;br /&gt;
  &amp;gt;&amp;gt; &amp;quot;$LOG_FILE&amp;quot; 2&amp;gt;&amp;amp;1&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==[[ Backup_script_on_mac_config_and_setup| Mac Setup]] [[Bash| Bash menu]]-[[Main_Page| Home]]==&lt;br /&gt;
[[Category:Bash]]&lt;/div&gt;</summary>
		<author><name>Bacchas</name></author>
	</entry>
	<entry>
		<id>https://www.r512.com/index.php?title=Setup_Mac_for_ssh_into_synology&amp;diff=2951</id>
		<title>Setup Mac for ssh into synology</title>
		<link rel="alternate" type="text/html" href="https://www.r512.com/index.php?title=Setup_Mac_for_ssh_into_synology&amp;diff=2951"/>
		<updated>2026-04-24T18:35:09Z</updated>

		<summary type="html">&lt;p&gt;Bacchas: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;=Create config file=&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Create a config file in the ~/.ssh/config&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039; This file contains the host name and the path to the ssh keys&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Host wendy&lt;br /&gt;
	HostName 192.168.20.22&lt;br /&gt;
	User myname&lt;br /&gt;
	IdentityFile ~/.ssh/keyidfile&lt;br /&gt;
	IdentitiesOnly yes&lt;br /&gt;
&lt;br /&gt;
#for tailscale&lt;br /&gt;
&lt;br /&gt;
Host wendy-tailscale&lt;br /&gt;
	HostName 1.1.1.1&lt;br /&gt;
	User myname&lt;br /&gt;
	IdentityFile ~/.ssh/keyfile&lt;br /&gt;
        IdentitiesOnly yes&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==[[ Backup_script_on_mac_config_and_setup| Mac Setup]] [[Bash| Bash menu]]-[[Main_Page| Home]]==&lt;br /&gt;
[[Category:Bash]]&lt;/div&gt;</summary>
		<author><name>Bacchas</name></author>
	</entry>
	<entry>
		<id>https://www.r512.com/index.php?title=Setup_Mac_for_ssh_into_synology&amp;diff=2950</id>
		<title>Setup Mac for ssh into synology</title>
		<link rel="alternate" type="text/html" href="https://www.r512.com/index.php?title=Setup_Mac_for_ssh_into_synology&amp;diff=2950"/>
		<updated>2026-04-24T17:56:52Z</updated>

		<summary type="html">&lt;p&gt;Bacchas: Created page with &amp;quot;=Create config file= &amp;#039;&amp;#039;&amp;#039;Create a config file in the ~/.ssh/config&amp;#039;&amp;#039;&amp;#039; &amp;#039;&amp;#039;&amp;#039; This file contains the host name and the path to the ssh keys&amp;#039;&amp;#039;&amp;#039; &amp;lt;pre&amp;gt; Host wendy 	HostName 192.168.20.22 	User myname 	IdentityFile ~/.ssh/keyidfile 	IdentitiesOnly yes  #for tailscale  Host wendy-tailscale 	HostName 1.1.1.1 	User myname 	IdentityFile ~/.ssh/keyfile         IdentitiesOnly yes  &amp;lt;/pre&amp;gt;&amp;quot;&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;=Create config file=&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Create a config file in the ~/.ssh/config&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039; This file contains the host name and the path to the ssh keys&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Host wendy&lt;br /&gt;
	HostName 192.168.20.22&lt;br /&gt;
	User myname&lt;br /&gt;
	IdentityFile ~/.ssh/keyidfile&lt;br /&gt;
	IdentitiesOnly yes&lt;br /&gt;
&lt;br /&gt;
#for tailscale&lt;br /&gt;
&lt;br /&gt;
Host wendy-tailscale&lt;br /&gt;
	HostName 1.1.1.1&lt;br /&gt;
	User myname&lt;br /&gt;
	IdentityFile ~/.ssh/keyfile&lt;br /&gt;
        IdentitiesOnly yes&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;/div&gt;</summary>
		<author><name>Bacchas</name></author>
	</entry>
	<entry>
		<id>https://www.r512.com/index.php?title=Scripts_to_backup_to_synology_without_mounting_drives&amp;diff=2949</id>
		<title>Scripts to backup to synology without mounting drives</title>
		<link rel="alternate" type="text/html" href="https://www.r512.com/index.php?title=Scripts_to_backup_to_synology_without_mounting_drives&amp;diff=2949"/>
		<updated>2026-04-24T17:51:55Z</updated>

		<summary type="html">&lt;p&gt;Bacchas: Created page with &amp;quot;&amp;lt;pre&amp;gt; #!/bin/bash # Use absolute paths for everything RSYNC_BIN=&amp;quot;/usr/bin/rsync&amp;quot; MKDIR_BIN=&amp;quot;/bin/mkdir&amp;quot;  fdate=`date -I` fname=&amp;quot;wendy_karaoke.txt&amp;quot; LOG_FILE=&amp;quot;$HOME/Desktop/cronlogfiles/logs/$fname&amp;quot;  # Create log directory if missing mkdir -p &amp;quot;$HOME/Desktop/cronlogfiles/logs&amp;quot;  # Log Header {   echo &amp;quot; &amp;quot;   echo &amp;quot;***********************************************************&amp;quot;   echo &amp;quot; &amp;quot;   echo &amp;quot;------  $(date) --------&amp;quot;   echo &amp;quot; &amp;quot; } &amp;gt;&amp;gt; &amp;quot;$LOG_FILE&amp;quot;  # THE FIX: # 1. Changed &amp;#039;-avi&amp;#039;...&amp;quot;&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;pre&amp;gt;&lt;br /&gt;
#!/bin/bash&lt;br /&gt;
# Use absolute paths for everything&lt;br /&gt;
RSYNC_BIN=&amp;quot;/usr/bin/rsync&amp;quot;&lt;br /&gt;
MKDIR_BIN=&amp;quot;/bin/mkdir&amp;quot;&lt;br /&gt;
&lt;br /&gt;
fdate=`date -I`&lt;br /&gt;
fname=&amp;quot;wendy_karaoke.txt&amp;quot;&lt;br /&gt;
LOG_FILE=&amp;quot;$HOME/Desktop/cronlogfiles/logs/$fname&amp;quot;&lt;br /&gt;
&lt;br /&gt;
# Create log directory if missing&lt;br /&gt;
mkdir -p &amp;quot;$HOME/Desktop/cronlogfiles/logs&amp;quot;&lt;br /&gt;
&lt;br /&gt;
# Log Header&lt;br /&gt;
{&lt;br /&gt;
  echo &amp;quot; &amp;quot;&lt;br /&gt;
  echo &amp;quot;***********************************************************&amp;quot;&lt;br /&gt;
  echo &amp;quot; &amp;quot;&lt;br /&gt;
  echo &amp;quot;------  $(date) --------&amp;quot;&lt;br /&gt;
  echo &amp;quot; &amp;quot;&lt;br /&gt;
} &amp;gt;&amp;gt; &amp;quot;$LOG_FILE&amp;quot;&lt;br /&gt;
&lt;br /&gt;
# THE FIX:&lt;br /&gt;
# 1. Changed &amp;#039;-avi&amp;#039; to &amp;#039;-av&amp;#039; (Removes the cryptic &amp;gt;f+++++ codes, showing only filenames)&lt;br /&gt;
# 2. Added &amp;#039;--modify-window=1&amp;#039; (Ignores tiny timestamp differences common on external drives)&lt;br /&gt;
rsync -av --delete --modify-window=1 \&lt;br /&gt;
  --omit-dir-times --no-perms --no-owner --no-group \&lt;br /&gt;
  --exclude={&amp;#039;.DS_Store&amp;#039;,&amp;#039;Thumbs.db&amp;#039;,&amp;#039;*.tmp&amp;#039;} \&lt;br /&gt;
  &amp;quot;/Volumes/owcv1/Karaoke/&amp;quot; \&lt;br /&gt;
  &amp;quot;wendy:/volume1/Karaoke_All_folders/&amp;quot; \&lt;br /&gt;
  &amp;gt;&amp;gt; &amp;quot;$LOG_FILE&amp;quot; 2&amp;gt;&amp;amp;1&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;/div&gt;</summary>
		<author><name>Bacchas</name></author>
	</entry>
	<entry>
		<id>https://www.r512.com/index.php?title=Backup_script_on_mac_config_and_setup&amp;diff=2948</id>
		<title>Backup script on mac config and setup</title>
		<link rel="alternate" type="text/html" href="https://www.r512.com/index.php?title=Backup_script_on_mac_config_and_setup&amp;diff=2948"/>
		<updated>2026-04-24T17:50:28Z</updated>

		<summary type="html">&lt;p&gt;Bacchas: Created page with &amp;quot;= Setup Mac for ssh into synology = =Scripts to backup to synology without mounting drives=&amp;quot;&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;=[[ Setup Mac for ssh into synology ]]=&lt;br /&gt;
=[[Scripts to backup to synology without mounting drives]]=&lt;/div&gt;</summary>
		<author><name>Bacchas</name></author>
	</entry>
	<entry>
		<id>https://www.r512.com/index.php?title=Bash&amp;diff=2947</id>
		<title>Bash</title>
		<link rel="alternate" type="text/html" href="https://www.r512.com/index.php?title=Bash&amp;diff=2947"/>
		<updated>2026-04-24T17:47:30Z</updated>

		<summary type="html">&lt;p&gt;Bacchas: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== [[backup script on mac config and setup ]] ==&lt;br /&gt;
==[[Scripts used on Servers]]==&lt;br /&gt;
==[[Useful bash commands]]==&lt;br /&gt;
==[[Tmux]]==&lt;br /&gt;
&lt;br /&gt;
== Useful Command Line Utilities ==&lt;br /&gt;
* [[RMLINT | RMLINT - Duplicate Finding cmd Tool]]&lt;br /&gt;
* [[RCLONE | Rclone syncs your files to cloud storage ]]&lt;br /&gt;
* [[NCDU | Ncdu Ncdu is a disk usage analyzer]]&lt;br /&gt;
* [[BTOP]]&lt;br /&gt;
* [[NTFY]]&lt;br /&gt;
&lt;br /&gt;
==[[Image Scripts]]==&lt;br /&gt;
==[[Script Course]]==&lt;br /&gt;
==[[Centos OS | More Scripting]]==&lt;br /&gt;
==[[Sample Scripts]]==&lt;br /&gt;
==[[File Commands]]==&lt;br /&gt;
===[[Ubuntu File System Commands]]===&lt;br /&gt;
* find, copy, replace, rename&lt;br /&gt;
==[[AWK Command]]==&lt;br /&gt;
==[[Text File Commands]]==&lt;br /&gt;
* find and replace text in bulk&lt;br /&gt;
==[[BSD MAILX]]==&lt;br /&gt;
==[[Shell Scripting]]==&lt;/div&gt;</summary>
		<author><name>Bacchas</name></author>
	</entry>
	<entry>
		<id>https://www.r512.com/index.php?title=PYTHONAPP&amp;diff=2946</id>
		<title>PYTHONAPP</title>
		<link rel="alternate" type="text/html" href="https://www.r512.com/index.php?title=PYTHONAPP&amp;diff=2946"/>
		<updated>2026-04-23T14:49:49Z</updated>

		<summary type="html">&lt;p&gt;Bacchas: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;=Karaoke app Deployment=&lt;br /&gt;
==  Prerequisite Check ==&lt;br /&gt;
# ssh into the server&lt;br /&gt;
# verify what is installed&lt;br /&gt;
 apache2 -v&lt;br /&gt;
 python3 --version&lt;br /&gt;
 mysql --version&lt;br /&gt;
 which certbot&lt;br /&gt;
# if certbot isn&amp;#039;t installed&lt;br /&gt;
 sudo apt update&lt;br /&gt;
 sudo apt install certbot python3-certbot-apache -y&lt;br /&gt;
&lt;br /&gt;
# Install Python venv if needed:&lt;br /&gt;
 sudo apt install python3-venv python3-pip -y&lt;br /&gt;
&lt;br /&gt;
==  Create the App Directory ==&lt;br /&gt;
 sudo mkdir -p /var/www/html/myapp&lt;br /&gt;
 cd /var/www/html/myapp&lt;br /&gt;
&lt;br /&gt;
== Upload App Files ==&lt;br /&gt;
# Upload the .env file (hidden, so it won&amp;#039;t be picked up by scp -r)&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;If you don&amp;#039;t see .env in Finder, press Cmd+Shift+. to toggle hidden files.&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&lt;br /&gt;
== Set up the Python Environment ==&lt;br /&gt;
&lt;br /&gt;
 cd /var/www/html/myapp&lt;br /&gt;
 python3 -m venv venv&lt;br /&gt;
 source venv/bin/activate&lt;br /&gt;
 pip install flask pymysql cryptography gunicorn DBUtils&lt;br /&gt;
 deactivate&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;The cryptography package is required for MySQL caching_sha2_password auth.&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&lt;br /&gt;
== Configure the Database ==&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Open phpMyAdmin in your browser. Make sure the user in your .env file has privileges on the dbasename database. If not, in phpMyAdmin run:&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&lt;br /&gt;
 GRANT ALL PRIVILEGES ON dbasename.* TO &amp;#039;YourUser&amp;#039;@&amp;#039;localhost&amp;#039;;&lt;br /&gt;
 FLUSH PRIVILEGES;&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Verify your .env file on the server has the correct values:&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&lt;br /&gt;
 cat /var/www/html/myapp/.env&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039; It should contain &amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
 DB_HOST=localhost&lt;br /&gt;
 DB_USER=YourUser&lt;br /&gt;
 DB_PASS=YourPassword&lt;br /&gt;
 DB_NAME=dbasename&lt;br /&gt;
 SECRET_KEY=some-random-string&lt;br /&gt;
 HOST_NAME= name for the host side&lt;br /&gt;
 PORT=3001&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Important: Use a different port from any other apps you have running. I&amp;#039;m using 3001 here — pick whatever&amp;#039;s free.&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&lt;br /&gt;
==Test App Manually==&lt;br /&gt;
 cd /var/www/html/myapp&lt;br /&gt;
 source venv/bin/activate&lt;br /&gt;
 python3 app.py&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;You should see &amp;quot;Karaoke app running on http://localhost:3001&amp;quot;. In another SSH window test&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
 sudo nano /etc/systemd/system/myapp.service&lt;br /&gt;
&lt;br /&gt;
== Create the systemd Service ==&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Paste &amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
 [Unit]&lt;br /&gt;
 Description=My App mydir (Gunicorn)&lt;br /&gt;
 After=network.target&lt;br /&gt;
 &lt;br /&gt;
 [Service]&lt;br /&gt;
 User=www-data&lt;br /&gt;
 Group=www-data&lt;br /&gt;
 WorkingDirectory=/var/www/html/myapp&lt;br /&gt;
 Environment=&amp;quot;PATH=/var/www/html/myapp/venv/bin&amp;quot;&lt;br /&gt;
 ExecStart=/var/www/html/myapp/venv/bin/gunicorn --workers 3 --bind 127.0.0.1:3001 app:app&lt;br /&gt;
 Restart=always&lt;br /&gt;
 &lt;br /&gt;
 [Install]&lt;br /&gt;
 WantedBy=multi-user.target&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Save (Ctrl+O, Enter, Ctrl+X).&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Set permissions:&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
 sudo chown -R www-data:www-data /var/www/html/myapp&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Enable and start &amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
 sudo systemctl daemon-reload&lt;br /&gt;
 sudo systemctl enable myapp&lt;br /&gt;
 sudo systemctl start myapp&lt;br /&gt;
 sudo systemctl status myapp&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;You should see active (running). If not:&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
 sudo journalctl -u myapp -n 50&lt;br /&gt;
&lt;br /&gt;
== Configure Apache Reverse Proxy==&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Enable required modules (only needed once on the server):&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
 sudo a2enmod proxy proxy_http ssl rewrite headers&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Create the HTTP vhost (which certbot will upgrade later):&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&lt;br /&gt;
 sudo nano /etc/apache2/sites-available/mydomain.conf&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Paste — replace yourdomain.com with your actual domain&amp;#039;&amp;#039;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&amp;lt;VirtualHost *:80&amp;gt;&lt;br /&gt;
    ServerName yourdomain.com&lt;br /&gt;
    ServerAlias www.yourdomain.com&lt;br /&gt;
&lt;br /&gt;
    ProxyPreserveHost On&lt;br /&gt;
    ProxyPass / http://127.0.0.1:3001/&lt;br /&gt;
    ProxyPassReverse / http://127.0.0.1:3001/&lt;br /&gt;
&lt;br /&gt;
    ErrorLog ${APACHE_LOG_DIR}/mydomain-error.log&lt;br /&gt;
    CustomLog ${APACHE_LOG_DIR}/mydomain-access.log combined&lt;br /&gt;
&amp;lt;/VirtualHost&amp;gt;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Enable and reload&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
 sudo a2ensite mydomain.conf&lt;br /&gt;
 sudo apache2ctl configtest&lt;br /&gt;
 sudo systemctl reload apache2&lt;br /&gt;
&lt;br /&gt;
Test in your browser: http://yourdomain.com — you should see the login page.&lt;br /&gt;
&lt;br /&gt;
== Enable HTTPS with Certbot==&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Make sure your domain&amp;#039;s DNS A record points to your server IP first.&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Run certbot:&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
 sudo certbot --apache -d yourdomain.com -d www.yourdomain.com&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Choose 2 (Redirect) when asked, so HTTP automatically redirects to HTTPS.&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Certbot will create /etc/apache2/sites-available/rb222-le-ssl.conf and enable it.&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
 sudo apache2ctl configtest&lt;br /&gt;
 sudo systemctl reload apache2&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Visit https://yourdomain.com — you should see the lock icon and the app.&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;If certbot fails to auto-configure (it sometimes does), create the SSL vhost manually:&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&lt;br /&gt;
 sudo nano /etc/apache2/sites-available/mydomain-le-ssl.conf&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&amp;lt;IfModule mod_ssl.c&amp;gt;&lt;br /&gt;
&amp;lt;VirtualHost *:443&amp;gt;&lt;br /&gt;
    ServerName yourdomain.com&lt;br /&gt;
    ServerAlias www.yourdomain.com&lt;br /&gt;
&lt;br /&gt;
    ProxyPreserveHost On&lt;br /&gt;
    ProxyPass / http://127.0.0.1:3001/&lt;br /&gt;
    ProxyPassReverse / http://127.0.0.1:3001/&lt;br /&gt;
&lt;br /&gt;
    SSLEngine on&lt;br /&gt;
    SSLCertificateFile /etc/letsencrypt/live/yourdomain.com/fullchain.pem&lt;br /&gt;
    SSLCertificateKeyFile /etc/letsencrypt/live/yourdomain.com/privkey.pem&lt;br /&gt;
    Include /etc/letsencrypt/options-ssl-apache.conf&lt;br /&gt;
&lt;br /&gt;
    ErrorLog ${APACHE_LOG_DIR}/rb222-ssl-error.log&lt;br /&gt;
    CustomLog ${APACHE_LOG_DIR}/rb222-ssl-access.log combined&lt;br /&gt;
&amp;lt;/VirtualHost&amp;gt;&lt;br /&gt;
&amp;lt;/IfModule&amp;gt;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;then&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
 sudo a2ensite mydomain-le-ssl.conf&lt;br /&gt;
 sudo systemctl reload apache2&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Cert auto-renewal is already enabled by certbot&amp;#039;s systemd timer — verify with&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
 sudo systemctl list-timers | grep certbot&lt;br /&gt;
&lt;br /&gt;
=Database Optimization=&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
CREATE INDEX idx_songs_title ON songs(Title(100));&lt;br /&gt;
CREATE INDEX idx_songs_artists ON songs(Artists(100));&lt;br /&gt;
CREATE INDEX idx_favorite_name ON Favorite(Name(80), Tag(20));&lt;br /&gt;
CREATE INDEX idx_queue_status ON queue(Status(20));&lt;br /&gt;
CREATE INDEX idx_queue_timestamp ON queue(TimeStamp(20));&lt;br /&gt;
CREATE INDEX idx_archive_name ON Archive_Singers(Name(80));&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
= How to find out the service name of the app= &lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;This is the service that starts the app, this will list all running services&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# &amp;quot;What services exist on this box?&amp;quot;&lt;br /&gt;
systemctl list-unit-files --type=service --state=enabled&lt;br /&gt;
&lt;br /&gt;
# &amp;quot;Which one is MY app?&amp;quot;&lt;br /&gt;
sudo grep -l &amp;quot;/var/www/html/&amp;lt;dirname&amp;gt;&amp;quot; /etc/systemd/system/*.service&lt;br /&gt;
&lt;br /&gt;
# &amp;quot;Which service owns port X?&amp;quot;&lt;br /&gt;
sudo lsof -i :3000 -P -n            # gets PID&lt;br /&gt;
ps -o unit= -p &amp;lt;PID&amp;gt;                # gets service name&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;/div&gt;</summary>
		<author><name>Bacchas</name></author>
	</entry>
	<entry>
		<id>https://www.r512.com/index.php?title=PYTHONAPP&amp;diff=2945</id>
		<title>PYTHONAPP</title>
		<link rel="alternate" type="text/html" href="https://www.r512.com/index.php?title=PYTHONAPP&amp;diff=2945"/>
		<updated>2026-04-21T20:25:32Z</updated>

		<summary type="html">&lt;p&gt;Bacchas: /* Test App Manually */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;=Karaoke app Deployment=&lt;br /&gt;
==  Prerequisite Check ==&lt;br /&gt;
# ssh into the server&lt;br /&gt;
# verify what is installed&lt;br /&gt;
 apache2 -v&lt;br /&gt;
 python3 --version&lt;br /&gt;
 mysql --version&lt;br /&gt;
 which certbot&lt;br /&gt;
# if certbot isn&amp;#039;t installed&lt;br /&gt;
 sudo apt update&lt;br /&gt;
 sudo apt install certbot python3-certbot-apache -y&lt;br /&gt;
&lt;br /&gt;
# Install Python venv if needed:&lt;br /&gt;
 sudo apt install python3-venv python3-pip -y&lt;br /&gt;
&lt;br /&gt;
==  Create the App Directory ==&lt;br /&gt;
 sudo mkdir -p /var/www/html/myapp&lt;br /&gt;
 cd /var/www/html/myapp&lt;br /&gt;
&lt;br /&gt;
== Upload App Files ==&lt;br /&gt;
# Upload the .env file (hidden, so it won&amp;#039;t be picked up by scp -r)&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;If you don&amp;#039;t see .env in Finder, press Cmd+Shift+. to toggle hidden files.&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&lt;br /&gt;
== Set up the Python Environment ==&lt;br /&gt;
&lt;br /&gt;
 cd /var/www/html/myapp&lt;br /&gt;
 python3 -m venv venv&lt;br /&gt;
 source venv/bin/activate&lt;br /&gt;
 pip install flask pymysql cryptography gunicorn DBUtils&lt;br /&gt;
 deactivate&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;The cryptography package is required for MySQL caching_sha2_password auth.&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&lt;br /&gt;
== Configure the Database ==&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Open phpMyAdmin in your browser. Make sure the user in your .env file has privileges on the dbasename database. If not, in phpMyAdmin run:&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&lt;br /&gt;
 GRANT ALL PRIVILEGES ON dbasename.* TO &amp;#039;YourUser&amp;#039;@&amp;#039;localhost&amp;#039;;&lt;br /&gt;
 FLUSH PRIVILEGES;&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Verify your .env file on the server has the correct values:&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&lt;br /&gt;
 cat /var/www/html/myapp/.env&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039; It should contain &amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
 DB_HOST=localhost&lt;br /&gt;
 DB_USER=YourUser&lt;br /&gt;
 DB_PASS=YourPassword&lt;br /&gt;
 DB_NAME=dbasename&lt;br /&gt;
 SECRET_KEY=some-random-string&lt;br /&gt;
 HOST_NAME= name for the host side&lt;br /&gt;
 PORT=3001&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Important: Use a different port from any other apps you have running. I&amp;#039;m using 3001 here — pick whatever&amp;#039;s free.&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&lt;br /&gt;
==Test App Manually==&lt;br /&gt;
 cd /var/www/html/myapp&lt;br /&gt;
 source venv/bin/activate&lt;br /&gt;
 python3 app.py&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;You should see &amp;quot;Karaoke app running on http://localhost:3001&amp;quot;. In another SSH window test&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
 sudo nano /etc/systemd/system/myapp.service&lt;br /&gt;
&lt;br /&gt;
== Create the systemd Service ==&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Paste &amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
 [Unit]&lt;br /&gt;
 Description=My App mydir (Gunicorn)&lt;br /&gt;
 After=network.target&lt;br /&gt;
 &lt;br /&gt;
 [Service]&lt;br /&gt;
 User=www-data&lt;br /&gt;
 Group=www-data&lt;br /&gt;
 WorkingDirectory=/var/www/html/myapp&lt;br /&gt;
 Environment=&amp;quot;PATH=/var/www/html/myapp/venv/bin&amp;quot;&lt;br /&gt;
 ExecStart=/var/www/html/myapp/venv/bin/gunicorn --workers 3 --bind 127.0.0.1:3001 app:app&lt;br /&gt;
 Restart=always&lt;br /&gt;
 &lt;br /&gt;
 [Install]&lt;br /&gt;
 WantedBy=multi-user.target&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Save (Ctrl+O, Enter, Ctrl+X).&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Set permissions:&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
 sudo chown -R www-data:www-data /var/www/html/myapp&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Enable and start &amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
 sudo systemctl daemon-reload&lt;br /&gt;
 sudo systemctl enable myapp&lt;br /&gt;
 sudo systemctl start myapp&lt;br /&gt;
 sudo systemctl status myapp&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;You should see active (running). If not:&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
 sudo journalctl -u myapp -n 50&lt;br /&gt;
&lt;br /&gt;
== Configure Apache Reverse Proxy==&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Enable required modules (only needed once on the server):&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
 sudo a2enmod proxy proxy_http ssl rewrite headers&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Create the HTTP vhost (which certbot will upgrade later):&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&lt;br /&gt;
 sudo nano /etc/apache2/sites-available/mydomain.conf&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Paste — replace yourdomain.com with your actual domain&amp;#039;&amp;#039;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&amp;lt;VirtualHost *:80&amp;gt;&lt;br /&gt;
    ServerName yourdomain.com&lt;br /&gt;
    ServerAlias www.yourdomain.com&lt;br /&gt;
&lt;br /&gt;
    ProxyPreserveHost On&lt;br /&gt;
    ProxyPass / http://127.0.0.1:3001/&lt;br /&gt;
    ProxyPassReverse / http://127.0.0.1:3001/&lt;br /&gt;
&lt;br /&gt;
    ErrorLog ${APACHE_LOG_DIR}/mydomain-error.log&lt;br /&gt;
    CustomLog ${APACHE_LOG_DIR}/mydomain-access.log combined&lt;br /&gt;
&amp;lt;/VirtualHost&amp;gt;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Enable and reload&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
 sudo a2ensite mydomain.conf&lt;br /&gt;
 sudo apache2ctl configtest&lt;br /&gt;
 sudo systemctl reload apache2&lt;br /&gt;
&lt;br /&gt;
Test in your browser: http://yourdomain.com — you should see the login page.&lt;br /&gt;
&lt;br /&gt;
== Enable HTTPS with Certbot==&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Make sure your domain&amp;#039;s DNS A record points to your server IP first.&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Run certbot:&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
 sudo certbot --apache -d yourdomain.com -d www.yourdomain.com&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Choose 2 (Redirect) when asked, so HTTP automatically redirects to HTTPS.&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Certbot will create /etc/apache2/sites-available/rb222-le-ssl.conf and enable it.&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
 sudo apache2ctl configtest&lt;br /&gt;
 sudo systemctl reload apache2&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Visit https://yourdomain.com — you should see the lock icon and the app.&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;If certbot fails to auto-configure (it sometimes does), create the SSL vhost manually:&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&lt;br /&gt;
 sudo nano /etc/apache2/sites-available/mydomain-le-ssl.conf&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&amp;lt;IfModule mod_ssl.c&amp;gt;&lt;br /&gt;
&amp;lt;VirtualHost *:443&amp;gt;&lt;br /&gt;
    ServerName yourdomain.com&lt;br /&gt;
    ServerAlias www.yourdomain.com&lt;br /&gt;
&lt;br /&gt;
    ProxyPreserveHost On&lt;br /&gt;
    ProxyPass / http://127.0.0.1:3001/&lt;br /&gt;
    ProxyPassReverse / http://127.0.0.1:3001/&lt;br /&gt;
&lt;br /&gt;
    SSLEngine on&lt;br /&gt;
    SSLCertificateFile /etc/letsencrypt/live/yourdomain.com/fullchain.pem&lt;br /&gt;
    SSLCertificateKeyFile /etc/letsencrypt/live/yourdomain.com/privkey.pem&lt;br /&gt;
    Include /etc/letsencrypt/options-ssl-apache.conf&lt;br /&gt;
&lt;br /&gt;
    ErrorLog ${APACHE_LOG_DIR}/rb222-ssl-error.log&lt;br /&gt;
    CustomLog ${APACHE_LOG_DIR}/rb222-ssl-access.log combined&lt;br /&gt;
&amp;lt;/VirtualHost&amp;gt;&lt;br /&gt;
&amp;lt;/IfModule&amp;gt;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;then&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
 sudo a2ensite mydomain-le-ssl.conf&lt;br /&gt;
 sudo systemctl reload apache2&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Cert auto-renewal is already enabled by certbot&amp;#039;s systemd timer — verify with&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
 sudo systemctl list-timers | grep certbot&lt;br /&gt;
&lt;br /&gt;
=Database Optimization=&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
CREATE INDEX idx_songs_title ON songs(Title(100));&lt;br /&gt;
CREATE INDEX idx_songs_artists ON songs(Artists(100));&lt;br /&gt;
CREATE INDEX idx_favorite_name ON Favorite(Name(80), Tag(20));&lt;br /&gt;
CREATE INDEX idx_queue_status ON queue(Status(20));&lt;br /&gt;
CREATE INDEX idx_queue_timestamp ON queue(TimeStamp(20));&lt;br /&gt;
CREATE INDEX idx_archive_name ON Archive_Singers(Name(80));&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;/div&gt;</summary>
		<author><name>Bacchas</name></author>
	</entry>
	<entry>
		<id>https://www.r512.com/index.php?title=PYTHONAPP&amp;diff=2944</id>
		<title>PYTHONAPP</title>
		<link rel="alternate" type="text/html" href="https://www.r512.com/index.php?title=PYTHONAPP&amp;diff=2944"/>
		<updated>2026-04-21T20:25:04Z</updated>

		<summary type="html">&lt;p&gt;Bacchas: /* Configure the Database */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;=Karaoke app Deployment=&lt;br /&gt;
==  Prerequisite Check ==&lt;br /&gt;
# ssh into the server&lt;br /&gt;
# verify what is installed&lt;br /&gt;
 apache2 -v&lt;br /&gt;
 python3 --version&lt;br /&gt;
 mysql --version&lt;br /&gt;
 which certbot&lt;br /&gt;
# if certbot isn&amp;#039;t installed&lt;br /&gt;
 sudo apt update&lt;br /&gt;
 sudo apt install certbot python3-certbot-apache -y&lt;br /&gt;
&lt;br /&gt;
# Install Python venv if needed:&lt;br /&gt;
 sudo apt install python3-venv python3-pip -y&lt;br /&gt;
&lt;br /&gt;
==  Create the App Directory ==&lt;br /&gt;
 sudo mkdir -p /var/www/html/myapp&lt;br /&gt;
 cd /var/www/html/myapp&lt;br /&gt;
&lt;br /&gt;
== Upload App Files ==&lt;br /&gt;
# Upload the .env file (hidden, so it won&amp;#039;t be picked up by scp -r)&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;If you don&amp;#039;t see .env in Finder, press Cmd+Shift+. to toggle hidden files.&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&lt;br /&gt;
== Set up the Python Environment ==&lt;br /&gt;
&lt;br /&gt;
 cd /var/www/html/myapp&lt;br /&gt;
 python3 -m venv venv&lt;br /&gt;
 source venv/bin/activate&lt;br /&gt;
 pip install flask pymysql cryptography gunicorn DBUtils&lt;br /&gt;
 deactivate&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;The cryptography package is required for MySQL caching_sha2_password auth.&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&lt;br /&gt;
== Configure the Database ==&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Open phpMyAdmin in your browser. Make sure the user in your .env file has privileges on the dbasename database. If not, in phpMyAdmin run:&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&lt;br /&gt;
 GRANT ALL PRIVILEGES ON dbasename.* TO &amp;#039;YourUser&amp;#039;@&amp;#039;localhost&amp;#039;;&lt;br /&gt;
 FLUSH PRIVILEGES;&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Verify your .env file on the server has the correct values:&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&lt;br /&gt;
 cat /var/www/html/myapp/.env&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039; It should contain &amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
 DB_HOST=localhost&lt;br /&gt;
 DB_USER=YourUser&lt;br /&gt;
 DB_PASS=YourPassword&lt;br /&gt;
 DB_NAME=dbasename&lt;br /&gt;
 SECRET_KEY=some-random-string&lt;br /&gt;
 HOST_NAME= name for the host side&lt;br /&gt;
 PORT=3001&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Important: Use a different port from any other apps you have running. I&amp;#039;m using 3001 here — pick whatever&amp;#039;s free.&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&lt;br /&gt;
==Test App Manually==&lt;br /&gt;
 cd /var/www/html/myapp&lt;br /&gt;
 source venv/bin/activate&lt;br /&gt;
 python3 app.py&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;You should see &amp;quot;Karaoke app running on http://localhost:3001&amp;quot;. In another SSH window test&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
 sudo nano /etc/systemd/system/rb222.service&lt;br /&gt;
&lt;br /&gt;
== Create the systemd Service ==&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Paste &amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
 [Unit]&lt;br /&gt;
 Description=My App mydir (Gunicorn)&lt;br /&gt;
 After=network.target&lt;br /&gt;
 &lt;br /&gt;
 [Service]&lt;br /&gt;
 User=www-data&lt;br /&gt;
 Group=www-data&lt;br /&gt;
 WorkingDirectory=/var/www/html/myapp&lt;br /&gt;
 Environment=&amp;quot;PATH=/var/www/html/myapp/venv/bin&amp;quot;&lt;br /&gt;
 ExecStart=/var/www/html/myapp/venv/bin/gunicorn --workers 3 --bind 127.0.0.1:3001 app:app&lt;br /&gt;
 Restart=always&lt;br /&gt;
 &lt;br /&gt;
 [Install]&lt;br /&gt;
 WantedBy=multi-user.target&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Save (Ctrl+O, Enter, Ctrl+X).&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Set permissions:&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
 sudo chown -R www-data:www-data /var/www/html/myapp&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Enable and start &amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
 sudo systemctl daemon-reload&lt;br /&gt;
 sudo systemctl enable myapp&lt;br /&gt;
 sudo systemctl start myapp&lt;br /&gt;
 sudo systemctl status myapp&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;You should see active (running). If not:&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
 sudo journalctl -u myapp -n 50&lt;br /&gt;
&lt;br /&gt;
== Configure Apache Reverse Proxy==&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Enable required modules (only needed once on the server):&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
 sudo a2enmod proxy proxy_http ssl rewrite headers&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Create the HTTP vhost (which certbot will upgrade later):&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&lt;br /&gt;
 sudo nano /etc/apache2/sites-available/mydomain.conf&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Paste — replace yourdomain.com with your actual domain&amp;#039;&amp;#039;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&amp;lt;VirtualHost *:80&amp;gt;&lt;br /&gt;
    ServerName yourdomain.com&lt;br /&gt;
    ServerAlias www.yourdomain.com&lt;br /&gt;
&lt;br /&gt;
    ProxyPreserveHost On&lt;br /&gt;
    ProxyPass / http://127.0.0.1:3001/&lt;br /&gt;
    ProxyPassReverse / http://127.0.0.1:3001/&lt;br /&gt;
&lt;br /&gt;
    ErrorLog ${APACHE_LOG_DIR}/mydomain-error.log&lt;br /&gt;
    CustomLog ${APACHE_LOG_DIR}/mydomain-access.log combined&lt;br /&gt;
&amp;lt;/VirtualHost&amp;gt;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Enable and reload&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
 sudo a2ensite mydomain.conf&lt;br /&gt;
 sudo apache2ctl configtest&lt;br /&gt;
 sudo systemctl reload apache2&lt;br /&gt;
&lt;br /&gt;
Test in your browser: http://yourdomain.com — you should see the login page.&lt;br /&gt;
&lt;br /&gt;
== Enable HTTPS with Certbot==&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Make sure your domain&amp;#039;s DNS A record points to your server IP first.&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Run certbot:&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
 sudo certbot --apache -d yourdomain.com -d www.yourdomain.com&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Choose 2 (Redirect) when asked, so HTTP automatically redirects to HTTPS.&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Certbot will create /etc/apache2/sites-available/rb222-le-ssl.conf and enable it.&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
 sudo apache2ctl configtest&lt;br /&gt;
 sudo systemctl reload apache2&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Visit https://yourdomain.com — you should see the lock icon and the app.&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;If certbot fails to auto-configure (it sometimes does), create the SSL vhost manually:&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&lt;br /&gt;
 sudo nano /etc/apache2/sites-available/mydomain-le-ssl.conf&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&amp;lt;IfModule mod_ssl.c&amp;gt;&lt;br /&gt;
&amp;lt;VirtualHost *:443&amp;gt;&lt;br /&gt;
    ServerName yourdomain.com&lt;br /&gt;
    ServerAlias www.yourdomain.com&lt;br /&gt;
&lt;br /&gt;
    ProxyPreserveHost On&lt;br /&gt;
    ProxyPass / http://127.0.0.1:3001/&lt;br /&gt;
    ProxyPassReverse / http://127.0.0.1:3001/&lt;br /&gt;
&lt;br /&gt;
    SSLEngine on&lt;br /&gt;
    SSLCertificateFile /etc/letsencrypt/live/yourdomain.com/fullchain.pem&lt;br /&gt;
    SSLCertificateKeyFile /etc/letsencrypt/live/yourdomain.com/privkey.pem&lt;br /&gt;
    Include /etc/letsencrypt/options-ssl-apache.conf&lt;br /&gt;
&lt;br /&gt;
    ErrorLog ${APACHE_LOG_DIR}/rb222-ssl-error.log&lt;br /&gt;
    CustomLog ${APACHE_LOG_DIR}/rb222-ssl-access.log combined&lt;br /&gt;
&amp;lt;/VirtualHost&amp;gt;&lt;br /&gt;
&amp;lt;/IfModule&amp;gt;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;then&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
 sudo a2ensite mydomain-le-ssl.conf&lt;br /&gt;
 sudo systemctl reload apache2&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Cert auto-renewal is already enabled by certbot&amp;#039;s systemd timer — verify with&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
 sudo systemctl list-timers | grep certbot&lt;br /&gt;
&lt;br /&gt;
=Database Optimization=&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
CREATE INDEX idx_songs_title ON songs(Title(100));&lt;br /&gt;
CREATE INDEX idx_songs_artists ON songs(Artists(100));&lt;br /&gt;
CREATE INDEX idx_favorite_name ON Favorite(Name(80), Tag(20));&lt;br /&gt;
CREATE INDEX idx_queue_status ON queue(Status(20));&lt;br /&gt;
CREATE INDEX idx_queue_timestamp ON queue(TimeStamp(20));&lt;br /&gt;
CREATE INDEX idx_archive_name ON Archive_Singers(Name(80));&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;/div&gt;</summary>
		<author><name>Bacchas</name></author>
	</entry>
	<entry>
		<id>https://www.r512.com/index.php?title=PYTHONAPP&amp;diff=2943</id>
		<title>PYTHONAPP</title>
		<link rel="alternate" type="text/html" href="https://www.r512.com/index.php?title=PYTHONAPP&amp;diff=2943"/>
		<updated>2026-04-21T17:40:20Z</updated>

		<summary type="html">&lt;p&gt;Bacchas: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;=Karaoke app Deployment=&lt;br /&gt;
==  Prerequisite Check ==&lt;br /&gt;
# ssh into the server&lt;br /&gt;
# verify what is installed&lt;br /&gt;
 apache2 -v&lt;br /&gt;
 python3 --version&lt;br /&gt;
 mysql --version&lt;br /&gt;
 which certbot&lt;br /&gt;
# if certbot isn&amp;#039;t installed&lt;br /&gt;
 sudo apt update&lt;br /&gt;
 sudo apt install certbot python3-certbot-apache -y&lt;br /&gt;
&lt;br /&gt;
# Install Python venv if needed:&lt;br /&gt;
 sudo apt install python3-venv python3-pip -y&lt;br /&gt;
&lt;br /&gt;
==  Create the App Directory ==&lt;br /&gt;
 sudo mkdir -p /var/www/html/myapp&lt;br /&gt;
 cd /var/www/html/myapp&lt;br /&gt;
&lt;br /&gt;
== Upload App Files ==&lt;br /&gt;
# Upload the .env file (hidden, so it won&amp;#039;t be picked up by scp -r)&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;If you don&amp;#039;t see .env in Finder, press Cmd+Shift+. to toggle hidden files.&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&lt;br /&gt;
== Set up the Python Environment ==&lt;br /&gt;
&lt;br /&gt;
 cd /var/www/html/myapp&lt;br /&gt;
 python3 -m venv venv&lt;br /&gt;
 source venv/bin/activate&lt;br /&gt;
 pip install flask pymysql cryptography gunicorn DBUtils&lt;br /&gt;
 deactivate&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;The cryptography package is required for MySQL caching_sha2_password auth.&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&lt;br /&gt;
== Configure the Database ==&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Open phpMyAdmin in your browser. Make sure the user in your .env file has privileges on the karaoke database. If not, in phpMyAdmin run:&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&lt;br /&gt;
 GRANT ALL PRIVILEGES ON dbasename.* TO &amp;#039;YourUser&amp;#039;@&amp;#039;localhost&amp;#039;;&lt;br /&gt;
 FLUSH PRIVILEGES;&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Verify your .env file on the server has the correct values:&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&lt;br /&gt;
 cat /var/www/html/rb222/.env&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039; It should contain &amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
 DB_HOST=localhost&lt;br /&gt;
 DB_USER=YourUser&lt;br /&gt;
 DB_PASS=YourPassword&lt;br /&gt;
 DB_NAME=dbasename&lt;br /&gt;
 SECRET_KEY=some-random-string&lt;br /&gt;
 HOST_NAME= name for the host side&lt;br /&gt;
 PORT=3001&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Important: Use a different port from any other apps you have running. I&amp;#039;m using 3001 here — pick whatever&amp;#039;s free.&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&lt;br /&gt;
==Test App Manually==&lt;br /&gt;
 cd /var/www/html/myapp&lt;br /&gt;
 source venv/bin/activate&lt;br /&gt;
 python3 app.py&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;You should see &amp;quot;Karaoke app running on http://localhost:3001&amp;quot;. In another SSH window test&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
 sudo nano /etc/systemd/system/rb222.service&lt;br /&gt;
&lt;br /&gt;
== Create the systemd Service ==&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Paste &amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
 [Unit]&lt;br /&gt;
 Description=My App mydir (Gunicorn)&lt;br /&gt;
 After=network.target&lt;br /&gt;
 &lt;br /&gt;
 [Service]&lt;br /&gt;
 User=www-data&lt;br /&gt;
 Group=www-data&lt;br /&gt;
 WorkingDirectory=/var/www/html/myapp&lt;br /&gt;
 Environment=&amp;quot;PATH=/var/www/html/myapp/venv/bin&amp;quot;&lt;br /&gt;
 ExecStart=/var/www/html/myapp/venv/bin/gunicorn --workers 3 --bind 127.0.0.1:3001 app:app&lt;br /&gt;
 Restart=always&lt;br /&gt;
 &lt;br /&gt;
 [Install]&lt;br /&gt;
 WantedBy=multi-user.target&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Save (Ctrl+O, Enter, Ctrl+X).&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Set permissions:&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
 sudo chown -R www-data:www-data /var/www/html/myapp&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Enable and start &amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
 sudo systemctl daemon-reload&lt;br /&gt;
 sudo systemctl enable myapp&lt;br /&gt;
 sudo systemctl start myapp&lt;br /&gt;
 sudo systemctl status myapp&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;You should see active (running). If not:&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
 sudo journalctl -u myapp -n 50&lt;br /&gt;
&lt;br /&gt;
== Configure Apache Reverse Proxy==&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Enable required modules (only needed once on the server):&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
 sudo a2enmod proxy proxy_http ssl rewrite headers&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Create the HTTP vhost (which certbot will upgrade later):&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&lt;br /&gt;
 sudo nano /etc/apache2/sites-available/mydomain.conf&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Paste — replace yourdomain.com with your actual domain&amp;#039;&amp;#039;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&amp;lt;VirtualHost *:80&amp;gt;&lt;br /&gt;
    ServerName yourdomain.com&lt;br /&gt;
    ServerAlias www.yourdomain.com&lt;br /&gt;
&lt;br /&gt;
    ProxyPreserveHost On&lt;br /&gt;
    ProxyPass / http://127.0.0.1:3001/&lt;br /&gt;
    ProxyPassReverse / http://127.0.0.1:3001/&lt;br /&gt;
&lt;br /&gt;
    ErrorLog ${APACHE_LOG_DIR}/mydomain-error.log&lt;br /&gt;
    CustomLog ${APACHE_LOG_DIR}/mydomain-access.log combined&lt;br /&gt;
&amp;lt;/VirtualHost&amp;gt;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Enable and reload&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
 sudo a2ensite mydomain.conf&lt;br /&gt;
 sudo apache2ctl configtest&lt;br /&gt;
 sudo systemctl reload apache2&lt;br /&gt;
&lt;br /&gt;
Test in your browser: http://yourdomain.com — you should see the login page.&lt;br /&gt;
&lt;br /&gt;
== Enable HTTPS with Certbot==&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Make sure your domain&amp;#039;s DNS A record points to your server IP first.&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Run certbot:&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
 sudo certbot --apache -d yourdomain.com -d www.yourdomain.com&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Choose 2 (Redirect) when asked, so HTTP automatically redirects to HTTPS.&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Certbot will create /etc/apache2/sites-available/rb222-le-ssl.conf and enable it.&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
 sudo apache2ctl configtest&lt;br /&gt;
 sudo systemctl reload apache2&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Visit https://yourdomain.com — you should see the lock icon and the app.&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;If certbot fails to auto-configure (it sometimes does), create the SSL vhost manually:&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&lt;br /&gt;
 sudo nano /etc/apache2/sites-available/mydomain-le-ssl.conf&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&amp;lt;IfModule mod_ssl.c&amp;gt;&lt;br /&gt;
&amp;lt;VirtualHost *:443&amp;gt;&lt;br /&gt;
    ServerName yourdomain.com&lt;br /&gt;
    ServerAlias www.yourdomain.com&lt;br /&gt;
&lt;br /&gt;
    ProxyPreserveHost On&lt;br /&gt;
    ProxyPass / http://127.0.0.1:3001/&lt;br /&gt;
    ProxyPassReverse / http://127.0.0.1:3001/&lt;br /&gt;
&lt;br /&gt;
    SSLEngine on&lt;br /&gt;
    SSLCertificateFile /etc/letsencrypt/live/yourdomain.com/fullchain.pem&lt;br /&gt;
    SSLCertificateKeyFile /etc/letsencrypt/live/yourdomain.com/privkey.pem&lt;br /&gt;
    Include /etc/letsencrypt/options-ssl-apache.conf&lt;br /&gt;
&lt;br /&gt;
    ErrorLog ${APACHE_LOG_DIR}/rb222-ssl-error.log&lt;br /&gt;
    CustomLog ${APACHE_LOG_DIR}/rb222-ssl-access.log combined&lt;br /&gt;
&amp;lt;/VirtualHost&amp;gt;&lt;br /&gt;
&amp;lt;/IfModule&amp;gt;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;then&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
 sudo a2ensite mydomain-le-ssl.conf&lt;br /&gt;
 sudo systemctl reload apache2&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Cert auto-renewal is already enabled by certbot&amp;#039;s systemd timer — verify with&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
 sudo systemctl list-timers | grep certbot&lt;br /&gt;
&lt;br /&gt;
=Database Optimization=&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
CREATE INDEX idx_songs_title ON songs(Title(100));&lt;br /&gt;
CREATE INDEX idx_songs_artists ON songs(Artists(100));&lt;br /&gt;
CREATE INDEX idx_favorite_name ON Favorite(Name(80), Tag(20));&lt;br /&gt;
CREATE INDEX idx_queue_status ON queue(Status(20));&lt;br /&gt;
CREATE INDEX idx_queue_timestamp ON queue(TimeStamp(20));&lt;br /&gt;
CREATE INDEX idx_archive_name ON Archive_Singers(Name(80));&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;/div&gt;</summary>
		<author><name>Bacchas</name></author>
	</entry>
	<entry>
		<id>https://www.r512.com/index.php?title=PYTHONAPP&amp;diff=2942</id>
		<title>PYTHONAPP</title>
		<link rel="alternate" type="text/html" href="https://www.r512.com/index.php?title=PYTHONAPP&amp;diff=2942"/>
		<updated>2026-04-21T17:37:50Z</updated>

		<summary type="html">&lt;p&gt;Bacchas: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;=Karaoke app Deployment=&lt;br /&gt;
==  Prerequisite Check ==&lt;br /&gt;
# ssh into the server&lt;br /&gt;
# verify what is installed&lt;br /&gt;
 apache2 -v&lt;br /&gt;
 python3 --version&lt;br /&gt;
 mysql --version&lt;br /&gt;
 which certbot&lt;br /&gt;
# if certbot isn&amp;#039;t installed&lt;br /&gt;
 sudo apt update&lt;br /&gt;
 sudo apt install certbot python3-certbot-apache -y&lt;br /&gt;
&lt;br /&gt;
# Install Python venv if needed:&lt;br /&gt;
 sudo apt install python3-venv python3-pip -y&lt;br /&gt;
&lt;br /&gt;
==  Create the App Directory ==&lt;br /&gt;
 sudo mkdir -p /var/www/html/myapp&lt;br /&gt;
 cd /var/www/html/myapp&lt;br /&gt;
&lt;br /&gt;
== Upload App Files ==&lt;br /&gt;
# Upload the .env file (hidden, so it won&amp;#039;t be picked up by scp -r)&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;If you don&amp;#039;t see .env in Finder, press Cmd+Shift+. to toggle hidden files.&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&lt;br /&gt;
== Set up the Python Environment ==&lt;br /&gt;
&lt;br /&gt;
 cd /var/www/html/myapp&lt;br /&gt;
 python3 -m venv venv&lt;br /&gt;
 source venv/bin/activate&lt;br /&gt;
 pip install flask pymysql cryptography gunicorn DBUtils&lt;br /&gt;
 deactivate&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;The cryptography package is required for MySQL caching_sha2_password auth.&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&lt;br /&gt;
== Configure the Database ==&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Open phpMyAdmin in your browser. Make sure the user in your .env file has privileges on the karaoke database. If not, in phpMyAdmin run:&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&lt;br /&gt;
 GRANT ALL PRIVILEGES ON dbasename.* TO &amp;#039;YourUser&amp;#039;@&amp;#039;localhost&amp;#039;;&lt;br /&gt;
 FLUSH PRIVILEGES;&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Verify your .env file on the server has the correct values:&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&lt;br /&gt;
 cat /var/www/html/rb222/.env&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039; It should contain &amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
 DB_HOST=localhost&lt;br /&gt;
 DB_USER=YourUser&lt;br /&gt;
 DB_PASS=YourPassword&lt;br /&gt;
 DB_NAME=dbasename&lt;br /&gt;
 SECRET_KEY=some-random-string&lt;br /&gt;
 HOST_NAME= name for the host side&lt;br /&gt;
 PORT=3001&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Important: Use a different port from any other apps you have running. I&amp;#039;m using 3001 here — pick whatever&amp;#039;s free.&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&lt;br /&gt;
==Test App Manually==&lt;br /&gt;
 cd /var/www/html/myapp&lt;br /&gt;
 source venv/bin/activate&lt;br /&gt;
 python3 app.py&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;You should see &amp;quot;Karaoke app running on http://localhost:3001&amp;quot;. In another SSH window test&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
 sudo nano /etc/systemd/system/rb222.service&lt;br /&gt;
&lt;br /&gt;
== Create the systemd Service ==&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Paste &amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
 [Unit]&lt;br /&gt;
 Description=My App mydir (Gunicorn)&lt;br /&gt;
 After=network.target&lt;br /&gt;
 &lt;br /&gt;
 [Service]&lt;br /&gt;
 User=www-data&lt;br /&gt;
 Group=www-data&lt;br /&gt;
 WorkingDirectory=/var/www/html/myapp&lt;br /&gt;
 Environment=&amp;quot;PATH=/var/www/html/myapp/venv/bin&amp;quot;&lt;br /&gt;
 ExecStart=/var/www/html/myapp/venv/bin/gunicorn --workers 3 --bind 127.0.0.1:3001 app:app&lt;br /&gt;
 Restart=always&lt;br /&gt;
 &lt;br /&gt;
 [Install]&lt;br /&gt;
 WantedBy=multi-user.target&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Save (Ctrl+O, Enter, Ctrl+X).&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Set permissions:&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
 sudo chown -R www-data:www-data /var/www/html/myapp&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Enable and start &amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
 sudo systemctl daemon-reload&lt;br /&gt;
 sudo systemctl enable myapp&lt;br /&gt;
 sudo systemctl start myapp&lt;br /&gt;
 sudo systemctl status myapp&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;You should see active (running). If not:&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
 sudo journalctl -u myapp -n 50&lt;br /&gt;
&lt;br /&gt;
== Configure Apache Reverse Proxy==&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Enable required modules (only needed once on the server):&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
 sudo a2enmod proxy proxy_http ssl rewrite headers&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Create the HTTP vhost (which certbot will upgrade later):&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&lt;br /&gt;
 sudo nano /etc/apache2/sites-available/mydomain.conf&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Paste — replace yourdomain.com with your actual domain&amp;#039;&amp;#039;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&amp;lt;VirtualHost *:80&amp;gt;&lt;br /&gt;
    ServerName yourdomain.com&lt;br /&gt;
    ServerAlias www.yourdomain.com&lt;br /&gt;
&lt;br /&gt;
    ProxyPreserveHost On&lt;br /&gt;
    ProxyPass / http://127.0.0.1:3001/&lt;br /&gt;
    ProxyPassReverse / http://127.0.0.1:3001/&lt;br /&gt;
&lt;br /&gt;
    ErrorLog ${APACHE_LOG_DIR}/mydomain-error.log&lt;br /&gt;
    CustomLog ${APACHE_LOG_DIR}/mydomain-access.log combined&lt;br /&gt;
&amp;lt;/VirtualHost&amp;gt;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Enable and reload&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
 sudo a2ensite mydomain.conf&lt;br /&gt;
 sudo apache2ctl configtest&lt;br /&gt;
 sudo systemctl reload apache2&lt;br /&gt;
&lt;br /&gt;
Test in your browser: http://yourdomain.com — you should see the login page.&lt;br /&gt;
&lt;br /&gt;
== Enable HTTPS with Certbot==&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Make sure your domain&amp;#039;s DNS A record points to your server IP first.&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Run certbot:&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
 sudo certbot --apache -d yourdomain.com -d www.yourdomain.com&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Choose 2 (Redirect) when asked, so HTTP automatically redirects to HTTPS.&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Certbot will create /etc/apache2/sites-available/rb222-le-ssl.conf and enable it.&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
 sudo apache2ctl configtest&lt;br /&gt;
 sudo systemctl reload apache2&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Visit https://yourdomain.com — you should see the lock icon and the app.&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;If certbot fails to auto-configure (it sometimes does), create the SSL vhost manually:&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&lt;br /&gt;
 sudo nano /etc/apache2/sites-available/mydomain-le-ssl.conf&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&amp;lt;IfModule mod_ssl.c&amp;gt;&lt;br /&gt;
&amp;lt;VirtualHost *:443&amp;gt;&lt;br /&gt;
    ServerName yourdomain.com&lt;br /&gt;
    ServerAlias www.yourdomain.com&lt;br /&gt;
&lt;br /&gt;
    ProxyPreserveHost On&lt;br /&gt;
    ProxyPass / http://127.0.0.1:3001/&lt;br /&gt;
    ProxyPassReverse / http://127.0.0.1:3001/&lt;br /&gt;
&lt;br /&gt;
    SSLEngine on&lt;br /&gt;
    SSLCertificateFile /etc/letsencrypt/live/yourdomain.com/fullchain.pem&lt;br /&gt;
    SSLCertificateKeyFile /etc/letsencrypt/live/yourdomain.com/privkey.pem&lt;br /&gt;
    Include /etc/letsencrypt/options-ssl-apache.conf&lt;br /&gt;
&lt;br /&gt;
    ErrorLog ${APACHE_LOG_DIR}/rb222-ssl-error.log&lt;br /&gt;
    CustomLog ${APACHE_LOG_DIR}/rb222-ssl-access.log combined&lt;br /&gt;
&amp;lt;/VirtualHost&amp;gt;&lt;br /&gt;
&amp;lt;/IfModule&amp;gt;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;then&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
 sudo a2ensite mydomain-le-ssl.conf&lt;br /&gt;
 sudo systemctl reload apache2&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Cert auto-renewal is already enabled by certbot&amp;#039;s systemd timer — verify with&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
 sudo systemctl list-timers | grep certbot&lt;/div&gt;</summary>
		<author><name>Bacchas</name></author>
	</entry>
	<entry>
		<id>https://www.r512.com/index.php?title=PYTHONAPP&amp;diff=2941</id>
		<title>PYTHONAPP</title>
		<link rel="alternate" type="text/html" href="https://www.r512.com/index.php?title=PYTHONAPP&amp;diff=2941"/>
		<updated>2026-04-21T17:30:26Z</updated>

		<summary type="html">&lt;p&gt;Bacchas: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;=Karaoke app Deployment=&lt;br /&gt;
==  Prerequisite Check ==&lt;br /&gt;
# ssh into the server&lt;br /&gt;
# verify what is installed&lt;br /&gt;
 apache2 -v&lt;br /&gt;
 python3 --version&lt;br /&gt;
 mysql --version&lt;br /&gt;
 which certbot&lt;br /&gt;
# if certbot isn&amp;#039;t installed&lt;br /&gt;
 sudo apt update&lt;br /&gt;
 sudo apt install certbot python3-certbot-apache -y&lt;br /&gt;
&lt;br /&gt;
# Install Python venv if needed:&lt;br /&gt;
 sudo apt install python3-venv python3-pip -y&lt;br /&gt;
&lt;br /&gt;
==  Create the App Directory ==&lt;br /&gt;
 sudo mkdir -p /var/www/html/myapp&lt;br /&gt;
 cd /var/www/html/myapp&lt;br /&gt;
&lt;br /&gt;
== Upload App Files ==&lt;br /&gt;
# Upload the .env file (hidden, so it won&amp;#039;t be picked up by scp -r)&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;If you don&amp;#039;t see .env in Finder, press Cmd+Shift+. to toggle hidden files.&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&lt;br /&gt;
== Set up the Python Environment ==&lt;br /&gt;
&lt;br /&gt;
 cd /var/www/html/myapp&lt;br /&gt;
 python3 -m venv venv&lt;br /&gt;
 source venv/bin/activate&lt;br /&gt;
 pip install flask pymysql cryptography gunicorn DBUtils&lt;br /&gt;
 deactivate&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;The cryptography package is required for MySQL caching_sha2_password auth.&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&lt;br /&gt;
== Configure the Database ==&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Open phpMyAdmin in your browser. Make sure the user in your .env file has privileges on the karaoke database. If not, in phpMyAdmin run:&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&lt;br /&gt;
 GRANT ALL PRIVILEGES ON dbasename.* TO &amp;#039;YourUser&amp;#039;@&amp;#039;localhost&amp;#039;;&lt;br /&gt;
 FLUSH PRIVILEGES;&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Verify your .env file on the server has the correct values:&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&lt;br /&gt;
 cat /var/www/html/rb222/.env&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039; It should contain &amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
 DB_HOST=localhost&lt;br /&gt;
 DB_USER=YourUser&lt;br /&gt;
 DB_PASS=YourPassword&lt;br /&gt;
 DB_NAME=dbasename&lt;br /&gt;
 SECRET_KEY=some-random-string&lt;br /&gt;
 HOST_NAME= name for the host side&lt;br /&gt;
 PORT=3001&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Important: Use a different port from any other apps you have running. I&amp;#039;m using 3001 here — pick whatever&amp;#039;s free.&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&lt;br /&gt;
==Test App Manually==&lt;br /&gt;
 cd /var/www/html/myapp&lt;br /&gt;
 source venv/bin/activate&lt;br /&gt;
 python3 app.py&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;You should see &amp;quot;Karaoke app running on http://localhost:3001&amp;quot;. In another SSH window test&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
 sudo nano /etc/systemd/system/rb222.service&lt;br /&gt;
&lt;br /&gt;
== Create the systemd Service ==&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Paste &amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
 [Unit]&lt;br /&gt;
 Description=My App mydir (Gunicorn)&lt;br /&gt;
 After=network.target&lt;br /&gt;
 &lt;br /&gt;
 [Service]&lt;br /&gt;
 User=www-data&lt;br /&gt;
 Group=www-data&lt;br /&gt;
 WorkingDirectory=/var/www/html/myapp&lt;br /&gt;
 Environment=&amp;quot;PATH=/var/www/html/myapp/venv/bin&amp;quot;&lt;br /&gt;
 ExecStart=/var/www/html/myapp/venv/bin/gunicorn --workers 3 --bind 127.0.0.1:3001 app:app&lt;br /&gt;
 Restart=always&lt;br /&gt;
 &lt;br /&gt;
 [Install]&lt;br /&gt;
 WantedBy=multi-user.target&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Save (Ctrl+O, Enter, Ctrl+X).&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Set permissions:&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
 sudo chown -R www-data:www-data /var/www/html/myapp&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Enable and start &amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
 sudo systemctl daemon-reload&lt;br /&gt;
 sudo systemctl enable myapp&lt;br /&gt;
 sudo systemctl start myapp&lt;br /&gt;
 sudo systemctl status myapp&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;You should see active (running). If not:&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
 sudo journalctl -u myapp -n 50&lt;br /&gt;
&lt;br /&gt;
== Configure Apache Reverse Proxy==&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Enable required modules (only needed once on the server):&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
 sudo a2enmod proxy proxy_http ssl rewrite headers&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Create the HTTP vhost (which certbot will upgrade later):&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&lt;br /&gt;
 sudo nano /etc/apache2/sites-available/mydomain.conf&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Paste — replace yourdomain.com with your actual domain&amp;#039;&amp;#039;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&amp;lt;VirtualHost *:80&amp;gt;&lt;br /&gt;
    ServerName yourdomain.com&lt;br /&gt;
    ServerAlias www.yourdomain.com&lt;br /&gt;
&lt;br /&gt;
    ProxyPreserveHost On&lt;br /&gt;
    ProxyPass / http://127.0.0.1:3001/&lt;br /&gt;
    ProxyPassReverse / http://127.0.0.1:3001/&lt;br /&gt;
&lt;br /&gt;
    ErrorLog ${APACHE_LOG_DIR}/mydomain-error.log&lt;br /&gt;
    CustomLog ${APACHE_LOG_DIR}/mydomain-access.log combined&lt;br /&gt;
&amp;lt;/VirtualHost&amp;gt;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Enable and reload&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
 sudo a2ensite mydomain.conf&lt;br /&gt;
 sudo apache2ctl configtest&lt;br /&gt;
 sudo systemctl reload apache2&lt;/div&gt;</summary>
		<author><name>Bacchas</name></author>
	</entry>
	<entry>
		<id>https://www.r512.com/index.php?title=PYTHONAPP&amp;diff=2940</id>
		<title>PYTHONAPP</title>
		<link rel="alternate" type="text/html" href="https://www.r512.com/index.php?title=PYTHONAPP&amp;diff=2940"/>
		<updated>2026-04-21T17:22:02Z</updated>

		<summary type="html">&lt;p&gt;Bacchas: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;=Karaoke app Deployment=&lt;br /&gt;
==  Prerequisite Check ==&lt;br /&gt;
# ssh into the server&lt;br /&gt;
# verify what is installed&lt;br /&gt;
 apache2 -v&lt;br /&gt;
 python3 --version&lt;br /&gt;
 mysql --version&lt;br /&gt;
 which certbot&lt;br /&gt;
# if certbot isn&amp;#039;t installed&lt;br /&gt;
 sudo apt update&lt;br /&gt;
 sudo apt install certbot python3-certbot-apache -y&lt;br /&gt;
&lt;br /&gt;
# Install Python venv if needed:&lt;br /&gt;
 sudo apt install python3-venv python3-pip -y&lt;br /&gt;
&lt;br /&gt;
==  Create the App Directory ==&lt;br /&gt;
 sudo mkdir -p /var/www/html/myapp&lt;br /&gt;
 cd /var/www/html/myapp&lt;br /&gt;
&lt;br /&gt;
== Upload App Files ==&lt;br /&gt;
# Upload the .env file (hidden, so it won&amp;#039;t be picked up by scp -r)&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;If you don&amp;#039;t see .env in Finder, press Cmd+Shift+. to toggle hidden files.&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&lt;br /&gt;
== Set up the Python Environment ==&lt;br /&gt;
&lt;br /&gt;
 cd /var/www/html/myapp&lt;br /&gt;
 python3 -m venv venv&lt;br /&gt;
 source venv/bin/activate&lt;br /&gt;
 pip install flask pymysql cryptography gunicorn DBUtils&lt;br /&gt;
 deactivate&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;The cryptography package is required for MySQL caching_sha2_password auth.&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&lt;br /&gt;
== Configure the Database ==&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Open phpMyAdmin in your browser. Make sure the user in your .env file has privileges on the karaoke database. If not, in phpMyAdmin run:&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&lt;br /&gt;
 GRANT ALL PRIVILEGES ON dbasename.* TO &amp;#039;YourUser&amp;#039;@&amp;#039;localhost&amp;#039;;&lt;br /&gt;
 FLUSH PRIVILEGES;&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Verify your .env file on the server has the correct values:&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&lt;br /&gt;
 cat /var/www/html/rb222/.env&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039; It should contain &amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
 DB_HOST=localhost&lt;br /&gt;
 DB_USER=YourUser&lt;br /&gt;
 DB_PASS=YourPassword&lt;br /&gt;
 DB_NAME=dbasename&lt;br /&gt;
 SECRET_KEY=some-random-string&lt;br /&gt;
 HOST_NAME= name for the host side&lt;br /&gt;
 PORT=3001&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Important: Use a different port from any other apps you have running. I&amp;#039;m using 3001 here — pick whatever&amp;#039;s free.&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&lt;br /&gt;
==Test App Manually==&lt;br /&gt;
 cd /var/www/html/myapp&lt;br /&gt;
 source venv/bin/activate&lt;br /&gt;
 python3 app.py&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;You should see &amp;quot;Karaoke app running on http://localhost:3001&amp;quot;. In another SSH window test&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
 sudo nano /etc/systemd/system/rb222.service&lt;br /&gt;
&lt;br /&gt;
== Create the systemd Service ==&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Paste &amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
 [Unit]&lt;br /&gt;
 Description=My App mydir (Gunicorn)&lt;br /&gt;
 After=network.target&lt;br /&gt;
 &lt;br /&gt;
 [Service]&lt;br /&gt;
 User=www-data&lt;br /&gt;
 Group=www-data&lt;br /&gt;
 WorkingDirectory=/var/www/html/myapp&lt;br /&gt;
 Environment=&amp;quot;PATH=/var/www/html/myapp/venv/bin&amp;quot;&lt;br /&gt;
 ExecStart=/var/www/html/myapp/venv/bin/gunicorn --workers 3 --bind 127.0.0.1:3001 app:app&lt;br /&gt;
 Restart=always&lt;br /&gt;
 &lt;br /&gt;
 [Install]&lt;br /&gt;
 WantedBy=multi-user.target&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Save (Ctrl+O, Enter, Ctrl+X).&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Set permissions:&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
 sudo chown -R www-data:www-data /var/www/html/myapp&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Enable and start &amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
 sudo systemctl daemon-reload&lt;br /&gt;
 sudo systemctl enable myapp&lt;br /&gt;
 sudo systemctl start myapp&lt;br /&gt;
 sudo systemctl status myapp&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;You should see active (running). If not:&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
 sudo journalctl -u rb222 -n 50&lt;/div&gt;</summary>
		<author><name>Bacchas</name></author>
	</entry>
	<entry>
		<id>https://www.r512.com/index.php?title=PYTHONAPP&amp;diff=2939</id>
		<title>PYTHONAPP</title>
		<link rel="alternate" type="text/html" href="https://www.r512.com/index.php?title=PYTHONAPP&amp;diff=2939"/>
		<updated>2026-04-21T17:19:38Z</updated>

		<summary type="html">&lt;p&gt;Bacchas: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;=Karaoke app Deployment=&lt;br /&gt;
==  Prerequisite Check ==&lt;br /&gt;
# ssh into the server&lt;br /&gt;
# verify what is installed&lt;br /&gt;
 apache2 -v&lt;br /&gt;
 python3 --version&lt;br /&gt;
 mysql --version&lt;br /&gt;
 which certbot&lt;br /&gt;
# if certbot isn&amp;#039;t installed&lt;br /&gt;
 sudo apt update&lt;br /&gt;
 sudo apt install certbot python3-certbot-apache -y&lt;br /&gt;
&lt;br /&gt;
# Install Python venv if needed:&lt;br /&gt;
 sudo apt install python3-venv python3-pip -y&lt;br /&gt;
&lt;br /&gt;
==  Create the App Directory ==&lt;br /&gt;
 sudo mkdir -p /var/www/html/myapp&lt;br /&gt;
 cd /var/www/html/myapp&lt;br /&gt;
&lt;br /&gt;
== Upload App Files ==&lt;br /&gt;
# Upload the .env file (hidden, so it won&amp;#039;t be picked up by scp -r)&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;If you don&amp;#039;t see .env in Finder, press Cmd+Shift+. to toggle hidden files.&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&lt;br /&gt;
== Set up the Python Environment ==&lt;br /&gt;
&lt;br /&gt;
 cd /var/www/html/myapp&lt;br /&gt;
 python3 -m venv venv&lt;br /&gt;
 source venv/bin/activate&lt;br /&gt;
 pip install flask pymysql cryptography gunicorn DBUtils&lt;br /&gt;
 deactivate&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;The cryptography package is required for MySQL caching_sha2_password auth.&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&lt;br /&gt;
== Configure the Database ==&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Open phpMyAdmin in your browser. Make sure the user in your .env file has privileges on the karaoke database. If not, in phpMyAdmin run:&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&lt;br /&gt;
 GRANT ALL PRIVILEGES ON dbasename.* TO &amp;#039;YourUser&amp;#039;@&amp;#039;localhost&amp;#039;;&lt;br /&gt;
 FLUSH PRIVILEGES;&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Verify your .env file on the server has the correct values:&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&lt;br /&gt;
 cat /var/www/html/rb222/.env&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039; It should contain &amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
 DB_HOST=localhost&lt;br /&gt;
 DB_USER=YourUser&lt;br /&gt;
 DB_PASS=YourPassword&lt;br /&gt;
 DB_NAME=dbasename&lt;br /&gt;
 SECRET_KEY=some-random-string&lt;br /&gt;
 HOST_NAME= name for the host side&lt;br /&gt;
 PORT=3001&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Important: Use a different port from any other apps you have running. I&amp;#039;m using 3001 here — pick whatever&amp;#039;s free.&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&lt;br /&gt;
==Test App Manually==&lt;br /&gt;
 cd /var/www/html/myapp&lt;br /&gt;
 source venv/bin/activate&lt;br /&gt;
 python3 app.py&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;You should see &amp;quot;Karaoke app running on http://localhost:3001&amp;quot;. In another SSH window test&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
 sudo nano /etc/systemd/system/rb222.service&lt;br /&gt;
&lt;br /&gt;
== Create the systemd Service ==&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Paste &amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
 [Unit]&lt;br /&gt;
 Description=My App mydir (Gunicorn)&lt;br /&gt;
 After=network.target&lt;br /&gt;
 &lt;br /&gt;
 [Service]&lt;br /&gt;
 User=www-data&lt;br /&gt;
 Group=www-data&lt;br /&gt;
 WorkingDirectory=/var/www/html/myapp&lt;br /&gt;
 Environment=&amp;quot;PATH=/var/www/html/myapp/venv/bin&amp;quot;&lt;br /&gt;
 ExecStart=/var/www/html/myapp/venv/bin/gunicorn --workers 3 --bind 127.0.0.1:3001 app:app&lt;br /&gt;
 Restart=always&lt;br /&gt;
 &lt;br /&gt;
 [Install]&lt;br /&gt;
 WantedBy=multi-user.target&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Save (Ctrl+O, Enter, Ctrl+X).&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Set permissions:&amp;#039;&amp;#039;&amp;#039;&lt;/div&gt;</summary>
		<author><name>Bacchas</name></author>
	</entry>
	<entry>
		<id>https://www.r512.com/index.php?title=PYTHONAPP&amp;diff=2938</id>
		<title>PYTHONAPP</title>
		<link rel="alternate" type="text/html" href="https://www.r512.com/index.php?title=PYTHONAPP&amp;diff=2938"/>
		<updated>2026-04-21T17:15:49Z</updated>

		<summary type="html">&lt;p&gt;Bacchas: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;=Karaoke app Deployment=&lt;br /&gt;
==  Prerequisite Check ==&lt;br /&gt;
# ssh into the server&lt;br /&gt;
# verify what is installed&lt;br /&gt;
 apache2 -v&lt;br /&gt;
 python3 --version&lt;br /&gt;
 mysql --version&lt;br /&gt;
 which certbot&lt;br /&gt;
# if certbot isn&amp;#039;t installed&lt;br /&gt;
 sudo apt update&lt;br /&gt;
 sudo apt install certbot python3-certbot-apache -y&lt;br /&gt;
&lt;br /&gt;
# Install Python venv if needed:&lt;br /&gt;
 sudo apt install python3-venv python3-pip -y&lt;br /&gt;
&lt;br /&gt;
==  Create the App Directory ==&lt;br /&gt;
 sudo mkdir -p /var/www/html/myapp&lt;br /&gt;
 cd /var/www/html/myapp&lt;br /&gt;
&lt;br /&gt;
== Upload App Files ==&lt;br /&gt;
# Upload the .env file (hidden, so it won&amp;#039;t be picked up by scp -r)&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;If you don&amp;#039;t see .env in Finder, press Cmd+Shift+. to toggle hidden files.&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&lt;br /&gt;
== Set up the Python Environment ==&lt;br /&gt;
&lt;br /&gt;
 cd /var/www/html/myapp&lt;br /&gt;
 python3 -m venv venv&lt;br /&gt;
 source venv/bin/activate&lt;br /&gt;
 pip install flask pymysql cryptography gunicorn DBUtils&lt;br /&gt;
 deactivate&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;The cryptography package is required for MySQL caching_sha2_password auth.&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&lt;br /&gt;
== Configure the Database ==&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Open phpMyAdmin in your browser. Make sure the user in your .env file has privileges on the karaoke database. If not, in phpMyAdmin run:&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&lt;br /&gt;
 GRANT ALL PRIVILEGES ON dbasename.* TO &amp;#039;YourUser&amp;#039;@&amp;#039;localhost&amp;#039;;&lt;br /&gt;
 FLUSH PRIVILEGES;&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Verify your .env file on the server has the correct values:&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&lt;br /&gt;
 cat /var/www/html/rb222/.env&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039; It should contain &amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
 DB_HOST=localhost&lt;br /&gt;
 DB_USER=YourUser&lt;br /&gt;
 DB_PASS=YourPassword&lt;br /&gt;
 DB_NAME=dbasename&lt;br /&gt;
 SECRET_KEY=some-random-string&lt;br /&gt;
 HOST_NAME= name for the host side&lt;br /&gt;
 PORT=3001&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Important: Use a different port from any other apps you have running. I&amp;#039;m using 3001 here — pick whatever&amp;#039;s free.&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&lt;br /&gt;
==Test App Manually==&lt;br /&gt;
 cd /var/www/html/myapp&lt;br /&gt;
 source venv/bin/activate&lt;br /&gt;
 python3 app.py&lt;/div&gt;</summary>
		<author><name>Bacchas</name></author>
	</entry>
	<entry>
		<id>https://www.r512.com/index.php?title=PYTHONAPP&amp;diff=2937</id>
		<title>PYTHONAPP</title>
		<link rel="alternate" type="text/html" href="https://www.r512.com/index.php?title=PYTHONAPP&amp;diff=2937"/>
		<updated>2026-04-21T17:08:24Z</updated>

		<summary type="html">&lt;p&gt;Bacchas: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;=Karaoke app Deployment=&lt;br /&gt;
==  Prerequisite Check ==&lt;br /&gt;
# ssh into the server&lt;br /&gt;
# verify what is installed&lt;br /&gt;
 apache2 -v&lt;br /&gt;
 python3 --version&lt;br /&gt;
 mysql --version&lt;br /&gt;
 which certbot&lt;br /&gt;
# if certbot isn&amp;#039;t installed&lt;br /&gt;
 sudo apt update&lt;br /&gt;
 sudo apt install certbot python3-certbot-apache -y&lt;br /&gt;
&lt;br /&gt;
# Install Python venv if needed:&lt;br /&gt;
 sudo apt install python3-venv python3-pip -y&lt;br /&gt;
&lt;br /&gt;
==  Create the App Directory ==&lt;br /&gt;
 sudo mkdir -p /var/www/html/myapp&lt;br /&gt;
 cd /var/www/html/myapp&lt;br /&gt;
&lt;br /&gt;
== Upload App Files ==&lt;br /&gt;
# Upload the .env file (hidden, so it won&amp;#039;t be picked up by scp -r)&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;If you don&amp;#039;t see .env in Finder, press Cmd+Shift+. to toggle hidden files.&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&lt;br /&gt;
pip install flask pymysql cryptography gunicorn DBUtils&lt;/div&gt;</summary>
		<author><name>Bacchas</name></author>
	</entry>
	<entry>
		<id>https://www.r512.com/index.php?title=PYTHONAPP&amp;diff=2936</id>
		<title>PYTHONAPP</title>
		<link rel="alternate" type="text/html" href="https://www.r512.com/index.php?title=PYTHONAPP&amp;diff=2936"/>
		<updated>2026-04-21T17:06:41Z</updated>

		<summary type="html">&lt;p&gt;Bacchas: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;=Karaoke app Deployment=&lt;br /&gt;
==  Prerequisite Check ==&lt;br /&gt;
# ssh into the server&lt;br /&gt;
# verify what is installed&lt;br /&gt;
 apache2 -v&lt;br /&gt;
 python3 --version&lt;br /&gt;
 mysql --version&lt;br /&gt;
 which certbot&lt;br /&gt;
# if certbot isn&amp;#039;t installed&lt;br /&gt;
 sudo apt update&lt;br /&gt;
 sudo apt install certbot python3-certbot-apache -y&lt;br /&gt;
&lt;br /&gt;
# Install Python venv if needed:&lt;br /&gt;
 sudo apt install python3-venv python3-pip -y&lt;br /&gt;
&lt;br /&gt;
==  Create the App Directory ==&lt;br /&gt;
 sudo mkdir -p /var/www/html/myapp&lt;br /&gt;
 cd /var/www/html/myapp&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
pip install flask pymysql cryptography gunicorn DBUtils&lt;/div&gt;</summary>
		<author><name>Bacchas</name></author>
	</entry>
	<entry>
		<id>https://www.r512.com/index.php?title=PYTHONAPP&amp;diff=2935</id>
		<title>PYTHONAPP</title>
		<link rel="alternate" type="text/html" href="https://www.r512.com/index.php?title=PYTHONAPP&amp;diff=2935"/>
		<updated>2026-04-21T17:06:15Z</updated>

		<summary type="html">&lt;p&gt;Bacchas: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;=Karaoke app Deployment=&lt;br /&gt;
== 1 Prerequisite Check ==&lt;br /&gt;
# ssh into the server&lt;br /&gt;
# verify what is installed&lt;br /&gt;
 apache2 -v&lt;br /&gt;
 python3 --version&lt;br /&gt;
 mysql --version&lt;br /&gt;
 which certbot&lt;br /&gt;
# if certbot isn&amp;#039;t installed&lt;br /&gt;
 sudo apt update&lt;br /&gt;
 sudo apt install certbot python3-certbot-apache -y&lt;br /&gt;
&lt;br /&gt;
# Install Python venv if needed:&lt;br /&gt;
 sudo apt install python3-venv python3-pip -y&lt;br /&gt;
&lt;br /&gt;
== 2 Create the App Directory ==&lt;br /&gt;
 sudo mkdir -p /var/www/html/myapp&lt;br /&gt;
 cd /var/www/html/myapp&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
pip install flask pymysql cryptography gunicorn DBUtils&lt;/div&gt;</summary>
		<author><name>Bacchas</name></author>
	</entry>
	<entry>
		<id>https://www.r512.com/index.php?title=PYTHONAPP&amp;diff=2934</id>
		<title>PYTHONAPP</title>
		<link rel="alternate" type="text/html" href="https://www.r512.com/index.php?title=PYTHONAPP&amp;diff=2934"/>
		<updated>2026-04-21T17:02:55Z</updated>

		<summary type="html">&lt;p&gt;Bacchas: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;=Karaoke app Deployment=&lt;br /&gt;
== 1 Prerequisite Check ==&lt;br /&gt;
# ssh into the server&lt;br /&gt;
# verify what is installed&lt;br /&gt;
 apache2 -v&lt;br /&gt;
 python3 --version&lt;br /&gt;
 mysql --version&lt;br /&gt;
 which certbot&lt;br /&gt;
# if certbot isn&amp;#039;t installed&lt;br /&gt;
 sudo apt update&lt;br /&gt;
 sudo apt install certbot python3-certbot-apache -y&lt;br /&gt;
&lt;br /&gt;
pip install flask pymysql cryptography gunicorn DBUtils&lt;/div&gt;</summary>
		<author><name>Bacchas</name></author>
	</entry>
	<entry>
		<id>https://www.r512.com/index.php?title=PYTHONAPP&amp;diff=2933</id>
		<title>PYTHONAPP</title>
		<link rel="alternate" type="text/html" href="https://www.r512.com/index.php?title=PYTHONAPP&amp;diff=2933"/>
		<updated>2026-04-21T17:02:42Z</updated>

		<summary type="html">&lt;p&gt;Bacchas: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;==Karaoke app Deployment==&lt;br /&gt;
== 1 Prerequisite Check ==&lt;br /&gt;
# ssh into the server&lt;br /&gt;
# verify what is installed&lt;br /&gt;
 apache2 -v&lt;br /&gt;
 python3 --version&lt;br /&gt;
 mysql --version&lt;br /&gt;
 which certbot&lt;br /&gt;
# if certbot isn&amp;#039;t installed&lt;br /&gt;
 sudo apt update&lt;br /&gt;
 sudo apt install certbot python3-certbot-apache -y&lt;br /&gt;
&lt;br /&gt;
pip install flask pymysql cryptography gunicorn DBUtils&lt;/div&gt;</summary>
		<author><name>Bacchas</name></author>
	</entry>
	<entry>
		<id>https://www.r512.com/index.php?title=PYTHONAPP&amp;diff=2932</id>
		<title>PYTHONAPP</title>
		<link rel="alternate" type="text/html" href="https://www.r512.com/index.php?title=PYTHONAPP&amp;diff=2932"/>
		<updated>2026-04-21T17:01:15Z</updated>

		<summary type="html">&lt;p&gt;Bacchas: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;==Karaoke app Deployment==&lt;br /&gt;
&lt;br /&gt;
# ssh into the server&lt;br /&gt;
# verify what is installed&lt;br /&gt;
 apache2 -v&lt;br /&gt;
 python3 --version&lt;br /&gt;
 mysql --version&lt;br /&gt;
 which certbot&lt;br /&gt;
&lt;br /&gt;
pip install flask pymysql cryptography gunicorn DBUtils&lt;/div&gt;</summary>
		<author><name>Bacchas</name></author>
	</entry>
	<entry>
		<id>https://www.r512.com/index.php?title=PYTHONAPP&amp;diff=2931</id>
		<title>PYTHONAPP</title>
		<link rel="alternate" type="text/html" href="https://www.r512.com/index.php?title=PYTHONAPP&amp;diff=2931"/>
		<updated>2026-04-21T17:00:58Z</updated>

		<summary type="html">&lt;p&gt;Bacchas: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;==Karaoke app Deployment==&lt;br /&gt;
&lt;br /&gt;
* ssh into the server&lt;br /&gt;
* verify what is installed&lt;br /&gt;
 apache2 -v&lt;br /&gt;
 python3 --version&lt;br /&gt;
 mysql --version&lt;br /&gt;
 which certbot&lt;br /&gt;
&lt;br /&gt;
pip install flask pymysql cryptography gunicorn DBUtils&lt;/div&gt;</summary>
		<author><name>Bacchas</name></author>
	</entry>
	<entry>
		<id>https://www.r512.com/index.php?title=PYTHONAPP&amp;diff=2930</id>
		<title>PYTHONAPP</title>
		<link rel="alternate" type="text/html" href="https://www.r512.com/index.php?title=PYTHONAPP&amp;diff=2930"/>
		<updated>2026-04-21T17:00:45Z</updated>

		<summary type="html">&lt;p&gt;Bacchas: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;==Karaoke app Deployment==&lt;br /&gt;
&lt;br /&gt;
1. ssh into the server&lt;br /&gt;
2. verify what is installed&lt;br /&gt;
 apache2 -v&lt;br /&gt;
 python3 --version&lt;br /&gt;
 mysql --version&lt;br /&gt;
 which certbot&lt;br /&gt;
&lt;br /&gt;
pip install flask pymysql cryptography gunicorn DBUtils&lt;/div&gt;</summary>
		<author><name>Bacchas</name></author>
	</entry>
	<entry>
		<id>https://www.r512.com/index.php?title=PYTHONAPP&amp;diff=2929</id>
		<title>PYTHONAPP</title>
		<link rel="alternate" type="text/html" href="https://www.r512.com/index.php?title=PYTHONAPP&amp;diff=2929"/>
		<updated>2026-04-21T17:00:36Z</updated>

		<summary type="html">&lt;p&gt;Bacchas: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;==Karaoke app Deployment==&lt;br /&gt;
&lt;br /&gt;
1. ssh into the server&amp;#039;&lt;br /&gt;
2. verify what is installed&lt;br /&gt;
 apache2 -v&lt;br /&gt;
 python3 --version&lt;br /&gt;
 mysql --version&lt;br /&gt;
 which certbot&lt;br /&gt;
&lt;br /&gt;
pip install flask pymysql cryptography gunicorn DBUtils&lt;/div&gt;</summary>
		<author><name>Bacchas</name></author>
	</entry>
	<entry>
		<id>https://www.r512.com/index.php?title=PYTHONAPP&amp;diff=2928</id>
		<title>PYTHONAPP</title>
		<link rel="alternate" type="text/html" href="https://www.r512.com/index.php?title=PYTHONAPP&amp;diff=2928"/>
		<updated>2026-04-21T17:00:14Z</updated>

		<summary type="html">&lt;p&gt;Bacchas: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;==Karaoke app Deployment==&lt;br /&gt;
&lt;br /&gt;
&amp;#039;ssh into the server&amp;#039;&lt;br /&gt;
1. verify what is installed&lt;br /&gt;
 apache2 -v&lt;br /&gt;
 python3 --version&lt;br /&gt;
 mysql --version&lt;br /&gt;
 which certbot&lt;br /&gt;
&lt;br /&gt;
pip install flask pymysql cryptography gunicorn DBUtils&lt;/div&gt;</summary>
		<author><name>Bacchas</name></author>
	</entry>
	<entry>
		<id>https://www.r512.com/index.php?title=PYTHONAPP&amp;diff=2927</id>
		<title>PYTHONAPP</title>
		<link rel="alternate" type="text/html" href="https://www.r512.com/index.php?title=PYTHONAPP&amp;diff=2927"/>
		<updated>2026-04-21T16:58:41Z</updated>

		<summary type="html">&lt;p&gt;Bacchas: Created page with &amp;quot; pip install flask pymysql cryptography gunicorn DBUtils&amp;quot;&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;br /&gt;
pip install flask pymysql cryptography gunicorn DBUtils&lt;/div&gt;</summary>
		<author><name>Bacchas</name></author>
	</entry>
	<entry>
		<id>https://www.r512.com/index.php?title=Main_Page&amp;diff=2926</id>
		<title>Main Page</title>
		<link rel="alternate" type="text/html" href="https://www.r512.com/index.php?title=Main_Page&amp;diff=2926"/>
		<updated>2026-04-21T16:37:52Z</updated>

		<summary type="html">&lt;p&gt;Bacchas: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;==[[APPSHEET]]==&lt;br /&gt;
==[[PYTHONAPP]]==&lt;br /&gt;
== [[AWS|Amazon Cloud Service]] ==&lt;br /&gt;
== [[Bash]] ==&lt;br /&gt;
== [[Bluhost]] ==&lt;br /&gt;
==[[Centos OS]] ==&lt;br /&gt;
&lt;br /&gt;
== [[Docker]]==&lt;br /&gt;
== [[Github]]==&lt;br /&gt;
==[[Google Sheets]]==&lt;br /&gt;
== [[Hacking|Hacking And Security ]] ==&lt;br /&gt;
==[[Hardware]]==&lt;br /&gt;
==[[IOS Apps]]==&lt;br /&gt;
==[[JavaScript]]==&lt;br /&gt;
==[[Linode]]==&lt;br /&gt;
==[[Login and reset Forget Password]]==&lt;br /&gt;
== [[Math]] ==&lt;br /&gt;
== [[Mac]] ==&lt;br /&gt;
== [[Mysql]] ==&lt;br /&gt;
== [[Networking]] ==&lt;br /&gt;
== [[Open Source Software]] ==&lt;br /&gt;
== [[Oracle SQL]] ==&lt;br /&gt;
== [[Programming]] ==&lt;br /&gt;
== [[Problem Solution]] ==&lt;br /&gt;
== [[Software Tips]] ==&lt;br /&gt;
==[[Tailscale]]==&lt;br /&gt;
== [[Utilities]] ==&lt;br /&gt;
== [[Ubuntu Tips]] ==&lt;br /&gt;
&lt;br /&gt;
== [[Web Links]] ==&lt;br /&gt;
== [[Windows]] ==&lt;br /&gt;
==[[Virtualization]]==&lt;/div&gt;</summary>
		<author><name>Bacchas</name></author>
	</entry>
	<entry>
		<id>https://www.r512.com/index.php?title=Python_Environment_Setup&amp;diff=2925</id>
		<title>Python Environment Setup</title>
		<link rel="alternate" type="text/html" href="https://www.r512.com/index.php?title=Python_Environment_Setup&amp;diff=2925"/>
		<updated>2026-01-05T16:52:10Z</updated>

		<summary type="html">&lt;p&gt;Bacchas: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;==Create the Environment with a Unique Name==&lt;br /&gt;
*Instead of the generic .venv, give your Windows environment a name that clearly identifies it. In your project&amp;#039;s root terminal, run:&lt;br /&gt;
 python -m venv .venv_pc &lt;br /&gt;
*This creates a new folder named &amp;lt;code&amp;gt;.venv_pc &amp;lt;/code&amp;gt;in your project. Your existing Mac folder &amp;lt;code&amp;gt;(e.g., .venv or .venv_mac) &amp;lt;/code&amp;gt;will remain completely untouched.&lt;br /&gt;
==Set VS Code to Use the New PC Environment==&lt;br /&gt;
* You must tell VS Code on your PC to use this specific folder instead of the one from your Mac:&lt;br /&gt;
**Press&amp;lt;code&amp;gt; Ctrl + Shift + P&amp;lt;/code&amp;gt; to open the Command Palette.&lt;br /&gt;
*Type and select Python: Select Interpreter.&lt;br /&gt;
*Choose the one that points to your new folder: &amp;lt;code&amp;gt;(&amp;#039;.venv_pc&amp;#039;: venv).&amp;lt;/code&amp;gt;&lt;br /&gt;
*If it doesn&amp;#039;t appear, select Enter interpreter path... and browse to .venv_pc\Scripts\python.exe.&lt;br /&gt;
= Sync Libraries via requirements.txt =&lt;br /&gt;
*Since you have a new, empty environment, you need to install your project&amp;#039;s dependencies:&lt;br /&gt;
* On your Mac (before switching): &amp;lt;code&amp;gt;Run pip freeze &amp;gt; requirements.txt&amp;lt;/code&amp;gt; to save a list of your current libraries.&lt;br /&gt;
* On your PC: Activate the new environment with &amp;lt;code&amp;gt;.venv_pc\Scripts\activate &amp;lt;/code&amp;gt; and then run&lt;br /&gt;
 pip install -r requirements.txt.&lt;br /&gt;
= Prevent Future Sync Issues =&lt;br /&gt;
*To ensure your Mac environment doesn&amp;#039;t accidentally get messed up by your PC (or vice versa), add both environment names to your project&amp;#039;s &amp;lt;code&amp;gt;.gitignore&amp;lt;/code&amp;gt; file:&lt;br /&gt;
 &amp;lt;pre&amp;gt;&lt;br /&gt;
.venv/&lt;br /&gt;
.venv_pc/&lt;br /&gt;
.venv_mac/&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;/div&gt;</summary>
		<author><name>Bacchas</name></author>
	</entry>
	<entry>
		<id>https://www.r512.com/index.php?title=Python_Environment_Setup&amp;diff=2924</id>
		<title>Python Environment Setup</title>
		<link rel="alternate" type="text/html" href="https://www.r512.com/index.php?title=Python_Environment_Setup&amp;diff=2924"/>
		<updated>2026-01-05T16:50:34Z</updated>

		<summary type="html">&lt;p&gt;Bacchas: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;==Create the Environment with a Unique Name==&lt;br /&gt;
*Instead of the generic .venv, give your Windows environment a name that clearly identifies it. In your project&amp;#039;s root terminal, run:&lt;br /&gt;
 python -m venv .venv_pc &lt;br /&gt;
*This creates a new folder named &amp;lt;code&amp;gt;.venv_pc &amp;lt;/code&amp;gt;in your project. Your existing Mac folder &amp;lt;code&amp;gt;(e.g., .venv or .venv_mac) &amp;lt;/code&amp;gt;will remain completely untouched.&lt;br /&gt;
==Set VS Code to Use the New PC Environment==&lt;br /&gt;
* You must tell VS Code on your PC to use this specific folder instead of the one from your Mac:&lt;br /&gt;
**Press&amp;lt;code&amp;gt; Ctrl + Shift + P&amp;lt;/code&amp;gt; to open the Command Palette.&lt;br /&gt;
*Type and select Python: Select Interpreter.&lt;br /&gt;
*Choose the one that points to your new folder: &amp;lt;code&amp;gt;(&amp;#039;.venv_pc&amp;#039;: venv).&amp;lt;/code&amp;gt;&lt;br /&gt;
*If it doesn&amp;#039;t appear, select Enter interpreter path... and browse to .venv_pc\Scripts\python.exe.&lt;br /&gt;
= Sync Libraries via requirements.txt =&lt;br /&gt;
*Since you have a new, empty environment, you need to install your project&amp;#039;s dependencies:&lt;br /&gt;
* On your Mac (before switching): &amp;lt;code&amp;gt;Run pip freeze &amp;gt; requirements.txt&amp;lt;/code&amp;gt; to save a list of your current libraries.&lt;br /&gt;
* On your PC: Activate the new environment with &amp;lt;code&amp;gt;.venv_pc\Scripts\activate &amp;lt;/code&amp;gt; and then run&lt;br /&gt;
 pip install -r requirements.txt.&lt;/div&gt;</summary>
		<author><name>Bacchas</name></author>
	</entry>
	<entry>
		<id>https://www.r512.com/index.php?title=Python_Environment_Setup&amp;diff=2923</id>
		<title>Python Environment Setup</title>
		<link rel="alternate" type="text/html" href="https://www.r512.com/index.php?title=Python_Environment_Setup&amp;diff=2923"/>
		<updated>2026-01-05T16:21:28Z</updated>

		<summary type="html">&lt;p&gt;Bacchas: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;==Create the Environment with a Unique Name==&lt;br /&gt;
*Instead of the generic .venv, give your Windows environment a name that clearly identifies it. In your project&amp;#039;s root terminal, run:&lt;br /&gt;
 python -m venv .venv_pc &lt;br /&gt;
*This creates a new folder named &amp;lt;code&amp;gt;.venv_pc &amp;lt;/code&amp;gt;in your project. Your existing Mac folder &amp;lt;code&amp;gt;(e.g., .venv or .venv_mac) &amp;lt;/code&amp;gt;will remain completely untouched.&lt;br /&gt;
==Set VS Code to Use the New PC Environment==&lt;br /&gt;
* You must tell VS Code on your PC to use this specific folder instead of the one from your Mac:&lt;br /&gt;
**Press&amp;lt;code&amp;gt; Ctrl + Shift + P&amp;lt;/code&amp;gt; to open the Command Palette.&lt;br /&gt;
*Type and select Python: Select Interpreter.&lt;br /&gt;
*Choose the one that points to your new folder: &amp;lt;code&amp;gt;(&amp;#039;.venv_pc&amp;#039;: venv).&amp;lt;/code&amp;gt;&lt;br /&gt;
If it doesn&amp;#039;t appear, select Enter interpreter path... and browse to .venv_pc\Scripts\python.exe.&lt;/div&gt;</summary>
		<author><name>Bacchas</name></author>
	</entry>
	<entry>
		<id>https://www.r512.com/index.php?title=Python_Environment_Setup&amp;diff=2922</id>
		<title>Python Environment Setup</title>
		<link rel="alternate" type="text/html" href="https://www.r512.com/index.php?title=Python_Environment_Setup&amp;diff=2922"/>
		<updated>2026-01-05T16:20:59Z</updated>

		<summary type="html">&lt;p&gt;Bacchas: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;==Create the Environment with a Unique Name==&lt;br /&gt;
*Instead of the generic .venv, give your Windows environment a name that clearly identifies it. In your project&amp;#039;s root terminal, run:&lt;br /&gt;
 python -m venv .venv_pc &lt;br /&gt;
*This creates a new folder named &amp;lt;code&amp;gt;.venv_pc &amp;lt;/code&amp;gt;in your project. Your existing Mac folder &amp;lt;code&amp;gt;(e.g., .venv or .venv_mac) &amp;lt;/code&amp;gt;will remain completely untouched.&lt;br /&gt;
==Set VS Code to Use the New PC Environment==&lt;br /&gt;
* You must tell VS Code on your PC to use this specific folder instead of the one from your Mac:&lt;br /&gt;
**Press Ctrl + Shift + P to open the Command Palette.&lt;br /&gt;
*Type and select Python: Select Interpreter.&lt;br /&gt;
*Choose the one that points to your new folder: &amp;lt;code&amp;gt;(&amp;#039;.venv_pc&amp;#039;: venv).&amp;lt;/code&amp;gt;&lt;br /&gt;
If it doesn&amp;#039;t appear, select Enter interpreter path... and browse to .venv_pc\Scripts\python.exe.&lt;/div&gt;</summary>
		<author><name>Bacchas</name></author>
	</entry>
	<entry>
		<id>https://www.r512.com/index.php?title=Python_Environment_Setup&amp;diff=2921</id>
		<title>Python Environment Setup</title>
		<link rel="alternate" type="text/html" href="https://www.r512.com/index.php?title=Python_Environment_Setup&amp;diff=2921"/>
		<updated>2026-01-05T16:20:28Z</updated>

		<summary type="html">&lt;p&gt;Bacchas: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;==Create the Environment with a Unique Name==&lt;br /&gt;
*Instead of the generic .venv, give your Windows environment a name that clearly identifies it. In your project&amp;#039;s root terminal, run:&lt;br /&gt;
 python -m venv .venv_pc &lt;br /&gt;
*This creates a new folder named &amp;lt;code&amp;gt;.venv_pc &amp;lt;/code&amp;gt;in your project. Your existing Mac folder &amp;lt;code&amp;gt;(e.g., .venv or .venv_mac) &amp;lt;/code&amp;gt;will remain completely untouched.&lt;br /&gt;
==Set VS Code to Use the New PC Environment==&lt;br /&gt;
* You must tell VS Code on your PC to use this specific folder instead of the one from your Mac:&lt;br /&gt;
-Press Ctrl + Shift + P to open the Command Palette.&lt;br /&gt;
*Type and select Python: Select Interpreter.&lt;br /&gt;
*Choose the one that points to your new folder: &amp;lt;code&amp;gt;(&amp;#039;.venv_pc&amp;#039;: venv).&amp;lt;/code&amp;gt;&lt;br /&gt;
If it doesn&amp;#039;t appear, select Enter interpreter path... and browse to .venv_pc\Scripts\python.exe.&lt;/div&gt;</summary>
		<author><name>Bacchas</name></author>
	</entry>
	<entry>
		<id>https://www.r512.com/index.php?title=Python_Environment_Setup&amp;diff=2920</id>
		<title>Python Environment Setup</title>
		<link rel="alternate" type="text/html" href="https://www.r512.com/index.php?title=Python_Environment_Setup&amp;diff=2920"/>
		<updated>2026-01-05T16:18:39Z</updated>

		<summary type="html">&lt;p&gt;Bacchas: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;==Create the Environment with a Unique Name==&lt;br /&gt;
*Instead of the generic .venv, give your Windows environment a name that clearly identifies it. In your project&amp;#039;s root terminal, run:&lt;br /&gt;
 python -m venv .venv_pc &lt;br /&gt;
*This creates a new folder named &amp;lt;code&amp;gt;.venv_pc &amp;lt;/code&amp;gt;in your project. Your existing Mac folder &amp;lt;code&amp;gt;(e.g., .venv or .venv_mac) &amp;lt;/code&amp;gt;will remain completely untouched.&lt;/div&gt;</summary>
		<author><name>Bacchas</name></author>
	</entry>
	<entry>
		<id>https://www.r512.com/index.php?title=Python_Environment_Setup&amp;diff=2919</id>
		<title>Python Environment Setup</title>
		<link rel="alternate" type="text/html" href="https://www.r512.com/index.php?title=Python_Environment_Setup&amp;diff=2919"/>
		<updated>2026-01-05T16:18:04Z</updated>

		<summary type="html">&lt;p&gt;Bacchas: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;==Create the Environment with a Unique Name==&lt;br /&gt;
*Instead of the generic .venv, give your Windows environment a name that clearly identifies it. In your project&amp;#039;s root terminal, run:&lt;br /&gt;
 python -m venv .venv_pc &lt;br /&gt;
*This creates a new folder named &amp;lt;code&amp;gt;.venv_pc &amp;lt;/code&amp;gt;in your project. Your existing Mac folder (e.g., .venv or .venv_mac) will remain completely untouched.&lt;/div&gt;</summary>
		<author><name>Bacchas</name></author>
	</entry>
	<entry>
		<id>https://www.r512.com/index.php?title=Python_Environment_Setup&amp;diff=2918</id>
		<title>Python Environment Setup</title>
		<link rel="alternate" type="text/html" href="https://www.r512.com/index.php?title=Python_Environment_Setup&amp;diff=2918"/>
		<updated>2026-01-05T16:03:12Z</updated>

		<summary type="html">&lt;p&gt;Bacchas: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;==Create the Environment with a Unique Name==&lt;br /&gt;
*Instead of the generic .venv, give your Windows environment a name that clearly identifies it. In your project&amp;#039;s root terminal, run:&lt;br /&gt;
 python -m venv .venv_pc &lt;br /&gt;
*This creates a new folder named .venv_pc in your project. Your existing Mac folder (e.g., .venv or .venv_mac) will remain completely untouched.&lt;/div&gt;</summary>
		<author><name>Bacchas</name></author>
	</entry>
	<entry>
		<id>https://www.r512.com/index.php?title=Python_Environment_Setup&amp;diff=2917</id>
		<title>Python Environment Setup</title>
		<link rel="alternate" type="text/html" href="https://www.r512.com/index.php?title=Python_Environment_Setup&amp;diff=2917"/>
		<updated>2026-01-05T15:47:35Z</updated>

		<summary type="html">&lt;p&gt;Bacchas: Created page with &amp;quot;==Create the Environment with a Unique Name== *Instead of the generic .venv, give your Windows environment a name that clearly identifies it. In your project&amp;#039;s root terminal, run: python -m venv .venv_pc  *This creates a new folder named .venv_pc in your project. Your existing Mac folder (e.g., .venv or .venv_mac) will remain completely untouched.&amp;quot;&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;==Create the Environment with a Unique Name==&lt;br /&gt;
*Instead of the generic .venv, give your Windows environment a name that clearly identifies it. In your project&amp;#039;s root terminal, run:&lt;br /&gt;
python -m venv .venv_pc &lt;br /&gt;
*This creates a new folder named .venv_pc in your project. Your existing Mac folder (e.g., .venv or .venv_mac) will remain completely untouched.&lt;/div&gt;</summary>
		<author><name>Bacchas</name></author>
	</entry>
	<entry>
		<id>https://www.r512.com/index.php?title=Python&amp;diff=2916</id>
		<title>Python</title>
		<link rel="alternate" type="text/html" href="https://www.r512.com/index.php?title=Python&amp;diff=2916"/>
		<updated>2026-01-05T15:46:10Z</updated>

		<summary type="html">&lt;p&gt;Bacchas: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;=[[Python Environment Setup]]=&lt;br /&gt;
=[[Convert .Py to .exe]]=&lt;br /&gt;
=[[Fix Python Errors]]=&lt;br /&gt;
=[[Python Software installation]]=&lt;br /&gt;
=[[Object and Data Structure Basics]]=&lt;br /&gt;
=[[Perform IO with Text Files]]=&lt;br /&gt;
=[[Control Flow, if statements etc..]]=&lt;br /&gt;
=[[Python Problems and Solutions]]=&lt;br /&gt;
=[[Python Functions]]=&lt;br /&gt;
=[[Python Web Scraping]]=&lt;br /&gt;
=[[Python Data Mining]]=&lt;br /&gt;
=[[Coursera Google Python Automation Course]]=&lt;br /&gt;
=[[Python Excel Related]]=&lt;br /&gt;
=[[Python Copying File and Directories ]]=&lt;/div&gt;</summary>
		<author><name>Bacchas</name></author>
	</entry>
	<entry>
		<id>https://www.r512.com/index.php?title=Python&amp;diff=2915</id>
		<title>Python</title>
		<link rel="alternate" type="text/html" href="https://www.r512.com/index.php?title=Python&amp;diff=2915"/>
		<updated>2026-01-05T15:45:57Z</updated>

		<summary type="html">&lt;p&gt;Bacchas: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;=[[Python Environment Setup]]==&lt;br /&gt;
=[[Convert .Py to .exe]]=&lt;br /&gt;
=[[Fix Python Errors]]=&lt;br /&gt;
=[[Python Software installation]]=&lt;br /&gt;
=[[Object and Data Structure Basics]]=&lt;br /&gt;
=[[Perform IO with Text Files]]=&lt;br /&gt;
=[[Control Flow, if statements etc..]]=&lt;br /&gt;
=[[Python Problems and Solutions]]=&lt;br /&gt;
=[[Python Functions]]=&lt;br /&gt;
=[[Python Web Scraping]]=&lt;br /&gt;
=[[Python Data Mining]]=&lt;br /&gt;
=[[Coursera Google Python Automation Course]]=&lt;br /&gt;
=[[Python Excel Related]]=&lt;br /&gt;
=[[Python Copying File and Directories ]]=&lt;/div&gt;</summary>
		<author><name>Bacchas</name></author>
	</entry>
	<entry>
		<id>https://www.r512.com/index.php?title=.PS1_To_.exe&amp;diff=2914</id>
		<title>.PS1 To .exe</title>
		<link rel="alternate" type="text/html" href="https://www.r512.com/index.php?title=.PS1_To_.exe&amp;diff=2914"/>
		<updated>2025-12-02T19:06:36Z</updated>

		<summary type="html">&lt;p&gt;Bacchas: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;==Converting a PowerShell script (.ps1) to an executable (.exe) can be achieved using tools like PS2EXE or IExpress.==&lt;br /&gt;
 Install-Module -Name PS2EXE&lt;br /&gt;
*Convert the script: Use the Invoke-PS2EXE command, specifying the source .ps1 file and the desired output .exe file path. For example:&lt;br /&gt;
 Invoke-PS2EXE -File C:\Path\To\YourScript.ps1 -OutputFile C:\Path\To\YourExecutable.exe&lt;br /&gt;
*You can also include parameters like -NoConsole to prevent a PowerShell console from appearing when the .exe is run, or -IconFile to specify a custom icon.&lt;/div&gt;</summary>
		<author><name>Bacchas</name></author>
	</entry>
	<entry>
		<id>https://www.r512.com/index.php?title=.PS1_To_.exe&amp;diff=2913</id>
		<title>.PS1 To .exe</title>
		<link rel="alternate" type="text/html" href="https://www.r512.com/index.php?title=.PS1_To_.exe&amp;diff=2913"/>
		<updated>2025-12-02T19:05:11Z</updated>

		<summary type="html">&lt;p&gt;Bacchas: Created page with &amp;quot;==Converting a PowerShell script (.ps1) to an executable (.exe) can be achieved using tools like PS2EXE or IExpress.==&amp;quot;&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;==Converting a PowerShell script (.ps1) to an executable (.exe) can be achieved using tools like PS2EXE or IExpress.==&lt;/div&gt;</summary>
		<author><name>Bacchas</name></author>
	</entry>
	<entry>
		<id>https://www.r512.com/index.php?title=PowerShell&amp;diff=2912</id>
		<title>PowerShell</title>
		<link rel="alternate" type="text/html" href="https://www.r512.com/index.php?title=PowerShell&amp;diff=2912"/>
		<updated>2025-12-02T19:04:57Z</updated>

		<summary type="html">&lt;p&gt;Bacchas: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;==[[.PS1 To .exe]]==&lt;br /&gt;
==[[Powershell Fundamentals]]==&lt;br /&gt;
==[[Useful PowerShell Commands]]==&lt;br /&gt;
==[[POWERSHELL FILEBASED OPERATIONS]]==&lt;br /&gt;
==[[Powershell Network Commands]]==&lt;br /&gt;
==[[PowerShell Comparison Operators]]==&lt;/div&gt;</summary>
		<author><name>Bacchas</name></author>
	</entry>
	<entry>
		<id>https://www.r512.com/index.php?title=Convert_.Py_to_.exe&amp;diff=2911</id>
		<title>Convert .Py to .exe</title>
		<link rel="alternate" type="text/html" href="https://www.r512.com/index.php?title=Convert_.Py_to_.exe&amp;diff=2911"/>
		<updated>2025-12-02T16:50:02Z</updated>

		<summary type="html">&lt;p&gt;Bacchas: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;h2&amp;gt; Converting a Python script (.py) to an executable (.exe) file for Windows can be achieved using tools like PyInstaller&amp;lt;/h2&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Using PyInstaller (Command Line):&amp;#039;&amp;#039;&amp;#039; &amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Install PyInstaller: Open your command prompt or terminal and execute:&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
 pip install pyinstaller&lt;br /&gt;
* Navigate to your script&amp;#039;s directory: Use the cd command to change the directory to where your Python script is located. For example&lt;br /&gt;
 cd C:\Users\YourUser\Documents\PythonProjects&lt;br /&gt;
* Run PyInstaller: Execute the following command, replacing your_script_name.py with the actual name of your Python file:&lt;br /&gt;
 pyinstaller your_script_name.py&lt;br /&gt;
*To create a single executable file (instead of a directory with dependencies), add the --onefile flag:&lt;br /&gt;
 pyinstaller --onefile your_script_name.py&lt;br /&gt;
&lt;br /&gt;
*pyinstaller --onefile your_script_name.py&lt;/div&gt;</summary>
		<author><name>Bacchas</name></author>
	</entry>
	<entry>
		<id>https://www.r512.com/index.php?title=Convert_.Py_to_.exe&amp;diff=2910</id>
		<title>Convert .Py to .exe</title>
		<link rel="alternate" type="text/html" href="https://www.r512.com/index.php?title=Convert_.Py_to_.exe&amp;diff=2910"/>
		<updated>2025-12-02T16:48:13Z</updated>

		<summary type="html">&lt;p&gt;Bacchas: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;h2&amp;gt; Converting a Python script (.py) to an executable (.exe) file for Windows can be achieved using tools like PyInstaller&amp;lt;/h2&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Using PyInstaller (Command Line):&amp;#039;&amp;#039;&amp;#039; &amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Install PyInstaller: Open your command prompt or terminal and execute:&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
 pip install pyinstaller&lt;br /&gt;
* Navigate to your script&amp;#039;s directory: Use the cd command to change the directory to where your Python script is located. For example&lt;/div&gt;</summary>
		<author><name>Bacchas</name></author>
	</entry>
	<entry>
		<id>https://www.r512.com/index.php?title=Convert_.Py_to_.exe&amp;diff=2909</id>
		<title>Convert .Py to .exe</title>
		<link rel="alternate" type="text/html" href="https://www.r512.com/index.php?title=Convert_.Py_to_.exe&amp;diff=2909"/>
		<updated>2025-12-02T16:47:52Z</updated>

		<summary type="html">&lt;p&gt;Bacchas: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;h2&amp;gt; Converting a Python script (.py) to an executable (.exe) file for Windows can be achieved using tools like PyInstaller&amp;lt;/h2&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Using PyInstaller (Command Line):&amp;#039;&amp;#039;&amp;#039; &amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Install PyInstaller: Open your command prompt or terminal and execute:&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
 pip install pyinstaller&lt;/div&gt;</summary>
		<author><name>Bacchas</name></author>
	</entry>
</feed>