<?xml version="1.0" encoding="UTF-8"?><rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>Technology &#8211; CJSelvamani</title>
	<atom:link href="https://cjselvamani.com/category/technology/feed/" rel="self" type="application/rss+xml" />
	<link>https://cjselvamani.com</link>
	<description>Saved by Gracious Faith Alone</description>
	<lastBuildDate>Wed, 01 Apr 2026 13:30:54 +0000</lastBuildDate>
	<language>en-US</language>
	<sy:updatePeriod>
	hourly	</sy:updatePeriod>
	<sy:updateFrequency>
	1	</sy:updateFrequency>
	<generator>https://wordpress.org/?v=6.9.4</generator>
	<item>
		<title>How to Set Up Strapi on cPanel Using Phusion Passenger</title>
		<link>https://cjselvamani.com/how-to-set-up-strapi-on-cpanel-using-phusion-passenger/</link>
					<comments>https://cjselvamani.com/how-to-set-up-strapi-on-cpanel-using-phusion-passenger/#respond</comments>
		
		<dc:creator><![CDATA[cjselvamani]]></dc:creator>
		<pubDate>Wed, 01 Apr 2026 10:46:15 +0000</pubDate>
				<category><![CDATA[Technology]]></category>
		<category><![CDATA[cPanel]]></category>
		<category><![CDATA[Phusion Passenger]]></category>
		<category><![CDATA[Strapi]]></category>
		<guid isPermaLink="false">https://cjselvamani.com/?p=951</guid>

					<description><![CDATA[Deploying Strapi on cPanel with Phusion Passenger is possible, but there are a few details [&#8230;]]]></description>
										<content:encoded><![CDATA[
<p>Deploying Strapi on cPanel with Phusion Passenger is possible, but there are a few details that matter, especially if your project uses TypeScript. This guide walks through a working production setup for Strapi on cPanel.</p>



<h2 class="wp-block-heading">What You Need</h2>



<p>Before starting, make sure your hosting environment has:</p>



<ul class="wp-block-list">
<li>cPanel Application Manager enabled</li>



<li>Phusion Passenger enabled</li>



<li>Node.js 20+ available</li>



<li>MySQL or MariaDB available</li>



<li>SSH access to the cPanel account</li>



<li>a subdomain for Strapi, for example cms.yourdomain.com</li>
</ul>



<p>A good setup is:</p>



<ul class="wp-block-list">
<li>frontend: https://yourdomain.com</li>



<li>Strapi CMS: https://cms.yourdomain.com</li>
</ul>



<h2 class="wp-block-heading">1. Create the Subdomain</h2>



<p>In cPanel, create a subdomain for Strapi, for example:</p>



<ul class="wp-block-list">
<li>cms.yourdomain.com</li>
</ul>



<p>This is the public URL your Strapi app will use.</p>



<h2 class="wp-block-heading">2. Upload the Strapi Project</h2>



<p>Upload your Strapi app files to the server.</p>



<p>A typical location is:</p>



<ul class="wp-block-list">
<li>/home/yourcpaneluser/public_html</li>
</ul>



<p>or better:</p>



<ul class="wp-block-list">
<li>/home/yourcpaneluser/strapi</li>
</ul>



<p>If you use&nbsp;public_html, make sure your Node app in Application Manager points there.</p>



<p>Upload these parts of the project:</p>



<ul class="wp-block-list">
<li>package.json</li>



<li>package-lock.json</li>



<li>config/</li>



<li>database/</li>



<li>src/</li>



<li>public/</li>



<li>types/</li>



<li>tsconfig.json</li>



<li>favicon.png</li>
</ul>



<p>Do not upload:</p>



<ul class="wp-block-list">
<li>node_modules/</li>



<li>.cache/</li>



<li>temporary build artifacts you do not need</li>
</ul>



<h2 class="wp-block-heading">3. Create the Database</h2>



<p>In cPanel, create a MySQL database and user.</p>



<p>Use the real cPanel-generated names, which are often prefixed. For example:</p>



<ul class="wp-block-list">
<li>database name: youruser_db</li>



<li>username: youruser_user</li>
</ul>



<p>Do not assume local placeholder names like&nbsp;strapi_fold&nbsp;will work in production.</p>



<h2 class="wp-block-heading">4. Create the&nbsp;.env&nbsp;File</h2>



<p>In your Strapi app root, create&nbsp;.env&nbsp;with production values:</p>



<pre class="wp-block-code"><code>HOST=0.0.0.0
PORT=1337
NODE_ENV=production
PUBLIC_URL=https://cms.yourdomain.com

APP_KEYS=your_key_1,your_key_2,your_key_3,your_key_4
API_TOKEN_SALT=your_api_token_salt
ADMIN_JWT_SECRET=your_admin_jwt_secret
TRANSFER_TOKEN_SALT=your_transfer_token_salt
ENCRYPTION_KEY=your_encryption_key
JWT_SECRET=your_jwt_secret

DATABASE_CLIENT=mysql
DATABASE_HOST=localhost
DATABASE_PORT=3306
DATABASE_NAME=your_real_db_name
DATABASE_USERNAME=your_real_db_user
DATABASE_PASSWORD=your_real_db_password
DATABASE_SSL=false</code></pre>



<h2 class="wp-block-heading">5. Make Sure&nbsp;server.ts&nbsp;Uses the Public URL</h2>



<p>In&nbsp;config/server.ts, include:</p>



<pre class="wp-block-code"><code>import type { Core } from '@strapi/strapi';

const config = ({ env }: Core.Config.Shared.ConfigParams): Core.Config.Server => ({
  host: env('HOST', '0.0.0.0'),
  port: env.int('PORT', 1337),
  url: env('PUBLIC_URL', ''),
  app: {
    keys: env.array('APP_KEYS'),
  },
});

export default config;</code></pre>



<p>This makes Strapi use the real public domain instead of&nbsp;localhost.</p>



<h2 class="wp-block-heading">6. Important: Add JS Config Files for Passenger</h2>



<p>If your Strapi project uses TypeScript, Passenger startup via&nbsp;app.js&nbsp;may ignore&nbsp;.ts&nbsp;config files.</p>



<p>You should create JS equivalents in&nbsp;config/:</p>



<ul class="wp-block-list">
<li>config/admin.js</li>



<li>config/api.js</li>



<li>config/database.js</li>



<li>config/middlewares.js</li>



<li>config/plugins.js</li>



<li>config/server.js</li>
</ul>



<p>Example&nbsp;config/admin.js:</p>



<pre class="wp-block-code"><code>module.exports = ({ env }) => ({
  auth: {
    secret: env('ADMIN_JWT_SECRET'),
  },
  apiToken: {
    salt: env('API_TOKEN_SALT'),
  },
  transfer: {
    token: {
      salt: env('TRANSFER_TOKEN_SALT'),
    },
  },
  secrets: {
    encryptionKey: env('ENCRYPTION_KEY'),
  },
  flags: {
    nps: env.bool('FLAG_NPS', true),
    promoteEE: env.bool('FLAG_PROMOTE_EE', true),
  },
});
</code></pre>



<p>Example config/server.js:<br></p>



<pre class="wp-block-code"><code>module.exports = ({ env }) => ({
  host: env('HOST', '0.0.0.0'),
  port: env.int('PORT', 1337),
  url: env('PUBLIC_URL', ''),
  app: {
    keys: env.array('APP_KEYS'),
  },
});
</code></pre>



<p>Example config/api.js:<br></p>



<pre class="wp-block-code"><code>module.exports = {
  rest: {
    defaultLimit: 25,
    maxLimit: 100,
    withCount: true,
  },
};
</code></pre>



<p>Example config/middlewares.js:<br></p>



<pre class="wp-block-code"><code>module.exports = &#91;
  'strapi::logger',
  'strapi::errors',
  'strapi::security',
  'strapi::cors',
  'strapi::poweredBy',
  'strapi::query',
  'strapi::body',
  'strapi::session',
  'strapi::favicon',
  'strapi::public',
];
</code></pre>



<p>Example config/plugins.js:<br></p>



<pre class="wp-block-code"><code>module.exports = ({ env }) => ({});
</code></pre>



<h2 class="wp-block-heading">7. Add&nbsp;app.js&nbsp;for Passenger</h2>



<p>This is the most important file for Passenger.</p>



<p>Create&nbsp;app.js&nbsp;in the app root:</p>



<pre class="wp-block-code"><code>process.env.NODE_ENV = process.env.NODE_ENV || "production";

require("@strapi/strapi")
  .createStrapi({ distDir: "./dist" })
  .start();
</code></pre>



<p>The&nbsp;distDir&nbsp;part matters for serving the built admin frontend correctly.</p>



<h2 class="wp-block-heading">8. Install Dependencies</h2>



<p>SSH into the cPanel account and go to the app folder:</p>



<pre class="wp-block-code"><code>cd ~/public_html
</code></pre>



<p>or wherever your app lives, then run:</p>



<pre class="wp-block-code"><code>/opt/cpanel/ea-nodejs22/bin/npm install
</code></pre>



<p>If your project includes better-sqlite3 but you are using MySQL in production, remove better-sqlite3 first. It often fails to compile on shared hosting and is not needed for MySQL.</p>



<blockquote class="wp-block-quote is-layout-flow wp-block-quote-is-layout-flow">
<p>On this cPanel server,&nbsp;npm&nbsp;was not available from the default shell path. Using&nbsp;/opt/cpanel/ea-nodejs22/bin/npm&nbsp;runs the cPanel-provided npm binary directly, which is why it worked.</p>
</blockquote>



<h2 class="wp-block-heading">9. Build Strapi</h2>



<p>Run:</p>



<pre class="wp-block-code"><code>/opt/cpanel/ea-nodejs22/bin/npm run build
</code></pre>



<p>This builds the admin panel.</p>



<h2 class="wp-block-heading">10. Configure cPanel Application Manager</h2>



<p>In cPanel Application Manager, create the Node app with values like:</p>



<ul class="wp-block-list">
<li>Application Name: Strapi</li>



<li>Deployment Domain: cms.yourdomain.com</li>



<li>Base Application URL: /</li>



<li>Application Path: public_html or strapi</li>



<li>Deployment Environment: Production</li>



<li>Startup file: app.js</li>
</ul>



<p>Important:</p>



<ul class="wp-block-list">
<li>Base Application URL should be /</li>



<li>Application Path should be relative to your home directory</li>
</ul>



<h2 class="wp-block-heading">11. Restart the App</h2>



<p>After saving the app in Application Manager, restart it from cPanel.</p>



<p>Do not rely only on manually running&nbsp;node app.js&nbsp;in SSH. Passenger must be the one managing the app process.</p>



<h2 class="wp-block-heading">12. Test the Deployment</h2>



<p>Check:</p>



<ul class="wp-block-list">
<li>https://cms.yourdomain.com/api</li>



<li>https://cms.yourdomain.com/admin</li>



<li>https://cms.yourdomain.com/admin/init</li>
</ul>



<p>If&nbsp;/api&nbsp;returns Strapi JSON and&nbsp;/admin/init&nbsp;returns admin config data, the backend is working.</p>



<h2 class="wp-block-heading">Common Issues</h2>



<h3 class="wp-block-heading">strapi: command not found</h3>



<p>This means&nbsp;npm install&nbsp;did not complete successfully.</p>



<h3 class="wp-block-heading">better-sqlite3&nbsp;build errors</h3>



<p>Remove&nbsp;better-sqlite3&nbsp;if you are using MySQL.</p>



<h3 class="wp-block-heading">Missing admin.auth.secret configuration</h3>



<p>This usually means your&nbsp;.ts&nbsp;config files are not being loaded by Passenger. Add JS config files.</p>



<h3 class="wp-block-heading">/api&nbsp;works but&nbsp;/admin&nbsp;is Not Found</h3>



<p>This usually means your&nbsp;app.js&nbsp;is missing:</p>



<pre class="wp-block-code"><code>.createStrapi({ distDir: "./dist" })
</code></pre>



<h3 class="wp-block-heading">Not Found&nbsp;even when the app is stopped</h3>



<p>That usually means Passenger is not actually serving the subdomain. Recheck Application Manager routing.</p>



<h2 class="wp-block-heading">Final Result</h2>



<p>Once everything is correct, Strapi should work at:</p>



<ul class="wp-block-list">
<li>https://cms.yourdomain.com</li>



<li>admin: https://cms.yourdomain.com/admin</li>
</ul>



<h2 class="wp-block-heading">Closing Notes</h2>



<p>Strapi on cPanel with Passenger works, but TypeScript-based Strapi projects need extra care because Passenger startup does not naturally use&nbsp;.ts&nbsp;config files. The clean solution is to keep your project as-is, but add JS config equivalents and a proper Passenger&nbsp;app.js.</p>



<p></p>
]]></content:encoded>
					
					<wfw:commentRss>https://cjselvamani.com/how-to-set-up-strapi-on-cpanel-using-phusion-passenger/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>Laravel 13 Filament Jobs Backend with Docker and MySQL</title>
		<link>https://cjselvamani.com/laravel-13-filament-jobs-backend-with-docker-and-mysql/</link>
					<comments>https://cjselvamani.com/laravel-13-filament-jobs-backend-with-docker-and-mysql/#respond</comments>
		
		<dc:creator><![CDATA[cjselvamani]]></dc:creator>
		<pubDate>Thu, 19 Mar 2026 14:11:24 +0000</pubDate>
				<category><![CDATA[Technology]]></category>
		<guid isPermaLink="false">https://cjselvamani.com/?p=947</guid>

					<description><![CDATA[If you want to build a practical jobs backend in Laravel, a strong starting point [&#8230;]]]></description>
										<content:encoded><![CDATA[
<p>If you want to build a practical jobs backend in Laravel, a strong starting point is Laravel + Filament + MySQL with Docker for local development.</p>



<p>That is the setup used in this project.</p>



<p>The stack includes:</p>



<ul class="wp-block-list">
<li>Laravel 13</li>



<li>Filament 5</li>



<li>MySQL 8</li>



<li>Docker Compose</li>



<li>cPanel-friendly deployment defaults</li>
</ul>



<p>This article is a compact reference for how the setup was built and why certain decisions were made.</p>



<p>Repository:<br><a href="https://github.com/ipint/JobList"><strong>https://github.com/ipint/JobList</strong></a></p>



<h2 class="wp-block-heading">Why This Stack</h2>



<p>The goal was to build a backend that could:</p>



<ul class="wp-block-list">
<li>run locally with Docker</li>



<li>use MySQL locally and in production</li>



<li>provide a fast admin panel for jobs management</li>



<li>deploy cleanly to a dedicated cPanel server</li>



<li>avoid needing Redis or Supervisor at the start</li>
</ul>



<p>Filament was chosen because it gives Laravel a fast, maintainable admin panel. Laravel was chosen because the production target is PHP 8.3 on cPanel, so the ecosystem fits well.</p>



<h2 class="wp-block-heading">Local Setup Approach</h2>



<p>The local Docker stack is simple:</p>



<ul class="wp-block-list">
<li>PHP-FPM app container</li>



<li>Nginx container</li>



<li>MySQL container</li>
</ul>



<p>This keeps development predictable and close to production.</p>



<p>One practical issue came up during setup: common local ports were already in use, so the app was exposed on:</p>



<p>http://localhost:8088</p>



<h2 class="wp-block-heading">Important Early Decision: Queue Table Naming</h2>



<p>Laravel’s default database queue uses a table named&nbsp;jobs.</p>



<p>That would conflict with the actual jobs domain table needed for job listings.</p>



<p>To avoid that, the queue tables were renamed to:</p>



<ul class="wp-block-list">
<li>queued_jobs</li>



<li>failed_queued_jobs</li>
</ul>



<p>That kept the data model clean from the start.</p>



<h2 class="wp-block-heading">PHP Version Compatibility</h2>



<p>Production is expected to run on PHP 8.3.</p>



<p>At one stage, Composer resolved packages using local PHP 8.4, which caused dependency problems inside Docker and would also have caused issues on cPanel.</p>



<p>The fix was to pin Composer’s platform to PHP 8.3 so the lockfile stays aligned with the real deployment environment.</p>



<h2 class="wp-block-heading">Filament Admin Setup</h2>



<p>Filament 5 was installed as the admin layer and mounted under:</p>



<p>/admin</p>



<p>That provided:</p>



<ul class="wp-block-list">
<li>login</li>



<li>dashboard</li>



<li>resource routing</li>



<li>the structure needed to manage jobs properly</li>
</ul>



<h2 class="wp-block-heading">Jobs Schema</h2>



<p>A proper&nbsp;jobs&nbsp;table was created with fields such as:</p>



<ul class="wp-block-list">
<li>title</li>



<li>slug</li>



<li>reference</li>



<li>company name</li>



<li>department</li>



<li>description</li>



<li>requirements</li>



<li>benefits</li>



<li>employment type</li>



<li>work mode</li>



<li>experience level</li>



<li>status</li>



<li>county</li>



<li>city</li>



<li>postcode</li>



<li>salary fields</li>



<li>application URL and email</li>



<li>sponsorship and right-to-work flags</li>



<li>publish and expiry dates</li>



<li>featured flag</li>
</ul>



<p>This gave the project a realistic jobs domain rather than just an empty admin shell.</p>



<h2 class="wp-block-heading">UK Counties Dropdown</h2>



<p>The project requirement was to always select a county from a dropdown.</p>



<p>To support that, the setup added:</p>



<ul class="wp-block-list">
<li>a uk_counties table</li>



<li>a UkCounty model</li>



<li>a UK counties seeder</li>



<li>a county_id foreign key on jobs</li>
</ul>



<p>This means counties are not hardcoded inside the form. They come from the database, which makes maintenance easier later.</p>



<h2 class="wp-block-heading">Filament Jobs Resource</h2>



<p>The generated Filament stubs were replaced with a proper Jobs resource.</p>



<p>The admin now includes:</p>



<ul class="wp-block-list">
<li>a create/edit job form</li>



<li>a searchable jobs table</li>



<li>filters for status, type, work mode, county, and featured jobs</li>
</ul>



<p>That makes the panel usable as a real internal admin, not just a demo.</p>



<h2 class="wp-block-heading">Seeded UK Jobs</h2>



<p>To make testing easier, the setup also includes:</p>



<ul class="wp-block-list">
<li>a JobFactory</li>



<li>a JobSeeder</li>



<li>30 generated UK jobs</li>
</ul>



<p>The jobs use random departments such as:</p>



<ul class="wp-block-list">
<li>Technology</li>



<li>Sales</li>



<li>Marketing</li>



<li>Finance</li>



<li>Operations</li>



<li>Product</li>



<li>Customer Support</li>



<li>Legal</li>
</ul>



<p>This makes the admin panel useful immediately for testing and demonstration.</p>



<h2 class="wp-block-heading">cPanel Deployment Strategy</h2>



<p>The production target is a dedicated cPanel server running PHP 8.3, without Redis or Supervisor.</p>



<p>Because of that, the setup uses:</p>



<ul class="wp-block-list">
<li>database queue</li>



<li>database cache</li>



<li>database sessions</li>



<li>cron-based scheduling</li>



<li>cron-based queue processing if needed</li>
</ul>



<p>That keeps the architecture realistic for the hosting environment.</p>



<h2 class="wp-block-heading">Issues Encountered During Setup</h2>



<p>A few practical problems came up:</p>



<h3 class="wp-block-heading">1. Laravel could not be scaffolded directly into the repo root</h3>



<p>The repo was not empty, so Laravel had to be created in a temporary subdirectory first.</p>



<h3 class="wp-block-heading">2. Docker port conflicts</h3>



<p>Ports&nbsp;8000&nbsp;and&nbsp;8080&nbsp;were already in use, so the final local port became&nbsp;8088.</p>



<h3 class="wp-block-heading">3. Composer resolved dependencies for PHP 8.4</h3>



<p>That had to be corrected by pinning the Composer platform to PHP 8.3.</p>



<h3 class="wp-block-heading">4. Filament 5 namespace differences</h3>



<p>One form error came from using the wrong namespace for&nbsp;Section. In Filament 5 it needed to come from&nbsp;Filament\Schemas\Components.</p>



<h2 class="wp-block-heading">Final Result</h2>



<p>The finished setup gives:</p>



<ul class="wp-block-list">
<li>Laravel 13 backend</li>



<li>Filament 5 admin panel</li>



<li>MySQL Docker environment</li>



<li>UK counties lookup</li>



<li>jobs management resource</li>



<li>30 seeded jobs</li>



<li>cPanel-friendly deployment path</li>
</ul>



<p>That is a solid base for adding more features later, such as:</p>



<ul class="wp-block-list">
<li>companies</li>



<li>categories</li>



<li>applications</li>



<li>saved jobs</li>



<li>public jobs APIs</li>



<li>frontend job listing pages</li>
</ul>



<h2 class="wp-block-heading">Closing Note</h2>



<p>The most important part of this setup is not that it is advanced. It is that it matches the actual environment and future needs.</p>



<p>That includes:</p>



<ul class="wp-block-list">
<li>matching local and production database choices</li>



<li>keeping Laravel upgrades manageable</li>



<li>using Filament as an admin layer, not as the whole application</li>



<li>making location data structured from the start</li>
</ul>



<p>If you are building a similar platform, this is a strong practical foundation to start from.</p>



<p>Repository:<br><a href="https://github.com/ipint/JobList"><strong>https://github.com/ipint/JobList</strong></a></p>
]]></content:encoded>
					
					<wfw:commentRss>https://cjselvamani.com/laravel-13-filament-jobs-backend-with-docker-and-mysql/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>How to Connect a Private GitHub Repo to cPanel (Step-by-Step)</title>
		<link>https://cjselvamani.com/how-to-connect-a-private-github-repo-to-cpanel-step-by-step/</link>
					<comments>https://cjselvamani.com/how-to-connect-a-private-github-repo-to-cpanel-step-by-step/#respond</comments>
		
		<dc:creator><![CDATA[cjselvamani]]></dc:creator>
		<pubDate>Wed, 04 Mar 2026 09:26:23 +0000</pubDate>
				<category><![CDATA[Technology]]></category>
		<category><![CDATA[GitHub]]></category>
		<guid isPermaLink="false">https://cjselvamani.com/?p=939</guid>

					<description><![CDATA[Deploying from GitHub to cPanel can feel tricky at first, especially with SSH keys and [&#8230;]]]></description>
										<content:encoded><![CDATA[
<p>Deploying from GitHub to cPanel can feel tricky at first, especially with SSH keys and private repositories. This guide walks through a clean setup from scratch.</p>



<h2 class="wp-block-heading">Why use this method?</h2>



<ul class="wp-block-list">
<li>Easy to update after each push</li>



<li>Works with <strong>private</strong> GitHub repos</li>



<li>More secure than manual uploads</li>
</ul>



<h2 class="wp-block-heading">Prerequisites</h2>



<ul class="wp-block-list">
<li>A cPanel account with Terminal/SSH access</li>



<li>A GitHub repository</li>



<li>Domain already pointed to your hosting account</li>
</ul>



<h2 class="wp-block-heading">1. Generate an SSH key on your cPanel server</h2>



<p>In cPanel Terminal:</p>



<pre class="wp-block-code"><code>ssh-keygen -t ed25519 -C "cpanel-deploy" -f ~/.ssh/id_ed25519 -N ""
cat ~/.ssh/id_ed25519.pub</code></pre>



<p>Copy the public key output.</p>



<h2 class="wp-block-heading">2. Add the key to GitHub</h2>



<p>In your GitHub repo:</p>



<ul class="wp-block-list">
<li>Go to <strong>Settings → Deploy keys</strong></li>



<li>Click <strong>Add deploy key</strong></li>



<li>Paste the public key</li>



<li>Keep <strong>write access off</strong> unless you specifically need push from server</li>
</ul>



<p>This allows your server to read your private repo securely.</p>



<h2 class="wp-block-heading">3. Configure SSH on cPanel</h2>



<p>Create/update&nbsp;~/.ssh/config:</p>



<pre class="wp-block-code"><code>Host github.com
  HostName github.com
  User git
  IdentityFile ~/.ssh/id_ed25519
  IdentitiesOnly yes</code></pre>



<p>Then run:</p>



<pre class="wp-block-code"><code>chmod 600 ~/.ssh/config
ssh -T git@github.com</code></pre>



<h2 class="wp-block-heading">4. Clone the repository using SSH</h2>



<p>Use SSH URL (not HTTPS):</p>



<pre class="wp-block-code"><code>cd ~
git clone git@github.com:YOUR_USERNAME/YOUR_REPO.git repositories/your-repo</code></pre>



<h2 class="wp-block-heading">5. Deploy files to your website folder</h2>



<p>Copy repo files to your domain’s document root (example:&nbsp;public_html):</p>



<pre class="wp-block-code"><code>rsync -av --delete ~/repositories/your-repo/ ~/public_html/</code></pre>



<p>Now your site files are live.</p>



<h2 class="wp-block-heading">6. Updating after future GitHub pushes</h2>



<p>When you push new changes:</p>



<pre class="wp-block-code"><code>cd ~/repositories/your-repo
git pull origin main
rsync -av --delete ./ ~/public_html/</code></pre>



<h2 class="wp-block-heading">Common errors and fixes</h2>



<ul class="wp-block-list">
<li>could not read Username for &#8216;https://github.com&#8217;<br>You used HTTPS. Switch remote to SSH.</li>



<li>Permission denied (publickey)<br>Wrong/missing deploy key, or SSH config not using correct key.</li>



<li>Wrong branch (main vs master)<br>Pull the branch that actually exists.</li>
</ul>



<hr class="wp-block-separator has-alpha-channel-opacity"/>



<p>This setup gives you a secure and repeatable GitHub-to-cPanel deployment flow without making your repository public.</p>
]]></content:encoded>
					
					<wfw:commentRss>https://cjselvamani.com/how-to-connect-a-private-github-repo-to-cpanel-step-by-step/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>All in one Site Kit by Google</title>
		<link>https://cjselvamani.com/all-in-one-site-kit-by-google/</link>
					<comments>https://cjselvamani.com/all-in-one-site-kit-by-google/#respond</comments>
		
		<dc:creator><![CDATA[cjselvamani]]></dc:creator>
		<pubDate>Mon, 13 Apr 2020 15:31:45 +0000</pubDate>
				<category><![CDATA[Technology]]></category>
		<category><![CDATA[Configure Install Google Site Kit]]></category>
		<category><![CDATA[Google Site Kit]]></category>
		<category><![CDATA[Google Site Kit Plugin WordPress]]></category>
		<guid isPermaLink="false">https://cjselvamani.com/?p=370</guid>

					<description><![CDATA[If you are a blogger, website owner or developer and wondering how to optimize your [&#8230;]]]></description>
										<content:encoded><![CDATA[
<p>If you are a blogger, website owner or developer and wondering how to optimize your <a rel="noreferrer noopener" href="https://wordpress.org/" target="_blank">WordPress</a> website, no worries! There is a one-click solution to start with <strong><em><a rel="noreferrer noopener" href="https://wordpress.org/plugins/google-site-kit/" target="_blank">Site Kit by Google</a></em></strong>.</p>



<h4 class="wp-block-heading">Step 1</h4>



<p>Login to WordPress admin and click <em><strong>Plugins</strong></em> link, then its <strong><em>Add New</em></strong> sub-link</p>



<div class="wp-block-image"><figure class="aligncenter size-large"><img fetchpriority="high" decoding="async" width="179" height="442" src="https://cjselvamani.com/wp-content/uploads/2020/04/plugin.png" alt="" class="wp-image-373" srcset="https://cjselvamani.com/wp-content/uploads/2020/04/plugin.png 179w, https://cjselvamani.com/wp-content/uploads/2020/04/plugin-121x300.png 121w" sizes="(max-width: 179px) 100vw, 179px" /></figure></div>



<h4 class="wp-block-heading">Step 2 <br></h4>



<p>Type searching by a keyword <em><strong>Site Kit by Google</strong></em></p>



<div class="wp-block-image"><figure class="aligncenter size-large"><img decoding="async" width="392" height="85" src="https://cjselvamani.com/wp-content/uploads/2020/04/search-bar.png" alt="" class="wp-image-375" srcset="https://cjselvamani.com/wp-content/uploads/2020/04/search-bar.png 392w, https://cjselvamani.com/wp-content/uploads/2020/04/search-bar-300x65.png 300w" sizes="(max-width: 392px) 100vw, 392px" /></figure></div>



<p>Install the plugin by clicking the button <strong><em>Install Now</em></strong></p>



<div class="wp-block-image"><figure class="aligncenter size-large"><img decoding="async" width="620" height="196" src="https://cjselvamani.com/wp-content/uploads/2020/04/search-result.png" alt="" class="wp-image-376" srcset="https://cjselvamani.com/wp-content/uploads/2020/04/search-result.png 620w, https://cjselvamani.com/wp-content/uploads/2020/04/search-result-300x95.png 300w" sizes="(max-width: 620px) 100vw, 620px" /></figure></div>



<h4 class="wp-block-heading">Step 3</h4>



<p>Click link <strong><em>G Site Kit</em></strong></p>



<div class="wp-block-image"><figure class="aligncenter size-large"><img decoding="async" width="167" height="220" src="https://cjselvamani.com/wp-content/uploads/2020/04/Site-Kit.png" alt="" class="wp-image-377"/></figure></div>



<h4 class="wp-block-heading">Step 4</h4>



<p>Start configuring <strong><em>Google Analytics, Google AdSense, Google Search Console, Google PageSpeed Insights, Google Optimize, and Google Tag Manager</em></strong>. All in one place.</p>



<div class="wp-block-image"><figure class="aligncenter size-large"><img decoding="async" width="423" height="571" src="https://cjselvamani.com/wp-content/uploads/2020/04/Google-Site-Kit-Settings-WordPress.png" alt="" class="wp-image-378" srcset="https://cjselvamani.com/wp-content/uploads/2020/04/Google-Site-Kit-Settings-WordPress.png 423w, https://cjselvamani.com/wp-content/uploads/2020/04/Google-Site-Kit-Settings-WordPress-222x300.png 222w" sizes="(max-width: 423px) 100vw, 423px" /></figure></div>



<p>After all, it is not a bad start. Cheers!</p>
]]></content:encoded>
					
					<wfw:commentRss>https://cjselvamani.com/all-in-one-site-kit-by-google/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>Password protect the sub folder and accessing files on them</title>
		<link>https://cjselvamani.com/password-protect-the-sub-folder-and-accessing-files-on-them/</link>
					<comments>https://cjselvamani.com/password-protect-the-sub-folder-and-accessing-files-on-them/#respond</comments>
		
		<dc:creator><![CDATA[cjselvamani]]></dc:creator>
		<pubDate>Thu, 19 May 2016 11:34:11 +0000</pubDate>
				<category><![CDATA[Technology]]></category>
		<guid isPermaLink="false">http://www.cjselvamani.com/?p=183</guid>

					<description><![CDATA[Add the following script to the .htaccess file of the subfolder which you wish to [&#8230;]]]></description>
										<content:encoded><![CDATA[<p>Add the following script to the .htaccess file of the subfolder which you wish to password protect</p>
<pre class="lang:default decode:true ">ErrorDocument 401 "Authorisation Required"
AuthUserFile /home/account/public_html/.htpasswd
AuthName "Please Log In"
AuthGroupFile /dev/null
AuthType Basic
Require valid-user</pre>
<p>* here the line with &#8216;AuthUserFile&#8217; gives the full path of the .htpasswd file which contains login details to the subfolder.</p>
<p>http://www.htaccesstools.com/htpasswd-generator/<br />
http://tools.dynamicdrive.com/password/</p>
<p>The above 2 links will help to generate the content for the .htpasswd file</p>
<p>Ok next if we would like access the file inside the password protected folder then use the following sample curl script</p>
<pre class="lang:default decode:true ">$url = "http://www.domain.co.uk/subfolder/script.php";

$username = 'username';
$password = 'password';

$crl = curl_init();
$timeout = 10;
curl_setopt ($crl, CURLOPT_URL,$url);
curl_setopt ($crl, CURLOPT_RETURNTRANSFER, 1);
curl_setopt ($crl, CURLOPT_CONNECTTIMEOUT, $timeout);
curl_setopt ($crl, CURLOPT_HTTPAUTH, CURLAUTH_BASIC);
curl_setopt ($crl, CURLOPT_USERPWD, $username . ":" . $password);
$ret = curl_exec($crl);
curl_close($crl);
}</pre>
<p>P.S. This script has been tested with cPanel hosting with Apache web server.</p>
]]></content:encoded>
					
					<wfw:commentRss>https://cjselvamani.com/password-protect-the-sub-folder-and-accessing-files-on-them/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>Cannot login into the Magento 2 admin in Chrome</title>
		<link>https://cjselvamani.com/cannot-login-into-the-magento-2-admin-in-chrome/</link>
					<comments>https://cjselvamani.com/cannot-login-into-the-magento-2-admin-in-chrome/#respond</comments>
		
		<dc:creator><![CDATA[cjselvamani]]></dc:creator>
		<pubDate>Mon, 11 Jan 2016 14:12:46 +0000</pubDate>
				<category><![CDATA[Technology]]></category>
		<guid isPermaLink="false">http://www.cjselvamani.com/?p=179</guid>

					<description><![CDATA[I just found out I am not able to login magento admin on google chrome [&#8230;]]]></description>
										<content:encoded><![CDATA[<p>I just found out I am not able to login magento admin on google chrome browser and I am using Xampp. Seems like Magento 2 doesn&#8217;t allow &#8216;localhost&#8217; in the url something similar to &#8220;http://localhost/magento2&#8221;</p>
<p>But anyway there is a solution for this I have changed &#8220;http://localhost/magento2&#8221; to &#8220;http://127.0.0.1/magento2&#8221; . This can be updated directly on the Magento&#8217;s database table &#8216;core_config_data&#8217;.</p>
<p>Cheers!</p>
]]></content:encoded>
					
					<wfw:commentRss>https://cjselvamani.com/cannot-login-into-the-magento-2-admin-in-chrome/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>Can&#8217;t change the Order status to Canceled in Magento Admin</title>
		<link>https://cjselvamani.com/cant-change-the-order-status-to-canceled-in-magento-admin/</link>
					<comments>https://cjselvamani.com/cant-change-the-order-status-to-canceled-in-magento-admin/#respond</comments>
		
		<dc:creator><![CDATA[cjselvamani]]></dc:creator>
		<pubDate>Mon, 09 Mar 2015 09:56:42 +0000</pubDate>
				<category><![CDATA[Technology]]></category>
		<guid isPermaLink="false">http://www.cjselvamani.com/?p=169</guid>

					<description><![CDATA[Some time we cannot cancel the order in Magneto backend. The following statements need to [&#8230;]]]></description>
										<content:encoded><![CDATA[<p>Some time we cannot cancel the order in Magneto backend. The following statements need to be true before an order can be cancelled from adminpanel.</p>
<ol>
<li>If the payment can be voided,</li>
<li>If you cannot unhold the order,</li>
<li>If all items have have not been invoiced,</li>
<li>If the order is not cancelled, complete or closed,</li>
<li>Or if the order has not already been flagged to be cancelled,</li>
</ol>
<p>But this can be achieved by running sql query directly on the PHPMyadmin.</p>
<pre class="lang:default decode:true">UPDATE `sales_flat_order_grid` SET `status` = 'canceled' WHERE `sales_flat_order_grid`.`entity_id` = ENTITY_ID;

UPDATE `sales_flat_order` SET `status` = 'canceled', `state` = 'canceled' WHERE `sales_flat_order`.`entity_id` = ENTITY_ID;</pre>
<p>In the above sql queries&nbsp;<strong>ENTITY_ID </strong>will be replaced by an Order ID which status to be changed to &#8216;Canceled&#8217;. We can get the Order ID from the admin panel. To get this value navigate to &#8216;Sales -&gt; Orders&#8217; in the admin and click the Order row you want to change status. Once you are in the Order details page please check the URL and see the number placed between &#8216;order_id&#8217; and &#8216;key&#8217; and this is the Order ID</p>
<p>For example the following image &#8216;799&#8217; is the &#8216;ENTITY_ID&#8217; will be used in the SQL query.</p>
<p><a href="http://www.cjselvamani.com/wp-content/uploads/2014/12/order_id.jpg"><img decoding="async" class="size-full wp-image-132 alignnone" src="http://www.cjselvamani.com/wp-content/uploads/2014/12/order_id.jpg" alt="Magento Order ID" width="754" height="30"></a></p>
<p>&nbsp;</p>
<p>Cheers!</p>
]]></content:encoded>
					
					<wfw:commentRss>https://cjselvamani.com/cant-change-the-order-status-to-canceled-in-magento-admin/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>Add Free Shipping only to Speicific items in Magento</title>
		<link>https://cjselvamani.com/add-free-shipping-only-to-speicific-items-in-magento/</link>
					<comments>https://cjselvamani.com/add-free-shipping-only-to-speicific-items-in-magento/#respond</comments>
		
		<dc:creator><![CDATA[cjselvamani]]></dc:creator>
		<pubDate>Sat, 07 Mar 2015 13:06:04 +0000</pubDate>
				<category><![CDATA[Technology]]></category>
		<guid isPermaLink="false">http://www.cjselvamani.com/?p=161</guid>

					<description><![CDATA[Here is the steps helps us to set free shipping for specific products&#160;based on their [&#8230;]]]></description>
										<content:encoded><![CDATA[<p>Here is the steps helps us to set free shipping for specific products&nbsp;based on their skus.</p>
<h3>Step 1:</h3>
<p>Go to&nbsp;&#8216;Promotions -&gt; Shopping Cart Price Rules&#8217; and hit&nbsp;&#8216;Add New Rule&#8217; button. &nbsp;On the tab &#8216;Rule Information&#8217; select &#8216;No Coupon&#8217; on the &#8216;Coupon&#8217; field.</p>
<p><a href="http://www.cjselvamani.com/wp-content/uploads/2015/03/free-shipping1.png"><img decoding="async" class="alignleft size-full wp-image-164" src="http://www.cjselvamani.com/wp-content/uploads/2015/03/free-shipping1.png" alt="free-shipping1" width="1856" height="713"></a></p>
<h3>Step 2:</h3>
<p>On the tab &#8216;Conditions&#8217; set the condition you want the products to have the Free Shipping</p>
<p><a href="http://www.cjselvamani.com/wp-content/uploads/2015/03/free-shipping2.png"><img decoding="async" class="alignleft size-full wp-image-165" src="http://www.cjselvamani.com/wp-content/uploads/2015/03/free-shipping2.png" alt="free-shipping2" width="1873" height="249"></a></p>
<h3>Step 3:</h3>
<p>On the tab &#8216;Actions&#8217; please follow the image below for the settings. And make sure you have the conditions set to work only for the selected items.</p>
<p><a href="http://www.cjselvamani.com/wp-content/uploads/2015/03/free-shipping3.png"><img decoding="async" class="alignleft size-full wp-image-166" src="http://www.cjselvamani.com/wp-content/uploads/2015/03/free-shipping3.png" alt="free-shipping3" width="1880" height="452"></a></p>
<p>&nbsp;</p>
<p>Now we are done with it and Save now. Please go to the website front end and test it! You will have the Free shipping working for this selected items.</p>
<p>Cheers!</p>
]]></content:encoded>
					
					<wfw:commentRss>https://cjselvamani.com/add-free-shipping-only-to-speicific-items-in-magento/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>Add LESS, SCSS, SASS syntax highlight to Adobe Dreamweaver CS6</title>
		<link>https://cjselvamani.com/add-less-sass-syntax-highlight-adobe-dreamweaver-cs6/</link>
					<comments>https://cjselvamani.com/add-less-sass-syntax-highlight-adobe-dreamweaver-cs6/#respond</comments>
		
		<dc:creator><![CDATA[cjselvamani]]></dc:creator>
		<pubDate>Sat, 17 Jan 2015 01:11:00 +0000</pubDate>
				<category><![CDATA[Technology]]></category>
		<guid isPermaLink="false">http://www.cjselvamani.com/?p=107</guid>

					<description><![CDATA[I want to use SCSS and LESS files with my Dreamweaver CS6 with CSS syntax [&#8230;]]]></description>
										<content:encoded><![CDATA[<p>I want to use SCSS and LESS files with my Dreamweaver CS6 with CSS syntax highlights. So I did the following two simple steps on my Windows 7 PC to provide color coding or hinting.<br />
As always, here’s the disclaimer – you’re going to be editing files in Dreamweaver’s Configuration folder, so proceed with caution, make a backup of the originals, etc.</p>
<p>1. The first thing that we need to do is to tell Dreamweaver that it’s okay to open a .scss or .less file – something that Dreamweaver by default doesn’t understand. You’ll first need to take a peak in your personal Dreamweaver configuration folder – on a Windows 7, that’s located in &#8220;C:\Users\~username\AppData\Roaming\Adobe\Dreamweaver CS6\en_US\Configuration&#8221; – and locate a file named &#8220;Extensions.txt&#8221;. Open the file and add SCSS (or SASS if you’re using the older syntax) and LESS to line 8, so that it reads: &#8220;CSS,SCSS,LESS:Style Sheets&#8221;.<a href="http://www.cjselvamani.com/wp-content/uploads/2015/01/dw1.jpg"><img decoding="async" class="alignleft size-full wp-image-139" src="http://www.cjselvamani.com/wp-content/uploads/2015/01/dw1.jpg" alt="dw1" width="672" height="552"></a></p>
<p>&nbsp;</p>
<p>2. Secondly we need to do the same as we did in the first step &#8220;C:\Users\~username\AppData\Roaming\Adobe\Dreamweaver CS6\en_US\Configuration\DocumentTypes&#8221; – and locate a file named &#8220;MMDocumentTypes.xml&#8221;. Open the file and add scss(or sass&nbsp;if you’re using the older syntax) and less&nbsp;to line 142, so that it reads: &#8216;&lt;documenttype id=&#8221;CSS&#8221; internaltype=&#8221;Text&#8221; winfileextension=&#8221;css,scss,less&#8221; macfileextension=&#8221;css,scss,less&#8221; file=&#8221;Default.css&#8221; writebyteordermark=&#8221;false&#8221; mimetype=&#8221;text/css&#8221; &gt;&#8217;.<a href="http://www.cjselvamani.com/wp-content/uploads/2015/01/dw2.jpg"><img decoding="async" class="alignleft size-full wp-image-140" src="http://www.cjselvamani.com/wp-content/uploads/2015/01/dw2.jpg" alt="dw2" width="1029" height="615"></a></p>
<p>&nbsp;</p>
<p>Now save the files and restart Dreamweaver. You should now be able to click on a .scss or .less file in your explorer&nbsp;and have it open in Dreamweaver.</p>
<p>Cheers!</p>
<p>&nbsp;</p>
]]></content:encoded>
					
					<wfw:commentRss>https://cjselvamani.com/add-less-sass-syntax-highlight-adobe-dreamweaver-cs6/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>Determine Category and Product page in Magento</title>
		<link>https://cjselvamani.com/determine-category-product-page-magento/</link>
					<comments>https://cjselvamani.com/determine-category-product-page-magento/#respond</comments>
		
		<dc:creator><![CDATA[cjselvamani]]></dc:creator>
		<pubDate>Sat, 25 Oct 2014 22:49:00 +0000</pubDate>
				<category><![CDATA[Technology]]></category>
		<guid isPermaLink="false">http://www.cjselvamani.com/?p=105</guid>

					<description><![CDATA[Some times in Magento we need to put some snippets only on the Category(Product Listing) [&#8230;]]]></description>
										<content:encoded><![CDATA[<p>Some times in Magento we need to put some snippets only on the Category(Product Listing) or&nbsp;Product Details page.</p>
<p>The following code helps to determine whether it is Category page or not?</p>
<pre class="lang:default decode:true ">&lt;?php
if(Mage::registry('current_category')) {
&nbsp; &nbsp; //Place your content/snippet here
}
?&gt;</pre>
<p>&nbsp;</p>
<p>The following code helps to determine whether it is Product Details&nbsp;page or not?</p>
<p>&nbsp;</p>
<pre class="lang:default decode:true ">&lt;?php
if(Mage::registry('current_product')) {
&nbsp; &nbsp; //Place your content/snippet here
}
?&gt;</pre>
<p>We could use this code anywhere in modules or in ,phtml files placed under &#8216;app/design/frontend/[package]/[theme]/ template/&#8217;</p>
<p>Cheers!</p>
]]></content:encoded>
					
					<wfw:commentRss>https://cjselvamani.com/determine-category-product-page-magento/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
	</channel>
</rss>
