Files
project-afterlife/docker/docker-compose.dev.yml
consultoria-as a76d513659
Some checks failed
Deploy / deploy (push) Has been cancelled
feat: add AFC Store with MercadoPago purchases and prize redemption
Players can now buy AfterCoin with real money (MercadoPago Checkout Pro,
$15 MXN/AFC) and redeem AFC for gift cards or cash withdrawals. Admin
fulfills redemptions manually.

- Bridge: payments + redemptions tables, CRUD routes, PATCH auth
- Next.js API: verify-disk, balance, create-preference, webhook (idempotent
  minting with HMAC signature verification), redeem, payment/redemption history
- Frontend: hub, buy flow (4 packages + custom), redeem flow (gift cards +
  cash out), success/failure/pending pages, history with tabs, 8 components
- i18n: full English + Spanish translations
- Infra: nginx /api/afc/ → Next.js, docker-compose env vars, .env.example

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-26 02:26:13 +00:00

185 lines
4.6 KiB
YAML

services:
postgres:
image: postgres:16-alpine
restart: unless-stopped
volumes:
- postgres_data:/var/lib/postgresql/data
environment:
POSTGRES_DB: ${DATABASE_NAME:-afterlife}
POSTGRES_USER: ${DATABASE_USERNAME:-afterlife}
POSTGRES_PASSWORD: ${DATABASE_PASSWORD:-afterlife}
ports:
- "5432:5432"
healthcheck:
test: ["CMD-SHELL", "pg_isready -U ${DATABASE_USERNAME:-afterlife}"]
interval: 5s
timeout: 5s
retries: 5
minio:
image: minio/minio:latest
restart: unless-stopped
command: server /data --console-address ":9001"
volumes:
- minio_data:/data
environment:
MINIO_ROOT_USER: ${MINIO_ROOT_USER:-afterlife}
MINIO_ROOT_PASSWORD: ${MINIO_ROOT_PASSWORD:-afterlife123}
ports:
- "9000:9000"
- "9001:9001"
cms:
build:
context: ../apps/cms
dockerfile: Dockerfile
restart: unless-stopped
depends_on:
postgres:
condition: service_healthy
environment:
HOST: 0.0.0.0
PORT: 1337
DATABASE_HOST: postgres
DATABASE_PORT: 5432
DATABASE_NAME: ${DATABASE_NAME:-afterlife}
DATABASE_USERNAME: ${DATABASE_USERNAME:-afterlife}
DATABASE_PASSWORD: ${DATABASE_PASSWORD:-afterlife}
APP_KEYS: ${APP_KEYS}
API_TOKEN_SALT: ${API_TOKEN_SALT}
ADMIN_JWT_SECRET: ${ADMIN_JWT_SECRET}
TRANSFER_TOKEN_SALT: ${TRANSFER_TOKEN_SALT}
JWT_SECRET: ${JWT_SECRET}
ports:
- "1337:1337"
web:
build:
context: ../
dockerfile: apps/web/Dockerfile
restart: unless-stopped
depends_on:
- cms
- afc-bridge
environment:
STRAPI_URL: http://cms:1337
STRAPI_API_TOKEN: ${STRAPI_API_TOKEN:-}
NEXT_PUBLIC_STRAPI_URL: ${PUBLIC_STRAPI_URL:-http://localhost:1337}
AFC_BRIDGE_URL: http://afc-bridge:3001
AFC_BRIDGE_SECRET: ${AFC_BRIDGE_SECRET}
MERCADOPAGO_ACCESS_TOKEN: ${MERCADOPAGO_ACCESS_TOKEN:-}
MERCADOPAGO_WEBHOOK_SECRET: ${MERCADOPAGO_WEBHOOK_SECRET:-}
MERCADOPAGO_WEBHOOK_URL: ${MERCADOPAGO_WEBHOOK_URL:-}
AFC_PRICE_MXN: ${AFC_PRICE_MXN:-15}
NEXT_PUBLIC_SITE_URL: ${NEXT_PUBLIC_SITE_URL:-http://localhost:3000}
ports:
- "3000:3000"
cloudflare-ddns:
image: favonia/cloudflare-ddns:latest
restart: unless-stopped
environment:
CF_API_TOKEN: ${CF_API_TOKEN}
DOMAINS: ${PUBLIC_HOST:-play.consultoria-as.com}
PROXIED: "false"
IP6_PROVIDER: none
openfusion:
build:
context: ../servers/openfusion
dockerfile: Dockerfile
restart: unless-stopped
environment:
SHARD_IP: ${PUBLIC_HOST:-192.168.10.234}
MOTD: ${OPENFUSION_MOTD:-Bienvenido a Project Afterlife - FusionFall Academy}
ports:
- "23000:23000"
- "23001:23001"
volumes:
- openfusion_data:/usr/src/app/data
minecraft-ftb:
image: itzg/minecraft-server:java21
restart: unless-stopped
container_name: minecraft-ftb
environment:
EULA: "TRUE"
TYPE: FTBA
FTB_MODPACK_ID: 125
FTB_MODPACK_VERSION_ID: 100181
MEMORY: 6G
MAX_MEMORY: 6G
MOTD: "Project Afterlife - FTB Evolution"
DIFFICULTY: normal
MAX_PLAYERS: 20
VIEW_DISTANCE: 10
ENABLE_COMMAND_BLOCK: "true"
MAX_TICK_TIME: -1
ports:
- "25565:25565"
volumes:
- minecraft_ftb_data:/data
deploy:
resources:
limits:
memory: 8G
geth:
build:
context: ../blockchain
dockerfile: Dockerfile
restart: unless-stopped
environment:
ADMIN_PRIVATE_KEY: ${AFC_ADMIN_PRIVATE_KEY}
ADMIN_ADDRESS: ${AFC_ADMIN_ADDRESS}
ports:
- "8545:8545"
- "8546:8546"
volumes:
- geth_data:/data
deploy:
resources:
limits:
memory: 1G
rpc-ssl:
image: nginx:alpine
restart: unless-stopped
depends_on:
- geth
volumes:
- ./nginx/rpc-ssl.conf:/etc/nginx/nginx.conf:ro
- certbot_etc:/etc/letsencrypt:ro
ports:
- "8443:8443"
afc-bridge:
build:
context: ../services/afc-bridge
dockerfile: Dockerfile
restart: unless-stopped
depends_on:
- geth
environment:
GETH_RPC_URL: http://geth:8545
ADMIN_PRIVATE_KEY: ${AFC_ADMIN_PRIVATE_KEY}
BRIDGE_SECRET: ${AFC_BRIDGE_SECRET}
PORT: 3001
DB_PATH: /data/bridge.db
GAS_FUND_AMOUNT: "0.01"
ports:
- "3001:3001"
volumes:
- afc_bridge_data:/data
volumes:
postgres_data:
minio_data:
openfusion_data:
minecraft_ftb_data:
geth_data:
afc_bridge_data:
certbot_etc:
external: true
name: docker_certbot_etc