Self-hosted infrastructure for URL shortening, dynamic QR codes, workflow automation, knowledge management, and privacy-friendly analytics.
All services behind Caddy for automatic HTTPS via Let's Encrypt
Each service gets its own subdomain with automatic HTTPS
| Subdomain | Service | Purpose |
|---|---|---|
| s.YOURDOMAIN.com | Shlink | Short URLs & QR Codes |
| links.YOURDOMAIN.com | Shlink Web Client | Management Dashboard |
| n8n.YOURDOMAIN.com | n8n | Workflow Automation |
| wiki.YOURDOMAIN.com | BookStack | Knowledge Base / Wiki |
| analytics.YOURDOMAIN.com | Umami | Privacy-Friendly Analytics |
Everything your team needs in one self-hosted stack
URL shortener with built-in dynamic QR code generation. Change link destinations without changing the QR code.
Visual workflow automation. Connect services, schedule tasks, and build data pipelines with 400+ integrations.
Team knowledge base organized as Shelves, Books, Chapters, and Pages. Export to PDF, HTML, or Markdown.
Privacy-friendly web analytics. No cookies, GDPR compliant. Track landing pages from your short links.
Automatic HTTPS reverse proxy. Zero-config TLS certificates from Let's Encrypt. HTTP/3 support.
Essential commands for day-to-day operations. Click to copy.
docker compose up -d
docker compose down
docker compose pull && docker compose up -d
docker compose restart [service]
docker compose logs -f [service]
docker compose ps
docker stats --no-stream
docker compose config
docker exec -it shlink shlink api-key:generate
docker exec -it shlink shlink short-url:list
./scripts/backup.sh
./scripts/validate-deploy.sh
ssh root@YOUR_VPS_IP
Generate customizable QR codes that let you change the destination URL anytime โ the QR image never changes.
| size | 500 |
| format | png |
| errorCorrection | H |
| margin | 20 |
| size | 300 |
| format | svg |
| errorCorrection | M |
| margin | 10 |
| size | 200 |
| format | svg |
| errorCorrection | Q |
| margin | 10 |
Create a short URL โ Print the QR code โ Update the destination anytime via the API or web client. The QR code always points to the same short URL (e.g., s.YOURDOMAIN.com/my-campaign), so you can change where it goes without reprinting anything. Perfect for menus, packaging, business cards, and event materials.
Custom commands and AI subagents for managing the platform through natural language
Deploy or update services on the Hetzner VPS with pre-deploy validation and rollback support.
Create, update, and manage short URLs and QR codes via the Shlink REST API.
Run comprehensive health checks โ system resources, container status, error logs, and endpoint tests.
Build automation workflows connecting Shlink, BookStack, Umami, and external services.
Deep research on any topic using web search, docs, and codebase analysis.
Daily status report with VPS health, link analytics, and suggested action items.
Senior DevOps subagent for Docker operations, server maintenance, backups, and security hardening.
Campaign planning, visit data analysis, QR specifications, and performance reporting.
Maintains BookStack wiki, prepares content for NotebookLM and Claude Projects, documents everything.
Follow these steps to deploy the full stack on your Hetzner VPS
SSH into your VPS and clone the project to /opt/mvp-infra.
git clone git@github.com:erniemorales/mvp-infra.git /opt/mvp-infra
Copy the example env file and fill in your actual values โ domains, passwords, API keys.
cp .env.example .env && nano .env
Create A records for all 5 subdomains pointing to your VPS IP: s., links., n8n., wiki., analytics.
Run validation, then start all services. Caddy will automatically obtain SSL certificates.
./scripts/validate-deploy.sh && docker compose up -d
Immediately change the Umami default login (admin / umami) and generate a proper Shlink API key.
Check that all containers are healthy and all endpoints respond.
docker compose ps && curl -sf https://s.YOURDOMAIN.com/rest/health
Common issues and their solutions
docker compose logs -f [service]. Look for error messages on startup. Common causes: missing environment variables, database not ready yet (check depends_on + healthcheck), or port conflicts.dig subdomain.yourdomain.com). Caddy obtains certs automatically โ check Caddy logs with docker compose logs caddy. Ensure ports 80 and 443 are open in your firewall.docker compose pull shlink && docker compose up -d shlink. The other services stay running. Always back up databases before updating.docker compose ps. If it shows "unhealthy", check its logs. Verify the password in .env matches what the DB was initialized with. If you changed the password after first run, you may need to recreate the volume.docker compose down, revert with git checkout HEAD~1, then start again with docker compose up -d. If a database migration went wrong, restore from the latest backup in /opt/backups/.curl -X POST https://n8n.YOURDOMAIN.com/webhook/test.Team guides, QR assets, and reference docs on Google Drive
Complete guide to URL shortening and dynamic QR codes
Guรญa completa de URLs cortas y QR dinรกmicos
Complete academy reference guide
Guรญa de referencia completa de la academia
Pre-generated QR codes for all Moon Spot links
All team documentation on Google Drive
Hardware onboarding for Carlos
Addressable COB LED installation for Carlos and Angel