<?xml version="1.0" encoding="UTF-8"?><urlset xmlns="http://www.sitemaps.org/schemas/sitemap/0.9" xmlns:image="http://www.google.com/schemas/sitemap-image/1.1"><url><loc>https://codenx.com/postgresql/postgresql-secure-vps/</loc><lastmod>2026-07-23T00:00:00.000Z</lastmod><image:image><image:loc>https://codenx.com/images/articles/postgresql-secure-vps/banner.webp</image:loc><image:title>How to Run PostgreSQL Securely on a VPS</image:title><image:caption>A PostgreSQL server bound to a private interface with role privileges listed</image:caption></image:image></url><url><loc>https://codenx.com/github-actions/github-actions-deployment-pipeline/</loc><lastmod>2026-07-01T00:00:00.000Z</lastmod><image:image><image:loc>https://codenx.com/images/articles/github-actions-deployment-pipeline/banner.webp</image:loc><image:title>How to Build a GitHub Actions Deployment Pipeline</image:title><image:caption>A three-stage GitHub Actions pipeline running test, build and deploy jobs</image:caption></image:image><image:image><image:loc>https://codenx.com/screenshots/github-actions-deployment-pipeline/environment-approval.webp</image:loc><image:title>A required reviewer turns an accidental merge into a prompt instead of a deploy.</image:title><image:caption>A GitHub Actions deploy job waiting on a required reviewer for the production environment</image:caption></image:image></url><url><loc>https://codenx.com/meilisearch/meilisearch-production-setup/</loc><lastmod>2026-06-17T00:00:00.000Z</lastmod><image:image><image:loc>https://codenx.com/images/articles/meilisearch-production-setup/banner.webp</image:loc><image:title>How to Run Meilisearch in Production with Docker</image:title><image:caption>A Meilisearch container serving search requests behind a reverse proxy</image:caption></image:image><image:image><image:loc>https://codenx.com/screenshots/meilisearch-production-setup/task-list.webp</image:loc><image:title>Settings changes are asynchronous tasks — always check the task, not the HTTP status.</image:title><image:caption>The Meilisearch tasks endpoint showing a completed settings update</image:caption></image:image></url><url><loc>https://codenx.com/ai-agents/ai-coding-agent-workflow/</loc><lastmod>2026-06-03T00:00:00.000Z</lastmod><image:image><image:loc>https://codenx.com/images/articles/ai-coding-agent-workflow/banner.webp</image:loc><image:title>An AI Coding Agent Workflow That Keeps Diffs Reviewable</image:title><image:caption>A git diff view next to an agent session log showing a single scoped task</image:caption></image:image><image:image><image:loc>https://codenx.com/screenshots/ai-coding-agent-workflow/worktree-layout.webp</image:loc><image:title>One worktree per task keeps parallel sessions from fighting over the index.</image:title><image:caption>Two git worktrees open side by side, one per agent task</image:caption></image:image></url><url><loc>https://codenx.com/claude-code/claude-code-existing-typescript-project/</loc><lastmod>2026-07-02T00:00:00.000Z</lastmod><image:image><image:loc>https://codenx.com/images/articles/claude-code-existing-typescript-project/banner.webp</image:loc><image:title>How to Use Claude Code on an Existing TypeScript Project</image:title><image:caption>A terminal running Claude Code beside a TypeScript project tree</image:caption></image:image><image:image><image:loc>https://codenx.com/screenshots/claude-code-existing-typescript-project/permissions-prompt.webp</image:loc><image:title>Every command outside the allow list stops for approval before it runs.</image:title><image:caption>Claude Code asking for approval before running an unlisted bash command</image:caption></image:image><image:image><image:loc>https://codenx.com/screenshots/claude-code-existing-typescript-project/typecheck-hook.webp</image:loc><image:title>A PostToolUse hook turns every edit into a compile check.</image:title><image:caption>A PostToolUse hook running tsc immediately after a file edit</image:caption></image:image></url><url><loc>https://codenx.com/traefik/cloudflare-tunnel-traefik/</loc><lastmod>2026-05-05T00:00:00.000Z</lastmod><image:image><image:loc>https://codenx.com/images/articles/cloudflare-tunnel-traefik/banner.webp</image:loc><image:title>How to Run Cloudflare Tunnel in Front of Traefik</image:title><image:caption>An outbound tunnel from a Docker host to Cloudflare with all inbound ports closed</image:caption></image:image><image:image><image:loc>https://codenx.com/screenshots/cloudflare-tunnel-traefik/tunnel-hostnames.webp</image:loc><image:title>One public hostname per service, all pointing at the same Traefik entrypoint.</image:title><image:caption>Cloudflare Zero Trust dashboard listing public hostnames routed to a tunnel</image:caption></image:image><image:image><image:loc>https://codenx.com/screenshots/cloudflare-tunnel-traefik/tunnel-healthy.webp</image:loc><image:title>Four connections is normal — cloudflared dials two data centres, twice each.</image:title><image:caption>A Cloudflare tunnel showing four healthy connector connections</image:caption></image:image></url><url><loc>https://codenx.com/dokploy/dokploy-zero-downtime-health-checks/</loc><lastmod>2026-04-21T00:00:00.000Z</lastmod><image:image><image:loc>https://codenx.com/images/articles/dokploy-zero-downtime-health-checks/banner.webp</image:loc><image:title>Zero-Downtime Deploys in Dokploy with Docker Health Checks</image:title><image:caption>A Docker Swarm rolling update replacing one task at a time behind Traefik</image:caption></image:image><image:image><image:loc>https://codenx.com/screenshots/dokploy-zero-downtime-health-checks/service-ps.webp</image:loc><image:title>During a start-first update both versions are briefly live at once.</image:title><image:caption>docker service ps output showing a new task running while the old one shuts down</image:caption></image:image></url><url><loc>https://codenx.com/astro/deploy-astro-cloudflare-workers/</loc><lastmod>2026-07-14T00:00:00.000Z</lastmod><image:image><image:loc>https://codenx.com/images/articles/deploy-astro-cloudflare-workers/banner.webp</image:loc><image:title>How to Deploy an Astro Site to Cloudflare Workers</image:title><image:caption>An Astro build output being uploaded to the Cloudflare Workers edge</image:caption></image:image><image:image><image:loc>https://codenx.com/screenshots/deploy-astro-cloudflare-workers/wrangler-deploy.webp</image:loc><image:title>Wrangler prints the deployed version id — keep it, rollbacks need it.</image:title><image:caption>Wrangler deploy output showing uploaded assets and the workers.dev URL</image:caption></image:image></url><url><loc>https://codenx.com/docker/backup-docker-volumes-automatically/</loc><lastmod>2026-07-06T00:00:00.000Z</lastmod><image:image><image:loc>https://codenx.com/images/articles/backup-docker-volumes-automatically/banner.webp</image:loc><image:title>How to Back Up Docker Volumes Automatically</image:title><image:caption>A nightly systemd timer copying Docker volume snapshots to offsite storage</image:caption></image:image><image:image><image:loc>https://codenx.com/screenshots/backup-docker-volumes-automatically/timer-list.webp</image:loc><image:title>A timer that has never fired is the most common silent backup failure.</image:title><image:caption>systemctl list-timers output showing the next scheduled backup run</image:caption></image:image></url><url><loc>https://codenx.com/dokploy/dokploy-vs-coolify-self-hosting/</loc><lastmod>2026-07-22T00:00:00.000Z</lastmod><image:image><image:loc>https://codenx.com/images/articles/dokploy-vs-coolify-self-hosting/banner.webp</image:loc><image:title>Dokploy vs Coolify: Choosing a Self-Hosting Platform</image:title><image:caption>Split view of the Dokploy and Coolify deployment dashboards side by side</image:caption></image:image><image:image><image:loc>https://codenx.com/screenshots/dokploy-vs-coolify-self-hosting/dokploy-project.webp</image:loc><image:title>Dokploy groups applications, databases and Compose stacks into projects.</image:title><image:caption>A Dokploy project page listing an application and a PostgreSQL database</image:caption></image:image><image:image><image:loc>https://codenx.com/screenshots/dokploy-vs-coolify-self-hosting/coolify-resources.webp</image:loc><image:title>Coolify&apos;s model is servers first, then resources placed on them.</image:title><image:caption>The Coolify dashboard showing resources attached to a server</image:caption></image:image></url><url><loc>https://codenx.com/troubleshooting/fix-docker-too-many-open-files/</loc><lastmod>2026-05-28T00:00:00.000Z</lastmod><image:image><image:loc>https://codenx.com/images/articles/fix-docker-too-many-open-files/banner.webp</image:loc><image:title>How to Fix the Docker Too Many Open Files Error on Ubuntu</image:title><image:caption>A terminal showing an accept4 too many open files error in a container log</image:caption></image:image></url><url><loc>https://codenx.com/vps/secure-vps-running-docker/</loc><lastmod>2026-07-08T00:00:00.000Z</lastmod><image:image><image:loc>https://codenx.com/images/articles/secure-vps-running-docker/banner.webp</image:loc><image:title>How to Secure a VPS That Runs Docker Containers</image:title><image:caption>A firewall rule list beside a Docker container port mapping diagram</image:caption></image:image><image:image><image:loc>https://codenx.com/screenshots/secure-vps-running-docker/ufw-status.webp</image:loc><image:title>Three inbound rules is the target state for a web-facing host.</image:title><image:caption>Terminal showing ufw status numbered with a minimal allow list</image:caption></image:image></url><url><loc>https://codenx.com/cloudflare/point-cloudflare-domain-to-vps/</loc><lastmod>2026-02-26T00:00:00.000Z</lastmod><image:image><image:loc>https://codenx.com/images/articles/point-cloudflare-domain-to-vps/banner.webp</image:loc><image:title>How to Point a Cloudflare Domain at Your VPS</image:title><image:caption>A Cloudflare DNS record row with the orange proxy cloud enabled</image:caption></image:image><image:image><image:loc>https://codenx.com/screenshots/point-cloudflare-domain-to-vps/dns-record.webp</image:loc><image:title>The orange cloud means traffic goes through Cloudflare before it reaches your server.</image:title><image:caption>Cloudflare DNS panel showing an A record with proxy status enabled</image:caption></image:image><image:image><image:loc>https://codenx.com/screenshots/point-cloudflare-domain-to-vps/ssl-mode.webp</image:loc><image:title>Full (strict) is the only mode that validates your origin certificate.</image:title><image:caption>The Cloudflare SSL/TLS encryption mode selector set to Full strict</image:caption></image:image></url><url><loc>https://codenx.com/n8n/deploy-n8n-vps-docker/</loc><lastmod>2026-06-20T00:00:00.000Z</lastmod><image:image><image:loc>https://codenx.com/images/articles/deploy-n8n-vps-docker/banner.webp</image:loc><image:title>How to Deploy n8n on an Ubuntu VPS with Docker</image:title><image:caption>An n8n workflow canvas running behind a Docker Compose stack on a VPS</image:caption></image:image><image:image><image:loc>https://codenx.com/screenshots/deploy-n8n-vps-docker/owner-setup.webp</image:loc><image:title>The first browser visit creates the owner account. Do this immediately.</image:title><image:caption>The n8n owner account setup screen on a fresh install</image:caption></image:image><image:image><image:loc>https://codenx.com/screenshots/deploy-n8n-vps-docker/compose-ps.webp</image:loc><image:title>All three services should report running before you open the UI.</image:title><image:caption>Terminal output of docker compose ps showing three healthy services</image:caption></image:image></url></urlset>