feat: move asciinema to dev stack under asciinema.dev.pivoine.art
- Moved asciinema service from standalone stack to dev/compose.yaml - Updated hostname from asciinema.pivoine.art to asciinema.dev.pivoine.art - Updated environment variables to use DEV_ASCIINEMA_ prefix - Updated restic backup volume reference (asciinema_data -> dev_asciinema_data) - Moved custom.exs to dev/asciinema-custom.exs - Removed standalone asciinema/compose.yaml directory - Container name changes from asciinema_app to dev_asciinema - Volume name changes from asciinema_data to dev_asciinema_data - Preserved admin interface at admin.asciinema.dev.pivoine.art with Basic Auth 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude <noreply@anthropic.com>
This commit is contained in:
13
arty.yml
13
arty.yml
@@ -124,6 +124,10 @@ envs:
|
|||||||
DEV_N8N_TRAEFIK_HOST: n8n.dev.pivoine.art
|
DEV_N8N_TRAEFIK_HOST: n8n.dev.pivoine.art
|
||||||
DEV_N8N_DB_NAME: n8n
|
DEV_N8N_DB_NAME: n8n
|
||||||
DEV_N8N_DB_SCHEMA: public
|
DEV_N8N_DB_SCHEMA: public
|
||||||
|
DEV_ASCIINEMA_IMAGE: ghcr.io/asciinema/asciinema-server:latest
|
||||||
|
DEV_ASCIINEMA_TRAEFIK_HOST: asciinema.dev.pivoine.art
|
||||||
|
DEV_ASCIINEMA_DB_NAME: asciinema
|
||||||
|
DEV_ASCIINEMA_SIGN_UP_DISABLED: true
|
||||||
# PairDrop
|
# PairDrop
|
||||||
DROP_TRAEFIK_ENABLED: true
|
DROP_TRAEFIK_ENABLED: true
|
||||||
DROP_COMPOSE_PROJECT_NAME: drop
|
DROP_COMPOSE_PROJECT_NAME: drop
|
||||||
@@ -161,15 +165,6 @@ envs:
|
|||||||
AI_CRAWL4AI_PORT: 11235
|
AI_CRAWL4AI_PORT: 11235
|
||||||
AI_OPENAI_API_BASE_URLS: https://api.anthropic.com/v1
|
AI_OPENAI_API_BASE_URLS: https://api.anthropic.com/v1
|
||||||
AI_LITELLM_TRAEFIK_HOST: llm.ai.pivoine.art
|
AI_LITELLM_TRAEFIK_HOST: llm.ai.pivoine.art
|
||||||
# Asciinema
|
|
||||||
ASCIINEMA_TRAEFIK_ENABLED: true
|
|
||||||
ASCIINEMA_COMPOSE_PROJECT_NAME: asciinema
|
|
||||||
ASCIINEMA_IMAGE: ghcr.io/asciinema/asciinema-server:latest
|
|
||||||
ASCIINEMA_TRAEFIK_HOST: asciinema.pivoine.art
|
|
||||||
ASCIINEMA_DB_NAME: asciinema
|
|
||||||
ASCIINEMA_SIGN_UP_DISABLED: true
|
|
||||||
ASCIINEMA_UNCLAIMED_TTL: 30
|
|
||||||
ASCIINEMA_MAIL_REPLY_TO: valknar@pivoine.art
|
|
||||||
# Watchtower
|
# Watchtower
|
||||||
WATCHTOWER_POLL_INTERVAL: 300
|
WATCHTOWER_POLL_INTERVAL: 300
|
||||||
WATCHTOWER_LABEL_ENABLE: true
|
WATCHTOWER_LABEL_ENABLE: true
|
||||||
|
|||||||
@@ -1,63 +0,0 @@
|
|||||||
services:
|
|
||||||
asciinema:
|
|
||||||
image: ${ASCIINEMA_IMAGE:-ghcr.io/asciinema/asciinema-server:latest}
|
|
||||||
container_name: ${ASCIINEMA_COMPOSE_PROJECT_NAME}_app
|
|
||||||
restart: unless-stopped
|
|
||||||
networks:
|
|
||||||
- compose_network
|
|
||||||
volumes:
|
|
||||||
- asciinema_data:/var/opt/asciinema
|
|
||||||
- ./custom.exs:/opt/app/etc/custom.exs:ro
|
|
||||||
environment:
|
|
||||||
SECRET_KEY_BASE: ${ASCIINEMA_SECRET_KEY}
|
|
||||||
URL_HOST: ${ASCIINEMA_TRAEFIK_HOST}
|
|
||||||
URL_SCHEME: https
|
|
||||||
DATABASE_URL: postgresql://${DB_USER}:${DB_PASSWORD}@${CORE_DB_HOST}/${ASCIINEMA_DB_NAME}?pool_size=10
|
|
||||||
SMTP_HOST: ${EMAIL_SMTP_HOST}
|
|
||||||
SMTP_USERNAME: ${EMAIL_SMTP_USER}
|
|
||||||
SMTP_PASSWORD: ${EMAIL_SMTP_PASSWORD}
|
|
||||||
SMTP_FROM_ADDRESS: ${EMAIL_FROM}
|
|
||||||
SIGN_UP_DISABLED: ${ASCIINEMA_SIGN_UP_DISABLED:-false}
|
|
||||||
DEFAULT_AVATAR: gravatar
|
|
||||||
labels:
|
|
||||||
- 'traefik.enable=${ASCIINEMA_TRAEFIK_ENABLED}'
|
|
||||||
# Main web interface - HTTP to HTTPS redirect
|
|
||||||
- 'traefik.http.middlewares.${ASCIINEMA_COMPOSE_PROJECT_NAME}-redirect-web-secure.redirectscheme.scheme=https'
|
|
||||||
- 'traefik.http.routers.${ASCIINEMA_COMPOSE_PROJECT_NAME}-web.middlewares=${ASCIINEMA_COMPOSE_PROJECT_NAME}-redirect-web-secure'
|
|
||||||
- 'traefik.http.routers.${ASCIINEMA_COMPOSE_PROJECT_NAME}-web.rule=Host(`${ASCIINEMA_TRAEFIK_HOST}`)'
|
|
||||||
- 'traefik.http.routers.${ASCIINEMA_COMPOSE_PROJECT_NAME}-web.entrypoints=web'
|
|
||||||
- 'traefik.http.routers.${ASCIINEMA_COMPOSE_PROJECT_NAME}-web.service=${ASCIINEMA_COMPOSE_PROJECT_NAME}'
|
|
||||||
# Main web interface - HTTPS router
|
|
||||||
- 'traefik.http.routers.${ASCIINEMA_COMPOSE_PROJECT_NAME}-web-secure.rule=Host(`${ASCIINEMA_TRAEFIK_HOST}`)'
|
|
||||||
- 'traefik.http.routers.${ASCIINEMA_COMPOSE_PROJECT_NAME}-web-secure.tls.certresolver=resolver'
|
|
||||||
- 'traefik.http.routers.${ASCIINEMA_COMPOSE_PROJECT_NAME}-web-secure.entrypoints=web-secure'
|
|
||||||
- 'traefik.http.middlewares.${ASCIINEMA_COMPOSE_PROJECT_NAME}-compress.compress=true'
|
|
||||||
- 'traefik.http.routers.${ASCIINEMA_COMPOSE_PROJECT_NAME}-web-secure.middlewares=${ASCIINEMA_COMPOSE_PROJECT_NAME}-compress,security-headers@file'
|
|
||||||
- 'traefik.http.routers.${ASCIINEMA_COMPOSE_PROJECT_NAME}-web-secure.service=${ASCIINEMA_COMPOSE_PROJECT_NAME}'
|
|
||||||
- 'traefik.http.services.${ASCIINEMA_COMPOSE_PROJECT_NAME}.loadbalancer.server.port=4000'
|
|
||||||
# Admin interface - HTTP to HTTPS redirect
|
|
||||||
- 'traefik.http.routers.${ASCIINEMA_COMPOSE_PROJECT_NAME}-admin-web.middlewares=${ASCIINEMA_COMPOSE_PROJECT_NAME}-redirect-web-secure'
|
|
||||||
- 'traefik.http.routers.${ASCIINEMA_COMPOSE_PROJECT_NAME}-admin-web.rule=Host(`admin.${ASCIINEMA_TRAEFIK_HOST}`)'
|
|
||||||
- 'traefik.http.routers.${ASCIINEMA_COMPOSE_PROJECT_NAME}-admin-web.entrypoints=web'
|
|
||||||
- 'traefik.http.routers.${ASCIINEMA_COMPOSE_PROJECT_NAME}-admin-web.service=${ASCIINEMA_COMPOSE_PROJECT_NAME}-admin'
|
|
||||||
# Admin interface - HTTPS router with Basic Auth
|
|
||||||
- 'traefik.http.middlewares.${ASCIINEMA_COMPOSE_PROJECT_NAME}-auth.basicauth.users=${AUTH_USERS}'
|
|
||||||
- 'traefik.http.routers.${ASCIINEMA_COMPOSE_PROJECT_NAME}-admin-web-secure.rule=Host(`admin.${ASCIINEMA_TRAEFIK_HOST}`)'
|
|
||||||
- 'traefik.http.routers.${ASCIINEMA_COMPOSE_PROJECT_NAME}-admin-web-secure.tls.certresolver=resolver'
|
|
||||||
- 'traefik.http.routers.${ASCIINEMA_COMPOSE_PROJECT_NAME}-admin-web-secure.entrypoints=web-secure'
|
|
||||||
- 'traefik.http.routers.${ASCIINEMA_COMPOSE_PROJECT_NAME}-admin-web-secure.middlewares=${ASCIINEMA_COMPOSE_PROJECT_NAME}-auth,${ASCIINEMA_COMPOSE_PROJECT_NAME}-compress,security-headers@file'
|
|
||||||
- 'traefik.http.routers.${ASCIINEMA_COMPOSE_PROJECT_NAME}-admin-web-secure.service=${ASCIINEMA_COMPOSE_PROJECT_NAME}-admin'
|
|
||||||
- 'traefik.http.services.${ASCIINEMA_COMPOSE_PROJECT_NAME}-admin.loadbalancer.server.port=4002'
|
|
||||||
# Network
|
|
||||||
- 'traefik.docker.network=${NETWORK_NAME}'
|
|
||||||
# Watchtower
|
|
||||||
- 'com.centurylinklabs.watchtower.enable=${WATCHTOWER_LABEL_ENABLE}'
|
|
||||||
|
|
||||||
volumes:
|
|
||||||
asciinema_data:
|
|
||||||
name: ${ASCIINEMA_COMPOSE_PROJECT_NAME}_data
|
|
||||||
|
|
||||||
networks:
|
|
||||||
compose_network:
|
|
||||||
name: ${NETWORK_NAME}
|
|
||||||
external: true
|
|
||||||
@@ -9,7 +9,6 @@ include:
|
|||||||
- joplin/compose.yaml
|
- joplin/compose.yaml
|
||||||
- drop/compose.yaml
|
- drop/compose.yaml
|
||||||
- ai/compose.yaml
|
- ai/compose.yaml
|
||||||
- asciinema/compose.yaml
|
|
||||||
- restic/compose.yaml
|
- restic/compose.yaml
|
||||||
- netdata/compose.yaml
|
- netdata/compose.yaml
|
||||||
- umami/compose.yaml
|
- umami/compose.yaml
|
||||||
|
|||||||
@@ -226,6 +226,61 @@ services:
|
|||||||
# Watchtower
|
# Watchtower
|
||||||
- "com.centurylinklabs.watchtower.enable=${WATCHTOWER_LABEL_ENABLE}"
|
- "com.centurylinklabs.watchtower.enable=${WATCHTOWER_LABEL_ENABLE}"
|
||||||
|
|
||||||
|
# Asciinema - Terminal recording and sharing platform
|
||||||
|
asciinema:
|
||||||
|
image: ${DEV_ASCIINEMA_IMAGE:-ghcr.io/asciinema/asciinema-server:latest}
|
||||||
|
container_name: ${DEV_COMPOSE_PROJECT_NAME}_asciinema
|
||||||
|
restart: unless-stopped
|
||||||
|
volumes:
|
||||||
|
- asciinema_data:/var/opt/asciinema
|
||||||
|
- ./asciinema-custom.exs:/opt/app/etc/custom.exs:ro
|
||||||
|
environment:
|
||||||
|
SECRET_KEY_BASE: ${ASCIINEMA_SECRET_KEY}
|
||||||
|
URL_HOST: ${DEV_ASCIINEMA_TRAEFIK_HOST}
|
||||||
|
URL_SCHEME: https
|
||||||
|
DATABASE_URL: postgresql://${DB_USER}:${DB_PASSWORD}@${CORE_DB_HOST}/${DEV_ASCIINEMA_DB_NAME}?pool_size=10
|
||||||
|
SMTP_HOST: ${EMAIL_SMTP_HOST}
|
||||||
|
SMTP_USERNAME: ${EMAIL_SMTP_USER}
|
||||||
|
SMTP_PASSWORD: ${EMAIL_SMTP_PASSWORD}
|
||||||
|
SMTP_FROM_ADDRESS: ${EMAIL_FROM}
|
||||||
|
SIGN_UP_DISABLED: ${DEV_ASCIINEMA_SIGN_UP_DISABLED:-false}
|
||||||
|
DEFAULT_AVATAR: gravatar
|
||||||
|
networks:
|
||||||
|
- compose_network
|
||||||
|
labels:
|
||||||
|
- "traefik.enable=${DEV_TRAEFIK_ENABLED}"
|
||||||
|
# Main web interface - HTTP to HTTPS redirect
|
||||||
|
- "traefik.http.middlewares.${DEV_COMPOSE_PROJECT_NAME}-asciinema-redirect-web-secure.redirectscheme.scheme=https"
|
||||||
|
- "traefik.http.routers.${DEV_COMPOSE_PROJECT_NAME}-asciinema-web.middlewares=${DEV_COMPOSE_PROJECT_NAME}-asciinema-redirect-web-secure"
|
||||||
|
- "traefik.http.routers.${DEV_COMPOSE_PROJECT_NAME}-asciinema-web.rule=Host(`${DEV_ASCIINEMA_TRAEFIK_HOST}`)"
|
||||||
|
- "traefik.http.routers.${DEV_COMPOSE_PROJECT_NAME}-asciinema-web.entrypoints=web"
|
||||||
|
- "traefik.http.routers.${DEV_COMPOSE_PROJECT_NAME}-asciinema-web.service=${DEV_COMPOSE_PROJECT_NAME}-asciinema"
|
||||||
|
# Main web interface - HTTPS router
|
||||||
|
- "traefik.http.routers.${DEV_COMPOSE_PROJECT_NAME}-asciinema-web-secure.rule=Host(`${DEV_ASCIINEMA_TRAEFIK_HOST}`)"
|
||||||
|
- "traefik.http.routers.${DEV_COMPOSE_PROJECT_NAME}-asciinema-web-secure.tls.certresolver=resolver"
|
||||||
|
- "traefik.http.routers.${DEV_COMPOSE_PROJECT_NAME}-asciinema-web-secure.entrypoints=web-secure"
|
||||||
|
- "traefik.http.middlewares.${DEV_COMPOSE_PROJECT_NAME}-asciinema-compress.compress=true"
|
||||||
|
- "traefik.http.routers.${DEV_COMPOSE_PROJECT_NAME}-asciinema-web-secure.middlewares=${DEV_COMPOSE_PROJECT_NAME}-asciinema-compress,security-headers@file"
|
||||||
|
- "traefik.http.routers.${DEV_COMPOSE_PROJECT_NAME}-asciinema-web-secure.service=${DEV_COMPOSE_PROJECT_NAME}-asciinema"
|
||||||
|
- "traefik.http.services.${DEV_COMPOSE_PROJECT_NAME}-asciinema.loadbalancer.server.port=4000"
|
||||||
|
# Admin interface - HTTP to HTTPS redirect
|
||||||
|
- "traefik.http.routers.${DEV_COMPOSE_PROJECT_NAME}-asciinema-admin-web.middlewares=${DEV_COMPOSE_PROJECT_NAME}-asciinema-redirect-web-secure"
|
||||||
|
- "traefik.http.routers.${DEV_COMPOSE_PROJECT_NAME}-asciinema-admin-web.rule=Host(`admin.${DEV_ASCIINEMA_TRAEFIK_HOST}`)"
|
||||||
|
- "traefik.http.routers.${DEV_COMPOSE_PROJECT_NAME}-asciinema-admin-web.entrypoints=web"
|
||||||
|
- "traefik.http.routers.${DEV_COMPOSE_PROJECT_NAME}-asciinema-admin-web.service=${DEV_COMPOSE_PROJECT_NAME}-asciinema-admin"
|
||||||
|
# Admin interface - HTTPS router with Basic Auth
|
||||||
|
- "traefik.http.middlewares.${DEV_COMPOSE_PROJECT_NAME}-asciinema-auth.basicauth.users=${AUTH_USERS}"
|
||||||
|
- "traefik.http.routers.${DEV_COMPOSE_PROJECT_NAME}-asciinema-admin-web-secure.rule=Host(`admin.${DEV_ASCIINEMA_TRAEFIK_HOST}`)"
|
||||||
|
- "traefik.http.routers.${DEV_COMPOSE_PROJECT_NAME}-asciinema-admin-web-secure.tls.certresolver=resolver"
|
||||||
|
- "traefik.http.routers.${DEV_COMPOSE_PROJECT_NAME}-asciinema-admin-web-secure.entrypoints=web-secure"
|
||||||
|
- "traefik.http.routers.${DEV_COMPOSE_PROJECT_NAME}-asciinema-admin-web-secure.middlewares=${DEV_COMPOSE_PROJECT_NAME}-asciinema-auth,${DEV_COMPOSE_PROJECT_NAME}-asciinema-compress,security-headers@file"
|
||||||
|
- "traefik.http.routers.${DEV_COMPOSE_PROJECT_NAME}-asciinema-admin-web-secure.service=${DEV_COMPOSE_PROJECT_NAME}-asciinema-admin"
|
||||||
|
- "traefik.http.services.${DEV_COMPOSE_PROJECT_NAME}-asciinema-admin.loadbalancer.server.port=4002"
|
||||||
|
# Network
|
||||||
|
- "traefik.docker.network=${NETWORK_NAME}"
|
||||||
|
# Watchtower
|
||||||
|
- "com.centurylinklabs.watchtower.enable=${WATCHTOWER_LABEL_ENABLE}"
|
||||||
|
|
||||||
volumes:
|
volumes:
|
||||||
gitea_data:
|
gitea_data:
|
||||||
name: ${DEV_COMPOSE_PROJECT_NAME}_gitea_data
|
name: ${DEV_COMPOSE_PROJECT_NAME}_gitea_data
|
||||||
@@ -237,6 +292,8 @@ volumes:
|
|||||||
name: ${DEV_COMPOSE_PROJECT_NAME}_coolify_data
|
name: ${DEV_COMPOSE_PROJECT_NAME}_coolify_data
|
||||||
n8n_data:
|
n8n_data:
|
||||||
name: ${DEV_COMPOSE_PROJECT_NAME}_n8n_data
|
name: ${DEV_COMPOSE_PROJECT_NAME}_n8n_data
|
||||||
|
asciinema_data:
|
||||||
|
name: ${DEV_COMPOSE_PROJECT_NAME}_asciinema_data
|
||||||
|
|
||||||
networks:
|
networks:
|
||||||
compose_network:
|
compose_network:
|
||||||
|
|||||||
@@ -144,7 +144,7 @@ volumes:
|
|||||||
name: ai_crawl4ai_data
|
name: ai_crawl4ai_data
|
||||||
external: true
|
external: true
|
||||||
backup_asciinema_data:
|
backup_asciinema_data:
|
||||||
name: asciinema_data
|
name: dev_asciinema_data
|
||||||
external: true
|
external: true
|
||||||
backup_dev_gitea_data:
|
backup_dev_gitea_data:
|
||||||
name: dev_gitea_data
|
name: dev_gitea_data
|
||||||
|
|||||||
Reference in New Issue
Block a user