chore: remove unused Dockerfile and docker-compose.yml
Some checks failed
AITBC CI/CD Pipeline / lint-and-test (3.11) (push) Has been cancelled
AITBC CI/CD Pipeline / lint-and-test (3.12) (push) Has been cancelled
AITBC CI/CD Pipeline / lint-and-test (3.13) (push) Has been cancelled
AITBC CI/CD Pipeline / test-cli (push) Has been cancelled
AITBC CI/CD Pipeline / test-services (push) Has been cancelled
AITBC CI/CD Pipeline / test-production-services (push) Has been cancelled
AITBC CI/CD Pipeline / security-scan (push) Has been cancelled
AITBC CI/CD Pipeline / build (push) Has been cancelled
AITBC CI/CD Pipeline / deploy-staging (push) Has been cancelled
AITBC CI/CD Pipeline / deploy-production (push) Has been cancelled
AITBC CI/CD Pipeline / performance-test (push) Has been cancelled
AITBC CI/CD Pipeline / docs (push) Has been cancelled
AITBC CI/CD Pipeline / release (push) Has been cancelled
AITBC CI/CD Pipeline / notify (push) Has been cancelled
Security Scanning / Bandit Security Scan (apps/coordinator-api/src) (push) Has been cancelled
Security Scanning / Bandit Security Scan (cli/aitbc_cli) (push) Has been cancelled
Security Scanning / Bandit Security Scan (packages/py/aitbc-core/src) (push) Has been cancelled
Security Scanning / Bandit Security Scan (packages/py/aitbc-crypto/src) (push) Has been cancelled
Security Scanning / Bandit Security Scan (packages/py/aitbc-sdk/src) (push) Has been cancelled
Security Scanning / Bandit Security Scan (tests) (push) Has been cancelled
Security Scanning / CodeQL Security Analysis (javascript) (push) Has been cancelled
Security Scanning / CodeQL Security Analysis (python) (push) Has been cancelled
Security Scanning / Dependency Security Scan (push) Has been cancelled
Security Scanning / Container Security Scan (push) Has been cancelled
Security Scanning / OSSF Scorecard (push) Has been cancelled
Security Scanning / Security Summary Report (push) Has been cancelled
Some checks failed
AITBC CI/CD Pipeline / lint-and-test (3.11) (push) Has been cancelled
AITBC CI/CD Pipeline / lint-and-test (3.12) (push) Has been cancelled
AITBC CI/CD Pipeline / lint-and-test (3.13) (push) Has been cancelled
AITBC CI/CD Pipeline / test-cli (push) Has been cancelled
AITBC CI/CD Pipeline / test-services (push) Has been cancelled
AITBC CI/CD Pipeline / test-production-services (push) Has been cancelled
AITBC CI/CD Pipeline / security-scan (push) Has been cancelled
AITBC CI/CD Pipeline / build (push) Has been cancelled
AITBC CI/CD Pipeline / deploy-staging (push) Has been cancelled
AITBC CI/CD Pipeline / deploy-production (push) Has been cancelled
AITBC CI/CD Pipeline / performance-test (push) Has been cancelled
AITBC CI/CD Pipeline / docs (push) Has been cancelled
AITBC CI/CD Pipeline / release (push) Has been cancelled
AITBC CI/CD Pipeline / notify (push) Has been cancelled
Security Scanning / Bandit Security Scan (apps/coordinator-api/src) (push) Has been cancelled
Security Scanning / Bandit Security Scan (cli/aitbc_cli) (push) Has been cancelled
Security Scanning / Bandit Security Scan (packages/py/aitbc-core/src) (push) Has been cancelled
Security Scanning / Bandit Security Scan (packages/py/aitbc-crypto/src) (push) Has been cancelled
Security Scanning / Bandit Security Scan (packages/py/aitbc-sdk/src) (push) Has been cancelled
Security Scanning / Bandit Security Scan (tests) (push) Has been cancelled
Security Scanning / CodeQL Security Analysis (javascript) (push) Has been cancelled
Security Scanning / CodeQL Security Analysis (python) (push) Has been cancelled
Security Scanning / Dependency Security Scan (push) Has been cancelled
Security Scanning / Container Security Scan (push) Has been cancelled
Security Scanning / OSSF Scorecard (push) Has been cancelled
Security Scanning / Security Summary Report (push) Has been cancelled
This commit is contained in:
66
Dockerfile
66
Dockerfile
@@ -1,66 +0,0 @@
|
||||
# Multi-stage build for AITBC CLI
|
||||
FROM python:3.13-slim as builder
|
||||
|
||||
# Set working directory
|
||||
WORKDIR /app
|
||||
|
||||
# Install system dependencies
|
||||
RUN apt-get update && apt-get install -y \
|
||||
gcc \
|
||||
g++ \
|
||||
make \
|
||||
libffi-dev \
|
||||
libssl-dev \
|
||||
&& rm -rf /var/lib/apt/lists/*
|
||||
|
||||
# Copy requirements
|
||||
COPY cli/requirements.txt .
|
||||
COPY cli/requirements-dev.txt .
|
||||
|
||||
# Install Python dependencies
|
||||
RUN pip install --no-cache-dir --upgrade pip && \
|
||||
pip install --no-cache-dir -r requirements.txt && \
|
||||
pip install --no-cache-dir -r requirements-dev.txt
|
||||
|
||||
# Copy CLI source code
|
||||
COPY cli/ .
|
||||
|
||||
# Install CLI in development mode
|
||||
RUN pip install -e .
|
||||
|
||||
# Production stage
|
||||
FROM python:3.13-slim as production
|
||||
|
||||
# Create non-root user
|
||||
RUN useradd --create-home --shell /bin/bash aitbc
|
||||
|
||||
# Set working directory
|
||||
WORKDIR /app
|
||||
|
||||
# Install runtime dependencies
|
||||
RUN apt-get update && apt-get install -y \
|
||||
curl \
|
||||
&& rm -rf /var/lib/apt/lists/*
|
||||
|
||||
# Copy CLI from builder stage
|
||||
COPY --from=builder /usr/local/lib/python3.13/site-packages /usr/local/lib/python3.13/site-packages
|
||||
COPY --from=builder /usr/local/bin /usr/local/bin
|
||||
|
||||
# Create data directories
|
||||
RUN mkdir -p /home/aitbc/.aitbc && \
|
||||
chown -R aitbc:aitbc /home/aitbc
|
||||
|
||||
# Switch to non-root user
|
||||
USER aitbc
|
||||
|
||||
# Set environment variables
|
||||
ENV PATH=/home/aitbc/.local/bin:$PATH
|
||||
ENV PYTHONPATH=/app
|
||||
ENV AITBC_DATA_DIR=/home/aitbc/.aitbc
|
||||
|
||||
# Health check
|
||||
HEALTHCHECK --interval=30s --timeout=10s --start-period=5s --retries=3 \
|
||||
CMD python -m aitbc_cli.main --version || exit 1
|
||||
|
||||
# Default command
|
||||
CMD ["python", "-m", "aitbc_cli.main", "--help"]
|
||||
@@ -1,431 +0,0 @@
|
||||
version: '3.8'
|
||||
|
||||
services:
|
||||
# Database Services
|
||||
postgres:
|
||||
image: postgres:15
|
||||
environment:
|
||||
POSTGRES_DB: aitbc
|
||||
POSTGRES_USER: aitbc
|
||||
POSTGRES_PASSWORD: ${POSTGRES_PASSWORD:-aitbc123}
|
||||
volumes:
|
||||
- postgres_data:/var/lib/postgresql/data
|
||||
- ./scripts/init-db.sql:/docker-entrypoint-initdb.d/init-db.sql
|
||||
ports:
|
||||
- "5432:5432"
|
||||
healthcheck:
|
||||
test: ["CMD-SHELL", "pg_isready -U aitbc"]
|
||||
interval: 30s
|
||||
timeout: 10s
|
||||
retries: 5
|
||||
|
||||
redis:
|
||||
image: redis:7-alpine
|
||||
ports:
|
||||
- "6379:6379"
|
||||
volumes:
|
||||
- redis_data:/data
|
||||
healthcheck:
|
||||
test: ["CMD", "redis-cli", "ping"]
|
||||
interval: 30s
|
||||
timeout: 10s
|
||||
retries: 5
|
||||
|
||||
# Core Blockchain Services
|
||||
blockchain-node:
|
||||
build:
|
||||
context: ./apps/blockchain-node
|
||||
dockerfile: Dockerfile
|
||||
environment:
|
||||
- NODE_ENV=production
|
||||
- DATABASE_URL=postgresql://aitbc:${POSTGRES_PASSWORD:-aitbc123}@postgres:5432/aitbc
|
||||
- REDIS_URL=redis://redis:6379/0
|
||||
ports:
|
||||
- "8007:8007"
|
||||
depends_on:
|
||||
postgres:
|
||||
condition: service_healthy
|
||||
redis:
|
||||
condition: service_healthy
|
||||
volumes:
|
||||
- ./data/blockchain:/app/data
|
||||
healthcheck:
|
||||
test: ["CMD", "curl", "-f", "http://localhost:8007/health"]
|
||||
interval: 30s
|
||||
timeout: 10s
|
||||
retries: 5
|
||||
|
||||
consensus-node:
|
||||
build:
|
||||
context: ./apps/consensus-node
|
||||
dockerfile: Dockerfile
|
||||
environment:
|
||||
- NODE_ENV=production
|
||||
- DATABASE_URL=postgresql://aitbc:${POSTGRES_PASSWORD:-aitbc123}@postgres:5432/aitbc
|
||||
- BLOCKCHAIN_URL=http://blockchain-node:8007
|
||||
ports:
|
||||
- "8002:8002"
|
||||
depends_on:
|
||||
- blockchain-node
|
||||
volumes:
|
||||
- ./data/consensus:/app/data
|
||||
healthcheck:
|
||||
test: ["CMD", "curl", "-f", "http://localhost:8002/health"]
|
||||
interval: 30s
|
||||
timeout: 10s
|
||||
retries: 5
|
||||
|
||||
network-node:
|
||||
build:
|
||||
context: ./apps/network-node
|
||||
dockerfile: Dockerfile
|
||||
environment:
|
||||
- NODE_ENV=production
|
||||
- DATABASE_URL=postgresql://aitbc:${POSTGRES_PASSWORD:-aitbc123}@postgres:5432/aitbc
|
||||
- CONSENSUS_URL=http://consensus-node:8002
|
||||
ports:
|
||||
- "8008:8008"
|
||||
depends_on:
|
||||
- consensus-node
|
||||
volumes:
|
||||
- ./data/network:/app/data
|
||||
healthcheck:
|
||||
test: ["CMD", "curl", "-f", "http://localhost:8008/health"]
|
||||
interval: 30s
|
||||
timeout: 10s
|
||||
retries: 5
|
||||
|
||||
# Coordinator Services
|
||||
coordinator-api:
|
||||
build:
|
||||
context: ./apps/coordinator-api
|
||||
dockerfile: Dockerfile
|
||||
environment:
|
||||
- NODE_ENV=production
|
||||
- DATABASE_URL=postgresql://aitbc:${POSTGRES_PASSWORD:-aitbc123}@postgres:5432/aitbc
|
||||
- REDIS_URL=redis://redis:6379/0
|
||||
- BLOCKCHAIN_URL=http://blockchain-node:8007
|
||||
- CONSENSUS_URL=http://consensus-node:8002
|
||||
- NETWORK_URL=http://network-node:8008
|
||||
ports:
|
||||
- "8001:8001"
|
||||
depends_on:
|
||||
postgres:
|
||||
condition: service_healthy
|
||||
redis:
|
||||
condition: service_healthy
|
||||
blockchain-node:
|
||||
condition: service_healthy
|
||||
healthcheck:
|
||||
test: ["CMD", "curl", "-f", "http://localhost:8001/health"]
|
||||
interval: 30s
|
||||
timeout: 10s
|
||||
retries: 5
|
||||
|
||||
# Production Services
|
||||
exchange-integration:
|
||||
build:
|
||||
context: ./apps/exchange-integration
|
||||
dockerfile: Dockerfile
|
||||
environment:
|
||||
- NODE_ENV=production
|
||||
- DATABASE_URL=postgresql://aitbc:${POSTGRES_PASSWORD:-aitbc123}@postgres:5432/aitbc
|
||||
- REDIS_URL=redis://redis:6379/0
|
||||
- COORDINATOR_URL=http://coordinator-api:8001
|
||||
ports:
|
||||
- "8010:8010"
|
||||
depends_on:
|
||||
- coordinator-api
|
||||
healthcheck:
|
||||
test: ["CMD", "curl", "-f", "http://localhost:8010/health"]
|
||||
interval: 30s
|
||||
timeout: 10s
|
||||
retries: 5
|
||||
|
||||
compliance-service:
|
||||
build:
|
||||
context: ./apps/compliance-service
|
||||
dockerfile: Dockerfile
|
||||
environment:
|
||||
- NODE_ENV=production
|
||||
- DATABASE_URL=postgresql://aitbc:${POSTGRES_PASSWORD:-aitbc123}@postgres:5432/aitbc
|
||||
- REDIS_URL=redis://redis:6379/0
|
||||
- COORDINATOR_URL=http://coordinator-api:8001
|
||||
ports:
|
||||
- "8011:8011"
|
||||
depends_on:
|
||||
- coordinator-api
|
||||
healthcheck:
|
||||
test: ["CMD", "curl", "-f", "http://localhost:8011/health"]
|
||||
interval: 30s
|
||||
timeout: 10s
|
||||
retries: 5
|
||||
|
||||
trading-engine:
|
||||
build:
|
||||
context: ./apps/trading-engine
|
||||
dockerfile: Dockerfile
|
||||
environment:
|
||||
- NODE_ENV=production
|
||||
- DATABASE_URL=postgresql://aitbc:${POSTGRES_PASSWORD:-aitbc123}@postgres:5432/aitbc
|
||||
- REDIS_URL=redis://redis:6379/0
|
||||
- EXCHANGE_URL=http://exchange-integration:8010
|
||||
- COORDINATOR_URL=http://coordinator-api:8001
|
||||
ports:
|
||||
- "8012:8012"
|
||||
depends_on:
|
||||
- exchange-integration
|
||||
- coordinator-api
|
||||
healthcheck:
|
||||
test: ["CMD", "curl", "-f", "http://localhost:8012/health"]
|
||||
interval: 30s
|
||||
timeout: 10s
|
||||
retries: 5
|
||||
|
||||
# Plugin Ecosystem
|
||||
plugin-registry:
|
||||
build:
|
||||
context: ./apps/plugin-registry
|
||||
dockerfile: Dockerfile
|
||||
environment:
|
||||
- NODE_ENV=production
|
||||
- DATABASE_URL=postgresql://aitbc:${POSTGRES_PASSWORD:-aitbc123}@postgres:5432/aitbc
|
||||
- REDIS_URL=redis://redis:6379/0
|
||||
- COORDINATOR_URL=http://coordinator-api:8001
|
||||
ports:
|
||||
- "8013:8013"
|
||||
depends_on:
|
||||
- coordinator-api
|
||||
healthcheck:
|
||||
test: ["CMD", "curl", "-f", "http://localhost:8013/health"]
|
||||
interval: 30s
|
||||
timeout: 10s
|
||||
retries: 5
|
||||
|
||||
plugin-marketplace:
|
||||
build:
|
||||
context: ./apps/plugin-marketplace
|
||||
dockerfile: Dockerfile
|
||||
environment:
|
||||
- NODE_ENV=production
|
||||
- DATABASE_URL=postgresql://aitbc:${POSTGRES_PASSWORD:-aitbc123}@postgres:5432/aitbc
|
||||
- REDIS_URL=redis://redis:6379/0
|
||||
- PLUGIN_REGISTRY_URL=http://plugin-registry:8013
|
||||
- COORDINATOR_URL=http://coordinator-api:8001
|
||||
ports:
|
||||
- "8014:8014"
|
||||
depends_on:
|
||||
- plugin-registry
|
||||
- coordinator-api
|
||||
healthcheck:
|
||||
test: ["CMD", "curl", "-f", "http://localhost:8014/health"]
|
||||
interval: 30s
|
||||
timeout: 10s
|
||||
retries: 5
|
||||
|
||||
plugin-security:
|
||||
build:
|
||||
context: ./apps/plugin-security
|
||||
dockerfile: Dockerfile
|
||||
environment:
|
||||
- NODE_ENV=production
|
||||
- DATABASE_URL=postgresql://aitbc:${POSTGRES_PASSWORD:-aitbc123}@postgres:5432/aitbc
|
||||
- REDIS_URL=redis://redis:6379/0
|
||||
- PLUGIN_REGISTRY_URL=http://plugin-registry:8013
|
||||
- COORDINATOR_URL=http://coordinator-api:8001
|
||||
ports:
|
||||
- "8015:8015"
|
||||
depends_on:
|
||||
- plugin-registry
|
||||
- coordinator-api
|
||||
healthcheck:
|
||||
test: ["CMD", "curl", "-f", "http://localhost:8015/health"]
|
||||
interval: 30s
|
||||
timeout: 10s
|
||||
retries: 5
|
||||
|
||||
plugin-analytics:
|
||||
build:
|
||||
context: ./apps/plugin-analytics
|
||||
dockerfile: Dockerfile
|
||||
environment:
|
||||
- NODE_ENV=production
|
||||
- DATABASE_URL=postgresql://aitbc:${POSTGRES_PASSWORD:-aitbc123}@postgres:5432/aitbc
|
||||
- REDIS_URL=redis://redis:6379/0
|
||||
- PLUGIN_REGISTRY_URL=http://plugin-registry:8013
|
||||
- PLUGIN_MARKETPLACE_URL=http://plugin-marketplace:8014
|
||||
- COORDINATOR_URL=http://coordinator-api:8001
|
||||
ports:
|
||||
- "8016:8016"
|
||||
depends_on:
|
||||
- plugin-registry
|
||||
- plugin-marketplace
|
||||
- coordinator-api
|
||||
healthcheck:
|
||||
test: ["CMD", "curl", "-f", "http://localhost:8016/health"]
|
||||
interval: 30s
|
||||
timeout: 10s
|
||||
retries: 5
|
||||
|
||||
# Global Infrastructure
|
||||
global-infrastructure:
|
||||
build:
|
||||
context: ./apps/global-infrastructure
|
||||
dockerfile: Dockerfile
|
||||
environment:
|
||||
- NODE_ENV=production
|
||||
- DATABASE_URL=postgresql://aitbc:${POSTGRES_PASSWORD:-aitbc123}@postgres:5432/aitbc
|
||||
- REDIS_URL=redis://redis:6379/0
|
||||
- COORDINATOR_URL=http://coordinator-api:8001
|
||||
ports:
|
||||
- "8017:8017"
|
||||
depends_on:
|
||||
- coordinator-api
|
||||
healthcheck:
|
||||
test: ["CMD", "curl", "-f", "http://localhost:8017/health"]
|
||||
interval: 30s
|
||||
timeout: 10s
|
||||
retries: 5
|
||||
|
||||
global-ai-agents:
|
||||
build:
|
||||
context: ./apps/global-ai-agents
|
||||
dockerfile: Dockerfile
|
||||
environment:
|
||||
- NODE_ENV=production
|
||||
- DATABASE_URL=postgresql://aitbc:${POSTGRES_PASSWORD:-aitbc123}@postgres:5432/aitbc
|
||||
- REDIS_URL=redis://redis:6379/0
|
||||
- COORDINATOR_URL=http://coordinator-api:8001
|
||||
- GLOBAL_INFRASTRUCTURE_URL=http://global-infrastructure:8017
|
||||
ports:
|
||||
- "8018:8018"
|
||||
depends_on:
|
||||
- coordinator-api
|
||||
- global-infrastructure
|
||||
healthcheck:
|
||||
test: ["CMD", "curl", "-f", "http://localhost:8018/health"]
|
||||
interval: 30s
|
||||
timeout: 10s
|
||||
retries: 5
|
||||
|
||||
multi-region-load-balancer:
|
||||
build:
|
||||
context: ./apps/multi-region-load-balancer
|
||||
dockerfile: Dockerfile
|
||||
environment:
|
||||
- NODE_ENV=production
|
||||
- DATABASE_URL=postgresql://aitbc:${POSTGRES_PASSWORD:-aitbc123}@postgres:5432/aitbc
|
||||
- REDIS_URL=redis://redis:6379/0
|
||||
- GLOBAL_INFRASTRUCTURE_URL=http://global-infrastructure:8017
|
||||
- COORDINATOR_URL=http://coordinator-api:8001
|
||||
ports:
|
||||
- "8019:8019"
|
||||
depends_on:
|
||||
- global-infrastructure
|
||||
- coordinator-api
|
||||
healthcheck:
|
||||
test: ["CMD", "curl", "-f", "http://localhost:8019/health"]
|
||||
interval: 30s
|
||||
timeout: 10s
|
||||
retries: 5
|
||||
|
||||
# Explorer
|
||||
explorer:
|
||||
build:
|
||||
context: ./apps/explorer
|
||||
dockerfile: Dockerfile
|
||||
environment:
|
||||
- NODE_ENV=production
|
||||
- DATABASE_URL=postgresql://aitbc:${POSTGRES_PASSWORD:-aitbc123}@postgres:5432/aitbc
|
||||
- BLOCKCHAIN_URL=http://blockchain-node:8007
|
||||
- NETWORK_URL=http://network-node:8008
|
||||
- COORDINATOR_URL=http://coordinator-api:8001
|
||||
ports:
|
||||
- "8020:8020"
|
||||
depends_on:
|
||||
- blockchain-node
|
||||
- network-node
|
||||
- coordinator-api
|
||||
healthcheck:
|
||||
test: ["CMD", "curl", "-f", "http://localhost:8020/health"]
|
||||
interval: 30s
|
||||
timeout: 10s
|
||||
retries: 5
|
||||
|
||||
# CLI Container
|
||||
aitbc-cli:
|
||||
build:
|
||||
context: .
|
||||
dockerfile: Dockerfile
|
||||
target: production
|
||||
environment:
|
||||
- NODE_ENV=production
|
||||
- COORDINATOR_URL=http://coordinator-api:8001
|
||||
- BLOCKCHAIN_URL=http://blockchain-node:8007
|
||||
- EXCHANGE_URL=http://exchange-integration:8010
|
||||
- COMPLIANCE_URL=http://compliance-service:8011
|
||||
depends_on:
|
||||
- coordinator-api
|
||||
- blockchain-node
|
||||
- exchange-integration
|
||||
- compliance-service
|
||||
volumes:
|
||||
- ./data/cli:/home/aitbc/.aitbc
|
||||
entrypoint: ["tail", "-f", "/dev/null"]
|
||||
|
||||
# Monitoring
|
||||
prometheus:
|
||||
image: prom/prometheus:latest
|
||||
ports:
|
||||
- "9090:9090"
|
||||
volumes:
|
||||
- ./monitoring/prometheus.yml:/etc/prometheus/prometheus.yml
|
||||
- prometheus_data:/prometheus
|
||||
command:
|
||||
- '--config.file=/etc/prometheus/prometheus.yml'
|
||||
- '--storage.tsdb.path=/prometheus'
|
||||
- '--web.console.libraries=/etc/prometheus/console_libraries'
|
||||
- '--web.console.templates=/etc/prometheus/consoles'
|
||||
- '--storage.tsdb.retention.time=200h'
|
||||
- '--web.enable-lifecycle'
|
||||
|
||||
grafana:
|
||||
image: grafana/grafana:latest
|
||||
ports:
|
||||
- "3000:3000"
|
||||
environment:
|
||||
- GF_SECURITY_ADMIN_PASSWORD=${GRAFANA_PASSWORD:-admin}
|
||||
volumes:
|
||||
- grafana_data:/var/lib/grafana
|
||||
- ./monitoring/grafana/dashboards:/etc/grafana/provisioning/dashboards
|
||||
- ./monitoring/grafana/datasources:/etc/grafana/provisioning/datasources
|
||||
|
||||
# Reverse Proxy
|
||||
nginx:
|
||||
image: nginx:alpine
|
||||
ports:
|
||||
- "80:80"
|
||||
- "443:443"
|
||||
volumes:
|
||||
- ./nginx/nginx.conf:/etc/nginx/nginx.conf
|
||||
- ./nginx/ssl:/etc/nginx/ssl
|
||||
depends_on:
|
||||
- coordinator-api
|
||||
- exchange-integration
|
||||
- plugin-marketplace
|
||||
- explorer
|
||||
healthcheck:
|
||||
test: ["CMD", "curl", "-f", "http://localhost/health"]
|
||||
interval: 30s
|
||||
timeout: 10s
|
||||
retries: 5
|
||||
|
||||
volumes:
|
||||
postgres_data:
|
||||
redis_data:
|
||||
prometheus_data:
|
||||
grafana_data:
|
||||
|
||||
networks:
|
||||
default:
|
||||
driver: bridge
|
||||
Reference in New Issue
Block a user