Add files
This commit is contained in:
53
Dockerfile
Normal file
53
Dockerfile
Normal file
@@ -0,0 +1,53 @@
|
||||
FROM archlinux:latest
|
||||
|
||||
ARG SHAKA_PACKAGER_URL="https://github.com/shaka-project/shaka-packager/releases/download/v2.6.1/packager-linux-x64"
|
||||
ARG UNSHACKLE_REPO_URL
|
||||
ARG UNSHACKLE_APP_DIR="/opt/unshackle"
|
||||
|
||||
ENV LANG=C.UTF-8 \
|
||||
LC_ALL=C.UTF-8 \
|
||||
TS_STATE_DIR=/var/lib/tailscale \
|
||||
TS_SOCKET=/var/run/tailscale/tailscaled.sock \
|
||||
START_TAILSCALED=1 \
|
||||
UNSHACKLE_APP_DIR="${UNSHACKLE_APP_DIR}"
|
||||
|
||||
RUN pacman -Syu --noconfirm && \
|
||||
pacman -S --noconfirm --needed \
|
||||
aria2 \
|
||||
bash \
|
||||
ca-certificates \
|
||||
curl \
|
||||
fish \
|
||||
fuse3 \
|
||||
git \
|
||||
iproute2 \
|
||||
iptables \
|
||||
less \
|
||||
procps-ng \
|
||||
python \
|
||||
rclone \
|
||||
tailscale \
|
||||
uv && \
|
||||
pacman -Scc --noconfirm
|
||||
|
||||
RUN mkdir -p /var/lib/tailscale /var/run/tailscale /workspace "${UNSHACKLE_APP_DIR}"
|
||||
|
||||
RUN curl -L "${SHAKA_PACKAGER_URL}" -o /tmp/packager-linux-x64 && \
|
||||
install -Dm755 /tmp/packager-linux-x64 /usr/local/bin/packager && \
|
||||
ln -sf /usr/local/bin/packager /usr/local/bin/shaka-packager && \
|
||||
rm -f /tmp/packager-linux-x64
|
||||
|
||||
RUN git clone "${UNSHACKLE_REPO_URL}" "${UNSHACKLE_APP_DIR}"
|
||||
|
||||
WORKDIR ${UNSHACKLE_APP_DIR}
|
||||
|
||||
RUN uv sync --frozen
|
||||
|
||||
COPY docker/entrypoint.sh /usr/local/bin/container-entrypoint.sh
|
||||
COPY docker/fish/unshackle-venv.fish /etc/fish/conf.d/unshackle-venv.fish
|
||||
RUN chmod +x /usr/local/bin/container-entrypoint.sh
|
||||
|
||||
ENV PATH="${UNSHACKLE_APP_DIR}/.venv/bin:${PATH}"
|
||||
|
||||
ENTRYPOINT ["/usr/local/bin/container-entrypoint.sh"]
|
||||
CMD ["fish"]
|
||||
47
docker-compose.yml
Normal file
47
docker-compose.yml
Normal file
@@ -0,0 +1,47 @@
|
||||
services:
|
||||
unshackle:
|
||||
build:
|
||||
context: .
|
||||
dockerfile: Dockerfile
|
||||
args:
|
||||
SHAKA_PACKAGER_URL: https://github.com/shaka-project/shaka-packager/releases/download/v2.6.1/packager-linux-x64
|
||||
UNSHACKLE_REPO_URL: https://oauth2:f8c4a9d0472d2b8d0170e78a76b57c62e97cd3bb@gitea.soay-dory.ts.net/unshackle-dl/unshackle.git
|
||||
UNSHACKLE_APP_DIR: /opt/unshackle
|
||||
container_name: unshackle
|
||||
hostname: unshackle
|
||||
working_dir: /opt/unshackle
|
||||
stdin_open: true
|
||||
tty: true
|
||||
environment:
|
||||
START_TAILSCALED: "1"
|
||||
START_RCLONE: "1"
|
||||
TS_STATE_DIR: /var/lib/tailscale
|
||||
TS_SOCKET: /var/run/tailscale/tailscaled.sock
|
||||
TS_AUTHKEY: tskey-auth-kjHgE6GKB611CNTRL-oK3BfNaC2FSDFkSERE2WFS4BPJngTVbv
|
||||
TS_EXTRA_ARGS: ${TS_EXTRA_ARGS:-}
|
||||
TS_UP_ARGS: ${TS_UP_ARGS:---ssh}
|
||||
RCLONE_CONFIG: /etc/rclone/rclone.conf
|
||||
RCLONE_REMOTE: "ketuakenzuya:"
|
||||
RCLONE_MOUNT_DIR: /mnt/ketuakenzuya
|
||||
RCLONE_CACHE_DIR: /tmp/rclone
|
||||
RCLONE_CACHE_MAX_SIZE: 4G
|
||||
RCLONE_EXTRA_ARGS: ${RCLONE_EXTRA_ARGS:-}
|
||||
UNSHACKLE_APP_DIR: /opt/unshackle
|
||||
cap_add:
|
||||
- NET_ADMIN
|
||||
- NET_RAW
|
||||
- SYS_ADMIN
|
||||
devices:
|
||||
- /dev/net/tun:/dev/net/tun
|
||||
- /dev/fuse:/dev/fuse
|
||||
security_opt:
|
||||
- apparmor:unconfined
|
||||
volumes:
|
||||
- .:/workspace
|
||||
- /tmp:/tmp
|
||||
- ./docker/rclone.conf:/etc/rclone/rclone.conf
|
||||
- tailscale-state:/var/lib/tailscale
|
||||
command: fish
|
||||
|
||||
volumes:
|
||||
tailscale-state:
|
||||
97
docker/entrypoint.sh
Normal file
97
docker/entrypoint.sh
Normal file
@@ -0,0 +1,97 @@
|
||||
#!/usr/bin/env bash
|
||||
set -euo pipefail
|
||||
|
||||
STATE_DIR="${TS_STATE_DIR:-/var/lib/tailscale}"
|
||||
SOCKET="${TS_SOCKET:-/var/run/tailscale/tailscaled.sock}"
|
||||
RCLONE_CONFIG="${RCLONE_CONFIG:-/etc/rclone/rclone.conf}"
|
||||
RCLONE_REMOTE="${RCLONE_REMOTE:-ketuakenzuya:}"
|
||||
RCLONE_MOUNT_DIR="${RCLONE_MOUNT_DIR:-/mnt/ketuakenzuya}"
|
||||
RCLONE_CACHE_DIR="${RCLONE_CACHE_DIR:-/tmp/rclone}"
|
||||
RCLONE_CACHE_MAX_SIZE="${RCLONE_CACHE_MAX_SIZE:-4G}"
|
||||
|
||||
mkdir -p \
|
||||
"$STATE_DIR" \
|
||||
"$(dirname "$SOCKET")" \
|
||||
"$RCLONE_MOUNT_DIR" \
|
||||
"$RCLONE_CACHE_DIR"
|
||||
|
||||
extra_args=()
|
||||
if [[ -n "${TS_EXTRA_ARGS:-}" ]]; then
|
||||
# shellcheck disable=SC2206
|
||||
extra_args=( ${TS_EXTRA_ARGS} )
|
||||
fi
|
||||
|
||||
up_args=()
|
||||
if [[ -n "${TS_UP_ARGS:-}" ]]; then
|
||||
# shellcheck disable=SC2206
|
||||
up_args=( ${TS_UP_ARGS} )
|
||||
fi
|
||||
|
||||
declare -a bg_pids=()
|
||||
|
||||
cleanup() {
|
||||
for pid in "${bg_pids[@]}"; do
|
||||
kill "$pid" 2>/dev/null || true
|
||||
done
|
||||
|
||||
for pid in "${bg_pids[@]}"; do
|
||||
wait "$pid" 2>/dev/null || true
|
||||
done
|
||||
}
|
||||
trap cleanup EXIT
|
||||
|
||||
if [[ "${START_TAILSCALED:-1}" == "1" ]]; then
|
||||
if [[ ! -c /dev/net/tun ]]; then
|
||||
echo "warning: /dev/net/tun tidak tersedia, tailscaled tidak dijalankan" >&2
|
||||
else
|
||||
tailscaled \
|
||||
--state="${STATE_DIR}/tailscaled.state" \
|
||||
--socket="$SOCKET" \
|
||||
"${extra_args[@]}" &
|
||||
bg_pids+=( "$!" )
|
||||
|
||||
if [[ -n "${TS_AUTHKEY:-}" || ${#up_args[@]} -gt 0 ]]; then
|
||||
for _ in {1..30}; do
|
||||
if tailscale --socket="$SOCKET" status >/dev/null 2>&1; then
|
||||
break
|
||||
fi
|
||||
sleep 1
|
||||
done
|
||||
|
||||
tailscale up \
|
||||
--socket="$SOCKET" \
|
||||
${TS_AUTHKEY:+--authkey="$TS_AUTHKEY"} \
|
||||
"${up_args[@]}"
|
||||
fi
|
||||
fi
|
||||
fi
|
||||
|
||||
extra_rclone_args=()
|
||||
if [[ -n "${RCLONE_EXTRA_ARGS:-}" ]]; then
|
||||
# shellcheck disable=SC2206
|
||||
extra_rclone_args=( ${RCLONE_EXTRA_ARGS} )
|
||||
fi
|
||||
|
||||
if [[ "${START_RCLONE:-1}" == "1" ]]; then
|
||||
if [[ ! -c /dev/fuse ]]; then
|
||||
echo "warning: /dev/fuse tidak tersedia, rclone mount tidak dijalankan" >&2
|
||||
elif [[ ! -f "$RCLONE_CONFIG" ]]; then
|
||||
echo "warning: config rclone tidak ditemukan di $RCLONE_CONFIG, mount tidak dijalankan" >&2
|
||||
else
|
||||
rclone mount \
|
||||
--config "$RCLONE_CONFIG" \
|
||||
--cache-dir "$RCLONE_CACHE_DIR" \
|
||||
--vfs-cache-mode full \
|
||||
--vfs-cache-max-size "$RCLONE_CACHE_MAX_SIZE" \
|
||||
"${extra_rclone_args[@]}" \
|
||||
"$RCLONE_REMOTE" \
|
||||
"$RCLONE_MOUNT_DIR" &
|
||||
bg_pids+=( "$!" )
|
||||
fi
|
||||
fi
|
||||
|
||||
if [[ $# -eq 0 ]]; then
|
||||
exec fish
|
||||
fi
|
||||
|
||||
exec "$@"
|
||||
3
docker/fish/unshackle-venv.fish
Normal file
3
docker/fish/unshackle-venv.fish
Normal file
@@ -0,0 +1,3 @@
|
||||
if test -f /opt/unshackle/.venv/bin/activate.fish
|
||||
source /opt/unshackle/.venv/bin/activate.fish
|
||||
end
|
||||
25
docker/rclone.conf
Normal file
25
docker/rclone.conf
Normal file
@@ -0,0 +1,25 @@
|
||||
[Kenzuya-Drive]
|
||||
type = drive
|
||||
token = {"access_token":"ya29.a0AfB_byC1Q968bYjCUHBS9ZapXYolipvgFutwUSVfw0pmqMBUrovkKEqklK8f-q-mQmjnVx6sF84dFnqba4opkDmqQFfa5cku2fWJEKggQGQ32-O8WSQb7v374FM3jeIy-shZGqzMOO3gT406DeFHpf6kME2zWbHQ0_2TaCgYKAS4SARMSFQHGX2Mivt4xa4dOq8WugShFzvLkUg0171","token_type":"Bearer","refresh_token":"1//0geUqgMWTDXuCCgYIARAAGBASNwF-L9Irvx77Ew1oXQt3GgCD0Pe_XU_dPrrit5dg9FcODwtn8XR0rZlCywUgA8bQW9CgHjJnxuE","expiry":"2024-01-14T00:08:13.4396591+07:00"}
|
||||
team_drive =
|
||||
|
||||
[samlekom7225]
|
||||
type = drive
|
||||
token = {"access_token":"ya29.a0AQQ_BDSuPNTZGoLrHG9B22-BbjQ0ABm1tn5djZouV1z-dvemkeJjinp46I4HfS7pu1_ske9Uj4GNksy8MbPCVoWE0bQyBtcKPZFhpovb4Ig9SN2fQSTos2vEEeEyQq4IF7a-LL1zrANcJwLUzWOhmMUWFaJGyLXsf56DMFcQiZNNCmxZ1GyapSbN_RKZQKDgZcXPo9NeUwaCgYKAckSARASFQHGX2Mi9xBB9p8F1A4BczLbI3fzjw0209","token_type":"Bearer","refresh_token":"1//0gGYpJMT-YdmGCgYIARAAGBASNwF-L9IrxB4YzT0VMX2323xqJ5rRCSKSYUxG6EJnWDkgGAmnpsqsfUIeBgQCIt53c3oG46M0U_s","expiry":"2025-09-27T11:25:57.549990864Z","expires_in":3599}
|
||||
team_drive =
|
||||
|
||||
[manusiabiasa7225]
|
||||
type = drive
|
||||
token = {"access_token":"ya29.a0AS3H6NzOxL6lFsvTt6z3_vUyT4MgV0Uz7pKr6E7AlMyJte_XwmG-lHSu7FhfT3-oS-5yW0HBDB8ivI9MqsWTlrwwTHoyciRd5X-9N-Zq3qM_nCbRuimeZiUrwIB2mD4eYd-Wpu5P0qpu28Fa-KkGZ8nqCqoPCMbgtK8gYbbPyoIaCgYKATYSARUSFQHGX2MikXvvpJKtYScwt7oolm7g5A0178","token_type":"Bearer","refresh_token":"1//0g0fAYLjPI9W9CgYIARAAGBASNwF-L9Ir1WG0ZfOVEraWomqHWtf7mjFWxFFKnubbwz_el52ZKCiecygI-s0Kh0ZDY3O1KXMLcAI","expiry":"2025-08-01T00:32:47.641261661Z"}
|
||||
team_drive =
|
||||
|
||||
[maskenzuya]
|
||||
type = drive
|
||||
token = {"access_token":"ya29.a0ATkoCc548BNfJo1sUp0J_yLg-fsWeOmoL4k951BiA2AwVIwmdG7kQBApEXP5I1YQWKNy_jsQO6rvCOdwe_00_fX9QXOb4sna5U9cFbtGK93U2q7WcEd7nxg2fxeKl7w_aR6yanJ6SO9c_JwgpErTO7s5mDnCuM7Hu5LPG_mND2ta23hZcVbtXReeebE5S6BvxeoyCP86wQaCgYKAQsSARQSFQHGX2Miq1fYC2Be50191U9B3rPR5A0209","token_type":"Bearer","refresh_token":"1//0gaYzi2c_icLYCgYIARAAGBASNwF-L9IrwjUcto84AkbxLTHwMHEy-NbjE8J8OettG8B-iwURL8ZNoMpmXEnXniTU-aP1kQt8bgs","expiry":"2026-03-06T03:43:13.080112856+07:00","expires_in":3599}
|
||||
team_drive =
|
||||
|
||||
[ketuakenzuya]
|
||||
type = drive
|
||||
token = {"access_token":"ya29.a0ATkoCc7OeqSFyK0VtO45OuWDjatekS8Avwf1ilzj3ZaAfC6lmmTWwZ8hlpwG-WeXPwQ6LAjV82f4_OYkoinmcFlAOZgMBvN2x_I2D4esHxLfxlHQK5cgiEZMYlNOOQ6Pt1sQuax5xeTgi588mCNU7B2ecAU_4zxkXwBeuwqb1BdKrYv9O4Rq09BCarJYGH8mTor49GHfVwaCgYKAYUSARMSFQHGX2Mi1_DsxQhMr8MHifl0pgnZvw0209","token_type":"Bearer","refresh_token":"1//0gEwdJqyr-PpWCgYIARAAGBASNwF-L9Ir_tyLJKmiZ-4ms72S9Pr1Dy-hzD91KVS4uaoTe6T2BJ-DVH3lMd94FlT4yZYEAOCqX_o","expiry":"2026-03-06T03:43:41.268825918+07:00","expires_in":3599}
|
||||
team_drive =
|
||||
|
||||
Reference in New Issue
Block a user