{"id":87,"date":"2025-08-10T14:24:59","date_gmt":"2025-08-10T18:24:59","guid":{"rendered":"https:\/\/www.varchitected.com\/?p=87"},"modified":"2025-08-10T19:27:37","modified_gmt":"2025-08-10T23:27:37","slug":"%f0%9f%8f%acqnap-nas-vcf-http-offline-depot-setup","status":"publish","type":"post","link":"https:\/\/varchitected.com\/?p=87","title":{"rendered":"\ud83c\udfec QNAP NAS \u2192 VCF HTTP Offline Depot Setup"},"content":{"rendered":"\n<p>If you want to host the VCF Offline Depot on your QNAP NAS, this walkthrough gets you up and running fast. Hosting the depot locally saves space, bandwidth, and even cuts down the number of helper VMs you\u2019d otherwise keep around.<\/p>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<p>Tested on:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong>QNAP<\/strong> TVS-h1688X<\/li>\n\n\n\n<li><strong>QuTS hero<\/strong> h5.2.6.3195<\/li>\n\n\n\n<li>VCF Installer <strong>\u2192<\/strong> VCF-SDDC-Manager-Appliance-9.0.0.0.24703748.ova<\/li>\n<\/ul>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h2 class=\"wp-block-heading\">Step 1) Enable the Web Server<\/h2>\n\n\n\n<p><strong>Control Panel \u2192 Applications \u2192 Web Server \u2192 Enable Web Server<\/strong>.<br>(HTTP is fine here; I\u2019ll show the VCF Installer tweak for HTTP a bit later.)<\/p>\n\n\n\n<figure class=\"wp-block-image size-large\"><img loading=\"lazy\" decoding=\"async\" width=\"928\" height=\"1024\" src=\"https:\/\/www.varchitected.com\/wp-content\/uploads\/2025\/08\/image-5-928x1024.png\" alt=\"\" class=\"wp-image-89\" srcset=\"https:\/\/varchitected.com\/wp-content\/uploads\/2025\/08\/image-5-928x1024.png 928w, https:\/\/varchitected.com\/wp-content\/uploads\/2025\/08\/image-5-272x300.png 272w, https:\/\/varchitected.com\/wp-content\/uploads\/2025\/08\/image-5-768x847.png 768w, https:\/\/varchitected.com\/wp-content\/uploads\/2025\/08\/image-5-1392x1536.png 1392w, https:\/\/varchitected.com\/wp-content\/uploads\/2025\/08\/image-5.png 1430w\" sizes=\"auto, (max-width: 928px) 100vw, 928px\" \/><\/figure>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h2 class=\"wp-block-heading\">Step 2) Move the files to your Web Root<\/h2>\n\n\n\n<p>By default, QNAP serves from the <strong>Web <\/strong>share. In my case that\u2019s:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>\/share\/ZFS24_DATA\/Web\/<\/code><\/pre>\n\n\n\n<p>You can use the default Web share or create a <strong>Virtual Host<\/strong> if you want a dedicated hostname\/port. The important part is that your <strong>document root<\/strong> actually contains the VCF depot layout.<\/p>\n\n\n\n<p>This is the exact folder structure that worked for me:<\/p>\n\n\n\n<figure class=\"wp-block-image size-full\"><img loading=\"lazy\" decoding=\"async\" width=\"640\" height=\"325\" src=\"https:\/\/www.varchitected.com\/wp-content\/uploads\/2025\/08\/image-7-edited.png\" alt=\"\" class=\"wp-image-112\" srcset=\"https:\/\/varchitected.com\/wp-content\/uploads\/2025\/08\/image-7-edited.png 640w, https:\/\/varchitected.com\/wp-content\/uploads\/2025\/08\/image-7-edited-300x152.png 300w\" sizes=\"auto, (max-width: 640px) 100vw, 640px\" \/><\/figure>\n\n\n\n<p>I had to move the <strong>vsan folder <\/strong>and <strong>metadata folder <\/strong>into the <strong>PROD folder<\/strong> to sit alongside the <strong>COMP folder<\/strong>, both of those originally downloaded into <strong>COMP <\/strong>automatically.<\/p>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h2 class=\"wp-block-heading\">Step 3) Add basic authentication<\/h2>\n\n\n\n<p>Create your .htaccess and .htpasswd files, here&#8217;s the content of my .htaccess: <\/p>\n\n\n\n<pre class=\"wp-block-code\"><code># at <strong>\/share\/ZFS24_DATA\/Web\/<\/strong>.htaccess (you will need to change your path so it matches what your ZFS path is\nOptions +Indexes\nIndexOptions FancyIndexing NameWidth=*\n\nAuthType Basic\nAuthName \"Restricted Area\"\nAuthUserFile <strong>\/share\/ZFS24_DATA\/Web\/<\/strong>.htpasswd\n\n# Let Java\/okhttp clients (VCF) through without a password\nSetEnvIfNoCase User-Agent \"Java|okhttp\" vcf_ok=1\n\n&lt;IfModule mod_authz_core.c&gt;        # Apache 2.4\n  &lt;RequireAny&gt;\n    Require env vcf_ok\n    Require valid-user\n  &lt;\/RequireAny&gt;\n&lt;\/IfModule&gt;\n&lt;IfModule !mod_authz_core.c&gt;       # Apache 2.2 fallback\n  Order allow,deny\n  Allow from env=vcf_ok\n  Satisfy any\n  Require valid-user\n&lt;\/IfModule&gt;\n\n# Don\u2019t leak .ht* files\n&lt;FilesMatch \"^\\.ht\"&gt;\n  Require all denied\n&lt;\/FilesMatch&gt;\n\n# Make sure JSON is sent with correct type\nAddType application\/json .json<\/code><\/pre>\n\n\n\n<p>I then ran these commands to create my <strong>.htpsswd file<\/strong> on the QNAP NAS via PuTTy:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>HASH=$(openssl passwd -apr1 'YourStrongPassword!')\necho \"admin:$HASH\" &gt; <strong>\/share\/ZFS24_DATA\/Web\/<\/strong>.htpasswd<\/code><\/pre>\n\n\n\n<p><strong>htpsswd<\/strong> is not a command that is found in bash on the QNAP NAS, instead you can leverage openssl to hash your password:<\/p>\n\n\n\n<figure class=\"wp-block-image size-full\"><img loading=\"lazy\" decoding=\"async\" width=\"636\" height=\"48\" src=\"https:\/\/www.varchitected.com\/wp-content\/uploads\/2025\/08\/image-8.png\" alt=\"\" class=\"wp-image-92\" srcset=\"https:\/\/varchitected.com\/wp-content\/uploads\/2025\/08\/image-8.png 636w, https:\/\/varchitected.com\/wp-content\/uploads\/2025\/08\/image-8-300x23.png 300w\" sizes=\"auto, (max-width: 636px) 100vw, 636px\" \/><\/figure>\n\n\n\n<p>Restart the QNAP web server:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>\/etc\/init.d\/Qthttpd.sh restart<\/code><\/pre>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h2 class=\"wp-block-heading\">Step 4) Allow HTTP for the Offline Depot on the VCF Installer Appliance<\/h2>\n\n\n\n<p>By default the VCF Installer is looking to use HTTPS when connecting to the Offline Depot. For the purposes of a lab, this is overkill. The command below will allow you to connect to an Offline Depot with HTTP. <br><\/p>\n\n\n\n<p>While the VCF user is allowed to connect via SSH, it doesn\u2019t have privileges to edit the file that we need to make the change on. The default setting for root is that it\u2019s not allowed to login via SSH on the VCF Installer Appliance, you can change this if you want. I found it quicker to do what you need via the console where root is allowed to login:<\/p>\n\n\n\n<figure class=\"wp-block-image size-full\"><img loading=\"lazy\" decoding=\"async\" width=\"794\" height=\"366\" src=\"https:\/\/www.varchitected.com\/wp-content\/uploads\/2025\/08\/Screenshot-2025-08-10-121112.png\" alt=\"\" class=\"wp-image-93\" srcset=\"https:\/\/varchitected.com\/wp-content\/uploads\/2025\/08\/Screenshot-2025-08-10-121112.png 794w, https:\/\/varchitected.com\/wp-content\/uploads\/2025\/08\/Screenshot-2025-08-10-121112-300x138.png 300w, https:\/\/varchitected.com\/wp-content\/uploads\/2025\/08\/Screenshot-2025-08-10-121112-768x354.png 768w\" sizes=\"auto, (max-width: 794px) 100vw, 794px\" \/><\/figure>\n\n\n\n<pre class=\"wp-block-code\"><code>echo \"lcm.depot.adapter.httpsEnabled=false\" &gt;&gt; \/opt\/vmware\/vcf\/lcm\/lcm-app\/conf\/application-prod.properties<br>systemctl restart lcm<\/code><\/pre>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h2 class=\"wp-block-heading\">Step 5) Add the Offline Depot in the VCF Installer UI<\/h2>\n\n\n\n<p>This is relatively simple, you just need to put in your details and hit Configure:<\/p>\n\n\n\n<figure class=\"wp-block-image size-large\"><img loading=\"lazy\" decoding=\"async\" width=\"1024\" height=\"459\" src=\"https:\/\/www.varchitected.com\/wp-content\/uploads\/2025\/08\/image-9-1024x459.png\" alt=\"\" class=\"wp-image-94\" srcset=\"https:\/\/varchitected.com\/wp-content\/uploads\/2025\/08\/image-9-1024x459.png 1024w, https:\/\/varchitected.com\/wp-content\/uploads\/2025\/08\/image-9-300x134.png 300w, https:\/\/varchitected.com\/wp-content\/uploads\/2025\/08\/image-9-768x344.png 768w, https:\/\/varchitected.com\/wp-content\/uploads\/2025\/08\/image-9.png 1073w\" sizes=\"auto, (max-width: 1024px) 100vw, 1024px\" \/><\/figure>\n\n\n\n<p>If you run into issues, you can leverage CURL to validate whether or not you can authenticate. Success looks like <strong>HTTP\/1.1 200 OK<\/strong>.<br><br>While testing this out, I got a few HTTP\/1.1 401 Errors:<\/p>\n\n\n\n<figure class=\"wp-block-image size-large\"><img loading=\"lazy\" decoding=\"async\" width=\"1024\" height=\"91\" src=\"https:\/\/www.varchitected.com\/wp-content\/uploads\/2025\/08\/Screenshot-2025-08-10-121917-1024x91.png\" alt=\"\" class=\"wp-image-95\" srcset=\"https:\/\/varchitected.com\/wp-content\/uploads\/2025\/08\/Screenshot-2025-08-10-121917-1024x91.png 1024w, https:\/\/varchitected.com\/wp-content\/uploads\/2025\/08\/Screenshot-2025-08-10-121917-300x27.png 300w, https:\/\/varchitected.com\/wp-content\/uploads\/2025\/08\/Screenshot-2025-08-10-121917-768x68.png 768w, https:\/\/varchitected.com\/wp-content\/uploads\/2025\/08\/Screenshot-2025-08-10-121917-1536x137.png 1536w, https:\/\/varchitected.com\/wp-content\/uploads\/2025\/08\/Screenshot-2025-08-10-121917.png 2000w\" sizes=\"auto, (max-width: 1024px) 100vw, 1024px\" \/><\/figure>\n\n\n\n<p>Once I fixed my <strong>.htaccess <\/strong>file, those errors were resolved:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>curl -I -u 'admin:y0ur$tr0ngPa$$w0rd!!' http:\/\/offlinedepot2.varchitected.com\/PROD\/metadata\/productVersionCatalog\/v1\/productVersionCatalog.json<\/code><\/pre>\n\n\n\n<figure class=\"wp-block-image size-large\"><img loading=\"lazy\" decoding=\"async\" width=\"1024\" height=\"240\" src=\"https:\/\/www.varchitected.com\/wp-content\/uploads\/2025\/08\/image-11-1024x240.png\" alt=\"\" class=\"wp-image-98\" srcset=\"https:\/\/varchitected.com\/wp-content\/uploads\/2025\/08\/image-11-1024x240.png 1024w, https:\/\/varchitected.com\/wp-content\/uploads\/2025\/08\/image-11-300x70.png 300w, https:\/\/varchitected.com\/wp-content\/uploads\/2025\/08\/image-11-768x180.png 768w, https:\/\/varchitected.com\/wp-content\/uploads\/2025\/08\/image-11.png 1200w\" sizes=\"auto, (max-width: 1024px) 100vw, 1024px\" \/><\/figure>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h2 class=\"wp-block-heading\">Step 6) Pre-stage the bits<\/h2>\n\n\n\n<p>Click <strong>Download<\/strong> to pre-stage the content you need (select all of the files first).<\/p>\n\n\n\n<figure class=\"wp-block-image size-large\"><img loading=\"lazy\" decoding=\"async\" width=\"1024\" height=\"640\" src=\"https:\/\/www.varchitected.com\/wp-content\/uploads\/2025\/08\/Screenshot-2025-08-10-132334-1024x640.png\" alt=\"\" class=\"wp-image-96\" srcset=\"https:\/\/varchitected.com\/wp-content\/uploads\/2025\/08\/Screenshot-2025-08-10-132334-1024x640.png 1024w, https:\/\/varchitected.com\/wp-content\/uploads\/2025\/08\/Screenshot-2025-08-10-132334-300x187.png 300w, https:\/\/varchitected.com\/wp-content\/uploads\/2025\/08\/Screenshot-2025-08-10-132334-768x480.png 768w, https:\/\/varchitected.com\/wp-content\/uploads\/2025\/08\/Screenshot-2025-08-10-132334-1536x960.png 1536w, https:\/\/varchitected.com\/wp-content\/uploads\/2025\/08\/Screenshot-2025-08-10-132334-2048x1280.png 2048w\" sizes=\"auto, (max-width: 1024px) 100vw, 1024px\" \/><\/figure>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h2 class=\"wp-block-heading\">Step 7) Wait for the files to Load&#8230;<br><\/h2>\n\n\n\n<figure class=\"wp-block-image size-large\"><img loading=\"lazy\" decoding=\"async\" width=\"1024\" height=\"641\" src=\"https:\/\/www.varchitected.com\/wp-content\/uploads\/2025\/08\/image-10-1024x641.png\" alt=\"\" class=\"wp-image-97\" srcset=\"https:\/\/varchitected.com\/wp-content\/uploads\/2025\/08\/image-10-1024x641.png 1024w, https:\/\/varchitected.com\/wp-content\/uploads\/2025\/08\/image-10-300x188.png 300w, https:\/\/varchitected.com\/wp-content\/uploads\/2025\/08\/image-10-768x481.png 768w, https:\/\/varchitected.com\/wp-content\/uploads\/2025\/08\/image-10-1536x962.png 1536w, https:\/\/varchitected.com\/wp-content\/uploads\/2025\/08\/image-10-2048x1283.png 2048w\" sizes=\"auto, (max-width: 1024px) 100vw, 1024px\" \/><\/figure>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h2 class=\"wp-block-heading\">Outtro (the witty bit)<\/h2>\n\n\n\n<p>Congratulations, you just turned a humble QNAP into a <strong>mini-CDN for SDDC Manager<\/strong>. Fewer VMs, fewer downloads from the internet, and CPU cycles easing into a smooth landing, leaving more runway for your lab workloads instead. If only every homelab project was this satisfying: copy some files, charm Apache with a <code>.htaccess<\/code>, flip one tiny flag in the VCF Installer, and boom. <strong>VCF now eats from your own buffet.<\/strong> Bon app\u00e9tit, SDDC. Now you can deploy VCF 9.0 with your own Offline Depot.\ud83c\udf74\ud83d\ude80<\/p>\n\n\n\n<p><\/p>\n","protected":false},"excerpt":{"rendered":"<p>If you want to host the VCF Offline Depot on your QNAP NAS, this walkthrough gets you up and running fast. Hosting the depot locally saves space, bandwidth, and even cuts down the number of helper VMs you\u2019d otherwise keep around. Tested on: Step 1) Enable the Web Server Control Panel \u2192 Applications \u2192 Web [&hellip;]<\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[7,8,10,5],"tags":[],"class_list":["post-87","post","type-post","status-publish","format-standard","hentry","category-homelab","category-offlinedepot","category-qnap","category-vcf"],"_links":{"self":[{"href":"https:\/\/varchitected.com\/index.php?rest_route=\/wp\/v2\/posts\/87","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/varchitected.com\/index.php?rest_route=\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/varchitected.com\/index.php?rest_route=\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/varchitected.com\/index.php?rest_route=\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/varchitected.com\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=87"}],"version-history":[{"count":13,"href":"https:\/\/varchitected.com\/index.php?rest_route=\/wp\/v2\/posts\/87\/revisions"}],"predecessor-version":[{"id":116,"href":"https:\/\/varchitected.com\/index.php?rest_route=\/wp\/v2\/posts\/87\/revisions\/116"}],"wp:attachment":[{"href":"https:\/\/varchitected.com\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=87"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/varchitected.com\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=87"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/varchitected.com\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=87"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}