name: Build and Deploy on: push: branches: - main jobs: build-and-deploy: runs-on: ubuntu-latest steps: - name: Checkout code uses: actions/checkout@v4 - name: Create proxy network if needed run: docker network create proxy || true - name: Build Docker image run: docker build -t oma-memorial:latest . - name: Stop and remove old container run: | docker stop oma-memorial 2>/dev/null || true docker rm oma-memorial 2>/dev/null || true - name: Ensure data directory exists run: | mkdir -p /opt/oma-memorial/data/uploads/photos /opt/oma-memorial/data/uploads/videos /opt/oma-memorial/data/uploads/music chown -R 1001:1001 /opt/oma-memorial/data - name: Run container in proxy network run: | HOST_IP=$(docker network inspect proxy --format '{{range .IPAM.Config}}{{.Gateway}}{{end}}' 2>/dev/null || ip route | grep default | awk '{print $3}') docker run -d \ --name oma-memorial \ --network proxy \ --add-host=host.docker.internal:${HOST_IP} \ --restart unless-stopped \ -e NODE_ENV=production \ -e OLLAMA_URL="http://host.docker.internal:11434" \ -e SITE_PASSWORD="${{ secrets.SITE_PASSWORD }}" \ -e ADMIN_PASSWORD="${{ secrets.ADMIN_PASSWORD }}" \ -v /opt/oma-memorial/data:/app/data \ oma-memorial:latest - name: Health check run: | echo "Waiting for container to start..." for i in $(seq 1 15); do if docker exec oma-memorial node -e "fetch('http://localhost:3000/api/candles').then(r=>{process.exit(r.ok?0:1)}).catch(()=>process.exit(1))" 2>/dev/null; then echo "Container is healthy!" exit 0 fi echo "Attempt $i/15..." sleep 2 done echo "Health check failed" docker logs oma-memorial --tail 30 exit 1 - name: Show container status if: always() run: | docker ps --filter name=oma-memorial docker logs oma-memorial --tail 20