<?xml version="1.0" encoding="UTF-8"?><rss 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" version="2.0" xmlns:webfeeds="http://webfeeds.org/rss/1.0">
    <channel>
        <title><![CDATA[Zenius]]></title>
        <description><![CDATA[Zenius]]></description>
        <link>https://smartweb.tribeplatform.com</link>
        <image>
            <url>https://tribe-s3-production.imgix.net/7hDIiiA6SaqT2mrdYQBwI?fit=max&amp;w=500&amp;auto=compress,format</url>
            <title>Zenius</title>
            <link>https://smartweb.tribeplatform.com</link>
        </image>
        <generator>Bettermode RSS Generator</generator>
        <lastBuildDate>Thu, 09 Apr 2026 23:48:09 GMT</lastBuildDate>
        <atom:link href="https://smartweb.tribeplatform.com/rss/feed" rel="self" type="application/rss+xml"/>
        <pubDate>Thu, 09 Apr 2026 23:48:09 GMT</pubDate>
        <copyright><![CDATA[2026 Zenius]]></copyright>
        <language><![CDATA[en-US]]></language>
        <ttl>60</ttl>
        <webfeeds:icon>https://tribe-s3-production.imgix.net/7hDIiiA6SaqT2mrdYQBwI?fit=max&amp;w=500&amp;auto=compress,format</webfeeds:icon>
        <webfeeds:related layout="card" target="browser"/>
        <item>
            <title><![CDATA[Robust Self-host n8n installation]]></title>
            <description><![CDATA[sudo apt update

sudo apt upgrade


STEP 0: INSTALL DOCKER & DOCKER COMPOSE

Run the official installer:

curl -fsSL https://get.docker.com | sudo sh

Verify it’s the real "Docker-CE" (Production version):

docker...]]></description>
            <link>https://smartweb.tribeplatform.com/server/post/robust-self-host-n8n-installation-C56IrqnoGeESns8</link>
            <guid isPermaLink="true">https://smartweb.tribeplatform.com/server/post/robust-self-host-n8n-installation-C56IrqnoGeESns8</guid>
            <dc:creator><![CDATA[Rohit Agarwal]]></dc:creator>
            <pubDate>Sat, 07 Mar 2026 19:06:51 GMT</pubDate>
            <content:encoded><![CDATA[<p><code>sudo apt update</code></p><p><code>sudo apt upgrade</code></p><h2 class="text-xl" data-toc-id="0583cf4c-75f2-4a9c-a75d-279c57a6ef01" id="0583cf4c-75f2-4a9c-a75d-279c57a6ef01"><strong>Step 0: Install Docker &amp; Docker Compose</strong></h2><p><strong>Run the official installer:</strong></p><pre><code>curl -fsSL https://get.docker.com | sudo sh</code></pre><p><strong>Verify it’s the real "Docker-CE" (Production version):</strong></p><pre><code>docker version</code></pre><h2 class="text-xl" data-toc-id="c89ce32e-7d18-46cf-9c73-d574f133abdd" id="c89ce32e-7d18-46cf-9c73-d574f133abdd"><strong>Step 1: Create the Network</strong></h2><p>This connects all your containers together.</p><pre><code>docker network create all-n8n-net</code></pre><h2 class="text-xl" data-toc-id="35dd54e1-7d2c-46fa-bc0e-1d56b77cc3b4" id="35dd54e1-7d2c-46fa-bc0e-1d56b77cc3b4"><strong>Step 2: Create the Directory</strong></h2><pre><code>mkdir -p ~/n8n-stack &amp;&amp; cd ~/n8n-stack</code></pre><p><strong>location:</strong> /root/n8n-stack</p><h2 class="text-xl" data-toc-id="83192417-8734-4967-8c6d-1ba7e36b0015" id="83192417-8734-4967-8c6d-1ba7e36b0015"><strong>Step 3: Create </strong><code>nginx.conf</code></h2><p>Copy and paste this entire block:</p><pre><code>cat &lt;&lt;EOF &gt; nginx.conf
events {}
http {
    server {
        listen 443 ssl;
        server_name subdomain.domain.com;

        # Internal paths for auto-generated certs
        ssl_certificate /etc/nginx/certs/server.crt;
        ssl_certificate_key /etc/nginx/certs/server.key;

        location / {
            proxy_pass http://n8n-main:5678;
            proxy_set_header Host \$host;
            proxy_set_header X-Real-IP \$remote_addr;
            proxy_set_header X-Forwarded-For \$proxy_add_x_forwarded_for;
            proxy_set_header X-Forwarded-Proto \$scheme;

            # WebSocket Support
            proxy_http_version 1.1;
            proxy_set_header Upgrade \$http_upgrade;
            proxy_set_header Connection "upgrade";
            
            proxy_read_timeout 600s;
        }
    }
}
EOF</code></pre><p><strong>3. Create the Complete </strong><code>docker-compose.yml</code><br><br>Copy and paste this entire block:</p><pre><code>cat &lt;&lt;EOF &gt; docker-compose.yml
services:
  nginx:
    image: nginx:latest
    restart: always
    ports:
      - "80:80"
      - "443:443"
    volumes:
      - ./nginx.conf:/etc/nginx/nginx.conf:ro
    networks: [all-n8n-net]
    entrypoint: &gt;
      /bin/sh -c "mkdir -p /etc/nginx/certs &amp;&amp;
      openssl req -x509 -nodes -days 365 -newkey rsa:2048 \\
      -keyout /etc/nginx/certs/server.key \\
      -out /etc/nginx/certs/server.crt \\
      -subj '/CN=subdomain.domain.com' &amp;&amp;
      exec nginx -g 'daemon off;'"

  redis:
    image: redis:7-alpine
    restart: always
    networks: [all-n8n-net]
    command: redis-server --maxmemory 512mb --maxmemory-policy allkeys-lru

  browserless:
    image: browserless/chrome:latest
    restart: always
    environment:
      - MAX_CONCURRENT_SESSIONS=10
    networks: [all-n8n-net]

  n8n-main:
    image: n8nio/n8n:latest
    restart: always
    networks: [all-n8n-net]
    environment:
      - TZ=Asia/Kolkata
      - NODEJS_PREFER_IPV4=true
      - N8N_ENCRYPTION_KEY=XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
      - N8N_HOST=subdomain.domain.com
      - N8N_PROTOCOL=https
      - WEBHOOK_URL=https://subdomain.domain.com
      - N8N_PROXY_HOPS=1
      - NODE_ENV=production
      - EXECUTIONS_MODE=queue
      - OFFLOAD_MANUAL_EXECUTIONS_TO_WORKERS=true
      - QUEUE_BULL_REDIS_HOST=redis
      - DB_TYPE=postgresdb
      - DB_POSTGRESDB_HOST=aws-1-us-east-1.pooler.supabase.com
      - DB_POSTGRESDB_PORT=6543
      - DB_POSTGRESDB_DATABASE=postgres
      - DB_POSTGRESDB_SCHEMA=n8n
      - DB_POSTGRESDB_USER=postgres.XXXXXXXXXXXXXX
      - DB_POSTGRESDB_PASSWORD=XXXXXXXXXXXXXXXXXXX
      - DB_POSTGRESDB_SSL_ENABLED=true
      - DB_POSTGRESDB_SSL_REJECT_UNAUTHORIZED=false
      - N8N_PAYLOAD_SIZE_MAX=50
      - N8N_PUPPETEER_BROWSERLESS_URL=http://browserless:3000
      - N8N_EXPRESS_TRUST_PROXY=true
    depends_on:
      - redis
      - browserless

  n8n-worker:
    image: n8nio/n8n:latest
    command: worker
    restart: always
    networks: [all-n8n-net]
    environment:
      - TZ=Asia/Kolkata
      - NODEJS_PREFER_IPV4=true
      - N8N_ENCRYPTION_KEY=XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
      - EXECUTIONS_MODE=queue
      - QUEUE_BULL_REDIS_HOST=redis
      - DB_TYPE=postgresdb
      - DB_POSTGRESDB_HOST=aws-1-us-east-1.pooler.supabase.com
      - DB_POSTGRESDB_PORT=6543
      - DB_POSTGRESDB_DATABASE=postgres
      - DB_POSTGRESDB_SCHEMA=n8n
      - DB_POSTGRESDB_USER=postgres.XXXXXXXXXXXXXX
      - DB_POSTGRESDB_PASSWORD=XXXXXXXXXXXXXXXXXXX
      - DB_POSTGRESDB_SSL_ENABLED=true
      - DB_POSTGRESDB_SSL_REJECT_UNAUTHORIZED=false
      - N8N_PUPPETEER_BROWSERLESS_URL=http://browserless:3000
    depends_on:
      - n8n-main
      - redis

networks:
  all-n8n-net:
    external: true
EOF</code></pre><h2 class="text-xl" data-toc-id="fe55cc60-bd71-4511-a523-c720fd48ac8d" id="fe55cc60-bd71-4511-a523-c720fd48ac8d"><strong>4. Final Execution</strong></h2><pre><code>chmod 600 docker-compose.yml nginx.conf
docker compose up -d</code></pre>]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[Email Domain Masking in Cloudflare]]></title>
            <description><![CDATA[Required: Cloudflare A record for non-www and www should point to 192.0.2.1 with "proxied" enabled.

Step 1: Go to AI Crawl Control >> Select all the "Crawler" >> Block >> Confirm

Step 2: Go to Rules >> ...]]></description>
            <link>https://smartweb.tribeplatform.com/server/post/email-domain-masking-in-cloudflare-BhID2VkKhRBwth2</link>
            <guid isPermaLink="true">https://smartweb.tribeplatform.com/server/post/email-domain-masking-in-cloudflare-BhID2VkKhRBwth2</guid>
            <dc:creator><![CDATA[Rohit Agarwal]]></dc:creator>
            <pubDate>Thu, 04 Dec 2025 13:29:28 GMT</pubDate>
            <content:encoded><![CDATA[<p><strong>Required:</strong> Cloudflare A record for non-www and www should point to 192.0.2.1 with "proxied" enabled.</p><p><strong>Step 1:</strong> Go to AI Crawl Control &gt;&gt; Select all the "Crawler" &gt;&gt; Block &gt;&gt; Confirm</p><p><strong>Step 2: </strong>Go to Rules &gt;&gt; Overview &gt;&gt; Delete/Disable existing redirect rule (if exists) - <strong>But don't delete managed rules (i.e.: kind = managed)</strong></p><p><strong>Step 3:</strong> Go to SSL/TLS &gt;&gt; Overview &gt;&gt; Configure &gt;&gt; Custom SSL/TLS &gt;&gt; Full (Strict)</p><p><strong>Step 4:</strong> Go to SSL/TLS &gt;&gt; Edge Certificates &gt;&gt; Always Use HTTPS &gt;&gt; Disable</p><p><strong>Step 5:</strong> Go to Security &gt;&gt; Settings &gt;&gt; Block AI bots &gt;&gt; Edit (Pencil icon) &gt;&gt; Select "Block on all pages" &gt;&gt; Save</p><p><strong>Step 6:</strong> Go to Security &gt;&gt; Settings &gt;&gt; Bot fight mode &gt;&gt; Enable</p><p><strong>Step 7:</strong> Go to Security &gt;&gt; Security rules &gt;&gt; Create rule &gt;&gt; Custom rules</p><p>Rule name: Block hostname</p><p>Field: Hostname</p><p>Operator: wildcard</p><pre><code>Value: *domain.com</code></pre><p>Choose action: Managed Challenge</p><p>Select order: First (if option available)</p><p><strong>Step 8:</strong> Go to Workers Routes &gt;&gt; Manage Workers &gt;&gt; Create Application &gt;&gt; Start with Hello World! &gt;&gt; Enter "Worker name" as domain (without extension) &gt;&gt; Deploy &gt;&gt; Edit code &gt;&gt; Replace existing code with the below &gt;&gt; Deploy &gt;&gt; Go to back page.</p><pre><code>// The destination domain you want to redirect to
const DESTINATION_URL = "https://maindomain.com";

export default {
  async fetch(request) {
    const url = new URL(request.url);

    // Check if the request is already going to the destination to prevent loops
    if (url.hostname === new URL(DESTINATION_URL).hostname) {
      return fetch(request); // Just handle the request normally
    }

    // Check for the cf_clearance cookie, which is set AFTER a human passes a WAF challenge
    const cookieHeader = request.headers.get('Cookie');
    const hasClearanceCookie = cookieHeader &amp;&amp; cookieHeader.includes('cf_clearance');

    if (hasClearanceCookie) {
      // If the user has passed the challenge (has the cookie), redirect them
      return Response.redirect(DESTINATION_URL, 302);
    } else {
      // If no clearance cookie is present, allow the request to proceed normally
      // so that Cloudflare's WAF/Bot Fight Mode can intercept and issue the challenge.
      // After they pass the challenge, the cookie will be set for the next request.
      return fetch(request);
    }
  },
};</code></pre><p></p><p><strong>Step 9: </strong>Go to Workers &amp; Pages &gt;&gt; Click the domain name &gt;&gt; Settings &gt;&gt; Domains &amp; Routes &gt;&gt; Click Add &gt;&gt; Route</p><p>Zone: Domain</p><pre><code>Route: *domain.com/* (make sure to add the wildcard and slash as mentioned)</code></pre><p>Failure mode: Fail closed (block)</p><p>&gt;&gt; Click "Add route".</p>]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[How to list all mailaddresses in Azure using CLI?]]></title>
            <description><![CDATA[resource_group="Email"
email_service="outreachEmail"

domains=(
    "domain1.com"
    "domain2.com"
)

declare -A domain_counts
total_usernames=0

for domain in "${domains[@]}"; do
    echo "🔎 Domain: $domain"
    count...]]></description>
            <link>https://smartweb.tribeplatform.com/server/post/how-to-list-all-mailaddresses-in-azure-using-cli-vqSqFHTIPwMuIpN</link>
            <guid isPermaLink="true">https://smartweb.tribeplatform.com/server/post/how-to-list-all-mailaddresses-in-azure-using-cli-vqSqFHTIPwMuIpN</guid>
            <dc:creator><![CDATA[Rohit Agarwal]]></dc:creator>
            <pubDate>Fri, 03 Oct 2025 10:01:18 GMT</pubDate>
            <content:encoded><![CDATA[<pre><code>resource_group="Email"
email_service="outreachEmail"

domains=(
    "domain1.com"
    "domain2.com"
)

declare -A domain_counts
total_usernames=0

for domain in "${domains[@]}"; do
    echo "🔎 Domain: $domain"
    count=$(az communication email domain sender-username list \
        --domain-name "$domain" \
        --email-service-name "$email_service" \
        --resource-group "$resource_group" \
        --query "length(@)" \
        --output tsv)
    total_usernames=$((total_usernames + count))
    domain_counts["$domain"]=$count
    az communication email domain sender-username list \
        --domain-name "$domain" \
        --email-service-name "$email_service" \
        --resource-group "$resource_group" \
        --output table
    echo
done

echo "======================================="
echo "MailFrom address summary:"
for domain in "${domains[@]}"; do
    echo "MailFrom addresses in $domain: ${domain_counts[$domain]}"
done
echo "---------------------------------------"
echo "Total number of domains: ${#domains[@]}"
echo "Total number of MailFrom addresses: $total_usernames"
echo "======================================="
</code></pre>]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[How to create users in ACS in CLI]]></title>
            <description><![CDATA[display_name=""
email_service="outreachEmail"
resource_group="Email"

domains=(
"domain1.com"
"domain2.com"
)

usernames=(
"username1"
"username2"
)

for domain in "${domains[@]}"; do
    read -p "Run sender...]]></description>
            <link>https://smartweb.tribeplatform.com/server/post/how-to-create-users-in-acs-in-cli-7BeQ0dNj4kjV3eA</link>
            <guid isPermaLink="true">https://smartweb.tribeplatform.com/server/post/how-to-create-users-in-acs-in-cli-7BeQ0dNj4kjV3eA</guid>
            <dc:creator><![CDATA[Rohit Agarwal]]></dc:creator>
            <pubDate>Wed, 01 Oct 2025 10:35:10 GMT</pubDate>
            <content:encoded><![CDATA[<pre><code>display_name=""
email_service="outreachEmail"
resource_group="Email"

domains=(
"domain1.com"
"domain2.com"
)

usernames=(
"username1"
"username2"
)

for domain in "${domains[@]}"; do
    read -p "Run sender-username creation for domain '$domain'? (y/n): " confirm
    if [[ "$confirm" =~ ^[Yy]$ ]]; then
        for username in "${usernames[@]}"; do
            echo "Processing: ${username}@${domain} ..."
            az communication email domain sender-username create \
                --domain-name "$domain" \
                --email-service-name "$email_service" \
                --resource-group "$resource_group" \
                --sender-username "$username" \
                --username "$username" \
                --display-name "$display_name"
            sleep 1
        done
    else
        echo "Skipping domain: $domain"
    fi
done

echo "✅ All selected domains processed."</code></pre><p><br><strong>Change below details in the above code; then copy-paste the above code in Azure CLI.</strong></p><pre><code>display_name=""
email_service="outreachEmail"
resource_group="Email"

domains=(
"domain1.com"
"domain2.com"
)

usernames=(
"username1"
"username2"
)</code></pre><p></p>]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[How to delete usernames from ACS]]></title>
            <description><![CDATA[# Run this directly in Azure CLI / Azure Cloud Shell
senders=(
"username1"
"username2"
)

for sender in "${senders[@]}"; do
    az communication email domain sender-username delete \
        --email-service-name "...]]></description>
            <link>https://smartweb.tribeplatform.com/server/post/how-to-delete-usernames-from-acs-n5zbV4cHG6MlURC</link>
            <guid isPermaLink="true">https://smartweb.tribeplatform.com/server/post/how-to-delete-usernames-from-acs-n5zbV4cHG6MlURC</guid>
            <dc:creator><![CDATA[Rohit Agarwal]]></dc:creator>
            <pubDate>Wed, 01 Oct 2025 10:22:59 GMT</pubDate>
            <content:encoded><![CDATA[<pre><code># Run this directly in Azure CLI / Azure Cloud Shell
senders=(
"username1"
"username2"
)

for sender in "${senders[@]}"; do
    az communication email domain sender-username delete \
        --email-service-name "outreachEmail" \
        --resource-group "Email" \
        --domain-name "domain.com" \
        --sender-username "$sender" \
        --yes
    echo "Deleted sender: $sender"
done</code></pre><p></p><p><strong>Replace below:</strong></p><ul><li><p>email-service-name</p></li><li><p>resource-group</p></li><li><p><strong>domain-name</strong></p></li><li><p><strong>senders list (usernames)</strong></p></li></ul>]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[Google Workspace Admin Automation: Manual Settings for Setting Up n8n Automation]]></title>
            <description><![CDATA[A. CREATE A SERVICE ACCOUNT IN GOOGLE CLOUD CONSOLE

 1. Go to the Google Cloud Console [https://console.cloud.google.com/].

 2. Create a new project (top left corner) by adding a 'Project Name' like Robomotion or n8n.

 3. In the left sidebar (...]]></description>
            <link>https://smartweb.tribeplatform.com/robomotion/post/google-workspace-admin-automation-manual-settings-for-setting-up-n8n-u4DY8Vqm6aE99K5</link>
            <guid isPermaLink="true">https://smartweb.tribeplatform.com/robomotion/post/google-workspace-admin-automation-manual-settings-for-setting-up-n8n-u4DY8Vqm6aE99K5</guid>
            <dc:creator><![CDATA[Rohit Agarwal]]></dc:creator>
            <pubDate>Mon, 29 Sep 2025 10:48:20 GMT</pubDate>
            <content:encoded><![CDATA[<h2 class="text-xl" data-toc-id="2265e9ef-8388-458a-84cb-4a35c5c97901" id="2265e9ef-8388-458a-84cb-4a35c5c97901"><strong>A. Create a Service Account in Google Cloud Console</strong></h2><ol><li><p>Go to the <a class="text-interactive hover:text-interactive-hovered" rel="noopener noreferrer nofollow" href="https://console.cloud.google.com/">Google Cloud Console</a>.</p></li><li><p>Create a new project (top left corner) by adding a 'Project Name' like Robomotion or n8n.</p></li><li><p>In the left sidebar (hamburger icon), navigate to:<br>IAM &amp; Admin → Service Accounts</p></li><li><p>Click “+ Create Service Account”.</p><ol><li><p>Name: Choose a clear, unique name (e.g., n8n-workflow-sa)</p></li><li><p>ID: Auto-generated or customize as desired</p></li><li><p>Click Done</p></li></ol></li></ol><hr><h2 class="text-xl" data-toc-id="e7ae6b7d-bcc7-4b87-b6c5-8c108a815da8" id="e7ae6b7d-bcc7-4b87-b6c5-8c108a815da8"><strong>B. Create and Download a Private Key</strong></h2><ol><li><p>In the Service Accounts list, click your new account.</p></li><li><p>Go to the “Keys” tab.</p></li><li><p>Click “Add Key” &gt; “Create new key”.</p></li><li><p>Select JSON and click Create.</p></li><li><p>It will also download the JSON key to your downloads folder.</p><ol><li><p>Now, open the dowloaded key (txt file) and copy the part between '-----BEGIN PRIVATE KEY----- &lt;your_key&gt;-----END PRIVATE KEY-----'</p></li><li><p>You need to replace the '\n' in the key with an actual line break; to do that:</p><ol><li><p>Open notepad++ and paste the key there.</p></li><li><p>Use the below setting as shown in image &amp; it will do the work.</p><p></p><figure data-align="center" data-size="best-fit" data-id="ZhhWVhgo83NAyFaMkzHY6" data-version="v2" data-type="image"><img data-id="ZhhWVhgo83NAyFaMkzHY6" src="https://tribe-s3-production.imgix.net/ZhhWVhgo83NAyFaMkzHY6?auto=compress,format"></figure></li></ol></li><li><p>Save this new key file as it will now be used in your n8n workflows to retrieve the access tokens.</p></li></ol></li></ol><hr><h2 class="text-xl" data-toc-id="1a109b9e-5680-4315-abcd-5cdb5c38461e" id="1a109b9e-5680-4315-abcd-5cdb5c38461e"><strong>C. Enable Domain-Wide Delegation</strong></h2><ol><li><p>In your service account page, in the 'Details' tab, click “Advanced settings”.</p></li><li><p>Note the Client ID displayed.</p><figure data-align="center" data-size="best-fit" data-id="a0XIj1cYGbPRb7KSEdlwe" data-version="v2" data-type="image"><img data-id="a0XIj1cYGbPRb7KSEdlwe" src="https://tribe-s3-production.imgix.net/a0XIj1cYGbPRb7KSEdlwe?auto=compress,format"></figure></li><li><p>You’ll use this in the Google Workspace Admin steps below.</p></li></ol><hr><h2 class="text-xl" data-toc-id="6f856bb5-0763-456b-95df-28d56039ae8c" id="6f856bb5-0763-456b-95df-28d56039ae8c"><strong>D. Enable Required Google APIs</strong></h2><p>In the Cloud Console, enable <a class="text-interactive hover:text-interactive-hovered" rel="noopener noreferrer nofollow" href="https://console.cloud.google.com/apis/library/admin.googleapis.com">Admin SDK API</a></p><ul><li><p><strong>Required for:</strong></p><ul><li><p>Managing users (add/remove emails, manage user accounts)</p></li><li><p>Managing domains (add/remove verified domains to Google Workspace)</p></li><li><p>Managing groups, organizational units, directory resources, etc.</p></li></ul></li></ul><hr><h2 class="text-xl" data-toc-id="da15f332-77eb-4aa9-ad37-29928b7f0878" id="da15f332-77eb-4aa9-ad37-29928b7f0878"><strong>E. Grant API Scopes in the Google Admin Console</strong></h2><ol><li><p>Go <a class="text-interactive hover:text-interactive-hovered" rel="noopener noreferrer nofollow" href="https://admin.google.com/ac/owl/domainwidedelegation">https://admin.google.com/ac/owl/domainwidedelegation</a></p></li><li><p>Click “<strong>Add new</strong>”.</p></li><li><p>Enter the <strong>Client ID</strong> of your service account (from above).</p></li><li><p>Enter the below scopes that your workflow will use, e.g.:</p><ul><li><p>https://www.googleapis.com/auth/admin.directory.user</p></li><li><p>https://www.googleapis.com/auth/admin.directory.domain</p></li></ul></li><li><p>Click Authorize.</p></li></ol><hr><h2 class="text-xl" data-toc-id="c5cd9b6b-c130-45a2-a5d4-db52cae474c3" id="c5cd9b6b-c130-45a2-a5d4-db52cae474c3"><strong>F. Notes (for Every Workspace):</strong></h2><ol><li><p>Service account’s Client ID must be entered in each Google Workspace’s Admin Console domain-wide delegation page.</p></li><li><p>All required OAuth scopes must be listed in the Admin Console for the Client ID.</p></li><li><p>A valid admin user’s email (the sub claim) must be known and used in the JWT.</p></li><li><p>If you add new scopes or use in a new Google Workspace, repeat step E.</p></li><li><p>If you renew the private key, update your n8n workflow with the new key.</p></li></ol><p>&nbsp;</p>]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[How to send an email and then forward incoming email with Azure Communication Services for cold emailing]]></title>
            <description><![CDATA[https://www.youtube.com/watch?v=Q2RRqgy_G9g [https://www.youtube.com/watch?v=Q2RRqgy_G9g]

Forward Emails Using Azure
https://koka-tic.medium.com/forward-emails-using-azure-094ea7cdda8a [https://koka-tic.medium.com/forward-emails-using-azure-094ea7cdda8a]

This tutorial will guide you through the process of forwarding ...]]></description>
            <link>https://smartweb.tribeplatform.com/server/post/how-to-send-an-email-and-then-forward-incoming-email-with-azure-ziKHez6VvcSbZU3</link>
            <guid isPermaLink="true">https://smartweb.tribeplatform.com/server/post/how-to-send-an-email-and-then-forward-incoming-email-with-azure-ziKHez6VvcSbZU3</guid>
            <dc:creator><![CDATA[Rohit Agarwal]]></dc:creator>
            <pubDate>Wed, 10 Sep 2025 05:54:48 GMT</pubDate>
            <content:encoded><![CDATA[<p><a class="text-interactive hover:text-interactive-hovered" rel="noopener noreferrer nofollow" href="https://www.youtube.com/watch?v=Q2RRqgy_G9g">https://www.youtube.com/watch?v=Q2RRqgy_G9g</a></p><p><strong>Forward Emails Using Azure</strong><br><a class="text-interactive hover:text-interactive-hovered" rel="noopener noreferrer nofollow" href="https://koka-tic.medium.com/forward-emails-using-azure-094ea7cdda8a">https://koka-tic.medium.com/forward-emails-using-azure-094ea7cdda8a</a></p><p>This tutorial will guide you through the process of forwarding emails using Azure, without relying on third-party services. We will leverage Azure DNS and Azure Communication Services (ACS) to achieve this.</p><h2 class="text-xl" data-toc-id="bd241a0a-d2d9-4c25-ba63-8077e13435c6" id="bd241a0a-d2d9-4c25-ba63-8077e13435c6"><strong>What You’ll Need:</strong></h2><ol><li><p>A registered custom domain (e.g., <code>yourdomain.com</code>).</p></li><li><p>Azure subscription with DNS Zone management.</p></li><li><p>Azure Communication Services (ACS) resource.</p></li><li><p>Basic knowledge of Azure Functions for automation.</p></li></ol><h2 class="text-xl" data-toc-id="f23fdd47-89da-493c-9a72-9692bb08d3f3" id="f23fdd47-89da-493c-9a72-9692bb08d3f3"><strong>Step 1: Add and Verify Your Domain in Azure</strong></h2><h3 class="text-lg" data-toc-id="2057633e-8f53-4776-9f77-b9ec657793dd" id="2057633e-8f53-4776-9f77-b9ec657793dd"><strong>1. Add Your Domain</strong></h3><p><strong>Log in to Azure Portal</strong>:</p><ul><li><p>Navigate to <a class="text-interactive hover:text-interactive-hovered" rel="noopener ugc nofollow" href="https://portal.azure.com/"><u>Azure Portal</u></a>.</p></li></ul><p><strong>Go to Azure Active Directory</strong>:</p><ul><li><p>In the left menu, select <strong>Azure Active Directory</strong>.</p></li></ul><p><strong>Add a Custom Domain</strong>:</p><ul><li><p>Under <strong>Custom Domain Names</strong>, click <strong>Add custom domain</strong>.</p></li><li><p>Enter your domain name (e.g., <code>yourdomain.com</code>) and click <strong>Add</strong>.</p></li></ul><h2 class="text-xl" data-toc-id="5f8619bd-175f-4a48-b54a-0d2b03cccc2d" id="5f8619bd-175f-4a48-b54a-0d2b03cccc2d"><strong>2. Verify Your Domain</strong></h2><p><strong>Get the TXT Record for Verification</strong>:</p><ul><li><p>Azure will provide a <strong>TXT record</strong> to verify your domain.</p></li></ul><p><strong>Add TXT Record in Azure DNS</strong>:</p><ul><li><p>If your domain is hosted in Azure:</p></li><li><p>Navigate to <strong>DNS Zones</strong> → Select your domain.</p></li><li><p>Add a TXT record as follows:</p></li><li><p>Name: <code>@</code> or <code>_acme-challenge</code></p></li><li><p>Type: <code>TXT</code></p></li><li><p>TTL: <code>3600</code></p></li><li><p>Value: (provided by Azure).</p></li></ul><p><strong>Complete Verification</strong>:</p><ul><li><p>Return to Azure Active Directory → Custom Domain Names.</p></li><li><p>Click <strong>Verify</strong> once the DNS changes propagate (this may take a few minutes).</p></li></ul><h2 class="text-xl" data-toc-id="6807f9f8-fb30-45eb-8530-a574284ee4b1" id="6807f9f8-fb30-45eb-8530-a574284ee4b1"><strong>Step 2: Set Up Azure DNS for Email Forwarding</strong></h2><h2 class="text-xl" data-toc-id="dff88945-4e4d-4a17-9124-df5179af022a" id="dff88945-4e4d-4a17-9124-df5179af022a"><strong>1. Configure MX Records</strong></h2><ol><li><p>Navigate to <strong>DNS Zones</strong> → Select your domain.</p></li><li><p>Add the following MX records:</p></li></ol><ul><li><p>Name: <code>@</code></p></li><li><p>Type: <code>MX</code></p></li><li><p>TTL: <code>3600</code></p></li><li><p>Priority: <code>10</code></p></li><li><p>Value: The endpoint for Azure Communication Services (you’ll get this when setting up ACS).</p></li></ul><h2 class="text-xl" data-toc-id="88094227-4f65-41e0-a885-36453b78450c" id="88094227-4f65-41e0-a885-36453b78450c"><strong>2. Add SPF Record (Optional but Recommended)</strong></h2><ol><li><p>Add a <strong>TXT Record</strong> to improve email deliverability:</p></li></ol><ul><li><p>Name: <code>@</code></p></li><li><p>Type: <code>TXT</code></p></li><li><p>Value: <code>v=spf1 include:spf.protection.outlook.com ~all</code>.</p></li></ul><h2 class="text-xl" data-toc-id="e9cb4796-34ab-4413-8023-4c63b48a5b76" id="e9cb4796-34ab-4413-8023-4c63b48a5b76"><strong>Step 3: Enable Azure Communication Services (ACS)</strong></h2><h2 class="text-xl" data-toc-id="0cea3fc8-f8ca-400f-8522-52b62769b709" id="0cea3fc8-f8ca-400f-8522-52b62769b709"><strong>1. Create an ACS Resource</strong></h2><ul><li><p>In the Azure Portal, create a new <strong>Azure Communication Services</strong> resource.</p></li></ul><p>Go to <strong>Create a resource</strong> → Search for <strong>Azure Communication Services</strong> → Click <strong>Create</strong>.</p><ul><li><p>Configure the resource and deploy it.</p></li></ul><h2 class="text-xl" data-toc-id="4f6a2844-586b-4522-b569-72fd847fe1f9" id="4f6a2844-586b-4522-b569-72fd847fe1f9"><strong>2. Enable Email Capability</strong></h2><ol><li><p>Navigate to the ACS resource → <strong>Email</strong> → Enable the email service.</p></li><li><p>Verify your domain for ACS by adding the required DNS records (Azure will provide these during setup):</p></li></ol><p>Example:</p><ul><li><p>Name: <code>@</code></p></li><li><p>Type: <code>TXT</code></p></li><li><p>Value: Verification string from Azure.</p></li></ul><h2 class="text-xl" data-toc-id="4031b635-8eec-4768-aeea-88c354aba0a2" id="4031b635-8eec-4768-aeea-88c354aba0a2"><strong>Step 4: Automate Email Forwarding with Azure Functions</strong></h2><h2 class="text-xl" data-toc-id="bd8fbe1e-3095-4d53-a758-22110614411c" id="bd8fbe1e-3095-4d53-a758-22110614411c"><strong>1. Create an Azure Function App</strong></h2><ol><li><p>Navigate to the Azure Portal → <strong>Function App</strong> → Click <strong>Create</strong>.</p></li><li><p>Choose the runtime (e.g., Python, Node.js, or C#) and configure the Function App.</p></li></ol><h2 class="text-xl" data-toc-id="157fc3b6-7fe6-47e6-8fe9-341bfae53267" id="157fc3b6-7fe6-47e6-8fe9-341bfae53267"><strong>2. Write the Forwarding Logic</strong></h2><p>Here’s an example using Python:</p><h3 class="text-lg" data-toc-id="d1185b23-857e-4033-80ce-9b4a1717f111" id="d1185b23-857e-4033-80ce-9b4a1717f111"><strong>Install Dependencies:</strong></h3><pre><code>pip install azure-communication-email</code></pre><p>Example:</p><pre><code>from azure.communication.email import EmailClient

def main(req):
    connection_string = "YOUR_ACS_CONNECTION_STRING"
    email_client = EmailClient.from_connection_string(connection_string)

    # Email details
    to_address = "your-gmail@gmail.com"
    from_address = "forwarded@yourdomain.com"
    subject = "Forwarded Email"
    body = "This is a forwarded email."

    email_message = {
        "content": {
            "subject": subject,
            "plainText": body,
        },
        "recipients": {
            "to": [{"address": to_address}]
        },
        "senderAddress": from_address
    }

    response = email_client.send(email_message)
    return response</code></pre><h2 class="text-xl" data-toc-id="147cc48b-e1ba-45a2-aff4-119acf374394" id="147cc48b-e1ba-45a2-aff4-119acf374394"><strong>3. Deploy the Function App</strong></h2><ol><li><p>Deploy the function to Azure.</p></li><li><p>Configure the function to trigger when an email is received.</p></li></ol><h2 class="text-xl" data-toc-id="6498b0b7-2782-426a-9031-a8bd6981aa25" id="6498b0b7-2782-426a-9031-a8bd6981aa25"><strong>Step 5: Test the Configuration</strong></h2><ol><li><p>Send an email to an address on your domain (e.g., <code>info@yourdomain.com</code>).</p></li><li><p>Verify that the email is forwarded to your Gmail.</p></li></ol><h2 class="text-xl" data-toc-id="b0367f19-d0e1-4da7-9d17-3c84012a525a" id="b0367f19-d0e1-4da7-9d17-3c84012a525a"><strong>Cost Considerations</strong></h2><p><strong>Azure DNS</strong>:</p><ul><li><p>~$0.50/month per zone.</p></li></ul><p><strong>Azure Communication Services</strong></p><ul><li><p>$0.00025 per email sent.</p></li></ul><p><a class="text-interactive hover:text-interactive-hovered" rel="noopener noreferrer nofollow" href="https://learn.microsoft.com/en-us/azure/communication-services/concepts/service-limits">https://learn.microsoft.com/en-us/azure/communication-services/concepts/service-limits</a><br></p><figure data-align="center" data-size="best-fit" data-id="xRIqr1UEjsZpmuPPvFrd4" data-version="v2" data-type="image"><img data-id="xRIqr1UEjsZpmuPPvFrd4" src="https://tribe-s3-production.imgix.net/xRIqr1UEjsZpmuPPvFrd4?auto=compress,format"></figure><figure data-align="center" data-size="best-fit" data-id="fo3r88Aw8jTZpHcKlNRrL" data-version="v2" data-type="image"><img data-id="fo3r88Aw8jTZpHcKlNRrL" src="https://tribe-s3-production.imgix.net/fo3r88Aw8jTZpHcKlNRrL?auto=compress,format"></figure><p></p><figure data-align="center" data-size="full" data-id="0WRQxcEficcghGCWl0k51" data-version="v2" data-type="image"><img data-id="0WRQxcEficcghGCWl0k51" src="https://tribe-s3-production.imgix.net/0WRQxcEficcghGCWl0k51?auto=compress,format"></figure><figure data-align="center" data-size="full" data-id="QPFmYhgRxSQYIaD60vIpi" data-version="v2" data-type="image"><img data-id="QPFmYhgRxSQYIaD60vIpi" src="https://tribe-s3-production.imgix.net/QPFmYhgRxSQYIaD60vIpi?auto=compress,format"></figure><p></p><p><strong>Azure Quota Increase Guide:</strong><br><a class="text-interactive hover:text-interactive-hovered" rel="noopener noreferrer nofollow" href="https://learn.microsoft.com/en-us/answers/questions/5554907/request-for-acs-email-sending-quota-increase">https://learn.microsoft.com/en-us/answers/questions/5554907/request-for-acs-email-sending-quota-increase</a><br></p><p>Link to increase quota: <a class="text-interactive hover:text-interactive-hovered" rel="noopener noreferrer nofollow" href="https://portal.azure.com/#create/Microsoft.Support">https://portal.azure.com/#create/Microsoft.Support</a></p><p></p><p><strong>Azure Functions</strong>:</p><ul><li><p>Pay-as-you-go, based on executions (minimal for low volumes).</p></li><li><p>With this setup, you can forward emails using Azure while avoiding third-party services. Let me know if you’d like more details on any step!</p><p></p><p>Setting for receiving emails. - Use GMAIL IMAP for connecting in Instantly or Pipl or MX Route.<br><br>Yes, you can connect Azure SMTP with Google IMAP to Instantly! This is a common setup that many users implement.</p><p><strong>Steps to Connect:</strong></p><ol><li><p><strong>Generate Google App Password</strong><br>• Create an app-specific password in your Google account settings</p></li><li><p><strong>Use IMAP/SMTP Method</strong><br>• Go to <a class="text-interactive hover:text-interactive-hovered" rel="nofollow noopener noreferrer" href="https://app.instantly.ai/app/accounts"><u>Email Accounts</u></a><br>• Click "Add New"<br>• Select "IMAP/SMTP"<br>• Choose "Single Account"</p></li><li><p><strong>Configure Settings</strong><br>• Enter your email address<br>• Provide Google IMAP configuration details<br>• Add your Azure SMTP settings</p></li></ol><p><strong>Requirements:</strong></p><p>• You need both IMAP and SMTP protocols properly configured</p><p>• SMTP-only connections are not permitted</p><p>This setup allows you to receive emails through Google's IMAP while sending through Azure's SMTP service, giving you the best of both platforms for your email outreach needs.<br><br><br><strong>Other Helpful Videos for creating and sending emails via Azure Communication Services (ACS)</strong></p></li><li><p><a class="text-interactive hover:text-interactive-hovered" rel="noopener noreferrer nofollow" href="https://www.youtube.com/watch?v=BASe-Cbys_o">https://www.youtube.com/watch?v=BASe-Cbys_o</a></p></li><li><p><a class="text-interactive hover:text-interactive-hovered" rel="noopener noreferrer nofollow" href="https://www.youtube.com/watch?v=OyJ2FILswtY">https://www.youtube.com/watch?v=OyJ2FILswtY</a></p></li><li><p><a class="text-interactive hover:text-interactive-hovered" rel="noopener noreferrer nofollow" href="https://www.youtube.com/watch?v=sQA95pc5Qcw">https://www.youtube.com/watch?v=sQA95pc5Qcw</a></p><p></p><p><strong>Pricing &amp; Limit Info:</strong></p></li><li><p><a class="text-interactive hover:text-interactive-hovered" rel="noopener noreferrer nofollow" href="https://learn.microsoft.com/en-us/azure/communication-services/concepts/service-limits#rate-limits-for-email">https://learn.microsoft.com/en-us/azure/communication-services/concepts/service-limits#rate-limits-for-email</a></p></li><li><p><a class="text-interactive hover:text-interactive-hovered" rel="noopener noreferrer nofollow" href="https://learn.microsoft.com/en-us/azure/communication-services/concepts/email-pricing">https://learn.microsoft.com/en-us/azure/communication-services/concepts/email-pricing</a></p><p></p></li></ul>]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[Zero-SSH n8n Installation Guide with PostgreSQL]]></title>
            <description><![CDATA[FINAL GITHUB-MANAGED N8N & POSTGRESQL GUIDE

Step 1: Prepare Your Private GitHub Repository

 1. Create a new private GitHub repository (e.g., runcloud-n8n-deployment).

 2. Add the following three files to the ...]]></description>
            <link>https://smartweb.tribeplatform.com/server/post/zero-ssh-n8n-installation-guide-kfqlye06iU0p8La</link>
            <guid isPermaLink="true">https://smartweb.tribeplatform.com/server/post/zero-ssh-n8n-installation-guide-kfqlye06iU0p8La</guid>
            <dc:creator><![CDATA[Rohit Agarwal]]></dc:creator>
            <pubDate>Thu, 14 Aug 2025 19:01:10 GMT</pubDate>
            <content:encoded><![CDATA[<h3 class="text-lg" data-toc-id="733122bc-f1bd-4293-a30a-fa74e69fa4cb" id="733122bc-f1bd-4293-a30a-fa74e69fa4cb"><strong>Final GitHub-Managed n8n &amp; PostgreSQL Guide</strong></h3><p><strong>Step 1: Prepare Your Private GitHub Repository</strong></p><ol><li><p>Create a new <strong>private</strong> GitHub repository (e.g., <code>runcloud-n8n-deployment</code>).</p></li><li><p>Add the following three files to the root of this repository.</p><p><strong>File 1: </strong><code>initial-setup.sh</code> (For one-time setup)</p><p>Bash</p><pre><code>#!/bin/bash
set -e

# Check for and install Docker if not present
if command -v docker &amp;&gt; /dev/null; then
    echo "Docker already installed. Skipping installation."
else
    echo "Installing Docker..."
    curl -fsSL https://get.docker.com -o get-docker.sh
    sh get-docker.sh
    usermod -aG docker runcloud
    usermod -aG docker n8nuser
    apt-get update
    apt-get install -y docker-compose-plugin
    rm get-docker.sh
    echo "Docker installation complete."
fi

# Initial setup of directories and permissions
APP_DIR="/home/n8nuser/webapps/n8n-control"
echo "Creating and setting permissions for data directories..."
mkdir -p "$APP_DIR/n8n_data" "$APP_DIR/local_files" "$APP_DIR/postgres_data"
chown -R n8nuser:n8nuser "$APP_DIR/n8n_data" "$APP_DIR/local_files" "$APP_DIR/postgres_data"

echo "Initial setup complete."</code></pre><p><strong>File 2: </strong><code>docker-compose.yml</code></p><p>YAML</p><pre><code>version: '3.8'

services:
  n8n:
    image: docker.n8n.io/n8nio/n8n:latest
    container_name: n8n_main
    restart: always
    ports:
      - "127.0.0.1:5678:5678"
    env_file:
      - .env
    volumes:
      - ./n8n_data:/home/node/.n8n
      - ./local_files:/files
    user: "${UID_GID}"
    depends_on:
      - postgres

  postgres:
    image: postgres:15
    container_name: n8n_postgres
    restart: always
    environment:
      - POSTGRES_USER=${POSTGRES_USER}
      - POSTGRES_PASSWORD=${POSTGRES_PASSWORD}
      - POSTGRES_DB=${POSTGRES_DB}
    volumes:
      - ./postgres_data:/var/lib/postgresql/data

  watchtower:
    image: containrrr/watchtower:latest
    container_name: n8n_watchtower
    restart: always
    volumes:
      - /var/run/docker.sock:/var/run/docker.sock
    command: --interval 86400 n8n_main n8n_postgres</code></pre><p><strong>File 3: </strong><code>deploy.sh</code></p><p>Bash</p><pre><code>#!/bin/bash
set -e

APP_DIR="/home/n8nuser/webapps/n8n-control"

echo "--- Updating Git repository and deploying n8n containers ---"
cd $APP_DIR
# Pull latest changes from the main branch
git pull origin main

# Restart Docker containers with the updated configuration
docker compose pull
docker compose up --force-recreate -d

echo "--- Deployment complete ---"
</code></pre></li><li><p>Commit and push these files to your private repository.</p></li></ol><p></p><p><strong>Step 2: Initial RunCloud Setup</strong></p><ol><li><p>In RunCloud, go to <strong>Web Applications</strong> &gt; <strong>Deploy New Web App</strong>.</p></li><li><p>Select the <strong>Git Repository </strong>&gt;<strong> GitHub</strong> tab.</p></li><li><p>Use these settings:</p><ul><li><p><strong>Application Name:</strong> <code>n8n-control</code></p></li><li><p><strong>Web Application Owner:</strong> Create a new user (e.g., <code>n8nuser</code>).</p></li><li><p><strong>Domain Name: </strong><code>n8n.zeniusco.com</code></p></li><li><p><strong>Repository:</strong> <code>zeniusco/runcloud-n8n-deployment</code></p></li><li><p><strong>Branch:</strong> <code>main</code></p></li><li><p><strong>Backup:</strong> Enable</p></li><li><p><strong>Web Application Stack:</strong> Select <strong>Native NGINX + Custom Config</strong>.</p></li></ul></li><li><p>After creation, go to the <strong>SSL/TLS</strong> section and install a Let's Encrypt certificate.</p></li></ol><p></p><p></p><p><strong>Step 3: One-Time Docker Installation</strong></p><ol><li><p>Link your new GitHub repo to the <code>n8n-control</code> web app in RunCloud under the <strong>Git</strong> tab.</p></li><li><p>Go to the <strong>Deployment</strong> &gt; <strong>Deployment Script</strong> tab and enter this script:</p><p>Bash</p><pre><code>#!/bin/bash
set -e

echo "--- Manual update triggered ---"
cd /home/n8nuser/webapps/n8n-control

# Pull latest n8n and Postgres images from Docker Hub
docker compose pull n8n
docker compose up -d --force-recreate n8n

echo "--- Manual update complete ---"</code></pre></li></ol><p></p><pre><code>#!/bin/bash
set -e

echo "--- Executing one-time Docker installation ---"
bash install-docker.sh</code></pre><p></p><ol><li><p>Click <strong>Save Script</strong>, then <strong>Deploy Now</strong>. Wait for the log to show completion.</p></li></ol><p><strong>Step 4: Create the </strong><code>.env</code><strong> File on the Server</strong></p><ol><li><p>In your <code>n8n-control</code> app, go to <strong>File Manager</strong>.</p></li><li><p>Create a new file named <code>.env</code> in the application root (<code>/home/runcloud/webapps/n8n-control/</code>). <strong>This file contains secrets and should NOT be in your GitHub repo.</strong></p></li><li><p>Paste the following content into the <code>.env</code> file and <strong>customize the values</strong>:</p><p>Code snippet</p><pre><code># Example: Europe/London
GENERIC_TIMEZONE=Your_Timezone
TZ=Your_Timezone

# Do not change these values
N8N_HOST=0.0.0.0
N8N_PORT=5678
N8N_PROTOCOL=http

# Set this to your public n8n URL
WEBHOOK_URL=https://n8n.zeniusco.com/

# Generate and save a long, random, secret string (at least 32 chars)
N8N_ENCRYPTION_KEY=Your_Very_Long_and_Secret_Random_String_Here

# This is a placeholder, do not change
UID_GID=1000:1000

# --- PostgreSQL Settings ---
DB_TYPE=postgresdb
POSTGRES_DB=n8n
POSTGRES_USER=YourSecureUsername
POSTGRES_PASSWORD=YourVerySecurePassword

# Internal connection details - DO NOT CHANGE
DB_POSTGRESDB_HOST=postgres
DB_POSTGRESDB_PORT=5432
DB_POSTGRESDB_DATABASE=${POSTGRES_DB}
DB_POSTGRESDB_USER=${POSTGRES_USER}
DB_POSTGRESDB_PASSWORD=${POSTGRES_PASSWORD}
</code></pre></li><li><p>Save the file.</p></li></ol><p><strong>Step 5: Deploy n8n from GitHub</strong></p><ol><li><p>In RunCloud, go to <strong>Deployment</strong> &gt; <strong>Deployment Script</strong> and replace the content with this script. This script copies your config from GitHub to the correct location and then runs the deployment.</p><p>Bash</p><pre><code>#!/bin/bash
set -e

APP_DIR="/home/n8nuser/webapps/n8n-control"

echo "--- Updating Git repository and deploying n8n containers ---"
cd $APP_DIR
# Pull latest changes from the main branch
git pull origin main

# Restart Docker containers with the updated configuration
docker compose pull
docker compose up --force-recreate -d

echo "--- Deployment complete ---"
</code></pre></li><li><p>Click <strong>Save Script</strong>, then <strong>Deploy Now</strong>.</p></li></ol><p><strong>Step 6: Configure Nginx Reverse Proxy</strong></p><ol><li><p>In your <code>n8n-control</code> app, go to the <strong>NGINX Config</strong> tab.</p></li><li><p>Click <strong>Add a New Config</strong>, select <strong>Create from Predefined Config</strong>, and choose the <strong>Proxy</strong> template.</p></li><li><p>Replace the entire <strong>Config Content</strong> with the following:</p><p>Nginx</p><pre><code>proxy_pass http://127.0.0.1:5678;
proxy_http_version 1.1;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;

# Critical for WebSocket support to prevent "Connection Lost" errors
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection "upgrade";
</code></pre></li><li><p>Click <strong>Run and Debug</strong>, then <strong>Create Config</strong>. Your n8n instance is now live.</p></li></ol><p><strong>Step 7: Set Up Manual Update Workflow</strong></p><ol><li><p>In your <code>n8n-control</code> app, go to the <strong>Git</strong> tab and copy the <strong>Webhook URL</strong>.</p></li><li><p>Go to <strong>Deployment</strong> &gt; <strong>Deployment Script</strong> and replace the content with this update script:</p><p>Bash</p><pre><code>#!/bin/bash
set -e
echo "--- Manual update triggered ---"
cd /home/runcloud/webapps/n8n-control
docker compose pull n8n
docker compose up -d --force-recreate n8n
echo "--- Manual update complete ---"
</code></pre></li><li><p>Save the script.</p></li><li><p>In your n8n instance, import the following workflow JSON:</p><p>JSON</p><pre><code>{
  "name": "Manual n8n Update Trigger",
  "nodes":,
      "credentials": {
        "httpBasicAuth": {
          "id": "1",
          "name": "n8n Update Trigger Auth"
        }
      }
    },
    {
      "parameters": {
        "url": "PASTE_YOUR_RUNCLOUD_WEBHOOK_URL_HERE",
        "requestMethod": "POST",
        "options": {}
      },
      "name": "Call RunCloud Webhook",
      "type": "n8n-nodes-base.httpRequest",
      "typeVersion": 4.1,
      "position": 
    }
  ],
  "connections": {
    "Trigger Update": {
      "main":
    }
  }
}
</code></pre></li><li><p>Open the <strong>Call RunCloud Webhook</strong> node and paste the webhook URL you copied from RunCloud.</p></li><li><p>Configure the <strong>Trigger Update</strong> node with new Basic Auth credentials for security.</p></li><li><p>Save and activate the workflow.</p></li></ol>]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[How to install GUI (xfce4) in Ubuntu Server]]></title>
            <description><![CDATA[Follow this video: https://www.youtube.com/watch?v=khcQZ3WcDcU [https://www.youtube.com/watch?v=khcQZ3WcDcU]
Follow this article: https://learn.microsoft.com/en-us/azure/virtual-machines/linux/use-remote-desktop?tabs=azure-cli [https://learn.microsoft.com/en-us/azure/virtual-machines/linux/use-remote-desktop?tabs=azure-cli]]]></description>
            <link>https://smartweb.tribeplatform.com/server/post/how-to-install-gui-xfce4-in-ubuntu-server-fJzuC6FqyuD5CTu</link>
            <guid isPermaLink="true">https://smartweb.tribeplatform.com/server/post/how-to-install-gui-xfce4-in-ubuntu-server-fJzuC6FqyuD5CTu</guid>
            <dc:creator><![CDATA[Rohit Agarwal]]></dc:creator>
            <pubDate>Thu, 03 Jul 2025 14:43:36 GMT</pubDate>
            <content:encoded><![CDATA[<p>Follow this video: <a class="text-interactive hover:text-interactive-hovered" rel="noopener noreferrer nofollow" href="https://www.youtube.com/watch?v=khcQZ3WcDcU">https://www.youtube.com/watch?v=khcQZ3WcDcU</a><br>Follow this article: <a class="text-interactive hover:text-interactive-hovered" rel="noopener noreferrer nofollow" href="https://learn.microsoft.com/en-us/azure/virtual-machines/linux/use-remote-desktop?tabs=azure-cli">https://learn.microsoft.com/en-us/azure/virtual-machines/linux/use-remote-desktop?tabs=azure-cli</a></p>]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[How to create an n8n server.]]></title>
            <description><![CDATA[CREATING N8N SERVER WITHOUT RUNCLOUD.

Follow the instructions mentioned here: https://github.com/futurminds/n8n-self-hosting [https://github.com/futurminds/n8n-self-hosting]
Video of the same: https://www.youtube.com/watch?v=Temh_Ddxp24 [https://www.youtube.com/watch?v=Temh_Ddxp24]

Install Ubuntu ...]]></description>
            <link>https://smartweb.tribeplatform.com/server/post/how-to-create-an-n8n-server-ZwAANPwaoYpiVj7</link>
            <guid isPermaLink="true">https://smartweb.tribeplatform.com/server/post/how-to-create-an-n8n-server-ZwAANPwaoYpiVj7</guid>
            <dc:creator><![CDATA[Rohit Agarwal]]></dc:creator>
            <pubDate>Mon, 30 Jun 2025 19:41:02 GMT</pubDate>
            <content:encoded><![CDATA[<h2 class="text-xl" data-toc-id="ecd29fc1-89c6-44e5-b979-e32b00f97dc7" id="ecd29fc1-89c6-44e5-b979-e32b00f97dc7"><u>Creating n8n server </u><strong><u>without</u></strong><u> runcloud.</u></h2><p>Follow the instructions mentioned here: <a class="text-interactive hover:text-interactive-hovered" rel="noopener noreferrer nofollow" href="https://github.com/futurminds/n8n-self-hosting">https://github.com/futurminds/n8n-self-hosting</a><br>Video of the same: <a class="text-interactive hover:text-interactive-hovered" rel="noopener noreferrer nofollow" href="https://www.youtube.com/watch?v=Temh_Ddxp24">https://www.youtube.com/watch?v=Temh_Ddxp24</a><br><br>Install Ubuntu 24.04 LTS (do not install Ubuntu Minimal)<br><br>But in Step 4: Make sure you do not include this line.<br>// <a class="text-interactive hover:text-interactive-hovered" rel="noopener noreferrer nofollow" href="http://subdomain.your-domain.com">subdomain.your-domain.com</a> if you have a subdomain<br><br>As mentioned here: <a class="text-interactive hover:text-interactive-hovered" rel="noopener noreferrer nofollow" href="https://github.com/n8n-io/n8n/issues/14572#issuecomment-2808463328">https://github.com/n8n-io/n8n/issues/14572#issuecomment-2808463328</a><br>Add the below in the above Step 4 code.<br><br>proxy_set_header Host <a class="text-interactive hover:text-interactive-hovered" rel="noopener noreferrer nofollow" href="http://n8n.example.com">n8n.example.com</a>;<br>proxy_set_header Origin <a class="text-interactive hover:text-interactive-hovered" rel="noopener noreferrer nofollow" href="https://n8n.example.com">https://n8n.example.com</a>;<br><br>(change example.com to your subdomain)<br><br>Disable CloudFlare cache for subdomain.<br>Keep CloudFlare SSL enabled.</p><p></p><h2 class="text-xl" data-toc-id="2488b0c4-bdbd-499d-b1e1-7f64abe2dd96" id="2488b0c4-bdbd-499d-b1e1-7f64abe2dd96"><strong>Creating n8n server with runcloud guide</strong></h2><p><strong>Guide:</strong> <a class="text-interactive hover:text-interactive-hovered" rel="noopener noreferrer nofollow" href="https://runcloud.io/blog/n8n-hosting-docker-nginx">https://runcloud.io/blog/n8n-hosting-docker-nginx</a></p><p><br><strong>In step 4;</strong> instead of using runcloud.io code; <strong><u>use below code.</u></strong></p><pre><code>docker run \
  -d \
  --rm \
  --name n8n \
  --restart unless-stopped \
  -p 5678:5678 \
  -e N8N_HOST="subdomain.your-domain.com" \
  -e WEBHOOK_TUNNEL_URL="https://subdomain.your-domain.com/" \
  -e WEBHOOK_URL="https://subdomain.your-domain.com/" \
  -v my_n8n_data:/home/node/.n8n \
  -v ./local-files:/files \
  docker.n8n.io/n8nio/n8n</code></pre><p>Remember to replace <code>subdomain.your-domain.com</code> with your actual domain name.<br><br>(If you use runcloud code, webhook urls will point to localhost, instead of the domain.)<br><br><br><br><br>Below is an updated version of the runcloud guide with yml file so that updates can be done easily.<br><br>Excellent security thinking! You're absolutely right. Here's the updated guide with the docker-compose.yml file placed outside the web-accessible directory:</p><p># Complete n8n Installation Guide with Docker Compose (Secure Version)</p><p>## Step 1: Create a New Web Application</p><p>1. Login to RunCloud dashboard</p><p>2. Click <strong>"Create New Web App"</strong></p><p>3. Configure:</p><p>- <strong>Application Name</strong>: <code>n8n</code> (or your preferred name)</p><p>- <strong>User</strong>: <code>runcloud</code></p><p>- <strong>PHP Version</strong>: Select <strong>"NATIVE (NONE)"</strong></p><p>- <strong>Web Application Stack</strong>: Select <strong>"NATIVE (CUSTOM)"</strong></p><p>- <strong>Advanced Settings</strong>: Enable <strong>"This is a Proxy App"</strong></p><p>4. Click <strong>"Add Web Application"</strong></p><p>## Step 2: Install Docker and Docker Compose</p><p>```bash</p><p># SSH into your server as runcloud user</p><p># Update package list</p><p>sudo apt update</p><p># Install Docker</p><p>sudo apt install <a class="text-interactive hover:text-interactive-hovered" rel="noopener noreferrer nofollow" href="http://docker.io">docker.io</a></p><p># Install Docker Compose</p><p>sudo apt install docker-compose -y</p><p># Add runcloud user to docker group</p><p>sudo usermod -aG docker runcloud</p><p># Logout and login again for docker group to take effect</p><p>exit</p><p># SSH back in</p><p>```</p><p>## Step 3: Set Up n8n Directory and Files</p><p>```bash</p><p># Create a dedicated n8n directory in runcloud home (NOT web-accessible)</p><p>mkdir -p /home/runcloud/n8n/&lt;app-name&gt;</p><p>cd /home/runcloud/n8n/&lt;app-name&gt;</p><p># Create the local-files directory for n8n storage</p><p>mkdir -p /home/runcloud/webapps/&lt;app-name&gt;/local-files</p><p># Create docker-compose.yml file in the secure location</p><p>nano docker-compose.yml</p><p>```</p><p>Paste this content (replace <code>subdomain.your-domain.com</code> with your actual domain):</p><p>```yaml</p><p>version: '3'</p><p>services:</p><p>n8n:</p><p>image: <a class="text-interactive hover:text-interactive-hovered" rel="noopener noreferrer nofollow" href="http://docker.n8n.io/n8nio/n8n">docker.n8n.io/n8nio/n8n</a></p><p>ports:</p><p>- "5678:5678"</p><p>environment:</p><p>- N8N_HOST=<a class="text-interactive hover:text-interactive-hovered" rel="noopener noreferrer nofollow" href="http://subdomain.your-domain.com">subdomain.your-domain.com</a></p><p>- WEBHOOK_TUNNEL_URL=<a class="text-interactive hover:text-interactive-hovered" rel="noopener noreferrer nofollow" href="https://subdomain.your-domain.com/">https://subdomain.your-domain.com/</a></p><p>- WEBHOOK_URL=<a class="text-interactive hover:text-interactive-hovered" rel="noopener noreferrer nofollow" href="https://subdomain.your-domain.com/">https://subdomain.your-domain.com/</a></p><p>volumes:</p><p>- my_n8n_data:/home/node/.n8n</p><p>- /home/runcloud/webapps/&lt;app-name&gt;/local-files:/files</p><p>container_name: n8n</p><p>volumes:</p><p>my_n8n_data:</p><p>```</p><p>Save with <code>Ctrl+X</code>, then <code>Y</code>, then <code>Enter</code>.</p><p><strong>Note</strong>: Replace <code>&lt;app-name&gt;</code> in the volumes path with your actual app name.</p><p>## Step 4: Start n8n for the First Time</p><p>```bash</p><p># Make sure you're in the secure directory</p><p>cd /home/runcloud/n8n/&lt;app-name&gt;</p><p># Start n8n</p><p>docker-compose up -d</p><p># Check if it's running</p><p>docker-compose ps</p><p># View logs (optional)</p><p>docker-compose logs -f</p><p># Press Ctrl+C to exit logs</p><p>```</p><p>## Step 5: Configure Nginx Proxy</p><p>In RunCloud dashboard:</p><p>1. Go to your n8n web application</p><p>2. Click <strong>"NGINX Config"</strong></p><p>3. Add this to the location block:</p><p>```nginx</p><p>location / {</p><p>proxy_pass <a class="text-interactive hover:text-interactive-hovered" rel="noopener noreferrer nofollow" href="http://127.0.0.1:5678">http://127.0.0.1:5678</a>;</p><p>proxy_http_version 1.1;</p><p>proxy_set_header Upgrade $http_upgrade;</p><p>proxy_set_header Connection "upgrade";</p><p>proxy_set_header Host $host;</p><p>proxy_set_header X-Real-IP $remote_addr;</p><p>proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;</p><p>proxy_set_header X-Forwarded-Proto $scheme;</p><p>proxy_buffering off;</p><p>}</p><p>```</p><p>4. Click <strong>"Update NGINX Config"</strong></p><p>## Step 6: Set Up SSL Certificate</p><p>1. In RunCloud dashboard, go to your n8n web application</p><p>2. Click <strong>"SSL/TLS"</strong> tab</p><p>3. Enable <strong>"Let's Encrypt"</strong></p><p>4. Enter your email</p><p>5. Click <strong>"Generate Certificate"</strong></p><p>## Step 7: Test Your Installation</p><p>1. Open your browser</p><p>2. Navigate to <code>https://subdomain.your-domain.com</code></p><p>3. You should see the n8n setup page</p><p>4. Create your first user account</p><p>## Updating n8n</p><p>### First Update (and all subsequent updates):</p><p>```bash</p><p>cd /home/runcloud/n8n/&lt;app-name&gt;</p><p>docker-compose pull &amp;&amp; docker-compose down &amp;&amp; docker-compose up -d</p><p>```</p><p>### To check update status:</p><p>```bash</p><p>docker-compose ps</p><p>docker-compose logs -f n8n</p><p>```</p><p>## Useful Commands</p><p>```bash</p><p># Always run from the secure directory</p><p>cd /home/runcloud/n8n/&lt;app-name&gt;</p><p># Stop n8n</p><p>docker-compose down</p><p># Start n8n</p><p>docker-compose up -d</p><p># Restart n8n</p><p>docker-compose restart</p><p># View logs</p><p>docker-compose logs -f</p><p># Check container status</p><p>docker-compose ps</p><p>```</p><p>## File Locations Summary</p><p>- <strong>docker-compose.yml</strong>: <code>/home/runcloud/n8n/&lt;app-name&gt;/</code> (NOT web-accessible)</p><p>- <strong>n8n files</strong>: <code>/home/runcloud/webapps/&lt;app-name&gt;/local-files/</code> (web-accessible but n8n handles security)</p><p>- <strong>n8n data/workflows</strong>: Inside Docker volume <code>my_n8n_data</code></p><p>## Troubleshooting</p><p>If n8n isn't accessible:</p><p>1. Check container is running: <code>docker-compose ps</code></p><p>2. Check logs: <code>docker-compose logs n8n</code></p><p>3. Ensure port 5678 is not blocked by firewall</p><p>4. Verify Nginx config is correct</p><p>5. Check SSL certificate is properly installed</p>]]></content:encoded>
        </item>
    </channel>
</rss>