mirror of
https://github.com/Dvorinka/Containr.git
synced 2026-10-28 07:41:27 +00:00
Overhaul: real metrics, Git integration UI, open-source hygiene, root cleanup
Backend: - GET /services/:id/metrics with real Docker container stats - DELETE /git/providers/:id and GET repo branches endpoint Frontend: - Service detail shows real telemetry or honest empty states - Live status distinguishes idle/polling/reconnecting - Git providers section in Settings; repo+branch pickers in Add Service - Real logo, compact Projects header, canvas fitView fix - index.css deduplicated (1725 -> 1384 lines) - Fixed smoke tests, lint errors, ToastProvider/context unification Repo hygiene: - Added LICENSE (MIT), CONTRIBUTING.md, SECURITY.md; rewrote README - Untracked .env.prod and data/letsencrypt secrets; fixed .gitignore - Removed legacy root src/internal/cmd and stale configs/docs/artifacts - Moved guides and design references under docs/ Generated with [Devin](https://devin.ai) Co-Authored-By: Devin <158243242+devin-ai-integration[bot]@users.noreply.github.com>
This commit is contained in:
1 parent
355a97bab4
commit
9f3b196032
499 files changed
+4471
-94235
No files matched your search
Binary file not shown.
|
After Width: | Height: | Size: 623 KiB |
@@ -0,0 +1,63 @@
|
||||
# 🚆 What the Railway Dashboard Is
|
||||
|
||||
The Railway dashboard is the main web interface for managing your Railway cloud projects. It’s essentially your control panel where you can see, organize, configure, and monitor everything you’re hosting on Railway — services, deployments, databases, environments, logs, metrics, and more.
|
||||
|
||||
You typically land on the dashboard after signing into your Railway account. It’s the central hub that gives you a high-level view of all your projects and infrastructure.
|
||||
|
||||
## 🧠 What It Lets You Do
|
||||
|
||||
### 📦 1. See and Manage Projects
|
||||
|
||||
The dashboard shows all projects you own or belong to, sorted by recent activity.
|
||||
|
||||
Each project can contain multiple services (like a web app, API, worker, database).
|
||||
|
||||
From the dashboard you can click into each project to manage details.
|
||||
|
||||
### ⚙️ 2. Configure and Deploy Services
|
||||
|
||||
Within a project, you can link code repositories (GitHub) or container images.
|
||||
|
||||
Railway handles build and deploy processes automatically — including automatic configuration for many languages/frameworks.
|
||||
|
||||
Deployments are shown with statuses (building, deployed, errors).
|
||||
|
||||
### 📊 3. Monitoring & Observability
|
||||
|
||||
View logs and performance metrics (CPU, memory, network, disk usage) per service.
|
||||
|
||||
You can create dashboards with charts and custom widgets for things like request rates or error logs.
|
||||
|
||||
Set alerts for thresholds (like high CPU or errors) and receive notifications via Slack, Discord, email, and more.
|
||||
|
||||
### 🔐 4. Manage Secrets & Environment Variables
|
||||
|
||||
Set configuration variables (like API keys or database URLs) that your services use.
|
||||
|
||||
Variables can be scoped to services or shared across the entire project.
|
||||
|
||||
### 🔁 5. Staging & Environments
|
||||
|
||||
Railway supports multiple environments (dev, staging, prod).
|
||||
|
||||
You can preview changes in separate environments and promote or rollback deployments with a click.
|
||||
|
||||
### 📚 6. Templates & One-Click Deploy
|
||||
|
||||
Access a library of templates to quickly deploy common stacks (e.g., databases with backend, analytics tools).
|
||||
|
||||
Templates auto-provision services and databases as a project.
|
||||
|
||||
## 🧑💻 How It Works (Behind the Scenes)
|
||||
|
||||
Railway’s dashboard directly reflects the state of your projects by talking to its API backend (the same API used by their CLI). It pulls data like:
|
||||
|
||||
Project list and status
|
||||
|
||||
Deployment logs and history
|
||||
|
||||
Resources (CPU, memory, traffic)
|
||||
|
||||
Environment and configuration values
|
||||
|
||||
Changes you make in the dashboard (like redeploying or updating variables) are sent back to the Railway API and applied to your infrastructure.
|
||||
@@ -0,0 +1,254 @@
|
||||
# 🧩 What the Project Page Is
|
||||
|
||||
The Project page represents one isolated application environment on Railway.
|
||||
|
||||
Think of a project as:
|
||||
|
||||
> A self-contained box that holds all services, databases, configs, deployments, logs, metrics, and environments for one product or system.
|
||||
|
||||
### Example Structure
|
||||
|
||||
```
|
||||
One project = spark-screen
|
||||
├── Go backend
|
||||
├── Frontend (Vite/Solid)
|
||||
├── PostgreSQL
|
||||
├── Redis
|
||||
├── Worker / cron
|
||||
└── Preview + Production environments
|
||||
```
|
||||
|
||||
## 🗺️ Main Layout of the Project Page
|
||||
|
||||
Visually, the project page is built around a canvas + side panels model.
|
||||
|
||||
### 1️⃣ Project Canvas (Center)
|
||||
|
||||
This is the graph view you see first.
|
||||
|
||||
### What it shows:
|
||||
|
||||
- **Each service as a card** (app, db, worker, etc.)
|
||||
- **Lines showing relationships** (e.g. `backend → database`)
|
||||
- **Deployment status per service**
|
||||
|
||||
### Each card usually displays:
|
||||
|
||||
- **Service name**
|
||||
- **Source** (GitHub repo, Dockerfile, template)
|
||||
- **Current deployment status** (running, building, failed)
|
||||
- **Quick access to logs & settings**
|
||||
|
||||
> 👉 This canvas is not just visual — it reflects actual runtime dependencies.
|
||||
|
||||
### 2️⃣ Services (Core Units)
|
||||
|
||||
Each box on the canvas is a Service.
|
||||
|
||||
A service can be:
|
||||
|
||||
- **Web app** (Go, Node, Bun, Python, etc.)
|
||||
- **Background worker**
|
||||
- **Cron job**
|
||||
- **Database** (Postgres, Redis, MySQL)
|
||||
- **Custom Docker container**
|
||||
|
||||
Clicking a service opens its Service Detail Panel.
|
||||
|
||||
## 🔍 Inside a Service (Very Important)
|
||||
|
||||
When you click a service, you get several tabs:
|
||||
|
||||
### ⚙️ Settings
|
||||
|
||||
This is the brain of the service.
|
||||
|
||||
You configure:
|
||||
|
||||
- **Source**
|
||||
- GitHub repo (via GitHub App)
|
||||
- Branch
|
||||
- Root directory
|
||||
- **Build**
|
||||
- Build command
|
||||
- Start command
|
||||
- Dockerfile (optional)
|
||||
- **Resources**
|
||||
- CPU / RAM limits
|
||||
- **Networking**
|
||||
- Public domain
|
||||
- Internal service-to-service URLs
|
||||
|
||||
> **How it works:** Any change here triggers a new deployment. Railway stores this config and applies it at runtime.
|
||||
|
||||
### 🔐 Variables (Environment Variables)
|
||||
|
||||
This is where Railway shines.
|
||||
|
||||
Key–value environment variables
|
||||
|
||||
Can be:
|
||||
|
||||
- **Service-specific**
|
||||
- **Shared across the project**
|
||||
- **Environment-scoped** (prod / preview)
|
||||
|
||||
### Examples:
|
||||
|
||||
```
|
||||
DATABASE_URL
|
||||
REDIS_URL
|
||||
JWT_SECRET
|
||||
PORT
|
||||
```
|
||||
|
||||
|
||||
> **Behind the scenes:**
|
||||
>
|
||||
> - Injected into the container at runtime
|
||||
> - Never hardcoded into images
|
||||
> - Securely stored and masked in UI
|
||||
|
||||
### 📦 Deployments
|
||||
|
||||
This tab shows:
|
||||
|
||||
- **Full deployment history**
|
||||
- **Commit hash** (if GitHub)
|
||||
- **Build logs**
|
||||
- **Runtime logs**
|
||||
- **Rollback button**
|
||||
|
||||
> **How it works:**
|
||||
>
|
||||
> 1. Git push (or manual deploy)
|
||||
> 2. Railway pulls code
|
||||
> 3. Builds container (Railpack or Docker)
|
||||
> 4. Starts new instance
|
||||
> 5. Old one is replaced (zero-downtime when possible)
|
||||
|
||||
### 📜 Logs
|
||||
|
||||
### Real-time logs:
|
||||
|
||||
- **stdout / stderr**
|
||||
- **Build logs**
|
||||
- **Runtime errors**
|
||||
|
||||
Logs are:
|
||||
|
||||
- **Per-service**
|
||||
- **Per-deployment**
|
||||
- **Streamed live from containers**
|
||||
|
||||
> This is basically `docker logs` but cloud-native.
|
||||
|
||||
### 📊 Metrics
|
||||
|
||||
### Per-service metrics:
|
||||
|
||||
- **CPU usage**
|
||||
- **Memory usage**
|
||||
- **Network traffic**
|
||||
- **Disk usage** (for DBs)
|
||||
|
||||
This helps you:
|
||||
|
||||
- **Detect leaks**
|
||||
- **Decide when to optimize**
|
||||
- **Understand cost drivers**
|
||||
|
||||
## 🧱 Databases Inside a Project
|
||||
|
||||
Databases are first-class services, not addons.
|
||||
|
||||
When you add:
|
||||
|
||||
- **PostgreSQL**
|
||||
- **Redis**
|
||||
- **MySQL**
|
||||
|
||||
Railway:
|
||||
|
||||
- **Provisions it**
|
||||
- **Injects connection URLs**
|
||||
- **Handles backups** (plan-dependent)
|
||||
|
||||
Databases:
|
||||
|
||||
- **Appear on the same canvas**
|
||||
- **Can be linked to multiple services**
|
||||
- **Expose internal connection strings only**
|
||||
|
||||
### Database Benefits
|
||||
|
||||
- **Easy setup**
|
||||
- **Managed backups**
|
||||
- **Internal connection strings**
|
||||
|
||||
## 🌍 Environments (Prod, Preview, Dev)
|
||||
|
||||
Each project can have multiple environments.
|
||||
|
||||
### Common setup:
|
||||
|
||||
- **Production** – live app
|
||||
- **Preview** – per-PR deployments
|
||||
- **Development** – testing
|
||||
|
||||
### What changes per environment:
|
||||
|
||||
- **Variables**
|
||||
- **Domains**
|
||||
- **Deployments**
|
||||
- **Scaling**
|
||||
|
||||
> This is not separate projects — it's logical isolation inside one project.
|
||||
|
||||
## 👥 Project-Level Controls
|
||||
|
||||
At the project level (not service-level):
|
||||
|
||||
### 👤 Members & Permissions
|
||||
|
||||
- **Invite teammates**
|
||||
- **Control access** (admin / developer)
|
||||
|
||||
### 🔔 Notifications
|
||||
|
||||
- **Deploy failures**
|
||||
- **Usage alerts**
|
||||
- **Service crashes**
|
||||
|
||||
### 💳 Usage & Billing
|
||||
|
||||
- **CPU hours**
|
||||
- **RAM hours**
|
||||
- **Network**
|
||||
- **Cost per service**
|
||||
|
||||
## 🧠 How the Project Page Works Internally
|
||||
|
||||
Under the hood:
|
||||
|
||||
- **The UI talks to the Railway API**
|
||||
- **Every service = container + config**
|
||||
- **Every deploy = immutable container version**
|
||||
- **Variables = injected at runtime**
|
||||
- **Services communicate via private internal network**
|
||||
|
||||
> So the project page is essentially: a visual orchestrator for containers, deployments, configs, and environments
|
||||
|
||||
## 🧠 Mental Model (Best Way to Think About It)
|
||||
|
||||
If Docker Compose had:
|
||||
|
||||
- **A UI**
|
||||
- **GitHub auto-deploys**
|
||||
- **Built-in databases**
|
||||
- **Metrics**
|
||||
- **Logs**
|
||||
- **Secrets**
|
||||
- **Environments**
|
||||
|
||||
> 👉 That's the Railway project page.
|
||||
@@ -0,0 +1,234 @@
|
||||
# 🎮 Docker Template Manager - In-App Deployment System
|
||||
|
||||
## 🚀 **Fully Integrated App-Based Deployment**
|
||||
|
||||
I've created a **complete in-app deployment system** that runs entirely within your web application - no terminal needed!
|
||||
|
||||
### 📱 **What You Get**
|
||||
|
||||
#### **🎮 Visual Template Manager**
|
||||
- **Grid view** of all 20 Docker templates
|
||||
- **One-click deployment** with visual feedback
|
||||
- **Real-time progress** tracking
|
||||
- **Live deployment logs**
|
||||
- **Status indicators** (idle, deploying, running, stopped)
|
||||
- **Access URLs** with clickable links
|
||||
|
||||
#### **📊 Dashboard Features**
|
||||
- **Template cards** with icons and descriptions
|
||||
- **Difficulty badges** (Easy, Medium, Hard)
|
||||
- **Category filtering** (Analytics, Media, Storage, etc.)
|
||||
- **Deployment statistics** (total, deployed, running)
|
||||
- **Success rate** tracking
|
||||
|
||||
#### **🎯 Interactive Controls**
|
||||
- **Deploy button** - One-click deployment
|
||||
- **Stop button** - Stop running services
|
||||
- **Remove button** - Clean up deployments
|
||||
- **Deploy All** - Deploy all easy templates
|
||||
- **Filter tabs** - View by category or status
|
||||
|
||||
### 🖥️ **How It Works in Your App**
|
||||
|
||||
#### **1. Visual Template Selection**
|
||||
```typescript
|
||||
// Users see this in the app:
|
||||
📊 Glance Dashboard [Deploy]
|
||||
📈 Umami Analytics [Deploy]
|
||||
📝 Memos [Deploy]
|
||||
🔍 MeiliSearch [Deploy]
|
||||
🎬 Plex [Deploy]
|
||||
🎥 Jellyfin [Deploy]
|
||||
☁️ Nextcloud [Deploy]
|
||||
```
|
||||
|
||||
#### **2. One-Click Deployment**
|
||||
- **Click "Deploy"** → Automatic deployment starts
|
||||
- **Progress bar** shows deployment progress
|
||||
- **Live logs** show what's happening
|
||||
- **Status changes** from idle → deploying → running
|
||||
- **Access URLs** appear when complete
|
||||
|
||||
#### **3. Management Interface**
|
||||
- **View details** of any template
|
||||
- **Monitor deployment** in real-time
|
||||
- **Stop/start** services as needed
|
||||
- **Access URLs** with clickable links
|
||||
- **View logs** for troubleshooting
|
||||
|
||||
### 🎨 **User Experience**
|
||||
|
||||
#### **📱 Mobile-Friendly**
|
||||
- **Responsive design** works on all devices
|
||||
- **Touch-friendly** buttons and controls
|
||||
- **Scrollable** template grid
|
||||
- **Collapsible** details panel
|
||||
|
||||
#### **🌐 Browser Integration**
|
||||
- **Click URLs** to open services in new tabs
|
||||
- **Real-time updates** without page refresh
|
||||
- **Smooth animations** and transitions
|
||||
- **Status indicators** with icons
|
||||
|
||||
#### **📊 Visual Feedback**
|
||||
```typescript
|
||||
// Status indicators users see:
|
||||
🟢 Running (green checkmark)
|
||||
🔵 Deploying (blue pulsing circle)
|
||||
🔴 Error (red alert)
|
||||
⚪ Stopped (gray square)
|
||||
⭕ Idle (gray circle)
|
||||
```
|
||||
|
||||
### 🔧 **Technical Implementation**
|
||||
|
||||
#### **React Component Structure**
|
||||
```typescript
|
||||
src/components/
|
||||
├── DockerTemplateManagerApp.tsx # Main component
|
||||
├── DockerTemplateManager.tsx # Full component (20 templates)
|
||||
└── AppDocker.tsx # App wrapper
|
||||
```
|
||||
|
||||
#### **State Management**
|
||||
```typescript
|
||||
// Real-time state:
|
||||
- templates: Template[] // All template data
|
||||
- selectedTemplate: Template // Currently selected
|
||||
- deploymentLogs: Logs[] // Deployment logs
|
||||
- activeTab: string // Filter tab
|
||||
```
|
||||
|
||||
#### **Deployment Simulation**
|
||||
```typescript
|
||||
// Automatic deployment steps:
|
||||
1. Check dependencies
|
||||
2. Create deployment directory
|
||||
3. Extract docker-compose.yml
|
||||
4. Create environment variables
|
||||
5. Generate secrets
|
||||
6. Pull Docker images
|
||||
7. Start services
|
||||
8. Show access URLs
|
||||
```
|
||||
|
||||
### 🎯 **How to Use It**
|
||||
|
||||
#### **1. Add to Your App**
|
||||
```typescript
|
||||
// In your main App.tsx
|
||||
import DockerTemplateManager from './components/DockerTemplateManagerApp';
|
||||
|
||||
function App() {
|
||||
return (
|
||||
<div className="min-h-screen bg-gray-50">
|
||||
<DockerTemplateManager />
|
||||
</div>
|
||||
);
|
||||
}
|
||||
```
|
||||
|
||||
#### **2. Start the Development Server**
|
||||
```bash
|
||||
npm start
|
||||
# or
|
||||
yarn start
|
||||
```
|
||||
|
||||
#### **3. Open in Browser**
|
||||
```
|
||||
http://localhost:3000
|
||||
```
|
||||
|
||||
#### **4. Deploy Templates**
|
||||
- **Browse** the template grid
|
||||
- **Click** any template to see details
|
||||
- **Click "Deploy"** to start deployment
|
||||
- **Watch** the progress in real-time
|
||||
- **Access** your service via the provided URLs
|
||||
|
||||
### 📊 **Template Categories**
|
||||
|
||||
#### **🟢 Easy Templates** (1-2 min)
|
||||
- 📊 Glance Dashboard
|
||||
- 📈 Umami Analytics
|
||||
- 📝 Memos
|
||||
- 🔍 MeiliSearch
|
||||
- 📊 Uptime Kuma
|
||||
|
||||
#### **🟡 Medium Templates** (3-5 min)
|
||||
- 🎬 Plex
|
||||
- 🎥 Jellyfin
|
||||
- 🛡️ Vaultwarden
|
||||
- 🌐 Traefik
|
||||
- 🚪 Pi-hole
|
||||
- 📁 Cloudreve
|
||||
- 🐙 Gitea
|
||||
- 🔄 n8n
|
||||
- 📊 Grafana
|
||||
|
||||
#### **🔴 Hard Templates** (5-10 min)
|
||||
- ☁️ Nextcloud
|
||||
- 🏠 Home Assistant
|
||||
- 🦣 Mastodon
|
||||
- 📸 Immich
|
||||
- 🗄️ Supabase
|
||||
- 🔧 Appwrite
|
||||
|
||||
### 🚀 **Features**
|
||||
|
||||
#### **🎮 Interactive Elements**
|
||||
- **Template cards** with hover effects
|
||||
- **Progress bars** for deployment status
|
||||
- **Status badges** with colors
|
||||
- **Clickable URLs** that open in new tabs
|
||||
- **Filter tabs** for easy navigation
|
||||
|
||||
#### **📱 Responsive Design**
|
||||
- **Mobile layout** adapts to screen size
|
||||
- **Touch-friendly** buttons and controls
|
||||
- **Scrollable** areas for long content
|
||||
- **Sticky** details panel on desktop
|
||||
|
||||
#### **🔔 Real-Time Updates**
|
||||
- **Live progress** during deployment
|
||||
- **Status changes** update immediately
|
||||
- **Logs appear** in real-time
|
||||
- **URLs show** when deployment completes
|
||||
|
||||
### 🎯 **Next Steps**
|
||||
|
||||
#### **1. Test the App**
|
||||
```bash
|
||||
npm start
|
||||
# Open http://localhost:3000
|
||||
# Try deploying Glance (easiest)
|
||||
```
|
||||
|
||||
#### **2. Customize Templates**
|
||||
- **Add your own** templates
|
||||
- **Modify existing** ones
|
||||
- **Change colors** and styling
|
||||
- **Add new features**
|
||||
|
||||
#### **3. Connect to Real Docker**
|
||||
- **Replace simulation** with real API calls
|
||||
- **Connect to Docker daemon**
|
||||
- **Handle real errors**
|
||||
- **Add authentication**
|
||||
|
||||
### 🎉 **Ready to Use!**
|
||||
|
||||
**The in-app deployment system is now complete and ready to use!**
|
||||
|
||||
**You now have:**
|
||||
- ✅ **Visual template browser** in your app
|
||||
- ✅ **One-click deployment** with no terminal
|
||||
- ✅ **Real-time progress** tracking
|
||||
- ✅ **Live deployment logs**
|
||||
- ✅ **Clickable access URLs**
|
||||
- ✅ **Mobile-friendly** interface
|
||||
- ✅ **Category filtering** and search
|
||||
- ✅ **Status management** (start/stop/remove)
|
||||
|
||||
**All 20 Docker templates are now available through your web application!** 🚀
|
||||
@@ -0,0 +1,288 @@
|
||||
# Autoscaling with Cloudflare Tunnel
|
||||
|
||||
## Overview
|
||||
|
||||
This document explains how autoscaling works when using Cloudflare Tunnel with the Containr application.
|
||||
|
||||
## Architecture
|
||||
|
||||
```
|
||||
Internet → Cloudflare Edge → Cloudflare Tunnel → Traefik → Backend Services
|
||||
```
|
||||
|
||||
## Autoscaling Considerations
|
||||
|
||||
### 1. Cloudflare Tunnel Limitations
|
||||
|
||||
**Cloudflare Tunnel itself does NOT provide autoscaling.** It's a secure tunneling service that:
|
||||
- Creates a persistent connection between your infrastructure and Cloudflare's edge
|
||||
- Routes traffic through Cloudflare's global network
|
||||
- Provides DDoS protection and CDN features
|
||||
|
||||
### 2. Where Autoscaling Happens
|
||||
|
||||
Autoscaling must be implemented at different layers:
|
||||
|
||||
#### A. Container Level (Docker Swarm/Kubernetes)
|
||||
```yaml
|
||||
# Example with Docker Swarm
|
||||
backend:
|
||||
image: containr-backend
|
||||
deploy:
|
||||
replicas: 3
|
||||
update_config:
|
||||
parallelism: 1
|
||||
delay: 10s
|
||||
restart_policy:
|
||||
condition: on-failure
|
||||
```
|
||||
|
||||
#### B. Application Level (Load Balancing)
|
||||
Traefik automatically load balances between multiple backend instances:
|
||||
```yaml
|
||||
# Multiple backend containers
|
||||
backend-1:
|
||||
# ... backend config
|
||||
labels:
|
||||
- "traefik.http.services.backend.loadbalancer.server.port=8080"
|
||||
|
||||
backend-2:
|
||||
# ... backend config
|
||||
labels:
|
||||
- "traefik.http.services.backend.loadbalancer.server.port=8080"
|
||||
```
|
||||
|
||||
#### C. Cloud Level (Cloudflare Load Balancer - Paid Feature)
|
||||
For true autoscaling, you'd need:
|
||||
- Multiple deployments in different regions
|
||||
- Cloudflare Load Balancer ($$$/month)
|
||||
- Health checks and failover
|
||||
|
||||
## Implementation Options
|
||||
|
||||
### Option 1: Docker Swarm (Recommended for Single Host)
|
||||
|
||||
```bash
|
||||
# Initialize Docker Swarm
|
||||
docker swarm init
|
||||
|
||||
# Deploy with autoscaling
|
||||
docker stack deploy -c docker-compose.yml containr
|
||||
```
|
||||
|
||||
### Option 2: Kubernetes
|
||||
|
||||
```yaml
|
||||
# deployment.yaml
|
||||
apiVersion: apps/v1
|
||||
kind: Deployment
|
||||
metadata:
|
||||
name: backend
|
||||
spec:
|
||||
replicas: 3
|
||||
selector:
|
||||
matchLabels:
|
||||
app: backend
|
||||
template:
|
||||
metadata:
|
||||
labels:
|
||||
app: backend
|
||||
spec:
|
||||
containers:
|
||||
- name: backend
|
||||
image: containr-backend
|
||||
ports:
|
||||
- containerPort: 8080
|
||||
---
|
||||
apiVersion: autoscaling/v2
|
||||
kind: HorizontalPodAutoscaler
|
||||
metadata:
|
||||
name: backend-hpa
|
||||
spec:
|
||||
scaleTargetRef:
|
||||
apiVersion: apps/v1
|
||||
kind: Deployment
|
||||
name: backend
|
||||
minReplicas: 2
|
||||
maxReplicas: 10
|
||||
metrics:
|
||||
- type: Resource
|
||||
resource:
|
||||
name: cpu
|
||||
target:
|
||||
type: Utilization
|
||||
averageUtilization: 70
|
||||
```
|
||||
|
||||
### Option 3: Manual Scaling with Scripts
|
||||
|
||||
```bash
|
||||
#!/bin/bash
|
||||
# scale-backend.sh
|
||||
|
||||
scale_up() {
|
||||
local current=$(docker ps --filter "name=containr-backend" --format "table {{.Names}}" | wc -l)
|
||||
local target=$((current + 1))
|
||||
|
||||
echo "Scaling backend to $target instances..."
|
||||
|
||||
for i in $(seq 1 $target); do
|
||||
docker run -d \
|
||||
--name containr-backend-$i \
|
||||
--network containr_containr-network \
|
||||
-e DATABASE_URL="..." \
|
||||
-e REDIS_URL="..." \
|
||||
containr-backend
|
||||
done
|
||||
}
|
||||
|
||||
scale_down() {
|
||||
local current=$(docker ps --filter "name=containr-backend" --format "table {{.Names}}" | wc -l)
|
||||
local target=$((current - 1))
|
||||
|
||||
if [ $target -lt 1 ]; then
|
||||
echo "Cannot scale below 1 instance"
|
||||
exit 1
|
||||
fi
|
||||
|
||||
echo "Scaling backend to $target instances..."
|
||||
docker stop containr-backend-$target
|
||||
docker rm containr-backend-$target
|
||||
}
|
||||
|
||||
case "$1" in
|
||||
up) scale_up ;;
|
||||
down) scale_down ;;
|
||||
*) echo "Usage: $0 [up|down]" ;;
|
||||
esac
|
||||
```
|
||||
|
||||
## Monitoring and Metrics
|
||||
|
||||
### Health Checks
|
||||
All services include health checks:
|
||||
```yaml
|
||||
healthcheck:
|
||||
test: ["CMD", "curl", "-f", "http://localhost:8080/health"]
|
||||
interval: 30s
|
||||
timeout: 10s
|
||||
retries: 3
|
||||
```
|
||||
|
||||
### Metrics Collection
|
||||
Traefik provides Prometheus metrics:
|
||||
```yaml
|
||||
# In docker-compose.yml
|
||||
command:
|
||||
- "--metrics.prometheus=true"
|
||||
- "--metrics.prometheus.addentrypointslabels=true"
|
||||
- "--metrics.prometheus.addserviceslabels=true"
|
||||
```
|
||||
|
||||
### Scaling Triggers
|
||||
Monitor these metrics for scaling decisions:
|
||||
- CPU usage (> 70%)
|
||||
- Memory usage (> 80%)
|
||||
- Response time (> 500ms)
|
||||
- Error rate (> 5%)
|
||||
- Queue depth (if using message queues)
|
||||
|
||||
## Production Recommendations
|
||||
|
||||
### 1. Use Docker Swarm or Kubernetes
|
||||
- Better orchestration
|
||||
- Built-in load balancing
|
||||
- Health management
|
||||
- Rolling updates
|
||||
|
||||
### 2. Implement Horizontal Pod Autoscaler (HPA)
|
||||
- Automatic scaling based on metrics
|
||||
- Min/max replica limits
|
||||
- Configurable thresholds
|
||||
|
||||
### 3. Use Cloudflare Load Balancer (if budget allows)
|
||||
- Geographic distribution
|
||||
- Advanced health checks
|
||||
- Traffic steering
|
||||
- DDoS protection
|
||||
|
||||
### 4. Monitoring and Alerting
|
||||
- Prometheus + Grafana
|
||||
- Alertmanager
|
||||
- Log aggregation (ELK stack)
|
||||
|
||||
## Example: Complete Autoscaling Setup
|
||||
|
||||
```yaml
|
||||
# docker-compose.autoscale.yml
|
||||
version: '3.8'
|
||||
|
||||
services:
|
||||
traefik:
|
||||
image: traefik:v3.2
|
||||
command:
|
||||
- "--api.dashboard=true"
|
||||
- "--providers.docker=true"
|
||||
- "--providers.docker.swarmMode=true"
|
||||
- "--metrics.prometheus=true"
|
||||
deploy:
|
||||
replicas: 1
|
||||
placement:
|
||||
constraints:
|
||||
- node.role == manager
|
||||
|
||||
backend:
|
||||
image: containr-backend
|
||||
deploy:
|
||||
replicas: 3
|
||||
update_config:
|
||||
parallelism: 1
|
||||
delay: 10s
|
||||
restart_policy:
|
||||
condition: on-failure
|
||||
labels:
|
||||
- "traefik.http.services.backend.loadbalancer.server.port=8080"
|
||||
- "traefik.http.routers.backend.rule=Host(`api.${DOMAIN}`)"
|
||||
- "traefik.enable=true"
|
||||
|
||||
prometheus:
|
||||
image: prom/prometheus
|
||||
deploy:
|
||||
replicas: 1
|
||||
volumes:
|
||||
- ./prometheus.yml:/etc/prometheus/prometheus.yml
|
||||
|
||||
grafana:
|
||||
image: grafana/grafana
|
||||
deploy:
|
||||
replicas: 1
|
||||
environment:
|
||||
- GF_SECURITY_ADMIN_PASSWORD=admin
|
||||
```
|
||||
|
||||
## Summary
|
||||
|
||||
1. **Cloudflare Tunnel ≠ Autoscaling** - It's for secure connectivity
|
||||
2. **Autoscaling happens at container/orchestration level**
|
||||
3. **Traefik provides load balancing between instances**
|
||||
4. **Use Docker Swarm or Kubernetes for production autoscaling**
|
||||
5. **Monitor metrics and implement HPA for automatic scaling**
|
||||
6. **Consider Cloudflare Load Balancer for multi-region setups**
|
||||
|
||||
## Quick Start Commands
|
||||
|
||||
```bash
|
||||
# Start with autoscaling (Docker Swarm)
|
||||
docker swarm init
|
||||
docker stack deploy -c docker-compose.autoscale.yml containr
|
||||
|
||||
# Scale manually
|
||||
docker service scale containr_backend=5
|
||||
|
||||
# Check status
|
||||
docker service ls
|
||||
docker service ps containr_backend
|
||||
|
||||
# View logs
|
||||
docker service logs containr_backend
|
||||
```
|
||||
@@ -0,0 +1,259 @@
|
||||
# 🚀 Zero-Interaction Docker Deployment System
|
||||
|
||||
## 🎯 **Fully Automatic Deployment**
|
||||
|
||||
I've created a **completely automated deployment system** that requires **ZERO user interaction**. Just run one command and it does everything!
|
||||
|
||||
## ⚡ **One-Click Deployment**
|
||||
|
||||
### **Option 1: Quick Start (Recommended)**
|
||||
```bash
|
||||
# Run the quick deploy script
|
||||
./scripts/quick-deploy.sh
|
||||
```
|
||||
|
||||
**What happens:**
|
||||
1. 🎯 **Shows you 6 deployment options**
|
||||
2. 🚀 **Deploys your choice automatically**
|
||||
3. 🔧 **Handles everything** (secrets, directories, ports)
|
||||
4. 🌐 **Shows access URLs** when done
|
||||
|
||||
### **Option 2: Direct Command**
|
||||
```bash
|
||||
# Deploy any template instantly
|
||||
./scripts/auto-deploy.sh umami
|
||||
./scripts/auto-deploy.sh plex
|
||||
./scripts/auto-deploy.sh nextcloud
|
||||
```
|
||||
|
||||
### **Option 3: Deploy Everything**
|
||||
```bash
|
||||
# Deploy all 20 templates at once
|
||||
./scripts/auto-deploy.sh --all
|
||||
```
|
||||
|
||||
## 🔄 **What Happens Automatically**
|
||||
|
||||
### **🔍 Dependency Check**
|
||||
```bash
|
||||
✅ Checks if Docker is installed
|
||||
✅ Installs Docker if missing
|
||||
✅ Checks if Docker Compose is installed
|
||||
✅ Installs Docker Compose if missing
|
||||
```
|
||||
|
||||
### **📁 Directory Creation**
|
||||
```bash
|
||||
✅ Creates deployment directory
|
||||
✅ Creates required subdirectories
|
||||
✅ Sets proper permissions
|
||||
✅ Handles existing deployments
|
||||
```
|
||||
|
||||
### **🔧 Configuration Setup**
|
||||
```bash
|
||||
✅ Extracts docker-compose.yml from template
|
||||
✅ Creates .env file with all variables
|
||||
✅ Auto-generates secrets and passwords
|
||||
✅ Fixes port conflicts automatically
|
||||
✅ Optimizes volume paths
|
||||
```
|
||||
|
||||
### **🐳 Docker Deployment**
|
||||
```bash
|
||||
✅ Pulls all required images
|
||||
✅ Starts all services
|
||||
✅ Waits for services to be ready
|
||||
✅ Checks service health
|
||||
✅ Shows deployment status
|
||||
```
|
||||
|
||||
### **🌐 Access Information**
|
||||
```bash
|
||||
✅ Shows all access URLs
|
||||
✅ Provides management commands
|
||||
✅ Shows deployment directory
|
||||
✅ Opens browser automatically (optional)
|
||||
```
|
||||
|
||||
## 🎮 **Try It Now**
|
||||
|
||||
### **Easiest Way:**
|
||||
```bash
|
||||
./scripts/quick-deploy.sh
|
||||
```
|
||||
|
||||
You'll see:
|
||||
```
|
||||
🚀 One-Click Docker Deployment
|
||||
============================
|
||||
|
||||
🎯 Choose your deployment:
|
||||
|
||||
1. 🌐 Deploy Glance Dashboard (Recommended - Simple & Fast)
|
||||
2. 📊 Deploy Umami Analytics (Web Analytics)
|
||||
3. 📝 Deploy Memos (Note-taking)
|
||||
4. 🔍 Deploy MeiliSearch (Search Engine)
|
||||
5. 📈 Deploy Uptime Kuma (Monitoring)
|
||||
6. 🚀 Deploy ALL Templates (Advanced)
|
||||
|
||||
Enter your choice (1-6): 1
|
||||
|
||||
🌐 Deploying Glance Dashboard...
|
||||
```
|
||||
|
||||
### **Direct Way:**
|
||||
```bash
|
||||
# Deploy any template instantly
|
||||
./scripts/auto-deploy.sh glance
|
||||
```
|
||||
|
||||
## 📊 **Example Output**
|
||||
|
||||
Here's what you'll see during deployment:
|
||||
|
||||
```
|
||||
🚀 Auto-Deploying glance
|
||||
========================================
|
||||
🔄 Checking dependencies...
|
||||
✅ Docker is installed
|
||||
✅ Docker Compose is installed
|
||||
🔄 Auto-deploying glance...
|
||||
✅ Created deployment directory: /path/to/deployments/glance
|
||||
🔄 Extracting docker-compose.yml...
|
||||
✅ docker-compose.yml extracted and optimized
|
||||
🔄 Creating .env file...
|
||||
✅ .env file created (no variables required)
|
||||
🔄 Auto-deploying glance...
|
||||
🔄 Pulling Docker images...
|
||||
✅ Images pulled
|
||||
🔄 Starting services...
|
||||
✅ Services started successfully
|
||||
|
||||
🎉 Deployment Complete!
|
||||
========================================
|
||||
✅ Access URLs:
|
||||
🌐 http://localhost:8080 (port: 8080)
|
||||
|
||||
✅ Management Commands:
|
||||
📋 View logs: docker-compose logs -f
|
||||
🛑 Stop services: docker-compose down
|
||||
🔄 Restart: docker-compose restart
|
||||
📊 Status: docker-compose ps
|
||||
🗑️ Cleanup: docker-compose down -v
|
||||
|
||||
✅ Deployment directory: /path/to/deployments/glance
|
||||
🎉 glance deployed successfully!
|
||||
```
|
||||
|
||||
## 🔧 **Advanced Options**
|
||||
|
||||
### **Custom Configuration**
|
||||
```bash
|
||||
# Deploy without auto-generating secrets
|
||||
./scripts/auto-deploy.sh --no-secrets umami
|
||||
|
||||
# Deploy without creating directories
|
||||
./scripts/auto-deploy.sh --no-dirs plex
|
||||
|
||||
# Deploy without auto-starting services
|
||||
./scripts/auto-deploy.sh --no-start nextcloud
|
||||
|
||||
# Deploy and auto-open browser
|
||||
./scripts/auto-deploy.sh --open-browser glance
|
||||
```
|
||||
|
||||
### **Batch Deployment**
|
||||
```bash
|
||||
# Deploy multiple templates
|
||||
for template in umami glance memos; do
|
||||
./scripts/auto-deploy.sh "$template"
|
||||
done
|
||||
|
||||
# Deploy all templates
|
||||
./scripts/auto-deploy.sh --all
|
||||
```
|
||||
|
||||
## 🛡️ **Safety Features**
|
||||
|
||||
### **Automatic Conflict Resolution**
|
||||
```bash
|
||||
✅ Detects port conflicts
|
||||
✅ Auto-assigns available ports
|
||||
✅ Handles existing deployments
|
||||
✅ Cleans up previous installations
|
||||
```
|
||||
|
||||
### **Security**
|
||||
```bash
|
||||
✅ Generates strong random secrets
|
||||
✅ Uses secure default passwords
|
||||
✅ Isolates deployments in separate directories
|
||||
✅ Logs all actions for audit trail
|
||||
```
|
||||
|
||||
### **Error Handling**
|
||||
```bash
|
||||
✅ Validates template existence
|
||||
✅ Checks service health
|
||||
✅ Provides detailed error messages
|
||||
✅ Offers rollback commands
|
||||
```
|
||||
|
||||
## 📁 **Directory Structure**
|
||||
|
||||
```
|
||||
your-project/
|
||||
├── scripts/
|
||||
│ ├── auto-deploy.sh # 🚀 Main auto-deployment script
|
||||
│ └── quick-deploy.sh # ⚡ Quick start script
|
||||
├── templates/
|
||||
│ ├── umami.md
|
||||
│ ├── plex.md
|
||||
│ └── ...
|
||||
└── deployments/ # 📁 Auto-created
|
||||
├── glance/ # 📁 Template deployment
|
||||
│ ├── docker-compose.yml
|
||||
│ ├── .env
|
||||
│ ├── data/
|
||||
│ └── logs/
|
||||
├── umami/
|
||||
└── plex/
|
||||
```
|
||||
|
||||
## 🎯 **Template Difficulty Levels**
|
||||
|
||||
| **Easy** (Auto-Deploy) | **Medium** (Auto-Deploy) | **Hard** (Auto-Deploy) |
|
||||
|------------------------|-------------------------|----------------------|
|
||||
| 🌐 Glance | 📊 Umami | 🗄️ Supabase |
|
||||
| 📝 Memos | 📈 Uptime Kuma | 🏠 Home Assistant |
|
||||
| 🔍 MeiliSearch | 🛡️ Vaultwarden | 📊 Grafana |
|
||||
| 🚪 Pi-hole | 📁 Cloudreve | 🐙 Gitea |
|
||||
| | 🌐 Traefik | 🦣 Mastodon |
|
||||
| | 🎬 Jellyfin | ☁️ Nextcloud |
|
||||
| | 📚 Plex | 🎬 Immich |
|
||||
| | 🔄 n8n | |
|
||||
|
||||
## 🚀 **Ready to Use?**
|
||||
|
||||
**Yes! The system is fully automatic. Just run:**
|
||||
|
||||
```bash
|
||||
# Quick start (easiest)
|
||||
./scripts/quick-deploy.sh
|
||||
|
||||
# Or direct deployment
|
||||
./scripts/auto-deploy.sh glance
|
||||
```
|
||||
|
||||
**That's it!** 🎉
|
||||
|
||||
The system will:
|
||||
- ✅ **Install Docker** if needed
|
||||
- ✅ **Deploy your chosen service**
|
||||
- ✅ **Generate all secrets**
|
||||
- ✅ **Handle all configuration**
|
||||
- ✅ **Show you the access URL**
|
||||
- ✅ **Provide management commands**
|
||||
|
||||
**Zero user interaction required!** 🚀
|
||||
@@ -0,0 +1,124 @@
|
||||
# Cloudflare Tunnel Setup
|
||||
|
||||
This guide explains how to set up Cloudflare tunnel for Containr, allowing you to expose your services without configuring a domain.
|
||||
|
||||
## Prerequisites
|
||||
|
||||
1. A Cloudflare account
|
||||
2. A domain (any domain, even a free one)
|
||||
|
||||
## Setup Steps
|
||||
|
||||
### 1. Create a Cloudflare Tunnel
|
||||
|
||||
1. Log in to your [Cloudflare Dashboard](https://dash.cloudflare.com/)
|
||||
2. Go to **Zero Trust** → **Networks** → **Tunnels**
|
||||
3. Click **Create tunnel**
|
||||
4. Choose **Cloudflared** and click **Next**
|
||||
5. Give your tunnel a name (e.g., "containr-tunnel")
|
||||
6. Click **Save tunnel**
|
||||
|
||||
### 2. Get Your Tunnel Token
|
||||
|
||||
After creating the tunnel, Cloudflare will show you a command like:
|
||||
```bash
|
||||
cloudflared tunnel run <tunnel-id>
|
||||
```
|
||||
|
||||
Copy the token from the `.cloudflared/config.yml` file or use the token provided by Cloudflare.
|
||||
|
||||
### 3. Configure Containr
|
||||
|
||||
1. Copy `.env.example` to `.env` if you haven't already:
|
||||
```bash
|
||||
cp .env.example .env
|
||||
```
|
||||
|
||||
2. Edit `.env` and add your Cloudflare tunnel token:
|
||||
```env
|
||||
CLOUDFLARED_TOKEN=your_copied_tunnel_token_here
|
||||
```
|
||||
|
||||
### 4. Start Services with Cloudflare Tunnel
|
||||
|
||||
```bash
|
||||
# Start all services including cloudflared
|
||||
make cloudflared-up
|
||||
|
||||
# Or start manually
|
||||
docker-compose --profile cloudflared up -d
|
||||
```
|
||||
|
||||
### 5. Configure Tunnel Routes
|
||||
|
||||
In your Cloudflare dashboard:
|
||||
|
||||
1. Go to your tunnel settings
|
||||
2. Add the following public hostnames:
|
||||
- `your-domain.com` → `http://traefik:80` (for frontend)
|
||||
- `api.your-domain.com` → `http://traefik:80` (for backend)
|
||||
- `traefik.your-domain.com` → `http://traefik:80` (for dashboard)
|
||||
|
||||
### 6. Access Your Services
|
||||
|
||||
Once configured, you can access:
|
||||
- Frontend: `https://your-domain.com`
|
||||
- API: `https://api.your-domain.com`
|
||||
- Traefik Dashboard: `https://traefik.your-domain.com`
|
||||
|
||||
## Management Commands
|
||||
|
||||
```bash
|
||||
# Start with Cloudflare tunnel
|
||||
make cloudflared-up
|
||||
|
||||
# Stop Cloudflare tunnel
|
||||
make cloudflared-down
|
||||
|
||||
# View logs
|
||||
docker-compose logs -f cloudflared
|
||||
|
||||
# Check status
|
||||
docker-compose ps
|
||||
```
|
||||
|
||||
## Benefits
|
||||
|
||||
- **No domain configuration required** in `.env`
|
||||
- **Automatic SSL** through Cloudflare
|
||||
- **DDoS protection** and security features
|
||||
- **Easy setup** - just need a tunnel token
|
||||
- **Works anywhere** - no port forwarding needed
|
||||
|
||||
## Troubleshooting
|
||||
|
||||
### Tunnel Not Connecting
|
||||
- Verify your `CLOUDFLARED_TOKEN` is correct
|
||||
- Check cloudflared logs: `docker-compose logs cloudflared`
|
||||
- Ensure your tunnel is active in Cloudflare dashboard
|
||||
|
||||
### Services Not Accessible
|
||||
- Verify you've configured the public hostnames in Cloudflare
|
||||
- Check that all services are running: `docker-compose ps`
|
||||
- Ensure the tunnel routes point to `http://traefik:80`
|
||||
|
||||
### Token Issues
|
||||
- Regenerate your tunnel token in Cloudflare dashboard
|
||||
- Make sure there are no extra spaces or newlines in the token
|
||||
|
||||
## Alternative: Domain Mode
|
||||
|
||||
If you prefer traditional domain setup instead of Cloudflare tunnel:
|
||||
|
||||
1. Configure your domain in `.env`:
|
||||
```env
|
||||
DOMAIN=yourdomain.com
|
||||
[email protected]
|
||||
```
|
||||
|
||||
2. Use regular commands:
|
||||
```bash
|
||||
make prod
|
||||
```
|
||||
|
||||
This will use Let's Encrypt certificates instead of Cloudflare tunnel.
|
||||
@@ -0,0 +1,231 @@
|
||||
# Docker Setup with Traefik
|
||||
|
||||
This guide will help you set up Containr with Docker, Traefik reverse proxy, and automatic SSL certificates.
|
||||
|
||||
## Prerequisites
|
||||
|
||||
- Docker and Docker Compose installed
|
||||
- A domain name pointing to your server's IP address
|
||||
- Port 80 and 443 open on your firewall
|
||||
|
||||
## Quick Start
|
||||
|
||||
1. **Clone and prepare the environment:**
|
||||
```bash
|
||||
git clone <your-repo>
|
||||
cd containr
|
||||
cp .env.example .env
|
||||
```
|
||||
|
||||
2. **Configure your environment:**
|
||||
Edit `.env` file with your settings:
|
||||
```bash
|
||||
nano .env
|
||||
```
|
||||
|
||||
Required changes:
|
||||
- `DOMAIN=yourdomain.com` - Your actual domain
|
||||
- `ACME_EMAIL=admin@yourdomain.com` - Email for SSL certificates
|
||||
- `POSTGRES_PASSWORD` - Set a secure password
|
||||
- `REDIS_PASSWORD` - Set a secure password
|
||||
- `JWT_SECRET` - Generate a secure random string
|
||||
- `TRAEFIK_AUTH` - Generate basic auth for dashboard
|
||||
|
||||
3. **Generate Traefik authentication:**
|
||||
```bash
|
||||
# Install apache2-utils if needed
|
||||
sudo apt-get install apache2-utils
|
||||
|
||||
# Generate username:password hash
|
||||
htpasswd -nb admin yourpassword
|
||||
|
||||
# Update TRAEFIK_AUTH in .env with the output
|
||||
```
|
||||
|
||||
4. **Create necessary directories:**
|
||||
```bash
|
||||
mkdir -p data/letsencrypt
|
||||
chmod 600 data/letsencrypt/acme.json
|
||||
```
|
||||
|
||||
5. **Start the services:**
|
||||
```bash
|
||||
docker-compose up -d
|
||||
```
|
||||
|
||||
## Services and URLs
|
||||
|
||||
After deployment, your services will be available at:
|
||||
|
||||
- **Frontend**: `https://yourdomain.com`
|
||||
- **Backend API**: `https://api.yourdomain.com`
|
||||
- **Traefik Dashboard**: `https://traefik.yourdomain.com`
|
||||
|
||||
## Architecture
|
||||
|
||||
```
|
||||
Internet → Traefik (Port 80/443)
|
||||
├── Frontend (React/Nginx)
|
||||
├── Backend (Go API)
|
||||
├── PostgreSQL (Database)
|
||||
└── Redis (Cache)
|
||||
```
|
||||
|
||||
## Configuration Files
|
||||
|
||||
### Docker Compose
|
||||
- `docker-compose.yml` - Main orchestration file
|
||||
- Defines all services, networks, and volumes
|
||||
- Configures Traefik with automatic SSL
|
||||
|
||||
### Traefik Configuration
|
||||
- `traefik.yml` - Static configuration
|
||||
- `traefik-dynamic.yml` - Dynamic routing rules
|
||||
- Automatic HTTP to HTTPS redirection
|
||||
- Security headers and rate limiting
|
||||
|
||||
### Dockerfiles
|
||||
- `Dockerfile.backend` - Go backend with multi-stage build
|
||||
- `Dockerfile.frontend` - React frontend with Nginx
|
||||
- Both use non-root users for security
|
||||
|
||||
## Security Features
|
||||
|
||||
- **Automatic SSL** via Let's Encrypt
|
||||
- **HTTP to HTTPS** redirection
|
||||
- **Security headers** (HSTS, XSS protection, etc.)
|
||||
- **Rate limiting** on API endpoints
|
||||
- **Basic authentication** on Traefik dashboard
|
||||
- **Non-root containers** for all services
|
||||
- **Health checks** for all services
|
||||
|
||||
## Monitoring and Logs
|
||||
|
||||
### Traefik Dashboard
|
||||
Access at `https://traefik.yourdomain.com` with your configured credentials.
|
||||
|
||||
### Logs
|
||||
```bash
|
||||
# View all logs
|
||||
docker-compose logs -f
|
||||
|
||||
# View specific service logs
|
||||
docker-compose logs -f traefik
|
||||
docker-compose logs -f backend
|
||||
docker-compose logs -f frontend
|
||||
```
|
||||
|
||||
### Health Checks
|
||||
All services include health checks:
|
||||
```bash
|
||||
# Check service status
|
||||
docker-compose ps
|
||||
```
|
||||
|
||||
## Maintenance
|
||||
|
||||
### Updates
|
||||
```bash
|
||||
# Pull latest images
|
||||
docker-compose pull
|
||||
|
||||
# Recreate services with new images
|
||||
docker-compose up -d --force-recreate
|
||||
```
|
||||
|
||||
### Backups
|
||||
```bash
|
||||
# Backup PostgreSQL
|
||||
docker-compose exec postgres pg_dump -U containr_user containr > backup.sql
|
||||
|
||||
# Backup Redis
|
||||
docker-compose exec redis redis-cli --rdb /data/dump.rdb
|
||||
```
|
||||
|
||||
### SSL Certificates
|
||||
Let's Encrypt certificates are automatically renewed. Manual renewal:
|
||||
```bash
|
||||
docker-compose exec traefik traefik api check-letsencrypt
|
||||
```
|
||||
|
||||
## Development Mode
|
||||
|
||||
For local development without SSL:
|
||||
```bash
|
||||
# Create development override
|
||||
cat > docker-compose.override.yml << EOF
|
||||
version: '3.8'
|
||||
services:
|
||||
traefik:
|
||||
command:
|
||||
- "--api.dashboard=true"
|
||||
- "--providers.docker=true"
|
||||
- "--entrypoints.web.address=:80"
|
||||
- "--log.level=DEBUG"
|
||||
ports:
|
||||
- "80:80"
|
||||
- "8080:8080"
|
||||
labels:
|
||||
- "traefik.http.routers.traefik.rule=Host(`localhost`)"
|
||||
- "traefik.http.routers.traefik.entrypoints=web"
|
||||
- "traefik.http.routers.traefik.service=api@internal"
|
||||
EOF
|
||||
|
||||
# Start with override
|
||||
docker-compose up -d
|
||||
```
|
||||
|
||||
## Troubleshooting
|
||||
|
||||
### Common Issues
|
||||
|
||||
1. **SSL Certificate Issues**
|
||||
```bash
|
||||
# Check acme.json permissions
|
||||
ls -la data/letsencrypt/acme.json
|
||||
|
||||
# Reset certificates
|
||||
rm data/letsencrypt/acme.json
|
||||
docker-compose restart traefik
|
||||
```
|
||||
|
||||
2. **Port Conflicts**
|
||||
```bash
|
||||
# Check what's using ports
|
||||
sudo netstat -tlnp | grep :80
|
||||
sudo netstat -tlnp | grep :443
|
||||
```
|
||||
|
||||
3. **Database Connection**
|
||||
```bash
|
||||
# Test database connection
|
||||
docker-compose exec backend ping postgres
|
||||
```
|
||||
|
||||
4. **Permission Issues**
|
||||
```bash
|
||||
# Fix volume permissions
|
||||
sudo chown -R 1001:1001 data/
|
||||
```
|
||||
|
||||
### Performance Tuning
|
||||
|
||||
1. **Nginx Caching** - Already configured in `nginx.conf`
|
||||
2. **Redis Caching** - Configure in your application
|
||||
3. **Database Pooling** - Adjust connection limits in Go app
|
||||
|
||||
## Production Tips
|
||||
|
||||
1. **Monitoring** - Set up Prometheus/Grafana
|
||||
2. **Alerting** - Configure alerts for service failures
|
||||
3. **Backup Strategy** - Automated database backups
|
||||
4. **Load Testing** - Test before production deployment
|
||||
5. **Security Audit** - Regular security scans
|
||||
|
||||
## Support
|
||||
|
||||
For issues:
|
||||
1. Check logs: `docker-compose logs`
|
||||
2. Verify configuration: `docker-compose config`
|
||||
3. Check service status: `docker-compose ps`
|
||||
4. Review Traefik dashboard for routing issues
|
||||
@@ -0,0 +1,131 @@
|
||||
# Containr Backend Setup
|
||||
|
||||
## Quick Start
|
||||
|
||||
### Prerequisites
|
||||
- Go 1.21+
|
||||
- PostgreSQL 12+
|
||||
- Redis (optional)
|
||||
|
||||
### Environment Variables
|
||||
|
||||
Create a `.env` file or set these environment variables:
|
||||
|
||||
```bash
|
||||
# Database
|
||||
DATABASE_URL=postgres://containr:password@localhost:5432/containr?sslmode=disable
|
||||
REDIS_URL=redis://localhost:6379
|
||||
|
||||
# Server
|
||||
PORT=8080
|
||||
ENVIRONMENT=development
|
||||
|
||||
# Security
|
||||
JWT_SECRET=your-secret-key-change-in-production
|
||||
|
||||
# Frontend (for CORS)
|
||||
FRONTEND_URL=http://localhost:3000
|
||||
```
|
||||
|
||||
### Database Setup
|
||||
|
||||
1. Create PostgreSQL database:
|
||||
```sql
|
||||
CREATE DATABASE containr;
|
||||
CREATE USER containr WITH PASSWORD 'password';
|
||||
GRANT ALL PRIVILEGES ON DATABASE containr TO containr;
|
||||
```
|
||||
|
||||
2. Run migrations (handled automatically on server start)
|
||||
|
||||
### Running the Server
|
||||
|
||||
```bash
|
||||
# Build
|
||||
go build -o bin/server cmd/server/main.go
|
||||
|
||||
# Run
|
||||
./bin/server
|
||||
```
|
||||
|
||||
The server will start on `http://localhost:8080`
|
||||
|
||||
### API Endpoints
|
||||
|
||||
#### Health Check
|
||||
- `GET /health` - Server health status
|
||||
|
||||
#### Authentication
|
||||
- `POST /api/v1/auth/login` - User login
|
||||
- `POST /api/v1/auth/register` - User registration
|
||||
|
||||
#### User Profile
|
||||
- `GET /api/v1/user/profile` - Get user profile (requires auth)
|
||||
- `PUT /api/v1/user/profile` - Update user profile (requires auth)
|
||||
|
||||
#### Projects
|
||||
- `GET /api/v1/projects` - List user projects (requires auth)
|
||||
- `POST /api/v1/projects` - Create project (requires auth)
|
||||
- `GET /api/v1/projects/:id` - Get project details (requires auth)
|
||||
- `PUT /api/v1/projects/:id` - Update project (requires auth)
|
||||
- `DELETE /api/v1/projects/:id` - Delete project (requires auth)
|
||||
|
||||
### Authentication
|
||||
|
||||
Include JWT token in Authorization header:
|
||||
```
|
||||
Authorization: Bearer <your-jwt-token>
|
||||
```
|
||||
|
||||
### Example Usage
|
||||
|
||||
1. Register a user:
|
||||
```bash
|
||||
curl -X POST http://localhost:8080/api/v1/auth/register \
|
||||
-H "Content-Type: application/json" \
|
||||
-d '{
|
||||
"email": "[email protected]",
|
||||
"password": "password123",
|
||||
"name": "Test User"
|
||||
}'
|
||||
```
|
||||
|
||||
2. Login:
|
||||
```bash
|
||||
curl -X POST http://localhost:8080/api/v1/auth/login \
|
||||
-H "Content-Type: application/json" \
|
||||
-d '{
|
||||
"email": "[email protected]",
|
||||
"password": "password123"
|
||||
}'
|
||||
```
|
||||
|
||||
3. Create a project (using token from login):
|
||||
```bash
|
||||
curl -X POST http://localhost:8080/api/v1/projects \
|
||||
-H "Content-Type: application/json" \
|
||||
-H "Authorization: Bearer <token>" \
|
||||
-d '{
|
||||
"name": "My Project",
|
||||
"description": "A test project"
|
||||
}'
|
||||
```
|
||||
|
||||
## Development
|
||||
|
||||
### Project Structure
|
||||
```
|
||||
cmd/server/ - Main application entry point
|
||||
internal/
|
||||
├── api/ - HTTP handlers and routes
|
||||
├── config/ - Configuration management
|
||||
├── database/ - Database connections and migrations
|
||||
└── middleware/ - HTTP middleware
|
||||
migrations/ - SQL migration files
|
||||
```
|
||||
|
||||
### Adding New Endpoints
|
||||
|
||||
1. Create handler functions in `internal/api/`
|
||||
2. Add routes in `internal/api/routes.go`
|
||||
3. Update database schema if needed in `migrations/`
|
||||
@@ -0,0 +1,266 @@
|
||||
# Docker Template Auto-Setup Guide
|
||||
|
||||
## 🚀 How It Works
|
||||
|
||||
The templates are **configuration files** that define how to run each service with Docker Compose. They don't auto-execute - you need to use the setup script to deploy them.
|
||||
|
||||
## 📋 Quick Start
|
||||
|
||||
### 1. Interactive Mode (Recommended)
|
||||
```bash
|
||||
# Run the setup script interactively
|
||||
./scripts/setup-template.sh
|
||||
```
|
||||
|
||||
### 2. Direct Template Selection
|
||||
```bash
|
||||
# Setup a specific template
|
||||
./scripts/setup-template.sh umami
|
||||
|
||||
# List all available templates
|
||||
./scripts/setup-template.sh --list
|
||||
|
||||
# Setup only (don't deploy)
|
||||
./scripts/setup-template.sh --setup umami
|
||||
|
||||
# Deploy existing setup
|
||||
./scripts/setup-template.sh --deploy umami
|
||||
```
|
||||
|
||||
## 🔄 What the Script Does
|
||||
|
||||
### Step 1: Dependency Check
|
||||
- ✅ Verifies Docker is installed
|
||||
- ✅ Verifies Docker Compose is installed
|
||||
- ✅ Checks template directory exists
|
||||
|
||||
### Step 2: Template Selection
|
||||
- 📋 Shows available templates with descriptions
|
||||
- 🎯 Lets you choose interactively or via command line
|
||||
|
||||
### Step 3: Project Setup
|
||||
- 📁 Creates deployment directory (`template-name-deployment/`)
|
||||
- 📄 Extracts `docker-compose.yml` from template
|
||||
- 🔧 Creates `.env` file template with required variables
|
||||
- ⚠️ Shows setup requirements and warnings
|
||||
|
||||
### Step 4: Deployment (Optional)
|
||||
- 🐳 Pulls Docker images
|
||||
- 🚀 Starts services with `docker-compose up -d`
|
||||
- 📊 Shows service status and access URLs
|
||||
- 📝 Provides useful commands
|
||||
|
||||
## 📁 Directory Structure After Setup
|
||||
|
||||
```
|
||||
your-project/
|
||||
├── scripts/
|
||||
│ └── setup-template.sh # Auto-setup script
|
||||
├── templates/
|
||||
│ ├── umami.md # Template documentation
|
||||
│ ├── plex.md
|
||||
│ ├── immich.md
|
||||
│ └── ...
|
||||
└── umami-deployment/ # Created by setup script
|
||||
├── docker-compose.yml # Extracted from template
|
||||
├── .env # Environment variables
|
||||
└── README.md # Setup instructions
|
||||
```
|
||||
|
||||
## 🎯 Interactive Walkthrough Example
|
||||
|
||||
### Running Umami Setup:
|
||||
```bash
|
||||
$ ./scripts/setup-template.sh
|
||||
|
||||
========================================
|
||||
Checking Dependencies
|
||||
========================================
|
||||
✅ Docker is installed
|
||||
Docker version: 24.0.6
|
||||
✅ Docker Compose is installed
|
||||
Docker Compose version: 2.21.0
|
||||
✅ All dependencies are met
|
||||
|
||||
========================================
|
||||
Select Template
|
||||
========================================
|
||||
1) umami - Umami Analytics - Privacy-focused web analytics
|
||||
2) plex - Plex Media Server - Media streaming and organization
|
||||
3) immich - Immich - Photo and video backup solution
|
||||
...
|
||||
Select a template (1-20): 1
|
||||
✅ Selected template: umami
|
||||
|
||||
========================================
|
||||
Setting up umami
|
||||
========================================
|
||||
✅ Created project directory: /path/to/umami-deployment
|
||||
✅ docker-compose.yml extracted
|
||||
⚠️ This template requires environment variables:
|
||||
- `DATABASE_URL`: PostgreSQL connection string
|
||||
- `APP_SECRET`: Random string for application secrets
|
||||
✅ Created .env template file
|
||||
⚠️ Please edit umami-deployment/.env with your values before starting
|
||||
|
||||
Do you want to deploy the template now? (y/N): y
|
||||
|
||||
========================================
|
||||
Deploying umami
|
||||
========================================
|
||||
✅ Pulling Docker images...
|
||||
✅ Starting services...
|
||||
✅ Deployment completed!
|
||||
|
||||
========================================
|
||||
Access Information
|
||||
========================================
|
||||
✅ Service access URLs:
|
||||
• http://localhost:3000 (container port: 3000)
|
||||
|
||||
Useful commands:
|
||||
• View logs: docker-compose logs -f
|
||||
• Stop services: docker-compose down
|
||||
• Restart services: docker-compose restart
|
||||
• Update services: docker-compose pull && docker-compose up -d
|
||||
```
|
||||
|
||||
## 🔧 Manual Setup (Without Script)
|
||||
|
||||
If you prefer manual setup:
|
||||
|
||||
1. **Choose a template** from `/templates/`
|
||||
2. **Copy the docker-compose.yml** section
|
||||
3. **Create a project directory**
|
||||
4. **Set up environment variables**
|
||||
5. **Run `docker-compose up -d`**
|
||||
|
||||
Example for Umami:
|
||||
```bash
|
||||
mkdir umami-deployment
|
||||
cd umami-deployment
|
||||
|
||||
# Copy docker-compose.yml from templates/umami.md
|
||||
# Create .env file with required variables
|
||||
docker-compose up -d
|
||||
```
|
||||
|
||||
## 🎛️ Available Templates
|
||||
|
||||
| Template | Description | Difficulty |
|
||||
|----------|-------------|------------|
|
||||
| **umami** | Web Analytics | Easy |
|
||||
| **plex** | Media Server | Medium |
|
||||
| **immich** | Photo Backup | Medium |
|
||||
| **n8n** | Workflow Automation | Medium |
|
||||
| **supabase** | Backend Service | Hard |
|
||||
| **home-assistant** | Smart Home | Medium |
|
||||
| **uptime-kuma** | Monitoring | Easy |
|
||||
| **grafana** | Metrics Dashboard | Medium |
|
||||
| **traefik** | Reverse Proxy | Medium |
|
||||
| **memos** | Note-taking | Easy |
|
||||
| **meilisearch** | Search Engine | Easy |
|
||||
| **vaultwarden** | Password Manager | Medium |
|
||||
| **pihole** | DNS Blocker | Medium |
|
||||
| **appwrite** | Backend Platform | Hard |
|
||||
| **gitea** | Git Hosting | Medium |
|
||||
| **mastodon** | Social Network | Hard |
|
||||
| **jellyfin** | Media Server | Medium |
|
||||
| **nextcloud** | Cloud Storage | Hard |
|
||||
| **glance** | Dashboard | Easy |
|
||||
| **cloudreve** | File Manager | Medium |
|
||||
|
||||
## 🛠️ Advanced Usage
|
||||
|
||||
### Custom Deployment Directory
|
||||
```bash
|
||||
# Set custom deployment directory
|
||||
export DEPLOY_DIR="/opt/my-services"
|
||||
./scripts/setup-template.sh umami
|
||||
```
|
||||
|
||||
### Batch Setup
|
||||
```bash
|
||||
# Setup multiple templates
|
||||
for template in umami plex nextcloud; do
|
||||
./scripts/setup-template.sh --setup "$template"
|
||||
done
|
||||
```
|
||||
|
||||
### Production Deployment
|
||||
```bash
|
||||
# Setup with production considerations
|
||||
./scripts/setup-template.sh --setup umami
|
||||
cd umami-deployment
|
||||
|
||||
# Edit .env with production values
|
||||
# Configure reverse proxy
|
||||
# Set up SSL certificates
|
||||
# Run deployment
|
||||
./scripts/setup-template.sh --deploy umami
|
||||
```
|
||||
|
||||
## 🔍 Troubleshooting
|
||||
|
||||
### Common Issues
|
||||
|
||||
1. **Docker not installed**
|
||||
```bash
|
||||
# Install Docker
|
||||
curl -fsSL https://get.docker.com -o get-docker.sh
|
||||
sudo sh get-docker.sh
|
||||
```
|
||||
|
||||
2. **Permission denied**
|
||||
```bash
|
||||
# Add user to docker group
|
||||
sudo usermod -aG docker $USER
|
||||
# Log out and back in
|
||||
```
|
||||
|
||||
3. **Port conflicts**
|
||||
```bash
|
||||
# Check what's using ports
|
||||
netstat -tulpn | grep :3000
|
||||
# Modify docker-compose.yml to use different ports
|
||||
```
|
||||
|
||||
4. **Environment variables not set**
|
||||
```bash
|
||||
# Edit .env file
|
||||
nano umami-deployment/.env
|
||||
# Replace change_me values
|
||||
```
|
||||
|
||||
### Getting Help
|
||||
|
||||
Each template includes:
|
||||
- ✅ **Complete setup instructions**
|
||||
- ✅ **Environment variable explanations**
|
||||
- ✅ **Troubleshooting section**
|
||||
- ✅ **Backup strategies**
|
||||
- ✅ **Performance optimization**
|
||||
|
||||
## 🎯 Next Steps
|
||||
|
||||
1. **Try the interactive setup**:
|
||||
```bash
|
||||
./scripts/setup-template.sh
|
||||
```
|
||||
|
||||
2. **Start with an easy template** (umami, glance, memos)
|
||||
|
||||
3. **Read the template documentation** before deployment
|
||||
|
||||
4. **Check the troubleshooting section** if you encounter issues
|
||||
|
||||
5. **Join the community** for each service for additional support
|
||||
|
||||
## 📞 Support
|
||||
|
||||
For issues with:
|
||||
- **Setup script**: Create an issue in this repository
|
||||
- **Specific service**: Check the service's official documentation
|
||||
- **Docker issues**: Refer to Docker documentation
|
||||
|
||||
Each template includes links to official documentation and community support channels.
|
||||
@@ -0,0 +1,69 @@
|
||||
# Containr Auth And Shell Design
|
||||
|
||||
Date: 2026-04-16
|
||||
|
||||
## Scope
|
||||
|
||||
Change only `app/frontend` and `app/backend`. Leave legacy root `src/` frontend untouched.
|
||||
|
||||
## Auth
|
||||
|
||||
Containr uses embedded Better Auth for cookie sessions. Public auth supports only:
|
||||
|
||||
- Email/password
|
||||
- GitHub OAuth
|
||||
- Google OAuth
|
||||
|
||||
Magic links, GitLab, Bitbucket, and Gitea auth are removed from active auth UI and runtime config.
|
||||
|
||||
Bootstrap behavior:
|
||||
|
||||
- If no local platform users exist, auth UI sends users to first-account registration.
|
||||
- If at least one local platform user exists, public registration is disabled.
|
||||
- Existing users can sign in only.
|
||||
- New users after bootstrap must be created manually inside authenticated platform UI/API.
|
||||
|
||||
Backend enforcement:
|
||||
|
||||
- Better Auth blocks user creation after bootstrap unless request carries trusted internal token.
|
||||
- Go API exposes bootstrap status.
|
||||
- Go API exposes authenticated manual user creation. It creates both Better Auth credentials and local platform user.
|
||||
|
||||
## Shell
|
||||
|
||||
Desktop sidebar becomes expanded, non-scrollable, and label-first. Primary items:
|
||||
|
||||
- Projects
|
||||
- Templates
|
||||
- Usage
|
||||
- People
|
||||
- Settings
|
||||
- Docs
|
||||
|
||||
Bottom area keeps account access and settings/sign-out. Top logo placeholder links to `/projects`. Support is removed.
|
||||
|
||||
## Upgrade
|
||||
|
||||
Upgrade control becomes functional. Backend exposes current image/ref status and a pull operation for configured GitHub Container Registry or Docker image refs. Frontend can auto-detect configured image and trigger pull.
|
||||
|
||||
## Notifications
|
||||
|
||||
Notifications menu shows live operational data from existing build/audit APIs with refresh. It no longer acts as static decoration.
|
||||
|
||||
## Theme
|
||||
|
||||
Add light mode support by toggling root theme attribute and CSS variables. Keep current dark palette as default.
|
||||
|
||||
## Task 7: Host Monitoring And Agents
|
||||
|
||||
Add backend/frontend foundation for host telemetry and distributed nodes:
|
||||
|
||||
- Monitor server running Containr.
|
||||
- Store/surface CPU, memory, disk, load, uptime, Docker availability, and node health.
|
||||
- Reuse existing node agent routes where possible.
|
||||
- Allow connecting additional VPS, LXC, VM, or bare-metal nodes through agent registration.
|
||||
- Expose data needed later by autoscaling and distributed placement.
|
||||
|
||||
## Validation
|
||||
|
||||
Run frontend typecheck/build for `app/frontend`. Run focused Go tests or `go test ./internal/api/... ./internal/middleware/...` from `app/backend` where feasible.
|
||||
Reference in new issue
Block a user