{"id":1033,"date":"2026-11-08T09:00:00","date_gmt":"2026-11-08T09:00:00","guid":{"rendered":"https:\/\/vpslake.com\/blog\/?p=1033"},"modified":"2026-11-08T09:00:00","modified_gmt":"2026-11-08T09:00:00","slug":"install-chevereto-free-debian-11-lamp","status":"publish","type":"post","link":"https:\/\/vpslake.com\/blog\/2026\/11\/08\/install-chevereto-free-debian-11-lamp\/","title":{"rendered":"How to Install Chevereto Free on Debian 11 with LAMP"},"content":{"rendered":"\n<p class=\"wp-block-paragraph\">Install Chevereto Free on Debian 11 and turn a fresh VPS into a private image-hosting site in about 20 minutes. This guide builds the LAMP stack around Apache, MariaDB, and PHP 8.2, then adds HTTPS and the recurring Chevereto scheduler.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Debian 11 (Bullseye) is past its normal release lifecycle, so use this procedure for an existing Bullseye server and plan a move to a supported Debian release. The current Chevereto Free line needs PHP 8.2, which is why the guide uses the signed PHP repository instead of Debian 11&#8217;s older default PHP package.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Prerequisites<\/h2>\n\n\n\n<ul class=\"wp-block-list\">\n\n<li>A 64-bit VPS running Debian GNU\/Linux 11 (Bullseye), with at least 2 GB of RAM and 20 GB of free disk space for the application, thumbnails, and uploads.<\/li>\n\n\n<li>SSH access as <code>root<\/code>, or a normal account with working <code>sudo<\/code> privileges.<\/li>\n\n\n<li>A domain such as <code>YOUR_DOMAIN<\/code> pointed with an A record to the VPS IPv4 address. Use the domain&#8217;s DNS name for HTTPS; an IP-only installation cannot receive a normal Let&#8217;s Encrypt certificate.<\/li>\n\n\n<li>Outbound HTTPS access to the Debian mirrors, the PHP package repository, and Chevereto&#8217;s download service.<\/li>\n\n\n<li>A <a href=\"https:\/\/vpslake.com\/buy-vps\">VPSLake Linux VPS<\/a> if you need a Debian server with root access for this installation.<\/li>\n\n<\/ul>\n\n\n\n<p class=\"wp-block-paragraph\">The commands below use <code>sudo<\/code>. If you are already logged in as <code>root<\/code>, remove <code>sudo<\/code> from each command. Replace every uppercase placeholder immediately before running its block.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Step 1: Confirm Bullseye and install the base LAMP packages<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Confirming the release first prevents you from mixing Debian repositories meant for another version.<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>grep -E '^(PRETTY_NAME|VERSION_CODENAME)=' \/etc\/os-release\ndpkg --print-architecture\nsudo apt update\nsudo apt install -y apache2 mariadb-server ca-certificates curl gnupg unzip ufw certbot python3-certbot-apache<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Debian 11 should report <code>VERSION_CODENAME=bullseye<\/code>; the common VPS architectures are <code>amd64<\/code> and <code>arm64<\/code>.<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>PRETTY_NAME=\"Debian GNU\/Linux 11 (bullseye)\"\nVERSION_CODENAME=bullseye\namd64<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Enable both services now and after every reboot:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>sudo systemctl enable --now apache2 mariadb\nsudo systemctl is-active apache2 mariadb<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Expected output:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>active\nactive<\/code><\/pre>\n\n\n\n<h2 class=\"wp-block-heading\">Step 2: Install PHP 8.2 and Chevereto&#8217;s required extensions<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Chevereto Free 4.5 uses PHP 8.2, but Bullseye&#8217;s standard repository does not provide that branch. Add the signed Bullseye repository maintained by the Debian PHP package maintainer, then install the Apache PHP module and the extensions Chevereto uses for database access, image processing, uploads, and XML handling.<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>sudo apt install -y lsb-release\nsudo curl -fsSL https:\/\/packages.sury.org\/debsuryorg-archive-keyring.deb -o \/tmp\/debsuryorg-archive-keyring.deb\nsudo dpkg -i \/tmp\/debsuryorg-archive-keyring.deb\nprintf '%s\\n' 'Types: deb' 'URIs: https:\/\/packages.sury.org\/php\/' 'Suites: bullseye' 'Components: main' 'Architectures: amd64 arm64 armhf' 'Signed-By: \/usr\/share\/keyrings\/deb.sury.org-php.gpg' | sudo tee \/etc\/apt\/sources.list.d\/php.sources &gt;\/dev\/null\nsudo apt update\nsudo apt install -y php8.2 libapache2-mod-php8.2 php8.2-cli php8.2-mysql php8.2-curl php8.2-gd php8.2-imagick php8.2-mbstring php8.2-xml php8.2-zip<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">If <code>dpkg --print-architecture<\/code> returned only one architecture, the extra architectures line is harmless for APT, but packages are selected for the host&#8217;s native architecture. Check the PHP version and important modules:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>php8.2 -v\nphp8.2 -m | grep -E 'curl|exif|fileinfo|gd|imagick|mysqli|PDO|pdo_mysql|xml|zip'<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">You should see PHP 8.2 and module names including <code>curl<\/code>, <code>gd<\/code>, <code>imagick<\/code>, <code>PDO<\/code>, <code>pdo_mysql<\/code>, <code>xml<\/code>, and <code>zip<\/code>. Chevereto&#8217;s <a href=\"https:\/\/v4-docs.chevereto.com\/application\/stack\/php.html\" target=\"_blank\" rel=\"noopener\">PHP stack requirements<\/a> list the extensions and writable paths used by the application.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Set sensible upload and memory limits for an image site, then reload Apache:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>sudo sed -i 's\/^memory_limit = .*\/memory_limit = 512M\/' \/etc\/php\/8.2\/apache2\/php.ini\nsudo sed -i 's\/^upload_max_filesize = .*\/upload_max_filesize = 64M\/' \/etc\/php\/8.2\/apache2\/php.ini\nsudo sed -i 's\/^post_max_size = .*\/post_max_size = 64M\/' \/etc\/php\/8.2\/apache2\/php.ini\nsudo sed -i 's\/^max_execution_time = .*\/max_execution_time = 120\/' \/etc\/php\/8.2\/apache2\/php.ini\nsudo a2enmod php8.2 rewrite headers\nsudo systemctl restart apache2<\/code><\/pre>\n\n\n\n<h2 class=\"wp-block-heading\">Step 3: Create a MariaDB database and account<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Give Chevereto a separate database and least-privilege account so the application does not use the MariaDB administrator login.<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>sudo mariadb &lt;&lt;'SQL'\nCREATE DATABASE chevereto CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;\nCREATE USER 'chevereto'@'localhost' IDENTIFIED BY 'YOUR_DB_PASSWORD';\nGRANT ALL PRIVILEGES ON chevereto.* TO 'chevereto'@'localhost';\nFLUSH PRIVILEGES;\nSQL<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Replace <code>YOUR_DB_PASSWORD<\/code> with a long, unique password before running the block. Keep it available for the web installer; do not put it in a public script or commit it to a repository. Confirm that the account can reach the empty database:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>mariadb -u chevereto -p -e 'SELECT VERSION(), DATABASE();' chevereto<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">After entering the password, MariaDB should return one row with its version and <code>chevereto<\/code> as the selected database.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Step 4: Create the Apache virtual host<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">The virtual host maps your domain to a dedicated document root, while <code>AllowOverride All<\/code> lets Chevereto&#8217;s bundled <code>.htaccess<\/code> route requests through its front controller.<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>sudo mkdir -p \/var\/www\/chevereto\nsudo tee \/etc\/apache2\/sites-available\/YOUR_DOMAIN.conf &gt;\/dev\/null &lt;&lt;'APACHE'\n&lt;VirtualHost *:80&gt;\n    ServerName YOUR_DOMAIN\n    ServerAdmin YOUR_EMAIL\n    DocumentRoot \/var\/www\/chevereto\n\n    &lt;Directory \/var\/www\/chevereto&gt;\n        Options -Indexes +FollowSymLinks +MultiViews\n        AllowOverride All\n        Require all granted\n    &lt;\/Directory&gt;\n\n    ErrorLog ${APACHE_LOG_DIR}\/YOUR_DOMAIN-error.log\n    CustomLog ${APACHE_LOG_DIR}\/YOUR_DOMAIN-access.log combined\n&lt;\/VirtualHost&gt;\nAPACHE\nsudo a2dissite 000-default.conf\nsudo a2ensite YOUR_DOMAIN.conf\nsudo apache2ctl configtest\nsudo systemctl reload apache2<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Replace <code>YOUR_DOMAIN<\/code> with the real hostname and <code>YOUR_EMAIL<\/code> with an administrator email address. A successful syntax check prints:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>Syntax OK<\/code><\/pre>\n\n\n\n<h2 class=\"wp-block-heading\">Step 5: Download and place Chevereto Free<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">The official release endpoint supplies the current self-hosted package; extracting it directly into the virtual host keeps the URL at the domain root.<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>sudo curl -fL https:\/\/chevereto.com\/api\/download\/latest -o \/tmp\/chevereto.zip\nsudo unzip -q \/tmp\/chevereto.zip -d \/var\/www\/chevereto\ntest -f \/var\/www\/chevereto\/index.php<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">The final command should produce no output and return successfully. Chevereto&#8217;s <a href=\"https:\/\/v4-docs.chevereto.com\/application\/installing\/installation.html\" target=\"_blank\" rel=\"noopener\">installation documentation<\/a> describes the release package and the browser-based setup.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Give Apache read access to the code and write access only to the directories Chevereto uses for configuration and user-generated media:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>sudo chown -R root:www-data \/var\/www\/chevereto\nsudo find \/var\/www\/chevereto -type d -exec chmod 0755 {} \\;\nsudo find \/var\/www\/chevereto -type f -exec chmod 0644 {} \\;\nsudo install -d -o www-data -g www-data -m 0775 \/var\/www\/chevereto\/content \/var\/www\/chevereto\/images \/var\/www\/chevereto\/importing\nsudo chown root:www-data \/var\/www\/chevereto\/app\nsudo chmod 0775 \/var\/www\/chevereto\/app<\/code><\/pre>\n\n\n\n<h2 class=\"wp-block-heading\">Step 6: Allow web traffic and enable HTTPS<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Open only SSH, HTTP, and HTTPS in UFW, then let Certbot create the TLS virtual-host rules and redirect plain HTTP to HTTPS.<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>sudo ufw allow OpenSSH\nsudo ufw allow 80\/tcp\nsudo ufw allow 443\/tcp\nsudo ufw --force enable\nsudo ufw status verbose<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">The status should show <code>Status: active<\/code> and rules for the three services. If SSH uses a custom port, add that port before enabling UFW or you can lock yourself out.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Make sure <code>YOUR_DOMAIN<\/code> resolves to this VPS before requesting the certificate:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>sudo certbot --apache --redirect --agree-tos --no-eff-email -m YOUR_EMAIL -d YOUR_DOMAIN<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Certbot should finish with a success message and write the certificate under <code>\/etc\/letsencrypt\/live\/YOUR_DOMAIN\/<\/code>. Its renewal timer handles future renewals; test the renewal path without changing the live certificate:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>sudo certbot renew --dry-run<\/code><\/pre>\n\n\n\n<h2 class=\"wp-block-heading\">Step 7: Finish the web installer and add the scheduler<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">The browser setup creates Chevereto&#8217;s tables, writes its environment file, and creates the first administrator account.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Open <code>https:\/\/YOUR_DOMAIN<\/code> in a browser. When the setup form appears, enter these database values:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n\n<li>Database driver: MySQL\/MariaDB<\/li>\n\n\n<li>Database host: <code>localhost<\/code><\/li>\n\n\n<li>Database name: <code>chevereto<\/code><\/li>\n\n\n<li>Database user: <code>chevereto<\/code><\/li>\n\n\n<li>Database password: the value used for <code>YOUR_DB_PASSWORD<\/code><\/li>\n\n\n<li>Table prefix: <code>chv_<\/code><\/li>\n\n<\/ul>\n\n\n\n<p class=\"wp-block-paragraph\">Choose a unique administrator username and a strong password. After the installer completes, remove the temporary write permission from the application directory and protect the generated environment file:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>sudo chmod 0755 \/var\/www\/chevereto\/app\nsudo chown root:www-data \/var\/www\/chevereto\/app\/env.php\nsudo chmod 0640 \/var\/www\/chevereto\/app\/env.php<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Chevereto&#8217;s scheduler handles recurring application jobs. Run it every five minutes as the web account:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>sudo tee \/etc\/cron.d\/chevereto &gt;\/dev\/null &lt;&lt;'CRON'\n*\/5 * * * * www-data cd \/var\/www\/chevereto &amp;&amp; \/usr\/bin\/php8.2 app\/bin\/cli -C cron &gt;\/dev\/null 2&gt;&amp;1\nCRON\nsudo chmod 0644 \/etc\/cron.d\/chevereto<\/code><\/pre>\n\n\n\n<h2 class=\"wp-block-heading\">Verify the Chevereto installation<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">These checks confirm that Apache serves the HTTPS site, PHP is executing, the upload directories are writable, and the scheduler command can start without an interactive shell.<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>sudo apache2ctl configtest\nsudo systemctl is-active apache2 mariadb\ncurl -sSIL https:\/\/YOUR_DOMAIN | head -n 5\nsudo -u www-data test -w \/var\/www\/chevereto\/content\nsudo -u www-data \/usr\/bin\/php8.2 \/var\/www\/chevereto\/app\/bin\/cli -C cron<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Expected results include <code>Syntax OK<\/code>, two <code>active<\/code> lines, an HTTP redirect or <code>200<\/code> response over HTTPS, and no output from the two successful <code>test<\/code> and scheduler commands. Sign in to the Chevereto dashboard and upload a small image; it should appear in the gallery and remain available after a page refresh.<\/p>\n\n\n\n<aside class=\"vl-element vl-cta-banner\" aria-label=\"Host Your Image Library\">\n\t<div class=\"vl-cta-banner__content\">\n\t\t<p class=\"vl-cta-banner__eyebrow\">Debian VPS<\/p>\n\t\t<h3 class=\"vl-cta-banner__title\">Host Your Image Library<\/h3>\n\t\t<p class=\"vl-cta-banner__text\">Run Chevereto Free on a Debian VPS with root access, SSD storage, and a public IPv4 address.<\/p>\n\t<\/div>\n\t<a class=\"vl-cta-banner__button\" href=\"\/buy-vps\" aria-label=\"View Linux VPS plans\">View Linux VPS plans<\/a>\n<\/aside>\n\n\n\n<h2 class=\"wp-block-heading\">Troubleshooting<\/h2>\n\n\n\n<h3 class=\"wp-block-heading\"><code>php8.2 has no installation candidate<\/code><\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">APT did not read the Bullseye PHP repository, or the host is not actually running Debian 11. Check the codename, keyring, and repository metadata:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>grep -E '^(ID|VERSION_CODENAME)=' \/etc\/os-release\ncat \/etc\/apt\/sources.list.d\/php.sources\napt-cache policy php8.2\nsudo apt update<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">The source must use <code>Suites: bullseye<\/code>, and <code>apt-cache policy<\/code> should show a candidate from <code>packages.sury.org<\/code>. Fix any signature or DNS error before retrying the package install.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">Apache shows <code>404 Not Found<\/code> or ignores Chevereto routes<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">The site may not be enabled, or Apache cannot read the <code>.htaccess<\/code> rules because rewriting is disabled. Confirm the active vhost and modules, then reload after correcting the file:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>sudo apache2ctl -S\nsudo a2enmod rewrite\nsudo apache2ctl configtest\nsudo systemctl reload apache2<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Check that the vhost&#8217;s <code>DocumentRoot<\/code> is <code>\/var\/www\/chevereto<\/code> and that its <code>&lt;Directory&gt;<\/code> block has <code>AllowOverride All<\/code>. Also confirm that <code>\/var\/www\/chevereto\/index.php<\/code> exists rather than being hidden one directory deeper after extraction.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\"><code>SQLSTATE<\/code> or database connection failure during setup<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">The installer cannot authenticate with the MariaDB account or is using a different database name than the one created above. Test the exact credentials from the shell and re-enter them with host <code>localhost<\/code>:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>mariadb -u chevereto -p -h localhost -e 'SELECT 1;' chevereto<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">If the test fails, reset the account password from a local MariaDB administrator session and use the new value in the installer. Do not use the MariaDB <code>root<\/code> account in Chevereto.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">Uploads fail or the dashboard reports unwritable folders<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">Apache needs write access to <code>content<\/code>, <code>images<\/code>, and <code>importing<\/code>; a recursive <code>chmod 777<\/code> is unnecessary and unsafe. Restore the intended owner and mode, then check the path as the web user:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>sudo chown -R www-data:www-data \/var\/www\/chevereto\/content \/var\/www\/chevereto\/images \/var\/www\/chevereto\/importing\nsudo find \/var\/www\/chevereto\/content \/var\/www\/chevereto\/images \/var\/www\/chevereto\/importing -type d -exec chmod 0775 {} \\;\nsudo -u www-data test -w \/var\/www\/chevereto\/images<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">If larger files fail, compare the upload size with <code>upload_max_filesize<\/code> and <code>post_max_size<\/code> in <code>\/etc\/php\/8.2\/apache2\/php.ini<\/code>, then restart Apache.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Hardening<\/h2>\n\n\n\n<ul class=\"wp-block-list\">\n\n<li>Keep Debian 11 isolated from unrelated services and schedule an upgrade to a supported Debian release; the PHP repository does not extend the operating system&#8217;s support lifecycle.<\/li>\n\n\n<li>Back up both the <code>chevereto<\/code> MariaDB database and <code>\/var\/www\/chevereto\/images<\/code> before upgrades. Test restoring the database on a separate server.<\/li>\n\n\n<li>Review UFW rules with the <a href=\"https:\/\/vpslake.com\/ufw-firewall-generator\">VPSLake UFW firewall generator<\/a> if you add mail, object storage, or a monitoring service.<\/li>\n\n\n<li>Keep the Chevereto package, PHP 8.2 packages, Apache, and MariaDB updated, but take a database and media backup before replacing application files.<\/li>\n\n<\/ul>\n\n\n\n<h2 class=\"wp-block-heading\">FAQ<\/h2>\n\n\n\n<h3 class=\"wp-block-heading\">Can Chevereto Free run on Debian 11?<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">Yes, but the current Free release needs PHP 8.2, while Bullseye&#8217;s default PHP is older. This guide installs PHP 8.2 from a signed Bullseye-compatible repository and leaves the rest of the server on Debian 11 packages.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">Do I need a domain for Chevereto?<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">You can test the site by IP address, but a domain is strongly recommended for HTTPS and a stable public URL. Let&#8217;s Encrypt certificates are issued for domain names, not bare server IP addresses.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">Where does Chevereto store uploaded images?<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">The application stores user-generated media below its <code>images<\/code> and <code>content<\/code> directories. Include both directories in backups, along with the MariaDB database; copying only the PHP files will not preserve the gallery.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">Why does the installer need PHP 8.2 instead of Debian 11&#8217;s PHP?<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">Chevereto V4&#8217;s supported PHP matrix does not include Bullseye&#8217;s original PHP branch. Using the required PHP version avoids runtime errors caused by missing language features and keeps the Apache module aligned with the CLI used by the scheduler.<\/p>\n\n\n\n<script type=\"application\/ld+json\">{\"@context\": \"https:\/\/schema.org\", \"@type\": \"FAQPage\", \"mainEntity\": [{\"@type\": \"Question\", \"name\": \"Can Chevereto Free run on Debian 11?\", \"acceptedAnswer\": {\"@type\": \"Answer\", \"text\": \"Yes, but the current Free release needs PHP 8.2, while Bullseye's default PHP is older. This guide installs PHP 8.2 from a signed Bullseye-compatible repository and leaves the rest of the server on Debian 11 packages.\"}}, {\"@type\": \"Question\", \"name\": \"Do I need a domain for Chevereto?\", \"acceptedAnswer\": {\"@type\": \"Answer\", \"text\": \"You can test the site by IP address, but a domain is strongly recommended for HTTPS and a stable public URL. Let's Encrypt certificates are issued for domain names, not bare server IP addresses.\"}}, {\"@type\": \"Question\", \"name\": \"Where does Chevereto store uploaded images?\", \"acceptedAnswer\": {\"@type\": \"Answer\", \"text\": \"The application stores user-generated media below its `images` and `content` directories. Include both directories in backups, along with the MariaDB database; copying only the PHP files will not preserve the gallery.\"}}, {\"@type\": \"Question\", \"name\": \"Why does the installer need PHP 8.2 instead of Debian 11's PHP?\", \"acceptedAnswer\": {\"@type\": \"Answer\", \"text\": \"Chevereto V4's supported PHP matrix does not include Bullseye's original PHP branch. Using the required PHP version avoids runtime errors caused by missing language features and keeps the Apache module aligned with the CLI used by the scheduler.\"}}]}<\/script>\n\n","protected":false},"excerpt":{"rendered":"Install Chevereto Free on Debian 11 with Apache, MariaDB, PHP 8.2, HTTPS, and image uploads, then fix common LAMP setup errors in one clear guide.","protected":false},"author":1,"featured_media":1034,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"csco_singular_sidebar":"","csco_page_header_type":"","csco_page_load_nextpost":"","footnotes":""},"categories":[5,9],"tags":[132,96,133,117],"class_list":["post-1033","post","type-post","status-publish","format-standard","has-post-thumbnail","category-guides","category-vps-hosting","tag-chevereto","tag-debian-11","tag-image-hosting","tag-lamp-stack","cs-entry"],"_links":{"self":[{"href":"https:\/\/vpslake.com\/blog\/wp-json\/wp\/v2\/posts\/1033","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/vpslake.com\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/vpslake.com\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/vpslake.com\/blog\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/vpslake.com\/blog\/wp-json\/wp\/v2\/comments?post=1033"}],"version-history":[{"count":1,"href":"https:\/\/vpslake.com\/blog\/wp-json\/wp\/v2\/posts\/1033\/revisions"}],"predecessor-version":[{"id":3940,"href":"https:\/\/vpslake.com\/blog\/wp-json\/wp\/v2\/posts\/1033\/revisions\/3940"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/vpslake.com\/blog\/wp-json\/wp\/v2\/media\/1034"}],"wp:attachment":[{"href":"https:\/\/vpslake.com\/blog\/wp-json\/wp\/v2\/media?parent=1033"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/vpslake.com\/blog\/wp-json\/wp\/v2\/categories?post=1033"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/vpslake.com\/blog\/wp-json\/wp\/v2\/tags?post=1033"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}