<?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-06-20T09:08:08Z</updated>
	<subtitle>User contributions</subtitle>
	<generator>MediaWiki 1.37.1</generator>
	<entry>
		<id>https://www.r512.com/index.php?title=RecipeApp&amp;diff=2978</id>
		<title>RecipeApp</title>
		<link rel="alternate" type="text/html" href="https://www.r512.com/index.php?title=RecipeApp&amp;diff=2978"/>
		<updated>2026-06-10T19:45:24Z</updated>

		<summary type="html">&lt;p&gt;Bacchas: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Recipe App ==&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;1. Install Packages &amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
sudo apt update&lt;br /&gt;
&lt;br /&gt;
sudo apt install apache2 sqlite3 libsqlite3-dev libapache2-mod-php php-sqlite3&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;If your Apache uses a specific PHP version, install SQLite for that version. Check Apache PHP:&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
apachectl -M | grep -i php&lt;br /&gt;
ls -la /etc/apache2/mods-enabled/php*.load&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039; Example: if Apache uses PHP 8.1:&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
sudo apt install php8.1-sqlite3&lt;br /&gt;
sudo phpenmod -v 8.1 -s apache2 pdo_sqlite sqlite3&lt;br /&gt;
sudo systemctl restart apache2&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039; Verify SQLite support:&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
php -m | grep -i sqlite&lt;br /&gt;
ls -la /etc/php/*/apache2/conf.d/ | grep sqlite&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039; You should see:&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
pdo_sqlite&lt;br /&gt;
sqlite3&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039; 2. Copy App Files&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Example location:3. Set Permissions&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Apache must write to SQLite and image upload folders:&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
cd /var/www/html/11square&lt;br /&gt;
&lt;br /&gt;
sudo mkdir -p data uploads/recipes&lt;br /&gt;
sudo chown -R www-data:www-data data uploads&lt;br /&gt;
sudo chmod -R 775 data uploads&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039; Do not make the whole app writable unless needed. Only data/ and uploads/ need write access.&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;4. Apache Virtual Host&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Create a site config:&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
sudo nano /etc/apache2/sites-available/mysite.conf&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&amp;lt;VirtualHost *:80&amp;gt;&lt;br /&gt;
    ServerName mysite.com&lt;br /&gt;
    ServerAlias www.mysite.com&lt;br /&gt;
&lt;br /&gt;
    DocumentRoot /var/www/html/mysite&lt;br /&gt;
&lt;br /&gt;
    &amp;lt;Directory /var/www/html/mysite&amp;gt;&lt;br /&gt;
        Options -Indexes +FollowSymLinks&lt;br /&gt;
        AllowOverride All&lt;br /&gt;
        Require all granted&lt;br /&gt;
    &amp;lt;/Directory&amp;gt;&lt;br /&gt;
&lt;br /&gt;
    ErrorLog ${APACHE_LOG_DIR}/mysite-error.log&lt;br /&gt;
    CustomLog ${APACHE_LOG_DIR}/mysite-access.log combined&lt;br /&gt;
&amp;lt;/VirtualHost&amp;gt;&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Enable the site: &amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
sudo a2ensite mysite.conf&lt;br /&gt;
sudo a2enmod rewrite&lt;br /&gt;
sudo apachectl configtest&lt;br /&gt;
sudo systemctl restart apache2&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;If config test says Syntax OK, Apache is good.&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;5. Test App From Server&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;From the app folder: &amp;#039;&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
cd /var/www/html/mysite&lt;br /&gt;
&lt;br /&gt;
php -l index.php&lt;br /&gt;
php -l lib/Database.php&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;7. Optional HTTPS&lt;br /&gt;
Install Certbot:&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&lt;br /&gt;
 sudo apt install certbot python3-certbot-apache&lt;br /&gt;
&lt;br /&gt;
Issue certificate:&lt;br /&gt;
&lt;br /&gt;
 sudo certbot --apache -d mysite.com -d www.mysite.com&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Then test:&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
 sudo apachectl configtest&lt;br /&gt;
 sudo systemctl restart apache2&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;8. Common Troubleshooting&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Check Apache/PHP errors:&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&lt;br /&gt;
 sudo tail -n 100 /var/log/apache2/mysite-error.log&lt;br /&gt;
 sudo tail -n 100 /var/log/apache2/error.log&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Watch live while refreshing the browser:&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&lt;br /&gt;
 sudo tail -f /var/log/apache2/mysite-error.log&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;If you see:&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;PDOException: could not find driver&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Install SQLite for Apache’s active PHP version:&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&lt;br /&gt;
 ls -la /etc/apache2/mods-enabled/php*.load&lt;br /&gt;
 sudo apt install php8.1-sqlite3&lt;br /&gt;
 sudo phpenmod -v 8.1 -s apache2 pdo_sqlite sqlite3&lt;br /&gt;
 sudo systemctl restart apache2&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;If you see permission errors for SQLite or uploads:&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&lt;br /&gt;
 sudo chown -R www-data:www-data /var/www/html/mysite/data /var/www/html/mysite/uploads&lt;br /&gt;
 sudo chmod -R 775 /var/www/html/mysite/data /var/www/html/mysite/uploads&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Back up these folders/files:&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&lt;br /&gt;
 /var/www/html/mysite/data/cocktails.sqlite&lt;br /&gt;
 /var/www/html/mysite/uploads/&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Those contain your saved recipes and uploaded images.&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=RecipeApp&amp;diff=2977</id>
		<title>RecipeApp</title>
		<link rel="alternate" type="text/html" href="https://www.r512.com/index.php?title=RecipeApp&amp;diff=2977"/>
		<updated>2026-06-10T19:43:24Z</updated>

		<summary type="html">&lt;p&gt;Bacchas: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Recipe App ==&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;1. Install Packages &amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
sudo apt update&lt;br /&gt;
&lt;br /&gt;
sudo apt install apache2 sqlite3 libsqlite3-dev libapache2-mod-php php-sqlite3&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;If your Apache uses a specific PHP version, install SQLite for that version. Check Apache PHP:&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
apachectl -M | grep -i php&lt;br /&gt;
ls -la /etc/apache2/mods-enabled/php*.load&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039; Example: if Apache uses PHP 8.1:&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
sudo apt install php8.1-sqlite3&lt;br /&gt;
sudo phpenmod -v 8.1 -s apache2 pdo_sqlite sqlite3&lt;br /&gt;
sudo systemctl restart apache2&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039; Verify SQLite support:&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
php -m | grep -i sqlite&lt;br /&gt;
ls -la /etc/php/*/apache2/conf.d/ | grep sqlite&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039; You should see:&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
pdo_sqlite&lt;br /&gt;
sqlite3&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039; 2. Copy App Files&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Example location:3. Set Permissions&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Apache must write to SQLite and image upload folders:&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
cd /var/www/html/11square&lt;br /&gt;
&lt;br /&gt;
sudo mkdir -p data uploads/recipes&lt;br /&gt;
sudo chown -R www-data:www-data data uploads&lt;br /&gt;
sudo chmod -R 775 data uploads&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039; Do not make the whole app writable unless needed. Only data/ and uploads/ need write access.&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;4. Apache Virtual Host&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Create a site config:&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
sudo nano /etc/apache2/sites-available/11square.conf&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&amp;lt;VirtualHost *:80&amp;gt;&lt;br /&gt;
    ServerName 11square.com&lt;br /&gt;
    ServerAlias www.11square.com&lt;br /&gt;
&lt;br /&gt;
    DocumentRoot /var/www/html/11square&lt;br /&gt;
&lt;br /&gt;
    &amp;lt;Directory /var/www/html/11square&amp;gt;&lt;br /&gt;
        Options -Indexes +FollowSymLinks&lt;br /&gt;
        AllowOverride All&lt;br /&gt;
        Require all granted&lt;br /&gt;
    &amp;lt;/Directory&amp;gt;&lt;br /&gt;
&lt;br /&gt;
    ErrorLog ${APACHE_LOG_DIR}/11square-error.log&lt;br /&gt;
    CustomLog ${APACHE_LOG_DIR}/11square-access.log combined&lt;br /&gt;
&amp;lt;/VirtualHost&amp;gt;&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Enable the site: &amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
sudo a2ensite 11square.conf&lt;br /&gt;
sudo a2enmod rewrite&lt;br /&gt;
sudo apachectl configtest&lt;br /&gt;
sudo systemctl restart apache2&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;If config test says Syntax OK, Apache is good.&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;5. Test App From Server&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;From the app folder: &amp;#039;&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
cd /var/www/html/11square&lt;br /&gt;
&lt;br /&gt;
php -l index.php&lt;br /&gt;
php -l lib/Database.php&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;7. Optional HTTPS&lt;br /&gt;
Install Certbot:&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&lt;br /&gt;
 sudo apt install certbot python3-certbot-apache&lt;br /&gt;
&lt;br /&gt;
Issue certificate:&lt;br /&gt;
&lt;br /&gt;
 sudo certbot --apache -d 11square.com -d www.11square.com&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Then test:&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
 sudo apachectl configtest&lt;br /&gt;
 sudo systemctl restart apache2&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;8. Common Troubleshooting&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Check Apache/PHP errors:&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&lt;br /&gt;
 sudo tail -n 100 /var/log/apache2/11square-error.log&lt;br /&gt;
 sudo tail -n 100 /var/log/apache2/error.log&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Watch live while refreshing the browser:&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&lt;br /&gt;
 sudo tail -f /var/log/apache2/11square-error.log&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;If you see:&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;PDOException: could not find driver&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Install SQLite for Apache’s active PHP version:&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&lt;br /&gt;
 ls -la /etc/apache2/mods-enabled/php*.load&lt;br /&gt;
 sudo apt install php8.1-sqlite3&lt;br /&gt;
 sudo phpenmod -v 8.1 -s apache2 pdo_sqlite sqlite3&lt;br /&gt;
 sudo systemctl restart apache2&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;If you see permission errors for SQLite or uploads:&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&lt;br /&gt;
 sudo chown -R www-data:www-data /var/www/html/11square/data /var/www/html/11square/uploads&lt;br /&gt;
 sudo chmod -R 775 /var/www/html/11square/data /var/www/html/11square/uploads&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Back up these folders/files:&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&lt;br /&gt;
 /var/www/html/11square/data/cocktails.sqlite&lt;br /&gt;
 /var/www/html/11square/uploads/&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Those contain your saved recipes and uploaded images.&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=RecipeApp&amp;diff=2976</id>
		<title>RecipeApp</title>
		<link rel="alternate" type="text/html" href="https://www.r512.com/index.php?title=RecipeApp&amp;diff=2976"/>
		<updated>2026-06-10T19:42:20Z</updated>

		<summary type="html">&lt;p&gt;Bacchas: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Recipe App ==&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;1. Install Packages &amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
sudo apt update&lt;br /&gt;
&lt;br /&gt;
sudo apt install apache2 sqlite3 libsqlite3-dev libapache2-mod-php php-sqlite3&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;If your Apache uses a specific PHP version, install SQLite for that version. Check Apache PHP:&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
apachectl -M | grep -i php&lt;br /&gt;
ls -la /etc/apache2/mods-enabled/php*.load&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039; Example: if Apache uses PHP 8.1:&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
sudo apt install php8.1-sqlite3&lt;br /&gt;
sudo phpenmod -v 8.1 -s apache2 pdo_sqlite sqlite3&lt;br /&gt;
sudo systemctl restart apache2&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039; Verify SQLite support:&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
php -m | grep -i sqlite&lt;br /&gt;
ls -la /etc/php/*/apache2/conf.d/ | grep sqlite&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039; You should see:&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
pdo_sqlite&lt;br /&gt;
sqlite3&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039; 2. Copy App Files&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Example location:3. Set Permissions&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Apache must write to SQLite and image upload folders:&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
cd /var/www/html/11square&lt;br /&gt;
&lt;br /&gt;
sudo mkdir -p data uploads/recipes&lt;br /&gt;
sudo chown -R www-data:www-data data uploads&lt;br /&gt;
sudo chmod -R 775 data uploads&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039; Do not make the whole app writable unless needed. Only data/ and uploads/ need write access.&lt;br /&gt;
4. Apache Virtual Host&lt;br /&gt;
Create a site config:&amp;#039;&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
sudo nano /etc/apache2/sites-available/11square.conf&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;&amp;#039; &amp;#039;&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&amp;lt;VirtualHost *:80&amp;gt;&lt;br /&gt;
    ServerName 11square.com&lt;br /&gt;
    ServerAlias www.11square.com&lt;br /&gt;
&lt;br /&gt;
    DocumentRoot /var/www/html/11square&lt;br /&gt;
&lt;br /&gt;
    &amp;lt;Directory /var/www/html/11square&amp;gt;&lt;br /&gt;
        Options -Indexes +FollowSymLinks&lt;br /&gt;
        AllowOverride All&lt;br /&gt;
        Require all granted&lt;br /&gt;
    &amp;lt;/Directory&amp;gt;&lt;br /&gt;
&lt;br /&gt;
    ErrorLog ${APACHE_LOG_DIR}/11square-error.log&lt;br /&gt;
    CustomLog ${APACHE_LOG_DIR}/11square-access.log combined&lt;br /&gt;
&amp;lt;/VirtualHost&amp;gt;&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;&amp;#039;Enable the site: &amp;#039;&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
sudo a2ensite 11square.conf&lt;br /&gt;
sudo a2enmod rewrite&lt;br /&gt;
sudo apachectl configtest&lt;br /&gt;
sudo systemctl restart apache2&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;&amp;#039;If config test says Syntax OK, Apache is good.&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;5. Test App From Server&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;From the app folder: &amp;#039;&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
cd /var/www/html/11square&lt;br /&gt;
&lt;br /&gt;
php -l index.php&lt;br /&gt;
php -l lib/Database.php&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;7. Optional HTTPS&lt;br /&gt;
Install Certbot:&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&lt;br /&gt;
 sudo apt install certbot python3-certbot-apache&lt;br /&gt;
&lt;br /&gt;
Issue certificate:&lt;br /&gt;
&lt;br /&gt;
 sudo certbot --apache -d 11square.com -d www.11square.com&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Then test:&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
 sudo apachectl configtest&lt;br /&gt;
 sudo systemctl restart apache2&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;8. Common Troubleshooting&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Check Apache/PHP errors:&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&lt;br /&gt;
 sudo tail -n 100 /var/log/apache2/11square-error.log&lt;br /&gt;
 sudo tail -n 100 /var/log/apache2/error.log&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Watch live while refreshing the browser:&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&lt;br /&gt;
 sudo tail -f /var/log/apache2/11square-error.log&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;If you see:&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;PDOException: could not find driver&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Install SQLite for Apache’s active PHP version:&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&lt;br /&gt;
 ls -la /etc/apache2/mods-enabled/php*.load&lt;br /&gt;
 sudo apt install php8.1-sqlite3&lt;br /&gt;
 sudo phpenmod -v 8.1 -s apache2 pdo_sqlite sqlite3&lt;br /&gt;
 sudo systemctl restart apache2&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;If you see permission errors for SQLite or uploads:&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&lt;br /&gt;
 sudo chown -R www-data:www-data /var/www/html/11square/data /var/www/html/11square/uploads&lt;br /&gt;
 sudo chmod -R 775 /var/www/html/11square/data /var/www/html/11square/uploads&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Back up these folders/files:&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&lt;br /&gt;
 /var/www/html/11square/data/cocktails.sqlite&lt;br /&gt;
 /var/www/html/11square/uploads/&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Those contain your saved recipes and uploaded images.&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=RecipeApp&amp;diff=2975</id>
		<title>RecipeApp</title>
		<link rel="alternate" type="text/html" href="https://www.r512.com/index.php?title=RecipeApp&amp;diff=2975"/>
		<updated>2026-06-10T19:41:12Z</updated>

		<summary type="html">&lt;p&gt;Bacchas: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Recipe App ==&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;&amp;#039;1. Install Packages &amp;#039;&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
sudo apt update&lt;br /&gt;
&lt;br /&gt;
sudo apt install apache2 sqlite3 libsqlite3-dev libapache2-mod-php php-sqlite3&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;&amp;#039;If your Apache uses a specific PHP version, install SQLite for that version. Check Apache PHP:&amp;#039;&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
apachectl -M | grep -i php&lt;br /&gt;
ls -la /etc/apache2/mods-enabled/php*.load&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;&amp;#039; Example: if Apache uses PHP 8.1:&amp;#039;&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
sudo apt install php8.1-sqlite3&lt;br /&gt;
sudo phpenmod -v 8.1 -s apache2 pdo_sqlite sqlite3&lt;br /&gt;
sudo systemctl restart apache2&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;&amp;#039; Verify SQLite support:&amp;#039;&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
php -m | grep -i sqlite&lt;br /&gt;
ls -la /etc/php/*/apache2/conf.d/ | grep sqlite&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;&amp;#039; You should see:&amp;#039;&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
pdo_sqlite&lt;br /&gt;
sqlite3&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;&amp;#039; 2. Copy App Files&lt;br /&gt;
Example location:3. Set Permissions&lt;br /&gt;
Apache must write to SQLite and image upload folders:&amp;#039;&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
cd /var/www/html/11square&lt;br /&gt;
&lt;br /&gt;
sudo mkdir -p data uploads/recipes&lt;br /&gt;
sudo chown -R www-data:www-data data uploads&lt;br /&gt;
sudo chmod -R 775 data uploads&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;&amp;#039; Do not make the whole app writable unless needed. Only data/ and uploads/ need write access.&lt;br /&gt;
4. Apache Virtual Host&lt;br /&gt;
Create a site config:&amp;#039;&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
sudo nano /etc/apache2/sites-available/11square.conf&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;&amp;#039; &amp;#039;&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&amp;lt;VirtualHost *:80&amp;gt;&lt;br /&gt;
    ServerName 11square.com&lt;br /&gt;
    ServerAlias www.11square.com&lt;br /&gt;
&lt;br /&gt;
    DocumentRoot /var/www/html/11square&lt;br /&gt;
&lt;br /&gt;
    &amp;lt;Directory /var/www/html/11square&amp;gt;&lt;br /&gt;
        Options -Indexes +FollowSymLinks&lt;br /&gt;
        AllowOverride All&lt;br /&gt;
        Require all granted&lt;br /&gt;
    &amp;lt;/Directory&amp;gt;&lt;br /&gt;
&lt;br /&gt;
    ErrorLog ${APACHE_LOG_DIR}/11square-error.log&lt;br /&gt;
    CustomLog ${APACHE_LOG_DIR}/11square-access.log combined&lt;br /&gt;
&amp;lt;/VirtualHost&amp;gt;&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;&amp;#039;Enable the site: &amp;#039;&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
sudo a2ensite 11square.conf&lt;br /&gt;
sudo a2enmod rewrite&lt;br /&gt;
sudo apachectl configtest&lt;br /&gt;
sudo systemctl restart apache2&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;&amp;#039;If config test says Syntax OK, Apache is good.&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;5. Test App From Server&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;From the app folder: &amp;#039;&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
cd /var/www/html/11square&lt;br /&gt;
&lt;br /&gt;
php -l index.php&lt;br /&gt;
php -l lib/Database.php&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;7. Optional HTTPS&lt;br /&gt;
Install Certbot:&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&lt;br /&gt;
 sudo apt install certbot python3-certbot-apache&lt;br /&gt;
&lt;br /&gt;
Issue certificate:&lt;br /&gt;
&lt;br /&gt;
 sudo certbot --apache -d 11square.com -d www.11square.com&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Then test:&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
 sudo apachectl configtest&lt;br /&gt;
 sudo systemctl restart apache2&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;8. Common Troubleshooting&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Check Apache/PHP errors:&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&lt;br /&gt;
 sudo tail -n 100 /var/log/apache2/11square-error.log&lt;br /&gt;
 sudo tail -n 100 /var/log/apache2/error.log&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Watch live while refreshing the browser:&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&lt;br /&gt;
 sudo tail -f /var/log/apache2/11square-error.log&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;If you see:&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;PDOException: could not find driver&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Install SQLite for Apache’s active PHP version:&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&lt;br /&gt;
 ls -la /etc/apache2/mods-enabled/php*.load&lt;br /&gt;
 sudo apt install php8.1-sqlite3&lt;br /&gt;
 sudo phpenmod -v 8.1 -s apache2 pdo_sqlite sqlite3&lt;br /&gt;
 sudo systemctl restart apache2&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;If you see permission errors for SQLite or uploads:&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&lt;br /&gt;
 sudo chown -R www-data:www-data /var/www/html/11square/data /var/www/html/11square/uploads&lt;br /&gt;
 sudo chmod -R 775 /var/www/html/11square/data /var/www/html/11square/uploads&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Back up these folders/files:&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&lt;br /&gt;
 /var/www/html/11square/data/cocktails.sqlite&lt;br /&gt;
 /var/www/html/11square/uploads/&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Those contain your saved recipes and uploaded images.&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=RecipeApp&amp;diff=2974</id>
		<title>RecipeApp</title>
		<link rel="alternate" type="text/html" href="https://www.r512.com/index.php?title=RecipeApp&amp;diff=2974"/>
		<updated>2026-06-10T19:18:30Z</updated>

		<summary type="html">&lt;p&gt;Bacchas: Created page with &amp;quot;== Recipe App ==  &amp;#039;&amp;#039;&amp;#039;&amp;#039;1. Install Packages &amp;#039;&amp;#039;&amp;#039;&amp;#039;  &amp;lt;pre&amp;gt; sudo apt update  sudo apt install apache2 sqlite3 libsqlite3-dev libapache2-mod-php php-sqlite3 &amp;lt;/pre&amp;gt;  &amp;#039;&amp;#039;&amp;#039;&amp;#039;If your Apache uses a specific PHP version, install SQLite for that version. Check Apache PHP:&amp;#039;&amp;#039;&amp;#039;&amp;#039;  &amp;lt;pre&amp;gt; apachectl -M | grep -i php ls -la /etc/apache2/mods-enabled/php*.load &amp;lt;/pre&amp;gt;  &amp;#039;&amp;#039;&amp;#039;&amp;#039; Example: if Apache uses PHP 8.1:&amp;#039;&amp;#039;&amp;#039;&amp;#039;  &amp;lt;pre&amp;gt; sudo apt install php8.1-sqlite3 sudo phpenmod -v 8.1 -s apache2 pdo_sqlite sqlit...&amp;quot;&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Recipe App ==&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;&amp;#039;1. Install Packages &amp;#039;&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
sudo apt update&lt;br /&gt;
&lt;br /&gt;
sudo apt install apache2 sqlite3 libsqlite3-dev libapache2-mod-php php-sqlite3&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;&amp;#039;If your Apache uses a specific PHP version, install SQLite for that version. Check Apache PHP:&amp;#039;&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
apachectl -M | grep -i php&lt;br /&gt;
ls -la /etc/apache2/mods-enabled/php*.load&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;&amp;#039; Example: if Apache uses PHP 8.1:&amp;#039;&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
sudo apt install php8.1-sqlite3&lt;br /&gt;
sudo phpenmod -v 8.1 -s apache2 pdo_sqlite sqlite3&lt;br /&gt;
sudo systemctl restart apache2&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;&amp;#039; Verify SQLite support:&amp;#039;&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
php -m | grep -i sqlite&lt;br /&gt;
ls -la /etc/php/*/apache2/conf.d/ | grep sqlite&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;&amp;#039; You should see:&amp;#039;&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
pdo_sqlite&lt;br /&gt;
sqlite3&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;&amp;#039; 2. Copy App Files&lt;br /&gt;
Example location:3. Set Permissions&lt;br /&gt;
Apache must write to SQLite and image upload folders:&amp;#039;&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
cd /var/www/html/11square&lt;br /&gt;
&lt;br /&gt;
sudo mkdir -p data uploads/recipes&lt;br /&gt;
sudo chown -R www-data:www-data data uploads&lt;br /&gt;
sudo chmod -R 775 data uploads&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;&amp;#039; Do not make the whole app writable unless needed. Only data/ and uploads/ need write access.&lt;br /&gt;
4. Apache Virtual Host&lt;br /&gt;
Create a site config:&amp;#039;&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
sudo nano /etc/apache2/sites-available/11square.conf&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;&amp;#039; &amp;#039;&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&amp;lt;VirtualHost *:80&amp;gt;&lt;br /&gt;
    ServerName 11square.com&lt;br /&gt;
    ServerAlias www.11square.com&lt;br /&gt;
&lt;br /&gt;
    DocumentRoot /var/www/html/11square&lt;br /&gt;
&lt;br /&gt;
    &amp;lt;Directory /var/www/html/11square&amp;gt;&lt;br /&gt;
        Options -Indexes +FollowSymLinks&lt;br /&gt;
        AllowOverride All&lt;br /&gt;
        Require all granted&lt;br /&gt;
    &amp;lt;/Directory&amp;gt;&lt;br /&gt;
&lt;br /&gt;
    ErrorLog ${APACHE_LOG_DIR}/11square-error.log&lt;br /&gt;
    CustomLog ${APACHE_LOG_DIR}/11square-access.log combined&lt;br /&gt;
&amp;lt;/VirtualHost&amp;gt;&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;&amp;#039;Enable the site: &amp;#039;&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
sudo a2ensite 11square.conf&lt;br /&gt;
sudo a2enmod rewrite&lt;br /&gt;
sudo apachectl configtest&lt;br /&gt;
sudo systemctl restart apache2&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;&amp;#039;If config test says Syntax OK, Apache is good.&lt;br /&gt;
5. Test App From Server&lt;br /&gt;
From the app folder: &amp;#039;&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
cd /var/www/html/11square&lt;br /&gt;
&lt;br /&gt;
php -l index.php&lt;br /&gt;
php -l lib/Database.php&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;&amp;#039; &amp;#039;&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;7. Optional HTTPS&lt;br /&gt;
Install Certbot:&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&lt;br /&gt;
 sudo apt install certbot python3-certbot-apache&lt;br /&gt;
&lt;br /&gt;
Issue certificate:&lt;br /&gt;
&lt;br /&gt;
 sudo certbot --apache -d 11square.com -d www.11square.com&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Then test:&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
 sudo apachectl configtest&lt;br /&gt;
 sudo systemctl restart apache2&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;8. Common Troubleshooting&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Check Apache/PHP errors:&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&lt;br /&gt;
 sudo tail -n 100 /var/log/apache2/11square-error.log&lt;br /&gt;
 sudo tail -n 100 /var/log/apache2/error.log&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Watch live while refreshing the browser:&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&lt;br /&gt;
 sudo tail -f /var/log/apache2/11square-error.log&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;If you see:&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;PDOException: could not find driver&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Install SQLite for Apache’s active PHP version:&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&lt;br /&gt;
 ls -la /etc/apache2/mods-enabled/php*.load&lt;br /&gt;
 sudo apt install php8.1-sqlite3&lt;br /&gt;
 sudo phpenmod -v 8.1 -s apache2 pdo_sqlite sqlite3&lt;br /&gt;
 sudo systemctl restart apache2&lt;br /&gt;
&lt;br /&gt;
If you see permission errors for SQLite or uploads:&lt;br /&gt;
sudo chown -R www-data:www-data /var/www/html/11square/data /var/www/html/11square/uploads&lt;br /&gt;
sudo chmod -R 775 /var/www/html/11square/data /var/www/html/11square/uploads&lt;br /&gt;
Backup&lt;br /&gt;
Back up these folders/files:&lt;br /&gt;
/var/www/html/11square/data/cocktails.sqlite&lt;br /&gt;
/var/www/html/11square/uploads/&lt;br /&gt;
Those contain your saved recipes and uploaded images.&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=AI_APPS&amp;diff=2973</id>
		<title>AI APPS</title>
		<link rel="alternate" type="text/html" href="https://www.r512.com/index.php?title=AI_APPS&amp;diff=2973"/>
		<updated>2026-06-10T19:09:27Z</updated>

		<summary type="html">&lt;p&gt;Bacchas: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;==[[PYTHONAPP]]==&lt;br /&gt;
==[[IMAGEBROWSER]]==&lt;br /&gt;
==[[RecipeApp]]==&lt;/div&gt;</summary>
		<author><name>Bacchas</name></author>
	</entry>
	<entry>
		<id>https://www.r512.com/index.php?title=IMAGEBROWSER&amp;diff=2972</id>
		<title>IMAGEBROWSER</title>
		<link rel="alternate" type="text/html" href="https://www.r512.com/index.php?title=IMAGEBROWSER&amp;diff=2972"/>
		<updated>2026-05-29T16:46:21Z</updated>

		<summary type="html">&lt;p&gt;Bacchas: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Server Setup ==&lt;br /&gt;
1. upload contents to web folder&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039; Even if PHP is already installed, confirm MySQL and GD support:&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
sudo apt update&lt;br /&gt;
sudo apt install php-mysql php-gd exiftool&lt;br /&gt;
php -v&lt;br /&gt;
php -m | grep -E &amp;#039;pdo_mysql|gd&amp;#039;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Create Database==&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;In phpMyAdmin:&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Create a database, for example imagebrowser.&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Use collation utf8mb4_unicode_ci.&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Import:&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&lt;br /&gt;
 database/schema.sql&lt;br /&gt;
&lt;br /&gt;
4. Create MySQL User&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;You can do this in phpMyAdmin, or with MySQL CLI:&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
CREATE USER &amp;#039;imagebrowser_user&amp;#039;@&amp;#039;localhost&amp;#039; IDENTIFIED BY &amp;#039;your-strong-password&amp;#039;;&lt;br /&gt;
GRANT ALL PRIVILEGES ON imagebrowser.* TO &amp;#039;imagebrowser_user&amp;#039;@&amp;#039;localhost&amp;#039;;&lt;br /&gt;
FLUSH PRIVILEGES;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
5. Configure app on the server&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
cd /var/www/html&lt;br /&gt;
cp config/config.example.php config/config.php&lt;br /&gt;
nano config/config.php&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Set these values&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&amp;#039;base_url&amp;#039; =&amp;gt; &amp;#039;&amp;#039;,&lt;br /&gt;
&amp;#039;categories_dir&amp;#039; =&amp;gt; __DIR__ . &amp;#039;/../categories&amp;#039;,&lt;br /&gt;
&amp;#039;thumbnail_dir&amp;#039; =&amp;gt; __DIR__ . &amp;#039;/../cache/thumbs&amp;#039;,&lt;br /&gt;
&amp;#039;db&amp;#039; =&amp;gt; [&lt;br /&gt;
    &amp;#039;host&amp;#039; =&amp;gt; &amp;#039;127.0.0.1&amp;#039;,&lt;br /&gt;
    &amp;#039;port&amp;#039; =&amp;gt; 3306,&lt;br /&gt;
    &amp;#039;database&amp;#039; =&amp;gt; &amp;#039;imagebrowser&amp;#039;,&lt;br /&gt;
    &amp;#039;username&amp;#039; =&amp;gt; &amp;#039;imagebrowser_user&amp;#039;,&lt;br /&gt;
    &amp;#039;password&amp;#039; =&amp;gt; &amp;#039;your-strong-password&amp;#039;,&lt;br /&gt;
    &amp;#039;charset&amp;#039; =&amp;gt; &amp;#039;utf8mb4&amp;#039;,&lt;br /&gt;
],&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Use base_url =&amp;gt; &amp;#039;&amp;#039; if the app is at the domain root. If installed in a subfolder like /gallery, use:&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
 &amp;#039;base_url&amp;#039; =&amp;gt; &amp;#039;/gallery&amp;#039;,&lt;br /&gt;
&lt;br /&gt;
6. Set Permissions&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Apache/PHP must be able to read categories/ and write to cache/ and uploads:&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
sudo chown -R www-data:www-data /var/www/html/cache /var/www/html/uploads /var/www/html/categories&lt;br /&gt;
sudo chmod -R 775 /var/www/html/cache /var/www/html/uploads /var/www/html/categories&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
7. Apache Setup&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Check which document root Apache is actually serving:&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&lt;br /&gt;
 sudo apachectl -S&lt;br /&gt;
&lt;br /&gt;
8.  Setup Conf file&lt;br /&gt;
&lt;br /&gt;
 sudo nano /etc/apache2/sites-available/imagebrowser.conf&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Example &amp;#039;&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;
    DocumentRoot /var/www/imagebrowser&lt;br /&gt;
&lt;br /&gt;
    &amp;lt;Directory /var/www/imagebrowser&amp;gt;&lt;br /&gt;
        AllowOverride All&lt;br /&gt;
        Require all granted&lt;br /&gt;
    &amp;lt;/Directory&amp;gt;&lt;br /&gt;
&lt;br /&gt;
    ErrorLog ${APACHE_LOG_DIR}/imagebrowser_error.log&lt;br /&gt;
    CustomLog ${APACHE_LOG_DIR}/imagebrowser_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;
8. Enable it&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
sudo a2ensite imagebrowser.conf&lt;br /&gt;
sudo a2enmod rewrite&lt;br /&gt;
sudo systemctl reload apache2&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
9. Create an Admin User For the App&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Cd into the App Folder&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
cd /var/www/html&lt;br /&gt;
php cli/create_admin.php admin@example.com &amp;quot;your-admin-password&amp;quot;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
10.  Add Images to the Category Folder&lt;br /&gt;
&lt;br /&gt;
11. Sign in to the Admin&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
https://yourdomain.com/login.php&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
12. Go ot Admin and click&lt;br /&gt;
&lt;br /&gt;
 Sync Library&lt;br /&gt;
 Render Category Thumbnails&lt;br /&gt;
&lt;br /&gt;
13. Quick verifications. Run these on the server&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
cd /var/www/html&lt;br /&gt;
php -l index.php&lt;br /&gt;
php -l thumb.php&lt;br /&gt;
php -l app/bootstrap.php&lt;br /&gt;
php -l app/thumbnails.php&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&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=IMAGEBROWSER&amp;diff=2971</id>
		<title>IMAGEBROWSER</title>
		<link rel="alternate" type="text/html" href="https://www.r512.com/index.php?title=IMAGEBROWSER&amp;diff=2971"/>
		<updated>2026-05-29T16:33:28Z</updated>

		<summary type="html">&lt;p&gt;Bacchas: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Server Setup ==&lt;br /&gt;
1. upload contents to web folder&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039; Even if PHP is already installed, confirm MySQL and GD support:&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
sudo apt update&lt;br /&gt;
sudo apt install php-mysql php-gd exiftool&lt;br /&gt;
php -v&lt;br /&gt;
php -m | grep -E &amp;#039;pdo_mysql|gd&amp;#039;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Create Database==&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;In phpMyAdmin:&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Create a database, for example imagebrowser.&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Use collation utf8mb4_unicode_ci.&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Import:&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&lt;br /&gt;
 database/schema.sql&lt;br /&gt;
&lt;br /&gt;
4. Create MySQL User&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;You can do this in phpMyAdmin, or with MySQL CLI:&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
CREATE USER &amp;#039;imagebrowser_user&amp;#039;@&amp;#039;localhost&amp;#039; IDENTIFIED BY &amp;#039;your-strong-password&amp;#039;;&lt;br /&gt;
GRANT ALL PRIVILEGES ON imagebrowser.* TO &amp;#039;imagebrowser_user&amp;#039;@&amp;#039;localhost&amp;#039;;&lt;br /&gt;
FLUSH PRIVILEGES;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
5. Configure app on the server&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
cd /var/www/html&lt;br /&gt;
cp config/config.example.php config/config.php&lt;br /&gt;
nano config/config.php&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Set these values&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&amp;#039;base_url&amp;#039; =&amp;gt; &amp;#039;&amp;#039;,&lt;br /&gt;
&amp;#039;categories_dir&amp;#039; =&amp;gt; __DIR__ . &amp;#039;/../categories&amp;#039;,&lt;br /&gt;
&amp;#039;thumbnail_dir&amp;#039; =&amp;gt; __DIR__ . &amp;#039;/../cache/thumbs&amp;#039;,&lt;br /&gt;
&amp;#039;db&amp;#039; =&amp;gt; [&lt;br /&gt;
    &amp;#039;host&amp;#039; =&amp;gt; &amp;#039;127.0.0.1&amp;#039;,&lt;br /&gt;
    &amp;#039;port&amp;#039; =&amp;gt; 3306,&lt;br /&gt;
    &amp;#039;database&amp;#039; =&amp;gt; &amp;#039;imagebrowser&amp;#039;,&lt;br /&gt;
    &amp;#039;username&amp;#039; =&amp;gt; &amp;#039;imagebrowser_user&amp;#039;,&lt;br /&gt;
    &amp;#039;password&amp;#039; =&amp;gt; &amp;#039;your-strong-password&amp;#039;,&lt;br /&gt;
    &amp;#039;charset&amp;#039; =&amp;gt; &amp;#039;utf8mb4&amp;#039;,&lt;br /&gt;
],&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Use base_url =&amp;gt; &amp;#039;&amp;#039; if the app is at the domain root. If installed in a subfolder like /gallery, use:&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
 &amp;#039;base_url&amp;#039; =&amp;gt; &amp;#039;/gallery&amp;#039;,&lt;br /&gt;
&lt;br /&gt;
6. Set Permissions&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Apache/PHP must be able to read categories/ and write to cache/ and uploads:&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
sudo chown -R www-data:www-data /var/www/html/cache /var/www/html/uploads /var/www/html/categories&lt;br /&gt;
sudo chmod -R 775 /var/www/html/cache /var/www/html/uploads /var/www/html/categories&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
7. Apache Setup&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Check which document root Apache is actually serving:&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&lt;br /&gt;
 sudo apachectl -S&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&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=IMAGEBROWSER&amp;diff=2970</id>
		<title>IMAGEBROWSER</title>
		<link rel="alternate" type="text/html" href="https://www.r512.com/index.php?title=IMAGEBROWSER&amp;diff=2970"/>
		<updated>2026-05-29T16:21:44Z</updated>

		<summary type="html">&lt;p&gt;Bacchas: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Server Setup ==&lt;br /&gt;
1. upload contents to web folder&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039; Even if PHP is already installed, confirm MySQL and GD support:&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
sudo apt update&lt;br /&gt;
sudo apt install php-mysql php-gd exiftool&lt;br /&gt;
php -v&lt;br /&gt;
php -m | grep -E &amp;#039;pdo_mysql|gd&amp;#039;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Create Database==&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;In phpMyAdmin:&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Create a database, for example imagebrowser.&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Use collation utf8mb4_unicode_ci.&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Import:&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&lt;br /&gt;
 database/schema.sql&lt;br /&gt;
&lt;br /&gt;
4. Create MySQL User&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;You can do this in phpMyAdmin, or with MySQL CLI:&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
CREATE USER &amp;#039;imagebrowser_user&amp;#039;@&amp;#039;localhost&amp;#039; IDENTIFIED BY &amp;#039;your-strong-password&amp;#039;;&lt;br /&gt;
GRANT ALL PRIVILEGES ON imagebrowser.* TO &amp;#039;imagebrowser_user&amp;#039;@&amp;#039;localhost&amp;#039;;&lt;br /&gt;
FLUSH PRIVILEGES;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&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=IMAGEBROWSER&amp;diff=2969</id>
		<title>IMAGEBROWSER</title>
		<link rel="alternate" type="text/html" href="https://www.r512.com/index.php?title=IMAGEBROWSER&amp;diff=2969"/>
		<updated>2026-05-29T16:19:32Z</updated>

		<summary type="html">&lt;p&gt;Bacchas: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Server Setup ==&lt;br /&gt;
1. upload contents to web folder&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039; Even if PHP is already installed, confirm MySQL and GD support:&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
sudo apt update&lt;br /&gt;
sudo apt install php-mysql php-gd exiftool&lt;br /&gt;
php -v&lt;br /&gt;
php -m | grep -E &amp;#039;pdo_mysql|gd&amp;#039;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Create Database==&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;In phpMyAdmin:&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Create a database, for example imagebrowser.&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Use collation utf8mb4_unicode_ci.&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Import:&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&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=IMAGEBROWSER&amp;diff=2968</id>
		<title>IMAGEBROWSER</title>
		<link rel="alternate" type="text/html" href="https://www.r512.com/index.php?title=IMAGEBROWSER&amp;diff=2968"/>
		<updated>2026-05-29T16:19:10Z</updated>

		<summary type="html">&lt;p&gt;Bacchas: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Server Setup ==&lt;br /&gt;
1. upload contents to web folder&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039; Even if PHP is already installed, confirm MySQL and GD support:&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
sudo apt update&lt;br /&gt;
sudo apt install php-mysql php-gd exiftool&lt;br /&gt;
php -v&lt;br /&gt;
php -m | grep -E &amp;#039;pdo_mysql|gd&amp;#039;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Create Database==&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;In phpMyAdmin:&lt;br /&gt;
&lt;br /&gt;
Create a database, for example imagebrowser.&lt;br /&gt;
Use collation utf8mb4_unicode_ci.&lt;br /&gt;
Import:&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&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=IMAGEBROWSER&amp;diff=2967</id>
		<title>IMAGEBROWSER</title>
		<link rel="alternate" type="text/html" href="https://www.r512.com/index.php?title=IMAGEBROWSER&amp;diff=2967"/>
		<updated>2026-05-29T16:16:54Z</updated>

		<summary type="html">&lt;p&gt;Bacchas: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Server Setup ==&lt;br /&gt;
1. upload contents to web folder&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039; Even if PHP is already installed, confirm MySQL and GD support:&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=IMAGEBROWSER&amp;diff=2966</id>
		<title>IMAGEBROWSER</title>
		<link rel="alternate" type="text/html" href="https://www.r512.com/index.php?title=IMAGEBROWSER&amp;diff=2966"/>
		<updated>2026-05-29T16:16:45Z</updated>

		<summary type="html">&lt;p&gt;Bacchas: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Server Setup ==&lt;br /&gt;
1. upload contents to web folder&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039; Even if PHP is already installed, confirm MySQL and GD support:&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=IMAGEBROWSER&amp;diff=2965</id>
		<title>IMAGEBROWSER</title>
		<link rel="alternate" type="text/html" href="https://www.r512.com/index.php?title=IMAGEBROWSER&amp;diff=2965"/>
		<updated>2026-05-29T16:16:18Z</updated>

		<summary type="html">&lt;p&gt;Bacchas: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Server Setup ==&lt;br /&gt;
1. upload contents to web folder&lt;br /&gt;
* Even if PHP is already installed, confirm MySQL and GD support:&lt;/div&gt;</summary>
		<author><name>Bacchas</name></author>
	</entry>
	<entry>
		<id>https://www.r512.com/index.php?title=IMAGEBROWSER&amp;diff=2964</id>
		<title>IMAGEBROWSER</title>
		<link rel="alternate" type="text/html" href="https://www.r512.com/index.php?title=IMAGEBROWSER&amp;diff=2964"/>
		<updated>2026-05-29T16:15:48Z</updated>

		<summary type="html">&lt;p&gt;Bacchas: Created page with &amp;quot;== Server Setup == 1. upload contents to web folder&amp;quot;&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Server Setup ==&lt;br /&gt;
1. upload contents to web folder&lt;/div&gt;</summary>
		<author><name>Bacchas</name></author>
	</entry>
	<entry>
		<id>https://www.r512.com/index.php?title=AI_APPS&amp;diff=2963</id>
		<title>AI APPS</title>
		<link rel="alternate" type="text/html" href="https://www.r512.com/index.php?title=AI_APPS&amp;diff=2963"/>
		<updated>2026-05-29T16:14:50Z</updated>

		<summary type="html">&lt;p&gt;Bacchas: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;==[[PYTHONAPP]]==&lt;br /&gt;
==[[IMAGEBROWSER]]==&lt;/div&gt;</summary>
		<author><name>Bacchas</name></author>
	</entry>
	<entry>
		<id>https://www.r512.com/index.php?title=AI_APPS&amp;diff=2962</id>
		<title>AI APPS</title>
		<link rel="alternate" type="text/html" href="https://www.r512.com/index.php?title=AI_APPS&amp;diff=2962"/>
		<updated>2026-05-29T16:14:08Z</updated>

		<summary type="html">&lt;p&gt;Bacchas: Created page with &amp;quot;==PYTHONAPP==&amp;quot;&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;==[[PYTHONAPP]]==&lt;/div&gt;</summary>
		<author><name>Bacchas</name></author>
	</entry>
	<entry>
		<id>https://www.r512.com/index.php?title=Main_Page&amp;diff=2961</id>
		<title>Main Page</title>
		<link rel="alternate" type="text/html" href="https://www.r512.com/index.php?title=Main_Page&amp;diff=2961"/>
		<updated>2026-05-29T16:13:57Z</updated>

		<summary type="html">&lt;p&gt;Bacchas: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;==[[APPSHEET]]==&lt;br /&gt;
==[[AI APPS]]==&lt;br /&gt;
&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=PYTHONAPP&amp;diff=2960</id>
		<title>PYTHONAPP</title>
		<link rel="alternate" type="text/html" href="https://www.r512.com/index.php?title=PYTHONAPP&amp;diff=2960"/>
		<updated>2026-05-29T15:31:45Z</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;&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;
    DocumentRoot /var/www/html/domainfolder&lt;br /&gt;
#the proxy stuff below is needed if you are doing reverse proxy. not needed for a regular port 80 deployment&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;br /&gt;
== How to rebuild venv dir if deleted==&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
cd /path/to/karaapp          # your project dir&lt;br /&gt;
&lt;br /&gt;
# 1. Recreate the virtual environment&lt;br /&gt;
python3 -m venv venv&lt;br /&gt;
&lt;br /&gt;
# 2. Activate it&lt;br /&gt;
source venv/bin/activate&lt;br /&gt;
&lt;br /&gt;
# 3. Reinstall dependencies&lt;br /&gt;
pip install --upgrade pip&lt;br /&gt;
pip install -r requirements.txt&lt;br /&gt;
&lt;br /&gt;
# 4. Start the app (however you normally run it)&lt;br /&gt;
gunicorn app:app            # or: python app.py&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=2959</id>
		<title>PYTHONAPP</title>
		<link rel="alternate" type="text/html" href="https://www.r512.com/index.php?title=PYTHONAPP&amp;diff=2959"/>
		<updated>2026-05-08T18:19:01Z</updated>

		<summary type="html">&lt;p&gt;Bacchas: /* Configure Apache Reverse Proxy */&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;&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;
    DocumentRoot /var/www/html/domainfolder&lt;br /&gt;
#the proxy stuff below is needed if you are doing reverse proxy. not needed for a regular port 80 deployment&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=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>
</feed>