سینک اندروید بدون گوگل

یک‌شنبه ۱۷ فروردین ۱۳۹۹
۹ دقیقه مطالعه

طی سالهای گذشته وب روز به روز متمرکزتر از قبل شده. بسیاری از ما عادت کرده‌ایم که داده‌هایمان را روی سرورهای دیگران ذخیره کنیم و آن را فراموش کنیم. اما من داده‌هایم را بدون یک سرور مرکزی سینک می‌کنم. در این مقاله راه‌حلی برای سینک داده‌ها بین اندروید و یک کامپیوتر دیگر به کمک فرمت ‏DecSync و برنامه‌ی Syncthing معرفی می‌کنم.

مهم: قبل از دستکاری گوشی و بازی با تکنولوژی‌های جدید حتما از داده‌های مهم به هر شکلی که می‌توانید نسخه پشتیبان بگیرید. بارها به سختی گزیده شده‌ام!

صورت مسئله

من می‌خواهم به تقویم و دفترچه‌تلفن گوشی‌ام روی کامپیوترم هم دسترسی داشته باشم و بتوانم آنها را ویرایش کنم. شرطم هم اینست که داده‌هایم روی سرورهای هیچ شرکت گنده‌ای ذخیره نشود. به همین خاطر از سینک اندروید و سامسونگ و مانند اینها استفاده نمی‌کنم. در حقیقت همه آنها روی گوشی من غیرفعال هستند. علاوه بر این می‌خواهم ابزار حل این مشکل اوپن سورس باشد و نیازی به حساب کاربری اینجا و آنجا نداشته باشد.

عیب شرکت گنده کجاست؟

ذخیره داده روی سرورهای شرکت‌های بزرگ هم عیب دارد هم حسن. بستگی دارد کجا باشید و کارتان چه باشد. من می‌خواهم داده‌هایم پیش خودم باشد نه روی یک سرور در کره جنوبی یا کالیفرنیا یا فرانکفورت. در ضمن می‌خواهم خودم تصمیم بگیرم روی کدام گوشی و پلتفرم آنها را داشته باشم. اگر از گوگل و سامسونگ و ماکروسافت و مانند اینها برای بک‌آپ‌گیری استفاده کنیم محدود به آنها هستم و آزادی عمل ما کاهش پیدا می‌کند. آنها هستند که تصمیم می‌گیرند کجا و چگونه به داده‌ها دسترسی داشته باشیم. آنها روز به روز قوی‌تر می‌شوند و آزادی انتخاب کاربر نهایی کمتر. در حالی که از نظر فنی نیازی به آنها نیست. از همه اینها گذشته باید روی پلتفرم آنها یک حساب کاربری ساخت.

حین خواندن حتما به یاد داشته باشید آنچه که من اینجا می‌نویسم از دید یک تعمیرکار است که سرش درد می‌کند برای خراب کردن چیزها!

روش جاری

اول مروری کوتاه داشته باشیم به روش‌های سینک تقویم و دفترچه تلفن اندروید. در حالت عادی اندروید یک تقویم و یک دفترچه تلفن لوکال دارد. اطلاعات گوشی پاک بشود اینها هم از بین می‌روند. وقتی یک اکانت گوگل یا واتس‌آپ یا تلگرام یا مانند اینها روی گوشی نصب می‌شود، این برنامه‌ها می‌توانند به کمک API اندروید درخواست دسترسی به این اطلاعات کنند. آنها سپس این اطلاعات را به سرورهایشان در اینترنت ارسال می‌کنند. مثلا یک اکانت گوگل می‌تواند تقویم و دفترچه تلفن را بین گوشی اندروید و سرورهای گوگل سینک کند که آنلاین هم در دسترس است و خیلی محبوب است (ولی اگر روی گوشی اکانت گوگل نداشته باشید یا نخواهید یا روی پلتفرم شما ساپورت نشود نمی‌توان از این روش و روش‌های مشابه استفاده کرد.)

در همه موارد بالا یک قطعه برنامه دائما تقویم و دفترچه تلفن روی گوشی را با یک سرور اینترنتی که معمولا متعلق به یک شرکت غول‌پیکر اینترنتی است سینک می‌کند. اکثر این قبیل برنامه‌ها هم اوپن سورس نیستند و شرکت سازنده طبق اولویت‌های تجاری‌اش تصمیم می‌گیرد برنامه کجا و چگونه ارائه بشود.

راه حل آلترناتیو

راه حل آلترناتیو ما مسئله را با در نظر گرفتن شروطی که ذکر کردیم حل می‌کند. نه تنها بدون بکارگیری سرور مرکزی سینک انجام می‌شود و آزادی عمل ما تامین می‌شود، بلکه ابزارآلات بکاررفته هم همگی اوپن سورس هستند. روشی که به کار می‌گیریم خیلی هوشمندانه و در عین حال بسیار ساده است. پس کمی دقت لازم است تا بفهمیم چطور کار می‌کند.

در این روش برای سینک کردن کانتکت‌ها و تقویم گوشی (فعلا فقط اندروید) با کامپیوتر دو برنامه مهم را بکار می‌بریم: ‏DecSync CC و سینک‌تینگ.

برنامه اول پیاده‌سازی دک‌سینک برای اندروید است. این برنامه یک تقویم و دفترچه‌تلفن قابل سینک لوکال روی گوشی می‌سازد. منظور از قابل سینک ذخیره آن در فرمتی است که برای سینک دوطرفه مناسب باشد (فرمت دک‌سینک) و به اصطلاح conflict free باشد. بدون چنین فرمتی امکان ویرایش دوطرفه وجود نمی‌داشت. کار برنامه دوم هم اینست که همواره داده‌های برنامه اول را سینک کند. در حقیقت سینک‌تینگ هر داده‌ای را بین چند کامپیوتر که ما تعریف می‌کنیم سینک می‌کند و برایش اصلا مهم نیست این داده چیست. برنامه سومی را هم بکار برای مشاهده و ویرایش دفترچه تلفن و تقویم روی کامپیوتر نصب می‌کنیم. این کار را به کمک یک پلاگین اوولوشن بنام Evolution-DecSync انجام می‌دهیم.

روش کار ما اینجا یک تفاوت بنیادی با سایر روش‌های رایج دارد. عموم برنامه‌های این چنینی مستقیما با یک سرور اینترنتی ارتباط برقرار می‌کنند و داده‌ها را جایی لابلای ابرها ذخیره می‌کنند. در حالی که اینجا ما همه داده‌ها را روی خود گوشی ذخیره می‌کنیم و برنامه سینک ما اصلا قابلیت اتصال به یک سرور اینترنتی را ندارد. بخش سینک داده‌ها به طور جداگانه توسط سینک‌تینگ انجام می‌شود.

نصب و راه‌اندازی برنامه‌ها

در ادامه هر دو برنامه را معرفی و روی یک اندروید و لینوکس نصب و راه‌اندازی می‌کنیم. اول می‌رویم سراغ سینک‌تینگ که بدون آن راه به جایی نمی‌بریم.

Syncthing

سینک‌تینگ برنامه‌ایست که فایل‌ها را به صورت دائمی بین چند نقطه سینک می‌کند. این نقطه‌ها کامپیوترهایی هستند که یک نسخه از سینک‌تینگ روی آنها در حال اجراست. سینک‌تینگ فایل‌ها و پوشه‌هایی را که به آن بدهیم بین تمام این کامپیوترها به صورت دوطرفه و دائم سینک می‌کند. مجموع این سینک‌تینگ‌های در حال اجرا روی کامپیوترهای مختلف وقتی به هم متصل شود تشکیل یک شبکه می‌دهند که فایل‌های ما را همواره بین یکدیگر سینک می‌کنند. مثلا دو گوشی و یک کامپیوتر رومیزی و یک رزبری‌پای می‌توانند شبکه ما را تشکیل بدهند. علاوه‌براین همه این نقل و انتقالات رمزنگاری شده هستند. کل این پروژه هم به همت اولیه یک هکر سوئدی بنام جاکوب بورگ ایجاد شده و یک پروژه‌ی شرکتی نیست.

سینک‌تینگ یک برنامه‌ی سینک پیوسته‌ی فایل‌هاست. سینک‌تینگ فایل‌ها را بلادرنگ (real time) بین دو یا چند کامپیوتر، تماما محفوظ از چشمهای کاوشگر، سینک می‌کند. داده‌ی شما تنها داده‌ی شماست و این شما هستید که باید انتخاب کنید کجا ذخیره بشود و اینکه آیا با شخص سومی به اشتراک گذاشته بشود و اینکه چگونه در اینترنت منتقل بشود. – سایت سینک‌تینگ (ترجمه از من)

سینک‌تینگ با زبان برنامه‌نویسی گو نوشته شده است و هرجا که برنامه گو اجرا بشود کار می‌کند یا برایش کامپایل می‌شود، مانند لینوکس و ویندوز و مک و اندروید و رزبری پای. البته اجرا روی آی‌او‌اس هنوز به خاطر مشکلاتی هنوز پیاده‌سازی نشده است.

به طور ساده سینک‌تینگ دو گروه چیز را به هم وصل می‌کند. تعدادی کامپیوتر و تعدادی فایل. تنظیمات و جزئیات زیاد دارد ولی اصل ماجرا همین است. رابط کاربری نسخه لینوکس و ویندوز یک برنامه‌ی وب است و روی اندروید یک اپ. در صفحه دانلود سینک‌تینگ لینک‌های دانلود بیشتری برای سیستم‌های مختلف هست.

سینک‌تینگ را که روی یک کامپیوتر نصب و اجرا کنید (با دنبال کردن لینک‌های بالا) و لوکال‌هاست را باز کنید صفحه زیر را خواهید دید (البته خالی از فولدر و کامپیوتر):

Syncthing Image

باید برنامه را روی اندروید یا یک کامپیوتر دیگر هم نصب کرد و بعد Device ID یکی از سینک‌تینگ‌ها را به صورت متنی یا از طریق اسکن QR Code به دیگری اضافه کرد. روی کامپیوتر Device ID را در منوی Actions -> Show ID پیدا می‌کنید. در اندروید هم سایدبار.

Syncthing Android

برنامه اندروید خیلی خوشدست است. گوشه بالا دست راست یک بعلاوه وجود دارد. در تب کامپیوترها باشید معنایش اضافه کردن یک کامپیوتر جدید به جمیع کامپیوترهای سینک‌تینگی‌تان است و در تب فولدرها که باشید معنایش اضافه کردن یک فولدر جدید برای سینک شدن است. سینک‌تینگ به صورت پیشفرض فولدری بنام Sync را در User Home سینک می‌کند.

بعد از نصب، Device ID را از یکی بخوانید و در دیگری کپی کنید. اگر دسکتاپ است در مسیر Add Remote Device و اگر اندروید است در منوی بعلاوه وارد کنید. بعد باید یک مدتی صبر کنید تا سینک‌تینگ دیگر این درخواست را به شما نمایش دهد. بعد از تایید نهایی تازه این‌ها به هم وصل می‌شوند. همین ترتیب نیز باید برای اضافه کردن یک فولدر جدید رعایت بشود.

حالا هر زمان این کامپیوترها روشن باشند سینک‌تینگ‌ها یکدیگر را پیدا می‌کنند و فایل‌ها را سینک می‌کنند. برای پیدا کردن یکدیگر در حال حاضر از سروری در اینترنت کمک می‌گیرند ولی انتقال داده‌ها مستقیم انجام می‌شود. اگر علاقه‌مند به جزئیات فنی هستید مستندات سینک‌تینگ و بویژه پروتکل سینک‌تینگ را ببینید.

DecSync

حالا که فوندانسیون را با سینک‌تینگ ریختیم نوبت سوار کردن دک‌سینک روی آن است. دک‌سینک یک فرمت است که می‌تواند تعدادی کلید و داده‌های مربوط به آنها را به شیوه‌ای فارغ از تضاد و تداخل ذخیره کند. همه آنچه ما اینجا بکار می‌گیریم توسط هکری احتمالا هلندی بنام آلدو گونسینگ بوجود آمده. او بر اساس این فرمت برنامه‌های مختلفی نوشته که ما اینجا دو تا از آنها را لازم داریم:

  1. DecSync CC
  2. Evolution-DecSync

DecSync CC

دک‌سینک سی‌سی یک برنامه‌ی اندروید است که از فرمت دک‌سینک پشتیبانی می‌کند و دفترچه تلفن و تقویم را در یک فولدر روی گوشی ذخیره می‌کند. دک‌سینک سی‌سی از روی F-Droid قابل نصب است. ـF-Droidـ یک پلی‌استور آلترناتیو اندروید برای برنامه‌های اوپن‌سورس و برنامه‌های غیرقابل انتشار روی گوگل‌پلی است و باید با دانلود از سایتشان نصب شود چرا که گوگل اجازه انتشار به آن نمی‌دهد.

بعد از نصب، دک‌سینک سی‌سی را باز کنید و یک تقویم و یک دفترچه تلفن بسازید. دقت کنید که چیزی به طور خودکار از سایر دفترچه تلفن‌ها و تقویم‌ها به این‌ها منتقل نمی‌شود. من از دفترچه‌تلفن گوشی‌ام یک اکسپورت گرفتم و در این دفترچه تلفن جدید ایمپورت کردم. تقویم را هم اصلا ایمپورت نگرفتم و فقط رویدادهای جدید را در این تقویم ثبت کردم. تصویر زیر اگر لود بشود صفحه اصلی دک‌سینک سی‌سی اندروید را با یک دفترچه تلفن و یک تقویم که با آن اضافه کرده‌ام نمایش می‌دهد.

Decsync Android

دک‌سینک این دفترچه و تقویم را به اندروید اضافه می‌کند و اطلاعات آنها را در فولدری بنام DecSync ذخیره می‌کند. دقت کنید که روح دک‌سینک هم از سینک‌تینگ خبری ندارد. جهان دک‌سینک به همین فولدر خلاصه می‌شود و تمام. این فولدر را هم می‌دهیم به سینک‌تینگ تا با یک کامپیوتر یا رزبری سینک بکند.

بعد از این می‌توانید از این دفترچه‌تلفن و تقویم برای ثبت اطلاعات اضافه کنید. فقط قبل از اینکه کاملا به این روش اتکا کنید مطمئن شوید که سینک‌تینگ را درست راه‌انداخته‌اید. در غیر ایصورت اطلاعات روی گوشی می‌ماند و با جایی سینک نمی‌شود.

Evolution-DecSync

برای نصب پلاگین اوولوشن طبق مستندات برنامه عمل کنید. برای آرچ و اوبونتو و دبیان و فدورا پکیج دارد. برای سایر دیستروها باید خودتان زحمت کامپایل از سورس را بکشید.

این برنامه که نصب بشود فولدر ‫‫‫‫~/.local/share/decsync را می‌خواند. کافیست این فولدر را به جایی که سینک‌تینگ فولدر اندرویدی ما را سینک کرده است لینک بکنیم. مثلا:

$ ln -s ~/Sync/DecSync ~/.local/share/decsync

حالا وقتی از منوی File -> Add -> New -> گزینه‌های Calender یا Address Book را انتخاب کنیم و اگر همه چیز درست پیش رفته باشد باید یک سورس جدید بنام decsync قابل انتخاب باشد.

decsync calendar

decsync address book

بونس: سینک‌تینگ روی رزبری

همه این چیزها که گفتیم اگر جایی نداشته باشیم که سینک‌تینگ همواره در حال اجرا باشد سود چندانی ندارد. چرا که تا وقتی کامپیوتر را روشن نکنیم داده‌ها سینک نمی‌شود. بنابراین بهترین روش اینست که روی یک کامپیوتر مثل رزبری سینک‌تینگ را نصب کنید. من رزبری و کامپیوترهای مشابه را به صورت هدلس نصب می‌کنم. یعنی بدون دسکتاپ. سینک‌تینگ اما روی لوکال‌هاست اجرا می‌شود پس باید برای دسترسی به آن از ssh استفاده کرد و پورت ریموت را لوکال کرد. دستورش را در ادامه می‌آورم که اگر کسی به اینجا رسید لنگ نماند.

pi@raspberrypi:~ $ lsb_release -a
No LSB modules are available.
Distributor ID:	Raspbian
Description:	Raspbian GNU/Linux 10 (buster)
Release:	10
Codename:	buster
pi@raspberrypi:~ $ sudo apt install syncthing
## Enable for user `pi`. By default will sync `~/Sync`
pi@raspberrypi:~ $ sudo systemctl enable syncthing@pi.service
## Check service status
pi@raspberrypi:~ $ sudo systemctl status syncthing@pi.service

برای دسترسی به یک وب سایت ریموت هم دستور زیر به کار می‌آید:

$ ssh -N -L 8888:localhost:8384 username@remote_ip

پورت ۸۳۸۴ پورت پیشفرض صفحه وب سینک‌تینگ است. ۸۸۸۸ هم یک پورت دلخواه روی کامپیوتر خودمان است. این دستور را اجرا کنیم صفحه وب سینک‌تینگ را روی پورت ۸۸۸۸ کامپیوترمان می‌توانیم باز کنیم. بدرد کنترل یک سرور ریموت می‌خورد.

خلاصه

در این مقاله از اهمیت سینک‌کردن داده‌هایمان و مزایا و معایب اتکا به ابرشرکت‌ها نوشتیم. با یک راه حل آلترناتیو برای سینک دفترچه تلفن و تقویم اندروید بدون سرور مرکزی و دخالت شخص سوم آشنا شدیم. سینک‌تینگ و دک‌سینک رو به این منظور معرفی کردیم و نصب و راه‌اندازی‌شان کردیم.

سورس

دیدگاه‌ها

rn   ۱۸ فروردین ۱۳۹۹ 5e8a98dec1cc435246188af2

عالی بود، ای کاش کمی زود به زود بنویسید.

ابتدای بعضی لینکها آدرس سایتتون چسبیده شاید بخوایید اصلاح کنید.

  پاسخ
امیر   ۱۸ فروردین ۱۳۹۹ 5e8b143ab60cb79e1ef7c5fa

درود بر شما؛ یک نگاهی هم به این بندازید

https://f-droid.org/en/packages/at.bitfire.davdroid/

  پاسخ
مهدی   ۱۸ فروردین ۱۳۹۹ 5e8b2b12e80e55143dd5485f

سلام امیر. این رو قبلا دیدم و امتحان کردم. caldav نیاز به سرور داره و هر برنامه‌ای اون رو پیاده کنه در نهایت باید به یک‌سرور وصل بشه. هدف این مقاله حذف همون سروره.

  پاسخ
امیر   ۱۸ فروردین ۱۳۹۹ 5e8ba00ea565f26addd8df05

متوجه شدم قرار نیست WebDAV هم باشه. دوست دارید همه‌چیز آخرش فایل باشه که راحت سینک بشه.

Everything is a file

😁

  پاسخ
مهدی   ۲۰ فروردین ۱۳۹۹ 5e8d8530838d04d92235a520

دقیقا! در حاشیه هم اضافه کنم که علت دیر منتشر شدن پیامت یک باگ در کامنتدونی بود که پاسخ به پاسخ رو منتشر نمی‌کرد. سبب خیر شدی که این رو فهمیدم و درستش کردم!

  پاسخ
آیدین   ۲۸ فروردین ۱۳۹۹ 5e98d226bcb3e22a872377c6

مدت‌ها بود دنبال چیزی می‌گشتم که بتونم فایل‌هام رو بدون نیاز به سرور بین چند تا ماشین سینک کنم. البته در حقیقت نمی‌گشتم! P: فقط فکر می‌کردم چه خوب می‌شد اگه بود. مرسی بابت معرفی Syncthing!

  پاسخ
پرهام   ۲۱ اردیبهشت ۱۳۹۹ 5eb7e31d7348aae308a16d95

سلام. ممنون برای این نوشته و معرفی خوب. :) در این مثال شما مخاطبین و تقویم رو انتقال دادید. من دارم سعی میکنم با زامارین یه برنامه ثبت اطلاعات بنویسم که روی دو سکوی ویندوز و اندروید کار کنه. دنبال روشی هستم که بشه فایل دیتابیس بین این دو سکو سینک بشه. آیا روشی که شما استفاده کردید در سناریوی من قابل استفاده است یا اینکه باید بخش سینک رو هم پیاده‌سازی کرد؟

ایده‌ای که به ذهنم رسید اینکه مثلا برنامه من فایل داده‌ها را رو در یک سکو بده به Syncthing و در سکوی دیگه اون رو تحویل بگیره و برنامه باهاش به روز بشه. از معرفی و مثال شما تا کجای این ایده میتونم استفاده کنم؟ آیا در این مثال دک‌سینک کاربردی داره؟

خیلی ممنون. :)

  پاسخ
مهدی   ۲۱ اردیبهشت ۱۳۹۹ 5eb871c4247a2c10a335bb8e

سلام پرهام، به نظرم بررسی پروتکل سینک برنامه‌هایی که اینجا معرفی کردم حتما برای کارت سودمنده، اما پلاگ اند پلی نیست چون دست روی چیز پیچیده‌ای گذاشتی :) فایل تو احتمالا باینریه و هم تغییرات همزمان روی ویندوز و اندروید خواهی داشت و ممکنه تغییرات فورا سینک نشوند که باعث مشکلات عجیبی می‌شه. اینها مشکلات رایج مالتی‌پراسسینگه. کافیه بجای کامپیوترها در این مقاله یک پراسس بذاری (حقیقت هم همینه، فقط پراسس روی یک ماشین دیگه است). سینک‌تینگ حالت سینک یک طرفه و دو طرفه داره. من نمی‌دونم در حالت دو طرفه اگر در هر دو طرف یا چند دستگاه یک فایل یکسان تغییر کرده باشه چکار می‌کنه. باید امتحان کنی و لینک پروتکلش رو که گذاشتم با دقت نگاه بکنی. نگاه به طرز کار قابلیت مرج گیت هم سودمنده. چون گیت فایل‌های تکست رو می‌تونه مرج بکنه. لب کلام اینه که اگر یک فایل باینری داری که ممکنه همزمان در چند جا تغییر پیدا کنه هیچ برنامه‌ی سینکی نمی‌تونه کمکت کنه چون نمی‌فهمه داخل فایل تو چیه. سینک‌تینگ در سطح فایل داره کار می‌کنه، نمی‌فهمه داخلش چیه. کاری که دک‌سینک کرده اینه که همه تغییرات در فایل‌های جدا ذخیره می‌شن. یعنی تا جایی که نگاه کردم اصلا ادیت نداره. تو دیتابیس به اینها می‌گن append only log. یعنی همه تغییرات فقط یه چیزی به دیتابیس اضافه می‌کنند و باعث کم شدن هیچ چیز نمی‌شن. تو هم اگر بتونی همه تغییرات رو در فایلهای جدا ذخیره کنی می‌تونی از سینک استفاده کنی.

  پاسخ
پرهام   ۲۲ اردیبهشت ۱۳۹۹ 5eb8de7147e2adeb5c9b8bd1

خیلی ممنون برای توضیح کاملی که دادی. برای این برنامه تازه اول راه هستم. باید کلی یاد بگیرم و تحقیق کنم که برای چنین سناریویی بهترین راه حل چیه. در ORM EF قابلیت Migration تغییرات بین ساختار دیتابیس و معادلش در سطح کد رو از نظر اختلاف و تغییرات بررسی میکنه. فکر کنم برای یه تازه کار انجام چنین کاری سخت باشه!

برنامه‌ای که دارم میسازم داده‌ها رو روی یک فایل باینری LiteDB NoSQL ذخیره میکنه که باینریه، پس گیت هم نمیتونه براش کاری انجام بده.

ممنون :)

  پاسخ