Các bước để setup Airflow trên VM
1. Cài đặt 1 số tools cơ bản
Đây là các bước cài đặt tools trên Ubuntu version 20, nếu bạn sử dụng distro khác, xin hãy tìm kiếm hướng dẫn phù hợp để cài đặt các tools này.
Docker
sudo apt update
sudo apt install -y apt-transport-https ca-certificates curl software-properties-common
curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo apt-key add -
sudo add-apt-repository "deb [arch=amd64] https://download.docker.com/linux/ubuntu focal stable"
apt-cache policy docker-ce
sudo apt install -y docker-ce
sudo systemctl status docker
# start after reboot
sudo systemctl enable docker
# using docker without sudo
sudo usermod -aG docker $(whoami)
sudo chmod 666 /var/run/docker.sock
Gitlab runner
Liên hệ team Elton để lấy TOKEN
# Download the binary for your system
sudo curl -L --output /usr/local/bin/gitlab-runner https://gitlab-runner-downloads.s3.amazonaws.com/latest/binaries/gitlab-runner-linux-amd64
# Give it permissions to execute
sudo chmod +x /usr/local/bin/gitlab-runner
# Create a GitLab CI user
sudo useradd --comment 'GitLab Runner' --create-home gitlab-runner --shell /bin/bash
# add user to docker group
sudo usermod -a -G docker gitlab-runner
# Install and run as service
sudo gitlab-runner install --user=gitlab-runner --working-directory=/home/gitlab-runner
# start service
sudo gitlab-runner start
# Register runner (Shell executor) - TOKEN will be provided by Elton.
sudo gitlab-runner register --url https://gitlab.com/ --registration-token TOKEN
Sau khi register thì sẽ cần config những thông như sau:
- Enter the Gitlab instance URL: Enter để bỏ qua
- Enter a name for the runner. This is stored only in the local config.toml file:
company-airflow(abc-airflow with all lowercase and no space) - Enter an executor: shell
Sau đó config thêm như sau
# Remove /home/gitlab-runner/.bash_logout
sudo rm /home/gitlab-runner/.bash_logout
# Add permission to allow Gitlab runner to delete previous builds
# Add gitlab-runner user to sudoer file
sudo visudo
# add to the end of the file
gitlab-runner ALL=(ALL) NOPASSWD: ALL
# Add permission for Gitlab runner to run sh file
sudo vi /etc/gitlab-runner/config.toml
# Add this below [[runners]]
pre_get_sources_script = "sudo chown -R gitlab-runner:gitlab-runner ."
2. Cài đặt Database (Optional)
Nếu bạn có sẵn database thì có thể bỏ qua bước này và tạo 1 database tên là airflow, còn không thì làm theo hướng dẫn ở dưới để cài đặt database cho Airflow.
- Tạo file environment cho database với tên là
production-postgres.env
POSTGRES_PASSWORD=123456
- Tạo file docker-compose.yaml
version: '3.0'
services:
postgres:
image: postgres:15.13
command: postgres -c max_connections=400
restart: always
ports:
- 5432:5432
env_file:
- production-postgres.env
volumes:
- ./.data/postgres_data:/var/lib/postgresql/data
networks:
- airflow
networks:
airflow:
name: airflow
2 files docker compose và production-postgres.env phải nằm chung trong cùng 1 directory
Start database
docker-compose up -d
Sau khi database đã online, access vào database và tạo 1 database tên là airflow
3. Chuẩn bị môi trường cho Airflow
- Tạo 1 directory tên airflow với path là
/home/airflow - Tạo 3 directories khác ở trong thử mục
/home/airflow:dags, logs, staging_data
mkdir /home/airflow
cd /home/airflow
mkdir -m 777 dags logs staging_data
- Tạo Fernet key: sử dụng để encrypt password, secret.
from cryptography.fernet import Fernet
print(Fernet.generate_key().decode())
- Tạo file có tên là
production.envvới thông tin dưới đây ở trong thư mục/home/airflow
ENVIRONMENT=production
# User for dockers
AIRFLOW_UID=0
AIRFLOW_GID=0
# task, dags config
AIRFLOW__CORE__PARALLELISM=128
AIRFLOW__CELERY__OPERATION_TIMEOUT=300
AIRFLOW__CORE__MAX_ACTIVE_TASKS_PER_DAG=10
# Elton credential (will be provided by Elton)
DATA_TOOL_API_CLIENT_ID = '123456'
DATA_TOOL_API_CLIENT_SECRET = '123456'
### Need update
# fernet key for encrypt password, secret
AIRFLOW__CORE__FERNET_KEY=cH9XDsT7yIgeB38ddwZUzPMGurpAFSKHmpi_dFXBeUg=
# update database info
AIRFLOW__CORE__SQL_ALCHEMY_CONN=postgresql+psycopg2://postgres:123456@postgres/airflow
AIRFLOW__CELERY__RESULT_BACKEND=db+postgresql://postgres:123456@postgres/airflow
AIRFLOW__CELERY__BROKER_URL=redis://:@redis:6379/0
_AIRFLOW_WWW_USER_USERNAME=admin
_AIRFLOW_WWW_USER_PASSWORD=123456
[email protected]
4. Sau khi setup xong môi trường
Liên hệ team Elton để tiến hành các bước tiếp theo.
Nếu VM có Firewall, cần mở port 8082 hoặc whitelist IP 34.126.175.60, 178.128.89.179 để các services của Elton có thể kết nối được tới Airflow.
5. Reverse SSH Tunnel (Optional)
Bước này chỉ cần thiết nếu VM của bạn không có public IP hoặc bị chặn bởi Firewall và bạn không thể mở port ra ngoài internet.
Nếu VM không thể được truy cập trực tiếp từ bên ngoài, bạn có thể sử dụng Reverse SSH Tunnel để tạo một kết nối ngược từ VM của bạn đến server của Elton, cho phép Elton kết nối đến Airflow thông qua tunnel này.
Cách hoạt động
- VM Airflow chủ động mở một kết nối SSH đến Server Elton.
- Server Elton lắng nghe trên một port được chỉ định (mặc định:
8888). - Mọi request đến Server Elton trên port đó sẽ được chuyển tiếp ngược lại đến Airflow API đang chạy trên VM (mặc định:
127.0.0.1:8082).
Các bước thực hiện
1. Cài đặt dependency:
pip install paramiko
2. Tải script reverse_tunnel.py — liên hệ team Elton để lấy script.
3. Cấu hình script — chỉnh sửa các biến sau trong file reverse_tunnel.py:
SSH_HOST = "137.184.249.46" # IP của Server Elton (do Elton cung cấp)
SSH_PORT = 22 # SSH port trên Server Elton
SSH_USER = "airflow" # SSH username trên Server Elton
SSH_KEY = "~/.ssh/id_rsa" # Đường dẫn đến private key trên VM của bạn
REMOTE_PORT = 8888 # Port mà Server Elton sẽ lắng nghe
LOCAL_HOST = "127.0.0.1" # Host của Airflow API trên VM
LOCAL_PORT = 8082 # Port của Airflow API trên VM
Hoặc có thể truyền qua biến môi trường thay vì sửa trực tiếp code:
export SSH_HOST=137.184.249.46
export SSH_USER=airflow
export LOCAL_PORT=8082
4. Chạy script:
python3 reverse_tunnel.py
5. Chạy như một background service (systemd) để tunnel tự khởi động lại khi reboot hoặc bị lỗi:
sudo nano /etc/systemd/system/reverse-tunnel.service
Nội dung file service (điều chỉnh path và các giá trị cho phù hợp):
[Unit]
Description=Reverse SSH Tunnel to Server Elton
After=network-online.target
Wants=network-online.target
[Service]
Type=simple
User=ubuntu
ExecStart=/usr/bin/python3 /home/ubuntu/reverse_tunnel.py
Restart=always
RestartSec=10
Environment=SSH_HOST=137.184.249.46
Environment=SSH_USER=airflow
Environment=LOCAL_PORT=8082
[Install]
WantedBy=multi-user.target
Sau đó enable và start service:
sudo systemctl daemon-reload
sudo systemctl enable reverse-tunnel
sudo systemctl start reverse-tunnel
Kiểm tra trạng thái và logs:
sudo systemctl status reverse-tunnel
sudo journalctl -u reverse-tunnel -f
Liên hệ team Elton để lấy thông tin xác thực SSH (SSH key, username, host) và để team Elton whitelist tunnel của bạn.