update latest dev
This commit is contained in:
parent
27885cf027
commit
6462a08960
5
.gitignore
vendored
5
.gitignore
vendored
@ -19,3 +19,8 @@ deployments/.env
|
|||||||
|
|
||||||
# OS files
|
# OS files
|
||||||
**/.DS_Store
|
**/.DS_Store
|
||||||
|
|
||||||
|
**/.claude/**
|
||||||
|
**/.claude-logs/**
|
||||||
|
**/.claude-sessions/**
|
||||||
|
**/.kilo/**
|
||||||
358
deployments/README.md
Normal file
358
deployments/README.md
Normal file
@ -0,0 +1,358 @@
|
|||||||
|
# Hiling Production Deployment Guide
|
||||||
|
|
||||||
|
This directory contains all necessary files for deploying the Hiling application stack to production using Docker Compose.
|
||||||
|
|
||||||
|
## Architecture
|
||||||
|
|
||||||
|
The application consists of 5 services:
|
||||||
|
|
||||||
|
1. **PostgreSQL** - Main database
|
||||||
|
2. **Meilisearch** - Search engine
|
||||||
|
3. **Backend** - Go API server (hiling_go)
|
||||||
|
4. **OpenGraph** - Deno-based OpenGraph service
|
||||||
|
5. **Frontend** - Preact/React frontend served by Nginx
|
||||||
|
|
||||||
|
## Prerequisites
|
||||||
|
|
||||||
|
- Docker Engine 20.10+
|
||||||
|
- Docker Compose v2.0+
|
||||||
|
- At least 2GB RAM
|
||||||
|
- 10GB free disk space
|
||||||
|
|
||||||
|
## Quick Start
|
||||||
|
|
||||||
|
### 1. Configuration
|
||||||
|
|
||||||
|
Copy the environment template and configure it:
|
||||||
|
|
||||||
|
```bash
|
||||||
|
cd deployments
|
||||||
|
cp .env.example .env
|
||||||
|
```
|
||||||
|
|
||||||
|
Edit `.env` and set the following required variables:
|
||||||
|
|
||||||
|
```bash
|
||||||
|
# REQUIRED: Set a strong password for PostgreSQL
|
||||||
|
DB_PASSWORD=your_secure_password_here
|
||||||
|
|
||||||
|
# REQUIRED: Set a 32-character secret key for JWT tokens
|
||||||
|
TOKEN_SYMMETRIC_KEY=your_32_character_secret_key_here
|
||||||
|
|
||||||
|
# REQUIRED: Set a master key for Meilisearch
|
||||||
|
MEILI_MASTER_KEY=your_secure_meilisearch_master_key
|
||||||
|
```
|
||||||
|
|
||||||
|
### 2. Build and Start Services
|
||||||
|
|
||||||
|
```bash
|
||||||
|
docker-compose up -d --build
|
||||||
|
```
|
||||||
|
|
||||||
|
This will:
|
||||||
|
- Build all custom Docker images
|
||||||
|
- Start all services in the correct order
|
||||||
|
- Wait for health checks to pass
|
||||||
|
- Run in detached mode
|
||||||
|
|
||||||
|
### 3. Verify Deployment
|
||||||
|
|
||||||
|
Check service status:
|
||||||
|
|
||||||
|
```bash
|
||||||
|
docker-compose ps
|
||||||
|
```
|
||||||
|
|
||||||
|
All services should show as "Up" or "healthy".
|
||||||
|
|
||||||
|
View logs:
|
||||||
|
|
||||||
|
```bash
|
||||||
|
# All services
|
||||||
|
docker-compose logs -f
|
||||||
|
|
||||||
|
# Specific service
|
||||||
|
docker-compose logs -f backend
|
||||||
|
docker-compose logs -f frontend
|
||||||
|
```
|
||||||
|
|
||||||
|
### 4. Database Initialization
|
||||||
|
|
||||||
|
If this is a fresh deployment, you may need to run database migrations:
|
||||||
|
|
||||||
|
```bash
|
||||||
|
docker-compose exec backend ./main migrate
|
||||||
|
```
|
||||||
|
|
||||||
|
(Adjust the command based on your migration setup)
|
||||||
|
|
||||||
|
## Service Endpoints
|
||||||
|
|
||||||
|
Once deployed, services are accessible at:
|
||||||
|
|
||||||
|
- **Frontend**: http://localhost:80
|
||||||
|
- **Backend API**: http://localhost:8888
|
||||||
|
- **OpenGraph Service**: http://localhost:1234
|
||||||
|
- **Meilisearch**: http://localhost:7700
|
||||||
|
- **PostgreSQL**: localhost:5432
|
||||||
|
|
||||||
|
## Configuration Reference
|
||||||
|
|
||||||
|
### Environment Variables
|
||||||
|
|
||||||
|
#### Database
|
||||||
|
- `DB_USERNAME` - PostgreSQL username (default: postgres)
|
||||||
|
- `DB_PASSWORD` - PostgreSQL password (required)
|
||||||
|
- `DB_NAME` - Database name (default: hiling)
|
||||||
|
- `DB_PORT` - External PostgreSQL port (default: 5432)
|
||||||
|
|
||||||
|
#### Backend
|
||||||
|
- `BACKEND_PORT` - Backend API external port (default: 8888)
|
||||||
|
- `TOKEN_SYMMETRIC_KEY` - JWT signing key (required, 32 chars)
|
||||||
|
- `TOKEN_DURATION` - Token validity period (default: 720h)
|
||||||
|
- `COOKIE_DURATION` - Cookie duration in seconds (default: 86400)
|
||||||
|
- `REFRESH_TOKEN_DURATION` - Refresh token duration (default: 720h)
|
||||||
|
|
||||||
|
#### Meilisearch
|
||||||
|
- `MEILI_MASTER_KEY` - Meilisearch master key (required)
|
||||||
|
- `MEILI_PORT` - External Meilisearch port (default: 7700)
|
||||||
|
|
||||||
|
#### OpenGraph
|
||||||
|
- `OPENGRAPH_PORT` - OpenGraph service port (default: 1234)
|
||||||
|
|
||||||
|
#### Frontend
|
||||||
|
- `FRONTEND_PORT` - Frontend external port (default: 80)
|
||||||
|
|
||||||
|
## Production Hardening
|
||||||
|
|
||||||
|
### Security Checklist
|
||||||
|
|
||||||
|
- [ ] Change all default passwords
|
||||||
|
- [ ] Use strong, randomly generated keys
|
||||||
|
- [ ] Configure firewall rules to restrict access
|
||||||
|
- [ ] Enable HTTPS with reverse proxy (Nginx/Caddy)
|
||||||
|
- [ ] Set up database backups
|
||||||
|
- [ ] Configure log rotation
|
||||||
|
- [ ] Review and restrict exposed ports
|
||||||
|
- [ ] Enable Docker security scanning
|
||||||
|
- [ ] Set resource limits for containers
|
||||||
|
|
||||||
|
### Recommended: Add Reverse Proxy
|
||||||
|
|
||||||
|
For production, add a reverse proxy like Nginx or Caddy in front of the services:
|
||||||
|
|
||||||
|
```yaml
|
||||||
|
# Add to docker-compose.yml
|
||||||
|
nginx-proxy:
|
||||||
|
image: nginx:alpine
|
||||||
|
ports:
|
||||||
|
- "443:443"
|
||||||
|
volumes:
|
||||||
|
- ./nginx-proxy.conf:/etc/nginx/nginx.conf
|
||||||
|
- ./ssl:/etc/nginx/ssl
|
||||||
|
depends_on:
|
||||||
|
- frontend
|
||||||
|
- backend
|
||||||
|
```
|
||||||
|
|
||||||
|
### Resource Limits
|
||||||
|
|
||||||
|
Add resource limits to prevent containers from consuming too much:
|
||||||
|
|
||||||
|
```yaml
|
||||||
|
services:
|
||||||
|
backend:
|
||||||
|
# ... existing config
|
||||||
|
deploy:
|
||||||
|
resources:
|
||||||
|
limits:
|
||||||
|
cpus: '1'
|
||||||
|
memory: 512M
|
||||||
|
reservations:
|
||||||
|
cpus: '0.5'
|
||||||
|
memory: 256M
|
||||||
|
```
|
||||||
|
|
||||||
|
## Management Commands
|
||||||
|
|
||||||
|
### Stop all services
|
||||||
|
```bash
|
||||||
|
docker-compose down
|
||||||
|
```
|
||||||
|
|
||||||
|
### Stop and remove volumes (WARNING: Deletes data)
|
||||||
|
```bash
|
||||||
|
docker-compose down -v
|
||||||
|
```
|
||||||
|
|
||||||
|
### Restart a specific service
|
||||||
|
```bash
|
||||||
|
docker-compose restart backend
|
||||||
|
```
|
||||||
|
|
||||||
|
### View resource usage
|
||||||
|
```bash
|
||||||
|
docker stats
|
||||||
|
```
|
||||||
|
|
||||||
|
### Rebuild a specific service
|
||||||
|
```bash
|
||||||
|
docker-compose up -d --build backend
|
||||||
|
```
|
||||||
|
|
||||||
|
### Access service shell
|
||||||
|
```bash
|
||||||
|
docker-compose exec backend sh
|
||||||
|
docker-compose exec postgres psql -U postgres -d hiling
|
||||||
|
```
|
||||||
|
|
||||||
|
## Backup and Restore
|
||||||
|
|
||||||
|
### Database Backup
|
||||||
|
|
||||||
|
```bash
|
||||||
|
# Backup
|
||||||
|
docker-compose exec -T postgres pg_dump -U postgres hiling > backup_$(date +%Y%m%d_%H%M%S).sql
|
||||||
|
|
||||||
|
# Restore
|
||||||
|
docker-compose exec -T postgres psql -U postgres hiling < backup_20260321_120000.sql
|
||||||
|
```
|
||||||
|
|
||||||
|
### Meilisearch Backup
|
||||||
|
|
||||||
|
Meilisearch data is stored in the `meilisearch_data` volume.
|
||||||
|
|
||||||
|
```bash
|
||||||
|
# Create backup of volume
|
||||||
|
docker run --rm -v deployments_meilisearch_data:/data -v $(pwd):/backup alpine tar czf /backup/meilisearch_backup.tar.gz -C /data .
|
||||||
|
|
||||||
|
# Restore
|
||||||
|
docker run --rm -v deployments_meilisearch_data:/data -v $(pwd):/backup alpine tar xzf /backup/meilisearch_backup.tar.gz -C /data
|
||||||
|
```
|
||||||
|
|
||||||
|
## Troubleshooting
|
||||||
|
|
||||||
|
### Service won't start
|
||||||
|
|
||||||
|
Check logs:
|
||||||
|
```bash
|
||||||
|
docker-compose logs <service-name>
|
||||||
|
```
|
||||||
|
|
||||||
|
### Database connection issues
|
||||||
|
|
||||||
|
Ensure PostgreSQL is healthy:
|
||||||
|
```bash
|
||||||
|
docker-compose ps postgres
|
||||||
|
docker-compose logs postgres
|
||||||
|
```
|
||||||
|
|
||||||
|
Test connection:
|
||||||
|
```bash
|
||||||
|
docker-compose exec postgres psql -U postgres -d hiling -c "SELECT 1"
|
||||||
|
```
|
||||||
|
|
||||||
|
### Port conflicts
|
||||||
|
|
||||||
|
If you get port binding errors, check what's using the port:
|
||||||
|
```bash
|
||||||
|
lsof -i :8888 # or any conflicting port
|
||||||
|
```
|
||||||
|
|
||||||
|
Change ports in `.env` file.
|
||||||
|
|
||||||
|
### Out of disk space
|
||||||
|
|
||||||
|
Check Docker disk usage:
|
||||||
|
```bash
|
||||||
|
docker system df
|
||||||
|
```
|
||||||
|
|
||||||
|
Clean up:
|
||||||
|
```bash
|
||||||
|
docker system prune -a
|
||||||
|
```
|
||||||
|
|
||||||
|
### Reset everything
|
||||||
|
|
||||||
|
```bash
|
||||||
|
docker-compose down -v
|
||||||
|
docker system prune -a
|
||||||
|
docker-compose up -d --build
|
||||||
|
```
|
||||||
|
|
||||||
|
## Monitoring
|
||||||
|
|
||||||
|
### Health Checks
|
||||||
|
|
||||||
|
All services have health checks configured. Check status:
|
||||||
|
|
||||||
|
```bash
|
||||||
|
docker-compose ps
|
||||||
|
```
|
||||||
|
|
||||||
|
### Logs
|
||||||
|
|
||||||
|
Centralized logging with Docker:
|
||||||
|
|
||||||
|
```bash
|
||||||
|
# Follow all logs
|
||||||
|
docker-compose logs -f
|
||||||
|
|
||||||
|
# Last 100 lines
|
||||||
|
docker-compose logs --tail=100
|
||||||
|
|
||||||
|
# Specific time range
|
||||||
|
docker-compose logs --since 30m
|
||||||
|
```
|
||||||
|
|
||||||
|
### Metrics
|
||||||
|
|
||||||
|
For production monitoring, consider adding:
|
||||||
|
- Prometheus for metrics
|
||||||
|
- Grafana for visualization
|
||||||
|
- Loki for log aggregation
|
||||||
|
|
||||||
|
## Scaling
|
||||||
|
|
||||||
|
To run multiple instances of a service:
|
||||||
|
|
||||||
|
```bash
|
||||||
|
docker-compose up -d --scale backend=3
|
||||||
|
```
|
||||||
|
|
||||||
|
Note: You'll need a load balancer (like Nginx) to distribute traffic.
|
||||||
|
|
||||||
|
## Updates and Maintenance
|
||||||
|
|
||||||
|
### Updating Services
|
||||||
|
|
||||||
|
1. Pull latest code
|
||||||
|
2. Rebuild images: `docker-compose build`
|
||||||
|
3. Restart services: `docker-compose up -d`
|
||||||
|
|
||||||
|
### Rolling Updates
|
||||||
|
|
||||||
|
For zero-downtime updates:
|
||||||
|
|
||||||
|
1. Scale up new version
|
||||||
|
2. Wait for health check
|
||||||
|
3. Remove old version
|
||||||
|
|
||||||
|
```bash
|
||||||
|
docker-compose up -d --scale backend=2 --no-recreate
|
||||||
|
# Wait for new instance to be healthy
|
||||||
|
docker-compose up -d --scale backend=1
|
||||||
|
```
|
||||||
|
|
||||||
|
## Support
|
||||||
|
|
||||||
|
For issues and questions:
|
||||||
|
- Check logs: `docker-compose logs`
|
||||||
|
- Review configuration in `.env`
|
||||||
|
- Ensure all required environment variables are set
|
||||||
|
- Verify Docker and Docker Compose versions
|
||||||
|
|
||||||
|
## License
|
||||||
|
|
||||||
|
[Your License Here]
|
||||||
@ -35,6 +35,16 @@ services:
|
|||||||
- hiling_network_dev
|
- hiling_network_dev
|
||||||
restart: unless-stopped
|
restart: unless-stopped
|
||||||
|
|
||||||
|
# Redis
|
||||||
|
redis:
|
||||||
|
image: redis:7-alpine
|
||||||
|
container_name: hiling_redis_dev
|
||||||
|
ports:
|
||||||
|
- "${REDIS_PORT:-6379}:6379"
|
||||||
|
networks:
|
||||||
|
- hiling_network_dev
|
||||||
|
restart: unless-stopped
|
||||||
|
|
||||||
volumes:
|
volumes:
|
||||||
postgres_data_dev:
|
postgres_data_dev:
|
||||||
driver: local
|
driver: local
|
||||||
|
|||||||
@ -44,6 +44,23 @@ services:
|
|||||||
timeout: 5s
|
timeout: 5s
|
||||||
retries: 5
|
retries: 5
|
||||||
|
|
||||||
|
# Redis
|
||||||
|
redis:
|
||||||
|
image: redis:7-alpine
|
||||||
|
container_name: hiling_redis
|
||||||
|
ports:
|
||||||
|
- "${REDIS_PORT:-6379}:6379"
|
||||||
|
volumes:
|
||||||
|
- redis_data:/data
|
||||||
|
networks:
|
||||||
|
- hiling_network
|
||||||
|
restart: unless-stopped
|
||||||
|
healthcheck:
|
||||||
|
test: ["CMD", "redis-cli", "ping"]
|
||||||
|
interval: 10s
|
||||||
|
timeout: 5s
|
||||||
|
retries: 5
|
||||||
|
|
||||||
# Backend API (Go)
|
# Backend API (Go)
|
||||||
backend:
|
backend:
|
||||||
build:
|
build:
|
||||||
@ -63,6 +80,7 @@ services:
|
|||||||
TOKEN_DURATION: ${TOKEN_DURATION:-1024h}
|
TOKEN_DURATION: ${TOKEN_DURATION:-1024h}
|
||||||
COOKIE_DURATION: ${COOKIE_DURATION:-86400}
|
COOKIE_DURATION: ${COOKIE_DURATION:-86400}
|
||||||
REFRESH_TOKEN_DURATION: ${REFRESH_TOKEN_DURATION:-1024h}
|
REFRESH_TOKEN_DURATION: ${REFRESH_TOKEN_DURATION:-1024h}
|
||||||
|
REDIS_ADDRESS: redis:6379
|
||||||
ports:
|
ports:
|
||||||
- "${BACKEND_PORT:-8888}:8888"
|
- "${BACKEND_PORT:-8888}:8888"
|
||||||
depends_on:
|
depends_on:
|
||||||
@ -70,6 +88,8 @@ services:
|
|||||||
condition: service_healthy
|
condition: service_healthy
|
||||||
meilisearch:
|
meilisearch:
|
||||||
condition: service_healthy
|
condition: service_healthy
|
||||||
|
redis:
|
||||||
|
condition: service_healthy
|
||||||
networks:
|
networks:
|
||||||
- hiling_network
|
- hiling_network
|
||||||
restart: unless-stopped
|
restart: unless-stopped
|
||||||
@ -128,6 +148,8 @@ volumes:
|
|||||||
driver: local
|
driver: local
|
||||||
meilisearch_data:
|
meilisearch_data:
|
||||||
driver: local
|
driver: local
|
||||||
|
redis_data:
|
||||||
|
driver: local
|
||||||
|
|
||||||
networks:
|
networks:
|
||||||
hiling_network:
|
hiling_network:
|
||||||
|
|||||||
@ -1 +1 @@
|
|||||||
Subproject commit 67eb0a5a66d412fe5e11a84b54a9be3280f74d5a
|
Subproject commit 67ea7cb20fbb14416febd4bc869245c5bbe40e28
|
||||||
@ -1 +1 @@
|
|||||||
Subproject commit 38e44d7056ab82118d726e289ae9c16a56ebb34e
|
Subproject commit b5a316af982de400aca6f3320e9c1823f4c20cfa
|
||||||
27
run-dev-concurrent.sh
Executable file
27
run-dev-concurrent.sh
Executable file
@ -0,0 +1,27 @@
|
|||||||
|
#!/bin/bash
|
||||||
|
|
||||||
|
DOCKER=${DOCKER:-docker}
|
||||||
|
|
||||||
|
# Advanced concurrent development server runner using concurrently (if available)
|
||||||
|
# Falls back to basic parallel execution if concurrently is not installed
|
||||||
|
|
||||||
|
# Check if concurrently is installed
|
||||||
|
if command -v npx &> /dev/null && npx concurrently --version &> /dev/null 2>&1; then
|
||||||
|
echo "Using concurrently for better process management..."
|
||||||
|
|
||||||
|
npx concurrently --kill-others \
|
||||||
|
--names "Redis,Backend,Meilisearch,Frontend,OpenGraph" \
|
||||||
|
--prefix "[{name}]" \
|
||||||
|
--prefix-colors "red,green,yellow,blue,magenta" \
|
||||||
|
"$DOCKER compose -f deployments/docker-compose.dev.yml up redis" \
|
||||||
|
"sleep 2 && cd hiling_go && air" \
|
||||||
|
"cd hiling_go && ./dev-meilisearch.sh" \
|
||||||
|
"cd hilingriviw && pnpm dev" \
|
||||||
|
"cd hiling-opengraph && deno task dev"
|
||||||
|
else
|
||||||
|
echo "concurrently not found. Install it for better process management:"
|
||||||
|
echo " npm install -g concurrently"
|
||||||
|
echo ""
|
||||||
|
echo "Falling back to run-dev.sh..."
|
||||||
|
exec ./run-dev.sh
|
||||||
|
fi
|
||||||
13
run-dev.sh
13
run-dev.sh
@ -1,5 +1,9 @@
|
|||||||
#!/bin/bash
|
#!/bin/bash
|
||||||
|
|
||||||
|
DOCKER="podman"
|
||||||
|
|
||||||
|
echo ${DOCKER}
|
||||||
|
|
||||||
RED='\033[0;31m'
|
RED='\033[0;31m'
|
||||||
GREEN='\033[0;32m'
|
GREEN='\033[0;32m'
|
||||||
YELLOW='\033[1;33m'
|
YELLOW='\033[1;33m'
|
||||||
@ -46,10 +50,19 @@ if ! command -v deno &> /dev/null; then
|
|||||||
exit 1
|
exit 1
|
||||||
fi
|
fi
|
||||||
|
|
||||||
|
if ! command -v "$DOCKER" &> /dev/null; then
|
||||||
|
echo -e "${RED}Error: '$DOCKER' is not installed${NC}"
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
|
|
||||||
echo -e "${GREEN}All requirements satisfied${NC}\n"
|
echo -e "${GREEN}All requirements satisfied${NC}\n"
|
||||||
|
|
||||||
echo -e "${CYAN}Starting all development servers...${NC}\n"
|
echo -e "${CYAN}Starting all development servers...${NC}\n"
|
||||||
|
|
||||||
|
run_service "Redis" "$RED" "." "$DOCKER" compose -f deployments/docker-compose.dev.yml up redis
|
||||||
|
|
||||||
|
sleep 2
|
||||||
|
|
||||||
run_service "Backend" "$GREEN" "hiling_go" air
|
run_service "Backend" "$GREEN" "hiling_go" air
|
||||||
|
|
||||||
run_service "Meilisearch" "$YELLOW" "hiling_go" ./dev-meilisearch.sh
|
run_service "Meilisearch" "$YELLOW" "hiling_go" ./dev-meilisearch.sh
|
||||||
|
|||||||
Loading…
Reference in New Issue
Block a user