Catalyst-Plugin-OpenIDConnect

 view release on metacpan or  search on metacpan

DEPLOYMENT.md  view on Meta::CPAN

```ini
[Unit]
Description=OpenID Connect Provider
After=network.target

[Service]
Type=simple
User=www-data
WorkingDirectory=/opt/oidc
ExecStart=/usr/bin/perl app.pl
Restart=always
RestartSec=10

# Limit resources
LimitNOFILE=65535
LimitNPROC=32768

# Security
PrivateTmp=yes
NoNewPrivileges=yes
ProtectSystem=strict
ProtectHome=yes
ReadWritePaths=/opt/oidc/logs /opt/oidc/var

[Install]
WantedBy=multi-user.target
```

Enable and start:

```bash
sudo systemctl daemon-reload
sudo systemctl enable oidc-catalyst
sudo systemctl start oidc-catalyst
```

## Docker Deployment

### Dockerfile

```dockerfile
FROM perl:5.32

WORKDIR /app

# Install dependencies
COPY cpanfile .
RUN apt-get update && apt-get install -y openssl && \
    cpanm -n --installdeps .

# Copy application
COPY . .

# Generate keys (or mount from volume)
RUN mkdir -p /app/keys && \
    openssl genrsa -out /app/keys/private.pem 2048 && \
    openssl rsa -in /app/keys/private.pem -pubout -out /app/keys/public.pem

# Create non-root user
RUN useradd -m -u 1000 catalyst && \
    chown -R catalyst:catalyst /app

USER catalyst

EXPOSE 5000

CMD ["perl", "app.pl"]
```

### Docker Compose

The example below includes a Redis service for multi-process deployments (e.g.
when running multiple `oidc` replicas or using a FastCGI-based server).

```yaml
version: '3.8'

services:
  oidc:
    build: .
    ports:
      - "5000:5000"
    environment:
      CATALYST_HOME: /app
      CATALYST_ENV: production
      REDIS_URL: redis:6379
      REDIS_PASSWORD: "${REDIS_PASSWORD}"
    volumes:
      - ./keys:/app/keys:ro
      - ./logs:/app/logs
    restart: unless-stopped
    depends_on:
      redis:
        condition: service_healthy
    healthcheck:
      test: ["CMD", "curl", "-f", "http://localhost:5000/.well-known/openid-configuration"]
      interval: 30s
      timeout: 10s
      retries: 3

  redis:
    image: redis:7-alpine
    command: >
      redis-server
      --requirepass "${REDIS_PASSWORD}"
      --maxmemory 256mb
      --maxmemory-policy allkeys-lru
      --appendonly yes
    volumes:
      - redis_data:/data
    restart: unless-stopped
    healthcheck:
      test: ["CMD", "redis-cli", "-a", "${REDIS_PASSWORD}", "ping"]
      interval: 10s
      timeout: 5s
      retries: 5

  nginx:
    image: nginx:alpine
    ports:
      - "443:443"



( run in 0.468 second using v1.01-cache-2.11-cpan-71847e10f99 )