deploy-shinyproxy
정보
이 스킬은 다중 컨테이너화된 Shiny 애플리케이션을 단일 진입점을 통해 호스팅하기 위해 ShinyProxy를 배포합니다. 독립적인 앱 컨테이너에 대해 Docker 기반 배포, 인증, 접근 제어 및 사용 분석을 처리합니다. 단일 앱 배포를 넘어서는 보안 기능으로 여러 Shiny 앱을 관리해야 할 때 사용하세요.
빠른 설치
Claude Code
추천npx skills add pjt222/agent-almanac -a claude-code/plugin add https://github.com/pjt222/agent-almanacgit clone https://github.com/pjt222/agent-almanac.git ~/.claude/skills/deploy-shinyproxyClaude Code에서 이 명령을 복사하여 붙여넣어 스킬을 설치하세요
문서
name: deploy-shinyproxy description: > Desplegar ShinyProxy para alojar múltiples aplicaciones Shiny containerizadas. Cubre el despliegue de ShinyProxy con Docker, configuración de application.yml, imágenes Docker de apps Shiny, autenticación, backends de contenedores, seguimiento de uso y escalado. Úsalo al alojar múltiples apps Shiny detrás de un único punto de entrada, al necesitar autenticación y control de acceso por app, al desplegar apps Shiny como contenedores Docker aislados, o al escalar más allá del despliegue de app única con analíticas de uso y registro de auditoría. locale: es source_locale: en source_commit: 6f65f316 translator: claude-opus-4-6 translation_date: 2026-03-16 license: MIT allowed-tools: Read Write Edit Bash Grep Glob metadata: author: Philipp Thoss version: "1.0" domain: shiny complexity: advanced language: R tags: shinyproxy, shiny, docker, deployment, multi-app, authentication, self-hosted
Deploy ShinyProxy
Desplegar ShinyProxy para alojar múltiples aplicaciones Shiny containerizadas con autenticación y seguimiento de uso.
Cuándo Usar
- Al alojar múltiples apps Shiny detrás de un único punto de entrada
- Al necesitar autenticación y control de acceso por app
- Al desplegar apps Shiny como contenedores Docker aislados
- Al escalar más allá del despliegue de app única (shinyapps.io o Docker independiente)
- Al requerir analíticas de uso y registro de auditoría
Entradas
- Requerido: Una o más apps Shiny a desplegar
- Requerido: Servidor con Docker instalado
- Opcional: Proveedor de autenticación (LDAP, OpenID, social)
- Opcional: Nombre de dominio y certificado SSL
- Opcional: Orquestador de contenedores (Docker o Kubernetes)
Procedimiento
Paso 1: Crear Imágenes Docker de las Apps Shiny
Cada app Shiny necesita su propia imagen Docker. Ejemplo de Dockerfile para una app Shiny:
FROM rocker/shiny:4.5.0
RUN apt-get update && apt-get install -y \
libcurl4-openssl-dev \
libssl-dev \
&& rm -rf /var/lib/apt/lists/*
RUN R -e "install.packages(c('shiny', 'bslib', 'DT', 'dplyr'), \
repos='https://cloud.r-project.org/')"
COPY app/ /srv/shiny-server/app/
RUN chown -R shiny:shiny /srv/shiny-server/app
USER shiny
EXPOSE 3838
CMD ["R", "-e", "shiny::runApp('/srv/shiny-server/app', host='0.0.0.0', port=3838)"]
Compila y prueba cada app:
docker build -t myorg/dashboard:latest ./apps/dashboard/
docker run --rm -p 3838:3838 myorg/dashboard:latest
Esperado: Cada app Shiny se ejecuta de forma independiente en su propio contenedor.
Paso 2: Configurar ShinyProxy
application.yml:
proxy:
title: "Shiny Applications"
port: 8080
container-backend: docker
docker:
internal-networking: true
authentication: simple
admin-groups: admins
users:
- name: admin
password: admin_password
groups: admins
- name: analyst
password: analyst_password
groups: users
specs:
- id: dashboard
display-name: "Analytics Dashboard"
description: "Interactive data analysis dashboard"
container-image: myorg/dashboard:latest
container-cmd: ["R", "-e", "shiny::runApp('/srv/shiny-server/app', host='0.0.0.0', port=3838)"]
container-network: shinyproxy-net
port: 3838
access-groups: [admins, users]
- id: report-builder
display-name: "Report Builder"
description: "Generate custom reports"
container-image: myorg/report-builder:latest
container-cmd: ["R", "-e", "shiny::runApp('/srv/shiny-server/app', host='0.0.0.0', port=3838)"]
container-network: shinyproxy-net
port: 3838
access-groups: [admins]
logging:
file:
name: /opt/shinyproxy/log/shinyproxy.log
server:
forward-headers-strategy: native
Paso 3: Desplegar ShinyProxy con Docker Compose
docker-compose.yml:
services:
shinyproxy:
image: openanalytics/shinyproxy:3.1.1
container_name: shinyproxy
ports:
- "8080:8080"
volumes:
- ./application.yml:/opt/shinyproxy/application.yml:ro
- /var/run/docker.sock:/var/run/docker.sock
- shinyproxy-logs:/opt/shinyproxy/log
networks:
- shinyproxy-net
restart: unless-stopped
networks:
shinyproxy-net:
name: shinyproxy-net
driver: bridge
volumes:
shinyproxy-logs:
# Crear la red primero (ShinyProxy lanza contenedores en esta red)
docker network create shinyproxy-net
# Iniciar ShinyProxy
docker compose up -d
# Verificar registros
docker compose logs -f shinyproxy
Esperado: ShinyProxy arranca en el puerto 8080, muestra la página de inicio de sesión y lista las apps configuradas.
En caso de fallo: Verifica docker compose logs shinyproxy. Verifica que las imágenes de las apps estén disponibles localmente (docker images).
Paso 4: Configurar la Autenticación
Simple (incorporada)
Como se muestra en el Paso 2 con authentication: simple y usuarios en línea.
LDAP
proxy:
authentication: ldap
ldap:
url: ldap://ldap.example.com:389/dc=example,dc=com
manager-dn: cn=admin,dc=example,dc=com
manager-password: ldap_admin_password
user-search-base: ou=users
user-search-filter: (uid={0})
group-search-base: ou=groups
group-search-filter: (member={0})
OpenID Connect (Keycloak, Auth0, etc.)
proxy:
authentication: openid
openid:
auth-url: https://auth.example.com/realms/myrealm/protocol/openid-connect/auth
token-url: https://auth.example.com/realms/myrealm/protocol/openid-connect/token
jwks-url: https://auth.example.com/realms/myrealm/protocol/openid-connect/certs
client-id: shinyproxy
client-secret: your_client_secret
roles-claim: realm_access.roles
Paso 5: Añadir Proxy Inverso con Nginx
Para producción, coloca Nginx delante de ShinyProxy:
map $http_upgrade $connection_upgrade {
default upgrade;
'' close;
}
server {
listen 443 ssl;
server_name shiny.example.com;
ssl_certificate /etc/letsencrypt/live/shiny.example.com/fullchain.pem;
ssl_certificate_key /etc/letsencrypt/live/shiny.example.com/privkey.pem;
location / {
proxy_pass http://shinyproxy:8080;
proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection $connection_upgrade;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
proxy_read_timeout 600s;
proxy_buffering off;
}
}
El soporte de WebSocket es crítico — ShinyProxy y Shiny usan WebSockets ampliamente.
Paso 6: Seguimiento de Uso
ShinyProxy registra eventos de uso en su archivo de registro. Para seguimiento estructurado, configura InfluxDB:
proxy:
usage-stats-url: http://influxdb:8086/write?db=shinyproxy
usage-stats-username: shinyproxy
usage-stats-password: stats_password
Añade InfluxDB al stack de compose:
services:
influxdb:
image: influxdb:1.8
environment:
INFLUXDB_DB: shinyproxy
INFLUXDB_ADMIN_USER: admin
INFLUXDB_ADMIN_PASSWORD: admin_password
volumes:
- influxdata:/var/lib/influxdb
networks:
- shinyproxy-net
volumes:
influxdata:
Paso 7: Límites de Recursos de las Apps
specs:
- id: dashboard
container-image: myorg/dashboard:latest
container-memory-limit: 1g
container-cpu-limit: 1.0
max-instances: 5
container-env:
R_MAX_MEM_SIZE: 768m
Paso 8: Verificar el Despliegue
# Verificar el estado de ShinyProxy
curl -s http://localhost:8080/actuator/health
# Probar inicio de sesión
curl -s -c cookies.txt -d "username=admin&password=admin_password" \
http://localhost:8080/login
# Listar apps via API
curl -s -b cookies.txt http://localhost:8080/api/proxyspec
Esperado: El endpoint de estado devuelve UP. El inicio de sesión tiene éxito. Las apps se lanzan en contenedores aislados.
Validación
- ShinyProxy arranca y muestra la página de inicio de sesión
- La autenticación funciona para todos los usuarios configurados
- Cada app Shiny se lanza en su propio contenedor
- Las conexiones WebSocket funcionan (la reactividad de Shiny funciona)
- Los grupos de acceso restringen la visibilidad de las apps correctamente
- La limpieza de contenedores funciona cuando los usuarios se desconectan
- Los registros capturan los eventos de uso
Errores Comunes
- Permisos del socket Docker: ShinyProxy necesita acceso al socket Docker para lanzar contenedores. Ejecútalo como usuario en el grupo
dockero monta el socket. - Red incorrecta: Los contenedores de las apps deben estar en la misma red Docker que ShinyProxy (
container-networken specs debe coincidir). - Proxy WebSocket: Nginx u otros proxies delante de ShinyProxy deben reenviar las cabeceras de actualización de WebSocket.
- Imagen no encontrada: Las imágenes de las apps deben ser descargadas o compiladas localmente en el host Docker antes de que ShinyProxy intente usarlas.
- Limpieza de contenedores: Si ShinyProxy se cuelga, pueden quedar contenedores de apps huérfanos. Usa
docker pspara verificar y limpiar. - Límites de memoria: Las apps Shiny pueden consumir memoria significativa. Establece
container-memory-limitpara evitar que una sola app prive a las demás.
Habilidades Relacionadas
deploy-shiny-app— despliegue de app única en shinyapps.io, Posit Connect o Dockerconfigure-reverse-proxy— patrones de proxy inverso incluyendo proxy WebSocketcreate-dockerfile— creación general de Dockerfiles para imágenes de appscreate-r-dockerfile— Dockerfiles específicos de R con imágenes rocker
GitHub 저장소
연관 스킬
executing-plans
디자인executing-plans 스킬은 검토 체크포인트가 포함된 통제된 배치로 실행할 완전한 구현 계획이 있을 때 사용합니다. 이 스킬은 계획을 불러와 비판적으로 검토한 후, 소규모 배치(기본값 3개 작업)로 작업을 실행하면서 각 배치 사이에 진행 상황을 아키텍트 검토를 위해 보고합니다. 이를 통해 내재된 품질 관리 체크포인트를 갖춘 체계적인 구현이 보장됩니다.
requesting-code-review
디자인이 스킬은 코드 변경 사항을 요구 사항에 따라 분석하기 위해 코드 리뷰어 하위 에이전트를 호출합니다. 작업 완료 후, 주요 기능 구현 후, 또는 메인 브랜치에 병합하기 전에 사용해야 합니다. 이 리뷰는 현재 구현체와 원래 계획을 비교하여 문제를 조기에 발견하는 데 도움이 됩니다.
connect-mcp-server
디자인이 스킬은 개발자들이 HTTP, stdio 또는 SSE 전송 방식을 통해 MCP 서버를 Claude Code에 연결하는 포괄적인 가이드를 제공합니다. GitHub, Notion 및 사용자 정의 API와 같은 외부 서비스를 통합하기 위한 설치, 구성, 인증 및 보안을 다룹니다. MCP 통합 설정, 외부 도구 구성 또는 Claude의 모델 컨텍스트 프로토콜 작업 시 활용하세요.
web-cli-teleport
디자인이 스킬은 작업 분석을 기반으로 개발자가 Claude Code 웹 인터페이스와 CLI 인터페이스 중 선택할 수 있도록 돕고, 두 환경 간 원활한 세션 텔레포트를 가능하게 합니다. 웹, CLI 또는 모바일 환경 전환 시 세션 상태와 컨텍스트를 관리하여 워크플로를 최적화합니다. 다양한 단계에서 서로 다른 도구가 필요한 복잡한 프로젝트에 사용하세요.
