Initialize public data and docs repository

This commit is contained in:
AltStack Bot
2026-02-25 22:36:27 +05:30
commit 2a0ac1b107
357 changed files with 50685 additions and 0 deletions

36
docs/app/_meta.ts Normal file
View File

@@ -0,0 +1,36 @@
import type { MetaRecord } from 'nextra'
const meta: MetaRecord = {
index: {
title: 'Home',
type: 'page',
display: 'hidden',
},
why: {
title: '📜 Why These Docs Exist',
},
'quick-start': {
title: '🚀 Quick Start',
},
deploy: {
title: '📦 Deploy Guides',
},
stacks: {
title: '🔥 Stacks',
},
concepts: {
title: '🧠 Concepts',
},
// -- External links --
directory: {
title: '← Back to Directory',
href: 'https://thealtstack.com',
type: 'page',
},
contact: {
title: 'Contact Us',
display: 'hidden'
},
}
export default meta

View File

@@ -0,0 +1,33 @@
import type { MetaRecord } from 'nextra'
const meta: MetaRecord = {
'docker-basics': {
title: 'Docker in 10 Minutes',
},
networking: {
title: 'Networking for Self-Hosters',
},
'reverse-proxies': {
title: 'Reverse Proxies Explained',
},
'ssl-tls': {
title: 'SSL/TLS for Self-Hosters',
},
'env-secrets': {
title: 'Environment Variables & Secrets',
},
monitoring: {
title: 'Monitoring & Observability',
},
updates: {
title: 'Updating & Maintaining Containers',
},
backups: {
title: 'Backups That Actually Work',
},
hardware: {
title: 'Hardware & VPS Sizing',
},
}
export default meta

View File

@@ -0,0 +1,103 @@
---
title: Backups That Actually Work
description: "How to back up your self-hosted tools. Docker volumes, database dumps, and automated backup scripts that run while you sleep."
---
# Backups That Actually Work
Self-hosting means *you're* responsible for your data. No "Contact Support to restore from backup." **You are the support.**
The good news: backing up Docker-based tools is simple once you set up a system.
## What to Back Up
| Component | Where It Lives | How to Back Up |
|---|---|---|
| **Docker volumes** | `/var/lib/docker/volumes/` | Volume export or rsync |
| **Databases (Postgres)** | Inside a Docker container | `pg_dump` |
| **Config files** | Your `docker-compose.yml` and `.env` | Git or file copy |
> ⚠️ **Heads Up:** `docker-compose.yml` files are easy to recreate. Database data is not. Prioritize database backups above everything else.
## Method 1: Database Dumps (Essential)
Most self-hosted tools use PostgreSQL. Here's how to dump it:
```bash
# Dump a Postgres database running in a container
docker exec your-db-container \
pg_dump -U postgres your_database > backup_$(date +%Y%m%d).sql
```
To restore:
```bash
cat backup_20260218.sql | docker exec -i your-db-container \
psql -U postgres your_database
```
## Method 2: Volume Backup
For tools that store data in Docker volumes:
```bash
# Find your volumes
docker volume ls
# Backup a volume to a tar file
docker run --rm \
-v my_volume:/data \
-v $(pwd)/backups:/backup \
alpine tar czf /backup/my_volume_backup.tar.gz /data
```
## Method 3: Automated Script
Create a backup script that runs daily via cron:
```bash
#!/bin/bash
# /opt/backup.sh
BACKUP_DIR="/opt/backups"
DATE=$(date +%Y%m%d_%H%M)
mkdir -p $BACKUP_DIR
# Dump Postgres databases
docker exec supabase-db pg_dump -U postgres postgres > $BACKUP_DIR/supabase_$DATE.sql
docker exec plausible_db pg_dump -U postgres plausible_db > $BACKUP_DIR/plausible_$DATE.sql
# Clean backups older than 7 days
find $BACKUP_DIR -name "*.sql" -mtime +7 -delete
echo "Backup complete: $DATE"
```
Add to cron:
```bash
# Run at 3 AM every day
crontab -e
# Add this line:
0 3 * * * /opt/backup.sh >> /var/log/backup.log 2>&1
```
## The 3-2-1 Rule
For serious setups, follow the **3-2-1 backup rule**:
- **3** copies of your data
- **2** different storage types (local + remote)
- **1** offsite copy (rsync to another server, or upload to B2/S3)
```bash
# Sync backups to a remote server
rsync -avz /opt/backups/ user@backup-server:/backups/
```
## Next Steps
You now have the four foundational concepts: Docker, reverse proxies, SSL, and backups. Time to build:
→ [Deploy Guides](/deploy) — 65+ tools ready to deploy
→ [The Bootstrapper Stack](/stacks/bootstrapper) — A complete SaaS toolkit

View File

@@ -0,0 +1,127 @@
---
title: Understanding Docker in 10 Minutes
description: "Docker explained for self-hosters. No CS degree required. Containers, images, volumes, and Docker Compose — the only concepts you actually need."
---
# Understanding Docker in 10 Minutes
Docker is the reason self-hosting went from "sysadmin hobby" to "anyone can do it." It packages software into neat, isolated containers that run the same everywhere.
You don't need to become a Docker expert. You need to understand **four concepts**.
## Concept 1: Images
An **image** is a snapshot of software — pre-built, pre-configured, ready to run. Think of it like an `.iso` file, but for apps.
```bash
# Download the Plausible Analytics image
docker pull plausible/analytics:latest
```
Images live on [Docker Hub](https://hub.docker.com) — a public registry of 100,000+ images. When our deploy guides say `image: plausible/analytics:latest`, they're pulling from here.
## Concept 2: Containers
A **container** is a running instance of an image. Image = blueprint. Container = the actual building.
```bash
# Start a container from an image
docker run -d --name my-plausible plausible/analytics:latest
# See running containers
docker ps
# Stop a container
docker stop my-plausible
# Remove a container (data in volumes is safe)
docker rm my-plausible
```
> 💡 **Why?** Containers are isolated from each other and from your host system. Breaking one container doesn't break anything else.
## Concept 3: Volumes
**Volumes** store your data *outside* the container. This is critical because containers are disposable — when you update an image, you destroy the old container and create a new one. Volumes survive this process.
```bash
# Mount a volume called "plausible-data"
docker run -v plausible-data:/var/lib/clickhouse plausible/analytics
```
Without volumes, your data dies when the container dies. **Always use volumes.**
```bash
# List all volumes
docker volume ls
# Backup a volume (copy to local tar)
docker run --rm -v plausible-data:/data -v $(pwd):/backup alpine \
tar czf /backup/plausible-backup.tar.gz /data
```
## Concept 4: Docker Compose
This is the big one. **Docker Compose** lets you define multi-container setups in a single YAML file. Most real-world tools need multiple containers (app + database + cache), and Docker Compose handles that.
```yaml
# docker-compose.yml
version: '3.8'
services:
app:
image: plausible/analytics:latest
ports:
- "8000:8000"
depends_on:
- db
db:
image: postgres:14-alpine
volumes:
- db_data:/var/lib/postgresql/data
environment:
POSTGRES_PASSWORD: supersecret
volumes:
db_data:
```
Then run it:
```bash
# Start everything
docker compose up -d
# See logs
docker compose logs -f
# Stop everything
docker compose down
# Update to latest images
docker compose pull && docker compose up -d
```
That's the pattern for **every single deploy guide** in these docs:
1. Copy the `docker-compose.yml`
2. Tweak the environment variables
3. Run `docker compose up -d`
4. Done.
## The 5 Commands You'll Actually Use
| Command | What it does |
|---|---|
| `docker compose up -d` | Start all services in the background |
| `docker compose down` | Stop all services |
| `docker compose logs -f` | Watch live logs (Ctrl+C to exit) |
| `docker compose pull` | Download latest images |
| `docker ps` | List running containers |
That's it. That's Docker for self-hosters.
## Next Steps
→ [Reverse Proxies Explained](/concepts/reverse-proxies) — How to access your tools via `app.yourdomain.com`
→ [Your First Deployment](/quick-start/first-deployment) — Put this knowledge to use

View File

@@ -0,0 +1,153 @@
---
title: "Environment Variables & Secrets"
description: "How to manage .env files, Docker secrets, and sensitive configuration for self-hosted tools. Stop hardcoding passwords."
---
# Environment Variables & Secrets
Every self-hosted tool needs configuration: database passwords, API keys, admin emails. The **wrong** way is hardcoding them in `docker-compose.yml`. The **right** way is environment variables.
## The Basics: `.env` Files
Docker Compose automatically reads a `.env` file in the same directory as your `docker-compose.yml`:
```bash
# .env
POSTGRES_PASSWORD=super_secret_password_123
ADMIN_EMAIL=you@yourdomain.com
SECRET_KEY=a1b2c3d4e5f6g7h8i9j0
```
```yaml
# docker-compose.yml
services:
db:
image: postgres:16
environment:
POSTGRES_PASSWORD: ${POSTGRES_PASSWORD}
```
Docker Compose substitutes `${POSTGRES_PASSWORD}` with the value from `.env`. Your secrets stay out of your Compose file.
> ⚠️ **Critical:** Add `.env` to your `.gitignore` immediately. Never commit secrets to Git.
```bash
echo ".env" >> .gitignore
```
## Generating Strong Passwords
Don't use `password123`. Generate proper secrets:
```bash
# Generate a 32-character random string
openssl rand -base64 32
# Generate a hex string (great for SECRET_KEY)
openssl rand -hex 32
# Generate a URL-safe string
python3 -c "import secrets; print(secrets.token_urlsafe(32))"
```
### Template for Common Tools
Most self-hosted tools need similar variables. Here's a reusable `.env` template:
```bash
# .env template — generate all values before first run
# Database
POSTGRES_USER=app
POSTGRES_PASSWORD= # openssl rand -base64 32
POSTGRES_DB=app_db
# App
SECRET_KEY= # openssl rand -hex 32
ADMIN_EMAIL=you@yourdomain.com
ADMIN_PASSWORD= # openssl rand -base64 24
BASE_URL=https://app.yourdomain.com
# SMTP (for email notifications)
SMTP_HOST=smtp.gmail.com
SMTP_PORT=587
SMTP_USER=you@gmail.com
SMTP_PASSWORD= # Use app-specific password
```
## Default Values (Fallbacks)
Use the `:-` syntax for non-sensitive defaults:
```yaml
environment:
NODE_ENV: ${NODE_ENV:-production} # Defaults to "production"
LOG_LEVEL: ${LOG_LEVEL:-info} # Defaults to "info"
POSTGRES_PASSWORD: ${POSTGRES_PASSWORD} # No default — MUST be set
```
## Docker Secrets (Advanced)
For production setups, Docker Secrets are more secure than environment variables — they're stored encrypted and mounted as files:
```yaml
services:
db:
image: postgres:16
environment:
POSTGRES_PASSWORD_FILE: /run/secrets/db_password
secrets:
- db_password
secrets:
db_password:
file: ./secrets/db_password.txt
```
```bash
# Create the secret file
mkdir -p secrets
openssl rand -base64 32 > secrets/db_password.txt
chmod 600 secrets/db_password.txt
```
> 💡 Not all images support `_FILE` suffix variables. Check the image's documentation on Docker Hub.
## Multiple Environments
Keep separate `.env` files for different environments:
```bash
.env # Production (default)
.env.local # Local development
.env.staging # Staging server
```
Use them explicitly:
```bash
# Use a specific env file
docker compose --env-file .env.staging up -d
```
## Security Checklist
- [ ] `.env` is in `.gitignore`
- [ ] No secrets are hardcoded in `docker-compose.yml`
- [ ] All passwords are randomly generated (32+ characters)
- [ ] Database ports are NOT exposed to the internet
- [ ] Secret files have `chmod 600` permissions
- [ ] Default passwords from docs have been changed
## Common Mistakes
**"Variable is empty in the container"** → Check for typos. Variable names are case-sensitive. `POSTGRES_password` ≠ `POSTGRES_PASSWORD`.
**"Changes to .env aren't applying"** → You need to recreate the container: `docker compose up -d --force-recreate`.
**"I committed my .env to Git"** → Even after removing it, it's in Git history. Rotate ALL secrets immediately and use `git filter-branch` or BFG Repo Cleaner.
## Next Steps
→ [Monitoring & Observability](/concepts/monitoring) — Know when things break
→ [Docker in 10 Minutes](/concepts/docker-basics) — Review the fundamentals

View File

@@ -0,0 +1,145 @@
---
title: "Hardware & VPS Sizing"
description: "How much RAM, CPU, and disk you actually need for self-hosting. VPS provider comparison and scaling strategies."
---
# Hardware & VPS Sizing
The #1 question new self-hosters ask: **"What server do I need?"**
Short answer: less than you think to start, more than you think once you're hooked.
## Quick Sizing Guide
### How Much RAM Do I Need?
| Setup | RAM | What You Can Run |
|---|---|---|
| **Starter** | 2 GB | 12 lightweight tools (Uptime Kuma, Plausible) |
| **Hobbyist** | 4 GB | 35 tools + a database + reverse proxy |
| **Power User** | 8 GB | 812 tools + multiple databases |
| **Homelab** | 16 GB | Everything + AI models (small ones) |
| **AI Workloads** | 32+ GB | LLMs, image generation, video AI |
> 💡 **Start with 4 GB.** You can always upgrade. Most VPS providers let you resize without downtime.
### CPU Guidelines
| Workload | vCPUs Needed |
|---|---|
| Static tools (Uptime Kuma, PocketBase) | 1 vCPU |
| Web apps (Plausible, Outline, n8n) | 2 vCPUs |
| Heavy apps (PostHog, Supabase, Metabase) | 4 vCPUs |
| AI inference (Ollama, Stable Diffusion) | 4+ vCPUs + GPU |
### Disk Space
| Component | Typical Usage |
|---|---|
| Base OS + Docker | 58 GB |
| Each Docker image | 100 MB 2 GB |
| PostgreSQL database (small app) | 500 MB 5 GB |
| Log files (unmanaged) | 110 GB |
| AI models (per model) | 470 GB |
**Minimum recommended:** 50 GB SSD.
**Comfortable:** 80160 GB SSD.
**AI workloads:** 200+ GB NVMe.
## VPS Provider Comparison
| Provider | Starting At | Pros | Best For |
|---|---|---|---|
| [**DigitalOcean**](https://m.do.co/c/2ed27757a361) | $6/mo (1 GB) | Simple UI, great docs, predictable pricing | Beginners |
| **Hetzner** | €3.79/mo (2 GB) | Best price-to-performance in EU | Power users, EU hosting |
| **Contabo** | €5.99/mo (4 GB) | Cheapest for RAM-heavy setups | Budget homelab |
| **Linode (Akamai)** | $5/mo (1 GB) | Reliable, good network | Small projects |
| **Vultr** | $5/mo (1 GB) | Global locations, hourly billing | Testing and experimentation |
| **Oracle Cloud** | Free (4 vCPUs, 24 GB ARM) | Unbeatable free tier | Zero-budget hosting |
| **Home Server** | One-time cost | Full control, unlimited bandwidth | Privacy maximalists |
> 🏆 **Our Pick:** [DigitalOcean](https://m.do.co/c/2ed27757a361) for beginners (simple, reliable, [$200 free credit](https://m.do.co/c/2ed27757a361)). **Hetzner** for best value. **Oracle Cloud free tier** if you want to pay nothing.
## Real-World Stack Sizing
Here's what actual AltStack setups typically need:
### The Bootstrapper Stack (4 GB RAM)
- Coolify (deployment platform)
- Plausible (analytics)
- Uptime Kuma (monitoring)
- Listmonk (newsletters)
- Caddy (reverse proxy)
### The Privacy Stack (4 GB RAM)
- Vaultwarden (passwords)
- Jitsi Meet (video calls)
- Mattermost (messaging)
- Caddy (reverse proxy)
### The AI Stack (1632 GB RAM)
- Ollama (LLM inference)
- Stable Diffusion (image generation)
- TabbyML (code completion)
- Continue.dev (AI coding)
## Scaling Strategies
### Vertical Scaling (Bigger Server)
The simplest approach. Just resize your VPS:
- **DigitalOcean:** Resize droplet (takes ~1 minute)
- **Hetzner:** Rescale server (may require reboot)
- **Home server:** Add RAM sticks
### Horizontal Scaling (More Servers)
When one server isn't enough:
```
Server 1: Databases (Postgres, Redis)
Server 2: Application containers
Server 3: AI workloads (GPU)
```
Connect them with a private network (most VPS providers offer this for free) or a VPN like WireGuard.
### The "Start Small" Strategy
1. **Month 1:** $6/mo droplet (1 GB) — Deploy 12 tools
2. **Month 3:** Resize to $12/mo (2 GB) — Add more tools
3. **Month 6:** Resize to $24/mo (4 GB) — Running your full stack
4. **Month 12+:** Add a second server or move to Hetzner for better value
## Monitoring Your Resources
Always know how much headroom you have:
```bash
# Quick resource check
free -h # RAM usage
df -h # Disk usage
nproc # CPU cores
uptime # Load average
# Docker resource usage
docker stats # Live container metrics
docker system df # Docker disk usage
```
## Red Flags
🚩 **RAM constantly above 90%** → Resize or move a service to another server.
🚩 **Disk above 80%** → Clean Docker images (`docker system prune -f`) or resize disk.
🚩 **CPU at 100% for extended periods** → Check which container is the culprit with `docker stats`.
🚩 **Swap usage above 1 GB** → You need more RAM. Swap is a band-aid, not a solution.
## Next Steps
→ [Quick Start](/quick-start) — Deploy your first tool
→ [Deploy Guides](/deploy) — Browse 65+ tools
→ [Docker in 10 Minutes](/concepts/docker-basics) — Foundation knowledge

View File

@@ -0,0 +1,163 @@
---
title: "Monitoring & Observability"
description: "Know when things break before your users do. Uptime monitoring, disk alerts, log aggregation, and observability for self-hosters."
---
# Monitoring & Observability
You deployed 5 tools. They're running great. You go to bed. At 3 AM, the disk fills up, Postgres crashes, and everything dies. You find out at 9 AM when a user emails you.
**Monitoring prevents this.**
## The Three Layers
| Layer | What It Watches | Tool |
|---|---|---|
| **Uptime** | "Is the service responding?" | Uptime Kuma |
| **System** | CPU, RAM, disk, network | Node Exporter + Grafana |
| **Logs** | What's actually happening inside | Docker logs, Dozzle, SigNoz |
You need **at least** the first layer. The other two are for when you get serious.
## Layer 1: Uptime Monitoring (Essential)
[Uptime Kuma](/deploy/uptime-kuma) is the single best tool for self-hosters. Deploy it first, always.
```yaml
# docker-compose.yml
services:
uptime-kuma:
image: louislam/uptime-kuma:1
container_name: uptime-kuma
restart: unless-stopped
ports:
- "3001:3001"
volumes:
- uptime_data:/app/data
volumes:
uptime_data:
```
### What to Monitor
Add a monitor for **every** service you run:
| Type | Target | Check Interval |
|---|---|---|
| HTTP(s) | `https://plausible.yourdomain.com` | 60s |
| HTTP(s) | `https://uptime.yourdomain.com` | 60s |
| TCP Port | `localhost:5432` (Postgres) | 120s |
| Docker Container | Container name | 60s |
| DNS | `yourdomain.com` | 300s |
### Notifications
Uptime Kuma supports 90+ notification channels. Set up **at least two**:
- **Email** — For non-urgent alerts
- **Telegram/Discord/Slack** — For instant mobile alerts
> 🔥 **Pro Tip:** Monitor your monitoring. Set up an external free ping service (like [UptimeRobot](https://uptimerobot.com)) to watch your Uptime Kuma instance.
## Layer 2: System Metrics
### Quick Disk Alert Script
The #1 cause of self-hosting outages is **running out of disk space**. This script sends an alert when disk usage exceeds 80%:
```bash
#!/bin/bash
# /opt/scripts/disk-alert.sh
THRESHOLD=80
USAGE=$(df / | tail -1 | awk '{print $5}' | sed 's/%//')
if [ "$USAGE" -gt "$THRESHOLD" ]; then
echo "⚠️ Disk usage is at ${USAGE}% on $(hostname)" | \
mail -s "Disk Alert: ${USAGE}%" you@yourdomain.com
fi
```
Add to cron:
```bash
# Check every hour
0 * * * * /opt/scripts/disk-alert.sh
```
### What to Watch
| Metric | Warning Threshold | Critical Threshold |
|---|---|---|
| Disk usage | 70% | 85% |
| RAM usage | 80% | 95% |
| CPU sustained | 80% for 5 min | 95% for 5 min |
| Container restarts | 3 in 1 hour | 10 in 1 hour |
### Docker Resource Monitoring
Quick commands to check what's eating your resources:
```bash
# Live resource usage per container
docker stats
# Show container sizes (disk)
docker system df -v
# Find large volumes
du -sh /var/lib/docker/volumes/*/
```
## Layer 3: Log Aggregation
Docker captures all stdout/stderr from your containers. Use it:
```bash
# Live logs for a service
docker compose logs -f plausible
# Last 100 lines
docker compose logs --tail=100 plausible
# Logs since a specific time
docker compose logs --since="2h" plausible
```
### Dozzle (Docker Log Viewer)
For a beautiful web-based log viewer:
```yaml
services:
dozzle:
image: amir20/dozzle:latest
container_name: dozzle
ports:
- "8080:8080"
volumes:
- /var/run/docker.sock:/var/run/docker.sock:ro
```
### For Serious Setups: SigNoz
If you need traces, metrics, **and** logs in one place, deploy [SigNoz](/deploy/signoz). It's an open-source Datadog alternative built on OpenTelemetry.
## Maintenance Routine
Set a weekly calendar reminder:
```
☐ Check Uptime Kuma — all green?
☐ Run `docker stats` — anything hogging resources?
☐ Run `df -h` — disk space OK?
☐ Run `docker system prune -f` — clean unused images
☐ Check logs for any errors — `docker compose logs --since=168h | grep -i error`
```
## Next Steps
→ [Updating & Maintaining Containers](/concepts/updates) — Keep your tools up to date safely
→ [Backups That Actually Work](/concepts/backups) — Protect your data
→ [Deploy Uptime Kuma](/deploy/uptime-kuma) — Set up monitoring now

View File

@@ -0,0 +1,160 @@
---
title: "Networking for Self-Hosters"
description: "Ports, DNS, firewalls, and private networks — the networking basics every self-hoster needs to know."
---
# Networking for Self-Hosters
You deployed a tool. It works on `localhost:3000`. You try to access it from your phone. Nothing. Welcome to networking.
This guide covers the **four things** standing between your server and the outside world.
## 1. Ports
Every network service listens on a **port** — a numbered door on your server. Some well-known ones:
| Port | Service |
|---|---|
| `22` | SSH |
| `80` | HTTP |
| `443` | HTTPS |
| `5432` | PostgreSQL |
| `30009000` | Where most self-hosted tools live |
When Docker maps `-p 8080:3000`, it's saying: "When traffic hits port 8080 on the host, send it to port 3000 inside the container."
```yaml
# In docker-compose.yml
ports:
- "8080:3000" # host:container
```
> ⚠️ **Never expose database ports** (5432, 3306, 27017) to the internet. Keep them internal to Docker networks.
## 2. DNS (Domain Name System)
DNS translates human-readable names to IP addresses:
```
plausible.yourdomain.com → 203.0.113.42
```
### Setting Up DNS Records
In your domain registrar (Cloudflare, Namecheap, etc.):
| Type | Name | Value | What it does |
|---|---|---|---|
| **A** | `@` | `203.0.113.42` | Points root domain to your server |
| **A** | `plausible` | `203.0.113.42` | Points subdomain to your server |
| **CNAME** | `www` | `yourdomain.com` | Aliases `www` to root |
| **A** | `*` | `203.0.113.42` | Wildcard — catch-all for any subdomain |
> 💡 **Pro Tip:** A wildcard `*` A record + Caddy reverse proxy = unlimited subdomains with zero DNS management. Just add entries to your Caddyfile.
### DNS Propagation
After changing DNS records, it can take **5 minutes to 48 hours** to propagate globally. Use [dnschecker.org](https://dnschecker.org) to verify.
## 3. Firewalls (UFW)
A firewall controls which ports are open to the internet. On Ubuntu/Debian, use **UFW** (Uncomplicated Firewall):
```bash
# Check current status
ufw status
# Allow essential ports
ufw allow 22/tcp # SSH — DON'T lock yourself out
ufw allow 80/tcp # HTTP
ufw allow 443/tcp # HTTPS
# Enable the firewall
ufw enable
# Deny everything else by default
ufw default deny incoming
ufw default allow outgoing
```
### The Golden Rule
Only open three ports to the internet: **22** (SSH), **80** (HTTP), **443** (HTTPS).
Your reverse proxy (Caddy/Nginx) handles port 80/443 and routes traffic internally to your containers. Individual tool ports (3000, 8080, etc.) should **never** be exposed publicly.
```
Internet → Port 443 → Caddy → Internal Docker Network → Your Tools
```
### Common Mistakes
**"I can't SSH into my server"** → You blocked port 22 before enabling UFW. Contact your hosting provider for console access.
**"My tool works locally but not remotely"** → Port 80/443 isn't open. Run `ufw allow 80/tcp && ufw allow 443/tcp`.
**"I opened port 8080 and got hacked"** → Never expose app ports directly. Use a reverse proxy instead.
## 4. Docker Networks
Docker creates isolated **networks** for your containers. By default, containers in the same `docker-compose.yml` can talk to each other by service name:
```yaml
services:
app:
image: myapp:latest
depends_on:
- db # Can reach the database at "db:5432"
db:
image: postgres:16
# No "ports:" = not accessible from outside Docker
```
### When to Create Custom Networks
If you need containers from **different** Compose files to communicate (e.g., a shared Caddy reverse proxy):
```yaml
# In your Caddyfile's docker-compose.yml
networks:
proxy:
external: true
# In your app's docker-compose.yml
networks:
default:
name: proxy
external: true
```
Create the shared network first:
```bash
docker network create proxy
```
Now all containers on the `proxy` network can reach each other by service name — across different Compose files.
## Quick Reference
```bash
# See what's listening on which port
ss -tlnp
# Test if a port is open from outside
nc -zv your-server-ip 443
# See Docker networks
docker network ls
# Check DNS resolution
dig plausible.yourdomain.com
nslookup plausible.yourdomain.com
```
## Next Steps
→ [Reverse Proxies Explained](/concepts/reverse-proxies) — Route traffic from domains to containers
→ [SSL/TLS for Self-Hosters](/concepts/ssl-tls) — Encrypt your traffic
→ [Environment Variables & Secrets](/concepts/env-secrets) — Secure your configuration

View File

@@ -0,0 +1,56 @@
---
title: "Concepts"
description: "The foundational knowledge for self-hosting. Docker, networking, security, backups — explained like you're a human, not a sysadmin."
---
# Concepts
Before you deploy anything, understand the building blocks. These guides cover the **why** and **how** behind self-hosting infrastructure — no fluff, no PhD required.
> 📖 **Reading order matters.** Start from the top and work down. Each article builds on the one before it.
---
## The Foundations
These four are non-negotiable. Read them before your first deploy.
| # | Guide | What You'll Learn |
|---|---|---|
| 1 | [Docker in 10 Minutes](/concepts/docker-basics) | Images, containers, volumes, Docker Compose — the only 4 concepts you need |
| 2 | [Networking for Self-Hosters](/concepts/networking) | Ports, DNS, firewalls, and why your tool isn't accessible from the internet |
| 3 | [Reverse Proxies Explained](/concepts/reverse-proxies) | Map `app.yourdomain.com` to your containers with Caddy |
| 4 | [SSL/TLS for Self-Hosters](/concepts/ssl-tls) | HTTPS, Let's Encrypt, and why it matters |
---
## Running in Production
Once your tools are deployed, keep them alive and healthy.
| # | Guide | What You'll Learn |
|---|---|---|
| 5 | [Environment Variables & Secrets](/concepts/env-secrets) | `.env` files, Docker secrets, and never hardcoding passwords again |
| 6 | [Monitoring & Observability](/concepts/monitoring) | Know when things break before your users do |
| 7 | [Updating & Maintaining Containers](/concepts/updates) | Safe update workflows, rollbacks, and automating the boring parts |
| 8 | [Backups That Actually Work](/concepts/backups) | Database dumps, volume backups, and the 3-2-1 rule |
---
## Planning & Scaling
Before you buy a server (or a bigger one).
| # | Guide | What You'll Learn |
|---|---|---|
| 9 | [Hardware & VPS Sizing](/concepts/hardware) | How much RAM/CPU you actually need, and which providers are worth it |
---
## Ready to Deploy?
You've got the knowledge. Now put it to work:
→ [Deploy Guides](/deploy) — 65+ tools with Docker Compose configs
→ [Quick Start](/quick-start) — Your first deployment in 5 minutes
→ [Curated Stacks](/stacks) — Pre-built tool bundles for specific use cases

View File

@@ -0,0 +1,113 @@
---
title: Reverse Proxies Explained
description: "What a reverse proxy does and why you need one. Set up Caddy or Nginx to serve your self-hosted tools on proper domains with automatic HTTPS."
---
# Reverse Proxies Explained
Right now your tools run on ports like `:3001`, `:8000`, `:8080`. That's fine for testing, but you don't want users visiting `http://your-ip:8000`.
A **reverse proxy** maps clean domains to those ugly ports:
```
plausible.yourdomain.com → localhost:8000
uptime.yourdomain.com → localhost:3001
supabase.yourdomain.com → localhost:8443
```
It also handles **HTTPS** (SSL certificates) automatically.
## Which One to Use?
| Proxy | Our Take |
|---|---|
| **Caddy** ✅ | **Use this.** Automatic HTTPS, zero-config SSL, human-readable config. Built for self-hosters. |
| **Nginx Proxy Manager** | GUI-first option. Great if you hate config files. Slightly more resource-heavy. |
| **Traefik** | Powerful but complex. Built for Kubernetes. Overkill for most self-hosting setups. |
| **Nginx (raw)** | The classic. Fine but verbose. No auto-SSL without certbot scripts. |
> 🏆 **The Verdict:** Start with Caddy. Seriously. The config file is 6 lines.
## Setting Up Caddy (Recommended)
### Step 1: Deploy Caddy
```yaml
# docker-compose.yml
version: '3.8'
services:
caddy:
image: caddy:2-alpine
container_name: caddy
restart: unless-stopped
ports:
- "80:80"
- "443:443"
volumes:
- ./Caddyfile:/etc/caddy/Caddyfile
- caddy_data:/data
- caddy_config:/config
volumes:
caddy_data:
caddy_config:
```
### Step 2: Configure Your Domains
Create a `Caddyfile` in the same directory:
```
plausible.yourdomain.com {
reverse_proxy localhost:8000
}
uptime.yourdomain.com {
reverse_proxy localhost:3001
}
git.yourdomain.com {
reverse_proxy localhost:3000
}
```
That's the entire config. Caddy automatically obtains and renews Let's Encrypt SSL certificates for every domain listed.
### Step 3: Point DNS
In your domain registrar (Cloudflare, Namecheap, etc.), add A records:
| Type | Name | Value |
|---|---|---|
| A | `plausible` | `your-server-ip` |
| A | `uptime` | `your-server-ip` |
| A | `git` | `your-server-ip` |
### Step 4: Start
```bash
docker compose up -d
```
Within 60 seconds, Caddy will obtain SSL certificates and your tools will be live on proper HTTPS domains.
## How It Works (Simplified)
```
User visits plausible.yourdomain.com
DNS resolves to your server IP
Caddy receives the request on port 443
Caddy reads Caddyfile: "plausible.yourdomain.com → localhost:8000"
Caddy forwards the request to your Plausible container
User sees Plausible dashboard over HTTPS 🔒
```
→ [Setting Up a Reverse Proxy (Practical Guide)](/quick-start/reverse-proxy) — Get Nginx, Caddy, or Traefik running now
→ [SSL/TLS for Self-Hosters](/concepts/ssl-tls) — Deep dive into certificates and security
→ [Deploy Guides](/deploy) — All our guides include reverse proxy config

View File

@@ -0,0 +1,56 @@
---
title: "SSL/TLS for Self-Hosters"
description: "HTTPS for your self-hosted tools. How SSL works, why you need it, and how to set it up with Caddy or Let's Encrypt."
---
# SSL/TLS for Self-Hosters
**SSL/TLS** is what makes the padlock appear in your browser. It encrypts traffic between your users and your server so nobody can snoop on it.
Every self-hosted tool accessible from the internet **must** have HTTPS. No exceptions.
## The Easy Way: Caddy (Automatic)
If you followed our [reverse proxy guide](/concepts/reverse-proxies) and are using Caddy, **you already have SSL**. Caddy obtains and renews Let's Encrypt certificates automatically for every domain in your Caddyfile.
No config needed. No cron jobs. No certbot. It just works.
> 🔥 **Pro Tip:** This is the #1 reason we recommend Caddy over Nginx.
## The Manual Way: Let's Encrypt + Certbot
If you're using raw Nginx, you'll need certbot:
```bash
# Install certbot
apt install certbot python3-certbot-nginx -y
# Obtain a certificate
certbot --nginx -d plausible.yourdomain.com
# Verify auto-renewal
certbot renew --dry-run
```
Certbot will modify your Nginx config automatically and set up a cron job for renewal.
## SSL Checklist
After setting up SSL, verify:
- [ ] Site loads on `https://` (padlock visible)
- [ ] `http://` redirects to `https://` automatically
- [ ] Certificate is from Let's Encrypt (click padlock → "Certificate")
- [ ] No mixed-content warnings in browser console
## Common Gotchas
**"Certificate not found"** → Your DNS hasn't propagated yet. Wait 510 minutes and try again.
**"Too many requests"** → Let's Encrypt rate-limits to 50 certificates/week per domain. If you're testing, use `--staging` flag first.
**"Connection refused on port 443"** → Port 443 isn't open in your firewall. Run: `ufw allow 443/tcp`
## Next Steps
→ [Backups That Actually Work](/concepts/backups) — Protect the data you're securing with SSL

View File

@@ -0,0 +1,153 @@
---
title: "Updating & Maintaining Containers"
description: "How to safely update self-hosted tools running in Docker. Update workflows, rollbacks, and optional automation with Watchtower."
---
# Updating & Maintaining Containers
Your tools need updates — security patches, bug fixes, new features. But updating a self-hosted tool isn't like clicking "Update" in an app store. You need a process.
## The Safe Update Workflow
Follow this **every time** you update a tool:
```bash
# 1. Backup first (ALWAYS)
docker exec my-db pg_dump -U postgres mydb > backup_$(date +%Y%m%d).sql
# 2. Pull the new image
docker compose pull
# 3. Recreate containers with new image
docker compose up -d
# 4. Check logs for errors
docker compose logs -f --tail=50
# 5. Verify the tool works
curl -I https://app.yourdomain.com
```
> ⚠️ **Golden Rule:** Never update without a backup. If something breaks, you can roll back in 60 seconds.
## Rolling Back
Something went wrong? Here's how to revert to the previous version:
### Option 1: Pin to Previous Version
```yaml
# docker-compose.yml — change the tag
services:
app:
image: plausible/analytics:v2.0.0 # Was :v2.1.0
```
```bash
docker compose up -d
```
### Option 2: Restore From Backup
```bash
# Stop the broken service
docker compose down
# Restore the database backup
cat backup_20260218.sql | docker exec -i my-db psql -U postgres mydb
# Start with the old image
docker compose up -d
```
## Image Tags: `latest` vs Pinned Versions
| Approach | Pros | Cons |
|---|---|---|
| `image: app:latest` | Always gets newest | Can break unexpectedly |
| `image: app:v2.1.0` | Predictable, reproducible | Manual updates required |
| `image: app:2` | Gets patches within major version | Some risk of breaking changes |
> 🏆 **Our Recommendation:** Use **major version tags** (`image: postgres:16`) for databases and **pinned versions** (`image: plausible/analytics:v2.1.0`) for applications. Avoid `latest` in production.
## Automated Updates with Watchtower
If you want hands-off updates (with some risk), **Watchtower** watches your containers and auto-updates them:
```yaml
services:
watchtower:
image: containrrr/watchtower
container_name: watchtower
restart: unless-stopped
volumes:
- /var/run/docker.sock:/var/run/docker.sock
environment:
WATCHTOWER_CLEANUP: "true"
WATCHTOWER_SCHEDULE: "0 0 4 * * *" # 4 AM daily
WATCHTOWER_NOTIFICATIONS: "email"
command: --include-restarting
```
### Watchtower Caveats
- It updates **all** containers by default. Use labels to control which ones:
```yaml
services:
plausible:
image: plausible/analytics:latest
labels:
- "com.centurylinklabs.watchtower.enable=true"
database:
image: postgres:16
labels:
- "com.centurylinklabs.watchtower.enable=false" # NEVER auto-update databases
```
- It doesn't run migrations. Some tools need `docker exec app migrate` after updates.
- It can't roll back automatically.
> ⚠️ **Never auto-update databases.** Postgres, MySQL, and Redis major version upgrades require manual migration steps. Always pin database images.
## Cleanup: Reclaiming Disk Space
Old images pile up. Docker doesn't clean them automatically:
```bash
# See how much space Docker is using
docker system df
# Remove unused images (safe)
docker image prune -f
# Nuclear option: remove ALL unused data
docker system prune -a -f --volumes
# ⚠️ This deletes stopped containers, unused images, AND orphaned volumes
```
### Automate Cleanup
Add to your crontab:
```bash
# Weekly cleanup at 3 AM Sunday
0 3 * * 0 docker image prune -f >> /var/log/docker-cleanup.log 2>&1
```
## Update Checklist
Before updating any tool:
- [ ] Database backed up
- [ ] Current version noted (in case of rollback)
- [ ] Changelog reviewed for breaking changes
- [ ] `.env` file backed up
- [ ] Update applied and logs checked
- [ ] Service verified working
## Next Steps
→ [Backups That Actually Work](/concepts/backups) — Make sure you can actually roll back
→ [Monitoring & Observability](/concepts/monitoring) — Catch failed updates automatically

View File

@@ -0,0 +1,9 @@
import ContactForm from '../../components/ContactForm'
# Contact Us
Have a question regarding self-hosting, a suggestion for a new stack, or just want to say hello? We're here to help.
Fill out the form below and we'll get back to you as soon as possible.
<ContactForm />

201
docs/app/deploy/_meta.ts Normal file
View File

@@ -0,0 +1,201 @@
import type { MetaRecord } from 'nextra'
const meta: MetaRecord = {
"activepieces": {
"title": "Activepieces"
},
"affine": {
"title": "AFFiNE"
},
"akaunting": {
"title": "Akaunting"
},
"appflowy": {
"title": "AppFlowy"
},
"appwrite": {
"title": "Appwrite"
},
"authentik": {
"title": "Authentik"
},
"bitwarden": {
"title": "Bitwarden"
},
"calcom": {
"title": "Cal.com"
},
"chaskiq": {
"title": "Chaskiq"
},
"coder": {
"title": "Coder"
},
"continue-dev": {
"title": "Continue"
},
"coolify": {
"title": "Coolify"
},
"deepseek": {
"title": "DeepSeek-V3 / R1"
},
"documenso": {
"title": "Documenso"
},
"dokku": {
"title": "Dokku"
},
"erpnext": {
"title": "ERPNext"
},
"flux": {
"title": "FLUX"
},
"freecad": {
"title": "FreeCAD"
},
"gemma": {
"title": "Google Gemma 2"
},
"gimp": {
"title": "GIMP"
},
"glitchtip": {
"title": "GlitchTip"
},
"gpt4all": {
"title": "GPT4All"
},
"hunyuan-video": {
"title": "HunyuanVideo 1.5"
},
"jitsi-meet": {
"title": "Jitsi Meet"
},
"jitsu": {
"title": "Jitsu"
},
"kdenlive": {
"title": "Kdenlive"
},
"keepassxc": {
"title": "KeePassXC"
},
"keycloak": {
"title": "Keycloak"
},
"krita": {
"title": "Krita"
},
"librecad": {
"title": "LibreCAD"
},
"listmonk": {
"title": "Listmonk"
},
"llama": {
"title": "Meta Llama 3.1"
},
"matomo": {
"title": "Matomo"
},
"mattermost": {
"title": "Mattermost"
},
"mautic": {
"title": "Mautic"
},
"medusa": {
"title": "Medusa.js"
},
"metabase": {
"title": "Metabase"
},
"minio": {
"title": "MinIO"
},
"mistral": {
"title": "Mistral Large 2"
},
"mixpost": {
"title": "Mixpost"
},
"mochi-1": {
"title": "Mochi-1"
},
"n8n": {
"title": "n8n"
},
"odoo": {
"title": "Odoo"
},
"ollama": {
"title": "Ollama"
},
"onlyoffice": {
"title": "ONLYOFFICE"
},
"orangehrm": {
"title": "OrangeHRM"
},
"outline": {
"title": "Outline"
},
"penpot": {
"title": "Penpot"
},
"plane": {
"title": "Plane"
},
"plausible": {
"title": "Plausible"
},
"pocketbase": {
"title": "PocketBase"
},
"postal": {
"title": "Postal"
},
"posthog": {
"title": "PostHog"
},
"qwen": {
"title": "Qwen 2.5"
},
"rocketchat": {
"title": "Rocket.Chat"
},
"signoz": {
"title": "SigNoz"
},
"stable-diffusion": {
"title": "Stable Diffusion 3.5"
},
"supabase": {
"title": "Supabase"
},
"superset": {
"title": "Apache Superset"
},
"tabby": {
"title": "TabbyML"
},
"taiga": {
"title": "Taiga"
},
"twenty": {
"title": "Twenty"
},
"uptime-kuma": {
"title": "Uptime Kuma"
},
"vaultwarden": {
"title": "Vaultwarden"
},
"zammad": {
"title": "Zammad"
}
}
export default meta

View File

@@ -0,0 +1,158 @@
---
title: "Deploy Activepieces Self-Hosted (Docker)"
description: "Step-by-step guide to self-hosting Activepieces with Docker Compose. "
---
# Deploy Activepieces
Open source alternative to Zapier. Automate your work with 200+ apps.
<div className="deploy-hero">
<span className="deploy-hero-item">⭐ 11.0k stars</span>
<span className="deploy-hero-item">📜 MIT</span>
<span className="deploy-hero-item">🔴 Advanced</span>
<span className="deploy-hero-item">⏱ ~20 minutes</span>
</div>
<div className="mt-8 mb-4">
<a
href="https://m.do.co/c/2ed27757a361"
target="_blank"
rel="noopener noreferrer"
className="flex items-center justify-center w-full px-6 py-4 text-lg font-bold text-white transition-all bg-blue-600 rounded-xl hover:bg-blue-700 hover:scale-[1.02] shadow-lg shadow-blue-500/30"
>
🚀 Deploy on DigitalOcean ($200 Free Credit)
</a>
</div>
## What You'll Get
A fully working Activepieces instance running on your server. Your data stays on your hardware — no third-party access, no usage limits, no surprise invoices.
## Prerequisites
- A server with Docker and Docker Compose installed ([setup guide](/quick-start/choosing-a-server))
- A domain name pointed to your server (optional but recommended)
- Basic terminal access (SSH)
## The Config
Create a directory for Activepieces and add this `docker-compose.yml`:
```yaml
# -------------------------------------------------------------------------
# 🚀 Created and distributed by The AltStack
# 🌍 https://thealtstack.com
# -------------------------------------------------------------------------
version: '3.8'
services:
activepieces:
image: activepieces/activepieces:latest
container_name: activepieces
restart: unless-stopped
depends_on:
- db
- redis
ports:
- "8080:80"
environment:
- AP_FRONTEND_URL=http://localhost:8080
- AP_POSTGRES_DATABASE=activepieces
- AP_POSTGRES_HOST=db
- AP_POSTGRES_PORT=5432
- AP_POSTGRES_USERNAME=activepieces
- AP_POSTGRES_PASSWORD=activepieces
- AP_REDIS_HOST=redis
- AP_REDIS_PORT=6379
db:
image: postgres:14-alpine
container_name: activepieces-db
restart: unless-stopped
environment:
- POSTGRES_USER=activepieces
- POSTGRES_PASSWORD=activepieces
- POSTGRES_DB=activepieces
volumes:
- activepieces_db_data:/var/lib/postgresql/data
redis:
image: redis:alpine
container_name: activepieces-redis
restart: unless-stopped
volumes:
activepieces_db_data:
```
## Let's Ship It
```bash
# Create a directory
mkdir -p /opt/activepieces && cd /opt/activepieces
# Create the docker-compose.yml (paste the config above)
nano docker-compose.yml
# Pull images and start
docker compose up -d
# Watch the logs
docker compose logs -f
```
## Environment Variables
| Variable | Default | Required |
|---|---|---|
| `AP_FRONTEND_URL` | `http://localhost:8080` | No |
| `AP_POSTGRES_DATABASE` | `activepieces` | No |
| `AP_POSTGRES_HOST` | `db` | No |
| `AP_POSTGRES_PORT` | `5432` | No |
| `AP_POSTGRES_USERNAME` | `activepieces` | No |
| `AP_POSTGRES_PASSWORD` | `activepieces` | No |
| `AP_REDIS_HOST` | `redis` | No |
| `AP_REDIS_PORT` | `6379` | No |
| `POSTGRES_USER` | `activepieces` | No |
| `POSTGRES_PASSWORD` | `activepieces` | No |
| `POSTGRES_DB` | `activepieces` | No |
## Post-Deployment Checklist
- [ ] Service is accessible on the configured port
- [ ] Admin account created (if applicable)
- [ ] Reverse proxy configured ([Caddy guide](/concepts/reverse-proxies))
- [ ] SSL/HTTPS working
- [ ] Backup script set up ([backup guide](/concepts/backups))
- [ ] Uptime monitor added ([Uptime Kuma](/deploy/uptime-kuma))
## The "I Broke It" Section
**Container won't start?**
```bash
docker compose logs activepieces | tail -50
```
**Port already in use?**
```bash
# Find what's using the port
lsof -i :PORT_NUMBER
```
**Need to start fresh?**
```bash
docker compose down -v # ⚠️ This deletes volumes/data!
docker compose up -d
```
## Going Further
- [Activepieces on AltStack Directory](https://thealtstack.com/alternative-to/activepieces)
- [Activepieces Self-Hosted Guide](https://thealtstack.com/self-hosted/activepieces)
- [Official Documentation](https://www.activepieces.com)
- [GitHub Repository](https://github.com/activepieces/activepieces)

View File

@@ -0,0 +1,171 @@
---
title: "Deploy AFFiNE Self-Hosted (Docker)"
description: "Step-by-step guide to self-hosting AFFiNE with Docker Compose. "
---
# Deploy AFFiNE
There can be more than Notion and Miro. AFFiNE(pronounced [əfain]) is a next-gen knowledge base that brings planning, sorting and creating all together. Privacy first, open-source, customizable and ready to use.
<div className="deploy-hero">
<span className="deploy-hero-item">⭐ 62.7k stars</span>
<span className="deploy-hero-item">📜 Other</span>
<span className="deploy-hero-item">🔴 Advanced</span>
<span className="deploy-hero-item">⏱ ~20 minutes</span>
</div>
<div className="mt-8 mb-4">
<a
href="https://m.do.co/c/2ed27757a361"
target="_blank"
rel="noopener noreferrer"
className="flex items-center justify-center w-full px-6 py-4 text-lg font-bold text-white transition-all bg-blue-600 rounded-xl hover:bg-blue-700 hover:scale-[1.02] shadow-lg shadow-blue-500/30"
>
🚀 Deploy on DigitalOcean ($200 Free Credit)
</a>
</div>
## What You'll Get
A fully working AFFiNE instance running on your server. Your data stays on your hardware — no third-party access, no usage limits, no surprise invoices.
## Prerequisites
- A server with Docker and Docker Compose installed ([setup guide](/quick-start/choosing-a-server))
- A domain name pointed to your server (optional but recommended)
- Basic terminal access (SSH)
## The Config
Create a directory for AFFiNE and add this `docker-compose.yml`:
```yaml
# -------------------------------------------------------------------------
# 🚀 Created and distributed by The AltStack
# 🌍 https://thealtstack.com
# -------------------------------------------------------------------------
# Docker Compose for AFFiNE
version: '3.8'
services:
affine:
image: ghcr.io/toeverything/affine-graphql:latest # Using official as fallback but custom build setup exists in Dockerfile
container_name: affine
ports:
- "3000:3000"
environment:
- DATABASE_URL=postgres://affine:affine@db:5432/affine
- REDIS_URL=redis://redis:6379
- NODE_ENV=production
depends_on:
db:
condition: service_healthy
redis:
condition: service_healthy
networks:
- affine_net
healthcheck:
test: [ "CMD", "curl", "-f", "http://localhost:3000/" ]
interval: 30s
timeout: 10s
retries: 3
db:
image: postgres:15-alpine
container_name: affine-db
environment:
POSTGRES_USER: affine
POSTGRES_PASSWORD: affine
POSTGRES_DB: affine
volumes:
- affine_db_data:/var/lib/postgresql/data
networks:
- affine_net
healthcheck:
test: [ "CMD-SHELL", "pg_isready -U affine" ]
interval: 5s
timeout: 5s
retries: 5
redis:
image: redis:7-alpine
container_name: affine-redis
networks:
- affine_net
healthcheck:
test: [ "CMD", "redis-cli", "ping" ]
interval: 5s
timeout: 5s
retries: 5
networks:
affine_net:
driver: bridge
volumes:
affine_db_data:
name: affine_db_data
```
## Let's Ship It
```bash
# Create a directory
mkdir -p /opt/affine && cd /opt/affine
# Create the docker-compose.yml (paste the config above)
nano docker-compose.yml
# Pull images and start
docker compose up -d
# Watch the logs
docker compose logs -f
```
## Environment Variables
| Variable | Default | Required |
|---|---|---|
| `DATABASE_URL` | `postgres://affine:affine@db:5432/affine` | No |
| `REDIS_URL` | `redis://redis:6379` | No |
| `NODE_ENV` | `production` | No |
## Post-Deployment Checklist
- [ ] Service is accessible on the configured port
- [ ] Admin account created (if applicable)
- [ ] Reverse proxy configured ([Caddy guide](/concepts/reverse-proxies))
- [ ] SSL/HTTPS working
- [ ] Backup script set up ([backup guide](/concepts/backups))
- [ ] Uptime monitor added ([Uptime Kuma](/deploy/uptime-kuma))
## The "I Broke It" Section
**Container won't start?**
```bash
docker compose logs affine | tail -50
```
**Port already in use?**
```bash
# Find what's using the port
lsof -i :PORT_NUMBER
```
**Need to start fresh?**
```bash
docker compose down -v # ⚠️ This deletes volumes/data!
docker compose up -d
```
## Going Further
- [AFFiNE on AltStack Directory](https://thealtstack.com/alternative-to/affine)
- [AFFiNE Self-Hosted Guide](https://thealtstack.com/self-hosted/affine)
- [Official Documentation](https://affine.pro)
- [GitHub Repository](https://github.com/toeverything/AFFiNE)

View File

@@ -0,0 +1,146 @@
---
title: "Deploy Akaunting Self-Hosted (Docker)"
description: "Step-by-step guide to self-hosting Akaunting with Docker Compose. "
---
# Deploy Akaunting
Free and open source online accounting software for small businesses and freelancers.
<div className="deploy-hero">
<span className="deploy-hero-item">⭐ 12.0k stars</span>
<span className="deploy-hero-item">📜 GPL-3.0</span>
<span className="deploy-hero-item">🔴 Advanced</span>
<span className="deploy-hero-item">⏱ ~20 minutes</span>
</div>
<div className="mt-8 mb-4">
<a
href="https://m.do.co/c/2ed27757a361"
target="_blank"
rel="noopener noreferrer"
className="flex items-center justify-center w-full px-6 py-4 text-lg font-bold text-white transition-all bg-blue-600 rounded-xl hover:bg-blue-700 hover:scale-[1.02] shadow-lg shadow-blue-500/30"
>
🚀 Deploy on DigitalOcean ($200 Free Credit)
</a>
</div>
## What You'll Get
A fully working Akaunting instance running on your server. Your data stays on your hardware — no third-party access, no usage limits, no surprise invoices.
## Prerequisites
- A server with Docker and Docker Compose installed ([setup guide](/quick-start/choosing-a-server))
- A domain name pointed to your server (optional but recommended)
- Basic terminal access (SSH)
## The Config
Create a directory for Akaunting and add this `docker-compose.yml`:
```yaml
# -------------------------------------------------------------------------
# 🚀 Created and distributed by The AltStack
# 🌍 https://thealtstack.com
# -------------------------------------------------------------------------
version: '3.8'
services:
akaunting:
image: akaunting/akaunting:latest
container_name: akaunting
restart: unless-stopped
depends_on:
- db
ports:
- "8080:80"
environment:
- DB_HOST=db
- DB_DATABASE=akaunting
- DB_USERNAME=akaunting
- DB_PASSWORD=akaunting
db:
image: mariadb:10.6
container_name: akaunting-db
restart: unless-stopped
environment:
- MYSQL_DATABASE=akaunting
- MYSQL_USER=akaunting
- MYSQL_PASSWORD=akaunting
- MYSQL_ROOT_PASSWORD=root
volumes:
- akaunting_db_data:/var/lib/mysql
volumes:
akaunting_db_data:
```
## Let's Ship It
```bash
# Create a directory
mkdir -p /opt/akaunting && cd /opt/akaunting
# Create the docker-compose.yml (paste the config above)
nano docker-compose.yml
# Pull images and start
docker compose up -d
# Watch the logs
docker compose logs -f
```
## Environment Variables
| Variable | Default | Required |
|---|---|---|
| `DB_HOST` | `db` | No |
| `DB_DATABASE` | `akaunting` | No |
| `DB_USERNAME` | `akaunting` | No |
| `DB_PASSWORD` | `akaunting` | No |
| `MYSQL_DATABASE` | `akaunting` | No |
| `MYSQL_USER` | `akaunting` | No |
| `MYSQL_PASSWORD` | `akaunting` | No |
| `MYSQL_ROOT_PASSWORD` | `root` | No |
## Post-Deployment Checklist
- [ ] Service is accessible on the configured port
- [ ] Admin account created (if applicable)
- [ ] Reverse proxy configured ([Caddy guide](/concepts/reverse-proxies))
- [ ] SSL/HTTPS working
- [ ] Backup script set up ([backup guide](/concepts/backups))
- [ ] Uptime monitor added ([Uptime Kuma](/deploy/uptime-kuma))
## The "I Broke It" Section
**Container won't start?**
```bash
docker compose logs akaunting | tail -50
```
**Port already in use?**
```bash
# Find what's using the port
lsof -i :PORT_NUMBER
```
**Need to start fresh?**
```bash
docker compose down -v # ⚠️ This deletes volumes/data!
docker compose up -d
```
## Going Further
- [Akaunting on AltStack Directory](https://thealtstack.com/alternative-to/akaunting)
- [Akaunting Self-Hosted Guide](https://thealtstack.com/self-hosted/akaunting)
- [Official Documentation](https://akaunting.com)
- [GitHub Repository](https://github.com/akaunting/akaunting)

View File

@@ -0,0 +1,171 @@
---
title: "Deploy AppFlowy Self-Hosted (Docker)"
description: "Step-by-step guide to self-hosting AppFlowy with Docker Compose. "
---
# Deploy AppFlowy
Bring projects, wikis, and teams together with AI. AppFlowy is the AI collaborative workspace where you achieve more without losing control of your data. The leading open source Notion alternative.
<div className="deploy-hero">
<span className="deploy-hero-item">⭐ 68.0k stars</span>
<span className="deploy-hero-item">📜 GNU Affero General Public License v3.0</span>
<span className="deploy-hero-item">🔴 Advanced</span>
<span className="deploy-hero-item">⏱ ~20 minutes</span>
</div>
<div className="mt-8 mb-4">
<a
href="https://m.do.co/c/2ed27757a361"
target="_blank"
rel="noopener noreferrer"
className="flex items-center justify-center w-full px-6 py-4 text-lg font-bold text-white transition-all bg-blue-600 rounded-xl hover:bg-blue-700 hover:scale-[1.02] shadow-lg shadow-blue-500/30"
>
🚀 Deploy on DigitalOcean ($200 Free Credit)
</a>
</div>
## What You'll Get
A fully working AppFlowy instance running on your server. Your data stays on your hardware — no third-party access, no usage limits, no surprise invoices.
## Prerequisites
- A server with Docker and Docker Compose installed ([setup guide](/quick-start/choosing-a-server))
- A domain name pointed to your server (optional but recommended)
- Basic terminal access (SSH)
## The Config
Create a directory for AppFlowy and add this `docker-compose.yml`:
```yaml
# -------------------------------------------------------------------------
# 🚀 Created and distributed by The AltStack
# 🌍 https://thealtstack.com
# -------------------------------------------------------------------------
# Docker Compose for AppFlowy Cloud
version: '3.8'
services:
appflowy:
build:
context: .
dockerfile: Dockerfile
container_name: appflowy-cloud
ports:
- "8080:8080"
environment:
- DATABASE_URL=postgres://postgres:${POSTGRES_PASSWORD:-password}@db:5432/appflowy
- REDIS_URL=redis://redis:6379
depends_on:
db:
condition: service_healthy
redis:
condition: service_healthy
networks:
- appflowy_net
healthcheck:
test: [ "CMD", "curl", "-f", "http://localhost:8080/health" ]
interval: 10s
timeout: 5s
retries: 5
db:
image: postgres:15-alpine
container_name: appflowy-db
environment:
POSTGRES_PASSWORD: ${POSTGRES_PASSWORD:-password}
POSTGRES_DB: appflowy
volumes:
- appflowy_db_data:/var/lib/postgresql/data
networks:
- appflowy_net
healthcheck:
test: [ "CMD-SHELL", "pg_isready -U postgres" ]
interval: 5s
timeout: 5s
retries: 5
redis:
image: redis:7-alpine
container_name: appflowy-redis
networks:
- appflowy_net
healthcheck:
test: [ "CMD", "redis-cli", "ping" ]
interval: 5s
timeout: 5s
retries: 5
networks:
appflowy_net:
driver: bridge
volumes:
appflowy_db_data:
name: appflowy_db_data
```
## Let's Ship It
```bash
# Create a directory
mkdir -p /opt/appflowy && cd /opt/appflowy
# Create the docker-compose.yml (paste the config above)
nano docker-compose.yml
# Pull images and start
docker compose up -d
# Watch the logs
docker compose logs -f
```
## Environment Variables
| Variable | Default | Required |
|---|---|---|
| `DATABASE_URL` | `postgres://postgres:${POSTGRES_PASSWORD:-password}@db:5432/appflowy` | No |
| `REDIS_URL` | `redis://redis:6379` | No |
| `POSTGRES_PASSWORD` | `password` | No |
## Post-Deployment Checklist
- [ ] Service is accessible on the configured port
- [ ] Admin account created (if applicable)
- [ ] Reverse proxy configured ([Caddy guide](/concepts/reverse-proxies))
- [ ] SSL/HTTPS working
- [ ] Backup script set up ([backup guide](/concepts/backups))
- [ ] Uptime monitor added ([Uptime Kuma](/deploy/uptime-kuma))
## The "I Broke It" Section
**Container won't start?**
```bash
docker compose logs appflowy | tail -50
```
**Port already in use?**
```bash
# Find what's using the port
lsof -i :PORT_NUMBER
```
**Need to start fresh?**
```bash
docker compose down -v # ⚠️ This deletes volumes/data!
docker compose up -d
```
## Going Further
- [AppFlowy on AltStack Directory](https://thealtstack.com/alternative-to/appflowy)
- [AppFlowy Self-Hosted Guide](https://thealtstack.com/self-hosted/appflowy)
- [Official Documentation](https://www.appflowy.io)
- [GitHub Repository](https://github.com/AppFlowy-IO/AppFlowy)

View File

@@ -0,0 +1,181 @@
---
title: "Deploy Appwrite Self-Hosted (Docker)"
description: "Step-by-step guide to self-hosting Appwrite with Docker Compose. "
---
# Deploy Appwrite
Appwrite® - complete cloud infrastructure for your web, mobile and AI apps. Including Auth, Databases, Storage, Functions, Messaging, Hosting, Realtime and more
<div className="deploy-hero">
<span className="deploy-hero-item">⭐ 54.7k stars</span>
<span className="deploy-hero-item">📜 BSD 3-Clause "New" or "Revised" License</span>
<span className="deploy-hero-item">🔴 Advanced</span>
<span className="deploy-hero-item">⏱ ~20 minutes</span>
</div>
<div className="mt-8 mb-4">
<a
href="https://m.do.co/c/2ed27757a361"
target="_blank"
rel="noopener noreferrer"
className="flex items-center justify-center w-full px-6 py-4 text-lg font-bold text-white transition-all bg-blue-600 rounded-xl hover:bg-blue-700 hover:scale-[1.02] shadow-lg shadow-blue-500/30"
>
🚀 Deploy on DigitalOcean ($200 Free Credit)
</a>
</div>
## What You'll Get
A fully working Appwrite instance running on your server. Your data stays on your hardware — no third-party access, no usage limits, no surprise invoices.
## Prerequisites
- A server with Docker and Docker Compose installed ([setup guide](/quick-start/choosing-a-server))
- A domain name pointed to your server (optional but recommended)
- Basic terminal access (SSH)
## The Config
Create a directory for Appwrite and add this `docker-compose.yml`:
```yaml
# -------------------------------------------------------------------------
# 🚀 Created and distributed by The AltStack
# 🌍 https://thealtstack.com
# -------------------------------------------------------------------------
# Docker Compose for Appwrite
# Note: Appwrite is a complex multi-service system.
# This is a production-ready configuration for the core services.
version: '3.8'
services:
appwrite:
image: appwrite/appwrite:1.5.4
container_name: appwrite
ports:
- "80:80"
- "443:443"
environment:
- _APP_ENV=production
- _APP_DB_HOST=db
- _APP_DB_USER=appwrite
- _APP_DB_PASS=${DB_PASSWORD:-password}
- _APP_REDIS_HOST=redis
depends_on:
db:
condition: service_healthy
redis:
condition: service_healthy
networks:
- appwrite_net
healthcheck:
test: [ "CMD", "curl", "-f", "http://localhost/v1/health" ]
interval: 30s
timeout: 10s
retries: 3
db:
image: mariadb:10.11 # Appwrite uses MariaDB by default
container_name: appwrite-db
environment:
MARIADB_USER: appwrite
MARIADB_PASSWORD: ${DB_PASSWORD:-password}
MARIADB_DATABASE: appwrite
MARIADB_ROOT_PASSWORD: ${DB_ROOT_PASSWORD:-rootpassword}
volumes:
- appwrite_db_data:/var/lib/mysql
networks:
- appwrite_net
healthcheck:
test: [ "CMD-SHELL", "mysqladmin ping -h localhost -u root -p${DB_ROOT_PASSWORD:-rootpassword}" ]
interval: 10s
timeout: 5s
retries: 5
redis:
image: redis:7-alpine
container_name: appwrite-redis
networks:
- appwrite_net
healthcheck:
test: [ "CMD", "redis-cli", "ping" ]
interval: 5s
timeout: 5s
retries: 5
networks:
appwrite_net:
driver: bridge
volumes:
appwrite_db_data:
name: appwrite_db_data
```
## Let's Ship It
```bash
# Create a directory
mkdir -p /opt/appwrite && cd /opt/appwrite
# Create the docker-compose.yml (paste the config above)
nano docker-compose.yml
# Pull images and start
docker compose up -d
# Watch the logs
docker compose logs -f
```
## Environment Variables
| Variable | Default | Required |
|---|---|---|
| `_APP_ENV` | `production` | No |
| `_APP_DB_HOST` | `db` | No |
| `_APP_DB_USER` | `appwrite` | No |
| `_APP_DB_PASS` | `${DB_PASSWORD:-password}` | No |
| `_APP_REDIS_HOST` | `redis` | No |
| `DB_PASSWORD` | `password` | No |
| `DB_ROOT_PASSWORD` | `rootpassword` | No |
## Post-Deployment Checklist
- [ ] Service is accessible on the configured port
- [ ] Admin account created (if applicable)
- [ ] Reverse proxy configured ([Caddy guide](/concepts/reverse-proxies))
- [ ] SSL/HTTPS working
- [ ] Backup script set up ([backup guide](/concepts/backups))
- [ ] Uptime monitor added ([Uptime Kuma](/deploy/uptime-kuma))
## The "I Broke It" Section
**Container won't start?**
```bash
docker compose logs appwrite | tail -50
```
**Port already in use?**
```bash
# Find what's using the port
lsof -i :PORT_NUMBER
```
**Need to start fresh?**
```bash
docker compose down -v # ⚠️ This deletes volumes/data!
docker compose up -d
```
## Going Further
- [Appwrite on AltStack Directory](https://thealtstack.com/alternative-to/appwrite)
- [Appwrite Self-Hosted Guide](https://thealtstack.com/self-hosted/appwrite)
- [Official Documentation](https://appwrite.io)
- [GitHub Repository](https://github.com/appwrite/appwrite)

View File

@@ -0,0 +1,172 @@
---
title: "Deploy Authentik Self-Hosted (Docker)"
description: "Step-by-step guide to self-hosting Authentik with Docker Compose. "
---
# Deploy Authentik
The overall-best open-source identity provider, focused on flexibility and versatility.
<div className="deploy-hero">
<span className="deploy-hero-item">⭐ 15.0k stars</span>
<span className="deploy-hero-item">📜 MIT</span>
<span className="deploy-hero-item">🔴 Advanced</span>
<span className="deploy-hero-item">⏱ ~20 minutes</span>
</div>
<div className="mt-8 mb-4">
<a
href="https://m.do.co/c/2ed27757a361"
target="_blank"
rel="noopener noreferrer"
className="flex items-center justify-center w-full px-6 py-4 text-lg font-bold text-white transition-all bg-blue-600 rounded-xl hover:bg-blue-700 hover:scale-[1.02] shadow-lg shadow-blue-500/30"
>
🚀 Deploy on DigitalOcean ($200 Free Credit)
</a>
</div>
## What You'll Get
A fully working Authentik instance running on your server. Your data stays on your hardware — no third-party access, no usage limits, no surprise invoices.
## Prerequisites
- A server with Docker and Docker Compose installed ([setup guide](/quick-start/choosing-a-server))
- A domain name pointed to your server (optional but recommended)
- Basic terminal access (SSH)
## The Config
Create a directory for Authentik and add this `docker-compose.yml`:
```yaml
# -------------------------------------------------------------------------
# 🚀 Created and distributed by The AltStack
# 🌍 https://thealtstack.com
# -------------------------------------------------------------------------
version: '3.8'
services:
server:
image: ghcr.io/goauthentik/server:latest
container_name: authentik-server
restart: unless-stopped
command: server
depends_on:
- db
- redis
ports:
- "9000:9000"
- "9443:9443"
environment:
- AUTHENTIK_REDIS__HOST=redis
- AUTHENTIK_POSTGRESQL__HOST=db
- AUTHENTIK_POSTGRESQL__USER=authentik
- AUTHENTIK_POSTGRESQL__NAME=authentik
- AUTHENTIK_POSTGRESQL__PASSWORD=authentik
- AUTHENTIK_SECRET_KEY=generate-a-random-secret-key
worker:
image: ghcr.io/goauthentik/server:latest
container_name: authentik-worker
restart: unless-stopped
command: worker
depends_on:
- db
- redis
environment:
- AUTHENTIK_REDIS__HOST=redis
- AUTHENTIK_POSTGRESQL__HOST=db
- AUTHENTIK_POSTGRESQL__USER=authentik
- AUTHENTIK_POSTGRESQL__NAME=authentik
- AUTHENTIK_POSTGRESQL__PASSWORD=authentik
- AUTHENTIK_SECRET_KEY=generate-a-random-secret-key
db:
image: postgres:12-alpine
container_name: authentik-db
restart: unless-stopped
environment:
- POSTGRES_PASSWORD=authentik
- POSTGRES_USER=authentik
- POSTGRES_DB=authentik
volumes:
- authentik_db_data:/var/lib/postgresql/data
redis:
image: redis:6-alpine
container_name: authentik-redis
restart: unless-stopped
volumes:
authentik_db_data:
```
## Let's Ship It
```bash
# Create a directory
mkdir -p /opt/authentik && cd /opt/authentik
# Create the docker-compose.yml (paste the config above)
nano docker-compose.yml
# Pull images and start
docker compose up -d
# Watch the logs
docker compose logs -f
```
## Environment Variables
| Variable | Default | Required |
|---|---|---|
| `AUTHENTIK_REDIS__HOST` | `redis` | No |
| `AUTHENTIK_POSTGRESQL__HOST` | `db` | No |
| `AUTHENTIK_POSTGRESQL__USER` | `authentik` | No |
| `AUTHENTIK_POSTGRESQL__NAME` | `authentik` | No |
| `AUTHENTIK_POSTGRESQL__PASSWORD` | `authentik` | No |
| `AUTHENTIK_SECRET_KEY` | `generate-a-random-secret-key` | No |
| `POSTGRES_PASSWORD` | `authentik` | No |
| `POSTGRES_USER` | `authentik` | No |
| `POSTGRES_DB` | `authentik` | No |
## Post-Deployment Checklist
- [ ] Service is accessible on the configured port
- [ ] Admin account created (if applicable)
- [ ] Reverse proxy configured ([Caddy guide](/concepts/reverse-proxies))
- [ ] SSL/HTTPS working
- [ ] Backup script set up ([backup guide](/concepts/backups))
- [ ] Uptime monitor added ([Uptime Kuma](/deploy/uptime-kuma))
## The "I Broke It" Section
**Container won't start?**
```bash
docker compose logs authentik | tail -50
```
**Port already in use?**
```bash
# Find what's using the port
lsof -i :PORT_NUMBER
```
**Need to start fresh?**
```bash
docker compose down -v # ⚠️ This deletes volumes/data!
docker compose up -d
```
## Going Further
- [Authentik on AltStack Directory](https://thealtstack.com/alternative-to/authentik)
- [Authentik Self-Hosted Guide](https://thealtstack.com/self-hosted/authentik)
- [Official Documentation](https://goauthentik.io)
- [GitHub Repository](https://github.com/goauthentik/authentik)

View File

@@ -0,0 +1,117 @@
---
title: "Deploy Bitwarden Self-Hosted (Docker)"
description: "Step-by-step guide to self-hosting Bitwarden with Docker Compose. "
---
# Deploy Bitwarden
Bitwarden infrastructure/backend (API, database, Docker, etc).
<div className="deploy-hero">
<span className="deploy-hero-item">⭐ 18.0k stars</span>
<span className="deploy-hero-item">📜 Other</span>
<span className="deploy-hero-item">🔴 Advanced</span>
<span className="deploy-hero-item">⏱ ~20 minutes</span>
</div>
<div className="mt-8 mb-4">
<a
href="https://m.do.co/c/2ed27757a361"
target="_blank"
rel="noopener noreferrer"
className="flex items-center justify-center w-full px-6 py-4 text-lg font-bold text-white transition-all bg-blue-600 rounded-xl hover:bg-blue-700 hover:scale-[1.02] shadow-lg shadow-blue-500/30"
>
🚀 Deploy on DigitalOcean ($200 Free Credit)
</a>
</div>
## What You'll Get
A fully working Bitwarden instance running on your server. Your data stays on your hardware — no third-party access, no usage limits, no surprise invoices.
## Prerequisites
- A server with Docker and Docker Compose installed ([setup guide](/quick-start/choosing-a-server))
- A domain name pointed to your server (optional but recommended)
- Basic terminal access (SSH)
## The Config
Create a directory for Bitwarden and add this `docker-compose.yml`:
```yaml
# -------------------------------------------------------------------------
# 🚀 Created and distributed by The AltStack
# 🌍 https://thealtstack.com
# -------------------------------------------------------------------------
version: '3.8'
services:
bitwarden:
image: vaultwarden/server:latest
container_name: bitwarden
restart: unless-stopped
ports:
- "8088:80"
volumes:
- bw-data:/data
volumes:
bw-data:
```
## Let's Ship It
```bash
# Create a directory
mkdir -p /opt/bitwarden && cd /opt/bitwarden
# Create the docker-compose.yml (paste the config above)
nano docker-compose.yml
# Pull images and start
docker compose up -d
# Watch the logs
docker compose logs -f
```
## Post-Deployment Checklist
- [ ] Service is accessible on the configured port
- [ ] Admin account created (if applicable)
- [ ] Reverse proxy configured ([Caddy guide](/concepts/reverse-proxies))
- [ ] SSL/HTTPS working
- [ ] Backup script set up ([backup guide](/concepts/backups))
- [ ] Uptime monitor added ([Uptime Kuma](/deploy/uptime-kuma))
## The "I Broke It" Section
**Container won't start?**
```bash
docker compose logs bitwarden | tail -50
```
**Port already in use?**
```bash
# Find what's using the port
lsof -i :PORT_NUMBER
```
**Need to start fresh?**
```bash
docker compose down -v # ⚠️ This deletes volumes/data!
docker compose up -d
```
## Going Further
- [Bitwarden on AltStack Directory](https://thealtstack.com/alternative-to/bitwarden)
- [Bitwarden Self-Hosted Guide](https://thealtstack.com/self-hosted/bitwarden)
- [Official Documentation](https://bitwarden.com)
- [GitHub Repository](https://github.com/bitwarden/server)

View File

@@ -0,0 +1,112 @@
---
title: "Deploy Cal.com Self-Hosted (Docker)"
description: "Step-by-step guide to self-hosting Cal.com with Docker Compose. "
---
# Deploy Cal.com
The open-source Calendly alternative. Take control of your scheduling.
<div className="deploy-hero">
<span className="deploy-hero-item">⭐ 30.0k stars</span>
<span className="deploy-hero-item">📜 AGPL-3.0</span>
<span className="deploy-hero-item">🔴 Advanced</span>
<span className="deploy-hero-item">⏱ ~20 minutes</span>
</div>
<div className="mt-8 mb-4">
<a
href="https://m.do.co/c/2ed27757a361"
target="_blank"
rel="noopener noreferrer"
className="flex items-center justify-center w-full px-6 py-4 text-lg font-bold text-white transition-all bg-blue-600 rounded-xl hover:bg-blue-700 hover:scale-[1.02] shadow-lg shadow-blue-500/30"
>
🚀 Deploy on DigitalOcean ($200 Free Credit)
</a>
</div>
## What You'll Get
A fully working Cal.com instance running on your server. Your data stays on your hardware — no third-party access, no usage limits, no surprise invoices.
## Prerequisites
- A server with Docker and Docker Compose installed ([setup guide](/quick-start/choosing-a-server))
- A domain name pointed to your server (optional but recommended)
- Basic terminal access (SSH)
## The Config
Create a directory for Cal.com and add this `docker-compose.yml`:
```yaml
# -------------------------------------------------------------------------
# 🚀 Created and distributed by The AltStack
# 🌍 https://thealtstack.com
# -------------------------------------------------------------------------
version: '3.8'
services:
calcom:
image: calcom/cal.com:latest
container_name: calcom
restart: unless-stopped
ports:
- "3000:3000"
```
## Let's Ship It
```bash
# Create a directory
mkdir -p /opt/calcom && cd /opt/calcom
# Create the docker-compose.yml (paste the config above)
nano docker-compose.yml
# Pull images and start
docker compose up -d
# Watch the logs
docker compose logs -f
```
## Post-Deployment Checklist
- [ ] Service is accessible on the configured port
- [ ] Admin account created (if applicable)
- [ ] Reverse proxy configured ([Caddy guide](/concepts/reverse-proxies))
- [ ] SSL/HTTPS working
- [ ] Backup script set up ([backup guide](/concepts/backups))
- [ ] Uptime monitor added ([Uptime Kuma](/deploy/uptime-kuma))
## The "I Broke It" Section
**Container won't start?**
```bash
docker compose logs calcom | tail -50
```
**Port already in use?**
```bash
# Find what's using the port
lsof -i :PORT_NUMBER
```
**Need to start fresh?**
```bash
docker compose down -v # ⚠️ This deletes volumes/data!
docker compose up -d
```
## Going Further
- [Cal.com on AltStack Directory](https://thealtstack.com/alternative-to/calcom)
- [Cal.com Self-Hosted Guide](https://thealtstack.com/self-hosted/calcom)
- [Official Documentation](https://cal.com)
- [GitHub Repository](https://github.com/calcom/cal.com)

View File

@@ -0,0 +1,112 @@
---
title: "Deploy Chaskiq Self-Hosted (Docker)"
description: "Step-by-step guide to self-hosting Chaskiq with Docker Compose. "
---
# Deploy Chaskiq
Open source conversational marketing platform alternative to Intercom and Drift.
<div className="deploy-hero">
<span className="deploy-hero-item">⭐ 4.0k stars</span>
<span className="deploy-hero-item">📜 GPL-3.0</span>
<span className="deploy-hero-item">🔴 Advanced</span>
<span className="deploy-hero-item">⏱ ~20 minutes</span>
</div>
<div className="mt-8 mb-4">
<a
href="https://m.do.co/c/2ed27757a361"
target="_blank"
rel="noopener noreferrer"
className="flex items-center justify-center w-full px-6 py-4 text-lg font-bold text-white transition-all bg-blue-600 rounded-xl hover:bg-blue-700 hover:scale-[1.02] shadow-lg shadow-blue-500/30"
>
🚀 Deploy on DigitalOcean ($200 Free Credit)
</a>
</div>
## What You'll Get
A fully working Chaskiq instance running on your server. Your data stays on your hardware — no third-party access, no usage limits, no surprise invoices.
## Prerequisites
- A server with Docker and Docker Compose installed ([setup guide](/quick-start/choosing-a-server))
- A domain name pointed to your server (optional but recommended)
- Basic terminal access (SSH)
## The Config
Create a directory for Chaskiq and add this `docker-compose.yml`:
```yaml
# -------------------------------------------------------------------------
# 🚀 Created and distributed by The AltStack
# 🌍 https://thealtstack.com
# -------------------------------------------------------------------------
version: '3.8'
services:
chaskiq:
image: chaskiq/chaskiq:latest
container_name: chaskiq
restart: unless-stopped
ports:
- "3000:3000"
```
## Let's Ship It
```bash
# Create a directory
mkdir -p /opt/chaskiq && cd /opt/chaskiq
# Create the docker-compose.yml (paste the config above)
nano docker-compose.yml
# Pull images and start
docker compose up -d
# Watch the logs
docker compose logs -f
```
## Post-Deployment Checklist
- [ ] Service is accessible on the configured port
- [ ] Admin account created (if applicable)
- [ ] Reverse proxy configured ([Caddy guide](/concepts/reverse-proxies))
- [ ] SSL/HTTPS working
- [ ] Backup script set up ([backup guide](/concepts/backups))
- [ ] Uptime monitor added ([Uptime Kuma](/deploy/uptime-kuma))
## The "I Broke It" Section
**Container won't start?**
```bash
docker compose logs chaskiq | tail -50
```
**Port already in use?**
```bash
# Find what's using the port
lsof -i :PORT_NUMBER
```
**Need to start fresh?**
```bash
docker compose down -v # ⚠️ This deletes volumes/data!
docker compose up -d
```
## Going Further
- [Chaskiq on AltStack Directory](https://thealtstack.com/alternative-to/chaskiq)
- [Chaskiq Self-Hosted Guide](https://thealtstack.com/self-hosted/chaskiq)
- [Official Documentation](https://chaskiq.io)
- [GitHub Repository](https://github.com/chaskiq/chaskiq)

View File

@@ -0,0 +1,144 @@
---
title: "Deploy Coder Self-Hosted (Docker)"
description: "Step-by-step guide to self-hosting Coder with Docker Compose. "
---
# Deploy Coder
Provision software development environments as code on your infrastructure.
<div className="deploy-hero">
<span className="deploy-hero-item">⭐ 20.0k stars</span>
<span className="deploy-hero-item">📜 AGPL-3.0</span>
<span className="deploy-hero-item">🔴 Advanced</span>
<span className="deploy-hero-item">⏱ ~20 minutes</span>
</div>
<div className="mt-8 mb-4">
<a
href="https://m.do.co/c/2ed27757a361"
target="_blank"
rel="noopener noreferrer"
className="flex items-center justify-center w-full px-6 py-4 text-lg font-bold text-white transition-all bg-blue-600 rounded-xl hover:bg-blue-700 hover:scale-[1.02] shadow-lg shadow-blue-500/30"
>
🚀 Deploy on DigitalOcean ($200 Free Credit)
</a>
</div>
## What You'll Get
A fully working Coder instance running on your server. Your data stays on your hardware — no third-party access, no usage limits, no surprise invoices.
## Prerequisites
- A server with Docker and Docker Compose installed ([setup guide](/quick-start/choosing-a-server))
- A domain name pointed to your server (optional but recommended)
- Basic terminal access (SSH)
## The Config
Create a directory for Coder and add this `docker-compose.yml`:
```yaml
# -------------------------------------------------------------------------
# 🚀 Created and distributed by The AltStack
# 🌍 https://thealtstack.com
# -------------------------------------------------------------------------
version: '3.8'
services:
coder:
image: ghcr.io/coder/coder:latest
container_name: coder
restart: unless-stopped
depends_on:
- db
ports:
- "7080:7080"
environment:
- CODER_PG_CONNECTION_URL=postgresql://coder:coder@db:5432/coder
- CODER_ACCESS_URL=http://localhost:7080
- CODER_HTTP_ADDRESS=0.0.0.0:7080
volumes:
- /var/run/docker.sock:/var/run/docker.sock
db:
image: postgres:13
container_name: coder-db
restart: unless-stopped
environment:
- POSTGRES_USER=coder
- POSTGRES_PASSWORD=coder
- POSTGRES_DB=coder
volumes:
- coder_db_data:/var/lib/postgresql/data
volumes:
coder_db_data:
```
## Let's Ship It
```bash
# Create a directory
mkdir -p /opt/coder && cd /opt/coder
# Create the docker-compose.yml (paste the config above)
nano docker-compose.yml
# Pull images and start
docker compose up -d
# Watch the logs
docker compose logs -f
```
## Environment Variables
| Variable | Default | Required |
|---|---|---|
| `CODER_PG_CONNECTION_URL` | `postgresql://coder:coder@db:5432/coder` | No |
| `CODER_ACCESS_URL` | `http://localhost:7080` | No |
| `CODER_HTTP_ADDRESS` | `0.0.0.0:7080` | No |
| `POSTGRES_USER` | `coder` | No |
| `POSTGRES_PASSWORD` | `coder` | No |
| `POSTGRES_DB` | `coder` | No |
## Post-Deployment Checklist
- [ ] Service is accessible on the configured port
- [ ] Admin account created (if applicable)
- [ ] Reverse proxy configured ([Caddy guide](/concepts/reverse-proxies))
- [ ] SSL/HTTPS working
- [ ] Backup script set up ([backup guide](/concepts/backups))
- [ ] Uptime monitor added ([Uptime Kuma](/deploy/uptime-kuma))
## The "I Broke It" Section
**Container won't start?**
```bash
docker compose logs coder | tail -50
```
**Port already in use?**
```bash
# Find what's using the port
lsof -i :PORT_NUMBER
```
**Need to start fresh?**
```bash
docker compose down -v # ⚠️ This deletes volumes/data!
docker compose up -d
```
## Going Further
- [Coder on AltStack Directory](https://thealtstack.com/alternative-to/coder)
- [Coder Self-Hosted Guide](https://thealtstack.com/self-hosted/coder)
- [Official Documentation](https://coder.com)
- [GitHub Repository](https://github.com/coder/coder)

View File

@@ -0,0 +1,112 @@
---
title: "Deploy Continue Self-Hosted (Docker)"
description: "Step-by-step guide to self-hosting Continue with Docker Compose. "
---
# Deploy Continue
Open-source AI code assistant for VS Code and JetBrains. Use any model (local or API).
<div className="deploy-hero">
<span className="deploy-hero-item">⭐ 25.0k stars</span>
<span className="deploy-hero-item">📜 Apache License 2.0</span>
<span className="deploy-hero-item">🔴 Advanced</span>
<span className="deploy-hero-item">⏱ ~20 minutes</span>
</div>
<div className="mt-8 mb-4">
<a
href="https://m.do.co/c/2ed27757a361"
target="_blank"
rel="noopener noreferrer"
className="flex items-center justify-center w-full px-6 py-4 text-lg font-bold text-white transition-all bg-blue-600 rounded-xl hover:bg-blue-700 hover:scale-[1.02] shadow-lg shadow-blue-500/30"
>
🚀 Deploy on DigitalOcean ($200 Free Credit)
</a>
</div>
## What You'll Get
A fully working Continue instance running on your server. Your data stays on your hardware — no third-party access, no usage limits, no surprise invoices.
## Prerequisites
- A server with Docker and Docker Compose installed ([setup guide](/quick-start/choosing-a-server))
- A domain name pointed to your server (optional but recommended)
- Basic terminal access (SSH)
## The Config
Create a directory for Continue and add this `docker-compose.yml`:
```yaml
# -------------------------------------------------------------------------
# 🚀 Created and distributed by The AltStack
# 🌍 https://thealtstack.com
# -------------------------------------------------------------------------
version: '3.8'
services:
continue:
image: continuedev/continue:latest
container_name: continue
restart: unless-stopped
ports:
- "8080:8080"
```
## Let's Ship It
```bash
# Create a directory
mkdir -p /opt/continue-dev && cd /opt/continue-dev
# Create the docker-compose.yml (paste the config above)
nano docker-compose.yml
# Pull images and start
docker compose up -d
# Watch the logs
docker compose logs -f
```
## Post-Deployment Checklist
- [ ] Service is accessible on the configured port
- [ ] Admin account created (if applicable)
- [ ] Reverse proxy configured ([Caddy guide](/concepts/reverse-proxies))
- [ ] SSL/HTTPS working
- [ ] Backup script set up ([backup guide](/concepts/backups))
- [ ] Uptime monitor added ([Uptime Kuma](/deploy/uptime-kuma))
## The "I Broke It" Section
**Container won't start?**
```bash
docker compose logs continue-dev | tail -50
```
**Port already in use?**
```bash
# Find what's using the port
lsof -i :PORT_NUMBER
```
**Need to start fresh?**
```bash
docker compose down -v # ⚠️ This deletes volumes/data!
docker compose up -d
```
## Going Further
- [Continue on AltStack Directory](https://thealtstack.com/alternative-to/continue-dev)
- [Continue Self-Hosted Guide](https://thealtstack.com/self-hosted/continue-dev)
- [Official Documentation](https://continue.dev)
- [GitHub Repository](https://github.com/continuedev/continue)

View File

@@ -0,0 +1,171 @@
---
title: "Deploy Coolify Self-Hosted (Docker)"
description: "Step-by-step guide to self-hosting Coolify with Docker Compose. "
---
# Deploy Coolify
An open-source, self-hostable PaaS alternative to Vercel, Heroku & Netlify that lets you easily deploy static sites, databases, full-stack applications and 280+ one-click services on your own servers.
<div className="deploy-hero">
<span className="deploy-hero-item">⭐ 50.4k stars</span>
<span className="deploy-hero-item">📜 Apache License 2.0</span>
<span className="deploy-hero-item">🔴 Advanced</span>
<span className="deploy-hero-item">⏱ ~20 minutes</span>
</div>
<div className="mt-8 mb-4">
<a
href="https://m.do.co/c/2ed27757a361"
target="_blank"
rel="noopener noreferrer"
className="flex items-center justify-center w-full px-6 py-4 text-lg font-bold text-white transition-all bg-blue-600 rounded-xl hover:bg-blue-700 hover:scale-[1.02] shadow-lg shadow-blue-500/30"
>
🚀 Deploy on DigitalOcean ($200 Free Credit)
</a>
</div>
A fully operational Coolify instance. Think of Coolify as a self-hosted Vercel or Heroku. Once installed, it manages your other Docker containers, handles deployments from GitHub/GitLab, and provides an integrated reverse proxy.
> 🚀 **Self-Hosting Level:** If you only deploy one thing, let it be Coolify. It makes deploying everything else 10x easier.
## Prerequisites
- A server with Docker and Docker Compose installed ([setup guide](/quick-start/choosing-a-server))
- A domain name pointed to your server (optional but recommended)
- Basic terminal access (SSH)
## The Config
Create a directory for Coolify and add this `docker-compose.yml`:
```yaml
# -------------------------------------------------------------------------
# 🚀 Created and distributed by The AltStack
# 🌍 https://thealtstack.com
# -------------------------------------------------------------------------
# Docker Compose for Coolify
# Note: Coolify is a self-hosted PaaS.
version: '3.8'
services:
coolify:
image: ghcr.io/coollabsio/coolify:latest
container_name: coolify
ports:
- "8000:8000"
environment:
- APP_ENV=production
- DB_CONNECTION=pgsql
- DB_HOST=db
- DB_DATABASE=coolify
- DB_USERNAME=coolify
- DB_PASSWORD=${DB_PASSWORD:-password}
volumes:
- coolify_data:/var/www/html/storage
- /var/run/docker.sock:/var/run/docker.sock # Essential for controlling Docker
depends_on:
db:
condition: service_healthy
networks:
- coolify_net
healthcheck:
test: [ "CMD", "curl", "-f", "http://localhost:8000/api/health" ]
interval: 30s
timeout: 10s
retries: 3
restart: unless-stopped
db:
image: postgres:15-alpine
container_name: coolify-db
environment:
POSTGRES_USER: coolify
POSTGRES_PASSWORD: ${DB_PASSWORD:-password}
POSTGRES_DB: coolify
volumes:
- coolify_db_data:/var/lib/postgresql/data
networks:
- coolify_net
healthcheck:
test: [ "CMD-SHELL", "pg_isready -U coolify" ]
interval: 5s
timeout: 5s
retries: 5
networks:
coolify_net:
driver: bridge
volumes:
coolify_data:
name: coolify_data
coolify_db_data:
name: coolify_db_data
```
## Let's Ship It
```bash
# Create a directory
mkdir -p /opt/coolify && cd /opt/coolify
# Create the docker-compose.yml (paste the config above)
nano docker-compose.yml
# Pull images and start
docker compose up -d
# Watch the logs
docker compose logs -f
```
## Environment Variables
| Variable | Default | Required |
|---|---|---|
| `APP_ENV` | `production` | No |
| `DB_CONNECTION` | `pgsql` | No |
| `DB_HOST` | `db` | No |
| `DB_DATABASE` | `coolify` | No |
| `DB_USERNAME` | `coolify` | No |
| `DB_PASSWORD` | `${DB_PASSWORD:-password}` | No |
## Post-Deployment Checklist
- [ ] Service is accessible on the configured port
- [ ] Admin account created (if applicable)
- [ ] Reverse proxy configured ([Caddy guide](/concepts/reverse-proxies))
- [ ] SSL/HTTPS working
- [ ] Backup script set up ([backup guide](/concepts/backups))
- [ ] Uptime monitor added ([Uptime Kuma](/deploy/uptime-kuma))
## The "I Broke It" Section
**Container won't start?**
```bash
docker compose logs coolify | tail -50
```
**Port already in use?**
```bash
# Find what's using the port
lsof -i :PORT_NUMBER
```
**Need to start fresh?**
```bash
docker compose down -v # ⚠️ This deletes volumes/data!
docker compose up -d
```
## Going Further
- [Coolify on AltStack Directory](https://thealtstack.com/alternative-to/coolify)
- [Coolify Self-Hosted Guide](https://thealtstack.com/self-hosted/coolify)
- [Official Documentation](https://coolify.io)
- [GitHub Repository](https://github.com/coollabsio/coolify)

View File

@@ -0,0 +1,117 @@
---
title: "Deploy DeepSeek-V3 / R1 Self-Hosted (Docker)"
description: "Step-by-step guide to self-hosting DeepSeek-V3 / R1 with Docker Compose. Replaces: meta-llama-3-1, mistral, qwen-2-5."
---
# Deploy DeepSeek-V3 / R1
Powerful open-source models including V3 (671B) and R1 (Reasoning). Rivals GPT-4o and o1.
<div className="deploy-hero">
<span className="deploy-hero-item">⭐ 110.0k stars</span>
<span className="deploy-hero-item">📜 MIT License</span>
<span className="deploy-hero-item">🔴 Advanced</span>
<span className="deploy-hero-item">⏱ ~20 minutes</span>
</div>
<div className="mt-8 mb-4">
<a
href="https://m.do.co/c/2ed27757a361"
target="_blank"
rel="noopener noreferrer"
className="flex items-center justify-center w-full px-6 py-4 text-lg font-bold text-white transition-all bg-blue-600 rounded-xl hover:bg-blue-700 hover:scale-[1.02] shadow-lg shadow-blue-500/30"
>
🚀 Deploy on DigitalOcean ($200 Free Credit)
</a>
</div>
## What You'll Get
A fully working DeepSeek-V3 / R1 instance running on your server. Your data stays on your hardware — no third-party access, no usage limits, no surprise invoices.
## Prerequisites
- A server with Docker and Docker Compose installed ([setup guide](/quick-start/choosing-a-server))
- A domain name pointed to your server (optional but recommended)
- Basic terminal access (SSH)
## The Config
Create a directory for DeepSeek-V3 / R1 and add this `docker-compose.yml`:
```yaml
# -------------------------------------------------------------------------
# 🚀 Created and distributed by The AltStack
# 🌍 https://thealtstack.com
# -------------------------------------------------------------------------
version: '3.8'
services:
ollama-deepseek:
image: ollama/ollama:latest
container_name: ollama-deepseek
restart: unless-stopped
ports:
- "11435:11434"
volumes:
- ollama_deepseek:/root/.ollama
volumes:
ollama_deepseek:
```
## Let's Ship It
```bash
# Create a directory
mkdir -p /opt/deepseek && cd /opt/deepseek
# Create the docker-compose.yml (paste the config above)
nano docker-compose.yml
# Pull images and start
docker compose up -d
# Watch the logs
docker compose logs -f
```
## Post-Deployment Checklist
- [ ] Service is accessible on the configured port
- [ ] Admin account created (if applicable)
- [ ] Reverse proxy configured ([Caddy guide](/concepts/reverse-proxies))
- [ ] SSL/HTTPS working
- [ ] Backup script set up ([backup guide](/concepts/backups))
- [ ] Uptime monitor added ([Uptime Kuma](/deploy/uptime-kuma))
## The "I Broke It" Section
**Container won't start?**
```bash
docker compose logs deepseek | tail -50
```
**Port already in use?**
```bash
# Find what's using the port
lsof -i :PORT_NUMBER
```
**Need to start fresh?**
```bash
docker compose down -v # ⚠️ This deletes volumes/data!
docker compose up -d
```
## Going Further
- [DeepSeek-V3 / R1 on AltStack Directory](https://thealtstack.com/alternative-to/deepseek)
- [DeepSeek-V3 / R1 Self-Hosted Guide](https://thealtstack.com/self-hosted/deepseek)
- [Official Documentation](https://deepseek.com)
- [GitHub Repository](https://github.com/deepseek-ai/DeepSeek-V3)

View File

@@ -0,0 +1,142 @@
---
title: "Deploy Documenso Self-Hosted (Docker)"
description: "Step-by-step guide to self-hosting Documenso with Docker Compose. "
---
# Deploy Documenso
The open-source DocuSign alternative. We aim to be the world's most trusted document signing platform.
<div className="deploy-hero">
<span className="deploy-hero-item">⭐ 8.0k stars</span>
<span className="deploy-hero-item">📜 AGPL-3.0</span>
<span className="deploy-hero-item">🔴 Advanced</span>
<span className="deploy-hero-item">⏱ ~20 minutes</span>
</div>
<div className="mt-8 mb-4">
<a
href="https://m.do.co/c/2ed27757a361"
target="_blank"
rel="noopener noreferrer"
className="flex items-center justify-center w-full px-6 py-4 text-lg font-bold text-white transition-all bg-blue-600 rounded-xl hover:bg-blue-700 hover:scale-[1.02] shadow-lg shadow-blue-500/30"
>
🚀 Deploy on DigitalOcean ($200 Free Credit)
</a>
</div>
## What You'll Get
A fully working Documenso instance running on your server. Your data stays on your hardware — no third-party access, no usage limits, no surprise invoices.
## Prerequisites
- A server with Docker and Docker Compose installed ([setup guide](/quick-start/choosing-a-server))
- A domain name pointed to your server (optional but recommended)
- Basic terminal access (SSH)
## The Config
Create a directory for Documenso and add this `docker-compose.yml`:
```yaml
# -------------------------------------------------------------------------
# 🚀 Created and distributed by The AltStack
# 🌍 https://thealtstack.com
# -------------------------------------------------------------------------
version: '3.8'
services:
documenso:
image: documenso/documenso:latest
container_name: documenso
restart: unless-stopped
depends_on:
- db
ports:
- "3000:3000"
environment:
- DATABASE_URL=postgresql://documenso:documenso@db:5432/documenso
- NEXTAUTH_URL=http://localhost:3000
- NEXTAUTH_SECRET=supersecret
db:
image: postgres:15-alpine
container_name: documenso-db
restart: unless-stopped
environment:
- POSTGRES_USER=documenso
- POSTGRES_PASSWORD=documenso
- POSTGRES_DB=documenso
volumes:
- documenso_db_data:/var/lib/postgresql/data
volumes:
documenso_db_data:
```
## Let's Ship It
```bash
# Create a directory
mkdir -p /opt/documenso && cd /opt/documenso
# Create the docker-compose.yml (paste the config above)
nano docker-compose.yml
# Pull images and start
docker compose up -d
# Watch the logs
docker compose logs -f
```
## Environment Variables
| Variable | Default | Required |
|---|---|---|
| `DATABASE_URL` | `postgresql://documenso:documenso@db:5432/documenso` | No |
| `NEXTAUTH_URL` | `http://localhost:3000` | No |
| `NEXTAUTH_SECRET` | `supersecret` | No |
| `POSTGRES_USER` | `documenso` | No |
| `POSTGRES_PASSWORD` | `documenso` | No |
| `POSTGRES_DB` | `documenso` | No |
## Post-Deployment Checklist
- [ ] Service is accessible on the configured port
- [ ] Admin account created (if applicable)
- [ ] Reverse proxy configured ([Caddy guide](/concepts/reverse-proxies))
- [ ] SSL/HTTPS working
- [ ] Backup script set up ([backup guide](/concepts/backups))
- [ ] Uptime monitor added ([Uptime Kuma](/deploy/uptime-kuma))
## The "I Broke It" Section
**Container won't start?**
```bash
docker compose logs documenso | tail -50
```
**Port already in use?**
```bash
# Find what's using the port
lsof -i :PORT_NUMBER
```
**Need to start fresh?**
```bash
docker compose down -v # ⚠️ This deletes volumes/data!
docker compose up -d
```
## Going Further
- [Documenso on AltStack Directory](https://thealtstack.com/alternative-to/documenso)
- [Documenso Self-Hosted Guide](https://thealtstack.com/self-hosted/documenso)
- [Official Documentation](https://documenso.com)
- [GitHub Repository](https://github.com/documenso/documenso)

View File

@@ -0,0 +1,114 @@
---
title: "Deploy Dokku Self-Hosted (Docker)"
description: "Step-by-step guide to self-hosting Dokku with Docker Compose. "
---
# Deploy Dokku
A docker-powered PaaS that helps you build and manage the lifecycle of applications
<div className="deploy-hero">
<span className="deploy-hero-item">⭐ 31.9k stars</span>
<span className="deploy-hero-item">📜 MIT License</span>
<span className="deploy-hero-item">🔴 Advanced</span>
<span className="deploy-hero-item">⏱ ~20 minutes</span>
</div>
<div className="mt-8 mb-4">
<a
href="https://m.do.co/c/2ed27757a361"
target="_blank"
rel="noopener noreferrer"
className="flex items-center justify-center w-full px-6 py-4 text-lg font-bold text-white transition-all bg-blue-600 rounded-xl hover:bg-blue-700 hover:scale-[1.02] shadow-lg shadow-blue-500/30"
>
🚀 Deploy on DigitalOcean ($200 Free Credit)
</a>
</div>
## What You'll Get
A fully working Dokku instance running on your server. Your data stays on your hardware — no third-party access, no usage limits, no surprise invoices.
## Prerequisites
- A server with Docker and Docker Compose installed ([setup guide](/quick-start/choosing-a-server))
- A domain name pointed to your server (optional but recommended)
- Basic terminal access (SSH)
## The Config
Create a directory for Dokku and add this `docker-compose.yml`:
```yaml
# -------------------------------------------------------------------------
# 🚀 Created and distributed by The AltStack
# 🌍 https://thealtstack.com
# -------------------------------------------------------------------------
version: '3.8'
services:
dokku:
image: dokku/dokku:latest
container_name: dokku
restart: unless-stopped
ports:
- "80:80"
- "443:443"
- "22:22"
```
## Let's Ship It
```bash
# Create a directory
mkdir -p /opt/dokku && cd /opt/dokku
# Create the docker-compose.yml (paste the config above)
nano docker-compose.yml
# Pull images and start
docker compose up -d
# Watch the logs
docker compose logs -f
```
## Post-Deployment Checklist
- [ ] Service is accessible on the configured port
- [ ] Admin account created (if applicable)
- [ ] Reverse proxy configured ([Caddy guide](/concepts/reverse-proxies))
- [ ] SSL/HTTPS working
- [ ] Backup script set up ([backup guide](/concepts/backups))
- [ ] Uptime monitor added ([Uptime Kuma](/deploy/uptime-kuma))
## The "I Broke It" Section
**Container won't start?**
```bash
docker compose logs dokku | tail -50
```
**Port already in use?**
```bash
# Find what's using the port
lsof -i :PORT_NUMBER
```
**Need to start fresh?**
```bash
docker compose down -v # ⚠️ This deletes volumes/data!
docker compose up -d
```
## Going Further
- [Dokku on AltStack Directory](https://thealtstack.com/alternative-to/dokku)
- [Dokku Self-Hosted Guide](https://thealtstack.com/self-hosted/dokku)
- [Official Documentation](https://dokku.com)
- [GitHub Repository](https://github.com/dokku/dokku)

View File

@@ -0,0 +1,112 @@
---
title: "Deploy ERPNext Self-Hosted (Docker)"
description: "Step-by-step guide to self-hosting ERPNext with Docker Compose. "
---
# Deploy ERPNext
A free and open-source integrated Enterprise Resource Planning (ERP) software.
<div className="deploy-hero">
<span className="deploy-hero-item">⭐ 31.6k stars</span>
<span className="deploy-hero-item">📜 GNU General Public License v3.0</span>
<span className="deploy-hero-item">🔴 Advanced</span>
<span className="deploy-hero-item">⏱ ~20 minutes</span>
</div>
<div className="mt-8 mb-4">
<a
href="https://m.do.co/c/2ed27757a361"
target="_blank"
rel="noopener noreferrer"
className="flex items-center justify-center w-full px-6 py-4 text-lg font-bold text-white transition-all bg-blue-600 rounded-xl hover:bg-blue-700 hover:scale-[1.02] shadow-lg shadow-blue-500/30"
>
🚀 Deploy on DigitalOcean ($200 Free Credit)
</a>
</div>
## What You'll Get
A fully working ERPNext instance running on your server. Your data stays on your hardware — no third-party access, no usage limits, no surprise invoices.
## Prerequisites
- A server with Docker and Docker Compose installed ([setup guide](/quick-start/choosing-a-server))
- A domain name pointed to your server (optional but recommended)
- Basic terminal access (SSH)
## The Config
Create a directory for ERPNext and add this `docker-compose.yml`:
```yaml
# -------------------------------------------------------------------------
# 🚀 Created and distributed by The AltStack
# 🌍 https://thealtstack.com
# -------------------------------------------------------------------------
version: '3.8'
services:
erpnext:
image: frappe/erpnext-worker:latest
container_name: erpnext
restart: unless-stopped
ports:
- "8000:8000"
```
## Let's Ship It
```bash
# Create a directory
mkdir -p /opt/erpnext && cd /opt/erpnext
# Create the docker-compose.yml (paste the config above)
nano docker-compose.yml
# Pull images and start
docker compose up -d
# Watch the logs
docker compose logs -f
```
## Post-Deployment Checklist
- [ ] Service is accessible on the configured port
- [ ] Admin account created (if applicable)
- [ ] Reverse proxy configured ([Caddy guide](/concepts/reverse-proxies))
- [ ] SSL/HTTPS working
- [ ] Backup script set up ([backup guide](/concepts/backups))
- [ ] Uptime monitor added ([Uptime Kuma](/deploy/uptime-kuma))
## The "I Broke It" Section
**Container won't start?**
```bash
docker compose logs erpnext | tail -50
```
**Port already in use?**
```bash
# Find what's using the port
lsof -i :PORT_NUMBER
```
**Need to start fresh?**
```bash
docker compose down -v # ⚠️ This deletes volumes/data!
docker compose up -d
```
## Going Further
- [ERPNext on AltStack Directory](https://thealtstack.com/alternative-to/erpnext)
- [ERPNext Self-Hosted Guide](https://thealtstack.com/self-hosted/erpnext)
- [Official Documentation](https://erpnext.com)
- [GitHub Repository](https://github.com/frappe/erpnext)

View File

@@ -0,0 +1,112 @@
---
title: "Deploy FLUX Self-Hosted (Docker)"
description: "Step-by-step guide to self-hosting FLUX with Docker Compose. "
---
# Deploy FLUX
Next-gen open image generation model from Black Forest Labs. State-of-the-art quality rivaling Midjourney.
<div className="deploy-hero">
<span className="deploy-hero-item">⭐ 20.0k stars</span>
<span className="deploy-hero-item">📜 Apache License 2.0</span>
<span className="deploy-hero-item">🔴 Advanced</span>
<span className="deploy-hero-item">⏱ ~20 minutes</span>
</div>
<div className="mt-8 mb-4">
<a
href="https://m.do.co/c/2ed27757a361"
target="_blank"
rel="noopener noreferrer"
className="flex items-center justify-center w-full px-6 py-4 text-lg font-bold text-white transition-all bg-blue-600 rounded-xl hover:bg-blue-700 hover:scale-[1.02] shadow-lg shadow-blue-500/30"
>
🚀 Deploy on DigitalOcean ($200 Free Credit)
</a>
</div>
## What You'll Get
A fully working FLUX instance running on your server. Your data stays on your hardware — no third-party access, no usage limits, no surprise invoices.
## Prerequisites
- A server with Docker and Docker Compose installed ([setup guide](/quick-start/choosing-a-server))
- A domain name pointed to your server (optional but recommended)
- Basic terminal access (SSH)
## The Config
Create a directory for FLUX and add this `docker-compose.yml`:
```yaml
# -------------------------------------------------------------------------
# 🚀 Created and distributed by The AltStack
# 🌍 https://thealtstack.com
# -------------------------------------------------------------------------
version: '3.8'
services:
flux:
image: blackforestlabs/flux:latest
container_name: flux
restart: unless-stopped
ports:
- "8000:8000"
```
## Let's Ship It
```bash
# Create a directory
mkdir -p /opt/flux && cd /opt/flux
# Create the docker-compose.yml (paste the config above)
nano docker-compose.yml
# Pull images and start
docker compose up -d
# Watch the logs
docker compose logs -f
```
## Post-Deployment Checklist
- [ ] Service is accessible on the configured port
- [ ] Admin account created (if applicable)
- [ ] Reverse proxy configured ([Caddy guide](/concepts/reverse-proxies))
- [ ] SSL/HTTPS working
- [ ] Backup script set up ([backup guide](/concepts/backups))
- [ ] Uptime monitor added ([Uptime Kuma](/deploy/uptime-kuma))
## The "I Broke It" Section
**Container won't start?**
```bash
docker compose logs flux | tail -50
```
**Port already in use?**
```bash
# Find what's using the port
lsof -i :PORT_NUMBER
```
**Need to start fresh?**
```bash
docker compose down -v # ⚠️ This deletes volumes/data!
docker compose up -d
```
## Going Further
- [FLUX on AltStack Directory](https://thealtstack.com/alternative-to/flux)
- [FLUX Self-Hosted Guide](https://thealtstack.com/self-hosted/flux)
- [Official Documentation](https://blackforestlabs.ai)
- [GitHub Repository](https://github.com/black-forest-labs/flux)

View File

@@ -0,0 +1,112 @@
---
title: "Deploy FreeCAD Self-Hosted (Docker)"
description: "Step-by-step guide to self-hosting FreeCAD with Docker Compose. "
---
# Deploy FreeCAD
A general-purpose parametric 3D CAD modeler and a BIM software application.
<div className="deploy-hero">
<span className="deploy-hero-item">⭐ 21.0k stars</span>
<span className="deploy-hero-item">📜 LGPLv2+</span>
<span className="deploy-hero-item">🔴 Advanced</span>
<span className="deploy-hero-item">⏱ ~20 minutes</span>
</div>
<div className="mt-8 mb-4">
<a
href="https://m.do.co/c/2ed27757a361"
target="_blank"
rel="noopener noreferrer"
className="flex items-center justify-center w-full px-6 py-4 text-lg font-bold text-white transition-all bg-blue-600 rounded-xl hover:bg-blue-700 hover:scale-[1.02] shadow-lg shadow-blue-500/30"
>
🚀 Deploy on DigitalOcean ($200 Free Credit)
</a>
</div>
## What You'll Get
A fully working FreeCAD instance running on your server. Your data stays on your hardware — no third-party access, no usage limits, no surprise invoices.
## Prerequisites
- A server with Docker and Docker Compose installed ([setup guide](/quick-start/choosing-a-server))
- A domain name pointed to your server (optional but recommended)
- Basic terminal access (SSH)
## The Config
Create a directory for FreeCAD and add this `docker-compose.yml`:
```yaml
# -------------------------------------------------------------------------
# 🚀 Created and distributed by The AltStack
# 🌍 https://thealtstack.com
# -------------------------------------------------------------------------
version: '3.8'
services:
freecad:
image: lscr.io/linuxserver/freecad:latest
container_name: freecad
restart: unless-stopped
ports:
- "3000:3000"
```
## Let's Ship It
```bash
# Create a directory
mkdir -p /opt/freecad && cd /opt/freecad
# Create the docker-compose.yml (paste the config above)
nano docker-compose.yml
# Pull images and start
docker compose up -d
# Watch the logs
docker compose logs -f
```
## Post-Deployment Checklist
- [ ] Service is accessible on the configured port
- [ ] Admin account created (if applicable)
- [ ] Reverse proxy configured ([Caddy guide](/concepts/reverse-proxies))
- [ ] SSL/HTTPS working
- [ ] Backup script set up ([backup guide](/concepts/backups))
- [ ] Uptime monitor added ([Uptime Kuma](/deploy/uptime-kuma))
## The "I Broke It" Section
**Container won't start?**
```bash
docker compose logs freecad | tail -50
```
**Port already in use?**
```bash
# Find what's using the port
lsof -i :PORT_NUMBER
```
**Need to start fresh?**
```bash
docker compose down -v # ⚠️ This deletes volumes/data!
docker compose up -d
```
## Going Further
- [FreeCAD on AltStack Directory](https://thealtstack.com/alternative-to/freecad)
- [FreeCAD Self-Hosted Guide](https://thealtstack.com/self-hosted/freecad)
- [Official Documentation](https://www.freecad.org)
- [GitHub Repository](https://github.com/FreeCAD/FreeCAD)

View File

@@ -0,0 +1,117 @@
---
title: "Deploy Google Gemma 2 Self-Hosted (Docker)"
description: "Step-by-step guide to self-hosting Google Gemma 2 with Docker Compose. "
---
# Deploy Google Gemma 2
Google's open-weight models (9B, 27B) with class-leading performance and efficient architecture.
<div className="deploy-hero">
<span className="deploy-hero-item">⭐ 20.0k stars</span>
<span className="deploy-hero-item">📜 Gemma License</span>
<span className="deploy-hero-item">🔴 Advanced</span>
<span className="deploy-hero-item">⏱ ~20 minutes</span>
</div>
<div className="mt-8 mb-4">
<a
href="https://m.do.co/c/2ed27757a361"
target="_blank"
rel="noopener noreferrer"
className="flex items-center justify-center w-full px-6 py-4 text-lg font-bold text-white transition-all bg-blue-600 rounded-xl hover:bg-blue-700 hover:scale-[1.02] shadow-lg shadow-blue-500/30"
>
🚀 Deploy on DigitalOcean ($200 Free Credit)
</a>
</div>
## What You'll Get
A fully working Google Gemma 2 instance running on your server. Your data stays on your hardware — no third-party access, no usage limits, no surprise invoices.
## Prerequisites
- A server with Docker and Docker Compose installed ([setup guide](/quick-start/choosing-a-server))
- A domain name pointed to your server (optional but recommended)
- Basic terminal access (SSH)
## The Config
Create a directory for Google Gemma 2 and add this `docker-compose.yml`:
```yaml
# -------------------------------------------------------------------------
# 🚀 Created and distributed by The AltStack
# 🌍 https://thealtstack.com
# -------------------------------------------------------------------------
version: '3.8'
services:
ollama-gemma:
image: ollama/ollama:latest
container_name: ollama-gemma
restart: unless-stopped
ports:
- "11437:11434"
volumes:
- ollama_gemma:/root/.ollama
volumes:
ollama_gemma:
```
## Let's Ship It
```bash
# Create a directory
mkdir -p /opt/gemma && cd /opt/gemma
# Create the docker-compose.yml (paste the config above)
nano docker-compose.yml
# Pull images and start
docker compose up -d
# Watch the logs
docker compose logs -f
```
## Post-Deployment Checklist
- [ ] Service is accessible on the configured port
- [ ] Admin account created (if applicable)
- [ ] Reverse proxy configured ([Caddy guide](/concepts/reverse-proxies))
- [ ] SSL/HTTPS working
- [ ] Backup script set up ([backup guide](/concepts/backups))
- [ ] Uptime monitor added ([Uptime Kuma](/deploy/uptime-kuma))
## The "I Broke It" Section
**Container won't start?**
```bash
docker compose logs gemma | tail -50
```
**Port already in use?**
```bash
# Find what's using the port
lsof -i :PORT_NUMBER
```
**Need to start fresh?**
```bash
docker compose down -v # ⚠️ This deletes volumes/data!
docker compose up -d
```
## Going Further
- [Google Gemma 2 on AltStack Directory](https://thealtstack.com/alternative-to/gemma)
- [Google Gemma 2 Self-Hosted Guide](https://thealtstack.com/self-hosted/gemma)
- [Official Documentation](https://ai.google.dev/gemma)
- [GitHub Repository](https://github.com/google/gemma-2)

View File

@@ -0,0 +1,121 @@
---
title: "Deploy GIMP Self-Hosted (Docker)"
description: "Step-by-step guide to self-hosting GIMP with Docker Compose. "
---
# Deploy GIMP
Read-only mirror of https://gitlab.gnome.org/GNOME/gimp
<div className="deploy-hero">
<span className="deploy-hero-item">⭐ 6.0k stars</span>
<span className="deploy-hero-item">📜 Other</span>
<span className="deploy-hero-item">🔴 Advanced</span>
<span className="deploy-hero-item">⏱ ~20 minutes</span>
</div>
<div className="mt-8 mb-4">
<a
href="https://m.do.co/c/2ed27757a361"
target="_blank"
rel="noopener noreferrer"
className="flex items-center justify-center w-full px-6 py-4 text-lg font-bold text-white transition-all bg-blue-600 rounded-xl hover:bg-blue-700 hover:scale-[1.02] shadow-lg shadow-blue-500/30"
>
🚀 Deploy on DigitalOcean ($200 Free Credit)
</a>
</div>
## What You'll Get
A fully working GIMP instance running on your server. Your data stays on your hardware — no third-party access, no usage limits, no surprise invoices.
## Prerequisites
- A server with Docker and Docker Compose installed ([setup guide](/quick-start/choosing-a-server))
- A domain name pointed to your server (optional but recommended)
- Basic terminal access (SSH)
## The Config
Create a directory for GIMP and add this `docker-compose.yml`:
```yaml
# -------------------------------------------------------------------------
# 🚀 Created and distributed by The AltStack
# 🌍 https://thealtstack.com
# -------------------------------------------------------------------------
version: '3.8'
services:
gimp:
image: linuxserver/gimp:latest
container_name: gimp
restart: unless-stopped
ports:
- "3000:3000"
environment:
- PUID=1000
- PGID=1000
```
## Let's Ship It
```bash
# Create a directory
mkdir -p /opt/gimp && cd /opt/gimp
# Create the docker-compose.yml (paste the config above)
nano docker-compose.yml
# Pull images and start
docker compose up -d
# Watch the logs
docker compose logs -f
```
## Environment Variables
| Variable | Default | Required |
|---|---|---|
| `PUID` | `1000` | No |
| `PGID` | `1000` | No |
## Post-Deployment Checklist
- [ ] Service is accessible on the configured port
- [ ] Admin account created (if applicable)
- [ ] Reverse proxy configured ([Caddy guide](/concepts/reverse-proxies))
- [ ] SSL/HTTPS working
- [ ] Backup script set up ([backup guide](/concepts/backups))
- [ ] Uptime monitor added ([Uptime Kuma](/deploy/uptime-kuma))
## The "I Broke It" Section
**Container won't start?**
```bash
docker compose logs gimp | tail -50
```
**Port already in use?**
```bash
# Find what's using the port
lsof -i :PORT_NUMBER
```
**Need to start fresh?**
```bash
docker compose down -v # ⚠️ This deletes volumes/data!
docker compose up -d
```
## Going Further
- [GIMP on AltStack Directory](https://thealtstack.com/alternative-to/gimp)
- [GIMP Self-Hosted Guide](https://thealtstack.com/self-hosted/gimp)
- [Official Documentation](https://www.gimp.org)
- [GitHub Repository](https://github.com/GNOME/gimp)

View File

@@ -0,0 +1,150 @@
---
title: "Deploy GlitchTip Self-Hosted (Docker)"
description: "Step-by-step guide to self-hosting GlitchTip with Docker Compose. "
---
# Deploy GlitchTip
Open source error tracking that's compatible with Sentry SDKs.
<div className="deploy-hero">
<span className="deploy-hero-item">⭐ 3.0k stars</span>
<span className="deploy-hero-item">📜 MIT</span>
<span className="deploy-hero-item">🔴 Advanced</span>
<span className="deploy-hero-item">⏱ ~20 minutes</span>
</div>
<div className="mt-8 mb-4">
<a
href="https://m.do.co/c/2ed27757a361"
target="_blank"
rel="noopener noreferrer"
className="flex items-center justify-center w-full px-6 py-4 text-lg font-bold text-white transition-all bg-blue-600 rounded-xl hover:bg-blue-700 hover:scale-[1.02] shadow-lg shadow-blue-500/30"
>
🚀 Deploy on DigitalOcean ($200 Free Credit)
</a>
</div>
## What You'll Get
A fully working GlitchTip instance running on your server. Your data stays on your hardware — no third-party access, no usage limits, no surprise invoices.
## Prerequisites
- A server with Docker and Docker Compose installed ([setup guide](/quick-start/choosing-a-server))
- A domain name pointed to your server (optional but recommended)
- Basic terminal access (SSH)
## The Config
Create a directory for GlitchTip and add this `docker-compose.yml`:
```yaml
# -------------------------------------------------------------------------
# 🚀 Created and distributed by The AltStack
# 🌍 https://thealtstack.com
# -------------------------------------------------------------------------
version: '3.8'
services:
glitchtip:
image: glitchtip/glitchtip:latest
container_name: glitchtip
restart: unless-stopped
depends_on:
- db
- redis
ports:
- "8000:8000"
environment:
- DATABASE_URL=postgres://glitchtip:glitchtip@db:5432/glitchtip
- REDIS_URL=redis://redis:6379
- SECRET_KEY=change_me_to_something_random
- PORT=8000
db:
image: postgres:14
container_name: glitchtip-db
restart: unless-stopped
environment:
- POSTGRES_USER=glitchtip
- POSTGRES_PASSWORD=glitchtip
- POSTGRES_DB=glitchtip
volumes:
- glitchtip_db_data:/var/lib/postgresql/data
redis:
image: redis:alpine
container_name: glitchtip-redis
restart: unless-stopped
volumes:
glitchtip_db_data:
```
## Let's Ship It
```bash
# Create a directory
mkdir -p /opt/glitchtip && cd /opt/glitchtip
# Create the docker-compose.yml (paste the config above)
nano docker-compose.yml
# Pull images and start
docker compose up -d
# Watch the logs
docker compose logs -f
```
## Environment Variables
| Variable | Default | Required |
|---|---|---|
| `DATABASE_URL` | `postgres://glitchtip:glitchtip@db:5432/glitchtip` | No |
| `REDIS_URL` | `redis://redis:6379` | No |
| `SECRET_KEY` | `change_me_to_something_random` | No |
| `PORT` | `8000` | No |
| `POSTGRES_USER` | `glitchtip` | No |
| `POSTGRES_PASSWORD` | `glitchtip` | No |
| `POSTGRES_DB` | `glitchtip` | No |
## Post-Deployment Checklist
- [ ] Service is accessible on the configured port
- [ ] Admin account created (if applicable)
- [ ] Reverse proxy configured ([Caddy guide](/concepts/reverse-proxies))
- [ ] SSL/HTTPS working
- [ ] Backup script set up ([backup guide](/concepts/backups))
- [ ] Uptime monitor added ([Uptime Kuma](/deploy/uptime-kuma))
## The "I Broke It" Section
**Container won't start?**
```bash
docker compose logs glitchtip | tail -50
```
**Port already in use?**
```bash
# Find what's using the port
lsof -i :PORT_NUMBER
```
**Need to start fresh?**
```bash
docker compose down -v # ⚠️ This deletes volumes/data!
docker compose up -d
```
## Going Further
- [GlitchTip on AltStack Directory](https://thealtstack.com/alternative-to/glitchtip)
- [GlitchTip Self-Hosted Guide](https://thealtstack.com/self-hosted/glitchtip)
- [Official Documentation](https://glitchtip.com)
- [GitHub Repository](https://github.com/glitchtip/glitchtip)

View File

@@ -0,0 +1,132 @@
---
title: "Deploy GPT4All Self-Hosted (Docker)"
description: "Step-by-step guide to self-hosting GPT4All with Docker Compose. "
---
# Deploy GPT4All
Run open-source LLMs locally on your CPU and GPU. No internet required.
<div className="deploy-hero">
<span className="deploy-hero-item">⭐ 65.0k stars</span>
<span className="deploy-hero-item">📜 Apache License 2.0</span>
<span className="deploy-hero-item">🔴 Advanced</span>
<span className="deploy-hero-item">⏱ ~20 minutes</span>
</div>
<div className="mt-8 mb-4">
<a
href="https://m.do.co/c/2ed27757a361"
target="_blank"
rel="noopener noreferrer"
className="flex items-center justify-center w-full px-6 py-4 text-lg font-bold text-white transition-all bg-blue-600 rounded-xl hover:bg-blue-700 hover:scale-[1.02] shadow-lg shadow-blue-500/30"
>
🚀 Deploy on DigitalOcean ($200 Free Credit)
</a>
</div>
## What You'll Get
A fully working GPT4All instance running on your server. Your data stays on your hardware — no third-party access, no usage limits, no surprise invoices.
## Prerequisites
- A server with Docker and Docker Compose installed ([setup guide](/quick-start/choosing-a-server))
- A domain name pointed to your server (optional but recommended)
- Basic terminal access (SSH)
## The Config
Create a directory for GPT4All and add this `docker-compose.yml`:
```yaml
# -------------------------------------------------------------------------
# 🚀 Created and distributed by The AltStack
# 🌍 https://thealtstack.com
# -------------------------------------------------------------------------
# Docker Compose for GPT4All
version: '3.8'
services:
gpt4all:
build:
context: .
dockerfile: Dockerfile
container_name: gpt4all-server
ports:
- "4891:4891"
volumes:
- gpt4all_models:/app/models
networks:
- gpt4all_net
healthcheck:
test: [ "CMD", "curl", "-f", "http://localhost:4891/v1/models" ] # GPT4All local API endpoint
interval: 30s
timeout: 10s
retries: 3
restart: unless-stopped
networks:
gpt4all_net:
driver: bridge
volumes:
gpt4all_models:
name: gpt4all_models
```
## Let's Ship It
```bash
# Create a directory
mkdir -p /opt/gpt4all && cd /opt/gpt4all
# Create the docker-compose.yml (paste the config above)
nano docker-compose.yml
# Pull images and start
docker compose up -d
# Watch the logs
docker compose logs -f
```
## Post-Deployment Checklist
- [ ] Service is accessible on the configured port
- [ ] Admin account created (if applicable)
- [ ] Reverse proxy configured ([Caddy guide](/concepts/reverse-proxies))
- [ ] SSL/HTTPS working
- [ ] Backup script set up ([backup guide](/concepts/backups))
- [ ] Uptime monitor added ([Uptime Kuma](/deploy/uptime-kuma))
## The "I Broke It" Section
**Container won't start?**
```bash
docker compose logs gpt4all | tail -50
```
**Port already in use?**
```bash
# Find what's using the port
lsof -i :PORT_NUMBER
```
**Need to start fresh?**
```bash
docker compose down -v # ⚠️ This deletes volumes/data!
docker compose up -d
```
## Going Further
- [GPT4All on AltStack Directory](https://thealtstack.com/alternative-to/gpt4all)
- [GPT4All Self-Hosted Guide](https://thealtstack.com/self-hosted/gpt4all)
- [Official Documentation](https://gpt4all.io)
- [GitHub Repository](https://github.com/nomic-ai/gpt4all)

View File

@@ -0,0 +1,112 @@
---
title: "Deploy HunyuanVideo 1.5 Self-Hosted (Docker)"
description: "Step-by-step guide to self-hosting HunyuanVideo 1.5 with Docker Compose. "
---
# Deploy HunyuanVideo 1.5
Tencent's state-of-the-art open-source video generation model with 13B parameters.
<div className="deploy-hero">
<span className="deploy-hero-item">⭐ 8.0k stars</span>
<span className="deploy-hero-item">📜 Apache License 2.0</span>
<span className="deploy-hero-item">🔴 Advanced</span>
<span className="deploy-hero-item">⏱ ~20 minutes</span>
</div>
<div className="mt-8 mb-4">
<a
href="https://m.do.co/c/2ed27757a361"
target="_blank"
rel="noopener noreferrer"
className="flex items-center justify-center w-full px-6 py-4 text-lg font-bold text-white transition-all bg-blue-600 rounded-xl hover:bg-blue-700 hover:scale-[1.02] shadow-lg shadow-blue-500/30"
>
🚀 Deploy on DigitalOcean ($200 Free Credit)
</a>
</div>
## What You'll Get
A fully working HunyuanVideo 1.5 instance running on your server. Your data stays on your hardware — no third-party access, no usage limits, no surprise invoices.
## Prerequisites
- A server with Docker and Docker Compose installed ([setup guide](/quick-start/choosing-a-server))
- A domain name pointed to your server (optional but recommended)
- Basic terminal access (SSH)
## The Config
Create a directory for HunyuanVideo 1.5 and add this `docker-compose.yml`:
```yaml
# -------------------------------------------------------------------------
# 🚀 Created and distributed by The AltStack
# 🌍 https://thealtstack.com
# -------------------------------------------------------------------------
version: '3.8'
services:
hunyuan:
image: tencent/hunyuan:latest
container_name: hunyuan
restart: unless-stopped
ports:
- "8000:8000"
```
## Let's Ship It
```bash
# Create a directory
mkdir -p /opt/hunyuan-video && cd /opt/hunyuan-video
# Create the docker-compose.yml (paste the config above)
nano docker-compose.yml
# Pull images and start
docker compose up -d
# Watch the logs
docker compose logs -f
```
## Post-Deployment Checklist
- [ ] Service is accessible on the configured port
- [ ] Admin account created (if applicable)
- [ ] Reverse proxy configured ([Caddy guide](/concepts/reverse-proxies))
- [ ] SSL/HTTPS working
- [ ] Backup script set up ([backup guide](/concepts/backups))
- [ ] Uptime monitor added ([Uptime Kuma](/deploy/uptime-kuma))
## The "I Broke It" Section
**Container won't start?**
```bash
docker compose logs hunyuan-video | tail -50
```
**Port already in use?**
```bash
# Find what's using the port
lsof -i :PORT_NUMBER
```
**Need to start fresh?**
```bash
docker compose down -v # ⚠️ This deletes volumes/data!
docker compose up -d
```
## Going Further
- [HunyuanVideo 1.5 on AltStack Directory](https://thealtstack.com/alternative-to/hunyuan-video)
- [HunyuanVideo 1.5 Self-Hosted Guide](https://thealtstack.com/self-hosted/hunyuan-video)
- [Official Documentation](https://github.com/Tencent/HunyuanVideo)
- [GitHub Repository](https://github.com/Tencent/HunyuanVideo)

View File

@@ -0,0 +1,122 @@
---
title: "Deploy Jitsi Meet Self-Hosted (Docker)"
description: "Step-by-step guide to self-hosting Jitsi Meet with Docker Compose. "
---
# Deploy Jitsi Meet
Jitsi Meet - Secure, Simple and Scalable Video Conferences that you use as a standalone app or embed in your web application.
<div className="deploy-hero">
<span className="deploy-hero-item">⭐ 28.6k stars</span>
<span className="deploy-hero-item">📜 Apache License 2.0</span>
<span className="deploy-hero-item">🔴 Advanced</span>
<span className="deploy-hero-item">⏱ ~20 minutes</span>
</div>
<div className="mt-8 mb-4">
<a
href="https://m.do.co/c/2ed27757a361"
target="_blank"
rel="noopener noreferrer"
className="flex items-center justify-center w-full px-6 py-4 text-lg font-bold text-white transition-all bg-blue-600 rounded-xl hover:bg-blue-700 hover:scale-[1.02] shadow-lg shadow-blue-500/30"
>
🚀 Deploy on DigitalOcean ($200 Free Credit)
</a>
</div>
## What You'll Get
A fully working Jitsi Meet instance running on your server. Your data stays on your hardware — no third-party access, no usage limits, no surprise invoices.
## Prerequisites
- A server with Docker and Docker Compose installed ([setup guide](/quick-start/choosing-a-server))
- A domain name pointed to your server (optional but recommended)
- Basic terminal access (SSH)
## The Config
Create a directory for Jitsi Meet and add this `docker-compose.yml`:
```yaml
# -------------------------------------------------------------------------
# 🚀 Created and distributed by The AltStack
# 🌍 https://thealtstack.com
# -------------------------------------------------------------------------
version: '3.8'
services:
jitsi-web:
image: jitsi/web:latest
container_name: jitsi-web
restart: unless-stopped
ports:
- "8000:80"
- "8443:443"
environment:
- PUBLIC_URL=https://localhost:8443
- XMPP_SERVER=xmpp.meet.jitsi
```
## Let's Ship It
```bash
# Create a directory
mkdir -p /opt/jitsi-meet && cd /opt/jitsi-meet
# Create the docker-compose.yml (paste the config above)
nano docker-compose.yml
# Pull images and start
docker compose up -d
# Watch the logs
docker compose logs -f
```
## Environment Variables
| Variable | Default | Required |
|---|---|---|
| `PUBLIC_URL` | `https://localhost:8443` | No |
| `XMPP_SERVER` | `xmpp.meet.jitsi` | No |
## Post-Deployment Checklist
- [ ] Service is accessible on the configured port
- [ ] Admin account created (if applicable)
- [ ] Reverse proxy configured ([Caddy guide](/concepts/reverse-proxies))
- [ ] SSL/HTTPS working
- [ ] Backup script set up ([backup guide](/concepts/backups))
- [ ] Uptime monitor added ([Uptime Kuma](/deploy/uptime-kuma))
## The "I Broke It" Section
**Container won't start?**
```bash
docker compose logs jitsi-meet | tail -50
```
**Port already in use?**
```bash
# Find what's using the port
lsof -i :PORT_NUMBER
```
**Need to start fresh?**
```bash
docker compose down -v # ⚠️ This deletes volumes/data!
docker compose up -d
```
## Going Further
- [Jitsi Meet on AltStack Directory](https://thealtstack.com/alternative-to/jitsi-meet)
- [Jitsi Meet Self-Hosted Guide](https://thealtstack.com/self-hosted/jitsi-meet)
- [Official Documentation](https://jitsi.org)
- [GitHub Repository](https://github.com/jitsi/jitsi-meet)

View File

@@ -0,0 +1,112 @@
---
title: "Deploy Jitsu Self-Hosted (Docker)"
description: "Step-by-step guide to self-hosting Jitsu with Docker Compose. "
---
# Deploy Jitsu
High-performance data collection platform and open-source Segment alternative.
<div className="deploy-hero">
<span className="deploy-hero-item">⭐ 5.0k stars</span>
<span className="deploy-hero-item">📜 MIT</span>
<span className="deploy-hero-item">🔴 Advanced</span>
<span className="deploy-hero-item">⏱ ~20 minutes</span>
</div>
<div className="mt-8 mb-4">
<a
href="https://m.do.co/c/2ed27757a361"
target="_blank"
rel="noopener noreferrer"
className="flex items-center justify-center w-full px-6 py-4 text-lg font-bold text-white transition-all bg-blue-600 rounded-xl hover:bg-blue-700 hover:scale-[1.02] shadow-lg shadow-blue-500/30"
>
🚀 Deploy on DigitalOcean ($200 Free Credit)
</a>
</div>
## What You'll Get
A fully working Jitsu instance running on your server. Your data stays on your hardware — no third-party access, no usage limits, no surprise invoices.
## Prerequisites
- A server with Docker and Docker Compose installed ([setup guide](/quick-start/choosing-a-server))
- A domain name pointed to your server (optional but recommended)
- Basic terminal access (SSH)
## The Config
Create a directory for Jitsu and add this `docker-compose.yml`:
```yaml
# -------------------------------------------------------------------------
# 🚀 Created and distributed by The AltStack
# 🌍 https://thealtstack.com
# -------------------------------------------------------------------------
version: '3.8'
services:
jitsu:
image: jitsu/jitsu:latest
container_name: jitsu
restart: unless-stopped
ports:
- "8000:8000"
```
## Let's Ship It
```bash
# Create a directory
mkdir -p /opt/jitsu && cd /opt/jitsu
# Create the docker-compose.yml (paste the config above)
nano docker-compose.yml
# Pull images and start
docker compose up -d
# Watch the logs
docker compose logs -f
```
## Post-Deployment Checklist
- [ ] Service is accessible on the configured port
- [ ] Admin account created (if applicable)
- [ ] Reverse proxy configured ([Caddy guide](/concepts/reverse-proxies))
- [ ] SSL/HTTPS working
- [ ] Backup script set up ([backup guide](/concepts/backups))
- [ ] Uptime monitor added ([Uptime Kuma](/deploy/uptime-kuma))
## The "I Broke It" Section
**Container won't start?**
```bash
docker compose logs jitsu | tail -50
```
**Port already in use?**
```bash
# Find what's using the port
lsof -i :PORT_NUMBER
```
**Need to start fresh?**
```bash
docker compose down -v # ⚠️ This deletes volumes/data!
docker compose up -d
```
## Going Further
- [Jitsu on AltStack Directory](https://thealtstack.com/alternative-to/jitsu)
- [Jitsu Self-Hosted Guide](https://thealtstack.com/self-hosted/jitsu)
- [Official Documentation](https://jitsu.com)
- [GitHub Repository](https://github.com/jitsucom/jitsu)

View File

@@ -0,0 +1,112 @@
---
title: "Deploy Kdenlive Self-Hosted (Docker)"
description: "Step-by-step guide to self-hosting Kdenlive with Docker Compose. "
---
# Deploy Kdenlive
Open source video editing software based on the MLT Framework and KDE.
<div className="deploy-hero">
<span className="deploy-hero-item">⭐ 3.5k stars</span>
<span className="deploy-hero-item">📜 GPL-3.0</span>
<span className="deploy-hero-item">🔴 Advanced</span>
<span className="deploy-hero-item">⏱ ~20 minutes</span>
</div>
<div className="mt-8 mb-4">
<a
href="https://m.do.co/c/2ed27757a361"
target="_blank"
rel="noopener noreferrer"
className="flex items-center justify-center w-full px-6 py-4 text-lg font-bold text-white transition-all bg-blue-600 rounded-xl hover:bg-blue-700 hover:scale-[1.02] shadow-lg shadow-blue-500/30"
>
🚀 Deploy on DigitalOcean ($200 Free Credit)
</a>
</div>
## What You'll Get
A fully working Kdenlive instance running on your server. Your data stays on your hardware — no third-party access, no usage limits, no surprise invoices.
## Prerequisites
- A server with Docker and Docker Compose installed ([setup guide](/quick-start/choosing-a-server))
- A domain name pointed to your server (optional but recommended)
- Basic terminal access (SSH)
## The Config
Create a directory for Kdenlive and add this `docker-compose.yml`:
```yaml
# -------------------------------------------------------------------------
# 🚀 Created and distributed by The AltStack
# 🌍 https://thealtstack.com
# -------------------------------------------------------------------------
version: '3.8'
services:
kdenlive:
image: lscr.io/linuxserver/kdenlive:latest
container_name: kdenlive
restart: unless-stopped
ports:
- "3000:3000"
```
## Let's Ship It
```bash
# Create a directory
mkdir -p /opt/kdenlive && cd /opt/kdenlive
# Create the docker-compose.yml (paste the config above)
nano docker-compose.yml
# Pull images and start
docker compose up -d
# Watch the logs
docker compose logs -f
```
## Post-Deployment Checklist
- [ ] Service is accessible on the configured port
- [ ] Admin account created (if applicable)
- [ ] Reverse proxy configured ([Caddy guide](/concepts/reverse-proxies))
- [ ] SSL/HTTPS working
- [ ] Backup script set up ([backup guide](/concepts/backups))
- [ ] Uptime monitor added ([Uptime Kuma](/deploy/uptime-kuma))
## The "I Broke It" Section
**Container won't start?**
```bash
docker compose logs kdenlive | tail -50
```
**Port already in use?**
```bash
# Find what's using the port
lsof -i :PORT_NUMBER
```
**Need to start fresh?**
```bash
docker compose down -v # ⚠️ This deletes volumes/data!
docker compose up -d
```
## Going Further
- [Kdenlive on AltStack Directory](https://thealtstack.com/alternative-to/kdenlive)
- [Kdenlive Self-Hosted Guide](https://thealtstack.com/self-hosted/kdenlive)
- [Official Documentation](https://kdenlive.org)
- [GitHub Repository](https://github.com/KDE/kdenlive)

View File

@@ -0,0 +1,112 @@
---
title: "Deploy KeePassXC Self-Hosted (Docker)"
description: "Step-by-step guide to self-hosting KeePassXC with Docker Compose. "
---
# Deploy KeePassXC
KeePassXC is a cross-platform community-driven port of the Windows application “KeePass Password Safe”.
<div className="deploy-hero">
<span className="deploy-hero-item">⭐ 25.8k stars</span>
<span className="deploy-hero-item">📜 Other</span>
<span className="deploy-hero-item">🔴 Advanced</span>
<span className="deploy-hero-item">⏱ ~20 minutes</span>
</div>
<div className="mt-8 mb-4">
<a
href="https://m.do.co/c/2ed27757a361"
target="_blank"
rel="noopener noreferrer"
className="flex items-center justify-center w-full px-6 py-4 text-lg font-bold text-white transition-all bg-blue-600 rounded-xl hover:bg-blue-700 hover:scale-[1.02] shadow-lg shadow-blue-500/30"
>
🚀 Deploy on DigitalOcean ($200 Free Credit)
</a>
</div>
## What You'll Get
A fully working KeePassXC instance running on your server. Your data stays on your hardware — no third-party access, no usage limits, no surprise invoices.
## Prerequisites
- A server with Docker and Docker Compose installed ([setup guide](/quick-start/choosing-a-server))
- A domain name pointed to your server (optional but recommended)
- Basic terminal access (SSH)
## The Config
Create a directory for KeePassXC and add this `docker-compose.yml`:
```yaml
# -------------------------------------------------------------------------
# 🚀 Created and distributed by The AltStack
# 🌍 https://thealtstack.com
# -------------------------------------------------------------------------
version: '3.8'
services:
keepassxc:
image: jlesage/keepassxc:latest
container_name: keepassxc
restart: unless-stopped
ports:
- "5800:5800"
```
## Let's Ship It
```bash
# Create a directory
mkdir -p /opt/keepassxc && cd /opt/keepassxc
# Create the docker-compose.yml (paste the config above)
nano docker-compose.yml
# Pull images and start
docker compose up -d
# Watch the logs
docker compose logs -f
```
## Post-Deployment Checklist
- [ ] Service is accessible on the configured port
- [ ] Admin account created (if applicable)
- [ ] Reverse proxy configured ([Caddy guide](/concepts/reverse-proxies))
- [ ] SSL/HTTPS working
- [ ] Backup script set up ([backup guide](/concepts/backups))
- [ ] Uptime monitor added ([Uptime Kuma](/deploy/uptime-kuma))
## The "I Broke It" Section
**Container won't start?**
```bash
docker compose logs keepassxc | tail -50
```
**Port already in use?**
```bash
# Find what's using the port
lsof -i :PORT_NUMBER
```
**Need to start fresh?**
```bash
docker compose down -v # ⚠️ This deletes volumes/data!
docker compose up -d
```
## Going Further
- [KeePassXC on AltStack Directory](https://thealtstack.com/alternative-to/keepassxc)
- [KeePassXC Self-Hosted Guide](https://thealtstack.com/self-hosted/keepassxc)
- [Official Documentation](https://keepassxc.org)
- [GitHub Repository](https://github.com/keepassxreboot/keepassxc)

View File

@@ -0,0 +1,149 @@
---
title: "Deploy Keycloak Self-Hosted (Docker)"
description: "Step-by-step guide to self-hosting Keycloak with Docker Compose. "
---
# Deploy Keycloak
Open source identity and access management for modern applications and services.
<div className="deploy-hero">
<span className="deploy-hero-item">⭐ 23.0k stars</span>
<span className="deploy-hero-item">📜 Apache 2.0</span>
<span className="deploy-hero-item">🔴 Advanced</span>
<span className="deploy-hero-item">⏱ ~20 minutes</span>
</div>
<div className="mt-8 mb-4">
<a
href="https://m.do.co/c/2ed27757a361"
target="_blank"
rel="noopener noreferrer"
className="flex items-center justify-center w-full px-6 py-4 text-lg font-bold text-white transition-all bg-blue-600 rounded-xl hover:bg-blue-700 hover:scale-[1.02] shadow-lg shadow-blue-500/30"
>
🚀 Deploy on DigitalOcean ($200 Free Credit)
</a>
</div>
## What You'll Get
A fully working Keycloak instance running on your server. Your data stays on your hardware — no third-party access, no usage limits, no surprise invoices.
## Prerequisites
- A server with Docker and Docker Compose installed ([setup guide](/quick-start/choosing-a-server))
- A domain name pointed to your server (optional but recommended)
- Basic terminal access (SSH)
## The Config
Create a directory for Keycloak and add this `docker-compose.yml`:
```yaml
# -------------------------------------------------------------------------
# 🚀 Created and distributed by The AltStack
# 🌍 https://thealtstack.com
# -------------------------------------------------------------------------
version: '3.8'
services:
keycloak:
image: quay.io/keycloak/keycloak:latest
container_name: keycloak
restart: unless-stopped
command: start-dev
depends_on:
- db
ports:
- "8080:8080"
environment:
- KEYCLOAK_ADMIN=admin
- KEYCLOAK_ADMIN_PASSWORD=admin
- KC_DB=postgres
- KC_DB_URL=jdbc:postgresql://db:5432/keycloak
- KC_DB_USERNAME=keycloak
- KC_DB_PASSWORD=keycloak
db:
image: postgres:15-alpine
container_name: keycloak-db
restart: unless-stopped
environment:
- POSTGRES_DB=keycloak
- POSTGRES_USER=keycloak
- POSTGRES_PASSWORD=keycloak
volumes:
- keycloak_db_data:/var/lib/postgresql/data
volumes:
keycloak_db_data:
```
## Let's Ship It
```bash
# Create a directory
mkdir -p /opt/keycloak && cd /opt/keycloak
# Create the docker-compose.yml (paste the config above)
nano docker-compose.yml
# Pull images and start
docker compose up -d
# Watch the logs
docker compose logs -f
```
## Environment Variables
| Variable | Default | Required |
|---|---|---|
| `KEYCLOAK_ADMIN` | `admin` | No |
| `KEYCLOAK_ADMIN_PASSWORD` | `admin` | No |
| `KC_DB` | `postgres` | No |
| `KC_DB_URL` | `jdbc:postgresql://db:5432/keycloak` | No |
| `KC_DB_USERNAME` | `keycloak` | No |
| `KC_DB_PASSWORD` | `keycloak` | No |
| `POSTGRES_DB` | `keycloak` | No |
| `POSTGRES_USER` | `keycloak` | No |
| `POSTGRES_PASSWORD` | `keycloak` | No |
## Post-Deployment Checklist
- [ ] Service is accessible on the configured port
- [ ] Admin account created (if applicable)
- [ ] Reverse proxy configured ([Caddy guide](/concepts/reverse-proxies))
- [ ] SSL/HTTPS working
- [ ] Backup script set up ([backup guide](/concepts/backups))
- [ ] Uptime monitor added ([Uptime Kuma](/deploy/uptime-kuma))
## The "I Broke It" Section
**Container won't start?**
```bash
docker compose logs keycloak | tail -50
```
**Port already in use?**
```bash
# Find what's using the port
lsof -i :PORT_NUMBER
```
**Need to start fresh?**
```bash
docker compose down -v # ⚠️ This deletes volumes/data!
docker compose up -d
```
## Going Further
- [Keycloak on AltStack Directory](https://thealtstack.com/alternative-to/keycloak)
- [Keycloak Self-Hosted Guide](https://thealtstack.com/self-hosted/keycloak)
- [Official Documentation](https://www.keycloak.org)
- [GitHub Repository](https://github.com/keycloak/keycloak)

View File

@@ -0,0 +1,112 @@
---
title: "Deploy Krita Self-Hosted (Docker)"
description: "Step-by-step guide to self-hosting Krita with Docker Compose. "
---
# Deploy Krita
Krita is a free and open source cross-platform application that offers an end-to-end solution for creating digital art files from scratch built on the KDE and Qt frameworks.
<div className="deploy-hero">
<span className="deploy-hero-item">⭐ 9.3k stars</span>
<span className="deploy-hero-item">📜 GNU General Public License v3.0</span>
<span className="deploy-hero-item">🔴 Advanced</span>
<span className="deploy-hero-item">⏱ ~20 minutes</span>
</div>
<div className="mt-8 mb-4">
<a
href="https://m.do.co/c/2ed27757a361"
target="_blank"
rel="noopener noreferrer"
className="flex items-center justify-center w-full px-6 py-4 text-lg font-bold text-white transition-all bg-blue-600 rounded-xl hover:bg-blue-700 hover:scale-[1.02] shadow-lg shadow-blue-500/30"
>
🚀 Deploy on DigitalOcean ($200 Free Credit)
</a>
</div>
## What You'll Get
A fully working Krita instance running on your server. Your data stays on your hardware — no third-party access, no usage limits, no surprise invoices.
## Prerequisites
- A server with Docker and Docker Compose installed ([setup guide](/quick-start/choosing-a-server))
- A domain name pointed to your server (optional but recommended)
- Basic terminal access (SSH)
## The Config
Create a directory for Krita and add this `docker-compose.yml`:
```yaml
# -------------------------------------------------------------------------
# 🚀 Created and distributed by The AltStack
# 🌍 https://thealtstack.com
# -------------------------------------------------------------------------
version: '3.8'
services:
krita:
image: linuxserver/krita:latest
container_name: krita
restart: unless-stopped
ports:
- "3000:3000"
```
## Let's Ship It
```bash
# Create a directory
mkdir -p /opt/krita && cd /opt/krita
# Create the docker-compose.yml (paste the config above)
nano docker-compose.yml
# Pull images and start
docker compose up -d
# Watch the logs
docker compose logs -f
```
## Post-Deployment Checklist
- [ ] Service is accessible on the configured port
- [ ] Admin account created (if applicable)
- [ ] Reverse proxy configured ([Caddy guide](/concepts/reverse-proxies))
- [ ] SSL/HTTPS working
- [ ] Backup script set up ([backup guide](/concepts/backups))
- [ ] Uptime monitor added ([Uptime Kuma](/deploy/uptime-kuma))
## The "I Broke It" Section
**Container won't start?**
```bash
docker compose logs krita | tail -50
```
**Port already in use?**
```bash
# Find what's using the port
lsof -i :PORT_NUMBER
```
**Need to start fresh?**
```bash
docker compose down -v # ⚠️ This deletes volumes/data!
docker compose up -d
```
## Going Further
- [Krita on AltStack Directory](https://thealtstack.com/alternative-to/krita)
- [Krita Self-Hosted Guide](https://thealtstack.com/self-hosted/krita)
- [Official Documentation](https://krita.org)
- [GitHub Repository](https://github.com/KDE/krita)

View File

@@ -0,0 +1,112 @@
---
title: "Deploy LibreCAD Self-Hosted (Docker)"
description: "Step-by-step guide to self-hosting LibreCAD with Docker Compose. "
---
# Deploy LibreCAD
A mature, feature-rich 2D CAD application with a loyal user community.
<div className="deploy-hero">
<span className="deploy-hero-item">⭐ 6.5k stars</span>
<span className="deploy-hero-item">📜 GPLv2</span>
<span className="deploy-hero-item">🔴 Advanced</span>
<span className="deploy-hero-item">⏱ ~20 minutes</span>
</div>
<div className="mt-8 mb-4">
<a
href="https://m.do.co/c/2ed27757a361"
target="_blank"
rel="noopener noreferrer"
className="flex items-center justify-center w-full px-6 py-4 text-lg font-bold text-white transition-all bg-blue-600 rounded-xl hover:bg-blue-700 hover:scale-[1.02] shadow-lg shadow-blue-500/30"
>
🚀 Deploy on DigitalOcean ($200 Free Credit)
</a>
</div>
## What You'll Get
A fully working LibreCAD instance running on your server. Your data stays on your hardware — no third-party access, no usage limits, no surprise invoices.
## Prerequisites
- A server with Docker and Docker Compose installed ([setup guide](/quick-start/choosing-a-server))
- A domain name pointed to your server (optional but recommended)
- Basic terminal access (SSH)
## The Config
Create a directory for LibreCAD and add this `docker-compose.yml`:
```yaml
# -------------------------------------------------------------------------
# 🚀 Created and distributed by The AltStack
# 🌍 https://thealtstack.com
# -------------------------------------------------------------------------
version: '3.8'
services:
librecad:
image: lscr.io/linuxserver/librecad:latest
container_name: librecad
restart: unless-stopped
ports:
- "3000:3000"
```
## Let's Ship It
```bash
# Create a directory
mkdir -p /opt/librecad && cd /opt/librecad
# Create the docker-compose.yml (paste the config above)
nano docker-compose.yml
# Pull images and start
docker compose up -d
# Watch the logs
docker compose logs -f
```
## Post-Deployment Checklist
- [ ] Service is accessible on the configured port
- [ ] Admin account created (if applicable)
- [ ] Reverse proxy configured ([Caddy guide](/concepts/reverse-proxies))
- [ ] SSL/HTTPS working
- [ ] Backup script set up ([backup guide](/concepts/backups))
- [ ] Uptime monitor added ([Uptime Kuma](/deploy/uptime-kuma))
## The "I Broke It" Section
**Container won't start?**
```bash
docker compose logs librecad | tail -50
```
**Port already in use?**
```bash
# Find what's using the port
lsof -i :PORT_NUMBER
```
**Need to start fresh?**
```bash
docker compose down -v # ⚠️ This deletes volumes/data!
docker compose up -d
```
## Going Further
- [LibreCAD on AltStack Directory](https://thealtstack.com/alternative-to/librecad)
- [LibreCAD Self-Hosted Guide](https://thealtstack.com/self-hosted/librecad)
- [Official Documentation](https://librecad.org)
- [GitHub Repository](https://github.com/LibreCAD/LibreCAD)

View File

@@ -0,0 +1,138 @@
---
title: "Deploy Listmonk Self-Hosted (Docker)"
description: "Step-by-step guide to self-hosting Listmonk with Docker Compose. "
---
# Deploy Listmonk
High performance, self-hosted newsletter and mailing list manager with a modern dashboard.
<div className="deploy-hero">
<span className="deploy-hero-item">⭐ 19.0k stars</span>
<span className="deploy-hero-item">📜 AGPL-3.0</span>
<span className="deploy-hero-item">🔴 Advanced</span>
<span className="deploy-hero-item">⏱ ~20 minutes</span>
</div>
<div className="mt-8 mb-4">
<a
href="https://m.do.co/c/2ed27757a361"
target="_blank"
rel="noopener noreferrer"
className="flex items-center justify-center w-full px-6 py-4 text-lg font-bold text-white transition-all bg-blue-600 rounded-xl hover:bg-blue-700 hover:scale-[1.02] shadow-lg shadow-blue-500/30"
>
🚀 Deploy on DigitalOcean ($200 Free Credit)
</a>
</div>
## What You'll Get
A fully working Listmonk instance running on your server. Your data stays on your hardware — no third-party access, no usage limits, no surprise invoices.
## Prerequisites
- A server with Docker and Docker Compose installed ([setup guide](/quick-start/choosing-a-server))
- A domain name pointed to your server (optional but recommended)
- Basic terminal access (SSH)
## The Config
Create a directory for Listmonk and add this `docker-compose.yml`:
```yaml
# -------------------------------------------------------------------------
# 🚀 Created and distributed by The AltStack
# 🌍 https://thealtstack.com
# -------------------------------------------------------------------------
version: '3.8'
services:
listmonk:
image: listmonk/listmonk:latest
container_name: listmonk
restart: unless-stopped
command: sh -c './listmonk --install --yes --idempotent && ./listmonk'
depends_on:
- listmonk-db
ports:
- "9000:9000"
volumes:
- ./config.toml:/listmonk/config.toml
listmonk-db:
image: postgres:13-alpine
container_name: listmonk-db
restart: unless-stopped
environment:
- POSTGRES_USER=listmonk
- POSTGRES_PASSWORD=listmonk
- POSTGRES_DB=listmonk
volumes:
- listmonk_db_data:/var/lib/postgresql/data
volumes:
listmonk_db_data:
```
## Let's Ship It
```bash
# Create a directory
mkdir -p /opt/listmonk && cd /opt/listmonk
# Create the docker-compose.yml (paste the config above)
nano docker-compose.yml
# Pull images and start
docker compose up -d
# Watch the logs
docker compose logs -f
```
## Environment Variables
| Variable | Default | Required |
|---|---|---|
| `POSTGRES_USER` | `listmonk` | No |
| `POSTGRES_PASSWORD` | `listmonk` | No |
| `POSTGRES_DB` | `listmonk` | No |
## Post-Deployment Checklist
- [ ] Service is accessible on the configured port
- [ ] Admin account created (if applicable)
- [ ] Reverse proxy configured ([Caddy guide](/concepts/reverse-proxies))
- [ ] SSL/HTTPS working
- [ ] Backup script set up ([backup guide](/concepts/backups))
- [ ] Uptime monitor added ([Uptime Kuma](/deploy/uptime-kuma))
## The "I Broke It" Section
**Container won't start?**
```bash
docker compose logs listmonk | tail -50
```
**Port already in use?**
```bash
# Find what's using the port
lsof -i :PORT_NUMBER
```
**Need to start fresh?**
```bash
docker compose down -v # ⚠️ This deletes volumes/data!
docker compose up -d
```
## Going Further
- [Listmonk on AltStack Directory](https://thealtstack.com/alternative-to/listmonk)
- [Listmonk Self-Hosted Guide](https://thealtstack.com/self-hosted/listmonk)
- [Official Documentation](https://listmonk.app)
- [GitHub Repository](https://github.com/knadh/listmonk)

View File

@@ -0,0 +1,118 @@
---
title: "Deploy Meta Llama 3.1 Self-Hosted (Docker)"
description: "Step-by-step guide to self-hosting Meta Llama 3.1 with Docker Compose. "
---
# Deploy Meta Llama 3.1
Meta's flagship open-weight model with 128K context. Supports 8B, 70B, and 405B parameters.
<div className="deploy-hero">
<span className="deploy-hero-item">⭐ 65.0k stars</span>
<span className="deploy-hero-item">📜 Llama 3.1 Community License</span>
<span className="deploy-hero-item">🔴 Advanced</span>
<span className="deploy-hero-item">⏱ ~20 minutes</span>
</div>
<div className="mt-8 mb-4">
<a
href="https://m.do.co/c/2ed27757a361"
target="_blank"
rel="noopener noreferrer"
className="flex items-center justify-center w-full px-6 py-4 text-lg font-bold text-white transition-all bg-blue-600 rounded-xl hover:bg-blue-700 hover:scale-[1.02] shadow-lg shadow-blue-500/30"
>
🚀 Deploy on DigitalOcean ($200 Free Credit)
</a>
</div>
## What You'll Get
A fully working Meta Llama 3.1 instance running on your server. Your data stays on your hardware — no third-party access, no usage limits, no surprise invoices.
## Prerequisites
- A server with Docker and Docker Compose installed ([setup guide](/quick-start/choosing-a-server))
- A domain name pointed to your server (optional but recommended)
- Basic terminal access (SSH)
## The Config
Create a directory for Meta Llama 3.1 and add this `docker-compose.yml`:
```yaml
# -------------------------------------------------------------------------
# 🚀 Created and distributed by The AltStack
# 🌍 https://thealtstack.com
# -------------------------------------------------------------------------
version: '3.8'
services:
ollama-llama:
image: ollama/ollama:latest
container_name: ollama-llama
restart: unless-stopped
command: serve
ports:
- "11434:11434"
volumes:
- ollama:/root/.ollama
volumes:
ollama:
```
## Let's Ship It
```bash
# Create a directory
mkdir -p /opt/llama && cd /opt/llama
# Create the docker-compose.yml (paste the config above)
nano docker-compose.yml
# Pull images and start
docker compose up -d
# Watch the logs
docker compose logs -f
```
## Post-Deployment Checklist
- [ ] Service is accessible on the configured port
- [ ] Admin account created (if applicable)
- [ ] Reverse proxy configured ([Caddy guide](/concepts/reverse-proxies))
- [ ] SSL/HTTPS working
- [ ] Backup script set up ([backup guide](/concepts/backups))
- [ ] Uptime monitor added ([Uptime Kuma](/deploy/uptime-kuma))
## The "I Broke It" Section
**Container won't start?**
```bash
docker compose logs llama | tail -50
```
**Port already in use?**
```bash
# Find what's using the port
lsof -i :PORT_NUMBER
```
**Need to start fresh?**
```bash
docker compose down -v # ⚠️ This deletes volumes/data!
docker compose up -d
```
## Going Further
- [Meta Llama 3.1 on AltStack Directory](https://thealtstack.com/alternative-to/llama)
- [Meta Llama 3.1 Self-Hosted Guide](https://thealtstack.com/self-hosted/llama)
- [Official Documentation](https://llama.meta.com)
- [GitHub Repository](https://github.com/meta-llama/llama3)

View File

@@ -0,0 +1,119 @@
---
title: "Deploy Matomo Self-Hosted (Docker)"
description: "Step-by-step guide to self-hosting Matomo with Docker Compose. "
---
# Deploy Matomo
Empowering People Ethically 🚀 — Matomo is hiring! Join us → https://matomo.org/jobs Matomo is the leading open-source alternative to Google Analytics, giving you complete control and built-in privacy. Easily collect, visualise, and analyse data from websites & apps. Star us on GitHub ⭐️ Pull Requests welcome!
<div className="deploy-hero">
<span className="deploy-hero-item">⭐ 21.3k stars</span>
<span className="deploy-hero-item">📜 GNU General Public License v3.0</span>
<span className="deploy-hero-item">🔴 Advanced</span>
<span className="deploy-hero-item">⏱ ~20 minutes</span>
</div>
<div className="mt-8 mb-4">
<a
href="https://m.do.co/c/2ed27757a361"
target="_blank"
rel="noopener noreferrer"
className="flex items-center justify-center w-full px-6 py-4 text-lg font-bold text-white transition-all bg-blue-600 rounded-xl hover:bg-blue-700 hover:scale-[1.02] shadow-lg shadow-blue-500/30"
>
🚀 Deploy on DigitalOcean ($200 Free Credit)
</a>
</div>
## What You'll Get
A fully working Matomo instance running on your server. Your data stays on your hardware — no third-party access, no usage limits, no surprise invoices.
## Prerequisites
- A server with Docker and Docker Compose installed ([setup guide](/quick-start/choosing-a-server))
- A domain name pointed to your server (optional but recommended)
- Basic terminal access (SSH)
## The Config
Create a directory for Matomo and add this `docker-compose.yml`:
```yaml
# -------------------------------------------------------------------------
# 🚀 Created and distributed by The AltStack
# 🌍 https://thealtstack.com
# -------------------------------------------------------------------------
version: '3.8'
services:
matomo:
image: matomo:latest
container_name: matomo
restart: unless-stopped
ports:
- "8080:80"
environment:
- MATOMO_DATABASE_HOST=db
```
## Let's Ship It
```bash
# Create a directory
mkdir -p /opt/matomo && cd /opt/matomo
# Create the docker-compose.yml (paste the config above)
nano docker-compose.yml
# Pull images and start
docker compose up -d
# Watch the logs
docker compose logs -f
```
## Environment Variables
| Variable | Default | Required |
|---|---|---|
| `MATOMO_DATABASE_HOST` | `db` | No |
## Post-Deployment Checklist
- [ ] Service is accessible on the configured port
- [ ] Admin account created (if applicable)
- [ ] Reverse proxy configured ([Caddy guide](/concepts/reverse-proxies))
- [ ] SSL/HTTPS working
- [ ] Backup script set up ([backup guide](/concepts/backups))
- [ ] Uptime monitor added ([Uptime Kuma](/deploy/uptime-kuma))
## The "I Broke It" Section
**Container won't start?**
```bash
docker compose logs matomo | tail -50
```
**Port already in use?**
```bash
# Find what's using the port
lsof -i :PORT_NUMBER
```
**Need to start fresh?**
```bash
docker compose down -v # ⚠️ This deletes volumes/data!
docker compose up -d
```
## Going Further
- [Matomo on AltStack Directory](https://thealtstack.com/alternative-to/matomo)
- [Matomo Self-Hosted Guide](https://thealtstack.com/self-hosted/matomo)
- [Official Documentation](https://matomo.org)
- [GitHub Repository](https://github.com/matomo-org/matomo)

View File

@@ -0,0 +1,143 @@
---
title: "Deploy Mattermost Self-Hosted (Docker)"
description: "Step-by-step guide to self-hosting Mattermost with Docker Compose. "
---
# Deploy Mattermost
Mattermost is an open source platform for secure collaboration across the entire software development lifecycle..
<div className="deploy-hero">
<span className="deploy-hero-item">⭐ 35.2k stars</span>
<span className="deploy-hero-item">📜 Other</span>
<span className="deploy-hero-item">🔴 Advanced</span>
<span className="deploy-hero-item">⏱ ~20 minutes</span>
</div>
<div className="mt-8 mb-4">
<a
href="https://m.do.co/c/2ed27757a361"
target="_blank"
rel="noopener noreferrer"
className="flex items-center justify-center w-full px-6 py-4 text-lg font-bold text-white transition-all bg-blue-600 rounded-xl hover:bg-blue-700 hover:scale-[1.02] shadow-lg shadow-blue-500/30"
>
🚀 Deploy on DigitalOcean ($200 Free Credit)
</a>
</div>
## What You'll Get
A fully working Mattermost instance running on your server. Your data stays on your hardware — no third-party access, no usage limits, no surprise invoices.
## Prerequisites
- A server with Docker and Docker Compose installed ([setup guide](/quick-start/choosing-a-server))
- A domain name pointed to your server (optional but recommended)
- Basic terminal access (SSH)
## The Config
Create a directory for Mattermost and add this `docker-compose.yml`:
```yaml
# -------------------------------------------------------------------------
# 🚀 Created and distributed by The AltStack
# 🌍 https://thealtstack.com
# -------------------------------------------------------------------------
version: '3.8'
services:
mattermost:
image: mattermost/mattermost-team-edition:latest
container_name: mattermost
restart: unless-stopped
depends_on:
- db
ports:
- "8065:8065"
environment:
- MM_SQLSETTINGS_DRIVERNAME=postgres
- MM_SQLSETTINGS_DATASOURCE=postgres://mmuser:mmuser_password@db:5432/mattermost?sslmode=disable&connect_timeout=10
- MM_SERVICESETTINGS_SITEURL=http://localhost:8065
volumes:
- ./volumes/app/config:/mattermost/config
- ./volumes/app/data:/mattermost/data
- ./volumes/app/logs:/mattermost/logs
db:
image: postgres:13-alpine
container_name: mattermost-db
restart: unless-stopped
environment:
- POSTGRES_USER=mmuser
- POSTGRES_PASSWORD=mmuser_password
- POSTGRES_DB=mattermost
volumes:
- ./volumes/db/var/lib/postgresql/data:/var/lib/postgresql/data
```
## Let's Ship It
```bash
# Create a directory
mkdir -p /opt/mattermost && cd /opt/mattermost
# Create the docker-compose.yml (paste the config above)
nano docker-compose.yml
# Pull images and start
docker compose up -d
# Watch the logs
docker compose logs -f
```
## Environment Variables
| Variable | Default | Required |
|---|---|---|
| `MM_SQLSETTINGS_DRIVERNAME` | `postgres` | No |
| `MM_SQLSETTINGS_DATASOURCE` | `postgres://mmuser:mmuser_password@db:5432/mattermost?sslmode=disable&connect_timeout=10` | No |
| `MM_SERVICESETTINGS_SITEURL` | `http://localhost:8065` | No |
| `POSTGRES_USER` | `mmuser` | No |
| `POSTGRES_PASSWORD` | `mmuser_password` | No |
| `POSTGRES_DB` | `mattermost` | No |
## Post-Deployment Checklist
- [ ] Service is accessible on the configured port
- [ ] Admin account created (if applicable)
- [ ] Reverse proxy configured ([Caddy guide](/concepts/reverse-proxies))
- [ ] SSL/HTTPS working
- [ ] Backup script set up ([backup guide](/concepts/backups))
- [ ] Uptime monitor added ([Uptime Kuma](/deploy/uptime-kuma))
## The "I Broke It" Section
**Container won't start?**
```bash
docker compose logs mattermost | tail -50
```
**Port already in use?**
```bash
# Find what's using the port
lsof -i :PORT_NUMBER
```
**Need to start fresh?**
```bash
docker compose down -v # ⚠️ This deletes volumes/data!
docker compose up -d
```
## Going Further
- [Mattermost on AltStack Directory](https://thealtstack.com/alternative-to/mattermost)
- [Mattermost Self-Hosted Guide](https://thealtstack.com/self-hosted/mattermost)
- [Official Documentation](https://mattermost.com)
- [GitHub Repository](https://github.com/mattermost/mattermost)

View File

@@ -0,0 +1,153 @@
---
title: "Deploy Mautic Self-Hosted (Docker)"
description: "Step-by-step guide to self-hosting Mautic with Docker Compose. "
---
# Deploy Mautic
World's largest open source marketing automation project.
<div className="deploy-hero">
<span className="deploy-hero-item">⭐ 7.0k stars</span>
<span className="deploy-hero-item">📜 GPL-3.0</span>
<span className="deploy-hero-item">🔴 Advanced</span>
<span className="deploy-hero-item">⏱ ~20 minutes</span>
</div>
<div className="mt-8 mb-4">
<a
href="https://m.do.co/c/2ed27757a361"
target="_blank"
rel="noopener noreferrer"
className="flex items-center justify-center w-full px-6 py-4 text-lg font-bold text-white transition-all bg-blue-600 rounded-xl hover:bg-blue-700 hover:scale-[1.02] shadow-lg shadow-blue-500/30"
>
🚀 Deploy on DigitalOcean ($200 Free Credit)
</a>
</div>
## What You'll Get
A fully working Mautic instance running on your server. Your data stays on your hardware — no third-party access, no usage limits, no surprise invoices.
## Prerequisites
- A server with Docker and Docker Compose installed ([setup guide](/quick-start/choosing-a-server))
- A domain name pointed to your server (optional but recommended)
- Basic terminal access (SSH)
## The Config
Create a directory for Mautic and add this `docker-compose.yml`:
```yaml
# -------------------------------------------------------------------------
# 🚀 Created and distributed by The AltStack
# 🌍 https://thealtstack.com
# -------------------------------------------------------------------------
version: '3.8'
services:
mautic:
image: mautic/mautic:latest
container_name: mautic
restart: unless-stopped
depends_on:
- db
ports:
- "8080:80"
environment:
- MAUTIC_DB_HOST=db
- MAUTIC_DB_USER=mautic
- MAUTIC_DB_PASSWORD=mautic
- MAUTIC_DB_NAME=mautic
- MAUTIC_RUN_CRON_JOBS=true
volumes:
- mautic_data:/var/www/html
db:
image: mysql:5.7
container_name: mautic-db
restart: unless-stopped
command: --default-authentication-plugin=mysql_native_password
environment:
- MYSQL_ROOT_PASSWORD=root
- MYSQL_USER=mautic
- MYSQL_PASSWORD=mautic
- MYSQL_DATABASE=mautic
volumes:
- mautic_db_data:/var/lib/mysql
volumes:
mautic_data:
mautic_db_data:
```
## Let's Ship It
```bash
# Create a directory
mkdir -p /opt/mautic && cd /opt/mautic
# Create the docker-compose.yml (paste the config above)
nano docker-compose.yml
# Pull images and start
docker compose up -d
# Watch the logs
docker compose logs -f
```
## Environment Variables
| Variable | Default | Required |
|---|---|---|
| `MAUTIC_DB_HOST` | `db` | No |
| `MAUTIC_DB_USER` | `mautic` | No |
| `MAUTIC_DB_PASSWORD` | `mautic` | No |
| `MAUTIC_DB_NAME` | `mautic` | No |
| `MAUTIC_RUN_CRON_JOBS` | `true` | No |
| `plugin` | `mysql_native_password` | No |
| `MYSQL_ROOT_PASSWORD` | `root` | No |
| `MYSQL_USER` | `mautic` | No |
| `MYSQL_PASSWORD` | `mautic` | No |
| `MYSQL_DATABASE` | `mautic` | No |
## Post-Deployment Checklist
- [ ] Service is accessible on the configured port
- [ ] Admin account created (if applicable)
- [ ] Reverse proxy configured ([Caddy guide](/concepts/reverse-proxies))
- [ ] SSL/HTTPS working
- [ ] Backup script set up ([backup guide](/concepts/backups))
- [ ] Uptime monitor added ([Uptime Kuma](/deploy/uptime-kuma))
## The "I Broke It" Section
**Container won't start?**
```bash
docker compose logs mautic | tail -50
```
**Port already in use?**
```bash
# Find what's using the port
lsof -i :PORT_NUMBER
```
**Need to start fresh?**
```bash
docker compose down -v # ⚠️ This deletes volumes/data!
docker compose up -d
```
## Going Further
- [Mautic on AltStack Directory](https://thealtstack.com/alternative-to/mautic)
- [Mautic Self-Hosted Guide](https://thealtstack.com/self-hosted/mautic)
- [Official Documentation](https://www.mautic.org)
- [GitHub Repository](https://github.com/mautic/mautic)

View File

@@ -0,0 +1,150 @@
---
title: "Deploy Medusa.js Self-Hosted (Docker)"
description: "Step-by-step guide to self-hosting Medusa.js with Docker Compose. "
---
# Deploy Medusa.js
The open-source alternative to Shopify. Building blocks for digital commerce.
<div className="deploy-hero">
<span className="deploy-hero-item">⭐ 24.0k stars</span>
<span className="deploy-hero-item">📜 MIT</span>
<span className="deploy-hero-item">🔴 Advanced</span>
<span className="deploy-hero-item">⏱ ~20 minutes</span>
</div>
<div className="mt-8 mb-4">
<a
href="https://m.do.co/c/2ed27757a361"
target="_blank"
rel="noopener noreferrer"
className="flex items-center justify-center w-full px-6 py-4 text-lg font-bold text-white transition-all bg-blue-600 rounded-xl hover:bg-blue-700 hover:scale-[1.02] shadow-lg shadow-blue-500/30"
>
🚀 Deploy on DigitalOcean ($200 Free Credit)
</a>
</div>
## What You'll Get
A fully working Medusa.js instance running on your server. Your data stays on your hardware — no third-party access, no usage limits, no surprise invoices.
## Prerequisites
- A server with Docker and Docker Compose installed ([setup guide](/quick-start/choosing-a-server))
- A domain name pointed to your server (optional but recommended)
- Basic terminal access (SSH)
## The Config
Create a directory for Medusa.js and add this `docker-compose.yml`:
```yaml
# -------------------------------------------------------------------------
# 🚀 Created and distributed by The AltStack
# 🌍 https://thealtstack.com
# -------------------------------------------------------------------------
version: '3.8'
services:
medusa:
image: medusajs/medusa:latest
container_name: medusa
restart: unless-stopped
depends_on:
- db
- redis
ports:
- "9000:9000"
environment:
- DATABASE_URL=postgres://medusa:medusa@db:5432/medusa
- REDIS_URL=redis://redis:6379
- JWT_SECRET=supersecret
- COOKIE_SECRET=supersecret
db:
image: postgres:15-alpine
container_name: medusa-db
restart: unless-stopped
environment:
- POSTGRES_USER=medusa
- POSTGRES_PASSWORD=medusa
- POSTGRES_DB=medusa
volumes:
- medusa_db_data:/var/lib/postgresql/data
redis:
image: redis:alpine
container_name: medusa-redis
restart: unless-stopped
volumes:
medusa_db_data:
```
## Let's Ship It
```bash
# Create a directory
mkdir -p /opt/medusa && cd /opt/medusa
# Create the docker-compose.yml (paste the config above)
nano docker-compose.yml
# Pull images and start
docker compose up -d
# Watch the logs
docker compose logs -f
```
## Environment Variables
| Variable | Default | Required |
|---|---|---|
| `DATABASE_URL` | `postgres://medusa:medusa@db:5432/medusa` | No |
| `REDIS_URL` | `redis://redis:6379` | No |
| `JWT_SECRET` | `supersecret` | No |
| `COOKIE_SECRET` | `supersecret` | No |
| `POSTGRES_USER` | `medusa` | No |
| `POSTGRES_PASSWORD` | `medusa` | No |
| `POSTGRES_DB` | `medusa` | No |
## Post-Deployment Checklist
- [ ] Service is accessible on the configured port
- [ ] Admin account created (if applicable)
- [ ] Reverse proxy configured ([Caddy guide](/concepts/reverse-proxies))
- [ ] SSL/HTTPS working
- [ ] Backup script set up ([backup guide](/concepts/backups))
- [ ] Uptime monitor added ([Uptime Kuma](/deploy/uptime-kuma))
## The "I Broke It" Section
**Container won't start?**
```bash
docker compose logs medusa | tail -50
```
**Port already in use?**
```bash
# Find what's using the port
lsof -i :PORT_NUMBER
```
**Need to start fresh?**
```bash
docker compose down -v # ⚠️ This deletes volumes/data!
docker compose up -d
```
## Going Further
- [Medusa.js on AltStack Directory](https://thealtstack.com/alternative-to/medusa)
- [Medusa.js Self-Hosted Guide](https://thealtstack.com/self-hosted/medusa)
- [Official Documentation](https://medusajs.com)
- [GitHub Repository](https://github.com/medusajs/medusa)

View File

@@ -0,0 +1,148 @@
---
title: "Deploy Metabase Self-Hosted (Docker)"
description: "Step-by-step guide to self-hosting Metabase with Docker Compose. "
---
# Deploy Metabase
The simplest, fastest way to get business intelligence and analytics throughout your company.
<div className="deploy-hero">
<span className="deploy-hero-item">⭐ 38.0k stars</span>
<span className="deploy-hero-item">📜 AGPLv3</span>
<span className="deploy-hero-item">🔴 Advanced</span>
<span className="deploy-hero-item">⏱ ~20 minutes</span>
</div>
<div className="mt-8 mb-4">
<a
href="https://m.do.co/c/2ed27757a361"
target="_blank"
rel="noopener noreferrer"
className="flex items-center justify-center w-full px-6 py-4 text-lg font-bold text-white transition-all bg-blue-600 rounded-xl hover:bg-blue-700 hover:scale-[1.02] shadow-lg shadow-blue-500/30"
>
🚀 Deploy on DigitalOcean ($200 Free Credit)
</a>
</div>
## What You'll Get
A fully working Metabase instance running on your server. Your data stays on your hardware — no third-party access, no usage limits, no surprise invoices.
## Prerequisites
- A server with Docker and Docker Compose installed ([setup guide](/quick-start/choosing-a-server))
- A domain name pointed to your server (optional but recommended)
- Basic terminal access (SSH)
## The Config
Create a directory for Metabase and add this `docker-compose.yml`:
```yaml
# -------------------------------------------------------------------------
# 🚀 Created and distributed by The AltStack
# 🌍 https://thealtstack.com
# -------------------------------------------------------------------------
version: '3.8'
services:
metabase:
image: metabase/metabase:latest
container_name: metabase
restart: unless-stopped
depends_on:
- db
ports:
- "3000:3000"
environment:
- MB_DB_TYPE=postgres
- MB_DB_DBNAME=metabase
- MB_DB_PORT=5432
- MB_DB_USER=metabase
- MB_DB_PASS=metabase
- MB_DB_HOST=db
db:
image: postgres:14-alpine
container_name: metabase-db
restart: unless-stopped
environment:
- POSTGRES_USER=metabase
- POSTGRES_PASSWORD=metabase
- POSTGRES_DB=metabase
volumes:
- metabase_db_data:/var/lib/postgresql/data
volumes:
metabase_db_data:
```
## Let's Ship It
```bash
# Create a directory
mkdir -p /opt/metabase && cd /opt/metabase
# Create the docker-compose.yml (paste the config above)
nano docker-compose.yml
# Pull images and start
docker compose up -d
# Watch the logs
docker compose logs -f
```
## Environment Variables
| Variable | Default | Required |
|---|---|---|
| `MB_DB_TYPE` | `postgres` | No |
| `MB_DB_DBNAME` | `metabase` | No |
| `MB_DB_PORT` | `5432` | No |
| `MB_DB_USER` | `metabase` | No |
| `MB_DB_PASS` | `metabase` | No |
| `MB_DB_HOST` | `db` | No |
| `POSTGRES_USER` | `metabase` | No |
| `POSTGRES_PASSWORD` | `metabase` | No |
| `POSTGRES_DB` | `metabase` | No |
## Post-Deployment Checklist
- [ ] Service is accessible on the configured port
- [ ] Admin account created (if applicable)
- [ ] Reverse proxy configured ([Caddy guide](/concepts/reverse-proxies))
- [ ] SSL/HTTPS working
- [ ] Backup script set up ([backup guide](/concepts/backups))
- [ ] Uptime monitor added ([Uptime Kuma](/deploy/uptime-kuma))
## The "I Broke It" Section
**Container won't start?**
```bash
docker compose logs metabase | tail -50
```
**Port already in use?**
```bash
# Find what's using the port
lsof -i :PORT_NUMBER
```
**Need to start fresh?**
```bash
docker compose down -v # ⚠️ This deletes volumes/data!
docker compose up -d
```
## Going Further
- [Metabase on AltStack Directory](https://thealtstack.com/alternative-to/metabase)
- [Metabase Self-Hosted Guide](https://thealtstack.com/self-hosted/metabase)
- [Official Documentation](https://www.metabase.com)
- [GitHub Repository](https://github.com/metabase/metabase)

View File

@@ -0,0 +1,128 @@
---
title: "Deploy MinIO Self-Hosted (Docker)"
description: "Step-by-step guide to self-hosting MinIO with Docker Compose. "
---
# Deploy MinIO
High-performance, S3-compatible object storage for AI and enterprise data.
<div className="deploy-hero">
<span className="deploy-hero-item">⭐ 45.0k stars</span>
<span className="deploy-hero-item">📜 AGPLv3</span>
<span className="deploy-hero-item">🔴 Advanced</span>
<span className="deploy-hero-item">⏱ ~20 minutes</span>
</div>
<div className="mt-8 mb-4">
<a
href="https://m.do.co/c/2ed27757a361"
target="_blank"
rel="noopener noreferrer"
className="flex items-center justify-center w-full px-6 py-4 text-lg font-bold text-white transition-all bg-blue-600 rounded-xl hover:bg-blue-700 hover:scale-[1.02] shadow-lg shadow-blue-500/30"
>
🚀 Deploy on DigitalOcean ($200 Free Credit)
</a>
</div>
## What You'll Get
A fully working MinIO instance running on your server. Your data stays on your hardware — no third-party access, no usage limits, no surprise invoices.
## Prerequisites
- A server with Docker and Docker Compose installed ([setup guide](/quick-start/choosing-a-server))
- A domain name pointed to your server (optional but recommended)
- Basic terminal access (SSH)
## The Config
Create a directory for MinIO and add this `docker-compose.yml`:
```yaml
# -------------------------------------------------------------------------
# 🚀 Created and distributed by The AltStack
# 🌍 https://thealtstack.com
# -------------------------------------------------------------------------
version: '3.8'
services:
minio:
image: minio/minio:latest
container_name: minio
restart: unless-stopped
ports:
- "9000:9000"
- "9090:9090"
command: server /data --console-address ":9090"
environment:
- MINIO_ROOT_USER=minioadmin
- MINIO_ROOT_PASSWORD=minioadmin
volumes:
- minio_data:/data
volumes:
minio_data:
```
## Let's Ship It
```bash
# Create a directory
mkdir -p /opt/minio && cd /opt/minio
# Create the docker-compose.yml (paste the config above)
nano docker-compose.yml
# Pull images and start
docker compose up -d
# Watch the logs
docker compose logs -f
```
## Environment Variables
| Variable | Default | Required |
|---|---|---|
| `MINIO_ROOT_USER` | `minioadmin` | No |
| `MINIO_ROOT_PASSWORD` | `minioadmin` | No |
## Post-Deployment Checklist
- [ ] Service is accessible on the configured port
- [ ] Admin account created (if applicable)
- [ ] Reverse proxy configured ([Caddy guide](/concepts/reverse-proxies))
- [ ] SSL/HTTPS working
- [ ] Backup script set up ([backup guide](/concepts/backups))
- [ ] Uptime monitor added ([Uptime Kuma](/deploy/uptime-kuma))
## The "I Broke It" Section
**Container won't start?**
```bash
docker compose logs minio | tail -50
```
**Port already in use?**
```bash
# Find what's using the port
lsof -i :PORT_NUMBER
```
**Need to start fresh?**
```bash
docker compose down -v # ⚠️ This deletes volumes/data!
docker compose up -d
```
## Going Further
- [MinIO on AltStack Directory](https://thealtstack.com/alternative-to/minio)
- [MinIO Self-Hosted Guide](https://thealtstack.com/self-hosted/minio)
- [Official Documentation](https://min.io)
- [GitHub Repository](https://github.com/minio/minio)

View File

@@ -0,0 +1,117 @@
---
title: "Deploy Mistral Large 2 Self-Hosted (Docker)"
description: "Step-by-step guide to self-hosting Mistral Large 2 with Docker Compose. "
---
# Deploy Mistral Large 2
Flagship 123B model from Mistral AI. Optimized for multilingual, reasoning, and coding tasks.
<div className="deploy-hero">
<span className="deploy-hero-item">⭐ 20.0k stars</span>
<span className="deploy-hero-item">📜 Mistral Research License</span>
<span className="deploy-hero-item">🔴 Advanced</span>
<span className="deploy-hero-item">⏱ ~20 minutes</span>
</div>
<div className="mt-8 mb-4">
<a
href="https://m.do.co/c/2ed27757a361"
target="_blank"
rel="noopener noreferrer"
className="flex items-center justify-center w-full px-6 py-4 text-lg font-bold text-white transition-all bg-blue-600 rounded-xl hover:bg-blue-700 hover:scale-[1.02] shadow-lg shadow-blue-500/30"
>
🚀 Deploy on DigitalOcean ($200 Free Credit)
</a>
</div>
## What You'll Get
A fully working Mistral Large 2 instance running on your server. Your data stays on your hardware — no third-party access, no usage limits, no surprise invoices.
## Prerequisites
- A server with Docker and Docker Compose installed ([setup guide](/quick-start/choosing-a-server))
- A domain name pointed to your server (optional but recommended)
- Basic terminal access (SSH)
## The Config
Create a directory for Mistral Large 2 and add this `docker-compose.yml`:
```yaml
# -------------------------------------------------------------------------
# 🚀 Created and distributed by The AltStack
# 🌍 https://thealtstack.com
# -------------------------------------------------------------------------
version: '3.8'
services:
ollama-mistral:
image: ollama/ollama:latest
container_name: ollama-mistral
restart: unless-stopped
ports:
- "11436:11434"
volumes:
- ollama_mistral:/root/.ollama
volumes:
ollama_mistral:
```
## Let's Ship It
```bash
# Create a directory
mkdir -p /opt/mistral && cd /opt/mistral
# Create the docker-compose.yml (paste the config above)
nano docker-compose.yml
# Pull images and start
docker compose up -d
# Watch the logs
docker compose logs -f
```
## Post-Deployment Checklist
- [ ] Service is accessible on the configured port
- [ ] Admin account created (if applicable)
- [ ] Reverse proxy configured ([Caddy guide](/concepts/reverse-proxies))
- [ ] SSL/HTTPS working
- [ ] Backup script set up ([backup guide](/concepts/backups))
- [ ] Uptime monitor added ([Uptime Kuma](/deploy/uptime-kuma))
## The "I Broke It" Section
**Container won't start?**
```bash
docker compose logs mistral | tail -50
```
**Port already in use?**
```bash
# Find what's using the port
lsof -i :PORT_NUMBER
```
**Need to start fresh?**
```bash
docker compose down -v # ⚠️ This deletes volumes/data!
docker compose up -d
```
## Going Further
- [Mistral Large 2 on AltStack Directory](https://thealtstack.com/alternative-to/mistral)
- [Mistral Large 2 Self-Hosted Guide](https://thealtstack.com/self-hosted/mistral)
- [Official Documentation](https://mistral.ai)
- [GitHub Repository](https://github.com/mistralai/mistral-inference)

View File

@@ -0,0 +1,156 @@
---
title: "Deploy Mixpost Self-Hosted (Docker)"
description: "Step-by-step guide to self-hosting Mixpost with Docker Compose. "
---
# Deploy Mixpost
Self-hosted social media management software.
<div className="deploy-hero">
<span className="deploy-hero-item">⭐ 3.0k stars</span>
<span className="deploy-hero-item">📜 Other</span>
<span className="deploy-hero-item">🔴 Advanced</span>
<span className="deploy-hero-item">⏱ ~20 minutes</span>
</div>
<div className="mt-8 mb-4">
<a
href="https://m.do.co/c/2ed27757a361"
target="_blank"
rel="noopener noreferrer"
className="flex items-center justify-center w-full px-6 py-4 text-lg font-bold text-white transition-all bg-blue-600 rounded-xl hover:bg-blue-700 hover:scale-[1.02] shadow-lg shadow-blue-500/30"
>
🚀 Deploy on DigitalOcean ($200 Free Credit)
</a>
</div>
## What You'll Get
A fully working Mixpost instance running on your server. Your data stays on your hardware — no third-party access, no usage limits, no surprise invoices.
## Prerequisites
- A server with Docker and Docker Compose installed ([setup guide](/quick-start/choosing-a-server))
- A domain name pointed to your server (optional but recommended)
- Basic terminal access (SSH)
## The Config
Create a directory for Mixpost and add this `docker-compose.yml`:
```yaml
# -------------------------------------------------------------------------
# 🚀 Created and distributed by The AltStack
# 🌍 https://thealtstack.com
# -------------------------------------------------------------------------
version: '3.8'
services:
mixpost:
image: inovector/mixpost:latest
container_name: mixpost
restart: unless-stopped
depends_on:
- db
- redis
ports:
- "80:80"
environment:
- APP_URL=http://localhost
- DB_HOST=db
- DB_DATABASE=mixpost
- DB_USERNAME=mixpost
- DB_PASSWORD=mixpost
- REDIS_HOST=redis
db:
image: mysql:8.0
container_name: mixpost-db
restart: unless-stopped
environment:
- MYSQL_DATABASE=mixpost
- MYSQL_USER=mixpost
- MYSQL_PASSWORD=mixpost
- MYSQL_ROOT_PASSWORD=root
volumes:
- mixpost_db_data:/var/lib/mysql
redis:
image: redis:alpine
container_name: mixpost-redis
restart: unless-stopped
volumes:
mixpost_db_data:
```
## Let's Ship It
```bash
# Create a directory
mkdir -p /opt/mixpost && cd /opt/mixpost
# Create the docker-compose.yml (paste the config above)
nano docker-compose.yml
# Pull images and start
docker compose up -d
# Watch the logs
docker compose logs -f
```
## Environment Variables
| Variable | Default | Required |
|---|---|---|
| `APP_URL` | `http://localhost` | No |
| `DB_HOST` | `db` | No |
| `DB_DATABASE` | `mixpost` | No |
| `DB_USERNAME` | `mixpost` | No |
| `DB_PASSWORD` | `mixpost` | No |
| `REDIS_HOST` | `redis` | No |
| `MYSQL_DATABASE` | `mixpost` | No |
| `MYSQL_USER` | `mixpost` | No |
| `MYSQL_PASSWORD` | `mixpost` | No |
| `MYSQL_ROOT_PASSWORD` | `root` | No |
## Post-Deployment Checklist
- [ ] Service is accessible on the configured port
- [ ] Admin account created (if applicable)
- [ ] Reverse proxy configured ([Caddy guide](/concepts/reverse-proxies))
- [ ] SSL/HTTPS working
- [ ] Backup script set up ([backup guide](/concepts/backups))
- [ ] Uptime monitor added ([Uptime Kuma](/deploy/uptime-kuma))
## The "I Broke It" Section
**Container won't start?**
```bash
docker compose logs mixpost | tail -50
```
**Port already in use?**
```bash
# Find what's using the port
lsof -i :PORT_NUMBER
```
**Need to start fresh?**
```bash
docker compose down -v # ⚠️ This deletes volumes/data!
docker compose up -d
```
## Going Further
- [Mixpost on AltStack Directory](https://thealtstack.com/alternative-to/mixpost)
- [Mixpost Self-Hosted Guide](https://thealtstack.com/self-hosted/mixpost)
- [Official Documentation](https://mixpost.app)
- [GitHub Repository](https://github.com/inovector/mixpost)

View File

@@ -0,0 +1,112 @@
---
title: "Deploy Mochi-1 Self-Hosted (Docker)"
description: "Step-by-step guide to self-hosting Mochi-1 with Docker Compose. "
---
# Deploy Mochi-1
High-fidelity open-weights video generation model from Genmo, rivaling closed-source alternatives.
<div className="deploy-hero">
<span className="deploy-hero-item">⭐ 5.0k stars</span>
<span className="deploy-hero-item">📜 Apache License 2.0</span>
<span className="deploy-hero-item">🔴 Advanced</span>
<span className="deploy-hero-item">⏱ ~20 minutes</span>
</div>
<div className="mt-8 mb-4">
<a
href="https://m.do.co/c/2ed27757a361"
target="_blank"
rel="noopener noreferrer"
className="flex items-center justify-center w-full px-6 py-4 text-lg font-bold text-white transition-all bg-blue-600 rounded-xl hover:bg-blue-700 hover:scale-[1.02] shadow-lg shadow-blue-500/30"
>
🚀 Deploy on DigitalOcean ($200 Free Credit)
</a>
</div>
## What You'll Get
A fully working Mochi-1 instance running on your server. Your data stays on your hardware — no third-party access, no usage limits, no surprise invoices.
## Prerequisites
- A server with Docker and Docker Compose installed ([setup guide](/quick-start/choosing-a-server))
- A domain name pointed to your server (optional but recommended)
- Basic terminal access (SSH)
## The Config
Create a directory for Mochi-1 and add this `docker-compose.yml`:
```yaml
# -------------------------------------------------------------------------
# 🚀 Created and distributed by The AltStack
# 🌍 https://thealtstack.com
# -------------------------------------------------------------------------
version: '3.8'
services:
mochi-1:
image: genmo/mochi-1:latest
container_name: mochi-1
restart: unless-stopped
ports:
- "8000:8000"
```
## Let's Ship It
```bash
# Create a directory
mkdir -p /opt/mochi-1 && cd /opt/mochi-1
# Create the docker-compose.yml (paste the config above)
nano docker-compose.yml
# Pull images and start
docker compose up -d
# Watch the logs
docker compose logs -f
```
## Post-Deployment Checklist
- [ ] Service is accessible on the configured port
- [ ] Admin account created (if applicable)
- [ ] Reverse proxy configured ([Caddy guide](/concepts/reverse-proxies))
- [ ] SSL/HTTPS working
- [ ] Backup script set up ([backup guide](/concepts/backups))
- [ ] Uptime monitor added ([Uptime Kuma](/deploy/uptime-kuma))
## The "I Broke It" Section
**Container won't start?**
```bash
docker compose logs mochi-1 | tail -50
```
**Port already in use?**
```bash
# Find what's using the port
lsof -i :PORT_NUMBER
```
**Need to start fresh?**
```bash
docker compose down -v # ⚠️ This deletes volumes/data!
docker compose up -d
```
## Going Further
- [Mochi-1 on AltStack Directory](https://thealtstack.com/alternative-to/mochi-1)
- [Mochi-1 Self-Hosted Guide](https://thealtstack.com/self-hosted/mochi-1)
- [Official Documentation](https://www.genmo.ai)
- [GitHub Repository](https://github.com/genmoai/mochi1)

View File

@@ -0,0 +1,138 @@
---
title: "Deploy n8n Self-Hosted (Docker)"
description: "Step-by-step guide to self-hosting n8n with Docker Compose. "
---
# Deploy n8n
Fair-code workflow automation tool. Easily automate tasks across different services.
<div className="deploy-hero">
<span className="deploy-hero-item">⭐ 49.0k stars</span>
<span className="deploy-hero-item">📜 Sustainable Use License</span>
<span className="deploy-hero-item">🔴 Advanced</span>
<span className="deploy-hero-item">⏱ ~20 minutes</span>
</div>
<div className="mt-8 mb-4">
<a
href="https://m.do.co/c/2ed27757a361"
target="_blank"
rel="noopener noreferrer"
className="flex items-center justify-center w-full px-6 py-4 text-lg font-bold text-white transition-all bg-blue-600 rounded-xl hover:bg-blue-700 hover:scale-[1.02] shadow-lg shadow-blue-500/30"
>
🚀 Deploy on DigitalOcean ($200 Free Credit)
</a>
</div>
## What You'll Get
A fully working n8n instance running on your server. Your data stays on your hardware — no third-party access, no usage limits, no surprise invoices.
## Prerequisites
- A server with Docker and Docker Compose installed ([setup guide](/quick-start/choosing-a-server))
- A domain name pointed to your server (optional but recommended)
- Basic terminal access (SSH)
## The Config
Create a directory for n8n and add this `docker-compose.yml`:
```yaml
# -------------------------------------------------------------------------
# 🚀 Created and distributed by The AltStack
# 🌍 https://thealtstack.com
# -------------------------------------------------------------------------
version: '3.8'
services:
n8n:
image: n8nio/n8n:latest
container_name: n8n
restart: unless-stopped
ports:
- "5678:5678"
environment:
- N8N_BASIC_AUTH_ACTIVE=true
- N8N_BASIC_AUTH_USER=admin
- N8N_BASIC_AUTH_PASSWORD=password
- N8N_HOST=localhost
- N8N_PORT=5678
- N8N_PROTOCOL=http
- NODE_ENV=production
- WEBHOOK_URL=http://localhost:5678/
volumes:
- n8n_data:/home/node/.n8n
volumes:
n8n_data:
```
## Let's Ship It
```bash
# Create a directory
mkdir -p /opt/n8n && cd /opt/n8n
# Create the docker-compose.yml (paste the config above)
nano docker-compose.yml
# Pull images and start
docker compose up -d
# Watch the logs
docker compose logs -f
```
## Environment Variables
| Variable | Default | Required |
|---|---|---|
| `N8N_BASIC_AUTH_ACTIVE` | `true` | No |
| `N8N_BASIC_AUTH_USER` | `admin` | No |
| `N8N_BASIC_AUTH_PASSWORD` | `password` | No |
| `N8N_HOST` | `localhost` | No |
| `N8N_PORT` | `5678` | No |
| `N8N_PROTOCOL` | `http` | No |
| `NODE_ENV` | `production` | No |
| `WEBHOOK_URL` | `http://localhost:5678/` | No |
## Post-Deployment Checklist
- [ ] Service is accessible on the configured port
- [ ] Admin account created (if applicable)
- [ ] Reverse proxy configured ([Caddy guide](/concepts/reverse-proxies))
- [ ] SSL/HTTPS working
- [ ] Backup script set up ([backup guide](/concepts/backups))
- [ ] Uptime monitor added ([Uptime Kuma](/deploy/uptime-kuma))
## The "I Broke It" Section
**Container won't start?**
```bash
docker compose logs n8n | tail -50
```
**Port already in use?**
```bash
# Find what's using the port
lsof -i :PORT_NUMBER
```
**Need to start fresh?**
```bash
docker compose down -v # ⚠️ This deletes volumes/data!
docker compose up -d
```
## Going Further
- [n8n on AltStack Directory](https://thealtstack.com/alternative-to/n8n)
- [n8n Self-Hosted Guide](https://thealtstack.com/self-hosted/n8n)
- [Official Documentation](https://n8n.io)
- [GitHub Repository](https://github.com/n8n-io/n8n)

View File

@@ -0,0 +1,161 @@
---
title: "Deploy Odoo Self-Hosted (Docker)"
description: "Step-by-step guide to self-hosting Odoo with Docker Compose. "
---
# Deploy Odoo
A suite of open source business apps: CRM, eCommerce, accounting, manufacturing, warehouse, and more.
<div className="deploy-hero">
<span className="deploy-hero-item">⭐ 48.9k stars</span>
<span className="deploy-hero-item">📜 LGPL-3.0</span>
<span className="deploy-hero-item">🔴 Advanced</span>
<span className="deploy-hero-item">⏱ ~20 minutes</span>
</div>
<div className="mt-8 mb-4">
<a
href="https://m.do.co/c/2ed27757a361"
target="_blank"
rel="noopener noreferrer"
className="flex items-center justify-center w-full px-6 py-4 text-lg font-bold text-white transition-all bg-blue-600 rounded-xl hover:bg-blue-700 hover:scale-[1.02] shadow-lg shadow-blue-500/30"
>
🚀 Deploy on DigitalOcean ($200 Free Credit)
</a>
</div>
## What You'll Get
A fully working Odoo instance running on your server. Your data stays on your hardware — no third-party access, no usage limits, no surprise invoices.
## Prerequisites
- A server with Docker and Docker Compose installed ([setup guide](/quick-start/choosing-a-server))
- A domain name pointed to your server (optional but recommended)
- Basic terminal access (SSH)
## The Config
Create a directory for Odoo and add this `docker-compose.yml`:
```yaml
# -------------------------------------------------------------------------
# 🚀 Created and distributed by The AltStack
# 🌍 https://thealtstack.com
# -------------------------------------------------------------------------
# Docker Compose for Odoo
version: '3.8'
services:
odoo:
build:
context: .
dockerfile: Dockerfile
container_name: odoo
ports:
- "8069:8069"
environment:
- HOST=db
- USER=odoo
- PASSWORD=odoo
depends_on:
db:
condition: service_healthy
networks:
- odoo_net
healthcheck:
test: [ "CMD", "curl", "-f", "http://localhost:8069/" ]
interval: 30s
timeout: 10s
retries: 3
restart: unless-stopped
db:
image: postgres:15-alpine
container_name: odoo-db
environment:
POSTGRES_USER: odoo
POSTGRES_PASSWORD: odoo
POSTGRES_DB: postgres
volumes:
- odoo_db_data:/var/lib/postgresql/data
networks:
- odoo_net
healthcheck:
test: [ "CMD-SHELL", "pg_isready -U odoo" ]
interval: 5s
timeout: 5s
retries: 5
networks:
odoo_net:
driver: bridge
volumes:
odoo_db_data:
name: odoo_db_data
```
## Let's Ship It
```bash
# Create a directory
mkdir -p /opt/odoo && cd /opt/odoo
# Create the docker-compose.yml (paste the config above)
nano docker-compose.yml
# Pull images and start
docker compose up -d
# Watch the logs
docker compose logs -f
```
## Environment Variables
| Variable | Default | Required |
|---|---|---|
| `HOST` | `db` | No |
| `USER` | `odoo` | No |
| `PASSWORD` | `odoo` | No |
## Post-Deployment Checklist
- [ ] Service is accessible on the configured port
- [ ] Admin account created (if applicable)
- [ ] Reverse proxy configured ([Caddy guide](/concepts/reverse-proxies))
- [ ] SSL/HTTPS working
- [ ] Backup script set up ([backup guide](/concepts/backups))
- [ ] Uptime monitor added ([Uptime Kuma](/deploy/uptime-kuma))
## The "I Broke It" Section
**Container won't start?**
```bash
docker compose logs odoo | tail -50
```
**Port already in use?**
```bash
# Find what's using the port
lsof -i :PORT_NUMBER
```
**Need to start fresh?**
```bash
docker compose down -v # ⚠️ This deletes volumes/data!
docker compose up -d
```
## Going Further
- [Odoo on AltStack Directory](https://thealtstack.com/alternative-to/odoo)
- [Odoo Self-Hosted Guide](https://thealtstack.com/self-hosted/odoo)
- [Official Documentation](https://www.odoo.com)
- [GitHub Repository](https://github.com/odoo/odoo)

View File

@@ -0,0 +1,137 @@
---
title: "Deploy Ollama Self-Hosted (Docker)"
description: "Step-by-step guide to self-hosting Ollama with Docker Compose. "
---
# Deploy Ollama
Get up and running with Llama 3, Mistral, Gemma, and other large language models locally.
<div className="deploy-hero">
<span className="deploy-hero-item">⭐ 60.0k stars</span>
<span className="deploy-hero-item">📜 MIT License</span>
<span className="deploy-hero-item">🔴 Advanced</span>
<span className="deploy-hero-item">⏱ ~20 minutes</span>
</div>
<div className="mt-8 mb-4">
<a
href="https://m.do.co/c/2ed27757a361"
target="_blank"
rel="noopener noreferrer"
className="flex items-center justify-center w-full px-6 py-4 text-lg font-bold text-white transition-all bg-blue-600 rounded-xl hover:bg-blue-700 hover:scale-[1.02] shadow-lg shadow-blue-500/30"
>
🚀 Deploy on DigitalOcean ($200 Free Credit)
</a>
</div>
## What You'll Get
A fully working Ollama instance running on your server. Your data stays on your hardware — no third-party access, no usage limits, no surprise invoices.
## Prerequisites
- A server with Docker and Docker Compose installed ([setup guide](/quick-start/choosing-a-server))
- A domain name pointed to your server (optional but recommended)
- Basic terminal access (SSH)
## The Config
Create a directory for Ollama and add this `docker-compose.yml`:
```yaml
# -------------------------------------------------------------------------
# 🚀 Created and distributed by The AltStack
# 🌍 https://thealtstack.com
# -------------------------------------------------------------------------
# Docker Compose for Ollama
version: '3.8'
services:
ollama:
image: ollama/ollama:latest # Official image is highly recommended for GPU support
container_name: ollama
ports:
- "11434:11434"
volumes:
- ollama_data:/root/.ollama
# For GPU support (NVIDIA), uncomment the following:
# deploy:
# resources:
# reservations:
# devices:
# - driver: nvidia
# count: all
# capabilities: [gpu]
networks:
- ollama_net
healthcheck:
test: [ "CMD", "curl", "-f", "http://localhost:11434/api/tags" ]
interval: 10s
timeout: 5s
retries: 5
networks:
ollama_net:
driver: bridge
volumes:
ollama_data:
name: ollama_data
```
## Let's Ship It
```bash
# Create a directory
mkdir -p /opt/ollama && cd /opt/ollama
# Create the docker-compose.yml (paste the config above)
nano docker-compose.yml
# Pull images and start
docker compose up -d
# Watch the logs
docker compose logs -f
```
## Post-Deployment Checklist
- [ ] Service is accessible on the configured port
- [ ] Admin account created (if applicable)
- [ ] Reverse proxy configured ([Caddy guide](/concepts/reverse-proxies))
- [ ] SSL/HTTPS working
- [ ] Backup script set up ([backup guide](/concepts/backups))
- [ ] Uptime monitor added ([Uptime Kuma](/deploy/uptime-kuma))
## The "I Broke It" Section
**Container won't start?**
```bash
docker compose logs ollama | tail -50
```
**Port already in use?**
```bash
# Find what's using the port
lsof -i :PORT_NUMBER
```
**Need to start fresh?**
```bash
docker compose down -v # ⚠️ This deletes volumes/data!
docker compose up -d
```
## Going Further
- [Ollama on AltStack Directory](https://thealtstack.com/alternative-to/ollama)
- [Ollama Self-Hosted Guide](https://thealtstack.com/self-hosted/ollama)
- [Official Documentation](https://ollama.com)
- [GitHub Repository](https://github.com/ollama/ollama)

View File

@@ -0,0 +1,112 @@
---
title: "Deploy ONLYOFFICE Self-Hosted (Docker)"
description: "Step-by-step guide to self-hosting ONLYOFFICE with Docker Compose. "
---
# Deploy ONLYOFFICE
Powerful online document editors for text, spreadsheets, and presentations. Highly compatible with MS Office.
<div className="deploy-hero">
<span className="deploy-hero-item">⭐ 11.0k stars</span>
<span className="deploy-hero-item">📜 AGPLv3</span>
<span className="deploy-hero-item">🔴 Advanced</span>
<span className="deploy-hero-item">⏱ ~20 minutes</span>
</div>
<div className="mt-8 mb-4">
<a
href="https://m.do.co/c/2ed27757a361"
target="_blank"
rel="noopener noreferrer"
className="flex items-center justify-center w-full px-6 py-4 text-lg font-bold text-white transition-all bg-blue-600 rounded-xl hover:bg-blue-700 hover:scale-[1.02] shadow-lg shadow-blue-500/30"
>
🚀 Deploy on DigitalOcean ($200 Free Credit)
</a>
</div>
## What You'll Get
A fully working ONLYOFFICE instance running on your server. Your data stays on your hardware — no third-party access, no usage limits, no surprise invoices.
## Prerequisites
- A server with Docker and Docker Compose installed ([setup guide](/quick-start/choosing-a-server))
- A domain name pointed to your server (optional but recommended)
- Basic terminal access (SSH)
## The Config
Create a directory for ONLYOFFICE and add this `docker-compose.yml`:
```yaml
# -------------------------------------------------------------------------
# 🚀 Created and distributed by The AltStack
# 🌍 https://thealtstack.com
# -------------------------------------------------------------------------
version: '3.8'
services:
onlyoffice:
image: onlyoffice/documentserver:latest
container_name: onlyoffice
restart: unless-stopped
ports:
- "8080:80"
```
## Let's Ship It
```bash
# Create a directory
mkdir -p /opt/onlyoffice && cd /opt/onlyoffice
# Create the docker-compose.yml (paste the config above)
nano docker-compose.yml
# Pull images and start
docker compose up -d
# Watch the logs
docker compose logs -f
```
## Post-Deployment Checklist
- [ ] Service is accessible on the configured port
- [ ] Admin account created (if applicable)
- [ ] Reverse proxy configured ([Caddy guide](/concepts/reverse-proxies))
- [ ] SSL/HTTPS working
- [ ] Backup script set up ([backup guide](/concepts/backups))
- [ ] Uptime monitor added ([Uptime Kuma](/deploy/uptime-kuma))
## The "I Broke It" Section
**Container won't start?**
```bash
docker compose logs onlyoffice | tail -50
```
**Port already in use?**
```bash
# Find what's using the port
lsof -i :PORT_NUMBER
```
**Need to start fresh?**
```bash
docker compose down -v # ⚠️ This deletes volumes/data!
docker compose up -d
```
## Going Further
- [ONLYOFFICE on AltStack Directory](https://thealtstack.com/alternative-to/onlyoffice)
- [ONLYOFFICE Self-Hosted Guide](https://thealtstack.com/self-hosted/onlyoffice)
- [Official Documentation](https://www.onlyoffice.com)
- [GitHub Repository](https://github.com/ONLYOFFICE/DocumentServer)

View File

@@ -0,0 +1,146 @@
---
title: "Deploy OrangeHRM Self-Hosted (Docker)"
description: "Step-by-step guide to self-hosting OrangeHRM with Docker Compose. "
---
# Deploy OrangeHRM
The world's most popular open source human resource management software.
<div className="deploy-hero">
<span className="deploy-hero-item">⭐ 1.2k stars</span>
<span className="deploy-hero-item">📜 GPLv2</span>
<span className="deploy-hero-item">🔴 Advanced</span>
<span className="deploy-hero-item">⏱ ~20 minutes</span>
</div>
<div className="mt-8 mb-4">
<a
href="https://m.do.co/c/2ed27757a361"
target="_blank"
rel="noopener noreferrer"
className="flex items-center justify-center w-full px-6 py-4 text-lg font-bold text-white transition-all bg-blue-600 rounded-xl hover:bg-blue-700 hover:scale-[1.02] shadow-lg shadow-blue-500/30"
>
🚀 Deploy on DigitalOcean ($200 Free Credit)
</a>
</div>
## What You'll Get
A fully working OrangeHRM instance running on your server. Your data stays on your hardware — no third-party access, no usage limits, no surprise invoices.
## Prerequisites
- A server with Docker and Docker Compose installed ([setup guide](/quick-start/choosing-a-server))
- A domain name pointed to your server (optional but recommended)
- Basic terminal access (SSH)
## The Config
Create a directory for OrangeHRM and add this `docker-compose.yml`:
```yaml
# -------------------------------------------------------------------------
# 🚀 Created and distributed by The AltStack
# 🌍 https://thealtstack.com
# -------------------------------------------------------------------------
version: '3.8'
services:
orangehrm:
image: orangehrm/orangehrm:latest
container_name: orangehrm
restart: unless-stopped
depends_on:
- db
ports:
- "80:80"
environment:
- ORANGEHRM_DATABASE_HOST=db
- ORANGEHRM_DATABASE_USER=orangehrm
- ORANGEHRM_DATABASE_PASSWORD=orangehrm
- ORANGEHRM_DATABASE_NAME=orangehrm
db:
image: mariadb:10.6
container_name: orangehrm-db
restart: unless-stopped
environment:
- MYSQL_ROOT_PASSWORD=root
- MYSQL_USER=orangehrm
- MYSQL_PASSWORD=orangehrm
- MYSQL_DATABASE=orangehrm
volumes:
- orangehrm_db_data:/var/lib/mysql
volumes:
orangehrm_db_data:
```
## Let's Ship It
```bash
# Create a directory
mkdir -p /opt/orangehrm && cd /opt/orangehrm
# Create the docker-compose.yml (paste the config above)
nano docker-compose.yml
# Pull images and start
docker compose up -d
# Watch the logs
docker compose logs -f
```
## Environment Variables
| Variable | Default | Required |
|---|---|---|
| `ORANGEHRM_DATABASE_HOST` | `db` | No |
| `ORANGEHRM_DATABASE_USER` | `orangehrm` | No |
| `ORANGEHRM_DATABASE_PASSWORD` | `orangehrm` | No |
| `ORANGEHRM_DATABASE_NAME` | `orangehrm` | No |
| `MYSQL_ROOT_PASSWORD` | `root` | No |
| `MYSQL_USER` | `orangehrm` | No |
| `MYSQL_PASSWORD` | `orangehrm` | No |
| `MYSQL_DATABASE` | `orangehrm` | No |
## Post-Deployment Checklist
- [ ] Service is accessible on the configured port
- [ ] Admin account created (if applicable)
- [ ] Reverse proxy configured ([Caddy guide](/concepts/reverse-proxies))
- [ ] SSL/HTTPS working
- [ ] Backup script set up ([backup guide](/concepts/backups))
- [ ] Uptime monitor added ([Uptime Kuma](/deploy/uptime-kuma))
## The "I Broke It" Section
**Container won't start?**
```bash
docker compose logs orangehrm | tail -50
```
**Port already in use?**
```bash
# Find what's using the port
lsof -i :PORT_NUMBER
```
**Need to start fresh?**
```bash
docker compose down -v # ⚠️ This deletes volumes/data!
docker compose up -d
```
## Going Further
- [OrangeHRM on AltStack Directory](https://thealtstack.com/alternative-to/orangehrm)
- [OrangeHRM Self-Hosted Guide](https://thealtstack.com/self-hosted/orangehrm)
- [Official Documentation](https://www.orangehrm.com)
- [GitHub Repository](https://github.com/orangehrm/orangehrm)

View File

@@ -0,0 +1,112 @@
---
title: "Deploy Outline Self-Hosted (Docker)"
description: "Step-by-step guide to self-hosting Outline with Docker Compose. "
---
# Deploy Outline
Fast, collaborative, knowledge base for your team built using React and Markdown.
<div className="deploy-hero">
<span className="deploy-hero-item">⭐ 24.0k stars</span>
<span className="deploy-hero-item">📜 Other</span>
<span className="deploy-hero-item">🔴 Advanced</span>
<span className="deploy-hero-item">⏱ ~20 minutes</span>
</div>
<div className="mt-8 mb-4">
<a
href="https://m.do.co/c/2ed27757a361"
target="_blank"
rel="noopener noreferrer"
className="flex items-center justify-center w-full px-6 py-4 text-lg font-bold text-white transition-all bg-blue-600 rounded-xl hover:bg-blue-700 hover:scale-[1.02] shadow-lg shadow-blue-500/30"
>
🚀 Deploy on DigitalOcean ($200 Free Credit)
</a>
</div>
## What You'll Get
A fully working Outline instance running on your server. Your data stays on your hardware — no third-party access, no usage limits, no surprise invoices.
## Prerequisites
- A server with Docker and Docker Compose installed ([setup guide](/quick-start/choosing-a-server))
- A domain name pointed to your server (optional but recommended)
- Basic terminal access (SSH)
## The Config
Create a directory for Outline and add this `docker-compose.yml`:
```yaml
# -------------------------------------------------------------------------
# 🚀 Created and distributed by The AltStack
# 🌍 https://thealtstack.com
# -------------------------------------------------------------------------
version: '3.8'
services:
outline:
image: outlinewiki/outline:latest
container_name: outline
restart: unless-stopped
ports:
- "3000:3000"
```
## Let's Ship It
```bash
# Create a directory
mkdir -p /opt/outline && cd /opt/outline
# Create the docker-compose.yml (paste the config above)
nano docker-compose.yml
# Pull images and start
docker compose up -d
# Watch the logs
docker compose logs -f
```
## Post-Deployment Checklist
- [ ] Service is accessible on the configured port
- [ ] Admin account created (if applicable)
- [ ] Reverse proxy configured ([Caddy guide](/concepts/reverse-proxies))
- [ ] SSL/HTTPS working
- [ ] Backup script set up ([backup guide](/concepts/backups))
- [ ] Uptime monitor added ([Uptime Kuma](/deploy/uptime-kuma))
## The "I Broke It" Section
**Container won't start?**
```bash
docker compose logs outline | tail -50
```
**Port already in use?**
```bash
# Find what's using the port
lsof -i :PORT_NUMBER
```
**Need to start fresh?**
```bash
docker compose down -v # ⚠️ This deletes volumes/data!
docker compose up -d
```
## Going Further
- [Outline on AltStack Directory](https://thealtstack.com/alternative-to/outline)
- [Outline Self-Hosted Guide](https://thealtstack.com/self-hosted/outline)
- [Official Documentation](https://www.getoutline.com)
- [GitHub Repository](https://github.com/outline/outline)

171
docs/app/deploy/page.mdx Normal file
View File

@@ -0,0 +1,171 @@
---
title: "Deploy Guides"
description: "65+ self-hosting deploy guides with Docker Compose configs. Find your tool, copy the config, ship it."
---
# Deploy Guides
Every guide follows the same pattern: **copy the Docker Compose config, tweak the `.env`, run `docker compose up -d`.** Done.
> 💡 **New to self-hosting?** Start with the [Quick Start](/quick-start) guide first, then come back here.
---
## 🤖 AI & Machine Learning
Run AI models on your own hardware. No API keys, no usage limits, no data leaving your server.
| Tool | What It Does |
|---|---|
| [Ollama](/deploy/ollama) | Run LLMs locally with a simple CLI |
| [DeepSeek](/deploy/deepseek) | DeepSeek-V3 / R1 reasoning models |
| [Meta Llama](/deploy/llama) | Meta's open-weight Llama 3.1 |
| [Mistral](/deploy/mistral) | Mistral Large 2 — fast and capable |
| [Qwen](/deploy/qwen) | Alibaba's Qwen 2.5 models |
| [Google Gemma](/deploy/gemma) | Google's lightweight open models |
| [GPT4All](/deploy/gpt4all) | Desktop-first local LLM runner |
| [Continue](/deploy/continue-dev) | AI code assistant for VS Code/JetBrains |
| [TabbyML](/deploy/tabby) | Self-hosted GitHub Copilot alternative |
| [Stable Diffusion](/deploy/stable-diffusion) | AI image generation (SD 3.5) |
| [FLUX](/deploy/flux) | Next-gen image generation |
| [HunyuanVideo](/deploy/hunyuan-video) | AI video generation |
| [Mochi-1](/deploy/mochi-1) | Text-to-video AI |
---
## 📊 Analytics & Monitoring
Own your data. No more sending user behavior to Google.
| Tool | What It Does |
|---|---|
| [Plausible](/deploy/plausible) | Privacy-first web analytics |
| [PostHog](/deploy/posthog) | Product analytics + session replay |
| [Matomo](/deploy/matomo) | Full Google Analytics replacement |
| [Jitsu](/deploy/jitsu) | Open-source Segment alternative |
| [Metabase](/deploy/metabase) | Business intelligence dashboards |
| [Apache Superset](/deploy/superset) | Enterprise data visualization |
| [GlitchTip](/deploy/glitchtip) | Error tracking (Sentry alternative) |
| [SigNoz](/deploy/signoz) | Full-stack observability platform |
| [Uptime Kuma](/deploy/uptime-kuma) | Beautiful uptime monitoring |
---
## 💬 Productivity & Collaboration
Replace Slack, Notion, and Jira — on your terms.
| Tool | What It Does |
|---|---|
| [Mattermost](/deploy/mattermost) | Slack alternative for teams |
| [Rocket.Chat](/deploy/rocketchat) | Team chat with omnichannel support |
| [Outline](/deploy/outline) | Beautiful team knowledge base |
| [AFFiNE](/deploy/affine) | Notion + Miro hybrid workspace |
| [AppFlowy](/deploy/appflowy) | Open-source Notion alternative |
| [ONLYOFFICE](/deploy/onlyoffice) | Self-hosted Google Docs/Sheets |
| [Plane](/deploy/plane) | Project management (Jira alternative) |
| [Taiga](/deploy/taiga) | Agile project management |
| [Cal.com](/deploy/calcom) | Scheduling (Calendly alternative) |
| [Documenso](/deploy/documenso) | Digital signatures (DocuSign alternative) |
| [Zammad](/deploy/zammad) | Helpdesk & ticketing system |
---
## 🏢 Business & CRM
Run your business without SaaS subscriptions.
| Tool | What It Does |
|---|---|
| [Odoo](/deploy/odoo) | Full ERP suite (CRM, accounting, HR) |
| [ERPNext](/deploy/erpnext) | Manufacturing & distribution ERP |
| [Twenty](/deploy/twenty) | Modern CRM (Salesforce alternative) |
| [Akaunting](/deploy/akaunting) | Free accounting software |
| [OrangeHRM](/deploy/orangehrm) | HR management platform |
| [Medusa.js](/deploy/medusa) | Headless e-commerce engine |
---
## 🔐 Security & Authentication
Control who gets in. Period.
| Tool | What It Does |
|---|---|
| [Keycloak](/deploy/keycloak) | Enterprise identity & access management |
| [Authentik](/deploy/authentik) | Modern SSO and user management |
| [Vaultwarden](/deploy/vaultwarden) | Bitwarden-compatible password vault |
| [Bitwarden](/deploy/bitwarden) | Official password manager server |
| [KeePassXC](/deploy/keepassxc) | Offline password manager |
---
## ⚙️ DevOps & Infrastructure
The tools that run your tools.
| Tool | What It Does |
|---|---|
| [Coolify](/deploy/coolify) | Self-hosted Vercel/Netlify |
| [Dokku](/deploy/dokku) | Mini Heroku on your server |
| [n8n](/deploy/n8n) | Workflow automation (Zapier alternative) |
| [Activepieces](/deploy/activepieces) | Visual automation builder |
| [Coder](/deploy/coder) | Cloud development environments |
| [MinIO](/deploy/minio) | S3-compatible object storage |
| [PocketBase](/deploy/pocketbase) | Backend in a single binary |
| [Appwrite](/deploy/appwrite) | Firebase alternative |
| [Supabase](/deploy/supabase) | Postgres-powered Firebase alternative |
---
## 📧 Marketing & Email
Send emails, run campaigns, own your audience.
| Tool | What It Does |
|---|---|
| [Listmonk](/deploy/listmonk) | Newsletter & mailing list manager |
| [Mautic](/deploy/mautic) | Marketing automation platform |
| [Postal](/deploy/postal) | Mail delivery platform (Mailgun alternative) |
| [Mixpost](/deploy/mixpost) | Social media management |
| [Chaskiq](/deploy/chaskiq) | Customer messaging platform |
---
## 🎨 Creative Tools
Design, edit, and create without Adobe subscriptions.
| Tool | What It Does |
|---|---|
| [Penpot](/deploy/penpot) | Design & prototyping (Figma alternative) |
| [GIMP](/deploy/gimp) | Image editing (Photoshop alternative) |
| [Krita](/deploy/krita) | Digital painting & illustration |
| [Kdenlive](/deploy/kdenlive) | Video editing |
| [FreeCAD](/deploy/freecad) | 3D parametric modeling |
| [LibreCAD](/deploy/librecad) | 2D CAD drafting |
---
## 🔌 Communication
| Tool | What It Does |
|---|---|
| [Jitsi Meet](/deploy/jitsi-meet) | Video conferencing (Zoom alternative) |
---
## Prerequisites for All Guides
Every guide assumes you have:
- A server with Docker and Docker Compose installed → [Setup Guide](/quick-start/choosing-a-server)
- Basic terminal access (SSH)
- A domain name (optional but recommended) → [Reverse Proxy Setup](/concepts/reverse-proxies)
## Essential Reading
Before your first deploy, read these:
- [Docker in 10 Minutes](/concepts/docker-basics)
- [Reverse Proxies Explained](/concepts/reverse-proxies)
- [SSL/TLS for Self-Hosters](/concepts/ssl-tls)
- [Backups That Actually Work](/concepts/backups)

View File

@@ -0,0 +1,185 @@
---
title: "Deploy Penpot Self-Hosted (Docker)"
description: "Step-by-step guide to self-hosting Penpot with Docker Compose. "
---
# Deploy Penpot
Penpot: The open-source design tool for design and code collaboration
<div className="deploy-hero">
<span className="deploy-hero-item">⭐ 44.2k stars</span>
<span className="deploy-hero-item">📜 Mozilla Public License 2.0</span>
<span className="deploy-hero-item">🔴 Advanced</span>
<span className="deploy-hero-item">⏱ ~20 minutes</span>
</div>
<div className="mt-8 mb-4">
<a
href="https://m.do.co/c/2ed27757a361"
target="_blank"
rel="noopener noreferrer"
className="flex items-center justify-center w-full px-6 py-4 text-lg font-bold text-white transition-all bg-blue-600 rounded-xl hover:bg-blue-700 hover:scale-[1.02] shadow-lg shadow-blue-500/30"
>
🚀 Deploy on DigitalOcean ($200 Free Credit)
</a>
</div>
## What You'll Get
A fully working Penpot instance running on your server. Your data stays on your hardware — no third-party access, no usage limits, no surprise invoices.
## Prerequisites
- A server with Docker and Docker Compose installed ([setup guide](/quick-start/choosing-a-server))
- A domain name pointed to your server (optional but recommended)
- Basic terminal access (SSH)
## The Config
Create a directory for Penpot and add this `docker-compose.yml`:
```yaml
# -------------------------------------------------------------------------
# 🚀 Created and distributed by The AltStack
# 🌍 https://thealtstack.com
# -------------------------------------------------------------------------
version: '3.8'
services:
penpot-frontend:
image: penpotapp/frontend:latest
container_name: penpot-frontend
restart: unless-stopped
depends_on:
- penpot-backend
- penpot-exporter
ports:
- "9010:80"
environment:
- PENPOT_FLAGS=disable-registration disable-login-with-password
volumes:
- penpot_assets:/opt/data/assets
penpot-backend:
image: penpotapp/backend:latest
container_name: penpot-backend
restart: unless-stopped
depends_on:
- penpot-postgres
- penpot-redis
environment:
- PENPOT_FLAGS=disable-registration disable-login-with-password
- PENPOT_DATABASE_URI=postgresql://penpot-postgres/penpot
- PENPOT_DATABASE_USERNAME=penpot
- PENPOT_DATABASE_PASSWORD=penpot
- PENPOT_REDIS_URI=redis://penpot-redis/0
- PENPOT_ASSETS_STORAGE_BACKEND=assets-fs
- PENPOT_STORAGE_ASSETS_FS_DIRECTORY=/opt/data/assets
- PENPOT_TELEMETRY_ENABLED=false
volumes:
- penpot_assets:/opt/data/assets
penpot-exporter:
image: penpotapp/exporter:latest
container_name: penpot-exporter
restart: unless-stopped
environment:
- PENPOT_DATABASE_URI=postgresql://penpot-postgres/penpot
- PENPOT_DATABASE_USERNAME=penpot
- PENPOT_DATABASE_PASSWORD=penpot
- PENPOT_REDIS_URI=redis://penpot-redis/0
penpot-postgres:
image: postgres:15
container_name: penpot-postgres
restart: unless-stopped
environment:
- POSTGRES_INITDB_ARGS=--data-checksums
- POSTGRES_DB=penpot
- POSTGRES_USER=penpot
- POSTGRES_PASSWORD=penpot
volumes:
- penpot_postgres_v15:/var/lib/postgresql/data
penpot-redis:
image: redis:7
container_name: penpot-redis
restart: unless-stopped
volumes:
penpot_postgres_v15:
penpot_assets:
```
## Let's Ship It
```bash
# Create a directory
mkdir -p /opt/penpot && cd /opt/penpot
# Create the docker-compose.yml (paste the config above)
nano docker-compose.yml
# Pull images and start
docker compose up -d
# Watch the logs
docker compose logs -f
```
## Environment Variables
| Variable | Default | Required |
|---|---|---|
| `PENPOT_FLAGS` | `disable-registration disable-login-with-password` | No |
| `PENPOT_DATABASE_URI` | `postgresql://penpot-postgres/penpot` | No |
| `PENPOT_DATABASE_USERNAME` | `penpot` | No |
| `PENPOT_DATABASE_PASSWORD` | `penpot` | No |
| `PENPOT_REDIS_URI` | `redis://penpot-redis/0` | No |
| `PENPOT_ASSETS_STORAGE_BACKEND` | `assets-fs` | No |
| `PENPOT_STORAGE_ASSETS_FS_DIRECTORY` | `/opt/data/assets` | No |
| `PENPOT_TELEMETRY_ENABLED` | `false` | No |
| `POSTGRES_INITDB_ARGS` | `--data-checksums` | No |
| `POSTGRES_DB` | `penpot` | No |
| `POSTGRES_USER` | `penpot` | No |
| `POSTGRES_PASSWORD` | `penpot` | No |
## Post-Deployment Checklist
- [ ] Service is accessible on the configured port
- [ ] Admin account created (if applicable)
- [ ] Reverse proxy configured ([Caddy guide](/concepts/reverse-proxies))
- [ ] SSL/HTTPS working
- [ ] Backup script set up ([backup guide](/concepts/backups))
- [ ] Uptime monitor added ([Uptime Kuma](/deploy/uptime-kuma))
## The "I Broke It" Section
**Container won't start?**
```bash
docker compose logs penpot | tail -50
```
**Port already in use?**
```bash
# Find what's using the port
lsof -i :PORT_NUMBER
```
**Need to start fresh?**
```bash
docker compose down -v # ⚠️ This deletes volumes/data!
docker compose up -d
```
## Going Further
- [Penpot on AltStack Directory](https://thealtstack.com/alternative-to/penpot)
- [Penpot Self-Hosted Guide](https://thealtstack.com/self-hosted/penpot)
- [Official Documentation](https://penpot.app)
- [GitHub Repository](https://github.com/penpot/penpot)

View File

@@ -0,0 +1,160 @@
---
title: "Deploy Plane Self-Hosted (Docker)"
description: "Step-by-step guide to self-hosting Plane with Docker Compose. "
---
# Deploy Plane
🔥🔥🔥 Open-source Jira, Linear, Monday, and ClickUp alternative. Plane is a modern project management platform to manage tasks, sprints, docs, and triage.
<div className="deploy-hero">
<span className="deploy-hero-item">⭐ 45.5k stars</span>
<span className="deploy-hero-item">📜 GNU Affero General Public License v3.0</span>
<span className="deploy-hero-item">🔴 Advanced</span>
<span className="deploy-hero-item">⏱ ~20 minutes</span>
</div>
<div className="mt-8 mb-4">
<a
href="https://m.do.co/c/2ed27757a361"
target="_blank"
rel="noopener noreferrer"
className="flex items-center justify-center w-full px-6 py-4 text-lg font-bold text-white transition-all bg-blue-600 rounded-xl hover:bg-blue-700 hover:scale-[1.02] shadow-lg shadow-blue-500/30"
>
🚀 Deploy on DigitalOcean ($200 Free Credit)
</a>
</div>
## What You'll Get
A fully working Plane instance running on your server. Your data stays on your hardware — no third-party access, no usage limits, no surprise invoices.
## Prerequisites
- A server with Docker and Docker Compose installed ([setup guide](/quick-start/choosing-a-server))
- A domain name pointed to your server (optional but recommended)
- Basic terminal access (SSH)
## The Config
Create a directory for Plane and add this `docker-compose.yml`:
```yaml
# -------------------------------------------------------------------------
# 🚀 Created and distributed by The AltStack
# 🌍 https://thealtstack.com
# -------------------------------------------------------------------------
version: '3.8'
services:
plane-web:
image: makeplane/plane-frontend:latest
container_name: plane-frontend
restart: unless-stopped
depends_on:
- plane-backend
ports:
- "3000:80"
plane-backend:
image: makeplane/plane-backend:latest
container_name: plane-backend
restart: unless-stopped
depends_on:
- plane-db
- plane-redis
ports:
- "8000:8000"
environment:
- DATABASE_URL=postgres://plane:plane@plane-db:5432/plane
- REDIS_URL=redis://plane-redis:6379/
- SECRET_KEY=replace-me-with-a-secure-key
plane-db:
image: postgres:15-alpine
container_name: plane-db
restart: unless-stopped
environment:
- POSTGRES_USER=plane
- POSTGRES_PASSWORD=plane
- POSTGRES_DB=plane
volumes:
- plane_db_data:/var/lib/postgresql/data
plane-redis:
image: redis:7-alpine
container_name: plane-redis
restart: unless-stopped
volumes:
- plane_redis_data:/data
volumes:
plane_db_data:
plane_redis_data:
```
## Let's Ship It
```bash
# Create a directory
mkdir -p /opt/plane && cd /opt/plane
# Create the docker-compose.yml (paste the config above)
nano docker-compose.yml
# Pull images and start
docker compose up -d
# Watch the logs
docker compose logs -f
```
## Environment Variables
| Variable | Default | Required |
|---|---|---|
| `DATABASE_URL` | `postgres://plane:plane@plane-db:5432/plane` | No |
| `REDIS_URL` | `redis://plane-redis:6379/` | No |
| `SECRET_KEY` | `replace-me-with-a-secure-key` | No |
| `POSTGRES_USER` | `plane` | No |
| `POSTGRES_PASSWORD` | `plane` | No |
| `POSTGRES_DB` | `plane` | No |
## Post-Deployment Checklist
- [ ] Service is accessible on the configured port
- [ ] Admin account created (if applicable)
- [ ] Reverse proxy configured ([Caddy guide](/concepts/reverse-proxies))
- [ ] SSL/HTTPS working
- [ ] Backup script set up ([backup guide](/concepts/backups))
- [ ] Uptime monitor added ([Uptime Kuma](/deploy/uptime-kuma))
## The "I Broke It" Section
**Container won't start?**
```bash
docker compose logs plane | tail -50
```
**Port already in use?**
```bash
# Find what's using the port
lsof -i :PORT_NUMBER
```
**Need to start fresh?**
```bash
docker compose down -v # ⚠️ This deletes volumes/data!
docker compose up -d
```
## Going Further
- [Plane on AltStack Directory](https://thealtstack.com/alternative-to/plane)
- [Plane Self-Hosted Guide](https://thealtstack.com/self-hosted/plane)
- [Official Documentation](https://plane.so)
- [GitHub Repository](https://github.com/makeplane/plane)

View File

@@ -0,0 +1,179 @@
---
title: "Deploy Plausible Self-Hosted (Docker)"
description: "Step-by-step guide to self-hosting Plausible with Docker Compose. "
---
# Deploy Plausible
Simple, open source, lightweight and privacy-friendly web analytics alternative to Google Analytics.
<div className="deploy-hero">
<span className="deploy-hero-item">⭐ 24.2k stars</span>
<span className="deploy-hero-item">📜 GNU Affero General Public License v3.0</span>
<span className="deploy-hero-item">🔴 Advanced</span>
<span className="deploy-hero-item">⏱ ~20 minutes</span>
</div>
<div className="mt-8 mb-4">
<a
href="https://m.do.co/c/2ed27757a361"
target="_blank"
rel="noopener noreferrer"
className="flex items-center justify-center w-full px-6 py-4 text-lg font-bold text-white transition-all bg-blue-600 rounded-xl hover:bg-blue-700 hover:scale-[1.02] shadow-lg shadow-blue-500/30"
>
🚀 Deploy on DigitalOcean ($200 Free Credit)
</a>
</div>
A production-ready Plausible Analytics instance. Note that Plausible uses a two-database architecture:
- **PostgreSQL:** Stores your users, sites, and metadata.
- **ClickHouse:** A high-performance columnar database that stores the millions of raw events (pageviews) you'll be collecting.
> 🌍 **Geolocation Tip:** To see where your visitors are coming from, you'll need to download the free MaxMind GeoLite2 database after deployment and place it in the `./geoip` folder.
## Prerequisites
- A server with Docker and Docker Compose installed ([setup guide](/quick-start/choosing-a-server))
- A domain name pointed to your server (optional but recommended)
- Basic terminal access (SSH)
## The Config
Create a directory for Plausible and add this `docker-compose.yml`:
```yaml
# -------------------------------------------------------------------------
# 🚀 Created and distributed by The AltStack
# 🌍 https://thealtstack.com
# -------------------------------------------------------------------------
version: '3.8'
services:
plausible:
image: plausible/analytics:latest
container_name: plausible
restart: unless-stopped
command: sh -c "sleep 10 && /entrypoint.sh db createdb && /entrypoint.sh db migrate && /entrypoint.sh run"
depends_on:
- plausible_db
- plausible_events_db
- mail
ports:
- "8000:8000"
environment:
- BASE_URL=http://localhost:8000
- SECRET_KEY_BASE=ChangeMeChangeMeChangeMeChangeMeChangeMeChangeMeChangeMeChangeMe
- DATABASE_URL=postgres://postgres:postgres@plausible_db:5432/plausible_db
- CLICKHOUSE_DATABASE_URL=http://plausible_events_db:8123/plausible_events_db
- MAILER_EMAIL=admin@example.com
- SMTP_HOST_ADDR=mail
- SMTP_HOST_PORT=25
- SMTP_USER_NAME=
- SMTP_USER_PWD=
- SMTP_SSL_Enabled=false
volumes:
- ./geoip:/geoip:ro
plausible_db:
image: postgres:14-alpine
container_name: plausible_db
restart: unless-stopped
volumes:
- plausible_db_data:/var/lib/postgresql/data
environment:
- POSTGRES_PASSWORD=postgres
- POSTGRES_DB=plausible_db
plausible_events_db:
image: clickhouse/clickhouse-server:24.3.3.102-alpine
container_name: plausible_events_db
restart: unless-stopped
volumes:
- plausible_events_data:/var/lib/clickhouse
- ./clickhouse/clickhouse-config.xml:/etc/clickhouse-server/config.d/logging.xml:ro
- ./clickhouse/clickhouse-user-config.xml:/etc/clickhouse-server/users.d/logging.xml:ro
ulimits:
nofile:
soft: 262144
hard: 262144
mail:
image: bytemark/smtp
container_name: plausible_mail
restart: unless-stopped
volumes:
plausible_db_data:
plausible_events_data:
```
## Let's Ship It
```bash
# Create a directory
mkdir -p /opt/plausible && cd /opt/plausible
# Create the docker-compose.yml (paste the config above)
nano docker-compose.yml
# Pull images and start
docker compose up -d
# Watch the logs
docker compose logs -f
```
## Environment Variables
| Variable | Default | Required |
|---|---|---|
| `BASE_URL` | `http://localhost:8000` | No |
| `SECRET_KEY_BASE` | `ChangeMeChangeMeChangeMeChangeMeChangeMeChangeMeChangeMeChangeMe` | No |
| `DATABASE_URL` | `postgres://postgres:postgres@plausible_db:5432/plausible_db` | No |
| `CLICKHOUSE_DATABASE_URL` | `http://plausible_events_db:8123/plausible_events_db` | No |
| `MAILER_EMAIL` | `admin@example.com` | No |
| `SMTP_HOST_ADDR` | `mail` | No |
| `SMTP_HOST_PORT` | `25` | No |
| `SMTP_SSL_Enabled` | `false` | No |
| `POSTGRES_PASSWORD` | `postgres` | No |
| `POSTGRES_DB` | `plausible_db` | No |
## Post-Deployment Checklist
- [ ] Service is accessible on the configured port
- [ ] Admin account created (if applicable)
- [ ] Reverse proxy configured ([Caddy guide](/concepts/reverse-proxies))
- [ ] SSL/HTTPS working
- [ ] Backup script set up ([backup guide](/concepts/backups))
- [ ] Uptime monitor added ([Uptime Kuma](/deploy/uptime-kuma))
## The "I Broke It" Section
**Container won't start?**
```bash
docker compose logs plausible | tail -50
```
**Port already in use?**
```bash
# Find what's using the port
lsof -i :PORT_NUMBER
```
**Need to start fresh?**
```bash
docker compose down -v # ⚠️ This deletes volumes/data!
docker compose up -d
```
## Going Further
- [Plausible on AltStack Directory](https://thealtstack.com/alternative-to/plausible)
- [Plausible Self-Hosted Guide](https://thealtstack.com/self-hosted/plausible)
- [Official Documentation](https://plausible.io)
- [GitHub Repository](https://github.com/plausible/analytics)

View File

@@ -0,0 +1,118 @@
---
title: "Deploy PocketBase Self-Hosted (Docker)"
description: "Step-by-step guide to self-hosting PocketBase with Docker Compose. "
---
# Deploy PocketBase
Open Source realtime backend in 1 file
<div className="deploy-hero">
<span className="deploy-hero-item">⭐ 56.0k stars</span>
<span className="deploy-hero-item">📜 MIT License</span>
<span className="deploy-hero-item">🔴 Advanced</span>
<span className="deploy-hero-item">⏱ ~20 minutes</span>
</div>
<div className="mt-8 mb-4">
<a
href="https://m.do.co/c/2ed27757a361"
target="_blank"
rel="noopener noreferrer"
className="flex items-center justify-center w-full px-6 py-4 text-lg font-bold text-white transition-all bg-blue-600 rounded-xl hover:bg-blue-700 hover:scale-[1.02] shadow-lg shadow-blue-500/30"
>
🚀 Deploy on DigitalOcean ($200 Free Credit)
</a>
</div>
## What You'll Get
A fully working PocketBase instance running on your server. Your data stays on your hardware — no third-party access, no usage limits, no surprise invoices.
## Prerequisites
- A server with Docker and Docker Compose installed ([setup guide](/quick-start/choosing-a-server))
- A domain name pointed to your server (optional but recommended)
- Basic terminal access (SSH)
## The Config
Create a directory for PocketBase and add this `docker-compose.yml`:
```yaml
# -------------------------------------------------------------------------
# 🚀 Created and distributed by The AltStack
# 🌍 https://thealtstack.com
# -------------------------------------------------------------------------
version: '3.8'
services:
pocketbase:
image: pocketbase/pocketbase:latest
container_name: pocketbase
restart: unless-stopped
command: serve --http=0.0.0.0:8090
ports:
- "8090:8090"
volumes:
- pb_data:/pb/pb_data
volumes:
pb_data:
```
## Let's Ship It
```bash
# Create a directory
mkdir -p /opt/pocketbase && cd /opt/pocketbase
# Create the docker-compose.yml (paste the config above)
nano docker-compose.yml
# Pull images and start
docker compose up -d
# Watch the logs
docker compose logs -f
```
## Post-Deployment Checklist
- [ ] Service is accessible on the configured port
- [ ] Admin account created (if applicable)
- [ ] Reverse proxy configured ([Caddy guide](/concepts/reverse-proxies))
- [ ] SSL/HTTPS working
- [ ] Backup script set up ([backup guide](/concepts/backups))
- [ ] Uptime monitor added ([Uptime Kuma](/deploy/uptime-kuma))
## The "I Broke It" Section
**Container won't start?**
```bash
docker compose logs pocketbase | tail -50
```
**Port already in use?**
```bash
# Find what's using the port
lsof -i :PORT_NUMBER
```
**Need to start fresh?**
```bash
docker compose down -v # ⚠️ This deletes volumes/data!
docker compose up -d
```
## Going Further
- [PocketBase on AltStack Directory](https://thealtstack.com/alternative-to/pocketbase)
- [PocketBase Self-Hosted Guide](https://thealtstack.com/self-hosted/pocketbase)
- [Official Documentation](https://pocketbase.io)
- [GitHub Repository](https://github.com/pocketbase/pocketbase)

View File

@@ -0,0 +1,112 @@
---
title: "Deploy Postal Self-Hosted (Docker)"
description: "Step-by-step guide to self-hosting Postal with Docker Compose. "
---
# Deploy Postal
A fully featured open source mail delivery platform for incoming & outgoing e-mail.
<div className="deploy-hero">
<span className="deploy-hero-item">⭐ 15.0k stars</span>
<span className="deploy-hero-item">📜 MIT</span>
<span className="deploy-hero-item">🔴 Advanced</span>
<span className="deploy-hero-item">⏱ ~20 minutes</span>
</div>
<div className="mt-8 mb-4">
<a
href="https://m.do.co/c/2ed27757a361"
target="_blank"
rel="noopener noreferrer"
className="flex items-center justify-center w-full px-6 py-4 text-lg font-bold text-white transition-all bg-blue-600 rounded-xl hover:bg-blue-700 hover:scale-[1.02] shadow-lg shadow-blue-500/30"
>
🚀 Deploy on DigitalOcean ($200 Free Credit)
</a>
</div>
## What You'll Get
A fully working Postal instance running on your server. Your data stays on your hardware — no third-party access, no usage limits, no surprise invoices.
## Prerequisites
- A server with Docker and Docker Compose installed ([setup guide](/quick-start/choosing-a-server))
- A domain name pointed to your server (optional but recommended)
- Basic terminal access (SSH)
## The Config
Create a directory for Postal and add this `docker-compose.yml`:
```yaml
# -------------------------------------------------------------------------
# 🚀 Created and distributed by The AltStack
# 🌍 https://thealtstack.com
# -------------------------------------------------------------------------
version: '3.8'
services:
postal:
image: postalserver/postal:latest
container_name: postal
restart: unless-stopped
ports:
- "5000:5000"
```
## Let's Ship It
```bash
# Create a directory
mkdir -p /opt/postal && cd /opt/postal
# Create the docker-compose.yml (paste the config above)
nano docker-compose.yml
# Pull images and start
docker compose up -d
# Watch the logs
docker compose logs -f
```
## Post-Deployment Checklist
- [ ] Service is accessible on the configured port
- [ ] Admin account created (if applicable)
- [ ] Reverse proxy configured ([Caddy guide](/concepts/reverse-proxies))
- [ ] SSL/HTTPS working
- [ ] Backup script set up ([backup guide](/concepts/backups))
- [ ] Uptime monitor added ([Uptime Kuma](/deploy/uptime-kuma))
## The "I Broke It" Section
**Container won't start?**
```bash
docker compose logs postal | tail -50
```
**Port already in use?**
```bash
# Find what's using the port
lsof -i :PORT_NUMBER
```
**Need to start fresh?**
```bash
docker compose down -v # ⚠️ This deletes volumes/data!
docker compose up -d
```
## Going Further
- [Postal on AltStack Directory](https://thealtstack.com/alternative-to/postal)
- [Postal Self-Hosted Guide](https://thealtstack.com/self-hosted/postal)
- [Official Documentation](https://postalserver.io)
- [GitHub Repository](https://github.com/postalserver/postal)

View File

@@ -0,0 +1,199 @@
---
title: "Deploy PostHog Self-Hosted (Docker)"
description: "Step-by-step guide to self-hosting PostHog with Docker Compose. "
---
# Deploy PostHog
🦔 PostHog is an all-in-one developer platform for building successful products. We offer product analytics, web analytics, session replay, error tracking, feature flags, experimentation, surveys, data warehouse, a CDP, and an AI product assistant to help debug your code, ship features faster, and keep all your usage and customer data in one stack.
<div className="deploy-hero">
<span className="deploy-hero-item">⭐ 31.2k stars</span>
<span className="deploy-hero-item">📜 Other</span>
<span className="deploy-hero-item">🔴 Advanced</span>
<span className="deploy-hero-item">⏱ ~20 minutes</span>
</div>
<div className="mt-8 mb-4">
<a
href="https://m.do.co/c/2ed27757a361"
target="_blank"
rel="noopener noreferrer"
className="flex items-center justify-center w-full px-6 py-4 text-lg font-bold text-white transition-all bg-blue-600 rounded-xl hover:bg-blue-700 hover:scale-[1.02] shadow-lg shadow-blue-500/30"
>
🚀 Deploy on DigitalOcean ($200 Free Credit)
</a>
</div>
## What You'll Get
A fully working PostHog instance running on your server. Your data stays on your hardware — no third-party access, no usage limits, no surprise invoices.
## Prerequisites
- A server with Docker and Docker Compose installed ([setup guide](/quick-start/choosing-a-server))
- A domain name pointed to your server (optional but recommended)
- Basic terminal access (SSH)
## The Config
Create a directory for PostHog and add this `docker-compose.yml`:
```yaml
# -------------------------------------------------------------------------
# 🚀 Created and distributed by The AltStack
# 🌍 https://thealtstack.com
# -------------------------------------------------------------------------
version: '3.8'
services:
db:
image: postgres:14-alpine
container_name: posthog-db
restart: unless-stopped
environment:
- POSTGRES_PASSWORD=posthog
- POSTGRES_DB=posthog
- POSTGRES_USER=posthog
volumes:
- posthog_postgres_data:/var/lib/postgresql/data
redis:
image: redis:6-alpine
container_name: posthog-redis
restart: unless-stopped
volumes:
- posthog_redis_data:/data
clickhouse:
image: clickhouse/clickhouse-server:22.3-alpine
container_name: posthog-clickhouse
restart: unless-stopped
environment:
- CLICKHOUSE_DB=posthog
- CLICKHOUSE_USER=default
- CLICKHOUSE_PASSWORD=
volumes:
- posthog_clickhouse_data:/var/lib/clickhouse
kafka:
image: confluentinc/cp-kafka:7.5.3
container_name: posthog-kafka
restart: unless-stopped
depends_on:
- zookeeper
environment:
- KAFKA_ZOOKEEPER_CONNECT=zookeeper:2181
- KAFKA_ADVERTISED_LISTENERS=PLAINTEXT://kafka:9092
- KAFKA_OFFSETS_TOPIC_REPLICATION_FACTOR=1
zookeeper:
image: confluentinc/cp-zookeeper:7.5.3
container_name: posthog-zookeeper
restart: unless-stopped
environment:
- ZOOKEEPER_CLIENT_PORT=2181
- ZOOKEEPER_TICK_TIME=2000
posthog:
image: posthog/posthog:release-1.40.0
container_name: posthog
restart: unless-stopped
depends_on:
- db
- redis
- clickhouse
- kafka
ports:
- "8000:8000"
environment:
- DATABASE_URL=postgres://posthog:posthog@db:5432/posthog
- REDIS_URL=redis://redis:6379/
- CLICKHOUSE_HOST=clickhouse
- KAFKA_HOSTS=kafka:9092
- SECRET_KEY=please-change-this-secret-key-in-production-12345
- SKIP_SERVICE_VERSION_REQUIREMENTS=1
volumes:
- ./uploads:/app/static/uploads
volumes:
posthog_postgres_data:
posthog_redis_data:
posthog_clickhouse_data:
```
## Let's Ship It
```bash
# Create a directory
mkdir -p /opt/posthog && cd /opt/posthog
# Create the docker-compose.yml (paste the config above)
nano docker-compose.yml
# Pull images and start
docker compose up -d
# Watch the logs
docker compose logs -f
```
## Environment Variables
| Variable | Default | Required |
|---|---|---|
| `POSTGRES_PASSWORD` | `posthog` | No |
| `POSTGRES_DB` | `posthog` | No |
| `POSTGRES_USER` | `posthog` | No |
| `CLICKHOUSE_DB` | `posthog` | No |
| `CLICKHOUSE_USER` | `default` | No |
| `KAFKA_ZOOKEEPER_CONNECT` | `zookeeper:2181` | No |
| `KAFKA_ADVERTISED_LISTENERS` | `PLAINTEXT://kafka:9092` | No |
| `KAFKA_OFFSETS_TOPIC_REPLICATION_FACTOR` | `1` | No |
| `ZOOKEEPER_CLIENT_PORT` | `2181` | No |
| `ZOOKEEPER_TICK_TIME` | `2000` | No |
| `DATABASE_URL` | `postgres://posthog:posthog@db:5432/posthog` | No |
| `REDIS_URL` | `redis://redis:6379/` | No |
| `CLICKHOUSE_HOST` | `clickhouse` | No |
| `KAFKA_HOSTS` | `kafka:9092` | No |
| `SECRET_KEY` | `please-change-this-secret-key-in-production-12345` | No |
| `SKIP_SERVICE_VERSION_REQUIREMENTS` | `1` | No |
## Post-Deployment Checklist
- [ ] Service is accessible on the configured port
- [ ] Admin account created (if applicable)
- [ ] Reverse proxy configured ([Caddy guide](/concepts/reverse-proxies))
- [ ] SSL/HTTPS working
- [ ] Backup script set up ([backup guide](/concepts/backups))
- [ ] Uptime monitor added ([Uptime Kuma](/deploy/uptime-kuma))
## The "I Broke It" Section
**Container won't start?**
```bash
docker compose logs posthog | tail -50
```
**Port already in use?**
```bash
# Find what's using the port
lsof -i :PORT_NUMBER
```
**Need to start fresh?**
```bash
docker compose down -v # ⚠️ This deletes volumes/data!
docker compose up -d
```
## Going Further
- [PostHog on AltStack Directory](https://thealtstack.com/alternative-to/posthog)
- [PostHog Self-Hosted Guide](https://thealtstack.com/self-hosted/posthog)
- [Official Documentation](https://posthog.com)
- [GitHub Repository](https://github.com/PostHog/posthog)

View File

@@ -0,0 +1,117 @@
---
title: "Deploy Qwen 2.5 Self-Hosted (Docker)"
description: "Step-by-step guide to self-hosting Qwen 2.5 with Docker Compose. "
---
# Deploy Qwen 2.5
Comprehensive LLM series from Alibaba Cloud, excelling in coding, math, and multilingual support.
<div className="deploy-hero">
<span className="deploy-hero-item">⭐ 50.0k stars</span>
<span className="deploy-hero-item">📜 Apache License 2.0</span>
<span className="deploy-hero-item">🔴 Advanced</span>
<span className="deploy-hero-item">⏱ ~20 minutes</span>
</div>
<div className="mt-8 mb-4">
<a
href="https://m.do.co/c/2ed27757a361"
target="_blank"
rel="noopener noreferrer"
className="flex items-center justify-center w-full px-6 py-4 text-lg font-bold text-white transition-all bg-blue-600 rounded-xl hover:bg-blue-700 hover:scale-[1.02] shadow-lg shadow-blue-500/30"
>
🚀 Deploy on DigitalOcean ($200 Free Credit)
</a>
</div>
## What You'll Get
A fully working Qwen 2.5 instance running on your server. Your data stays on your hardware — no third-party access, no usage limits, no surprise invoices.
## Prerequisites
- A server with Docker and Docker Compose installed ([setup guide](/quick-start/choosing-a-server))
- A domain name pointed to your server (optional but recommended)
- Basic terminal access (SSH)
## The Config
Create a directory for Qwen 2.5 and add this `docker-compose.yml`:
```yaml
# -------------------------------------------------------------------------
# 🚀 Created and distributed by The AltStack
# 🌍 https://thealtstack.com
# -------------------------------------------------------------------------
version: '3.8'
services:
ollama-qwen:
image: ollama/ollama:latest
container_name: ollama-qwen
restart: unless-stopped
ports:
- "11438:11434"
volumes:
- ollama_qwen:/root/.ollama
volumes:
ollama_qwen:
```
## Let's Ship It
```bash
# Create a directory
mkdir -p /opt/qwen && cd /opt/qwen
# Create the docker-compose.yml (paste the config above)
nano docker-compose.yml
# Pull images and start
docker compose up -d
# Watch the logs
docker compose logs -f
```
## Post-Deployment Checklist
- [ ] Service is accessible on the configured port
- [ ] Admin account created (if applicable)
- [ ] Reverse proxy configured ([Caddy guide](/concepts/reverse-proxies))
- [ ] SSL/HTTPS working
- [ ] Backup script set up ([backup guide](/concepts/backups))
- [ ] Uptime monitor added ([Uptime Kuma](/deploy/uptime-kuma))
## The "I Broke It" Section
**Container won't start?**
```bash
docker compose logs qwen | tail -50
```
**Port already in use?**
```bash
# Find what's using the port
lsof -i :PORT_NUMBER
```
**Need to start fresh?**
```bash
docker compose down -v # ⚠️ This deletes volumes/data!
docker compose up -d
```
## Going Further
- [Qwen 2.5 on AltStack Directory](https://thealtstack.com/alternative-to/qwen)
- [Qwen 2.5 Self-Hosted Guide](https://thealtstack.com/self-hosted/qwen)
- [Official Documentation](https://qwenlm.github.io)
- [GitHub Repository](https://github.com/QwenLM/Qwen2.5)

View File

@@ -0,0 +1,144 @@
---
title: "Deploy Rocket.Chat Self-Hosted (Docker)"
description: "Step-by-step guide to self-hosting Rocket.Chat with Docker Compose. "
---
# Deploy Rocket.Chat
The Secure CommsOS™ for mission-critical operations
<div className="deploy-hero">
<span className="deploy-hero-item">⭐ 44.5k stars</span>
<span className="deploy-hero-item">📜 Other</span>
<span className="deploy-hero-item">🔴 Advanced</span>
<span className="deploy-hero-item">⏱ ~20 minutes</span>
</div>
<div className="mt-8 mb-4">
<a
href="https://m.do.co/c/2ed27757a361"
target="_blank"
rel="noopener noreferrer"
className="flex items-center justify-center w-full px-6 py-4 text-lg font-bold text-white transition-all bg-blue-600 rounded-xl hover:bg-blue-700 hover:scale-[1.02] shadow-lg shadow-blue-500/30"
>
🚀 Deploy on DigitalOcean ($200 Free Credit)
</a>
</div>
## What You'll Get
A fully working Rocket.Chat instance running on your server. Your data stays on your hardware — no third-party access, no usage limits, no surprise invoices.
## Prerequisites
- A server with Docker and Docker Compose installed ([setup guide](/quick-start/choosing-a-server))
- A domain name pointed to your server (optional but recommended)
- Basic terminal access (SSH)
## The Config
Create a directory for Rocket.Chat and add this `docker-compose.yml`:
```yaml
# -------------------------------------------------------------------------
# 🚀 Created and distributed by The AltStack
# 🌍 https://thealtstack.com
# -------------------------------------------------------------------------
version: '3.8'
services:
rocketchat:
image: registry.rocket.chat/rocketchat/rocket.chat:latest
container_name: rocketchat
restart: unless-stopped
depends_on:
- mongo
ports:
- "3002:3000"
environment:
- MONGO_URL=mongodb://mongo:27017/rocketchat
- ROOT_URL=http://localhost:3002
- PORT=3000
mongo:
image: mongo:5.0
container_name: rocketchat-mongo
restart: unless-stopped
command: mongod --oplogSize 128 --replSet rs0 --storageEngine=wiredTiger
volumes:
- ./data/db:/data/db
mongo-init-replica:
image: mongo:5.0
container_name: mongo-init-replica
restart: unless-stopped
command: bash /init-replica.sh
depends_on:
- mongo
volumes:
- ./init-replica.sh:/init-replica.sh
```
## Let's Ship It
```bash
# Create a directory
mkdir -p /opt/rocketchat && cd /opt/rocketchat
# Create the docker-compose.yml (paste the config above)
nano docker-compose.yml
# Pull images and start
docker compose up -d
# Watch the logs
docker compose logs -f
```
## Environment Variables
| Variable | Default | Required |
|---|---|---|
| `MONGO_URL` | `mongodb://mongo:27017/rocketchat` | No |
| `ROOT_URL` | `http://localhost:3002` | No |
| `PORT` | `3000` | No |
| `storageEngine` | `wiredTiger` | No |
## Post-Deployment Checklist
- [ ] Service is accessible on the configured port
- [ ] Admin account created (if applicable)
- [ ] Reverse proxy configured ([Caddy guide](/concepts/reverse-proxies))
- [ ] SSL/HTTPS working
- [ ] Backup script set up ([backup guide](/concepts/backups))
- [ ] Uptime monitor added ([Uptime Kuma](/deploy/uptime-kuma))
## The "I Broke It" Section
**Container won't start?**
```bash
docker compose logs rocketchat | tail -50
```
**Port already in use?**
```bash
# Find what's using the port
lsof -i :PORT_NUMBER
```
**Need to start fresh?**
```bash
docker compose down -v # ⚠️ This deletes volumes/data!
docker compose up -d
```
## Going Further
- [Rocket.Chat on AltStack Directory](https://thealtstack.com/alternative-to/rocketchat)
- [Rocket.Chat Self-Hosted Guide](https://thealtstack.com/self-hosted/rocketchat)
- [Official Documentation](https://rocket.chat)
- [GitHub Repository](https://github.com/RocketChat/Rocket.Chat)

View File

@@ -0,0 +1,112 @@
---
title: "Deploy SigNoz Self-Hosted (Docker)"
description: "Step-by-step guide to self-hosting SigNoz with Docker Compose. "
---
# Deploy SigNoz
Open source observability platform. SigNoz helps developers monitor applications and troubleshoot problems.
<div className="deploy-hero">
<span className="deploy-hero-item">⭐ 18.0k stars</span>
<span className="deploy-hero-item">📜 MIT</span>
<span className="deploy-hero-item">🔴 Advanced</span>
<span className="deploy-hero-item">⏱ ~20 minutes</span>
</div>
<div className="mt-8 mb-4">
<a
href="https://m.do.co/c/2ed27757a361"
target="_blank"
rel="noopener noreferrer"
className="flex items-center justify-center w-full px-6 py-4 text-lg font-bold text-white transition-all bg-blue-600 rounded-xl hover:bg-blue-700 hover:scale-[1.02] shadow-lg shadow-blue-500/30"
>
🚀 Deploy on DigitalOcean ($200 Free Credit)
</a>
</div>
## What You'll Get
A fully working SigNoz instance running on your server. Your data stays on your hardware — no third-party access, no usage limits, no surprise invoices.
## Prerequisites
- A server with Docker and Docker Compose installed ([setup guide](/quick-start/choosing-a-server))
- A domain name pointed to your server (optional but recommended)
- Basic terminal access (SSH)
## The Config
Create a directory for SigNoz and add this `docker-compose.yml`:
```yaml
# -------------------------------------------------------------------------
# 🚀 Created and distributed by The AltStack
# 🌍 https://thealtstack.com
# -------------------------------------------------------------------------
version: '3.8'
services:
signoz-frontend:
image: signoz/frontend:latest
container_name: signoz-frontend
restart: unless-stopped
ports:
- "3301:3301"
```
## Let's Ship It
```bash
# Create a directory
mkdir -p /opt/signoz && cd /opt/signoz
# Create the docker-compose.yml (paste the config above)
nano docker-compose.yml
# Pull images and start
docker compose up -d
# Watch the logs
docker compose logs -f
```
## Post-Deployment Checklist
- [ ] Service is accessible on the configured port
- [ ] Admin account created (if applicable)
- [ ] Reverse proxy configured ([Caddy guide](/concepts/reverse-proxies))
- [ ] SSL/HTTPS working
- [ ] Backup script set up ([backup guide](/concepts/backups))
- [ ] Uptime monitor added ([Uptime Kuma](/deploy/uptime-kuma))
## The "I Broke It" Section
**Container won't start?**
```bash
docker compose logs signoz | tail -50
```
**Port already in use?**
```bash
# Find what's using the port
lsof -i :PORT_NUMBER
```
**Need to start fresh?**
```bash
docker compose down -v # ⚠️ This deletes volumes/data!
docker compose up -d
```
## Going Further
- [SigNoz on AltStack Directory](https://thealtstack.com/alternative-to/signoz)
- [SigNoz Self-Hosted Guide](https://thealtstack.com/self-hosted/signoz)
- [Official Documentation](https://signoz.io)
- [GitHub Repository](https://github.com/signoz/signoz)

View File

@@ -0,0 +1,112 @@
---
title: "Deploy Stable Diffusion 3.5 Self-Hosted (Docker)"
description: "Step-by-step guide to self-hosting Stable Diffusion 3.5 with Docker Compose. "
---
# Deploy Stable Diffusion 3.5
The latest open-weights image generation model from Stability AI, offering superior prompt adherence.
<div className="deploy-hero">
<span className="deploy-hero-item">⭐ 10.0k stars</span>
<span className="deploy-hero-item">📜 Stability Community License</span>
<span className="deploy-hero-item">🔴 Advanced</span>
<span className="deploy-hero-item">⏱ ~20 minutes</span>
</div>
<div className="mt-8 mb-4">
<a
href="https://m.do.co/c/2ed27757a361"
target="_blank"
rel="noopener noreferrer"
className="flex items-center justify-center w-full px-6 py-4 text-lg font-bold text-white transition-all bg-blue-600 rounded-xl hover:bg-blue-700 hover:scale-[1.02] shadow-lg shadow-blue-500/30"
>
🚀 Deploy on DigitalOcean ($200 Free Credit)
</a>
</div>
## What You'll Get
A fully working Stable Diffusion 3.5 instance running on your server. Your data stays on your hardware — no third-party access, no usage limits, no surprise invoices.
## Prerequisites
- A server with Docker and Docker Compose installed ([setup guide](/quick-start/choosing-a-server))
- A domain name pointed to your server (optional but recommended)
- Basic terminal access (SSH)
## The Config
Create a directory for Stable Diffusion 3.5 and add this `docker-compose.yml`:
```yaml
# -------------------------------------------------------------------------
# 🚀 Created and distributed by The AltStack
# 🌍 https://thealtstack.com
# -------------------------------------------------------------------------
version: '3.8'
services:
sd-webui:
image: automatic1111/stable-diffusion-webui:latest
container_name: sd-webui
restart: unless-stopped
ports:
- "7860:7860"
```
## Let's Ship It
```bash
# Create a directory
mkdir -p /opt/stable-diffusion && cd /opt/stable-diffusion
# Create the docker-compose.yml (paste the config above)
nano docker-compose.yml
# Pull images and start
docker compose up -d
# Watch the logs
docker compose logs -f
```
## Post-Deployment Checklist
- [ ] Service is accessible on the configured port
- [ ] Admin account created (if applicable)
- [ ] Reverse proxy configured ([Caddy guide](/concepts/reverse-proxies))
- [ ] SSL/HTTPS working
- [ ] Backup script set up ([backup guide](/concepts/backups))
- [ ] Uptime monitor added ([Uptime Kuma](/deploy/uptime-kuma))
## The "I Broke It" Section
**Container won't start?**
```bash
docker compose logs stable-diffusion | tail -50
```
**Port already in use?**
```bash
# Find what's using the port
lsof -i :PORT_NUMBER
```
**Need to start fresh?**
```bash
docker compose down -v # ⚠️ This deletes volumes/data!
docker compose up -d
```
## Going Further
- [Stable Diffusion 3.5 on AltStack Directory](https://thealtstack.com/alternative-to/stable-diffusion)
- [Stable Diffusion 3.5 Self-Hosted Guide](https://thealtstack.com/self-hosted/stable-diffusion)
- [Official Documentation](https://stability.ai)
- [GitHub Repository](https://github.com/Stability-AI/sd3.5)

View File

@@ -0,0 +1,208 @@
---
title: "Deploy Supabase Self-Hosted (Docker)"
description: "Step-by-step guide to self-hosting Supabase with Docker Compose. "
---
# Deploy Supabase
The Postgres development platform. Supabase gives you a dedicated Postgres database to build your web, mobile, and AI applications.
<div className="deploy-hero">
<span className="deploy-hero-item">⭐ 97.4k stars</span>
<span className="deploy-hero-item">📜 Apache License 2.0</span>
<span className="deploy-hero-item">🔴 Advanced</span>
<span className="deploy-hero-item">⏱ ~20 minutes</span>
</div>
<div className="mt-8 mb-4">
<a
href="https://m.do.co/c/2ed27757a361"
target="_blank"
rel="noopener noreferrer"
className="flex items-center justify-center w-full px-6 py-4 text-lg font-bold text-white transition-all bg-blue-600 rounded-xl hover:bg-blue-700 hover:scale-[1.02] shadow-lg shadow-blue-500/30"
>
🚀 Deploy on DigitalOcean ($200 Free Credit)
</a>
</div>
A fully working Supabase instance running on your server. This isn't just a database; it's a full backend-as-a-service including:
- **PostgreSQL:** The world's most advanced relational database.
- **GoTrue:** User management and JWT-based authentication.
- **PostgREST:** Turns your database into a RESTful API automatically.
- **Realtime:** Listen to database changes via WebSockets.
- **Storage:** S3-compatible file storage.
> ⚠️ **Critical Security Note:** The default configuration uses "postgres" as the password and a temporary JWT secret. You MUST change these in your `.env` file before exposing this to the internet.
## Prerequisites
- A server with Docker and Docker Compose installed ([setup guide](/quick-start/choosing-a-server))
- A domain name pointed to your server (optional but recommended)
- Basic terminal access (SSH)
## The Config
Create a directory for Supabase and add this `docker-compose.yml`:
```yaml
# -------------------------------------------------------------------------
# 🚀 Created and distributed by The AltStack
# 🌍 https://thealtstack.com
# -------------------------------------------------------------------------
# Supabase Production-Ready Docker Compose
# Note: Supabase is a collection of services. Official images are the standard.
# This setup includes the core services: PostgREST, GoTrue, Realtime, Storage, and PostgreSQL.
version: '3.8'
services:
db:
container_name: supabase-db
image: supabase/postgres:15.1.1.78
command: postgres -c config_file=/etc/postgresql/postgresql.conf -c log_min_messages=fatal
healthcheck:
test: ["CMD", "pg_isready", "-U", "postgres"]
interval: 5s
timeout: 5s
retries: 3
environment:
POSTGRES_PASSWORD: ${POSTGRES_PASSWORD:-postgres}
PGDATA: /var/lib/postgresql/data/pgdata
volumes:
- supabase_db_data:/var/lib/postgresql/data
networks:
- supabase_net
auth:
container_name: supabase-auth
image: supabase/gotrue:v2.143.0
depends_on:
db:
condition: service_healthy
healthcheck:
test: ["CMD", "curl", "-f", "http://localhost:9999/health"]
interval: 5s
timeout: 5s
retries: 3
environment:
GOTRUE_DB_DRIVER: postgres
GOTRUE_DB_DATABASE_URL: postgres://postgres:${POSTGRES_PASSWORD:-postgres}@db:5432/postgres?sslmode=disable
GOTRUE_SITE_URL: ${SITE_URL:-http://localhost:3000}
GOTRUE_JWT_SECRET: ${JWT_SECRET:-super-secret-jwt-token-don-not-use-in-prod}
networks:
- supabase_net
rest:
container_name: supabase-rest
image: postgrest/postgrest:v11.2.2
depends_on:
db:
condition: service_healthy
environment:
PGRST_DB_URI: postgres://postgres:${POSTGRES_PASSWORD:-postgres}@db:5432/postgres
PGRST_DB_SCHEMA: public
PGRST_DB_ANON_ROLE: anon
networks:
- supabase_net
realtime:
container_name: supabase-realtime
image: supabase/realtime:v2.25.56
depends_on:
db:
condition: service_healthy
environment:
DB_HOST: db
DB_PASSWORD: ${POSTGRES_PASSWORD:-postgres}
JWT_SECRET: ${JWT_SECRET:-super-secret-jwt-token-don-not-use-in-prod}
networks:
- supabase_net
storage:
container_name: supabase-storage
image: supabase/storage-api:v0.43.12
depends_on:
db:
condition: service_healthy
environment:
ANON_KEY: ${ANON_KEY}
SERVICE_KEY: ${SERVICE_KEY}
PGRST_JWT_SECRET: ${JWT_SECRET:-super-secret-jwt-token-don-not-use-in-prod}
DATABASE_URL: postgres://postgres:${POSTGRES_PASSWORD:-postgres}@db:5432/postgres
networks:
- supabase_net
networks:
supabase_net:
driver: bridge
volumes:
supabase_db_data:
name: supabase_db_data
```
## Let's Ship It
```bash
# Create a directory
mkdir -p /opt/supabase && cd /opt/supabase
# Create the docker-compose.yml (paste the config above)
nano docker-compose.yml
# Pull images and start
docker compose up -d
# Watch the logs
docker compose logs -f
```
## Environment Variables
| Variable | Default | Required |
|---|---|---|
| `POSTGRES_PASSWORD` | `postgres` | No |
| `SITE_URL` | `http://localhost:3000` | No |
| `JWT_SECRET` | `super-secret-jwt-token-don-not-use-in-prod` | No |
| `ANON_KEY` | `—` | ✅ Yes |
| `SERVICE_KEY` | `—` | ✅ Yes |
## Post-Deployment Checklist
- [ ] Service is accessible on the configured port
- [ ] Admin account created (if applicable)
- [ ] Reverse proxy configured ([Caddy guide](/concepts/reverse-proxies))
- [ ] SSL/HTTPS working
- [ ] Backup script set up ([backup guide](/concepts/backups))
- [ ] Uptime monitor added ([Uptime Kuma](/deploy/uptime-kuma))
## The "I Broke It" Section
**Container won't start?**
```bash
docker compose logs supabase | tail -50
```
**Port already in use?**
```bash
# Find what's using the port
lsof -i :PORT_NUMBER
```
**Need to start fresh?**
```bash
docker compose down -v # ⚠️ This deletes volumes/data!
docker compose up -d
```
## Going Further
- [Supabase on AltStack Directory](https://thealtstack.com/alternative-to/supabase)
- [Supabase Self-Hosted Guide](https://thealtstack.com/self-hosted/supabase)
- [Official Documentation](https://supabase.com)
- [GitHub Repository](https://github.com/supabase/supabase)

View File

@@ -0,0 +1,171 @@
---
title: "Deploy Apache Superset Self-Hosted (Docker)"
description: "Step-by-step guide to self-hosting Apache Superset with Docker Compose. "
---
# Deploy Apache Superset
Enterprise-ready business intelligence web application.
<div className="deploy-hero">
<span className="deploy-hero-item">⭐ 59.0k stars</span>
<span className="deploy-hero-item">📜 Apache 2.0</span>
<span className="deploy-hero-item">🔴 Advanced</span>
<span className="deploy-hero-item">⏱ ~20 minutes</span>
</div>
<div className="mt-8 mb-4">
<a
href="https://m.do.co/c/2ed27757a361"
target="_blank"
rel="noopener noreferrer"
className="flex items-center justify-center w-full px-6 py-4 text-lg font-bold text-white transition-all bg-blue-600 rounded-xl hover:bg-blue-700 hover:scale-[1.02] shadow-lg shadow-blue-500/30"
>
🚀 Deploy on DigitalOcean ($200 Free Credit)
</a>
</div>
## What You'll Get
A fully working Apache Superset instance running on your server. Your data stays on your hardware — no third-party access, no usage limits, no surprise invoices.
## Prerequisites
- A server with Docker and Docker Compose installed ([setup guide](/quick-start/choosing-a-server))
- A domain name pointed to your server (optional but recommended)
- Basic terminal access (SSH)
## The Config
Create a directory for Apache Superset and add this `docker-compose.yml`:
```yaml
# -------------------------------------------------------------------------
# 🚀 Created and distributed by The AltStack
# 🌍 https://thealtstack.com
# -------------------------------------------------------------------------
# Docker Compose for Apache Superset
version: '3.8'
services:
superset:
build:
context: .
dockerfile: Dockerfile
container_name: superset
ports:
- "8088:8088"
environment:
- DATABASE_URL=postgresql://superset:superset@db:5432/superset
- REDIS_URL=redis://redis:6379
depends_on:
db:
condition: service_healthy
redis:
condition: service_healthy
networks:
- superset_net
healthcheck:
test: [ "CMD", "curl", "-f", "http://localhost:8088/health" ]
interval: 30s
timeout: 10s
retries: 3
db:
image: postgres:15-alpine
container_name: superset-db
environment:
POSTGRES_USER: superset
POSTGRES_PASSWORD: superset
POSTGRES_DB: superset
volumes:
- superset_db_data:/var/lib/postgresql/data
networks:
- superset_net
healthcheck:
test: [ "CMD-SHELL", "pg_isready -U superset" ]
interval: 5s
timeout: 5s
retries: 5
redis:
image: redis:7-alpine
container_name: superset-redis
networks:
- superset_net
healthcheck:
test: [ "CMD", "redis-cli", "ping" ]
interval: 5s
timeout: 5s
retries: 5
networks:
superset_net:
driver: bridge
volumes:
superset_db_data:
name: superset_db_data
```
## Let's Ship It
```bash
# Create a directory
mkdir -p /opt/superset && cd /opt/superset
# Create the docker-compose.yml (paste the config above)
nano docker-compose.yml
# Pull images and start
docker compose up -d
# Watch the logs
docker compose logs -f
```
## Environment Variables
| Variable | Default | Required |
|---|---|---|
| `DATABASE_URL` | `postgresql://superset:superset@db:5432/superset` | No |
| `REDIS_URL` | `redis://redis:6379` | No |
## Post-Deployment Checklist
- [ ] Service is accessible on the configured port
- [ ] Admin account created (if applicable)
- [ ] Reverse proxy configured ([Caddy guide](/concepts/reverse-proxies))
- [ ] SSL/HTTPS working
- [ ] Backup script set up ([backup guide](/concepts/backups))
- [ ] Uptime monitor added ([Uptime Kuma](/deploy/uptime-kuma))
## The "I Broke It" Section
**Container won't start?**
```bash
docker compose logs superset | tail -50
```
**Port already in use?**
```bash
# Find what's using the port
lsof -i :PORT_NUMBER
```
**Need to start fresh?**
```bash
docker compose down -v # ⚠️ This deletes volumes/data!
docker compose up -d
```
## Going Further
- [Apache Superset on AltStack Directory](https://thealtstack.com/alternative-to/superset)
- [Apache Superset Self-Hosted Guide](https://thealtstack.com/self-hosted/superset)
- [Official Documentation](https://superset.apache.org)
- [GitHub Repository](https://github.com/apache/superset)

View File

@@ -0,0 +1,117 @@
---
title: "Deploy TabbyML Self-Hosted (Docker)"
description: "Step-by-step guide to self-hosting TabbyML with Docker Compose. "
---
# Deploy TabbyML
Self-hosted AI coding assistant. An open-source, self-hosted alternative to GitHub Copilot.
<div className="deploy-hero">
<span className="deploy-hero-item">⭐ 25.0k stars</span>
<span className="deploy-hero-item">📜 Apache License 2.0</span>
<span className="deploy-hero-item">🔴 Advanced</span>
<span className="deploy-hero-item">⏱ ~20 minutes</span>
</div>
<div className="mt-8 mb-4">
<a
href="https://m.do.co/c/2ed27757a361"
target="_blank"
rel="noopener noreferrer"
className="flex items-center justify-center w-full px-6 py-4 text-lg font-bold text-white transition-all bg-blue-600 rounded-xl hover:bg-blue-700 hover:scale-[1.02] shadow-lg shadow-blue-500/30"
>
🚀 Deploy on DigitalOcean ($200 Free Credit)
</a>
</div>
## What You'll Get
A fully working TabbyML instance running on your server. Your data stays on your hardware — no third-party access, no usage limits, no surprise invoices.
## Prerequisites
- A server with Docker and Docker Compose installed ([setup guide](/quick-start/choosing-a-server))
- A domain name pointed to your server (optional but recommended)
- Basic terminal access (SSH)
## The Config
Create a directory for TabbyML and add this `docker-compose.yml`:
```yaml
# -------------------------------------------------------------------------
# 🚀 Created and distributed by The AltStack
# 🌍 https://thealtstack.com
# -------------------------------------------------------------------------
version: '3.8'
services:
tabby:
image: tabbyml/tabby:latest
container_name: tabby
restart: unless-stopped
ports:
- "8080:8080"
volumes:
- tabby-data:/data
volumes:
tabby-data:
```
## Let's Ship It
```bash
# Create a directory
mkdir -p /opt/tabby && cd /opt/tabby
# Create the docker-compose.yml (paste the config above)
nano docker-compose.yml
# Pull images and start
docker compose up -d
# Watch the logs
docker compose logs -f
```
## Post-Deployment Checklist
- [ ] Service is accessible on the configured port
- [ ] Admin account created (if applicable)
- [ ] Reverse proxy configured ([Caddy guide](/concepts/reverse-proxies))
- [ ] SSL/HTTPS working
- [ ] Backup script set up ([backup guide](/concepts/backups))
- [ ] Uptime monitor added ([Uptime Kuma](/deploy/uptime-kuma))
## The "I Broke It" Section
**Container won't start?**
```bash
docker compose logs tabby | tail -50
```
**Port already in use?**
```bash
# Find what's using the port
lsof -i :PORT_NUMBER
```
**Need to start fresh?**
```bash
docker compose down -v # ⚠️ This deletes volumes/data!
docker compose up -d
```
## Going Further
- [TabbyML on AltStack Directory](https://thealtstack.com/alternative-to/tabby)
- [TabbyML Self-Hosted Guide](https://thealtstack.com/self-hosted/tabby)
- [Official Documentation](https://tabby.tabbyml.com)
- [GitHub Repository](https://github.com/TabbyML/tabby)

View File

@@ -0,0 +1,172 @@
---
title: "Deploy Taiga Self-Hosted (Docker)"
description: "Step-by-step guide to self-hosting Taiga with Docker Compose. "
---
# Deploy Taiga
Self-host Taiga on your own server.
<div className="deploy-hero">
<span className="deploy-hero-item">⭐ 0.8k stars</span>
<span className="deploy-hero-item">📜 Mozilla Public License 2.0</span>
<span className="deploy-hero-item">🔴 Advanced</span>
<span className="deploy-hero-item">⏱ ~20 minutes</span>
</div>
<div className="mt-8 mb-4">
<a
href="https://m.do.co/c/2ed27757a361"
target="_blank"
rel="noopener noreferrer"
className="flex items-center justify-center w-full px-6 py-4 text-lg font-bold text-white transition-all bg-blue-600 rounded-xl hover:bg-blue-700 hover:scale-[1.02] shadow-lg shadow-blue-500/30"
>
🚀 Deploy on DigitalOcean ($200 Free Credit)
</a>
</div>
## What You'll Get
A fully working Taiga instance running on your server. Your data stays on your hardware — no third-party access, no usage limits, no surprise invoices.
## Prerequisites
- A server with Docker and Docker Compose installed ([setup guide](/quick-start/choosing-a-server))
- A domain name pointed to your server (optional but recommended)
- Basic terminal access (SSH)
## The Config
Create a directory for Taiga and add this `docker-compose.yml`:
```yaml
# -------------------------------------------------------------------------
# 🚀 Created and distributed by The AltStack
# 🌍 https://thealtstack.com
# -------------------------------------------------------------------------
version: '3.8'
services:
taiga-front:
image: taigaio/taiga-front:latest
container_name: taiga-front
restart: unless-stopped
depends_on:
- taiga-back
ports:
- "9000:80"
environment:
- TAIGA_URL=http://localhost:9000
- TAIGA_WEBSOCKETS_URL=ws://localhost:9000
taiga-back:
image: taigaio/taiga-back:latest
container_name: taiga-back
restart: unless-stopped
depends_on:
- taiga-db
- taiga-redis
- taiga-async-rabbitmq
environment:
- POSTGRES_DB=taiga
- POSTGRES_USER=taiga
- POSTGRES_PASSWORD=taiga
- TAIGA_SECRET_KEY=exe3quu8Su2wohx0uNgo0eif4wohphah
taiga-db:
image: postgres:13-alpine
container_name: taiga-db
restart: unless-stopped
environment:
- POSTGRES_DB=taiga
- POSTGRES_USER=taiga
- POSTGRES_PASSWORD=taiga
volumes:
- taiga_db_data:/var/lib/postgresql/data
taiga-async-rabbitmq:
image: rabbitmq:3.8-management-alpine
container_name: taiga-rabbitmq
restart: unless-stopped
environment:
- RABBITMQ_ERLANG_COOKIE=secret-cookie
- RABBITMQ_DEFAULT_USER=taiga
- RABBITMQ_DEFAULT_PASS=taiga
taiga-redis:
image: redis:6-alpine
container_name: taiga-redis
restart: unless-stopped
volumes:
taiga_db_data:
```
## Let's Ship It
```bash
# Create a directory
mkdir -p /opt/taiga && cd /opt/taiga
# Create the docker-compose.yml (paste the config above)
nano docker-compose.yml
# Pull images and start
docker compose up -d
# Watch the logs
docker compose logs -f
```
## Environment Variables
| Variable | Default | Required |
|---|---|---|
| `TAIGA_URL` | `http://localhost:9000` | No |
| `TAIGA_WEBSOCKETS_URL` | `ws://localhost:9000` | No |
| `POSTGRES_DB` | `taiga` | No |
| `POSTGRES_USER` | `taiga` | No |
| `POSTGRES_PASSWORD` | `taiga` | No |
| `TAIGA_SECRET_KEY` | `exe3quu8Su2wohx0uNgo0eif4wohphah` | No |
| `RABBITMQ_ERLANG_COOKIE` | `secret-cookie` | No |
| `RABBITMQ_DEFAULT_USER` | `taiga` | No |
| `RABBITMQ_DEFAULT_PASS` | `taiga` | No |
## Post-Deployment Checklist
- [ ] Service is accessible on the configured port
- [ ] Admin account created (if applicable)
- [ ] Reverse proxy configured ([Caddy guide](/concepts/reverse-proxies))
- [ ] SSL/HTTPS working
- [ ] Backup script set up ([backup guide](/concepts/backups))
- [ ] Uptime monitor added ([Uptime Kuma](/deploy/uptime-kuma))
## The "I Broke It" Section
**Container won't start?**
```bash
docker compose logs taiga | tail -50
```
**Port already in use?**
```bash
# Find what's using the port
lsof -i :PORT_NUMBER
```
**Need to start fresh?**
```bash
docker compose down -v # ⚠️ This deletes volumes/data!
docker compose up -d
```
## Going Further
- [Taiga on AltStack Directory](https://thealtstack.com/alternative-to/taiga)
- [Taiga Self-Hosted Guide](https://thealtstack.com/self-hosted/taiga)
- [Official Documentation](https://taiga.io)
- [GitHub Repository](https://github.com/taigaio/taiga-back)

View File

@@ -0,0 +1,140 @@
---
title: "Deploy Twenty Self-Hosted (Docker)"
description: "Step-by-step guide to self-hosting Twenty with Docker Compose. "
---
# Deploy Twenty
A modern open-source CRM alternative to Salesforce and Pipedrive.
<div className="deploy-hero">
<span className="deploy-hero-item">⭐ 15.0k stars</span>
<span className="deploy-hero-item">📜 AGPL-3.0</span>
<span className="deploy-hero-item">🔴 Advanced</span>
<span className="deploy-hero-item">⏱ ~20 minutes</span>
</div>
<div className="mt-8 mb-4">
<a
href="https://m.do.co/c/2ed27757a361"
target="_blank"
rel="noopener noreferrer"
className="flex items-center justify-center w-full px-6 py-4 text-lg font-bold text-white transition-all bg-blue-600 rounded-xl hover:bg-blue-700 hover:scale-[1.02] shadow-lg shadow-blue-500/30"
>
🚀 Deploy on DigitalOcean ($200 Free Credit)
</a>
</div>
## What You'll Get
A fully working Twenty instance running on your server. Your data stays on your hardware — no third-party access, no usage limits, no surprise invoices.
## Prerequisites
- A server with Docker and Docker Compose installed ([setup guide](/quick-start/choosing-a-server))
- A domain name pointed to your server (optional but recommended)
- Basic terminal access (SSH)
## The Config
Create a directory for Twenty and add this `docker-compose.yml`:
```yaml
# -------------------------------------------------------------------------
# 🚀 Created and distributed by The AltStack
# 🌍 https://thealtstack.com
# -------------------------------------------------------------------------
version: '3.8'
services:
twenty:
image: twentyhq/twenty:latest
container_name: twenty
restart: unless-stopped
depends_on:
- db
ports:
- "3000:3000"
environment:
- PG_DATABASE_URL=postgres://twenty:twenty@db:5432/twenty
- FRONTEND_URL=http://localhost:3000
db:
image: postgres:15-alpine
container_name: twenty-db
restart: unless-stopped
environment:
- POSTGRES_USER=twenty
- POSTGRES_PASSWORD=twenty
- POSTGRES_DB=twenty
volumes:
- twenty_db_data:/var/lib/postgresql/data
volumes:
twenty_db_data:
```
## Let's Ship It
```bash
# Create a directory
mkdir -p /opt/twenty && cd /opt/twenty
# Create the docker-compose.yml (paste the config above)
nano docker-compose.yml
# Pull images and start
docker compose up -d
# Watch the logs
docker compose logs -f
```
## Environment Variables
| Variable | Default | Required |
|---|---|---|
| `PG_DATABASE_URL` | `postgres://twenty:twenty@db:5432/twenty` | No |
| `FRONTEND_URL` | `http://localhost:3000` | No |
| `POSTGRES_USER` | `twenty` | No |
| `POSTGRES_PASSWORD` | `twenty` | No |
| `POSTGRES_DB` | `twenty` | No |
## Post-Deployment Checklist
- [ ] Service is accessible on the configured port
- [ ] Admin account created (if applicable)
- [ ] Reverse proxy configured ([Caddy guide](/concepts/reverse-proxies))
- [ ] SSL/HTTPS working
- [ ] Backup script set up ([backup guide](/concepts/backups))
- [ ] Uptime monitor added ([Uptime Kuma](/deploy/uptime-kuma))
## The "I Broke It" Section
**Container won't start?**
```bash
docker compose logs twenty | tail -50
```
**Port already in use?**
```bash
# Find what's using the port
lsof -i :PORT_NUMBER
```
**Need to start fresh?**
```bash
docker compose down -v # ⚠️ This deletes volumes/data!
docker compose up -d
```
## Going Further
- [Twenty on AltStack Directory](https://thealtstack.com/alternative-to/twenty)
- [Twenty Self-Hosted Guide](https://thealtstack.com/self-hosted/twenty)
- [Official Documentation](https://twenty.com)
- [GitHub Repository](https://github.com/twentyhq/twenty)

View File

@@ -0,0 +1,130 @@
---
title: "Deploy Uptime Kuma Self-Hosted (Docker)"
description: "Step-by-step guide to self-hosting Uptime Kuma with Docker Compose. "
---
# Deploy Uptime Kuma
A fancy self-hosted monitoring tool.
<div className="deploy-hero">
<span className="deploy-hero-item">⭐ 55.0k stars</span>
<span className="deploy-hero-item">📜 MIT</span>
<span className="deploy-hero-item">🔴 Advanced</span>
<span className="deploy-hero-item">⏱ ~20 minutes</span>
</div>
<div className="mt-8 mb-4">
<a
href="https://m.do.co/c/2ed27757a361"
target="_blank"
rel="noopener noreferrer"
className="flex items-center justify-center w-full px-6 py-4 text-lg font-bold text-white transition-all bg-blue-600 rounded-xl hover:bg-blue-700 hover:scale-[1.02] shadow-lg shadow-blue-500/30"
>
🚀 Deploy on DigitalOcean ($200 Free Credit)
</a>
</div>
## What You'll Get
A fully working Uptime Kuma instance running on your server. Your data stays on your hardware — no third-party access, no usage limits, no surprise invoices.
## Prerequisites
- A server with Docker and Docker Compose installed ([setup guide](/quick-start/choosing-a-server))
- A domain name pointed to your server (optional but recommended)
- Basic terminal access (SSH)
## The Config
Create a directory for Uptime Kuma and add this `docker-compose.yml`:
```yaml
# -------------------------------------------------------------------------
# 🚀 Created and distributed by The AltStack
# 🌍 https://thealtstack.com
# -------------------------------------------------------------------------
# Docker Compose for Uptime Kuma
version: '3.8'
services:
uptime-kuma:
image: louislam/uptime-kuma:1 # Official image is standard
container_name: uptime-kuma
ports:
- "3001:3001"
volumes:
- uptime_kuma_data:/app/data
networks:
- uptime_net
healthcheck:
test: [ "CMD", "curl", "-f", "http://localhost:3001/" ]
interval: 30s
timeout: 10s
retries: 3
restart: unless-stopped
networks:
uptime_net:
driver: bridge
volumes:
uptime_kuma_data:
name: uptime_kuma_data
```
## Let's Ship It
```bash
# Create a directory
mkdir -p /opt/uptime-kuma && cd /opt/uptime-kuma
# Create the docker-compose.yml (paste the config above)
nano docker-compose.yml
# Pull images and start
docker compose up -d
# Watch the logs
docker compose logs -f
```
## Post-Deployment Checklist
- [ ] Service is accessible on the configured port
- [ ] Admin account created (if applicable)
- [ ] Reverse proxy configured ([Caddy guide](/concepts/reverse-proxies))
- [ ] SSL/HTTPS working
- [ ] Backup script set up ([backup guide](/concepts/backups))
- [ ] Uptime monitor added ([Uptime Kuma](/deploy/uptime-kuma))
## The "I Broke It" Section
**Container won't start?**
```bash
docker compose logs uptime-kuma | tail -50
```
**Port already in use?**
```bash
# Find what's using the port
lsof -i :PORT_NUMBER
```
**Need to start fresh?**
```bash
docker compose down -v # ⚠️ This deletes volumes/data!
docker compose up -d
```
## Going Further
- [Uptime Kuma on AltStack Directory](https://thealtstack.com/alternative-to/uptime-kuma)
- [Uptime Kuma Self-Hosted Guide](https://thealtstack.com/self-hosted/uptime-kuma)
- [Official Documentation](https://uptime.kuma.pet)
- [GitHub Repository](https://github.com/louislam/uptime-kuma)

View File

@@ -0,0 +1,126 @@
---
title: "Deploy Vaultwarden Self-Hosted (Docker)"
description: "Step-by-step guide to self-hosting Vaultwarden with Docker Compose. "
---
# Deploy Vaultwarden
Unofficial Bitwarden compatible server written in Rust, formerly known as bitwarden_rs.
<div className="deploy-hero">
<span className="deploy-hero-item">⭐ 32.0k stars</span>
<span className="deploy-hero-item">📜 AGPL-3.0</span>
<span className="deploy-hero-item">🔴 Advanced</span>
<span className="deploy-hero-item">⏱ ~20 minutes</span>
</div>
<div className="mt-8 mb-4">
<a
href="https://m.do.co/c/2ed27757a361"
target="_blank"
rel="noopener noreferrer"
className="flex items-center justify-center w-full px-6 py-4 text-lg font-bold text-white transition-all bg-blue-600 rounded-xl hover:bg-blue-700 hover:scale-[1.02] shadow-lg shadow-blue-500/30"
>
🚀 Deploy on DigitalOcean ($200 Free Credit)
</a>
</div>
## What You'll Get
A fully working Vaultwarden instance running on your server. Your data stays on your hardware — no third-party access, no usage limits, no surprise invoices.
## Prerequisites
- A server with Docker and Docker Compose installed ([setup guide](/quick-start/choosing-a-server))
- A domain name pointed to your server (optional but recommended)
- Basic terminal access (SSH)
## The Config
Create a directory for Vaultwarden and add this `docker-compose.yml`:
```yaml
# -------------------------------------------------------------------------
# 🚀 Created and distributed by The AltStack
# 🌍 https://thealtstack.com
# -------------------------------------------------------------------------
version: '3.8'
services:
vaultwarden:
image: vaultwarden/server:latest
container_name: vaultwarden
restart: unless-stopped
ports:
- "8080:80"
volumes:
- vw-data:/data
environment:
- WEBSOCKET_ENABLED=true
- SIGNUPS_ALLOWED=true
volumes:
vw-data:
```
## Let's Ship It
```bash
# Create a directory
mkdir -p /opt/vaultwarden && cd /opt/vaultwarden
# Create the docker-compose.yml (paste the config above)
nano docker-compose.yml
# Pull images and start
docker compose up -d
# Watch the logs
docker compose logs -f
```
## Environment Variables
| Variable | Default | Required |
|---|---|---|
| `WEBSOCKET_ENABLED` | `true` | No |
| `SIGNUPS_ALLOWED` | `true` | No |
## Post-Deployment Checklist
- [ ] Service is accessible on the configured port
- [ ] Admin account created (if applicable)
- [ ] Reverse proxy configured ([Caddy guide](/concepts/reverse-proxies))
- [ ] SSL/HTTPS working
- [ ] Backup script set up ([backup guide](/concepts/backups))
- [ ] Uptime monitor added ([Uptime Kuma](/deploy/uptime-kuma))
## The "I Broke It" Section
**Container won't start?**
```bash
docker compose logs vaultwarden | tail -50
```
**Port already in use?**
```bash
# Find what's using the port
lsof -i :PORT_NUMBER
```
**Need to start fresh?**
```bash
docker compose down -v # ⚠️ This deletes volumes/data!
docker compose up -d
```
## Going Further
- [Vaultwarden on AltStack Directory](https://thealtstack.com/alternative-to/vaultwarden)
- [Vaultwarden Self-Hosted Guide](https://thealtstack.com/self-hosted/vaultwarden)
- [Official Documentation](https://github.com/dani-garcia/vaultwarden)
- [GitHub Repository](https://github.com/dani-garcia/vaultwarden)

View File

@@ -0,0 +1,142 @@
---
title: "Deploy Zammad Self-Hosted (Docker)"
description: "Step-by-step guide to self-hosting Zammad with Docker Compose. "
---
# Deploy Zammad
A web-based, open source helpdesk/customer support system with many features.
<div className="deploy-hero">
<span className="deploy-hero-item">⭐ 5.0k stars</span>
<span className="deploy-hero-item">📜 AGPLv3</span>
<span className="deploy-hero-item">🔴 Advanced</span>
<span className="deploy-hero-item">⏱ ~20 minutes</span>
</div>
<div className="mt-8 mb-4">
<a
href="https://m.do.co/c/2ed27757a361"
target="_blank"
rel="noopener noreferrer"
className="flex items-center justify-center w-full px-6 py-4 text-lg font-bold text-white transition-all bg-blue-600 rounded-xl hover:bg-blue-700 hover:scale-[1.02] shadow-lg shadow-blue-500/30"
>
🚀 Deploy on DigitalOcean ($200 Free Credit)
</a>
</div>
## What You'll Get
A fully working Zammad instance running on your server. Your data stays on your hardware — no third-party access, no usage limits, no surprise invoices.
## Prerequisites
- A server with Docker and Docker Compose installed ([setup guide](/quick-start/choosing-a-server))
- A domain name pointed to your server (optional but recommended)
- Basic terminal access (SSH)
## The Config
Create a directory for Zammad and add this `docker-compose.yml`:
```yaml
# -------------------------------------------------------------------------
# 🚀 Created and distributed by The AltStack
# 🌍 https://thealtstack.com
# -------------------------------------------------------------------------
version: '3.8'
services:
zammad:
image: zammad/zammad-docker-compose:zammad-6.3.1-23
container_name: zammad
restart: unless-stopped
depends_on:
- zammad-postgresql
- zammad-elasticsearch
- zammad-redis
ports:
- "8080:8080"
zammad-elasticsearch:
image: bitnami/elasticsearch:8.12.2
container_name: zammad-elasticsearch
restart: unless-stopped
environment:
- discovery.type=single-node
zammad-postgresql:
image: postgres:15-alpine
container_name: zammad-postgresql
restart: unless-stopped
environment:
- POSTGRES_USER=zammad
- POSTGRES_PASSWORD=zammad
zammad-redis:
image: redis:7.2-alpine
container_name: zammad-redis
restart: unless-stopped
```
## Let's Ship It
```bash
# Create a directory
mkdir -p /opt/zammad && cd /opt/zammad
# Create the docker-compose.yml (paste the config above)
nano docker-compose.yml
# Pull images and start
docker compose up -d
# Watch the logs
docker compose logs -f
```
## Environment Variables
| Variable | Default | Required |
|---|---|---|
| `POSTGRES_USER` | `zammad` | No |
| `POSTGRES_PASSWORD` | `zammad` | No |
## Post-Deployment Checklist
- [ ] Service is accessible on the configured port
- [ ] Admin account created (if applicable)
- [ ] Reverse proxy configured ([Caddy guide](/concepts/reverse-proxies))
- [ ] SSL/HTTPS working
- [ ] Backup script set up ([backup guide](/concepts/backups))
- [ ] Uptime monitor added ([Uptime Kuma](/deploy/uptime-kuma))
## The "I Broke It" Section
**Container won't start?**
```bash
docker compose logs zammad | tail -50
```
**Port already in use?**
```bash
# Find what's using the port
lsof -i :PORT_NUMBER
```
**Need to start fresh?**
```bash
docker compose down -v # ⚠️ This deletes volumes/data!
docker compose up -d
```
## Going Further
- [Zammad on AltStack Directory](https://thealtstack.com/alternative-to/zammad)
- [Zammad Self-Hosted Guide](https://thealtstack.com/self-hosted/zammad)
- [Official Documentation](https://zammad.org)
- [GitHub Repository](https://github.com/zammad/zammad)

378
docs/app/globals.css Normal file
View File

@@ -0,0 +1,378 @@
@import "tailwindcss";
/* ============================================
AltStack Docs — Custom Theme Overrides
============================================ */
/* ---- Font Stack ---- */
:root {
--font-sans: var(--font-outfit), 'Outfit', system-ui, -apple-system, sans-serif;
--font-mono: var(--font-mono), 'JetBrains Mono', 'Fira Code', monospace;
}
/* ---- AltStack Brand Colors ---- */
:root {
--altstack-red: #ef4444;
--altstack-orange: #f97316;
--altstack-bg: #050505;
--altstack-surface: #0a0a0a;
--altstack-surface-elevated: #111111;
--altstack-border: rgba(255, 255, 255, 0.08);
--altstack-glass: rgba(10, 10, 10, 0.7);
--altstack-text-dim: rgba(255, 255, 255, 0.5);
--hero-from: #ffffff;
--hero-to: #94a3b8;
}
/* ---- Dark mode as default feel ---- */
html {
color-scheme: dark;
}
:root {
--nextra-primary-hue: 10deg;
}
/* Light mode overrides for high contrast */
html[class~="light"] {
--nextra-bg: #ffffff;
--altstack-bg: #ffffff;
--altstack-surface: #f8fafc;
--altstack-surface-elevated: #f1f5f9;
--altstack-border: rgba(0, 0, 0, 0.08);
--altstack-text-dim: #64748b;
--altstack-glass: rgba(255, 255, 255, 0.8);
--hero-from: #0f172a;
--hero-to: #334155;
}
html[class~="dark"] {
--nextra-bg: var(--altstack-bg);
}
/* ---- Logo Styling & Animations ---- */
@keyframes float-red {
0%,
100% {
transform: translateY(0);
}
50% {
transform: translateY(-8px);
}
}
@keyframes float-glass {
0%,
100% {
transform: translateY(0);
}
50% {
transform: translateY(-5px);
}
}
@keyframes float-slate {
0%,
100% {
transform: translateY(0);
}
50% {
transform: translateY(-2px);
}
}
.animate-float-red {
animation: float-red 3s ease-in-out infinite;
}
.animate-float-glass {
animation: float-glass 3.5s ease-in-out infinite;
}
.animate-float-slate {
animation: float-slate 4s ease-in-out infinite;
}
.altstack-logo {
display: flex;
align-items: center;
gap: 0.75rem;
font-weight: 900;
font-size: 1.3rem;
letter-spacing: -0.03em;
color: white;
}
html[class~="light"] .altstack-logo {
color: #0f172a;
}
/* ---- Navbar & Sidebar Glassmorphism ---- */
.nextra-nav-container {
background-color: var(--altstack-glass) !important;
backdrop-filter: blur(12px) !important;
-webkit-backdrop-filter: blur(12px) !important;
border-bottom: 1px solid var(--altstack-border);
}
.nextra-sidebar-container {
background-color: transparent !important;
}
/* ---- Home Page Card Overrides (Legacy for now) ---- */
.nextra-cards {
margin-top: 2rem !important;
}
/* ---- Custom Grid Classes ---- */
.premium-grid {
display: grid;
grid-template-columns: repeat(auto-fit, minmax(280px, 1fr));
gap: 1.5rem;
margin-top: 2.5rem;
}
.premium-card {
position: relative;
padding: 1.75rem;
background: var(--altstack-surface);
border: 1px solid var(--altstack-border);
border-radius: 20px;
transition: all 0.3s cubic-bezier(0.4, 0, 0.2, 1);
text-decoration: none !important;
overflow: hidden;
}
.premium-card:hover {
background: var(--altstack-surface-elevated);
border-color: rgba(259, 68, 68, 0.3);
transform: translateY(-4px);
box-shadow: 0 12px 24px -12px rgba(0, 0, 0, 0.5);
}
.premium-card::before {
content: '';
position: absolute;
top: 0;
left: 0;
right: 0;
height: 2px;
background: linear-gradient(90deg, var(--altstack-red), var(--altstack-orange));
opacity: 0;
transition: opacity 0.3s ease;
}
.premium-card:hover::before {
opacity: 1;
}
.premium-card-title {
display: flex;
align-items: center;
gap: 0.75rem;
font-size: 1.15rem;
font-weight: 700;
color: white;
margin-bottom: 0.75rem;
}
html[class~="light"] .premium-card-title {
color: #0f172a;
}
.premium-card-description {
font-size: 0.95rem;
line-height: 1.6;
color: var(--altstack-text-dim);
}
/* ---- Footer ---- */
.altstack-footer {
display: flex;
justify-content: center;
align-items: center;
padding: 3rem 0 2rem;
font-size: 0.85rem;
color: var(--altstack-text-dim);
border-top: 1px solid var(--altstack-border);
margin-top: 4rem;
}
.altstack-footer a {
color: var(--altstack-red);
text-decoration: none;
font-weight: 600;
}
.altstack-footer a:hover {
text-decoration: underline;
}
.footer-header {
color: #0f172a;
/* slate-900 */
}
html[class~="dark"] .footer-header {
color: #ffffff !important;
}
html[class~="light"] .footer-header {
color: #0f172a !important;
}
/* ---- Difficulty badges ---- */
.badge-beginner {
display: inline-flex;
align-items: center;
gap: 0.3rem;
padding: 0.15rem 0.6rem;
font-size: 0.75rem;
font-weight: 700;
color: #22c55e;
background: rgba(34, 197, 94, 0.1);
border: 1px solid rgba(34, 197, 94, 0.2);
border-radius: 9999px;
}
.badge-intermediate {
display: inline-flex;
align-items: center;
gap: 0.3rem;
padding: 0.15rem 0.6rem;
font-size: 0.75rem;
font-weight: 700;
color: #eab308;
background: rgba(234, 179, 8, 0.1);
border: 1px solid rgba(234, 179, 8, 0.2);
border-radius: 9999px;
}
.badge-advanced {
display: inline-flex;
align-items: center;
gap: 0.3rem;
padding: 0.15rem 0.6rem;
font-size: 0.75rem;
font-weight: 700;
color: #ef4444;
background: rgba(239, 68, 68, 0.1);
border: 1px solid rgba(239, 68, 68, 0.2);
border-radius: 9999px;
}
/* ---- Hero info bar for deploy guides ---- */
.deploy-hero {
display: flex;
flex-wrap: wrap;
gap: 0.75rem;
margin: 1rem 0 1.5rem;
padding: 1rem 1.25rem;
background: var(--altstack-surface);
border: 1px solid var(--altstack-border);
border-radius: 16px;
font-size: 0.85rem;
color: rgba(255, 255, 255, 0.6);
}
.deploy-hero-item {
display: flex;
align-items: center;
gap: 0.35rem;
}
/* ---- Manual Logo Fix (Robust Override) ---- */
html[class~="dark"] .manual-logo-text {
color: #ffffff !important;
}
html[class~="light"] .manual-logo-text {
color: #0f172a !important;
/* slate-900 */
}
/* Fill overrides */
html[class~="dark"] .manual-logo-fill {
fill: rgba(255, 255, 255, 0.1) !important;
}
html[class~="light"] .manual-logo-fill {
fill: rgba(15, 23, 42, 0.1) !important;
}
html[class~="dark"] .manual-logo-fill-secondary {
fill: rgba(255, 255, 255, 0.2) !important;
}
html[class~="light"] .manual-logo-fill-secondary {
fill: rgba(15, 23, 42, 0.2) !important;
}
/* Stroke overrides */
html[class~="dark"] .manual-logo-stroke {
stroke: rgba(255, 255, 255, 0.2) !important;
}
html[class~="light"] .manual-logo-stroke {
stroke: rgba(15, 23, 42, 0.2) !important;
}
html[class~="dark"] .manual-logo-stroke-secondary {
stroke: rgba(255, 255, 255, 0.3) !important;
}
html[class~="light"] .manual-logo-stroke-secondary {
stroke: rgba(15, 23, 42, 0.3) !important;
}
html[class~="dark"] .manual-logo-stroke-tertiary {
stroke: rgba(255, 255, 255, 0.4) !important;
}
html[class~="light"] .manual-logo-stroke-tertiary {
stroke: rgba(15, 23, 42, 0.4) !important;
}
/* ============================================
Mobile UI Fixes
============================================ */
/* Fix mobile menu z-index issues to ensure it sits above content */
.nextra-nav-container,
.nextra-navbar {
z-index: 60 !important;
}
/* Ensure search and other elements don't overlap the menu */
.nextra-search-container {
z-index: 40;
}
/* Adjust mobile menu spacing to prevent overlap with navbar */
@media (max-width: 768px) {
.nextra-menu-mobile {
padding-top: 4rem;
z-index: 45;
}
/* Ensure the mobile menu content is scrollable and visible */
.nextra-menu-mobile .nextra-scrollbar {
padding-bottom: 5rem;
}
}
/* Force solid background on mobile menu */
@media (max-width: 768px) {
.nextra-menu-mobile,
.nextra-mobile-nav {
background-color: var(--altstack-bg) !important;
z-index: 50 !important;
}
}

60
docs/app/icon.tsx Normal file
View File

@@ -0,0 +1,60 @@
import { ImageResponse } from 'next/og';
export const size = {
width: 32,
height: 32,
};
export const contentType = 'image/png';
export default function Icon() {
return new ImageResponse(
(
<div
style={{
fontSize: 24,
background: 'linear-gradient(to bottom right, #EF4444, #F97316)',
width: '100%',
height: '100%',
display: 'flex',
alignItems: 'center',
justifyContent: 'center',
color: 'white',
borderRadius: '50%', // Round!
}}
>
<svg
width="20"
height="20"
viewBox="0 0 24 24"
fill="none"
xmlns="http://www.w3.org/2000/svg"
>
<path
d="M12 2L2 7L12 12L22 7L12 2Z"
fill="white"
fillOpacity="0.9"
/>
<path
d="M2 17L12 22L22 17"
stroke="white"
strokeWidth="2"
strokeLinecap="round"
strokeLinejoin="round"
/>
<path
d="M2 12L12 17L22 12"
stroke="white"
strokeWidth="2"
strokeLinecap="round"
strokeLinejoin="round"
/>
</svg>
</div>
),
{
...size,
}
);
}

292
docs/app/layout.tsx Normal file
View File

@@ -0,0 +1,292 @@
import { Footer, Layout, Navbar } from 'nextra-theme-docs'
import Link from 'next/link'
import Script from 'next/script'
import { Head } from 'nextra/components'
import { getPageMap } from 'nextra/page-map'
import { Outfit, JetBrains_Mono } from 'next/font/google'
import type { Metadata, Viewport } from 'next'
import type { ReactNode } from 'react'
import 'nextra-theme-docs/style.css'
import './globals.css'
const outfit = Outfit({
subsets: ['latin'],
variable: '--font-outfit',
})
const jetbrainsMono = JetBrains_Mono({
subsets: ['latin'],
variable: '--font-mono',
})
export const metadata: Metadata = {
metadataBase: new URL('https://docs.thealtstack.com'),
title: {
default: 'AltStack Docs — Self-Hosting Guides & Deploy Recipes',
template: '%s — AltStack Docs',
},
description:
'Step-by-step guides to self-host open source software. Docker Compose configs, deployment recipes, and stack-building guides for developers and teams.',
openGraph: {
title: 'AltStack Docs',
description:
'Self-hosting guides, deploy configs, and stack-building recipes for open source software.',
url: 'https://docs.thealtstack.com',
siteName: 'AltStack Docs',
locale: 'en_US',
type: 'website',
},
twitter: {
card: 'summary_large_image',
title: 'AltStack Docs',
description:
'Self-hosting guides, deploy configs, and stack recipes.',
},
}
export const viewport: Viewport = {
themeColor: '#050505',
}
import AIChatLinks from '../components/AIChatLinks'
function Logo() {
return (
<div className="group/logo flex items-center gap-2 md:gap-3">
<div className="relative w-7 h-7 md:w-10 md:h-10 flex items-center justify-center">
<svg
viewBox="0 0 40 40"
fill="none"
xmlns="http://www.w3.org/2000/svg"
className="overflow-visible w-full h-full"
>
{/* Bottom Layer (Slate) */}
<g className="animate-float-slate transition-transform duration-700 ease-out group-hover/logo:-translate-y-2">
<path
d="M20 32L8 26L20 20L32 26L20 32Z"
className="fill-slate-900/10 dark:!fill-white/10 manual-logo-fill"
/>
<path
d="M20 32L8 26L20 20L32 26L20 32Z"
className="stroke-slate-900/20 dark:!stroke-white/20 manual-logo-stroke"
strokeWidth="1"
/>
</g>
{/* Middle Layer (Glass) */}
<g className="animate-float-glass transition-transform duration-700 ease-out group-hover/logo:-translate-y-4">
<path
d="M20 26L8 20L20 14L32 20L20 26Z"
className="fill-slate-900/20 dark:!fill-white/20 manual-logo-fill-secondary"
/>
<path
d="M20 26L8 20L20 14L32 20L20 26Z"
className="stroke-slate-900/30 dark:!stroke-white/30 manual-logo-stroke-secondary"
strokeWidth="1"
/>
</g>
{/* Top Layer (Red) */}
<g className="animate-float-red transition-transform duration-700 ease-out group-hover/logo:-translate-y-6">
<defs>
<linearGradient id="logo-red-grad" x1="8" y1="14" x2="32" y2="14" gradientUnits="userSpaceOnUse">
<stop stopColor="#EF4444" />
<stop offset="1" stopColor="#F97316" />
</linearGradient>
<filter id="logo-red-glow" x="0" y="0" width="40" height="40">
<feGaussianBlur stdDeviation="2" result="blur" />
<feComposite in="SourceGraphic" in2="blur" operator="over" />
</filter>
</defs>
<path
d="M20 20L8 14L20 8L32 14L20 20Z"
fill="url(#logo-red-grad)"
filter="url(#logo-red-glow)"
/>
<path
d="M20 20L8 14L20 8L32 14L20 20Z"
className="stroke-slate-900/40 dark:!stroke-white/40 manual-logo-stroke-tertiary"
strokeWidth="0.5"
/>
</g>
</svg>
</div>
<span className="font-bold text-lg md:text-xl tracking-tighter text-slate-900 dark:!text-white transition-colors manual-logo-text">
Alt<span className="text-red-500">Stack</span><span className="opacity-50 font-medium text-base ml-1 hidden sm:inline">docs</span>
</span>
</div>
)
}
const navbar = (
<Navbar
logo={<Logo />}
>
<AIChatLinks />
</Navbar>
)
const footer = (
<Footer>
<div className="w-full pt-16 pb-12 mt-24 border-t border-black/5 dark:border-white/5 transition-colors duration-300">
<div className="max-w-7xl mx-auto px-6">
<div className="grid grid-cols-1 md:grid-cols-4 gap-12 mb-16">
<div className="col-span-1 md:col-span-1">
<div className="flex items-center gap-3 mb-6">
<Logo />
</div>
<p className="text-slate-500 dark:text-slate-400 text-sm leading-relaxed mb-8 max-w-xs transition-colors">
Step-by-step guides to self-host open source software with real configs and zero filler.
</p>
<div className="flex items-center gap-4 text-slate-400">
<a href="https://thealtstack.com" className="hover:text-slate-900 dark:hover:text-white transition-colors text-sm">
thealtstack.com
</a>
</div>
</div>
<div>
<h3 className="footer-header font-bold text-xs mb-6 uppercase tracking-widest transition-colors">Documentation</h3>
<ul className="space-y-4 text-sm">
<li><Link href="/quick-start/what-is-self-hosting" className="text-slate-500 dark:text-slate-400 hover:text-red-500 transition-colors">Quick Start</Link></li>
<li><Link href="/deploy" className="text-slate-500 dark:text-slate-400 hover:text-red-500 transition-colors">Deploy Guides</Link></li>
<li><Link href="/stacks" className="text-slate-500 dark:text-slate-400 hover:text-red-500 transition-colors">Curated Stacks</Link></li>
</ul>
</div>
<div>
<h3 className="footer-header font-bold text-xs mb-6 uppercase tracking-widest transition-colors">About</h3>
<ul className="space-y-4 text-sm">
<li><Link href="/why" className="text-slate-500 dark:text-slate-400 hover:text-red-500 transition-colors">Why These Docs Exist</Link></li>
<li><a href="https://thealtstack.com/about" className="text-slate-500 dark:text-slate-400 hover:text-red-500 transition-colors">About AltStack</a></li>
<li><a href="mailto:hello@thealtstack.com" className="text-slate-500 dark:text-slate-400 hover:text-red-500 transition-colors">Send Feedback</a></li>
</ul>
</div>
<div>
<h3 className="footer-header font-bold text-xs mb-6 uppercase tracking-widest transition-colors">Support</h3>
<ul className="space-y-4 text-sm">
<li><Link href="/contact" className="text-slate-500 dark:text-slate-400 hover:text-red-500 transition-colors">Contact Us</Link></li>
<li><a href="https://thealtstack.com/privacy" className="text-slate-500 dark:text-slate-400 hover:text-red-500 transition-colors">Privacy</a></li>
<li><a href="https://thealtstack.com/terms" className="text-slate-500 dark:text-slate-400 hover:text-red-500 transition-colors">Terms</a></li>
</ul>
</div>
</div>
<div className="pt-8 border-t border-black/5 dark:border-white/5 flex flex-col md:flex-row justify-between items-center gap-6">
<p className="text-[10px] font-medium text-slate-500 dark:text-slate-600 uppercase tracking-widest transition-colors">
&copy; {new Date().getFullYear()} The AltStack. Empowering through Open Source.
</p>
<div className="flex items-center gap-6">
<div className="flex items-center gap-2 px-3 py-1.5 rounded-full bg-green-500/5 border border-green-500/10">
<span className="w-1.5 h-1.5 rounded-full bg-green-500 animate-pulse" />
<span className="text-[10px] font-bold text-green-500 uppercase tracking-widest">Systems Operational</span>
</div>
</div>
</div>
</div>
</div>
</Footer>
)
export default async function RootLayout({
children,
}: {
children: ReactNode
}) {
return (
<html lang="en" dir="ltr" suppressHydrationWarning>
<Head
color={{
hue: 10,
saturation: 80,
lightness: {
dark: 55,
light: 50,
},
}}
/>
<body
className={`${outfit.variable} ${jetbrainsMono.variable}`}
>
{/* Google Analytics */}
<Script src="https://www.googletagmanager.com/gtag/js?id=G-MZR8ZCF535" strategy="afterInteractive" />
<Script id="google-analytics" strategy="afterInteractive">
{`
window.dataLayer = window.dataLayer || [];
function gtag(){dataLayer.push(arguments);}
gtag('js', new Date());
gtag('config', 'G-MZR8ZCF535');
`}
</Script>
<script
type="application/ld+json"
dangerouslySetInnerHTML={{
__html: JSON.stringify({
'@context': 'https://schema.org',
'@graph': [
{
'@type': 'WebSite',
'@id': 'https://docs.thealtstack.com/#website',
url: 'https://docs.thealtstack.com',
name: 'AltStack Docs',
description:
'Step-by-step guides to self-host open source software. Docker Compose configs, deployment recipes, and stack-building guides.',
publisher: {
'@id': 'https://thealtstack.com/#organization',
},
potentialAction: {
'@type': 'SearchAction',
target: {
'@type': 'EntryPoint',
urlTemplate:
'https://docs.thealtstack.com/?q={search_term_string}',
},
'query-input': 'required name=search_term_string',
},
inLanguage: 'en-US',
},
{
'@type': 'Organization',
'@id': 'https://thealtstack.com/#organization',
name: 'AltStack',
url: 'https://thealtstack.com',
description:
"The World's First Sovereign Infrastructure Engine. A curated directory of 400+ open source alternatives.",
sameAs: ['https://docs.thealtstack.com'],
},
{
'@type': 'BreadcrumbList',
'@id': 'https://docs.thealtstack.com/#breadcrumb',
itemListElement: [
{
'@type': 'ListItem',
position: 1,
name: 'AltStack',
item: 'https://thealtstack.com',
},
{
'@type': 'ListItem',
position: 2,
name: 'Docs',
item: 'https://docs.thealtstack.com',
},
],
},
],
}),
}}
/>
<Layout
navbar={navbar}
footer={footer}
pageMap={await getPageMap()}
editLink={null}
feedback={{ content: null }}
>
{children}
</Layout>
</body>
</html>
)
}

127
docs/app/page.mdx Normal file
View File

@@ -0,0 +1,127 @@
---
title: AltStack Docs
searchable: false
---
import { Rocket, Box, Flame, Brain, ArrowRight, ScrollText, Globe } from 'lucide-react'
<div className="py-20 text-center">
<h1 className="text-4xl md:text-7xl font-black tracking-tighter leading-tight mb-6 py-4 bg-gradient-to-r from-[var(--hero-from)] to-[var(--hero-to)] bg-clip-text text-transparent">
The AltStack Docs
</h1>
<div className="text-xl md:text-2xl text-[var(--altstack-text-dim)] max-w-2xl mx-auto font-medium">
The World's First Sovereign Infrastructure Engine. Self-hosting guides that actually work.
</div>
</div>
<div className="premium-grid">
<a href="/quick-start/what-is-self-hosting" className="premium-card group">
<div className="premium-card-title">
<div className="p-2 rounded-lg bg-red-500/10 text-red-500 group-hover:bg-red-500/20 transition-colors">
<Rocket size={20} />
</div>
<span>Quick Start</span>
</div>
<div className="premium-card-description">
New to self-hosting? Start here. 5 minutes to your first deploy.
</div>
<div className="absolute bottom-6 right-6 opacity-0 group-hover:opacity-100 transition-opacity text-red-500">
<ArrowRight size={18} />
</div>
</a>
<a href="/deploy" className="premium-card group">
<div className="premium-card-title">
<div className="p-2 rounded-lg bg-orange-500/10 text-orange-500 group-hover:bg-orange-500/20 transition-colors">
<Box size={20} />
</div>
<span>Deploy Guides</span>
</div>
<div className="premium-card-description">
65+ tools with Docker Compose configs. Find yours, ship it, own it.
</div>
<div className="absolute bottom-6 right-6 opacity-0 group-hover:opacity-100 transition-opacity text-orange-500">
<ArrowRight size={18} />
</div>
</a>
<a href="/stacks" className="premium-card group">
<div className="premium-card-title">
<div className="p-2 rounded-lg bg-yellow-500/10 text-yellow-500 group-hover:bg-yellow-500/20 transition-colors">
<Flame size={20} />
</div>
<span>Curated Stacks</span>
</div>
<div className="premium-card-description">
Pre-built tool bundles for bootstrappers, designers, DevOps, privacy, and AI.
</div>
<div className="absolute bottom-6 right-6 opacity-0 group-hover:opacity-100 transition-opacity text-yellow-500">
<ArrowRight size={18} />
</div>
</a>
<a href="/concepts" className="premium-card group">
<div className="premium-card-title">
<div className="p-2 rounded-lg bg-blue-500/10 text-blue-500 group-hover:bg-blue-500/20 transition-colors">
<Brain size={20} />
</div>
<span>Concepts</span>
</div>
<div className="premium-card-description">
Docker, reverse proxies, SSL, backups — explained like you're a human.
</div>
<div className="absolute bottom-6 right-6 opacity-0 group-hover:opacity-100 transition-opacity text-blue-500">
<ArrowRight size={18} />
</div>
</a>
<a href="/why" className="premium-card group">
<div className="premium-card-title">
<div className="p-2 rounded-lg bg-purple-500/10 text-purple-500 group-hover:bg-purple-500/20 transition-colors">
<ScrollText size={20} />
</div>
<span>Why These Docs Exist</span>
</div>
<div className="premium-card-description">
Our philosophy, editorial rules, and what makes these docs different.
</div>
<div className="absolute bottom-6 right-6 opacity-0 group-hover:opacity-100 transition-opacity text-purple-500">
<ArrowRight size={18} />
</div>
</a>
<a href="https://thealtstack.com" className="premium-card group">
<div className="premium-card-title">
<div className="p-2 rounded-lg bg-emerald-500/10 text-emerald-500 group-hover:bg-emerald-500/20 transition-colors">
<Globe size={20} />
</div>
<span>AltStack Directory</span>
</div>
<div className="premium-card-description">
Browse 400+ open source tools, compare alternatives, and build your stack.
</div>
<div className="absolute bottom-6 right-6 opacity-0 group-hover:opacity-100 transition-opacity text-emerald-500">
<ArrowRight size={18} />
</div>
</a>
</div>
<div className="mt-32 prose prose-invert max-w-none">
<div className="grid md:grid-cols-2 gap-12 border-t border-[var(--altstack-border)] pt-16">
<div>
<h2 className="text-3xl font-bold mb-4">Why These Docs Exist</h2>
<div className="text-lg text-[var(--altstack-text-dim)]">
Every tool in the <a href="https://thealtstack.com" className="text-red-500 font-semibold no-underline hover:underline">AltStack directory</a> can be self-hosted. These docs show you <em>how</em> — with real configs, honest trade-offs, and none of the hand-waving.
</div>
</div>
<div>
<h2 className="text-3xl font-bold mb-4">The Rules</h2>
<ul className="space-y-4 text-[var(--altstack-text-dim)] list-none p-0">
<li className="flex gap-3"><span className="text-red-500 font-bold">1.</span> Every guide ends with a working deployment</li>
<li className="flex gap-3"><span className="text-red-500 font-bold">2.</span> Every config is tested and copy-pasteable</li>
<li className="flex gap-3"><span className="text-red-500 font-bold">3.</span> Every tool gets an honest verdict</li>
<li className="flex gap-3"><span className="text-red-500 font-bold">4.</span> We don't waste your time with "Introduction" filler</li>
</ul>
</div>
</div>
</div>

View File

@@ -0,0 +1,21 @@
import type { MetaRecord } from 'nextra'
const meta: MetaRecord = {
'what-is-self-hosting': {
title: 'What is Self-Hosting?',
},
'first-deployment': {
title: 'Your First Deployment',
},
'choosing-a-server': {
title: 'Choosing a Server',
},
'reverse-proxy': {
title: 'Setting Up a Reverse Proxy',
},
'starter-kit': {
title: 'The Starter Kit',
},
}
export default meta

View File

@@ -0,0 +1,113 @@
---
title: Choosing a Server
description: "A no-nonsense comparison of VPS providers for self-hosting. Hetzner, DigitalOcean, Linode, and more — which one to pick and why."
---
# Choosing a Server
You need a place to run your tools. That place is a **VPS** (Virtual Private Server) — basically a computer in a data center that you rent by the month.
> ⚠️ **Heads Up:** You *can* self-host on a Raspberry Pi or old laptop at home. But a VPS gives you a static IP, proper uptime, and you don't need to worry about your ISP blocking ports. Start with a VPS. Go homelab later.
## The Short Answer
**Just get a Hetzner CX22.** €4.50/mo, 2 vCPUs, 4GB RAM, 40GB SSD, 20TB traffic. It'll run 510 Docker containers comfortably.
If Hetzner isn't available in your region, get a [DigitalOcean $6/mo Droplet](https://m.do.co/c/2ed27757a361).
That's the recommendation. Below is the reasoning.
## The Comparison
| Provider | Cheapest Plan | CPU | RAM | Storage | Best For |
|---|---|---|---|---|---|
| **Hetzner** | €3.79/mo | 2 shared | 4 GB | 40 GB | Best value overall, EU & US |
| [**DigitalOcean**](https://m.do.co/c/2ed27757a361) | $6/mo | 1 vCPU | 1 GB | 25 GB | Beginners, great docs |
| **Linode (Akamai)** | $5/mo | 1 vCPU | 1 GB | 25 GB | Solid alternative to DO |
| **Vultr** | $5/mo | 1 vCPU | 1 GB | 25 GB | Global edge locations |
| **OVH** | €3.50/mo | 1 vCPU | 2 GB | 20 GB | Budget EU hosting |
| **Oracle Cloud** | Free tier | 4 ARM | 24 GB | 200 GB | Can't beat free (if you qualify) |
## What Specs Do You Need?
Here's a rough guide based on what you want to run:
| Use Case | RAM | CPU | Storage | Monthly Cost |
|---|---|---|---|---|
| 13 lightweight tools (Plausible, Uptime Kuma, Listmonk) | 2 GB | 1 vCPU | 20 GB | ~$5 |
| An entire Bootstrapper Stack (Supabase, Coolify, Plausible, etc.) | 4 GB | 2 vCPU | 40 GB | ~$6 |
| AI models (Ollama, Stable Diffusion) | 8+ GB | 4+ vCPU | 80+ GB | ~$15+ |
| "I self-host everything" | 16 GB | 4 vCPU | 160 GB | ~$25 |
> 🔥 **Pro Tip:** Start small. You can upgrade a VPS in about 30 seconds. It's way harder to downgrade. Get a 4GB plan and upgrade when you actually feel it.
Once you have a VPS, the setup is the same everywhere. Don't just install Docker and leave it open; follow these steps to secure your investment.
### 1. Hardening SSH (Don't skip this)
Root password login is a magnet for brute-force attacks. Use SSH keys.
```bash
# On your local machine:
ssh-keygen -t ed25519 -C "your_email@example.com"
ssh-copy-id root@your-server-ip
# Now SSH back into the server:
ssh root@your-server-ip
```
Disable password login:
```bash
nano /etc/ssh/sshd_config
# Find and set: PasswordAuthentication no
# Restart SSH: systemctl restart ssh
```
### 2. Configure the Firewall (UFW)
Only open the ports you actually need.
```bash
# Allow SSH, HTTP, and HTTPS
ufw allow ssh
ufw allow 80/tcp
ufw allow 443/tcp
# Enable firewall
ufw enable
```
### 3. Install Docker & Compose
The easiest way is the official convenience script.
```bash
# Update the system
apt update && apt upgrade -y
# Install Docker
curl -fsSL https://get.docker.com | sh
# Install Docker Compose plugin
apt install docker-compose-plugin -y
# Verify
docker --version
docker compose version
```
### 4. Create a Non-Root User (Optional but Good)
Running everything as root is risky. Create a user with sudo privileges.
```bash
adduser dev
usermod -aG sudo dev
usermod -aG docker dev
# Now log in as 'dev' for future work
```
That's your server ready and secured. Every deploy guide in these docs assumes you've done this.
## Next Steps
Your server is ready. Time to deploy something real:
→ [The AltStack Starter Kit](/quick-start/starter-kit) — Our recommended first set of tools
→ [Deploy Guides](/deploy) — Pick any tool and deploy it

View File

@@ -0,0 +1,69 @@
---
title: Your First Deployment
description: "Deploy Uptime Kuma in under 5 minutes with a single Docker command. Your first taste of self-hosting freedom."
---
# Your First Deployment
**By the end of this page**, you'll have [Uptime Kuma](https://thealtstack.com/alternative-to/uptime-kuma) — a beautiful uptime monitor — running on your machine. It takes about 5 minutes.
We're starting with Uptime Kuma because:
- It's a single Docker command (no compose file needed)
- It has a gorgeous UI you'll actually enjoy using
- It's immediately useful — it monitors your other self-hosted tools
- It proves that self-hosting isn't scary
## Prerequisites
- Docker installed on your machine ([install guide](https://docs.docker.com/get-docker/))
- A terminal (Terminal on Mac, PowerShell on Windows, or any Linux terminal)
> 💡 **Why?** Docker is how we package and run software without dependency hell. If you haven't installed it yet, the link above takes 3 minutes.
## Let's Ship It
Open your terminal and run this single command:
```bash
docker run -d \
--restart=unless-stopped \
-p 3001:3001 \
-v uptime-kuma:/app/data \
--name uptime-kuma \
louislam/uptime-kuma:1
```
That's it. Not kidding.
### What just happened?
| Flag | What it does |
|---|---|
| `-d` | Runs in the background (detached) |
| `--restart=unless-stopped` | Auto-restarts if your server reboots |
| `-p 3001:3001` | Makes it accessible on port 3001 |
| `-v uptime-kuma:/app/data` | Saves your data in a Docker volume (survives restarts) |
| `--name uptime-kuma` | Gives the container a human-readable name |
## See It Live
Open your browser and go to:
```
http://localhost:3001
```
You should see the Uptime Kuma setup screen. Create an admin account, add a monitor for `https://google.com` to test it, and watch the green dots roll in.
**Congratulations. You just self-hosted your first tool.** 🎉
## You Did It. Now What?
You just proved to yourself that self-hosting works. Here's where to go next:
1. **[Choosing a Server](/quick-start/choosing-a-server)** — Move from localhost to a real VPS so others can access your tools
2. **[Docker Basics](/concepts/docker-basics)** — Understand what Docker Compose is (spoiler: it's the next level)
3. **[Deploy Plausible](/deploy/plausible)** — Replace Google Analytics entirely
4. **[The Bootstrapper Stack](/stacks/bootstrapper)** — Deploy an entire SaaS toolkit for $0/mo
> 🏆 **The Verdict:** If this felt easy, that's because it *is* easy. The rest of our guides follow the same pattern: copy a config, run a command, own your software.

View File

@@ -0,0 +1,88 @@
---
title: Quick Start
description: "Your roadmap to self-hosting independence. Go from zero to a running infrastructure in under an hour."
---
import { Clock, Server, Shield, Rocket, ArrowRight, CheckCircle } from 'lucide-react'
# Quick Start
**Go from "I've never self-hosted anything" to "I'm running my own infrastructure" in under an hour.** This guide is your roadmap — follow it in order.
<div className="mt-12 space-y-6">
<div className="relative pl-12 pb-8 border-l-2 border-red-500/20">
<div className="absolute -left-4 top-0 w-8 h-8 rounded-full bg-red-500 flex items-center justify-center text-white font-bold text-sm">{"1"}</div>
<h3 className="text-lg font-bold mb-1">{"Understand the Basics"}</h3>
<div className="flex items-center gap-2 text-sm text-[var(--altstack-text-dim)] mb-3">
<Clock size={14} /><span>{" 5 min read"}</span>
</div>
<span className="block text-[var(--altstack-text-dim)] mb-3">{"What self-hosting actually means, why you'd do it, and the three things you need. No jargon, no gatekeeping."}</span>
<a href="/quick-start/what-is-self-hosting" className="inline-flex items-center gap-2 text-red-500 font-semibold text-sm hover:underline">
<span>{"What is Self-Hosting?"}</span> <ArrowRight size={14} />
</a>
</div>
<div className="relative pl-12 pb-8 border-l-2 border-red-500/20">
<div className="absolute -left-4 top-0 w-8 h-8 rounded-full bg-red-500 flex items-center justify-center text-white font-bold text-sm">{"2"}</div>
<h3 className="text-lg font-bold mb-1">{"Deploy Your First Tool"}</h3>
<div className="flex items-center gap-2 text-sm text-[var(--altstack-text-dim)] mb-3">
<Clock size={14} /><span>{" 5 min hands-on"}</span>
</div>
<span className="block text-[var(--altstack-text-dim)] mb-3">{"One Docker command. One running tool. Prove to yourself that self-hosting works. We start with Uptime Kuma — it's beautiful, useful, and takes 30 seconds."}</span>
<a href="/quick-start/first-deployment" className="inline-flex items-center gap-2 text-red-500 font-semibold text-sm hover:underline">
<span>{"Your First Deployment"}</span> <ArrowRight size={14} />
</a>
</div>
<div className="relative pl-12 pb-8 border-l-2 border-red-500/20">
<div className="absolute -left-4 top-0 w-8 h-8 rounded-full bg-red-500 flex items-center justify-center text-white font-bold text-sm">{"3"}</div>
<h3 className="text-lg font-bold mb-1">{"Get a Real Server"}</h3>
<div className="flex items-center gap-2 text-sm text-[var(--altstack-text-dim)] mb-3">
<Clock size={14} /><span>{" 15 min hands-on"}</span>
</div>
<span className="block text-[var(--altstack-text-dim)] mb-3">{"Move from localhost to a VPS. We compare providers, recommend the best value, and walk you through SSH hardening, firewalls, and Docker installation."}</span>
<a href="/quick-start/choosing-a-server" className="inline-flex items-center gap-2 text-red-500 font-semibold text-sm hover:underline">
<span>{"Choosing a Server"}</span> <ArrowRight size={14} />
</a>
</div>
<div className="relative pl-12 pb-8 border-l-2 border-red-500/20">
<div className="absolute -left-4 top-0 w-8 h-8 rounded-full bg-red-500 flex items-center justify-center text-white font-bold text-sm">{"4"}</div>
<h3 className="text-lg font-bold mb-1">{"Set Up Domains & SSL"}</h3>
<div className="flex items-center gap-2 text-sm text-[var(--altstack-text-dim)] mb-3">
<Clock size={14} /><span>{" 10 min hands-on"}</span>
</div>
<span className="block text-[var(--altstack-text-dim)] mb-3">{"Give your tools proper domains like "}<code>{"uptime.yourdomain.com"}</code>{" with automatic HTTPS. We cover Caddy, Nginx Proxy Manager, and Traefik."}</span>
<a href="/quick-start/reverse-proxy" className="inline-flex items-center gap-2 text-red-500 font-semibold text-sm hover:underline">
<span>{"Setting Up a Reverse Proxy"}</span> <ArrowRight size={14} />
</a>
</div>
<div className="relative pl-12">
<div className="absolute -left-4 top-0 w-8 h-8 rounded-full bg-green-500 flex items-center justify-center text-white font-bold text-sm">{"✓"}</div>
<h3 className="text-lg font-bold mb-1">{"Deploy Your Starter Kit"}</h3>
<div className="flex items-center gap-2 text-sm text-[var(--altstack-text-dim)] mb-3">
<Clock size={14} /><span>{" 20 min hands-on"}</span>
</div>
<span className="block text-[var(--altstack-text-dim)] mb-3">{"Your first real stack: Uptime Kuma + Plausible + Coolify. Three tools that replace ~$35/mo in SaaS, all running on a $6/mo server."}</span>
<a href="/quick-start/starter-kit" className="inline-flex items-center gap-2 text-green-500 font-semibold text-sm hover:underline">
<span>{"The AltStack Starter Kit"}</span> <ArrowRight size={14} />
</a>
</div>
</div>
---
## Prerequisites
Before you start, you need:
- **A computer with a terminal** — Mac Terminal, Windows PowerShell, or any Linux shell
- **Docker installed** — [Get Docker](https://docs.docker.com/get-docker/) (3 minutes)
- **$06/mo budget** — Free for localhost experiments, ~$6/mo for a real VPS
That's genuinely it. No Kubernetes. No cloud certifications. No weekend-long setup marathons.
## Fast Track (Experienced Users)
Already comfortable with Docker and have a VPS? Skip straight to the good stuff:
1. **[The Starter Kit](/quick-start/starter-kit)** — Deploy Uptime Kuma + Plausible + Coolify in 20 minutes
2. **[Deploy Guides](/deploy)** — Pick any of our 65+ tools and ship it
3. **[Curated Stacks](/stacks)** — Grab a complete toolkit for your use case

View File

@@ -0,0 +1,145 @@
---
title: Setting Up a Reverse Proxy
description: "How to use Caddy, Nginx Proxy Manager, or Traefik to give your self-hosted tools proper domains and automatic SSL."
---
import { Tabs } from 'nextra/components'
# Setting Up a Reverse Proxy
Right now your tools are running on ports like `:3001` or `:8080`. A **reverse proxy** is the traffic cop that maps a domain like `uptime.yourdomain.com` to your server's local port and handles SSL automatically.
## Which one should I pick?
- **Caddy:** Best for 99% of people. Zero-config SSL, human-readable config, extremely fast.
- **Nginx Proxy Manager:** Best if you want a web UI to click and manage your domains.
- **Traefik:** Best if you want a "hands-off" approach that auto-discovers new containers as you spin them up (complex but powerful).
---
<Tabs items={['Caddy (Recommended)', 'Nginx Proxy Manager', 'Traefik']}>
<Tabs.Tab>
### Caddy Setup
Caddy is the "batteries included" proxy. It just works.
#### 1. The Docker Compose
Create a folder for Caddy and add this `docker-compose.yml`:
```yaml
version: '3.8'
services:
caddy:
image: caddy:2-alpine
restart: unless-stopped
ports:
- "80:80"
- "443:443"
- "443:443/udp"
volumes:
- ./Caddyfile:/etc/caddy/Caddyfile
- caddy_data:/data
- caddy_config:/config
volumes:
caddy_data:
caddy_config:
```
#### 2. The Caddyfile
In the same folder, create a file named `Caddyfile`:
```caddy
uptime.yourdomain.com {
reverse_proxy localhost:3001
}
plausible.yourdomain.com {
reverse_proxy localhost:8000
}
```
#### 3. Start it
```bash
docker compose up -d
```
</Tabs.Tab>
<Tabs.Tab>
### Nginx Proxy Manager (NPM) Setup
NPM gives you a beautiful web interface to manage your SSL and proxy hosts.
#### 1. The Docker Compose
```yaml
version: '3.8'
services:
app:
image: 'jc21/nginx-proxy-manager:latest'
restart: unless-stopped
ports:
- '80:80'
- '81:81'
- '443:443'
volumes:
- ./data:/data
- ./letsencrypt:/etc/letsencrypt
```
#### 2. Access the UI
1. Visit `http://your-server-ip:81`
2. Default credentials:
- Email: `admin@example.com`
- Password: `changeme`
3. Change your login info immediately.
4. Click **Proxy Hosts** -> **Add Proxy Host** to point your domain to your tool's port.
</Tabs.Tab>
<Tabs.Tab>
### Traefik Setup
Traefik uses "labels" on your other containers to automatically route traffic.
#### 1. The Traefik Container
```yaml
version: '3.8'
services:
traefik:
image: traefik:v3.0
command:
- "--api.insecure=true"
- "--providers.docker=true"
- "--entrypoints.web.address=:80"
- "--entrypoints.websecure.address=:443"
- "--certificatesresolvers.myresolver.acme.tlschallenge=true"
- "--certificatesresolvers.myresolver.acme.email=your-email@example.com"
- "--certificatesresolvers.myresolver.acme.storage=/letsencrypt/acme.json"
ports:
- "80:80"
- "443:443"
- "8080:8080"
volumes:
- "/var/run/docker.sock:/var/run/docker.sock:ro"
- "./letsencrypt:/letsencrypt"
```
#### 2. Routing a container
Add these labels to any *other* container you want to proxy:
```yaml
labels:
- "traefik.enable=true"
- "traefik.http.routers.mytool.rule=Host(`mytool.yourdomain.com`)"
- "traefik.http.routers.mytool.entrypoints=websecure"
- "traefik.http.routers.mytool.tls.certresolver=myresolver"
```
</Tabs.Tab>
</Tabs>
---
## 🔒 A Note on SSL/TLS
Every proxy above handles SSL certificates via **Let's Encrypt** automatically.
**Crucial Step:** Before you start your proxy, your domain's **DNS A Record** must point to your server's public IP address. If the DNS isn't pointing correctly, Let's Encrypt will fail to issue a certificate.
## Next Steps
→ [Your First Deployment](/quick-start/first-deployment) — Connect your tools to your new proxy.
→ [SSL/TLS Deep Dive](/concepts/ssl-tls) — How it works under the hood.

View File

@@ -0,0 +1,46 @@
---
title: The AltStack Starter Kit
description: "The recommended first 3 tools to self-host: Uptime Kuma, Plausible, and Coolify. Your foundation for software independence."
---
# The AltStack Starter Kit
If you're new to self-hosting, don't try to replace your entire SaaS stack on day one. Start with three tools that are immediately useful, easy to deploy, and will teach you how everything works.
## The Stack
| Tool | Replaces | Why It's First |
|---|---|---|
| [**Uptime Kuma**](/deploy/uptime-kuma) | Pingdom, UptimeRobot ($15/mo) | Monitors everything else you deploy. Set it up first. |
| [**Plausible**](/deploy/plausible) | Google Analytics (free but creepy) | Privacy-respecting analytics. You'll see results immediately. |
| [**Coolify**](/deploy/coolify) | Vercel, Heroku ($20+/mo) | Deploy future apps with git push. Your own PaaS. |
**Total monthly cost:** ~$6 (one small VPS)
**Total SaaS cost replaced:** ~$35+/mo
## Deploy Order
This order matters:
### 1. Uptime Kuma (5 min)
Your monitoring dashboard. Once it's running, add monitors for everything else you deploy. You'll always know if something goes down.
→ [Deploy Uptime Kuma](/deploy/uptime-kuma)
### 2. Plausible Analytics (10 min)
Lightweight, cookie-free analytics. Add the tracking script to your site and immediately start seeing real visitor data — without the privacy guilt.
→ [Deploy Plausible](/deploy/plausible)
### 3. Coolify (15 min)
This is the game-changer. Coolify turns your server into a self-hosted Vercel/Netlify. Git push → auto deploy. It'll become the foundation for everything you build.
→ [Deploy Coolify](/deploy/coolify)
## After the Starter Kit
Once you're comfortable, explore the [Curated Stacks](/stacks) — pre-built bundles of tools designed for specific use cases:
- 🚀 [The Bootstrapper Stack](/stacks/bootstrapper) — Full SaaS toolkit for $0/mo
- 🔒 [The Privacy Stack](/stacks/privacy) — Maximum data sovereignty
- 🤖 [The AI-First Stack](/stacks/ai-first) — Run LLMs and image gen locally

View File

@@ -0,0 +1,62 @@
---
title: What is Self-Hosting?
description: "Self-hosting explained without the gatekeeping. What it is, why you'd do it, and what you actually need to get started."
---
# What is Self-Hosting?
**In one sentence:** Self-hosting means running software on a server *you* control, instead of paying someone else to run it for you.
That's it. That's the whole concept.
When you use Gmail, Google runs the email server. When you use Notion, Notion Inc runs the database. When you self-host, **you** run these things — on a cheap VPS, a spare laptop, or even a Raspberry Pi.
## Why Would You Do This?
| Reason | What It Means |
|---|---|
| **💰 Cost** | Most open source tools are free. A $5/mo server can replace $200+/mo in SaaS subscriptions. |
| **🔒 Privacy** | Your data lives on your server. No one mines it, sells it, or trains AI on it. |
| **🎛️ Control** | No surprise feature removals. No price hikes. No "we're sunsetting this product" emails. |
| **🧠 Learning** | You'll actually understand how software works. This makes you a better developer, designer, or founder. |
## What You Actually Need
Here's the brutal truth: **self-hosting requires effort**. Not *genius-level* effort, but *following-a-recipe* effort.
You need three things:
1. **A server** — A $46/mo VPS from Hetzner, [DigitalOcean](https://m.do.co/c/2ed27757a361), or similar. [We compare them →](/quick-start/choosing-a-server)
2. **Docker** — The tool that packages software into neat, runnable containers. [Docker basics →](/concepts/docker-basics)
3. **20 minutes of patience** — Most tools deploy in under 20 minutes if you follow our guides.
> 🔥 **Pro Tip:** You don't need to know Linux commands by heart. You need to know how to copy-paste. Seriously.
## The Self-Hosting Spectrum
Not all self-hosting is equal. Here's where most people land:
```
Easy ─────────────────────────────────────── Hard
Docker run Docker Compose Kubernetes
(1 command) (1 YAML file) (for masochists)
```
**Good news:** 95% of the tools in our directory work with Docker Compose — a single file that describes your entire setup. Our guides always give you that file, ready to go.
## Common Fears (Debunked)
**"I'll get hacked"** → You're more likely to get breached through a SaaS provider's data leak than through a properly configured VPS with a firewall and SSH keys.
**"I can't handle maintenance"** → Docker makes updates a two-command affair: `docker-compose pull && docker-compose up -d`. That's it.
**"What if it breaks at 3 AM?"** → Set up [Uptime Kuma](/deploy/uptime-kuma) (takes 5 minutes) and you'll know before your users do.
**"I don't have time"** → You don't have time to submit GDPR data requests to 47 SaaS vendors either. Pick your battles.
## Next Steps
Ready? Let's deploy something real.
→ [Your First Deployment](/quick-start/first-deployment) — Get a tool running in 5 minutes flat.

60
docs/app/sitemap.ts Normal file
View File

@@ -0,0 +1,60 @@
import { MetadataRoute } from 'next'
import path from 'path'
import fs from 'fs'
const BASE_URL = 'https://docs.thealtstack.com'
/**
* Dynamically generates the sitemap for the docs site by scanning
* the app directory for all page.mdx files. This replaces the old
* static public/sitemap.xml that would drift out of sync.
*/
export default function sitemap(): MetadataRoute.Sitemap {
const appDir = path.join(process.cwd(), 'app')
const pages: string[] = []
// Recursively find all page.mdx files
function scan(dir: string, prefix: string) {
const entries = fs.readdirSync(dir, { withFileTypes: true })
for (const entry of entries) {
// Skip hidden dirs, node_modules, test dirs
if (entry.name.startsWith('.') || entry.name === 'node_modules' || entry.name === 'test') continue
if (entry.isDirectory()) {
scan(path.join(dir, entry.name), `${prefix}/${entry.name}`)
} else if (entry.name === 'page.mdx') {
// Root page.mdx → '/', nested → '/concepts/docker-basics'
pages.push(prefix || '/')
}
}
}
scan(appDir, '')
// Priority map for top-level sections
const priorityMap: Record<string, number> = {
'/': 1.0,
'/quick-start': 0.9,
'/deploy': 0.8,
'/concepts': 0.8,
'/stacks': 0.7,
}
return pages.map(pagePath => {
// Determine priority based on section
const section = '/' + (pagePath.split('/')[1] || '')
const priority = priorityMap[section] || priorityMap[pagePath] || 0.6
// Determine change frequency
let changeFrequency: 'daily' | 'weekly' | 'monthly' | 'yearly' = 'monthly'
if (pagePath === '/') changeFrequency = 'weekly'
if (pagePath.startsWith('/deploy')) changeFrequency = 'weekly'
return {
url: `${BASE_URL}${pagePath}`,
lastModified: new Date(),
changeFrequency,
priority,
}
})
}

21
docs/app/stacks/_meta.ts Normal file
View File

@@ -0,0 +1,21 @@
import type { MetaRecord } from 'nextra'
const meta: MetaRecord = {
bootstrapper: {
title: '🚀 The Bootstrapper Stack',
},
designer: {
title: '🎨 The Designer Stack',
},
'ai-first': {
title: '🤖 The AI-First Stack',
},
devops: {
title: '⚙️ The DevOps Stack',
},
privacy: {
title: '🔒 The Privacy Stack',
},
}
export default meta

View File

@@ -0,0 +1,38 @@
---
title: "The AI-First Stack"
description: "Own your AI. Run LLMs, image generation, and code assistants locally with zero API keys, zero usage limits, and zero data leaving your machine."
---
# 🤖 The AI-First Stack
**Own your AI.** Run powerful AI locally. No API keys, no usage limits, no data leaving your machine.
| What | Tool | Replaces |
|---|---|---|
| LLM Inference | [Llama](/deploy/llama) | ChatGPT ($20/mo) |
| Coding Model | [DeepSeek](/deploy/deepseek) | GitHub Copilot ($10/mo) |
| Image Generation | [Stable Diffusion](/deploy/stable-diffusion) | Midjourney ($10/mo) |
| IDE Assistant | [Continue.dev](/deploy/continue-dev) | Copilot extension ($10/mo) |
| Code Autocomplete | [Tabby](/deploy/tabby) | Tabnine ($12/mo) |
**Total saved: ~$69/mo** (nice)
## Hardware Requirements
Running AI locally requires GPU horsepower. Here's what you need:
| Model Type | Minimum VRAM | Recommended GPU |
|---|---|---|
| Small LLMs (7B params) | 6 GB | RTX 3060, RTX 4060 |
| Large LLMs (70B params) | 48 GB | 2× RTX 3090, A6000 |
| Image Generation (SDXL) | 8 GB | RTX 3070+ |
| Code Models (DeepSeek) | 8 GB | RTX 4060+ |
> 🔥 **Pro Tip:** Start with Ollama + Llama 3. It runs well on an 8GB GPU and gives you a local ChatGPT replacement in under 5 minutes.
## Deploy Guides
→ [Deploy Ollama (LLM Runner)](/deploy/ollama)
→ [Deploy Stable Diffusion](/deploy/stable-diffusion)
→ [Deploy Tabby (Code AI)](/deploy/tabby)
→ [Deploy Continue.dev](/deploy/continue-dev)

View File

@@ -0,0 +1,70 @@
---
title: "The Bootstrapper Stack"
description: "Launch your SaaS for $0/mo. The complete open source stack with database, auth, deployment, analytics, project management, and design."
---
# 🚀 The Bootstrapper Stack
**Launch for $0/mo.** Everything you need to build, ship, and manage a SaaS product without spending a dime on software.
| What | Tool | Monthly SaaS Cost Replaced |
|---|---|---|
| Database & Auth | [Supabase](/deploy/supabase) | ~$25/mo (Firebase) |
| Project Management | [Plane](/deploy/plane) | ~$10/mo (Jira) |
| Team Chat | [Rocket.Chat](/deploy/rocketchat) | ~$7/mo (Slack) |
| Deployment PaaS | [Coolify](/deploy/coolify) | ~$20/mo (Vercel Pro) |
| Web Analytics | [Plausible](/deploy/plausible) | ~$9/mo (Plausible Cloud) |
| UI/UX Design | [Penpot](/deploy/penpot) | ~$15/mo (Figma) |
**Total saved: ~$310/mo** · **Your cost: ~$6/mo (one VPS)**
## Deploy Order
Deploy in this order — each tool builds on the previous:
### 1. Coolify (your PaaS)
Coolify turns your VPS into a self-hosted Vercel. Once it's running, you can deploy everything else *through it*.
→ [Deploy Coolify](/deploy/coolify)
### 2. Supabase (your backend)
Database, authentication, storage, and realtime — all in one. This is your app's backbone.
→ [Deploy Supabase](/deploy/supabase)
### 3. Plausible (your analytics)
Drop Google Analytics. Plausible is lightweight, cookie-free, and respects your users' privacy.
→ [Deploy Plausible](/deploy/plausible)
### 4. Plane (your project board)
Jira without the Jira experience. Clean, fast, issue tracking that doesn't make you want to quit.
→ [Deploy Plane](/deploy/plane)
### 5. Rocket.Chat (your team chat)
Slack without the $7/user/mo. Self-hosted, full-featured, and it doesn't sell your conversations.
→ [Deploy Rocket.Chat](/deploy/rocketchat)
### 6. Penpot (your design tool)
open source Figma alternative. Real-time collaboration, SVG-based, and free forever.
→ [Deploy Penpot](/deploy/penpot)
## Server Requirements
| Spec | Recommended |
|---|---|
| RAM | 4 GB minimum (8 GB ideal) |
| CPU | 2 vCPU |
| Storage | 40 GB SSD |
| OS | Ubuntu 22.04+ or Debian 12+ |
| Monthly cost | ~$6 (Hetzner CX22) |
## Who This Is For
- Solo founders building a SaaS MVP
- Early-stage startups that refuse to burn cash on software
- Developers who want to control their entire stack
- Anyone tired of the "free tier" → "pay us now" bait-and-switch

View File

@@ -0,0 +1,37 @@
---
title: "The Designer Stack"
description: "Ditch Creative Cloud. Professional open source design tools for UI/UX, photo editing, digital art, and documentation."
---
# 🎨 The Designer Stack
**Ditch Creative Cloud.** Professional design tools that rival Adobe — from UI/UX prototyping to photo editing and digital art.
| What | Tool | Replaces |
|---|---|---|
| UI/UX Design | [Penpot](/deploy/penpot) | Figma ($15/mo) |
| Photo Editing | [GIMP](/deploy/gimp) | Photoshop ($22/mo) |
| Digital Art | [Krita](/deploy/krita) | Procreate / Illustrator ($22/mo) |
| Knowledge Base | [AppFlowy](/deploy/appflowy) | Notion ($10/mo) |
**Total saved: ~$110/mo**
## The Honest Take
Let's be real: these tools don't have feature parity with Adobe. But for 90% of design work — UI mockups, web design, photo editing, illustrations — they're more than enough. And the gap closes every month.
**Where they shine:**
- Penpot is genuinely better than Figma for developers (SVG-native, CSS grid support)
- GIMP handles 95% of what Photoshop does
- Krita is beloved by digital artists — many prefer it over paid alternatives
**Where they struggle:**
- Video editing (no open source premiere replacement yet)
- Print design workflows (InDesign still wins here)
## Deploy Guides
→ [Deploy Penpot](/deploy/penpot)
→ [Deploy GIMP](/deploy/gimp)
→ [Deploy Krita](/deploy/krita)
→ [Deploy AppFlowy](/deploy/appflowy)

View File

@@ -0,0 +1,46 @@
---
title: "The DevOps Stack"
description: "Self-host your entire infrastructure. Backend, hosting, deployment, analytics, and monitoring — zero vendor lock-in."
---
# ⚙️ The DevOps Stack
**Self-host everything.** From backend to hosting to monitoring — deploy and manage your entire infrastructure on your own terms.
| What | Tool | Replaces |
|---|---|---|
| Backend as a Service | [Supabase](/deploy/supabase) | Firebase ($25+/mo) |
| PaaS (Deployment) | [Coolify](/deploy/coolify) | Vercel Pro ($20/mo) |
| Git Deployment | [Dokku](/deploy/dokku) | Heroku ($25/mo) |
| Web Analytics | [Plausible](/deploy/plausible) | Google Analytics (free, but your data) |
| Product Analytics | [PostHog](/deploy/posthog) | Amplitude ($49/mo) |
**Total saved: ~$375/mo**
## The Philosophy
The DevOps Stack is for teams that refuse to be dependent on any single vendor. Every tool here:
- **Runs on standard Docker** — migrate anywhere in minutes
- **Uses Postgres** — your data is in an open format
- **Has an active community** — you're never truly on your own
- **Scales horizontally** — grows with you without pricing tiers
## Server Requirements
This is the most resource-intensive stack. You need a proper server:
| Spec | Recommended |
|---|---|
| RAM | 8 GB minimum (16 GB ideal) |
| CPU | 4 vCPU |
| Storage | 80 GB SSD |
| Cost | ~$15/mo (Hetzner CX32) |
## Deploy Guides
→ [Deploy Supabase](/deploy/supabase)
→ [Deploy Coolify](/deploy/coolify)
→ [Deploy Dokku](/deploy/dokku)
→ [Deploy Plausible](/deploy/plausible)
→ [Deploy PostHog](/deploy/posthog)

152
docs/app/stacks/page.mdx Normal file
View File

@@ -0,0 +1,152 @@
---
title: Curated Stacks
description: "Pre-tested bundles of open source tools designed for specific use cases. Save hundreds per month by self-hosting an entire toolkit."
---
import { Rocket, Palette, Bot, Settings, Lock, ArrowRight, DollarSign, Layers } from 'lucide-react'
# Curated Stacks
**A Curated Stack is a pre-tested bundle of open source tools designed for a specific use case.** Instead of researching, comparing, and testing 50 tools yourself, we've done it for you.
Each stack tells you exactly which tools to deploy, in what order, on what hardware — and how much SaaS money you'll save.
## The 5 Stacks
<div className="premium-grid mt-8">
<a href="/stacks/bootstrapper" className="premium-card group">
<div className="premium-card-title">
<div className="p-2 rounded-lg bg-red-500/10 text-red-500 group-hover:bg-red-500/20 transition-colors">
<Rocket size={20} />
</div>
<span>The Bootstrapper Stack</span>
</div>
<p className="premium-card-description">Full SaaS toolkit for solo founders. Database, auth, deployment, analytics, project management, and design.</p>
<div className="flex items-center gap-4 mt-4 text-xs font-bold text-[var(--altstack-text-dim)]">
<span className="text-green-500">Saves ~$310/mo</span>
<span>6 tools</span>
<span>4 GB RAM</span>
</div>
<div className="absolute bottom-6 right-6 opacity-0 group-hover:opacity-100 transition-opacity text-red-500">
<ArrowRight size={18} />
</div>
</a>
<a href="/stacks/designer" className="premium-card group">
<div className="premium-card-title">
<div className="p-2 rounded-lg bg-purple-500/10 text-purple-500 group-hover:bg-purple-500/20 transition-colors">
<Palette size={20} />
</div>
<span>The Designer Stack</span>
</div>
<p className="premium-card-description">Professional design tools that rival Adobe. UI/UX prototyping, photo editing, and digital art — all free.</p>
<div className="flex items-center gap-4 mt-4 text-xs font-bold text-[var(--altstack-text-dim)]">
<span className="text-green-500">Saves ~$110/mo</span>
<span>4 tools</span>
<span>4 GB RAM</span>
</div>
<div className="absolute bottom-6 right-6 opacity-0 group-hover:opacity-100 transition-opacity text-purple-500">
<ArrowRight size={18} />
</div>
</a>
<a href="/stacks/ai-first" className="premium-card group">
<div className="premium-card-title">
<div className="p-2 rounded-lg bg-blue-500/10 text-blue-500 group-hover:bg-blue-500/20 transition-colors">
<Bot size={20} />
</div>
<span>The AI-First Stack</span>
</div>
<p className="premium-card-description">Run powerful AI locally. LLMs, image generation, and code completion — no API keys, no usage limits.</p>
<div className="flex items-center gap-4 mt-4 text-xs font-bold text-[var(--altstack-text-dim)]">
<span className="text-green-500">Saves ~$69/mo</span>
<span>5 tools</span>
<span>8+ GB RAM</span>
</div>
<div className="absolute bottom-6 right-6 opacity-0 group-hover:opacity-100 transition-opacity text-blue-500">
<ArrowRight size={18} />
</div>
</a>
<a href="/stacks/devops" className="premium-card group">
<div className="premium-card-title">
<div className="p-2 rounded-lg bg-orange-500/10 text-orange-500 group-hover:bg-orange-500/20 transition-colors">
<Settings size={20} />
</div>
<span>The DevOps Stack</span>
</div>
<p className="premium-card-description">From backend to hosting to monitoring — deploy and manage your entire infrastructure with zero vendor lock-in.</p>
<div className="flex items-center gap-4 mt-4 text-xs font-bold text-[var(--altstack-text-dim)]">
<span className="text-green-500">Saves ~$375/mo</span>
<span>5 tools</span>
<span>4 GB RAM</span>
</div>
<div className="absolute bottom-6 right-6 opacity-0 group-hover:opacity-100 transition-opacity text-orange-500">
<ArrowRight size={18} />
</div>
</a>
<a href="/stacks/privacy" className="premium-card group">
<div className="premium-card-title">
<div className="p-2 rounded-lg bg-green-500/10 text-green-500 group-hover:bg-green-500/20 transition-colors">
<Lock size={20} />
</div>
<span>The Privacy Stack</span>
</div>
<p className="premium-card-description">Every tool runs on your infrastructure. Your data never touches a third-party server. Maximum data sovereignty.</p>
<div className="flex items-center gap-4 mt-4 text-xs font-bold text-[var(--altstack-text-dim)]">
<span className="text-green-500">Saves ~$185/mo</span>
<span>6 tools</span>
<span>4 GB RAM</span>
</div>
<div className="absolute bottom-6 right-6 opacity-0 group-hover:opacity-100 transition-opacity text-green-500">
<ArrowRight size={18} />
</div>
</a>
</div>
---
## How We Pick Tools
Every tool in a Curated Stack must pass five filters:
| Criteria | What It Means |
|---|---|
| **Actively maintained** | Regular commits, responsive maintainers, not abandonware |
| **Docker-native** | Ships with official or well-maintained Docker images |
| **Production-proven** | Used by real teams and individuals, not just demo projects |
| **Honest quality** | We've actually deployed it. If the UX is rough, we say so |
| **No vendor lock-in** | Standard data formats, exportable data, no proprietary traps |
We don't include tools because they're popular. We include them because they actually work when you deploy them on a $6/mo VPS.
## Which Stack Is Right for You?
| If you are... | Start with |
|---|---|
| A solo founder building a SaaS MVP | [The Bootstrapper Stack](/stacks/bootstrapper) |
| A designer ditching Adobe subscriptions | [The Designer Stack](/stacks/designer) |
| An AI enthusiast who wants to run models locally | [The AI-First Stack](/stacks/ai-first) |
| A developer managing your own infrastructure | [The DevOps Stack](/stacks/devops) |
| Anyone who cares deeply about data privacy | [The Privacy Stack](/stacks/privacy) |
## Mixing & Matching
Stacks aren't exclusive — tools overlap by design. Many teams run a combination:
- **Bootstrapper + AI-First** → SaaS toolkit with local AI capabilities
- **DevOps + Privacy** → Full infrastructure with maximum data sovereignty
- **Designer + Bootstrapper** → Creative team with SaaS backbone
The only constraint is hardware. Each stack page lists specific RAM, CPU, and storage requirements. If you're running multiple stacks, add the requirements together and size your VPS accordingly.
> 🔥 **Pro Tip:** Start with one stack. Get comfortable. Then layer on tools from other stacks as you need them. Trying to deploy everything at once is how people burn out.
## Build Your Own Stack
Don't see your perfect combination? Browse the [Deploy Guides](/deploy) — every tool has an independent deployment page. Pick the ones that fit your workflow and build a custom stack.
If you want to suggest a new Curated Stack, [open an issue on GitHub](https://github.com/AltStackHQ/docs/issues) and we'll consider adding it.

View File

@@ -0,0 +1,47 @@
---
title: "The Privacy Stack"
description: "Zero data leaks. Every tool runs on your infrastructure. Your data never touches a third-party server."
---
# 🔒 The Privacy Stack
**Zero data leaks.** Every tool runs on your infrastructure. Your data never touches a third-party server. For teams and individuals who take privacy seriously.
| What | Tool | Replaces |
|---|---|---|
| Password Manager | [Bitwarden](/deploy/bitwarden) | 1Password ($3/mo) |
| Team Chat | [Mattermost](/deploy/mattermost) | Slack ($7/mo) |
| Video Calls | [Jitsi Meet](/deploy/jitsi-meet) | Zoom ($14/mo) |
| Analytics | [Matomo](/deploy/matomo) | Google Analytics (free, sells your data) |
| Notes & Docs | [AppFlowy](/deploy/appflowy) | Notion ($10/mo) |
| Knowledge Base | [Affine](/deploy/affine) | Confluence ($6/mo) |
**Total saved: ~$185/mo**
## Why Privacy Matters
It's not about having "something to hide." It's about:
- **Compliance**: GDPR, HIPAA, SOC 2 — self-hosting makes audits simpler
- **IP Protection**: Your internal docs and conversations stay *internal*
- **Trust**: Your users' data is on your servers, not in someone else's quarterly report
- **Sovereignty**: No foreign government can compel access to your data on a third-party server
## The Privacy Audit
For each tool in this stack, we verify:
- ✅ **No telemetry** (or can be disabled)
- ✅ **No external API calls** after deployment
- ✅ **Data stored locally** in your Postgres / filesystem
- ✅ **End-to-end encryption** available where applicable
- ✅ **Self-contained** — works offline
## Deploy Guides
→ [Deploy Bitwarden](/deploy/bitwarden)
→ [Deploy Mattermost](/deploy/mattermost)
→ [Deploy Jitsi Meet](/deploy/jitsi-meet)
→ [Deploy Matomo](/deploy/matomo)
→ [Deploy AppFlowy](/deploy/appflowy)
→ [Deploy Affine](/deploy/affine)

79
docs/app/why/page.mdx Normal file
View File

@@ -0,0 +1,79 @@
---
title: Why These Docs Exist
description: "The AltStack Docs manifesto. Why we built these guides, what makes them different, and the rules we follow."
---
# Why These Docs Exist
**Most self-hosting documentation is terrible.** Not because the tools are bad — because the docs are written by developers who already understand everything, for developers who already understand everything.
We built these docs to fix that.
## The Problem
Go try to self-host any popular open-source tool right now. Here's what you'll find:
- **Incomplete `docker-compose.yml` files** that reference environment variables nobody explains
- **"Getting Started" guides** that skip the 3 steps where you actually get stuck
- **Documentation written in 2019** for a codebase that's been rewritten twice since
- **The dreaded "see the wiki"** link that leads to 47 half-finished pages
You're not stupid for finding this confusing. The documentation is genuinely bad.
## Our Philosophy
Every guide in these docs follows a simple principle:
> **If you can't go from zero to a working deployment by following this page alone, the page is broken.**
We don't write theoretical explanations of how Docker networking works and then wish you luck. We give you the config file. We explain what each line does. We tell you where it'll probably break and how to fix it.
## The 4 Rules
These aren't suggestions — they're the editorial standard every page must meet.
### 1. Every guide ends with a working deployment
Not "and then configure it to your needs." Not "refer to the upstream docs for advanced configuration." You will have a running tool by the end of the page. Period.
### 2. Every config is tested and copy-pasteable
We don't write configs from memory. Every `docker-compose.yml` in these docs has been deployed, broken, fixed, and deployed again. You can copy-paste them and they will work.
### 3. Every tool gets an honest verdict
We'll tell you when a tool is incredible. We'll also tell you when it's buggy, when the mobile app is unusable, or when you should just pay for the SaaS version. We don't have sponsors. We don't have affiliate deals. We have opinions.
### 4. We don't waste your time with filler
No "Introduction to What This Tool Is" sections that restate the tool's homepage copy. No "Prerequisites: a computer with an internet connection." If you're reading this, you know what a terminal is. Let's deploy something.
## What Makes Us Different
| Typical Docs | AltStack Docs |
|---|---|
| "Configure the environment variables as needed" | Here's every variable, what it does, and the sane default |
| "Deploy using Docker" (no compose file provided) | Full `docker-compose.yml` ready to copy |
| Written by the tool's maintainer (biased) | Written by users who deploy these tools (honest) |
| Assumes you've read 12 other pages first | Self-contained. One page = one working deployment |
| Last updated 2 years ago | Actively maintained with version-specific notes |
## Who's Behind This
These docs are part of [The AltStack](https://thealtstack.com) — **The World's First Sovereign Infrastructure Engine**. We're a curated directory that helps you find, compare, and deploy alternatives to proprietary tools.
We believe in software independence: the right to run your own tools, on your own servers, under your own terms. These docs are how we make that practical, not just philosophical.
## Where to Start
If you're brand new to self-hosting:
→ **[Quick Start](/quick-start)** — From zero to your first deployment in under 20 minutes
If you know what you're doing and want a config:
→ **[Deploy Guides](/deploy)** — 65+ tools with tested Docker Compose files
If you want a complete toolkit:
→ **[Curated Stacks](/stacks)** — Pre-built bundles for bootstrappers, designers, DevOps, AI, and privacy

Some files were not shown because too many files have changed in this diff Show More