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 Engine と Compose v2(
docker compose version)。 - 数 GB の空き容量があるホスト – VPS、ミニ PC、Raspberry Pi、NAS。
- 任意: HTTPS リモートアクセス用のドメインとリバースプロキシ。
- 任意(推奨): ルーターで BitTorrent ポート(TCP+UDP)を 1 つ転送し、ピア接続を良好にする。
なぜ 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
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
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
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 が返れば、エンジンとシークレットは正しいです。
設定と保護
| 設定 | 理由 |
|---|---|
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 の追加
ワークフローに合うものを選んでください:
- 何もインストールしない: 任意のブラウザでオンライン WebUIを開き、サーバーの RPC(ホスト、ポート
6800、シークレット)に接続します。 - セルフホストの AriaNg: AriaNg の静的ファイルを nginx で配信し、RPC に向けます。AriaNg のリリースを
./ariangに展開した後、次のサービスを compose に追加します:
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 転送が必要です。
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 = 最初のファイルのパス。フックは高速・非ブロッキングにし、重い処理はバックグラウンドで行ってください。
ヘルスと監視
- ログ:
docker compose logs -f aria2(aria2 は/config/aria2.logにも出力)。 - 生きているか: JSON-RPC で
aria2.getVersionを呼ぶ(デプロイ参照)かdocker compose psを確認。 - ヘルスチェックを追加して、Docker が停止したエンジンを再起動できるようにします:
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 のようなコミュニティイメージでもよい?
ドキュメント化された変数を検証するなら問題ありません。本ガイドは構成を明示的・可搬にするため独自の最小イメージをビルドしますが、保守されたコミュニティイメージは有効な近道です。
関連リソース
- オンライン WebUI – このサーバーを任意のブラウザから管理
- BitTorrent トラッカー – スウォームを健全に保つ
- オプションリファレンス – ここで使う全 aria2.conf キー
- トラブルシューティング – よくある aria2 のエラーと具体的な対処
- aria2 ドキュメント