メインコンテンツへスキップ

Docker で 24 時間稼働の aria2 ダウンロードサーバーを構築

完全に自分でコントロールできる実用的なデプロイ: 小さな Alpine コンテナの aria2 エンジン、適切な aria2.conf、任意の AriaNg WebUI、安全なリモートアクセス、ダウンロード後の自動処理、ヘルスチェック。Linux ホスト、Synology、QNAP、Unraid、VPS のいずれでも動作します。

最終確認 2026-09 · aria2 v1.37.0 · Docker Engine 24+ / Compose v2

はじめる前に

なぜ Docker か、何を作るか

aria2 をコンテナで動かすと、ホストに手を触れずに更新・移設できる、隔離された再現可能な常時稼働ダウンローダーが得られます。スタックは独立した 3 つの部分から成ります:

1. エンジン(aria2c)

マウントした aria2.conf を読み、ポート 6800 で JSON-RPC を公開するマルチプロトコルダウンローダー。

2. WebUI(任意)

AriaNg またはオンライン WebUIが RPC 経由でエンジンと通信します。完全に交換可能です。

3. ストレージ

2 つのマウント: /downloads(本体)と /config(セッション、ログ、フック)。どちらもコンテナ外に保持されます。

alpine から独自の小さなイメージをビルドします。これによりガイドが正確かつ可搬になります – 中身を確認できないサードパーティイメージの隠れた環境変数に依存しません。(近道としてコミュニティイメージもありますが、変数は各自のドキュメントで確認してください。)

3 つのファイル

フォルダー(例: /opt/aria2)を作成し、次の 3 ファイルを並べます。

1. aria2.conf

aria2.conf
dir=/downloads
continue=true
file-allocation=falloc
max-concurrent-downloads=5
max-connection-per-server=16
min-split-size=10M
split=16

# --- RPC(どの WebUI にも必要) ---
enable-rpc=true
rpc-listen-all=true
rpc-listen-port=6800
rpc-secret=CHANGE_ME_STRONG_SECRET
# ブラウザ WebUI に必要。セキュリティ注記参照
rpc-allow-origin-all=true

# --- BitTorrent ---
bt-max-peers=128
# listen ports must match the ports published in docker-compose.yml
listen-port=6888
dht-listen-port=6888
enable-dht=true
enable-peer-exchange=true
bt-enable-lpd=true
seed-ratio=1.0
disk-cache=64M

# --- セッション永続化(再起動をまたいで維持) ---
save-session=/config/aria2.session
input-file=/config/aria2.session
save-session-interval=60
log=/config/aria2.log

2. Dockerfile

Dockerfile
FROM alpine:3.20
RUN apk add --no-cache aria2 ca-certificates tzdata bash
COPY aria2.conf /etc/aria2/aria2.conf
VOLUME ["/downloads", "/config"]
EXPOSE 6800 6888 6888/udp
# aria2 refuses to start if input-file is missing, so create the session file first
ENTRYPOINT ["sh", "-c", "touch /config/aria2.session && exec aria2c --conf-path=/etc/aria2/aria2.conf"]

3. docker-compose.yml

docker-compose.yml
services:
  aria2:
    build: .
    container_name: aria2
    restart: unless-stopped
    environment:
      - TZ=UTC
    volumes:
      - ./aria2-config:/config
      - ./downloads:/downloads
    ports:
      - "6800:6800"      # JSON-RPC(非公開に保つ!)
      - "6888:6888"      # BitTorrent TCP
      - "6888:6888/udp"  # BitTorrent DHT UDP

エンジンは aria2.session と aria2.log を ./aria2-config に書き出すため、両方ともホスト上に残り、再起動やイメージ再ビルドをまたいで保持されます。

5 分でデプロイ

mkdir -p /opt/aria2/aria2-config /opt/aria2/downloads
cd /opt/aria2
# aria2.conf、Dockerfile、docker-compose.yml をここに保存

docker compose up -d --build      # 最初にビルドして起動
docker compose ps                 # 起動確認
docker compose logs -f aria2      # 起動ログを確認

RPC エンドポイントが応答することを確認します(シークレットを置換):

curl -s http://127.0.0.1:6800/jsonrpc \
  -H 'Content-Type: application/json' \
  -d '{"jsonrpc":"2.0","id":"1","method":"aria2.getVersion","params":["token:CHANGE_ME_STRONG_SECRET"]}'

version フィールドを含む JSON が返れば、エンジンとシークレットは正しいです。

設定と保護

このスタックの主要な aria2.conf 設定
設定理由
rpc-secret必須。これがないと、ポート 6800 に到達できる誰もがダウンロードを操作できます。
rpc-allow-origin-all=trueブラウザ WebUI(AriaNg、当サイトの WebUI)が RPC を呼べるようにします。ポートが非公開であることが前提で安全です。
file-allocation=falloc領域を高速に確保し断片化を抑えます(未対応 FS では none)。
disk-cache=64M書き込みを RAM にまとめ、マイクロ書き込みを減らしディスク寿命を延ばします。
continue=true再起動をまたいで途中ダウンロードを再開。
save-session / input-fileキューを永続化。再起動後に自動で再開します。

ポート 6800 をインターネットに公開しないでください。 ホスト/LAN に束縛し、VPN か認証付きリバースプロキシ経由でアクセスします(下記参照)。

WebUI の追加

ワークフローに合うものを選んでください:

  ariang:
    image: nginx:alpine
    container_name: ariang
    restart: unless-stopped
    volumes:
      - ./ariang:/usr/share/nginx/html:ro
    ports:
      - "6880:80"

AriaNg の設定で、RPC ホストをサーバー、ポートを 6800 にし、rpc-secret を貼り付けます。

NAS とプラットフォームの注意

Linux / VPS / Raspberry Pi

5 分デプロイに従ってください。Pi では disk-cache を控えめにし、スループットが低めになることを想定します。

Synology DSM 7+

Container Manager → プロジェクト → 作成。compose を貼り付け、マウントには実際の DSM パスを使います(例: /volume1/docker/aria2/config と /volume1/downloads)。

QNAP / Unraid

Container Station → アプリケーション作成、または Unraid の Compose プラグイン。/config は appdata、/downloads は共有へマップします。

ファイルの所有権

他のアプリ(Plex/Jellyfin/Arr)がファイルを読む必要がある場合は、コンテナのユーザーを設定するか chown します。既定では root で動作します。user: "1000:1000" をサービスに追加してホストの UID/GID に合わせてください。

安全なリモートアクセス(HTTPS リバースプロキシ)

インターネット越しに WebUI を使うには、認証付き HTTPS プロキシを前に置き、6800 を直接公開しないでください。また、HTTPS ページから平文 RPC を呼ぶとブラウザがブロックする(Mixed Content)ため、TLS と WebSocket 転送が必要です。

Nginx: TLS + WebSocket RPC + Basic 認証
server {
    listen 443 ssl;
    server_name aria2.example.com;

    ssl_certificate     /etc/letsencrypt/live/example.com/fullchain.pem;
    ssl_certificate_key /etc/letsencrypt/live/example.com/privkey.pem;

    auth_basic "aria2";
    auth_basic_user_file /etc/nginx/.htpasswd;

    location / {
        proxy_pass http://127.0.0.1:6880;      # AriaNg
        proxy_set_header Host $host;
    }

    location /jsonrpc {
        proxy_pass http://127.0.0.1:6800/jsonrpc;
        proxy_http_version 1.1;
        proxy_set_header Upgrade $http_upgrade;
        proxy_set_header Connection "upgrade";
        proxy_set_header Host $host;
        proxy_read_timeout 86400;              # WebSocket を維持
    }
}

多層で保護します: HTTPS、認証層(Basic 認証または ID プロキシ)、強力な rpc-secret、ファイアウォール。VPN(WireGuard/Tailscale)はサービスを公開しない最も簡単な方法です。

ダウンロード後の自動処理

aria2 は on-download-complete でダウンロード完了時にコマンドを実行します。aria2.conf に追加し、スクリプトをマウントします:

# aria2.conf 内
on-download-complete=/config/on-complete.sh
on-download-error=/config/on-error.sh

# /config/on-complete.sh  (chmod +x)
#!/bin/bash
GID="$1"; NUM_FILES="$2"; TARGET_PATH="$3"   # $3 は最初のファイルのパス
logger "aria2 完了: $TARGET_PATH"
# 例:
#   rclone move "$(dirname "$TARGET_PATH")" remote:downloads/
#   unzip -o "$TARGET_PATH" -d "$(dirname "$TARGET_PATH")"
#   curl -s "https://ntfy.sh/mytopic" -d "ダウンロード完了: $(basename "$TARGET_PATH")"

$1 = GID、$2 = ファイル数、$3 = 最初のファイルのパス。フックは高速・非ブロッキングにし、重い処理はバックグラウンドで行ってください。

ヘルスと監視

    healthcheck:
      test: ["CMD-SHELL", "aria2c --version >/dev/null && wget -qO- http://127.0.0.1:6800/jsonrpc --post-data='{\"jsonrpc\":\"2.0\",\"id\":\"h\",\"method\":\"aria2.getVersion\",\"params\":[\"token:CHANGE_ME_STRONG_SECRET\"]}' >/dev/null"]
      interval: 60s
      timeout: 10s
      retries: 3

トラブルシューティング

WebUI が「Disconnected」/ RPC が失敗する

3 点を確認: コンテナが動作中(docker compose ps)、ポート 6800 がマップ済み、シークレットが rpc-secret と一致。WebUI が HTTPS で読み込まれる場合、その RPC 呼び出しも HTTPS/WSS である必要があります(Mixed Content ルール)– 上のリバースプロキシを使ってください。

トレントが 0 ピア / DHT 0 ノード

TCP と UDP のポートを 1 つマップ・転送し(ここでは 6888)、トラッカーリストや設定内の bt-tracker=… で新しいトラッカーを追加します。ネットワークに到達できれば DHT が起動します。

ダウンロード書き込み時に権限エラー

コンテナはそのユーザー(既定は root)で書き込みます。ホストに合わせて user: "1000:1000" を設定するか、./downloads を chown してコンテナユーザーが書けるようにします。

再起動後にダウンロードが 0 から始まる

セッション永続化が未設定です。save-session・input-file・save-session-interval がマウント済みパス(ここでは /config/aria2.session)を指し、continue=true であることを確認します。

ポート 6800 が使用中 / コンテナが起動しない

別の aria2 かアプリがホストの 6800 を使用しています。ホストのマッピングを変更(例: "6801:6800")するか、他プロセスを停止します。

FAQ

WebUI コンテナは必要ですか?

いいえ。AriaNg、当サイトのオンライン WebUI、任意の RPC クライアントがエンジンと直接通信できます。WebUI は RPC API 上の任意の装飾です。

aria2 を更新するには?

新しい Alpine パッケージが利用可能になったらイメージを再ビルドします: docker compose build --no-cache && docker compose up -d。設定・セッション・ダウンロードはマウント内に保持されます。

p3terx/aria2-pro のようなコミュニティイメージでもよい?

ドキュメント化された変数を検証するなら問題ありません。本ガイドは構成を明示的・可搬にするため独自の最小イメージをビルドしますが、保守されたコミュニティイメージは有効な近道です。