- Crear el directorio de servicios de usuario (si no existe)
mkdir -p ~/.config/systemd/user/- Crear el archivo del servicio
cat > ~/.config/systemd/user/portainer.service << 'EOF'
[Unit]
Description=Portainer Container
After=network.target
Wants=network.target
[Service]
Type=simple
ExecStartPre=/usr/bin/podman rm -f portainer
ExecStart=/usr/bin/podman run --name portainer \
-p 9443:9443 \
-v /run/user/%U/podman/podman.sock:/var/run/docker.sock:Z \
-v portainer_data:/data:Z \
docker.io/portainer/portainer-ce
ExecStop=/usr/bin/podman stop portainer
ExecStopPost=/usr/bin/podman rm portainer
Restart=always
RestartSec=30
TimeoutStopSec=30
[Install]
WantedBy=default.target
EOF- Habilitar el servicio para que inicie automáticamente
# Recargar daemon de systemd
systemctl --user daemon-reload
# Habilitar el servicio para que inicie al arrancar
loginctl enable-linger $(whoami)
systemctl --user enable portainer.service
# Iniciar el servicio ahora
systemctl --user start portainer.service- Verificar que el servicio está funcionando
# Ver estado del servicio
systemctl --user status portainer.service
# Ver logs del servicio
journalctl --user -u portainer.service -f
# Ver contenedores en ejecución
podman ps- Comandos útiles para gestionar el servicio
# Detener el servicio
systemctl --user stop portainer.service
# Reiniciar el servicio
systemctl --user restart portainer.service
# Ver logs en tiempo real
journalctl --user -u portainer.service -f
# Deshabilitar el servicio
systemctl --user disable portainer.servicePuntos importantes:
- loginctl enable-linger es crucial - permite que los servicios de usuario sigan ejecutándose después de cerrar sesión.
- %U en el path del socket se expande automáticamente a tu UID.
- El servicio se reiniciará automáticamente si falla (Restart=always).
- Los logs se pueden ver con journalctl --user -u portainer.service
Para el caso de clickhouse es igual, pero el archivo de servicio será:
cat > ~/.config/systemd/user/clickhouse-container.service << 'EOF'
[Unit]
Description=ClickHouse Container
After=network.target
Wants=network.target
[Service]
Type=simple
ExecStartPre=-/usr/bin/podman rm -f clickhouse-container
ExecStart=/usr/bin/podman run --name clickhouse-container \
-p 28443:8443 \
-p 29440:9440 \
-e CLICKHOUSE_PASSWORD=XXXXXX \
--ulimit nofile=262144:262144 \
-v "/home/<user>/clickhouse-container-data/clickhouse-data:/var/lib/clickhouse/:Z" \
-v "/home/<user>/clickhouse-container-data/clickhouse-logs:/var/log/clickhouse-server/:Z" \
-v "/home/<user>/clickhouse-container-data/clickhouse-server-config:/etc/clickhouse-server/config.d/:Z" \
-v "/home/<user>/clickhouse-container-data/clickhouse-users-config:/etc/clickhouse-server/users.d/:Z" \
-v "/home/<user>/clickhouse-container-data/certs:/etc/clickhouse-server/certs/:Z" \
-v "/home/<user>/clickhouse-container-data/clickhouse-init:/docker-entrypoint-initdb.d/:Z" \
clickhouse
ExecStop=/usr/bin/podman stop clickhouse-container
ExecStopPost=-/usr/bin/podman rm clickhouse-container
Restart=always
RestartSec=30
TimeoutStopSec=30
# Configuración importante para contenedores con volúmenes
Environment=PODMAN_SYSTEMD_UNIT=%n
TimeoutStartSec=300
[Install]
WantedBy=default.targetPuntos importantes:
- ExecStartPre=- - El guión significa que si falla el comando (porque el contenedor no existe), no se considera error.
- TimeoutStartSec=300 - ClickHouse puede tardar en iniciar, así que aumentamos el timeout.
- Asegúrate de que todos los directorios de volúmenes existan.