29f6f6a827
PR Checks / test-and-build (pull_request) Successful in 8m17s
Dapper.AOT generated a 19-parameter ctor for ShowcaseSessionRow based on the SELECT list in GetShowcaseSessionsAsync / GetShowcaseSessionAsync. After adding PublicationMode and IsMembersOnly to ShowcaseSessionDto in v3.7.0 the record itself was extended, but the SELECT still returned 19 columns, so the materializer threw "A parameterless default constructor or one matching signature (...) is required" and every request to /showcase returned 500. Add s.publication_mode and (s.publication_mode = 'ClubOnly') to both SELECT lists and propagate them through the ShowcaseSessionDto construction. The field list now matches the generated constructor exactly. Version bump 3.7.0 -> 3.7.1 (patch).
131 lines
4.1 KiB
YAML
131 lines
4.1 KiB
YAML
services:
|
|
db:
|
|
image: postgres:17-alpine
|
|
restart: always
|
|
environment:
|
|
POSTGRES_USER: gmrelay
|
|
POSTGRES_PASSWORD: ${POSTGRES_PASSWORD:?Set POSTGRES_PASSWORD in .env}
|
|
POSTGRES_DB: gmrelay_db
|
|
volumes:
|
|
- pgdata:/var/lib/postgresql/data
|
|
networks:
|
|
- gmrelay
|
|
healthcheck:
|
|
test: [ "CMD-SHELL", "pg_isready -U gmrelay -d gmrelay_db" ]
|
|
interval: 3s
|
|
timeout: 3s
|
|
retries: 10
|
|
|
|
db-backup:
|
|
image: postgres:17-alpine
|
|
restart: unless-stopped
|
|
depends_on:
|
|
db:
|
|
condition: service_healthy
|
|
environment:
|
|
POSTGRES_USER: gmrelay
|
|
POSTGRES_PASSWORD: ${POSTGRES_PASSWORD:?Set POSTGRES_PASSWORD in .env}
|
|
POSTGRES_DB: gmrelay_db
|
|
PGPASSWORD: ${POSTGRES_PASSWORD:?Set POSTGRES_PASSWORD in .env}
|
|
BACKUP_RETENTION_DAYS: ${BACKUP_RETENTION_DAYS:-7}
|
|
volumes:
|
|
- pgbackups:/backups
|
|
networks:
|
|
- gmrelay
|
|
entrypoint: ["sh", "-c"]
|
|
command:
|
|
- |
|
|
cat > /usr/local/bin/backup.sh << 'EOF'
|
|
#!/bin/sh
|
|
set -e
|
|
TMPFILE="/tmp/backup_$$.sql"
|
|
pg_dump -h db -U gmrelay -d gmrelay_db > "$TMPFILE"
|
|
gzip "$TMPFILE"
|
|
mv "$TMPFILE.gz" "/backups/gmrelay_db_$(date +%Y%m%d_%H%M%S).sql.gz"
|
|
find /backups -name 'gmrelay_db_*.sql.gz' -type f -mtime +${BACKUP_RETENTION_DAYS} -delete
|
|
EOF
|
|
chmod +x /usr/local/bin/backup.sh
|
|
echo "0 3 * * * /usr/local/bin/backup.sh" | crontab -
|
|
crond -f
|
|
|
|
bot:
|
|
image: git.codeanddice.ru/toutsu/gmrelay-bot:3.7.1
|
|
restart: always
|
|
depends_on:
|
|
db:
|
|
condition: service_healthy
|
|
environment:
|
|
- "ConnectionStrings__gmrelaydb=Host=db;Port=5432;Database=gmrelay_db;Username=gmrelay;Password=${POSTGRES_PASSWORD:?Set POSTGRES_PASSWORD in .env}"
|
|
- "Telegram__BotToken=${TELEGRAM_BOT_TOKEN:?Set TELEGRAM_BOT_TOKEN in .env}"
|
|
- "Telegram__MiniAppUrl=${TELEGRAM_MINI_APP_URL:-}"
|
|
networks:
|
|
- gmrelay
|
|
healthcheck:
|
|
test: ["CMD-SHELL", "wget -qO- http://localhost:8081/health || exit 1"]
|
|
interval: 10s
|
|
timeout: 5s
|
|
retries: 3
|
|
|
|
discord:
|
|
image: git.codeanddice.ru/toutsu/gmrelay-discord-bot:3.7.1
|
|
restart: always
|
|
depends_on:
|
|
db:
|
|
condition: service_healthy
|
|
bot:
|
|
condition: service_healthy
|
|
environment:
|
|
- "ConnectionStrings__gmrelaydb=Host=db;Port=5432;Database=gmrelay_db;Username=gmrelay;Password=${POSTGRES_PASSWORD:?Set POSTGRES_PASSWORD in .env}"
|
|
- "Discord__Token=${DISCORD_BOT_TOKEN:?Set DISCORD_BOT_TOKEN in .env}"
|
|
networks:
|
|
- gmrelay
|
|
healthcheck:
|
|
test: ["CMD-SHELL", "wget -qO- http://localhost:8082/health || exit 1"]
|
|
interval: 10s
|
|
timeout: 5s
|
|
retries: 3
|
|
|
|
web:
|
|
image: git.codeanddice.ru/toutsu/gmrelay-web:3.7.1
|
|
restart: always
|
|
depends_on:
|
|
db:
|
|
condition: service_healthy
|
|
bot:
|
|
condition: service_healthy
|
|
environment:
|
|
- "ConnectionStrings__gmrelaydb=Host=db;Port=5432;Database=gmrelay_db;Username=gmrelay;Password=${POSTGRES_PASSWORD:?Set POSTGRES_PASSWORD in .env}"
|
|
- "Telegram__BotToken=${TELEGRAM_BOT_TOKEN:?Set TELEGRAM_BOT_TOKEN in .env}"
|
|
- "Telegram__BotUsername=${TELEGRAM_BOT_USERNAME:?Set TELEGRAM_BOT_USERNAME in .env}"
|
|
- "Telegram__MiniAppUrl=${TELEGRAM_MINI_APP_URL:-}"
|
|
- "Discord__ClientId=${DISCORD_CLIENT_ID:-}"
|
|
- "Discord__ClientSecret=${DISCORD_CLIENT_SECRET:-}"
|
|
- "Discord__RedirectUri=${DISCORD_REDIRECT_URI:-}"
|
|
- "PortfolioCovers__StoragePath=/app/portfolio-covers"
|
|
ports:
|
|
- "${GMRELAY_WEB_PORT:-8080}:8080"
|
|
volumes:
|
|
- web_keys:/app/dataprotection-keys
|
|
- portfolio_covers:/app/portfolio-covers
|
|
networks:
|
|
- gmrelay
|
|
healthcheck:
|
|
test: ["CMD-SHELL", "wget -qO- http://localhost:8080/health || exit 1"]
|
|
interval: 10s
|
|
timeout: 5s
|
|
retries: 3
|
|
|
|
volumes:
|
|
pgdata:
|
|
name: ${POSTGRES_VOLUME_NAME:-game_pgdata}
|
|
web_keys:
|
|
name: ${WEB_KEYS_VOLUME_NAME:-gmrelay_web_keys}
|
|
pgbackups:
|
|
name: ${BACKUP_VOLUME_NAME:-game_pgbackups}
|
|
portfolio_covers:
|
|
name: ${PORTFOLIO_COVERS_VOLUME_NAME:-gmrelay_portfolio_covers}
|
|
|
|
networks:
|
|
gmrelay:
|
|
driver: bridge
|