{"slug":"static-sites","title":"Static Sites","description":"DanubeData Static Sites lets you deploy static websites and single-page applications with automatic TLS, custom domains, and global caching — powered by a fast nginx edge layer with zero server manage...","section":"Features","url":"https://docs.danubedata.ro/static-sites","markdown_url":"https://docs.danubedata.ro/static-sites.md","breadcrumbs":[{"title":"Features","slug":null},{"title":"Static Sites","slug":"static-sites"}],"headings":[{"level":1,"title":"Static Sites","id":"static-sites"},{"level":2,"title":"Key features","id":"key-features"},{"level":2,"title":"Deployment methods","id":"deployment-methods"},{"level":3,"title":"ZIP upload","id":"zip-upload"},{"level":3,"title":"Git repository","id":"git-repository"},{"level":3,"title":"CLI push","id":"cli-push"},{"level":2,"title":"How it works","id":"how-it-works"},{"level":3,"title":"Build and deployment pipeline","id":"build-and-deployment-pipeline"},{"level":3,"title":"Build statuses","id":"build-statuses"},{"level":3,"title":"Site statuses","id":"site-statuses"},{"level":2,"title":"Site access","id":"site-access"},{"level":2,"title":"Plans and pricing","id":"plans-and-pricing"},{"level":2,"title":"Custom domains","id":"custom-domains"},{"level":3,"title":"Adding a custom domain","id":"adding-a-custom-domain"},{"level":3,"title":"Domain verification","id":"domain-verification"},{"level":3,"title":"Connecting your domain","id":"connecting-your-domain"},{"level":3,"title":"Domain statuses","id":"domain-statuses"},{"level":3,"title":"Setting a primary domain","id":"setting-a-primary-domain"},{"level":2,"title":"Password protection","id":"password-protection"},{"level":2,"title":"Git webhooks","id":"git-webhooks"},{"level":3,"title":"Supported providers","id":"supported-providers"},{"level":3,"title":"Setting up webhooks","id":"setting-up-webhooks"},{"level":3,"title":"Auto-deploy","id":"auto-deploy"},{"level":2,"title":"Deployment history and rollbacks","id":"deployment-history-and-rollbacks"},{"level":3,"title":"Viewing deployments","id":"viewing-deployments"},{"level":3,"title":"Rolling back","id":"rolling-back"},{"level":2,"title":"Caching","id":"caching"},{"level":2,"title":"Technical specifications","id":"technical-specifications"},{"level":2,"title":"FAQ","id":"faq"},{"level":3,"title":"What types of sites can I deploy?","id":"what-types-of-sites-can-i-deploy"},{"level":3,"title":"Can I use a custom build command?","id":"can-i-use-a-custom-build-command"},{"level":3,"title":"How do I deploy a React or Vue app?","id":"how-do-i-deploy-a-react-or-vue-app"},{"level":3,"title":"Can I use the Free plan for production?","id":"can-i-use-the-free-plan-for-production"},{"level":3,"title":"How long does a deployment take?","id":"how-long-does-a-deployment-take"},{"level":3,"title":"Can I password-protect only certain pages?","id":"can-i-password-protect-only-certain-pages"},{"level":3,"title":"What happens if my build fails?","id":"what-happens-if-my-build-fails"},{"level":3,"title":"Can I use a root domain (apex domain)?","id":"can-i-use-a-root-domain-apex-domain"},{"level":3,"title":"Is there a CLI tool?","id":"is-there-a-cli-tool"},{"level":3,"title":"How do rollbacks work?","id":"how-do-rollbacks-work"},{"level":2,"title":"Next steps","id":"next-steps"}],"format":"markdown","word_count":1657,"content":"# Static Sites\n\nDanubeData Static Sites lets you deploy static websites and single-page applications with automatic TLS, custom domains, and global caching — powered by a fast nginx edge layer with zero server management.\n\n## Key features\n\n- **Three deployment methods** — Upload a ZIP file, connect a Git repository, or push via CLI\n- **Automatic builds** — Push to GitHub, GitLab, or Bitbucket and your site deploys automatically\n- **Custom domains** — Bring your own domain with DNS verification and automatic TLS via Let's Encrypt\n- **Instant rollbacks** — Revert to any previous deployment with one click\n- **Password protection** — Restrict access to your site with HTTP Basic Auth\n- **Real-time build logs** — Watch your build progress live in the dashboard\n- **Global caching** — Optimized nginx configuration with aggressive caching for CSS, JS, and images\n- **Free tier** — Deploy your first site at no cost\n- **EU data residency** — All data stored in Falkenstein, Germany (GDPR-compliant)\n\n## Deployment methods\n\n### ZIP upload\n\nUpload a ZIP file containing your pre-built site files directly through the dashboard. Best for simple sites, quick prototyping, or when you have a local build pipeline.\n\n- Maximum file size: 100 MB on Free, 500 MB on Starter and Pro (see [Plans and pricing](#plans-and-pricing))\n- Supported format: `.zip`\n\n### Git repository\n\nConnect a GitHub, GitLab, or Bitbucket repository for automatic deployments. Each push to your configured branch triggers a new build and deployment.\n\n- **Supported providers** — GitHub, GitLab, Bitbucket\n- **Authentication** — Public repos require no credentials. Private repos support SSH keys or access tokens.\n- **Auto-deploy** — Builds trigger automatically on push via webhooks\n- **Branch selection** — Deploy from any branch (defaults to `main`)\n\n### CLI push\n\nPush your site files from the command line using the DanubeData API. Ideal for CI/CD pipelines and automated workflows.\n\n```bash\n# Create a tarball of your site files\ntar -czf site.tar.gz -C ./dist .\n\n# Deploy via API\ncurl -X POST \\\n  -H \"Authorization: Bearer YOUR_API_TOKEN\" \\\n  -F \"file=@site.tar.gz\" \\\n  https://api.danubedata.ro/api/v1/static-sites/{site-id}/deploy\n```\n\n## How it works\n\n### Build and deployment pipeline\n\n```\nUpload / Git Push / CLI Push\n         |\n         v\n     Build Queued\n         |\n         v\n      Building Your Site\n         |\n         v\n     Packaging & Storing\n         |\n         v\n        Deploying\n         |\n         v\n      Site Active\n```\n\n1. **Source upload** — Your files are uploaded to build storage\n2. **Build** — Your files are packaged into an optimized nginx image\n3. **Store** — The built image is stored securely, ready to deploy\n4. **Deploy** — Your site is rolled out to the DanubeData edge; your previous version stays live until the new build succeeds\n5. **Live** — Your site is accessible at its URL with automatic TLS\n\n### Build statuses\n\n| Status | Description |\n|--------|-------------|\n| **Pending** | Build queued, waiting for resources |\n| **Processing** | Preparing build context |\n| **Building image** | Your site is being built into an optimized image |\n| **Pushing** | Storing the built image, ready to deploy |\n| **Succeeded** | Build completed successfully, deployment starting |\n| **Failed** | Build failed — check build logs for details |\n| **Cancelled** | Build was cancelled before completion |\n\n### Site statuses\n\n| Status | Description |\n|--------|-------------|\n| **Pending** | Site created, awaiting first deployment |\n| **Building** | A build is in progress |\n| **Deploying** | Deployment to infrastructure in progress |\n| **Active** | Site is live and accessible |\n| **Stopped** | Site has been stopped |\n| **Error** | Build or deployment failed — check the error details |\n\nStatus changes are pushed to your dashboard in real time via WebSocket.\n\n## Site access\n\nEach site is accessible at:\n\n```\nhttps://{slug}.pages.danubedata.ro\n```\n\nThe slug is auto-generated from your site name with a short suffix to ensure uniqueness.\n\n## Plans and pricing\n\n| Plan | Storage | Max upload | Bandwidth | Sites | Custom domains | Price/month |\n|------|---------|------------|-----------|-------|----------------|-------------|\n| **Free** | 100 MB | 100 MB | 10 GB | 2 | 2 | EUR 0.00 |\n| **Starter** | 500 MB | 500 MB | 100 GB | 10 | 10 per site | EUR 2.99 |\n| **Pro** | 2 GB | 500 MB | 500 GB | 50 | 50 per site | EUR 9.99 |\n\n**Storage** is the total size of your deployed site. **Max upload** is the largest single archive accepted per deploy — 500 MB is a platform-wide per-request ceiling, so Pro sites larger than that are built up across multiple deploys rather than one upload.\n\n- **Free** — Perfect for personal projects, portfolios, and testing\n- **Starter** — For small teams with multiple sites and custom domain needs\n- **Pro** — For agencies and businesses with high-traffic sites\n\nBilling is hourly based on actual usage. Monthly invoices are generated on the 1st of each month.\n\n## Custom domains\n\nAdd your own domain to any static site. Custom domains are included on every plan, including Free.\n\n### Adding a custom domain\n\n1. Navigate to your site detail page\n2. Click the **Domains** tab\n3. Click **Add Domain**\n4. Enter your domain (e.g., `www.example.com`)\n\n### Domain verification\n\nAfter adding a domain, verify ownership by adding a DNS TXT record:\n\n1. **Record name** — `_danubedata-verify.your-domain.com`\n2. **Record value** — The verification token shown in the dashboard\n\nAdd this TXT record at your DNS provider, then click **Verify** in the dashboard. DNS propagation may take a few minutes.\n\n### Connecting your domain\n\nAfter verification, create a CNAME record pointing your domain to your site:\n\n```\nyour-domain.com  CNAME  {slug}.pages.danubedata.ro\n```\n\nOnce the CNAME is in place, a TLS certificate is provisioned automatically via Let's Encrypt.\n\n### Domain statuses\n\n**Verification status:**\n\n| Status | Description |\n|--------|-------------|\n| **Pending** | Awaiting DNS TXT record verification |\n| **Verifying** | DNS check in progress |\n| **Verified** | Domain ownership confirmed |\n| **Failed** | Verification failed — check your DNS records and retry |\n\n**TLS status:**\n\n| Status | Description |\n|--------|-------------|\n| **Pending** | Awaiting TLS certificate provisioning |\n| **Provisioning** | Certificate being generated via Let's Encrypt |\n| **Active** | HTTPS is active with a valid certificate |\n| **Failed** | Certificate provisioning failed — ensure CNAME is correct |\n\n### Setting a primary domain\n\nYou can designate any verified domain as the primary domain. The primary domain is used as the canonical URL for your site.\n\n## Password protection\n\nRestrict access to your entire site using HTTP Basic Auth. This is useful for staging environments, client previews, or private content.\n\n1. Navigate to the site detail page\n2. Click **Edit**\n3. Enable **Password Protection**\n4. Enter a username and password (minimum 8 characters)\n5. Click **Save**\n\nVisitors will be prompted for credentials before accessing any page on the site.\n\n## Git webhooks\n\nWhen using Git repository deployment, DanubeData sets up webhook integration for automatic builds.\n\n### Supported providers\n\n| Provider | Signature header | Verification method |\n|----------|-----------------|---------------------|\n| **GitHub** | `X-Hub-Signature-256` | HMAC-SHA256 |\n| **GitLab** | `X-Gitlab-Token` | Token comparison |\n| **Bitbucket** | `X-Hub-Signature` | HMAC-SHA256 |\n\n### Setting up webhooks\n\n1. Navigate to the site detail page\n2. Copy the **Webhook URL** and **Webhook Secret** shown in the Git configuration section\n3. In your Git provider settings, add a new webhook:\n   - **URL** — The webhook URL from the dashboard\n   - **Secret** — The webhook secret from the dashboard\n   - **Events** — Push events only\n\n### Auto-deploy\n\nWhen auto-deploy is enabled, every push to the configured branch triggers a new build and deployment automatically. You can disable auto-deploy from the site settings if you prefer manual deployments.\n\n## Deployment history and rollbacks\n\nEvery successful deployment is recorded with its revision number, commit details, and timestamp.\n\n### Viewing deployments\n\nNavigate to the site detail page and click the **Deployments** tab to see your full deployment history.\n\n### Rolling back\n\nTo revert to a previous deployment:\n\n1. Open the **Deployments** tab\n2. Find the deployment you want to restore\n3. Click **Activate**\n\nThe previous deployment is restored immediately without rebuilding. This is useful for quickly reverting a broken deployment.\n\n## Caching\n\nStatic Sites use an optimized nginx configuration with aggressive caching headers:\n\n| Content type | Cache policy |\n|-------------|-------------|\n| **CSS and JavaScript** | `public, max-age=31536000, immutable` (1 year) |\n| **Images** | `public, max-age=604800` (7 days) |\n| **HTML** | `no-cache` (always revalidated) |\n\nHTML files are always served fresh to ensure visitors see the latest content, while static assets (CSS, JS, images) are cached aggressively for performance.\n\n## Technical specifications\n\n| Specification | Value |\n|--------------|-------|\n| **Web server** | nginx 1.27 (Alpine) |\n| **TLS** | Let's Encrypt with automatic renewal |\n| **Default domain** | `{slug}.pages.danubedata.ro` |\n| **Maximum upload size** | 100 MB (Free), 500 MB (Starter and Pro) per deploy |\n| **Build timeout** | 10 minutes |\n| **Build system** | Isolated, containerized builds |\n| **Deployment** | Automated rollout; previous version stays live until the new build succeeds |\n| **Data location** | Germany (EU) |\n\n## FAQ\n\n### What types of sites can I deploy?\n\nAny static site or single-page application (SPA). This includes sites built with React, Vue, Next.js (static export), Nuxt (static), Hugo, Jekyll, Astro, Eleventy, or plain HTML/CSS/JS.\n\n### Can I use a custom build command?\n\nNot currently. Static Sites expects pre-built files. Run your build locally or in CI/CD, then upload the output directory as a ZIP or push via CLI.\n\n### How do I deploy a React or Vue app?\n\nBuild your app locally (e.g., `npm run build`), then upload the output directory (typically `dist/` or `build/`) as a ZIP file. For Git deployments, set the **Publish directory** to the folder containing your built files.\n\n### Can I use the Free plan for production?\n\nYes. The Free plan includes 2 sites, 100 MB storage, 10 GB bandwidth, and 2 custom domains, which is sufficient for personal sites and portfolios.\n\n### How long does a deployment take?\n\nMost deployments complete within 1-2 minutes. Build time depends on the size of your files. The build timeout is 10 minutes.\n\n### Can I password-protect only certain pages?\n\nNo. Password protection applies to the entire site. For per-page access control, implement authentication in your application code.\n\n### What happens if my build fails?\n\nYour current live deployment remains active. Failed builds do not affect the running site. Check the build logs for error details and try again.\n\n### Can I use a root domain (apex domain)?\n\nCustom domains work with both subdomains (`www.example.com`) and root domains (`example.com`). For root domains, use an A or ALIAS record instead of CNAME, depending on your DNS provider's capabilities.\n\n### Is there a CLI tool?\n\nYou can deploy using the DanubeData API with any HTTP client (curl, httpie, etc.) or integrate it into your CI/CD pipeline. See the CLI deployment section for details.\n\n### How do rollbacks work?\n\nEach deployment is saved as an immutable image. Rolling back re-activates a previous image without rebuilding, making rollbacks nearly instant.\n\n## Next steps\n\n- [Static Sites quick start](https://docs.danubedata.ro/static-sites-quickstart) — Deploy your first static site\n- [Build with AI](https://docs.danubedata.ro/static-sites-ai) — Use Claude, ChatGPT, or other AI assistants to generate your website\n- [Custom domains](https://docs.danubedata.ro/static-sites-domains) — DNS verification and TLS setup\n- [Git deployments](https://docs.danubedata.ro/static-sites-git) — Webhooks and auto-deploy\n\n---\n\n**Questions?** Contact support at support@danubedata.ro\n","prev":{"title":"Management","slug":"storage-share-management","url":"https://docs.danubedata.ro/storage-share-management","markdown_url":"https://docs.danubedata.ro/storage-share-management.md","json_url":"https://docs.danubedata.ro/storage-share-management.json"},"next":{"title":"Quick Start","slug":"static-sites-quickstart","url":"https://docs.danubedata.ro/static-sites-quickstart","markdown_url":"https://docs.danubedata.ro/static-sites-quickstart.md","json_url":"https://docs.danubedata.ro/static-sites-quickstart.json"},"index_url":"https://docs.danubedata.ro/index.json"}