aboutsummaryrefslogtreecommitdiff
path: root/.github/workflows/deploy_telemetry.yml
blob: 17479170b4ff1df9c1c4b61271a026fb7cb637dd (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
# This workflow will build and deploy the SeaweedFS telemetry server
# For more information see: https://docs.github.com/en/actions/automating-builds-and-tests/building-and-testing-go

name: Deploy Telemetry Server

on:
  push:
    branches: [ "master" ]
    paths:
      - 'telemetry/**'
  workflow_dispatch:
    inputs:
      setup:
        description: 'Run first-time server setup'
        required: true
        type: boolean
        default: false
      deploy:
        description: 'Deploy telemetry server to remote server'
        required: true
        type: boolean
        default: false

jobs:
  deploy:
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v4

      - name: Set up Go
        uses: actions/setup-go@v4
        with:
          go-version: '1.24'

      - name: Build Telemetry Server
        run: |
          go mod tidy
          cd telemetry/server
          GOOS=linux GOARCH=amd64 go build -o telemetry-server main.go

      - name: First-time Server Setup
        if: github.event_name == 'workflow_dispatch' && inputs.setup
        env:
          SSH_PRIVATE_KEY: ${{ secrets.TELEMETRY_SSH_PRIVATE_KEY }}
          REMOTE_HOST: ${{ secrets.TELEMETRY_HOST }}
          REMOTE_USER: ${{ secrets.TELEMETRY_USER }}
        run: |
          mkdir -p ~/.ssh
          echo "$SSH_PRIVATE_KEY" > ~/.ssh/deploy_key
          chmod 600 ~/.ssh/deploy_key
          echo "Host *" > ~/.ssh/config
          echo "  StrictHostKeyChecking no" >> ~/.ssh/config

          # Create all required directories with proper permissions
          ssh -i ~/.ssh/deploy_key $REMOTE_USER@$REMOTE_HOST "
            mkdir -p ~/seaweedfs-telemetry/bin ~/seaweedfs-telemetry/logs ~/seaweedfs-telemetry/data ~/seaweedfs-telemetry/tmp && \
            chmod 755 ~/seaweedfs-telemetry/logs && \
            chmod 755 ~/seaweedfs-telemetry/data && \
            touch ~/seaweedfs-telemetry/logs/telemetry.log ~/seaweedfs-telemetry/logs/telemetry.error.log && \
            chmod 644 ~/seaweedfs-telemetry/logs/*.log"

          # Create systemd service file
          echo "
          [Unit]
          Description=SeaweedFS Telemetry Server
          After=network.target

          [Service]
          Type=simple
          User=$REMOTE_USER
          WorkingDirectory=/home/$REMOTE_USER/seaweedfs-telemetry
          ExecStart=/home/$REMOTE_USER/seaweedfs-telemetry/bin/telemetry-server -port=8353
          Restart=always
          RestartSec=5
          StandardOutput=append:/home/$REMOTE_USER/seaweedfs-telemetry/logs/telemetry.log
          StandardError=append:/home/$REMOTE_USER/seaweedfs-telemetry/logs/telemetry.error.log

          [Install]
          WantedBy=multi-user.target" > telemetry.service

          # Setup logrotate configuration
          echo "# SeaweedFS Telemetry service log rotation
          /home/$REMOTE_USER/seaweedfs-telemetry/logs/*.log {
              daily
              rotate 30
              compress
              delaycompress
              missingok
              notifempty
              create 644 $REMOTE_USER $REMOTE_USER
              postrotate
                  systemctl restart telemetry.service
              endscript
          }" > telemetry_logrotate

          # Copy binary and configuration files
          scp -i ~/.ssh/deploy_key telemetry/server/telemetry-server $REMOTE_USER@$REMOTE_HOST:~/seaweedfs-telemetry/bin/
          scp -i ~/.ssh/deploy_key telemetry/grafana-dashboard.json $REMOTE_USER@$REMOTE_HOST:~/seaweedfs-telemetry/
          scp -i ~/.ssh/deploy_key telemetry/prometheus.yml $REMOTE_USER@$REMOTE_HOST:~/seaweedfs-telemetry/

          # Set binary permissions
          ssh -i ~/.ssh/deploy_key $REMOTE_USER@$REMOTE_HOST "chmod +x ~/seaweedfs-telemetry/bin/telemetry-server"

          # Copy and install service and logrotate files
          scp -i ~/.ssh/deploy_key telemetry.service telemetry_logrotate $REMOTE_USER@$REMOTE_HOST:~/seaweedfs-telemetry/
          ssh -i ~/.ssh/deploy_key $REMOTE_USER@$REMOTE_HOST "
            sudo mv ~/seaweedfs-telemetry/telemetry.service /etc/systemd/system/ && \
            sudo mv ~/seaweedfs-telemetry/telemetry_logrotate /etc/logrotate.d/seaweedfs-telemetry && \
            sudo systemctl daemon-reload && \
            sudo systemctl enable telemetry.service && \
            sudo systemctl start telemetry.service && \
            sudo systemctl status telemetry.service"

          # Verify initial deployment
          ssh -i ~/.ssh/deploy_key $REMOTE_USER@$REMOTE_HOST "
            echo 'Waiting for service to start...'
            sleep 5
            curl -f http://localhost:8353/health || echo 'Health check failed - check service logs: sudo journalctl -u telemetry.service -f'"

          rm -f ~/.ssh/deploy_key

      - name: Deploy Telemetry Server to Remote Server
        if: (github.event_name == 'push' && contains(github.ref, 'refs/heads/master')) || (github.event_name == 'workflow_dispatch' && inputs.deploy)
        env:
          SSH_PRIVATE_KEY: ${{ secrets.TELEMETRY_SSH_PRIVATE_KEY }}
          REMOTE_HOST: ${{ secrets.TELEMETRY_HOST }}
          REMOTE_USER: ${{ secrets.TELEMETRY_USER }}
        run: |
          mkdir -p ~/.ssh
          echo "$SSH_PRIVATE_KEY" > ~/.ssh/deploy_key
          chmod 600 ~/.ssh/deploy_key
          echo "Host *" > ~/.ssh/config
          echo "  StrictHostKeyChecking no" >> ~/.ssh/config

          # Create temp directory and copy binary
          ssh -i ~/.ssh/deploy_key $REMOTE_USER@$REMOTE_HOST "mkdir -p ~/seaweedfs-telemetry/tmp"
          scp -i ~/.ssh/deploy_key telemetry/server/telemetry-server $REMOTE_USER@$REMOTE_HOST:~/seaweedfs-telemetry/tmp/

          # Copy updated configuration files
          scp -i ~/.ssh/deploy_key telemetry/grafana-dashboard.json $REMOTE_USER@$REMOTE_HOST:~/seaweedfs-telemetry/
          scp -i ~/.ssh/deploy_key telemetry/prometheus.yml $REMOTE_USER@$REMOTE_HOST:~/seaweedfs-telemetry/

          # Check if service exists and deploy accordingly
          ssh -i ~/.ssh/deploy_key $REMOTE_USER@$REMOTE_HOST "
            if systemctl list-unit-files telemetry.service >/dev/null 2>&1; then
              echo 'Service exists, performing update...'
              sudo systemctl stop telemetry.service
              mkdir -p ~/seaweedfs-telemetry/bin
              mv ~/seaweedfs-telemetry/tmp/telemetry-server ~/seaweedfs-telemetry/bin/
              chmod +x ~/seaweedfs-telemetry/bin/telemetry-server
              sudo systemctl start telemetry.service
              sudo systemctl status telemetry.service
            else
              echo 'ERROR: telemetry.service not found!'
              echo 'Please run the first-time setup before deploying.'
              echo 'Go to GitHub Actions → Deploy Telemetry Server → Run workflow → Check \"Run first-time server setup\"'
              exit 1
            fi"

          # Verify deployment
          ssh -i ~/.ssh/deploy_key $REMOTE_USER@$REMOTE_HOST "
            echo 'Waiting for service to start...'
            sleep 5
            curl -f http://localhost:8353/health || echo 'Health check failed'"

          rm -f ~/.ssh/deploy_key

      - name: Notify Deployment Status
        if: always()
        run: |
          if [ "${{ job.status }}" == "success" ]; then
            echo "✅ Telemetry server deployment successful"
            echo "Dashboard: http://${{ secrets.TELEMETRY_HOST }}:8353"
            echo "Metrics: http://${{ secrets.TELEMETRY_HOST }}:8353/metrics"
          else
            echo "❌ Telemetry server deployment failed"
          fi