<?xml 
version="1.0" encoding="utf-8"?><?xml-stylesheet title="XSL formatting" type="text/xsl" href="https://golek-my-cloud.meatwar.com/spip.php?page=backend.xslt" ?>
<rss version="2.0" 
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:atom="http://www.w3.org/2005/Atom"
>

<channel xml:lang="en">
	<title>golek's cloud</title>
	<link>http://192.168.1.60:8081/</link>
	<description></description>
	<language>en</language>
	<generator>SPIP - www.spip.net</generator>
	<atom:link href="https://golek-my-cloud.meatwar.com/spip.php?page=backend" rel="self" type="application/rss+xml" />




<item xml:lang="en">
		<title>Software recap</title>
		<link>https://golek-my-cloud.meatwar.com/spip.php?article1</link>
		<guid isPermaLink="true">https://golek-my-cloud.meatwar.com/spip.php?article1</guid>
		<dc:date>2026-06-25T18:46:33Z</dc:date>
		<dc:format>text/html</dc:format>
		<dc:language>en</dc:language>
		<dc:creator>golek</dc:creator>



		<description>
&lt;p&gt;/golek_logs/mailcheck.log #(from /root/scripts/cronscripts/imap_bounce_checker.py &lt;br class='autobr' /&gt; tail -n 24 /golek_logs/mailcheck.log /golek_logs/startup.log #(from /root/scripts/startup.sh) &lt;br class='autobr' /&gt; tail -n 10 /golek_logs/startup.log /home/golek &lt;br class='autobr' /&gt;
1. Nothing there, I did all root. /usr/local/bin/icjsk &lt;br class='autobr' /&gt;
1. current version of my hashing code, works on Debian and macOS /usr/local/bin/mysendmail &lt;br class='autobr' /&gt; #!/usr/bin/env bash &lt;br class='autobr' /&gt;
if [ &#034;$#&#034; -lt 3 ]; then echo &#034;Error: Missing parameters.&#034; echo &#034;Usage: (&#8230;)&lt;/p&gt;


-
&lt;a href="https://golek-my-cloud.meatwar.com/spip.php?rubrique1" rel="directory"&gt;golekDEB&lt;/a&gt;


		</description>


 <content:encoded>&lt;div class='rss_texte'&gt;&lt;p&gt;&lt;strong&gt;/golek_logs/mailcheck.log #(from /root/scripts/cronscripts/imap_bounce_checker.py&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;&lt;code data-raccourci=&#034;code&#034; class='spip_code spip_code_inline' dir='ltr'&gt;tail -n 24 /golek_logs/mailcheck.log&lt;/code&gt;&lt;/p&gt;
&lt;hr class=&#034;spip&#034; /&gt;
&lt;p&gt;&lt;strong&gt;/golek_logs/startup.log #(from /root/scripts/startup.sh)&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;&lt;code data-raccourci=&#034;code&#034; class='spip_code spip_code_inline' dir='ltr'&gt;tail -n 10 /golek_logs/startup.log&lt;/code&gt;&lt;/p&gt;
&lt;hr class=&#034;spip&#034; /&gt;
&lt;p&gt;&lt;strong&gt;/home/golek&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;1. Nothing there, I did all root.&lt;/p&gt;
&lt;hr class=&#034;spip&#034; /&gt;
&lt;p&gt;&lt;strong&gt;/usr/local/bin/icjsk&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;1. current version of my hashing code, works on Debian and macOS&lt;/p&gt;
&lt;hr class=&#034;spip&#034; /&gt;
&lt;p&gt;&lt;strong&gt;/usr/local/bin/mysendmail&lt;/strong&gt;&lt;/p&gt;
&lt;div class=&#034;precode&#034;&gt;&lt;pre data-raccourci=&#034;code&#034; class='spip_code spip_code_block' dir='ltr' style='text-align:left;'&gt;&lt;code&gt;#!/usr/bin/env bash if [ &#034;$#&#034; -lt 3 ]; then echo &#034;Error: Missing parameters.&#034; echo &#034;Usage: mysendmail &lt;to-email&gt; &lt;subject&gt; &lt;body&gt;&#034; exit 1 fi local_target_to=&#034;$1&#034; local_raw_subject=&#034;$2&#034; local_raw_body=&#034;$3&#034; auth_file=&#034;$HOME/.ovh-mail.auth&#034; if [ ! -f &#034;$auth_file&#034; ]; then echo &#034;Failure: Configuration file '$auth_file' not found.&#034; exit 1 fi # Note: 'local' keyword is removed because we are no longer inside a function smtp_user=$(sed -n '1p' &#034;$auth_file&#034;) smtp_pass=$(sed -n '2p' &#034;$auth_file&#034;) # Format the multi-line string text cleanly formatted_body=$(echo -e &#034;$local_raw_body&#034;) # Execute swaks, hide text output, but capture its structural exit status swaks --server ssl0.ovh.net --port 465 --tlsc \ --auth LOGIN --auth-user &#034;$smtp_user&#034; --auth-password &#034;$smtp_pass&#034; \ --to &#034;$local_target_to&#034; --from &#034;$smtp_user&#034; \ --header &#034;Subject: $local_raw_subject&#034; \ --body &#034;$formatted_body&#034; &gt; /dev/null 2&gt;&amp;1 # Check the actual native exit status code of the swaks utility if [ $? -eq 0 ]; then echo &#034;Success&#034; exit 0 else echo &#034;Failure: Remote SMTP authentication or transaction rejected by mail daemon.&#034; exit 1 fi&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;hr class=&#034;spip&#034; /&gt;
&lt;p&gt;&lt;strong&gt;/root/scripts/startup.sh&lt;/strong&gt;&lt;/p&gt;
&lt;div class=&#034;precode&#034;&gt;&lt;pre data-raccourci=&#034;code&#034; class='spip_code spip_code_block' dir='ltr' style='text-align:left;'&gt;&lt;code&gt;#!/bin/bash # Add your custom startup commands below echo &#034;Startup script executed at $(date)&#034; &gt;&gt; /golek_logs/startup.log #improve ethernet connection ethtool -K enp4s0 rx-udp-gro-forwarding on rx-gro-list off&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;hr class=&#034;spip&#034; /&gt;
&lt;p&gt;&lt;strong&gt;/root/scripts/cronscripts/imap_bounce_checker.py&lt;/strong&gt;&lt;/p&gt;
&lt;div class=&#034;precode&#034;&gt;&lt;pre data-raccourci=&#034;code&#034; class='spip_code spip_code_block' dir='ltr' style='text-align:left;'&gt;&lt;code&gt;#!/usr/bin/env python3 import imaplib import email from email.header import decode_header import smtplib from email.mime.text import MIMEText import os from datetime import datetime # Configuration Settings IMAP_SERVER = &#034;ssl0.ovh.net&#034; IMAP_PORT = 993 SMTP_SERVER = &#034;ssl0.ovh.net&#034; SMTP_PORT = 465 FORWARD_TARGET = &#034;emailk@iclownd.com&#034; LOG_FILE = &#034;/golek_logs/mailcheck.log&#034; AUTH_FILE = os.path.expanduser(&#034;~/.ovh-mail.auth&#034;) def log_message(text): timestamp = datetime.now().strftime(&#034;%Y-%m-%d %H:%M:%S&#034;) with open(LOG_FILE, &#034;a&#034;) as f: f.write(f&#034;[{timestamp}] {text}\n&#034;) # Verify credentials exist if not os.path.exists(AUTH_FILE): log_message(&#034;CRITICAL ERROR: Credentials file ~/.ovh-mail.auth missing.&#034;) exit(1) with open(AUTH_FILE, &#034;r&#034;) as f: smtp_user = f.readline().strip() smtp_pass = f.readline().strip() try: # 1. Connect to OVH IMAP over SSL mail = imaplib.IMAP4_SSL(IMAP_SERVER, IMAP_PORT) mail.login(smtp_user, smtp_pass) mail.select(&#034;INBOX&#034;) # FIXED IMAP SEARCH: Only target UNREAD (UNSEEN) mail matching either bounce subject layout search_criterion = 'UNSEEN (OR SUBJECT &#034;Delivery Status Notification&#034; SUBJECT &#034;Undelivered Mail Returned to Sender&#034;)' status, data = mail.search(None, search_criterion) if status != &#034;OK&#034; or not data or data[0] == b'': # Exit cleanly if no new unread bounces are waiting log_message(&#034;Check complete: Nothing to do.&#034;) mail.logout() exit(0) # Convert byte list to space-separated array strings safely msg_ids = data[0].split() # 2. Connect to SMTP to handle forwarding alerts smtp = smtplib.SMTP_SSL(SMTP_SERVER, SMTP_PORT) smtp.login(smtp_user, smtp_pass) log_message(f&#034;Found {len(msg_ids)} new unread bounce notification(s). Processing...&#034;) for msg_id in msg_ids: res, msg_data = mail.fetch(msg_id, &#034;(RFC822)&#034;) for response_part in msg_data: if isinstance(response_part, tuple): raw_email = response_part[1] msg = email.message_from_bytes(raw_email) # Parse Subject Header safely decoded_parts = decode_header(msg[&#034;Subject&#034;] or &#034;&#034;) subject_fragments = [] for subject_bytes, encoding in decoded_parts: if isinstance(subject_bytes, bytes): subject_fragments.append(subject_bytes.decode(encoding or &#034;utf-8&#034;, errors=&#034;ignore&#034;)) else: # It's already a string (e.g. if the header wasn't encoded) subject_fragments.append(str(subject_bytes)) subject = &#034;&#034;.join(subject_fragments) log_message(f&#034;PROCESSING BOUNCE: {subject}&#034;) # Extract clean readable body text snippet, skipping raw attachment binaries clean_body = &#034;Could not extract plain text snippet.&#034; if msg.is_multipart(): for part in msg.walk(): if part.get_content_type() == &#034;text/plain&#034;: payload = part.get_payload(decode=True) if payload: clean_body = payload.decode('utf-8', errors='ignore') break else: payload = msg.get_payload(decode=True) if payload: clean_body = payload.decode('utf-8', errors='ignore') # Truncate content if excessively long to prevent massive relay sizes if len(clean_body) &gt; 10000: clean_body = clean_body[:10000] + &#034;\n\n...[Truncated Content / Large Attachments Stripped]...&#034; # Construct a clean summary email layout summary_text = ( f&#034;--- GOLEKDEB MAIL DELIVERY FAILURE DETECTED ---\n\n&#034; f&#034;Date Received: {msg['Date']}\n&#034; f&#034;Original Subject: {subject}\n&#034; f&#034;Diagnostic Details:\n\n&#034; f&#034;{clean_body}&#034; ) forward_msg = MIMEText(summary_text) forward_msg[&#034;Subject&#034;] = f&#034;FWD: Mail Delivery Failure Alert - {subject}&#034; forward_msg[&#034;From&#034;] = smtp_user forward_msg[&#034;To&#034;] = FORWARD_TARGET smtp.sendmail(smtp_user, FORWARD_TARGET, forward_msg.as_string()) log_message(f&#034;SUCCESS: Summary forwarded to {FORWARD_TARGET}&#034;) # SAFE: Just mark the message as read on the OVH server. Do NOT delete or expunge it. mail.store(msg_id, &#034;+FLAGS&#034;, &#034;\\Seen&#034;) smtp.quit() mail.logout() log_message(&#034;Hourly check complete. Messages marked as read.&#034;) except Exception as e: log_message(f&#034;RUNTIME EXCEPTION: {str(e)}&#034;) exit(1)&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;hr class=&#034;spip&#034; /&gt;
&lt;p&gt;&lt;strong&gt;/root/.ovh-mail.auth&lt;/strong&gt;&lt;/p&gt;
&lt;div class=&#034;precode&#034;&gt;&lt;pre data-raccourci=&#034;code&#034; class='spip_code spip_code_block' dir='ltr' style='text-align:left;'&gt;&lt;code&gt;server@mydotcom.com mypass&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;hr class=&#034;spip&#034; /&gt;
&lt;p&gt;&lt;strong&gt;/opt/websites/wp-cli.phar&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;1. CLI to update URLs wordpress wide&lt;br class='autobr' /&gt;
2. Download CLI: &lt;code data-raccourci=&#034;code&#034; class='spip_code spip_code_inline' dir='ltr'&gt;docker compose exec -w /var/www/html wordpress curl -O https://raw.githubusercontent.com/wp-cli/builds/gh-pages/phar/wp-cli.phar&lt;/code&gt;&lt;br class='autobr' /&gt;
3. Make executable: &lt;code data-raccourci=&#034;code&#034; class='spip_code spip_code_inline' dir='ltr'&gt;docker compose exec -w /var/www/html wordpress chmod +x wp-cli.phar&lt;/code&gt;&lt;br class='autobr' /&gt;
4. Dry-Run: &lt;code data-raccourci=&#034;code&#034; class='spip_code spip_code_inline' dir='ltr'&gt;docker compose exec -u www-data -w /var/www/html wordpress php wp-cli.phar search-replace 'myoldurl.com' 'mynewurl.com' --dry-run&lt;/code&gt;&lt;/p&gt;
&lt;hr class=&#034;spip&#034; /&gt;
&lt;p&gt;&lt;strong&gt;/opt/websites/gregoiredupond&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;1. updated with &lt;code data-raccourci=&#034;code&#034; class='spip_code spip_code_inline' dir='ltr'&gt;wp-cli.phar&lt;/code&gt; all urls to local &lt;code data-raccourci=&#034;code&#034; class='spip_code spip_code_inline' dir='ltr'&gt;192.168.1.60:9000&lt;/code&gt;&lt;br class='autobr' /&gt;
2. html alongside compose file&lt;br class='autobr' /&gt;
3. updated from WP 6 to WP 7 and updated plugins succesfully.&lt;br class='autobr' /&gt;
4. added to wp-config.php, to avoid JetPack using this local dev version:&lt;/p&gt;
&lt;div class=&#034;precode&#034;&gt;&lt;pre data-raccourci=&#034;code&#034; class='spip_code spip_code_block' dir='ltr' style='text-align:left;'&gt;&lt;code&gt;define('WP_DEBUG', false); define( 'JETPACK_DEV_DEBUG', true ); define( 'WP_ENVIRONMENT_TYPE', 'staging' );&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;5. /opt/websites/gregoiredupond/compose.yaml&lt;/p&gt;
&lt;div class=&#034;precode&#034;&gt;&lt;pre data-raccourci=&#034;code&#034; class='spip_code spip_code_block' dir='ltr' style='text-align:left;'&gt;&lt;code&gt;services: db: image: mariadb:10.11 restart: always environment: MYSQL_DATABASE: gysd_db MYSQL_USER: gysd_user MYSQL_PASSWORD: mypass MYSQL_ROOT_PASSWORD: mypass volumes: - db_data:/var/lib/mysql # This maps your local SQL file so the container imports it automatically - ./mysql-init:/docker-entrypoint-initdb.d wordpress: image: wordpress:latest restart: always ports: - &#034;9000:80&#034; environment: WORDPRESS_DB_HOST: db WORDPRESS_DB_NAME: gysd_db WORDPRESS_DB_USER: gysd_user WORDPRESS_DB_PASSWORD: mypass volumes: # Mounts your extracted OVH site directly into the container - ./html:/var/www/html depends_on: - db volumes: db_data:&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;hr class=&#034;spip&#034; /&gt;
&lt;p&gt;&lt;strong&gt;/opt/websites/bctimeslip&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;1. Need to update all URLs with &lt;code data-raccourci=&#034;code&#034; class='spip_code spip_code_inline' dir='ltr'&gt;wp-cli.phar&lt;/code&gt;&lt;br class='autobr' /&gt;
2. html alongside compose file&lt;br class='autobr' /&gt;
3. Do not update Wordpress or plugins&lt;br class='autobr' /&gt;
4. Add the debug and staging lines to &lt;code data-raccourci=&#034;code&#034; class='spip_code spip_code_inline' dir='ltr'&gt;wp-config.php&lt;/code&gt;&lt;br class='autobr' /&gt;
5. /opt/websites/gregoiredupond/compose.yaml&lt;/p&gt;
&lt;div class=&#034;precode&#034;&gt;&lt;pre data-raccourci=&#034;code&#034; class='spip_code spip_code_block' dir='ltr' style='text-align:left;'&gt;&lt;code&gt;services: db: image: mariadb:10.11 restart: always environment: MYSQL_DATABASE: skull_db MYSQL_USER: skull_user MYSQL_PASSWORD: mypass MYSQL_ROOT_PASSWORD: mypass volumes: - db_data:/var/lib/mysql # This maps your local SQL file so the container imports it automatically - ./mysql-init:/docker-entrypoint-initdb.d wordpress: image: wordpress:latest restart: always ports: - &#034;9001:80&#034; environment: WORDPRESS_DB_HOST: db WORDPRESS_DB_NAME: skull_db WORDPRESS_DB_USER: skull_user WORDPRESS_DB_PASSWORD: mypass volumes: # Mounts your extracted OVH site directly into the container - ./html:/var/www/html depends_on: - db volumes: db_data:&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;hr class=&#034;spip&#034; /&gt;
&lt;p&gt;&lt;strong&gt;/opt/websites/golek_spip&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;1. Installed Fresh, not a migration&lt;br class='autobr' /&gt;
2. html_data alongside compose file&lt;br class='autobr' /&gt;
3. /opt/websites/gregoiredupond/compose.yaml&lt;/p&gt;
&lt;div class=&#034;precode&#034;&gt;&lt;pre data-raccourci=&#034;code&#034; class='spip_code spip_code_block' dir='ltr' style='text-align:left;'&gt;&lt;code&gt;services: db: image: mariadb:10.11 container_name: spip_db restart: unless-stopped environment: MYSQL_ROOT_PASSWORD: azsxdcfv MYSQL_DATABASE: spip MYSQL_USER: spip_user MYSQL_PASSWORD: mypass volumes: - spip_db_data:/var/lib/mysql spip: image: ipeos/spip:latest container_name: spip_app restart: unless-stopped ports: - &#034;8081:80&#034; # Exposed strictly for your Tailscale/LAN testing environment: - SPIP_DB_SERVER=mysql - SPIP_DB_HOST=db - SPIP_DB_LOGIN=spip_user - SPIP_DB_PASS= mypass - SPIP_DB_NAME=spip volumes: - ./html_data:/var/www/html depends_on: - db # --- CLOUDFLARE TUNNEL (Uncomment when you have your domain) --- # cloudflared: # image: cloudflare/cloudflared:latest # container_name: spip_tunnel # restart: unless-stopped # command: tunnel run # environment: # - TUNNEL_TOKEN=your_cloudflare_tunnel_token_here volumes: spip_db_data:&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;hr class=&#034;spip&#034; /&gt;
&lt;p&gt;&lt;strong&gt;/opt/docker-containers/netdata/compose.yaml&lt;/strong&gt;&lt;/p&gt;
&lt;div class=&#034;precode&#034;&gt;&lt;pre data-raccourci=&#034;code&#034; class='spip_code spip_code_block' dir='ltr' style='text-align:left;'&gt;&lt;code&gt;services: netdata: image: netdata/netdata:stable container_name: netdata restart: unless-stopped pid: host network_mode: host healthcheck: disable: true environment: - DISABLE_TELEMETRY=1 cap_add: - SYS_PTRACE - SYS_ADMIN security_opt: - apparmor:unconfined volumes: - netdataconfig:/etc/netdata - netdatalib:/var/lib/netdata - netdatacache:/var/cache/netdata - /etc/passwd:/host/etc/passwd:ro - /etc/group:/host/etc/group:ro - /etc/localtime:/etc/localtime:ro - /proc:/host/proc:ro - /sys:/host/sys:ro - /etc/os-release:/host/etc/os-release:ro - /var/log:/host/var/log:ro - /var/run/docker.sock:/var/run/docker.sock:ro - ./stream.conf:/etc/netdata/stream.conf:ro volumes: netdataconfig: netdatalib: netdatacache:&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;hr class=&#034;spip&#034; /&gt;
&lt;p&gt;&lt;strong&gt;/opt/docker-containers/nextcloud/compose.yaml&lt;/strong&gt;&lt;/p&gt;
&lt;div class=&#034;precode&#034;&gt;&lt;pre data-raccourci=&#034;code&#034; class='spip_code spip_code_block' dir='ltr' style='text-align:left;'&gt;&lt;code&gt;services: nextcloud-aio-mastercontainer: image: nextcloud/all-in-one:latest init: true restart: unless-stopped container_name: nextcloud-aio-mastercontainer volumes: - nextcloud_aio_mastercontainer:/mnt/docker-aio-config - /var/run/docker.sock:/var/run/docker.sock:ro ports: - &#034;8080:8080&#034; environment: - APACHE_PORT=11000 - SKIP_DOMAIN_VALIDATION=true - AIO_COMMUNITY_CONTAINER=true - NEXTCLOUD_DATADIR=/mnt/data/nextcloud_data - AIO_DISABLE_REVERSE_PROXY_DETECTION=true volumes: nextcloud_aio_mastercontainer: name: nextcloud_aio_mastercontainer&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;hr class=&#034;spip&#034; /&gt;
&lt;p&gt;&lt;strong&gt;/opt/docker-containers/dozzle/compose.yaml&lt;/strong&gt;&lt;/p&gt;
&lt;div class=&#034;precode&#034;&gt;&lt;pre data-raccourci=&#034;code&#034; class='spip_code spip_code_block' dir='ltr' style='text-align:left;'&gt;&lt;code&gt;services: dozzle: container_name: dozzle image: amir20/dozzle:latest restart: always volumes: - /var/run/docker.sock:/var/run/docker.sock ports: - 8888:8080 environment: DOZZLE_USERNAME: dzgolek DOZZLE_PASSWORD: mypass&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;
		
		</content:encoded>


		

	</item>



</channel>

</rss>
