podman-deployment

Podman Compose deployment patterns for crypto-scout-collector containerization with TimescaleDB and automated backups

akarazhev/crypto-scout-collector1 installsMITSynced Aug 26

Works with

Claude CodeCursorCodex CLIGitHub CopilotGemini CLI
---
name: podman-deployment
description: Podman Compose deployment patterns for crypto-scout-collector containerization with TimescaleDB and automated backups
license: MIT
---

## What I Do

Guide containerized deployment of crypto-scout-collector with Podman, including TimescaleDB with automated backups and RabbitMQ Streams integration.

## Container Services

### crypto-scout-collector Container
- **Image**: `crypto-scout-collector:0.0.1`
- **Base**: `eclipse-temurin:25-jre-alpine`
- **User**: UID/GID `10001` (non-root)
- **Port**: `8081` (health endpoint)
- **Network**: `crypto-scout-bridge`
- **Dependencies**: TimescaleDB, RabbitMQ

### TimescaleDB Container
- **Image**: `timescale/timescaledb:latest-pg17`
- **Service**: `crypto-scout-collector-db`
- **Port**: `5432`
- **Data**: `./data/postgresql`
- **Init Scripts**: Mounted from `./script/` to `/docker-entrypoint-initdb.d/`
  - `00-init.sql` - extensions, schema, stream_offsets table
  - `01_bybit_spot_tables.sql` - spot market tables
  - `02_bybit_linear_tables.sql` - linear market tables
  - `03_crypto_scout_tables.sql` - CMC and risk tables
  - `04_btc_usd_daily_inserts.sql` - historical daily data
  - `05_btc_usd_weekly_inserts.sql` - historical weekly data
  - `06_cmc_fgi_inserts.sql` - CMC FGI historical data
  - `07_alternative_fgi_inserts.sql` - Alternative FGI data

### Backup Sidecar Container
- **Image**: `prodrigestivill/postgres-backup-local:latest`
- **Service**: `crypto-scout-collector-backup`
- **Output**: `./backups`
- **Schedule**: Configurable via env file

### RabbitMQ (external dependency)
- **Streams Port**: `5552`
- **AMQP Port**: `5672`
- **Management**: `15672`
- **Streams**: `bybit-stream`, `crypto-scout-stream`
- **Queues**: `collector-queue`, `chatbot-queue`

## Container Build & Run

```bash
# Build shaded JAR (required before building image)
mvn -q -DskipTests package

# Create network (once)
./script/network.sh

# Prepare secrets
cp secret/timescaledb.env.example secret/timescaledb.env
cp secret/postgres-backup.env.example secret/postgres-backup.env
cp secret/collector.env.example secret/collector.env
chmod 600 secret/*.env

# Edit secrets with your values
$EDITOR secret/timescaledb.env
$EDITOR secret/collector.env

# Build and start all services
podman-compose -f podman-compose.yml up -d

# Check health
curl -s http://localhost:8081/health

# View logs
podman logs -f crypto-scout-collector
```

## Environment Configuration

### Required Secrets

**secret/timescaledb.env**:
```env
POSTGRES_DB=crypto_scout
POSTGRES_USER=crypto_scout_db
POSTGRES_PASSWORD=your_secure_password
```

**secret/collector.env**:
```env
SERVER_PORT=8081
AMQP_RABBITMQ_HOST=host.containers.internal
AMQP_RABBITMQ_PORT=5672
AMQP_STREAM_PORT=5552
AMQP_RABBITMQ_USERNAME=crypto_scout_mq
AMQP_RABBITMQ_PASSWORD=your_mq_password
JDBC_DATASOURCE_URL=jdbc:postgresql://crypto-scout-collector-db:5432/crypto_scout
JDBC_DATASOURCE_USERNAME=crypto_scout_db
JDBC_DATASOURCE_PASSWORD=your_db_password
```

## Compose Hardening

The `podman-compose.yml` includes production hardening:
- `init: true` - proper signal handling
- `pids_limit: 256` - process limit
- `read_only` rootfs with `tmpfs: /tmp`
- `cap_drop: ALL` - drop all capabilities
- `security_opt: no-new-privileges=true`
- `cpus: 0.5`, `mem_limit: 256m`
- `restart: unless-stopped`
- healthcheck with `start_period: 30s`

## Database Initialization

### Fresh Installation
1. Ensure `./data/postgresql` is empty
2. Start containers - init scripts run automatically
3. Verify: `podman exec crypto-scout-collector-db psql -U crypto_scout_db -c "\dt crypto_scout.*"`

### Existing Database
For already-initialized databases, apply scripts manually:
```bash
podman exec -i crypto-scout-collector-db psql -U crypto_scout_db -d crypto_scout < script/bybit_spot_tables.sql
podman exec -i crypto-scout-collector-db psql -U crypto_scout_db -d crypto_scout < script/bybit_linear_tables.sql
podman exec -i crypto-scout-collector-db psql -U crypto_scout_db -d crypto_scout < script/crypto_scout_tables.sql
```

## Backup and Restore

### Automated Backups
Backups run on schedule defined in `secret/postgres-backup.env`:
```env
POSTGRES_BACKUP_SCHEDULE=@daily
POSTGRES_BACKUP_KEEP_DAYS=7
POSTGRES_BACKUP_KEEP_WEEKS=4
POSTGRES_BACKUP_KEEP_MONTHS=6
```

### Manual Restore
```bash
# From custom format dump
pg_restore -h localhost -p 5432 -U crypto_scout_db -d crypto_scout < backups/crypto_scout-YYYYMMDD.dump

# From SQL file
psql -h localhost -p 5432 -U crypto_scout_db -d crypto_scout < backups/crypto_scout-YYYYMMDD.sql
```

## Running the Service Locally

```bash
# Prerequisites: RabbitMQ and TimescaleDB running

# Set environment variables
export AMQP_RABBITMQ_PASSWORD=your_mq_password
export JDBC_DATASOURCE_PASSWORD=your_db_password

# Run the app
java -jar target/crypto-scout-collector-0.0.1.jar

# Health check
curl -s http://localhost:8081/health
```

## Troubleshooting

### Container not starting
- Verify Podman: `podman --version`
- Check logs: `podman logs crypto-scout-collector`
- Verify network: `podman network inspect crypto-scout-bridge`

### Database connection errors
- Check TimescaleDB health: `podman exec crypto-scout-collector-db pg_isready`
- Verify credentials in `secret/collector.env`
- Check network connectivity between containers

### RabbitMQ Streams not reachable
- Confirm port 5552 is accessible
- For host RabbitMQ: `AMQP_RABBITMQ_HOST=host.containers.internal`
- Verify Streams plugin is enabled

### Health check failing
- Check database connectivity
- Verify RabbitMQ credentials
- Review application logs: `podman logs crypto-scout-collector`

### Init scripts not applied
- Data directory must be empty on first run
- Re-initialize: `rm -rf ./data/postgresql` and restart

## When to Use Me

Use this skill when:
- Building and deploying the container image
- Configuring Podman Compose for production
- Setting up TimescaleDB with automated backups
- Troubleshooting container or connectivity issues
- Managing database initialization and migrations
- Setting up CI/CD pipelines
- Managing secrets and environment configuration
- Performing backup and restore operations

More Deployment & CI/CD skills

finetuning

microsoft/azure-skills

Fine-tune models on Microsoft Foundry using SFT (supervised), DPO (preference), or RFT (reinforcement with graders). Covers dataset preparation, training job submission, deployment, and evaluation. USE FOR: fine-tune, SFT, DPO, RFT, training data, grader, distillation, fine-tuned model, training job, large file upload, calibrate grader, deploy fine-tuned model, evaluate fine-tuned model. DO NOT USE FOR: general model deployment without fine-tuning (use deploy-model), agent creation (use agents), prompt optimization without training (use prompt-optimizer).

323.2k

prisma-compute

prisma/skills

Prisma Compute deployment and hosting guide. Use whenever the user mentions Prisma Compute, `prisma.compute.ts`, `defineComputeConfig`, deploying or hosting a Prisma app, `@prisma/cli app deploy`, `compute:deploy`, `create-prisma --deploy`, `PRISMA_SERVICE_TOKEN`, Compute auth/workspaces, apps/deployments/build logs/domains, localhost vs `0.0.0.0`, deploy port binding, or framework deploy readiness for Hono, Elysia, Next.js, TanStack Start, Astro, Nuxt, Svelte, Nest, Turborepo, or custom/prebuilt artifacts.

231.4k

azure-quotas

microsoft/azure-skills

Check/manage Azure quotas and usage across providers. For deployment planning, capacity validation, region selection. WHEN: \"check quotas\", \"service limits\", \"current usage\", \"request quota increase\", \"quota exceeded\", \"validate capacity\", \"regional availability\", \"provisioning limits\", \"vCPU limit\", \"how many vCPUs available in my subscription\".

187.6k

← All Deployment & CI/CD skills

Check your AI visibility

One URL in, a 0–100 score and the exact fixes out.

RUN THE CHECK

Browse all the tools

15 tools across six categories
13 of them never send your data anywhere

Free · No signup · No trial clock

SEE THE DIRECTORY