432 lines
		
	
	
		
			10 KiB
		
	
	
	
		
			Markdown
		
	
	
	
	
	
			
		
		
	
	
			432 lines
		
	
	
		
			10 KiB
		
	
	
	
		
			Markdown
		
	
	
	
	
	
# 🚀 Podman Deployment Guide - Turmli Bar Calendar
 | 
						|
 | 
						|
This guide provides instructions for deploying the Turmli Bar Calendar application using Podman, a daemonless container engine that's a drop-in replacement for Docker.
 | 
						|
 | 
						|
## 📋 Table of Contents
 | 
						|
- [Why Podman?](#-why-podman)
 | 
						|
- [Prerequisites](#-prerequisites)
 | 
						|
- [Quick Start](#-quick-start)
 | 
						|
- [Deployment Options](#-deployment-options)
 | 
						|
- [Commands Reference](#-commands-reference)
 | 
						|
- [Rootless Podman](#-rootless-podman)
 | 
						|
- [Systemd Integration](#-systemd-integration)
 | 
						|
- [Differences from Docker](#-differences-from-docker)
 | 
						|
- [Troubleshooting](#-troubleshooting)
 | 
						|
 | 
						|
## 🎯 Why Podman?
 | 
						|
 | 
						|
Podman offers several advantages over Docker:
 | 
						|
- **Daemonless**: No background service consuming resources
 | 
						|
- **Rootless**: Can run containers without root privileges
 | 
						|
- **Systemd Integration**: Native systemd service generation
 | 
						|
- **Docker Compatible**: Uses the same commands and image format
 | 
						|
- **Better Security**: Each container runs in its own user namespace
 | 
						|
- **Lower Resource Usage**: No daemon means less memory overhead
 | 
						|
 | 
						|
## 📦 Prerequisites
 | 
						|
 | 
						|
### Install Podman
 | 
						|
 | 
						|
#### On Fedora/RHEL/CentOS:
 | 
						|
```bash
 | 
						|
sudo dnf install podman
 | 
						|
```
 | 
						|
 | 
						|
#### On Ubuntu/Debian:
 | 
						|
```bash
 | 
						|
sudo apt-get update
 | 
						|
sudo apt-get install podman
 | 
						|
```
 | 
						|
 | 
						|
#### On Arch Linux:
 | 
						|
```bash
 | 
						|
sudo pacman -S podman
 | 
						|
```
 | 
						|
 | 
						|
### Optional: Install podman-compose
 | 
						|
```bash
 | 
						|
pip install podman-compose
 | 
						|
# or
 | 
						|
sudo dnf install podman-compose  # Fedora
 | 
						|
sudo apt-get install podman-compose  # Ubuntu/Debian
 | 
						|
```
 | 
						|
 | 
						|
## 🚀 Quick Start
 | 
						|
 | 
						|
1. **Clone the repository**:
 | 
						|
```bash
 | 
						|
git clone https://github.com/yourusername/turmli-bar-calendar-tool.git
 | 
						|
cd turmli-bar-calendar-tool
 | 
						|
```
 | 
						|
 | 
						|
2. **Deploy with the Podman script**:
 | 
						|
```bash
 | 
						|
./deploy-podman.sh start
 | 
						|
```
 | 
						|
 | 
						|
3. **Access the application**:
 | 
						|
Open http://localhost:8000 in your browser
 | 
						|
 | 
						|
## 🛠️ Deployment Options
 | 
						|
 | 
						|
### Option 1: Using the Deploy Script (Recommended)
 | 
						|
 | 
						|
The `deploy-podman.sh` script automatically detects whether you have Podman or Docker installed and uses the appropriate tool.
 | 
						|
 | 
						|
```bash
 | 
						|
# Start the application (builds and runs)
 | 
						|
./deploy-podman.sh start
 | 
						|
 | 
						|
# Check status
 | 
						|
./deploy-podman.sh status
 | 
						|
 | 
						|
# View logs
 | 
						|
./deploy-podman.sh logs
 | 
						|
 | 
						|
# Stop the application
 | 
						|
./deploy-podman.sh stop
 | 
						|
 | 
						|
# Restart the application
 | 
						|
./deploy-podman.sh restart
 | 
						|
 | 
						|
# Clean up everything
 | 
						|
./deploy-podman.sh clean
 | 
						|
```
 | 
						|
 | 
						|
### Option 2: Using podman-compose
 | 
						|
 | 
						|
If you have `podman-compose` installed:
 | 
						|
 | 
						|
```bash
 | 
						|
# Start with podman-compose
 | 
						|
podman-compose -f podman-compose.yml up -d
 | 
						|
 | 
						|
# Stop with podman-compose
 | 
						|
podman-compose -f podman-compose.yml down
 | 
						|
 | 
						|
# View logs
 | 
						|
podman-compose -f podman-compose.yml logs -f
 | 
						|
```
 | 
						|
 | 
						|
### Option 3: Direct Podman Commands
 | 
						|
 | 
						|
```bash
 | 
						|
# Build the image
 | 
						|
podman build -f Containerfile -t turmli-calendar .
 | 
						|
 | 
						|
# Run the container
 | 
						|
podman run -d \
 | 
						|
  --name turmli-calendar \
 | 
						|
  -p 8000:8000 \
 | 
						|
  -e TZ=Europe/Berlin \
 | 
						|
  -v ./calendar_cache.json:/app/calendar_cache.json:Z \
 | 
						|
  --restart unless-stopped \
 | 
						|
  turmli-calendar
 | 
						|
 | 
						|
# Check logs
 | 
						|
podman logs -f turmli-calendar
 | 
						|
 | 
						|
# Stop and remove
 | 
						|
podman stop turmli-calendar
 | 
						|
podman rm turmli-calendar
 | 
						|
```
 | 
						|
 | 
						|
## 📋 Commands Reference
 | 
						|
 | 
						|
### Environment Variables
 | 
						|
 | 
						|
- `PORT`: Port to expose (default: 8000)
 | 
						|
- `TZ`: Timezone (default: Europe/Berlin)
 | 
						|
 | 
						|
Example:
 | 
						|
```bash
 | 
						|
PORT=8080 TZ=America/New_York ./deploy-podman.sh start
 | 
						|
```
 | 
						|
 | 
						|
### deploy-podman.sh Commands
 | 
						|
 | 
						|
| Command | Description |
 | 
						|
|---------|------------|
 | 
						|
| `build` | Build the container image |
 | 
						|
| `start` | Build and start the application |
 | 
						|
| `stop` | Stop the application |
 | 
						|
| `restart` | Restart the application |
 | 
						|
| `logs` | Show application logs (follow mode) |
 | 
						|
| `status` | Check application status and health |
 | 
						|
| `clean` | Remove containers and images |
 | 
						|
| `systemd` | Generate systemd service (Podman only) |
 | 
						|
| `help` | Show help message |
 | 
						|
 | 
						|
## 👤 Rootless Podman
 | 
						|
 | 
						|
Podman can run containers without root privileges, which is more secure.
 | 
						|
 | 
						|
### Setup Rootless Podman
 | 
						|
 | 
						|
1. **Enable lingering for your user** (allows services to run without being logged in):
 | 
						|
```bash
 | 
						|
loginctl enable-linger $USER
 | 
						|
```
 | 
						|
 | 
						|
2. **Configure subuid and subgid** (usually already configured):
 | 
						|
```bash
 | 
						|
# Check if already configured
 | 
						|
grep $USER /etc/subuid /etc/subgid
 | 
						|
```
 | 
						|
 | 
						|
3. **Run containers as your regular user**:
 | 
						|
```bash
 | 
						|
# No sudo needed!
 | 
						|
podman run -d --name test alpine sleep 1000
 | 
						|
podman ps
 | 
						|
podman stop test
 | 
						|
```
 | 
						|
 | 
						|
## 🔧 Systemd Integration
 | 
						|
 | 
						|
Podman can generate systemd service files for automatic startup.
 | 
						|
 | 
						|
### Generate and Install Systemd Service
 | 
						|
 | 
						|
1. **Start the container first**:
 | 
						|
```bash
 | 
						|
./deploy-podman.sh start
 | 
						|
```
 | 
						|
 | 
						|
2. **Generate systemd service**:
 | 
						|
```bash
 | 
						|
./deploy-podman.sh systemd
 | 
						|
```
 | 
						|
 | 
						|
3. **Enable and start the service**:
 | 
						|
```bash
 | 
						|
# For user service (rootless)
 | 
						|
systemctl --user daemon-reload
 | 
						|
systemctl --user enable container-turmli-calendar.service
 | 
						|
systemctl --user start container-turmli-calendar.service
 | 
						|
 | 
						|
# Check status
 | 
						|
systemctl --user status container-turmli-calendar.service
 | 
						|
```
 | 
						|
 | 
						|
### For System-wide Service (requires root)
 | 
						|
 | 
						|
```bash
 | 
						|
# Generate for system
 | 
						|
sudo podman generate systemd --name --files --new turmli-calendar
 | 
						|
 | 
						|
# Move to system directory
 | 
						|
sudo mv container-turmli-calendar.service /etc/systemd/system/
 | 
						|
 | 
						|
# Enable and start
 | 
						|
sudo systemctl daemon-reload
 | 
						|
sudo systemctl enable container-turmli-calendar.service
 | 
						|
sudo systemctl start container-turmli-calendar.service
 | 
						|
```
 | 
						|
 | 
						|
## 🔄 Differences from Docker
 | 
						|
 | 
						|
### Key Differences
 | 
						|
 | 
						|
1. **No Daemon**: Podman doesn't require a background service
 | 
						|
2. **Rootless by Default**: Can run without root privileges
 | 
						|
3. **Systemd Integration**: Native systemd service generation
 | 
						|
4. **SELinux Labels**: Use `:Z` flag for volumes with SELinux
 | 
						|
5. **User Namespaces**: Better isolation between containers
 | 
						|
 | 
						|
### Command Compatibility
 | 
						|
 | 
						|
Most Docker commands work with Podman:
 | 
						|
```bash
 | 
						|
# Docker command
 | 
						|
docker build -t myapp .
 | 
						|
docker run -d -p 8000:8000 myapp
 | 
						|
 | 
						|
# Podman equivalent (same syntax!)
 | 
						|
podman build -t myapp .
 | 
						|
podman run -d -p 8000:8000 myapp
 | 
						|
```
 | 
						|
 | 
						|
### Compose Differences
 | 
						|
 | 
						|
The `podman-compose.yml` includes Podman-specific options:
 | 
						|
- `userns_mode: keep-id` - Maintains user ID in container
 | 
						|
- Volume `:Z` flag - SELinux relabeling
 | 
						|
- Modified healthcheck - Uses Python instead of curl
 | 
						|
 | 
						|
## 🐛 Troubleshooting
 | 
						|
 | 
						|
### Build Issues on ARM/Raspberry Pi
 | 
						|
 | 
						|
If you encounter build failures on ARM architectures (like Raspberry Pi), the issue is likely due to packages requiring compilation (pydantic-core, uvloop, httptools, watchfiles). These require gcc, make, and Rust/cargo to compile.
 | 
						|
 | 
						|
**Solutions:**
 | 
						|
 | 
						|
1. **Use the ARM-optimized Dockerfile** (Recommended):
 | 
						|
```bash
 | 
						|
# The deploy-podman.sh script automatically detects ARM and uses Dockerfile.arm
 | 
						|
./deploy-podman.sh build
 | 
						|
```
 | 
						|
 | 
						|
2. **Use pre-built multi-arch images** if available:
 | 
						|
```bash
 | 
						|
# Pull a pre-built image instead of building
 | 
						|
podman pull docker.io/yourusername/turmli-calendar:arm
 | 
						|
```
 | 
						|
 | 
						|
3. **Build with the multi-stage Dockerfile** (slower but works):
 | 
						|
```bash
 | 
						|
# This installs build tools in a separate stage
 | 
						|
podman build -f Dockerfile -t turmli-calendar .
 | 
						|
```
 | 
						|
 | 
						|
4. **Use the simplified requirements** for ARM:
 | 
						|
```bash
 | 
						|
# Copy ARM requirements
 | 
						|
cp requirements-arm.txt requirements.txt
 | 
						|
podman build -t turmli-calendar .
 | 
						|
```
 | 
						|
 | 
						|
### Common Issues and Solutions
 | 
						|
 | 
						|
#### 1. Build Fails with "no acceptable C compiler found"
 | 
						|
This happens when building on systems without development tools.
 | 
						|
 | 
						|
**Solution for containers:**
 | 
						|
```bash
 | 
						|
# Use the multi-stage Dockerfile which includes build tools
 | 
						|
podman build -f Dockerfile -t turmli-calendar .
 | 
						|
```
 | 
						|
 | 
						|
**Solution for host system:**
 | 
						|
```bash
 | 
						|
# Install build tools
 | 
						|
sudo apt-get install build-essential  # Debian/Ubuntu
 | 
						|
sudo dnf install gcc make  # Fedora
 | 
						|
```
 | 
						|
 | 
						|
#### 2. Permission Denied on Volume Mount
 | 
						|
```bash
 | 
						|
# Add :Z flag for SELinux systems
 | 
						|
-v ./calendar_cache.json:/app/calendar_cache.json:Z
 | 
						|
```
 | 
						|
 | 
						|
#### 3. Container Can't Bind to Port
 | 
						|
```bash
 | 
						|
# Check if port is already in use
 | 
						|
podman port turmli-calendar
 | 
						|
ss -tlnp | grep 8000
 | 
						|
 | 
						|
# Use a different port
 | 
						|
PORT=8080 ./deploy-podman.sh start
 | 
						|
```
 | 
						|
 | 
						|
#### 4. Rootless Podman Can't Bind to Privileged Ports (< 1024)
 | 
						|
```bash
 | 
						|
# Allow binding to port 80 (example)
 | 
						|
sudo sysctl net.ipv4.ip_unprivileged_port_start=80
 | 
						|
```
 | 
						|
 | 
						|
#### 5. Container Not Starting After Reboot
 | 
						|
```bash
 | 
						|
# Enable lingering for rootless containers
 | 
						|
loginctl enable-linger $USER
 | 
						|
 | 
						|
# Use systemd service
 | 
						|
./deploy-podman.sh systemd
 | 
						|
systemctl --user enable container-turmli-calendar.service
 | 
						|
```
 | 
						|
 | 
						|
#### 6. DNS Issues in Container
 | 
						|
```bash
 | 
						|
# Check Podman's DNS configuration
 | 
						|
podman run --rm alpine cat /etc/resolv.conf
 | 
						|
 | 
						|
# Use custom DNS if needed
 | 
						|
podman run --dns 8.8.8.8 --dns 8.8.4.4 ...
 | 
						|
```
 | 
						|
 | 
						|
#### 7. ARM/Raspberry Pi Specific Issues
 | 
						|
 | 
						|
**Memory constraints during build:**
 | 
						|
```bash
 | 
						|
# Increase swap space temporarily
 | 
						|
sudo dd if=/dev/zero of=/swapfile bs=1G count=2
 | 
						|
sudo mkswap /swapfile
 | 
						|
sudo swapon /swapfile
 | 
						|
 | 
						|
# Build with limited parallelism
 | 
						|
CARGO_BUILD_JOBS=1 podman build -t turmli-calendar .
 | 
						|
 | 
						|
# Clean up swap after build
 | 
						|
sudo swapoff /swapfile
 | 
						|
sudo rm /swapfile
 | 
						|
```
 | 
						|
 | 
						|
**Use lighter alternatives:**
 | 
						|
```bash
 | 
						|
# Check architecture
 | 
						|
./deploy-podman.sh info
 | 
						|
 | 
						|
# Build with ARM-optimized Dockerfile
 | 
						|
podman build -f Dockerfile.arm -t turmli-calendar .
 | 
						|
```
 | 
						|
 | 
						|
### Debugging Commands
 | 
						|
 | 
						|
```bash
 | 
						|
# Inspect container
 | 
						|
podman inspect turmli-calendar
 | 
						|
 | 
						|
# Check container processes
 | 
						|
podman top turmli-calendar
 | 
						|
 | 
						|
# Execute command in running container
 | 
						|
podman exec -it turmli-calendar /bin/bash
 | 
						|
 | 
						|
# Check Podman system info
 | 
						|
podman system info
 | 
						|
 | 
						|
# Clean up unused resources
 | 
						|
podman system prune -a
 | 
						|
```
 | 
						|
 | 
						|
## 📝 Additional Notes
 | 
						|
 | 
						|
### Security Benefits
 | 
						|
 | 
						|
- **No Root Daemon**: Unlike Docker, Podman doesn't require a root daemon
 | 
						|
- **User Namespaces**: Each container runs in isolated user namespace
 | 
						|
- **Seccomp Profiles**: Default security profiles for system calls
 | 
						|
- **SELinux Support**: Better integration with SELinux policies
 | 
						|
 | 
						|
### Resource Usage
 | 
						|
 | 
						|
Podman typically uses less resources than Docker:
 | 
						|
- No daemon = ~50-100MB less RAM
 | 
						|
- Faster container startup
 | 
						|
- Lower CPU overhead
 | 
						|
 | 
						|
### Migration from Docker
 | 
						|
 | 
						|
To migrate from Docker to Podman:
 | 
						|
1. Install Podman
 | 
						|
2. Use the same Dockerfile/Containerfile
 | 
						|
3. Replace `docker` with `podman` in commands
 | 
						|
4. Adjust volume mounts (add `:Z` for SELinux)
 | 
						|
5. Use `podman-compose` instead of `docker-compose`
 | 
						|
 | 
						|
## 📚 Resources
 | 
						|
 | 
						|
- [Podman Documentation](https://docs.podman.io/)
 | 
						|
- [Podman vs Docker](https://podman.io/whatis.html)
 | 
						|
- [Rootless Podman Tutorial](https://github.com/containers/podman/blob/main/docs/tutorials/rootless_tutorial.md)
 | 
						|
- [Podman Compose](https://github.com/containers/podman-compose)
 | 
						|
 | 
						|
## 🤝 Support
 | 
						|
 | 
						|
If you encounter any issues specific to Podman deployment, please:
 | 
						|
1. Check the troubleshooting section above
 | 
						|
2. Review Podman logs: `podman logs turmli-calendar`
 | 
						|
3. Check Podman events: `podman events --since 1h`
 | 
						|
4. Open an issue with the error details |