services: web: build: . ports: - "5000:5000" volumes: - .:/app environment: - FLASK_APP=app - FLASK_ENV=development - USE_REMOTE_MYSQL=${USE_REMOTE_MYSQL} - ENABLE_DB_PRELOAD=${ENABLE_DB_PRELOAD} - ENABLE_DB_SEEDING=${ENABLE_DB_SEEDING} - MYSQL_DATABASE=${MYSQL_DATABASE} - MYSQL_USER=${MYSQL_USER} - MYSQL_PASSWORD=${MYSQL_PASSWORD} - MYSQL_HOST=${MYSQL_HOST} - MYSQL_PORT=${MYSQL_PORT} depends_on: - db healthcheck: test: ["CMD-SHELL", "curl -fs http://127.0.0.1:5000/health || exit 1"] interval: 10s timeout: 3s retries: 3 start_period: 30s command: > bash -c " set -e echo '[✔] Ensuring .env...' if [ ! -f '.env' ]; then cp .env.example .env; fi echo '[✔] Waiting for MySQL to be ready...' until nc -z ${MYSQL_HOST} ${MYSQL_PORT}; do sleep 1; done echo '[✔] Ensuring migration structure...' if [ ! -d 'migrations' ]; then echo '[ℹ] Running flask db init...' flask db init fi echo '[ℹ] Autogenerating migration...' flask db migrate -m 'auto' || echo '[ℹ] No changes detected.' echo '[✔] Running DB migrations...' flask db upgrade if [ "$$ENABLE_DB_PRELOAD" = "1" ]; then echo '[📥] Preloading data...'; flask preload-data; else echo '[⚠️] Skipping preload...'; fi if [ \"$$ENABLE_DB_SEEDING\" = \"1\" ]; then echo '[🌱] Seeding admin user...' flask seed-admin else echo '[⚠️] DB seeding skipped by config.' fi echo '[🚀] Starting Flask server...' flask run --host=0.0.0.0 " db: image: mysql:8 restart: unless-stopped environment: MYSQL_ROOT_PASSWORD: ${MYSQL_ROOT_PASSWORD} MYSQL_DATABASE: ${MYSQL_DATABASE} MYSQL_USER: ${MYSQL_USER} MYSQL_PASSWORD: ${MYSQL_PASSWORD} ports: - "3306:3306" volumes: - plant_price_tracker_mysql_data:/var/lib/mysql healthcheck: test: ["CMD", "mysqladmin", "ping", "-h", "localhost"] interval: 10s timeout: 5s retries: 5 adminer: image: adminer restart: always ports: - 8080:8080 environment: ADMINER_DEFAULT_SERVER: db depends_on: - db volumes: plant_price_tracker_mysql_data: