123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175 |
- #!/bin/bash
- # Wekan Log Rotation Setup Script
- # This script sets up log rotation for Wekan snap installation
- set -e
- # Configuration
- SNAP_NAME="wekan"
- SNAP_COMMON="/var/snap/${SNAP_NAME}/common"
- LOGROTATE_DIR="/etc/logrotate.d"
- WEKAN_LOGROTATE_CONF="${LOGROTATE_DIR}/${SNAP_NAME}"
- # Log file paths
- MONGODB_LOG="${SNAP_COMMON}/mongodb.log"
- WEKAN_APP_LOG="${SNAP_COMMON}/wekan-app.log"
- WEKAN_ERROR_LOG="${SNAP_COMMON}/wekan-error.log"
- # Log rotation configuration
- ROTATE_SIZE="100M"
- KEEP_DAYS="30"
- KEEP_COPIES="10"
- log_message() {
- echo "[$(date '+%Y-%m-%d %H:%M:%S')] $1"
- }
- log_error() {
- echo "[$(date '+%Y-%m-%d %H:%M:%S')] ERROR: $1" >&2
- }
- # Check if running as root
- if [ "$EUID" -ne 0 ]; then
- log_error "This script must be run as root"
- exit 1
- fi
- # Check if snap is installed
- if ! snap list | grep -q "^${SNAP_NAME} "; then
- log_error "Snap ${SNAP_NAME} is not installed"
- exit 1
- fi
- log_message "Setting up log rotation for Wekan snap..."
- # Create logrotate configuration
- cat > "${WEKAN_LOGROTATE_CONF}" << EOF
- # Wekan Snap Log Rotation Configuration
- # Generated by wekan logrotate-setup script
- # MongoDB logs
- ${MONGODB_LOG} {
- daily
- missingok
- rotate ${KEEP_COPIES}
- compress
- delaycompress
- notifempty
- create 644 root root
- postrotate
- # Send SIGUSR1 to MongoDB to reopen log file
- if [ -f "${SNAP_COMMON}/mongodb.pid" ]; then
- kill -USR1 \$(cat "${SNAP_COMMON}/mongodb.pid") 2>/dev/null || true
- fi
- # Alternative: restart MongoDB service if PID file doesn't exist
- if [ ! -f "${SNAP_COMMON}/mongodb.pid" ]; then
- snap restart ${SNAP_NAME}.mongodb 2>/dev/null || true
- fi
- endscript
- }
- # Wekan application logs
- ${WEKAN_APP_LOG} {
- daily
- missingok
- rotate ${KEEP_COPIES}
- compress
- delaycompress
- notifempty
- create 644 root root
- postrotate
- # Send SIGUSR1 to Wekan application to reopen log file
- if [ -f "${SNAP_COMMON}/wekan.pid" ]; then
- kill -USR1 \$(cat "${SNAP_COMMON}/wekan.pid") 2>/dev/null || true
- fi
- # Alternative: restart Wekan service if PID file doesn't exist
- if [ ! -f "${SNAP_COMMON}/wekan.pid" ]; then
- snap restart ${SNAP_NAME}.wekan 2>/dev/null || true
- fi
- endscript
- }
- # Wekan error logs
- ${WEKAN_ERROR_LOG} {
- daily
- missingok
- rotate ${KEEP_COPIES}
- compress
- delaycompress
- notifempty
- create 644 root root
- postrotate
- # Send SIGUSR1 to Wekan application to reopen log file
- if [ -f "${SNAP_COMMON}/wekan.pid" ]; then
- kill -USR1 \$(cat "${SNAP_COMMON}/wekan.pid") 2>/dev/null || true
- fi
- # Alternative: restart Wekan service if PID file doesn't exist
- if [ ! -f "${SNAP_COMMON}/wekan.pid" ]; then
- snap restart ${SNAP_NAME}.wekan 2>/dev/null || true
- fi
- endscript
- }
- # Size-based rotation for large log files
- ${SNAP_COMMON}/*.log {
- size ${ROTATE_SIZE}
- missingok
- rotate ${KEEP_COPIES}
- compress
- delaycompress
- notifempty
- create 644 root root
- sharedscripts
- postrotate
- # Generic postrotate for all log files
- # Try to signal processes to reopen log files
- for pidfile in "${SNAP_COMMON}"/*.pid; do
- if [ -f "\$pidfile" ]; then
- kill -USR1 \$(cat "\$pidfile") 2>/dev/null || true
- fi
- done
- # Restart services if no PID files found
- if [ ! -f "${SNAP_COMMON}/mongodb.pid" ] && [ ! -f "${SNAP_COMMON}/wekan.pid" ]; then
- snap restart ${SNAP_NAME}.mongodb 2>/dev/null || true
- snap restart ${SNAP_NAME}.wekan 2>/dev/null || true
- fi
- endscript
- }
- EOF
- log_message "Created logrotate configuration: ${WEKAN_LOGROTATE_CONF}"
- # Test logrotate configuration
- if logrotate -d "${WEKAN_LOGROTATE_CONF}" >/dev/null 2>&1; then
- log_message "Logrotate configuration test passed"
- else
- log_error "Logrotate configuration test failed"
- exit 1
- fi
- # Create log directory if it doesn't exist
- mkdir -p "${SNAP_COMMON}"
- # Set proper permissions
- chown root:root "${WEKAN_LOGROTATE_CONF}"
- chmod 644 "${WEKAN_LOGROTATE_CONF}"
- # Create initial log files if they don't exist
- touch "${MONGODB_LOG}" "${WEKAN_APP_LOG}" "${WEKAN_ERROR_LOG}"
- chown root:root "${SNAP_COMMON}"/*.log
- chmod 644 "${SNAP_COMMON}"/*.log
- log_message "Log rotation setup completed successfully"
- log_message "Configuration file: ${WEKAN_LOGROTATE_CONF}"
- log_message "Log files will be rotated daily and when they exceed ${ROTATE_SIZE}"
- log_message "Log files will be kept for ${KEEP_DAYS} days (${KEEP_COPIES} copies)"
- log_message "To test log rotation manually: sudo logrotate -f ${WEKAN_LOGROTATE_CONF}"
- log_message "To view logrotate status: sudo logrotate -d ${WEKAN_LOGROTATE_CONF}"
- echo ""
- echo "Next steps:"
- echo "1. Configure MongoDB to log to file: sudo snap set ${SNAP_NAME} mongo-log-destination=snapcommon"
- echo "2. Configure Wekan to log to file (if not already done)"
- echo "3. Test log rotation: sudo logrotate -f ${WEKAN_LOGROTATE_CONF}"
- echo "4. Monitor log files: ls -la ${SNAP_COMMON}/*.log*"
|