Giter Club home page Giter Club logo

django-dbbackup's People

Contributors

aaronvarghese avatar archmonger avatar benjaoming avatar bittner avatar devkral avatar dmitryfillo avatar eriktelepovsky avatar hongquan avatar ilcapo77 avatar johnthagen avatar jonathan-s avatar mativs avatar max-wittig avatar maxg203 avatar mick88 avatar mihow avatar millerthegorilla avatar pacahon avatar patrickhallen avatar pkkid avatar pre-commit-ci[bot] avatar psychok7 avatar rvandernoort avatar sramana avatar sroussy avatar sumanthratna avatar truephilipp avatar voronind avatar wadevries avatar zulupro avatar

Stargazers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

Watchers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

django-dbbackup's Issues

AttributeError: 'module' object has no attribute 'filename_details'

utils module has not have a function named filename_details

(projtest)luzfcb@oficina:~/projtest/$ python manage.py dbrestore -l
Listing backups on Filesystem in //home/luzfcb/projtest/db_backup:
  projtestdb-2015-06-09-161531.psql

Traceback (most recent call last):
  File "manage.py", line 14, in <module>
    execute_from_command_line(sys.argv)
  File "/home/luzfcb/virtualenvs/projtest/local/lib/python2.7/site-packages/django/core/management/__init__.py", line 338, in execute_from_command_line
    utility.execute()
  File "/home/luzfcb/virtualenvs/projtest/local/lib/python2.7/site-packages/django/core/management/__init__.py", line 330, in execute
    self.fetch_command(subcommand).run_from_argv(self.argv)
  File "/home/luzfcb/virtualenvs/projtest/local/lib/python2.7/site-packages/django/core/management/base.py", line 390, in run_from_argv
    self.execute(*args, **cmd_options)
  File "/home/luzfcb/virtualenvs/projtest/local/lib/python2.7/site-packages/raven/contrib/django/management/__init__.py", line 41, in new_execute
    return original_func(self, *args, **kwargs)
  File "/home/luzfcb/virtualenvs/projtest/local/lib/python2.7/site-packages/django/core/management/base.py", line 441, in execute
    output = self.handle(*args, **options)
  File "/home/luzfcb/virtualenvs/projtest/src/django-dbbackup/dbbackup/management/commands/dbrestore.py", line 56, in handle
    return self.list_backups()
  File "/home/luzfcb/virtualenvs/projtest/src/django-dbbackup/dbbackup/management/commands/dbrestore.py", line 156, in list_backups
    print(utils.filename_details(filepath))
AttributeError: 'module' object has no attribute 'filename_details'

Warning in Documentation to wait for 2.0 final

There is still this warning in the index.rst of the documentation:

django-dbbackup is currently under heavy refactoring, stay tuned for new versions and a final 2.0 release.

Am I correct in assuming that this is obsolete now that this package is already at 2.0.4? :-)

mediabackup uses a lot of memory

When I run mediabackup to back up to Amazon S3, it consumes a lot of memory. I'm guessing it might load all the files into memory?
Not sure if there's anything that can be done about it but I thought I'd ask:

myuser - 372MB - 0:01:02 - 1189 - /home/myuser/.virtualenvs/live/bin/python /home/myuser/webapps/live/myproject/manage.py mediabackup

The media directory is around 331MB.
I'm using django-dbbackup version 2.0.4.

Error when backup postgresql without username

In my settings I have:

DATABASES = {
    'default': {
        'ENGINE': 'django.db.backends.postgresql_psycopg2', 
        'NAME': 'abc',                     
        'USER': '',
        'PASSWORD': '',
        'HOST': '',                  
        'PORT': '',                  
    }

my application works and my postgres server is on 127.0.0.1 and my postgres use IDENT authentication.
if I configure dbbackup as explained, and run:
django-admin.py dbbackup
I get the following error:

pg_dump: [archiviatore (db)] connessione al database "abc" fallita: FATALE: nessun utente PostgreSQL specificato nel pacchetto di avvio CommandError: Error running: ['pg_dump', '--username=', '<myusername>']

which is the italian for the error:
pg_dump: [archiver (db)] connection to database "abc" failed: FATAL: no PostgreSQL user name specified in startup packet
I guess the problem is that in this configuration the Command executed should be just:
pg_dump
(which, btw, works if run via CLI).
Am I right? Is it possible to fix it? If you want, I can try to look for the place in the code that builds the command line and try to fix it.

Option for backup retention days

It would be great to have an option for the number of days backups are retained. If any files older than the number of retention days are found, the backups will be deleted.

This would be small to implement but a really helpful feature.

Thanks for a great Django module.


Release 2.05 to pypi

There are a few (at least 2 I know of) breaking bugs in the current pypi release (2.04) which have since been fixed in master. I was involved with a couple of the fixes on the old bitbucket repo.

The ones I'm aware of are:

  • --compress option chews up far too much memory on larger DBs
  • --clean option broken due to "dbcommands.filter_filepaths" being removed in refactoring

It would be great if you could upload a release so that the better stability in master is reflected in the pypi release.

Thanks.

Optional compress for mediabackup

Hi folks,
I think you know that MEDIA_PATH usually contains non-plain files like images and may be videos.
And probably we want only tar them, because do another compress on them by gzip is useless.
Could it be a --compress option like for dbbackup?
Thanks.

Incorrect Documentation.

I have set up Django dbbackup for a posgres database..
your documentation states that you can set
DBBACKUP_POSTGRES_BACKUP_COMMANDS (optional) List of commands to use execute when creating a backup. Commands are sent to popen and should be split into shlex tokens. By default, the following command is run: >> pg_dump --username={adminuser} --host={host} --port={port} {databasename} >
DBBACKUP_POSTGRES_BACKUP_COMMANDS is the wrong setting variable used for documenting.. After going through the code i found 'DBBACKUP_POSTGRESQL_BACKUP_COMMANDS' is what is used in code.

Add logger

Add loggers and replace all print statements by it.
I think debug log should greatly help us.

Options --encrypt and --compress doesn't work together

It would be nice if those options could be used together, it'd be useful for large databases that needs some protection or if one would like to send big backup over unencrypted medium like email.

Right now the output of python manage.py dbbackup --encrypt is the same as python manage.py dbbackup --compress --encrypt.

./manage.py dbrestore needs to respect DBBACKUP_STORAGE

I have DBBACKUP_STORAGE set to dbbackup.storage.s3_storage, but ./manage.py dbrestore still is trying to pull from some local 'default.backup' backup file first, instead of the configured S3 bucket.

Note that the backups to S3 work fine.

Add support for Mongodb

Hello,
This package is very useful for our team. But we are using also mongodb. Are you going to support mongodb.

Thanks.

Dropbox back-end bug

Example file content: line1 line2
If use dropbox=2.2.0 package (or 2.1, or 2.0), I will get file with incorrect content: b"line1\nline2"
But if I use dropbox==1.6 package to upload file, I will get file with correct content.

Track version in git tags

It should be a great thing to track version number in git tags, like in Django project.

I think a little script which register to PyPi, create tag and push it will do the job.
(Don't use setup.py register, it doesn't use HTTPS and send your credentials, there's twine for this)

Small question in passing:
I saw last version is 2.0.5 alpha: https://pypi.python.org/pypi/django-dbbackup/2.0.5a
We do not have history before Bitbucket import, do you really think this version number is appropriate ?

S3 seems to timeout if the backup takes a long time to create

#!python

Traceback (most recent call last):
 File "/home/user/www/staging/env/local/lib/python2.7/site-packages/celery/execute/trace.py", line 47, in trace
   return cls(states.SUCCESS, retval=fun(*args, **kwargs))
 File "/home/user/www/staging/env/local/lib/python2.7/site-packages/celery/app/task/__init__.py", line 247, in __call__
   return self.run(*args, **kwargs)
 File "/home/user/www/staging/env/local/lib/python2.7/site-packages/celery/app/__init__.py", line 175, in run
   return fun(*args, **kwargs)
 File "/home/user/www/staging/code_root/sam/../sam/core/tasks.py", line 14, in backup_database
   management.call_command('dbbackup', database='slave0')
 File "/home/user/www/staging/env/local/lib/python2.7/site-packages/django/core/management/__init__.py", line 166, in call_command
   return klass.execute(*args, **defaults)
 File "/home/user/www/staging/env/local/lib/python2.7/site-packages/django/core/management/base.py", line 220, in execute
   output = self.handle(*args, **options)
 File "/home/user/www/staging/env/local/lib/python2.7/site-packages/dbbackup/utils.py", line 50, in wrapper
   func(*args, **kwargs)
 File "/home/user/www/staging/env/local/lib/python2.7/site-packages/dbbackup/management/commands/dbbackup.py", line 41, in handle
   self.save_new_backup(database)
 File "/home/user/www/staging/env/local/lib/python2.7/site-packages/dbbackup/management/commands/dbbackup.py", line 54, in save_new_backup
   self.storage.write_file(backupfile)
 File "/home/user/www/staging/env/local/lib/python2.7/site-packages/dbbackup/storage/s3_storage.py", line 59, in write_file
   self.bucket.put_file(filepath, filehandle)
 File "/home/user/www/staging/env/local/lib/python2.7/site-packages/simples3/streaming.py", line 68, in put_file
   headers=headers)
 File "/home/user/www/staging/env/local/lib/python2.7/site-packages/simples3/bucket.py", line 246, in put
   self.make_request("PUT", key=key, data=data, headers=headers).close()
 File "/home/user/www/staging/env/local/lib/python2.7/site-packages/simples3/bucket.py", line 212, in make_request
   raise exc_cls.from_urllib(e, key=key)
S3Error: Your socket connection to the server was not read from or written to within the timeout period.

S3 seems to timeout if the backup takes a long time to create

#!python

Traceback (most recent call last):
 File "/home/user/www/staging/env/local/lib/python2.7/site-packages/celery/execute/trace.py", line 47, in trace
   return cls(states.SUCCESS, retval=fun(*args, **kwargs))
 File "/home/user/www/staging/env/local/lib/python2.7/site-packages/celery/app/task/__init__.py", line 247, in __call__
   return self.run(*args, **kwargs)
 File "/home/user/www/staging/env/local/lib/python2.7/site-packages/celery/app/__init__.py", line 175, in run
   return fun(*args, **kwargs)
 File "/home/user/www/staging/code_root/sam/../sam/core/tasks.py", line 14, in backup_database
   management.call_command('dbbackup', database='slave0')
 File "/home/user/www/staging/env/local/lib/python2.7/site-packages/django/core/management/__init__.py", line 166, in call_command
   return klass.execute(*args, **defaults)
 File "/home/user/www/staging/env/local/lib/python2.7/site-packages/django/core/management/base.py", line 220, in execute
   output = self.handle(*args, **options)
 File "/home/user/www/staging/env/local/lib/python2.7/site-packages/dbbackup/utils.py", line 50, in wrapper
   func(*args, **kwargs)
 File "/home/user/www/staging/env/local/lib/python2.7/site-packages/dbbackup/management/commands/dbbackup.py", line 41, in handle
   self.save_new_backup(database)
 File "/home/user/www/staging/env/local/lib/python2.7/site-packages/dbbackup/management/commands/dbbackup.py", line 54, in save_new_backup
   self.storage.write_file(backupfile)
 File "/home/user/www/staging/env/local/lib/python2.7/site-packages/dbbackup/storage/s3_storage.py", line 59, in write_file
   self.bucket.put_file(filepath, filehandle)
 File "/home/user/www/staging/env/local/lib/python2.7/site-packages/simples3/streaming.py", line 68, in put_file
   headers=headers)
 File "/home/user/www/staging/env/local/lib/python2.7/site-packages/simples3/bucket.py", line 246, in put
   self.make_request("PUT", key=key, data=data, headers=headers).close()
 File "/home/user/www/staging/env/local/lib/python2.7/site-packages/simples3/bucket.py", line 212, in make_request
   raise exc_cls.from_urllib(e, key=key)
S3Error: Your socket connection to the server was not read from or written to within the timeout period.

Dbbackup overwrites all but the latest file

As far as I can see, dbbackup always creates single backup called [databasename].backup and overwrites previous backups, since they're already called the same name.

It looks like the issue might be in save_new_backup() in dbbackup.py. Could this instead use similar logic to get_backup_basename() in mediabackup.py, which adds a timestamp?

TypeError: initial_value must be unicode or None, not str - 2.0.3

2.0.3 s3 backup, reverted to 1.9.0 and it is working as expected

Backing Up Database: tpg
  Running: pg_dump --username=tpg --host=127.0.0.1 --port=5432 tpg
  Backup tempfile created: 40.7 MB
  Writing file to AmazonS3: <bound method Storage.backup_dir of <dbbackup.storage.s3_storage.Storage instance at 0x4078368>>, filename: default.backup
Traceback (most recent call last):
  File "manage.py", line 11, in <module>
    execute_from_command_line(sys.argv)
  File "/home/tpg/.virtualenvs/tpgenv/local/lib/python2.7/site-packages/django/core/management/__init__.py", line 399, in execute_from_command_line
    utility.execute()
  File "/home/tpg/.virtualenvs/tpgenv/local/lib/python2.7/site-packages/django/core/management/__init__.py", line 392, in execute
    self.fetch_command(subcommand).run_from_argv(self.argv)
  File "/home/tpg/.virtualenvs/tpgenv/local/lib/python2.7/site-packages/django/core/management/base.py", line 242, in run_from_argv
    self.execute(*args, **options.__dict__)
  File "/home/tpg/.virtualenvs/tpgenv/local/lib/python2.7/site-packages/django/core/management/base.py", line 285, in execute
    output = self.handle(*args, **options)
  File "/home/tpg/.virtualenvs/tpgenv/local/lib/python2.7/site-packages/dbbackup/utils.py", line 54, in wrapper
    func(*args, **kwargs)
  File "/home/tpg/.virtualenvs/tpgenv/local/lib/python2.7/site-packages/dbbackup/management/commands/dbbackup.py", line 53, in handle
    self.save_new_backup(database, database_key)
  File "/home/tpg/.virtualenvs/tpgenv/local/lib/python2.7/site-packages/dbbackup/management/commands/dbbackup.py", line 74, in save_new_backup
    self.storage.write_file(outputfile, filename)
  File "/home/tpg/.virtualenvs/tpgenv/local/lib/python2.7/site-packages/dbbackup/storage/s3_storage.py", line 63, in write_file
    tmpfile = StringIO(chunkdata)
TypeError: initial_value must be unicode or None, not str

Tutorial needs to show restore example

A great addition to the initial basic tutorial would be an inline restore example in addition to the existing backup example. Backup without restore isn't much of a backup :-)

Travis testing

This is not a classical tool to test! Ideally, we want to test it from outside. A .travis.yml could look something like this (sketch) :

language: python
python:
- '2.6'
- '2.7'
- '3.4'
install:
-  pip install -r requirements/development.txt
-  pip install coveralls
-  pip install django
script:
- cd testproject
- python manage.py syncdb --noinput --settings=settings.use_sqlite
- python manage.py dbbackup (...) --settings=settings.use_sqlite
- python manage.py syncdb --noinput --settings=settings.use_mysql
- python manage.py dbbackup (...) --settings=settings.use_mysql
- # Continue to do whatever changes are needed
notifications:
  irc: #django-dbbackup
after_success:
- coveralls

This requires the creation of testproject which should hold settings modules for every individual database backend that dbbackup supports.

Option for backup retention days

It would be great to have an option for the number of days backups are retained. If any files older than the number of retention days are found, the backups will be deleted.

This would be small to implement but a really helpful feature.

Thanks for a great Django module.


Database name in media backup breaks path if using sqlite

backup_media uses settings.DATABASES['default']['NAME'] to build its filename. When using sqlite the DB name might already be a path. (e.g. path/to/my/db/db.sqlite3) Therefore the output path will be corrupted. This causes filesyste_storeage to backup to wrong path and ftp storage to not find the file at all.

Solutions: 1. Don't use db name for media backups. Got nothing to do with DB anyway.
Fix the 2DO in line 56 of backup_media.py so database name can be excluded via DBBACKUP_FILENAME_TEMPLATE

Custom filename template not settable for S3?

Set the following variables:

DBBACKUP_STORAGE
DBBACKUP_S3_BUCKET
DBBACKUP_S3_ACCESS_KEY
DBBACKUP_S3_SECRET_KEY

as well as DBBACKUP_FILENAME_TEMPLATE according to the docs, returning a string. Still seems to be always setting it to default.backup when it ends up in S3, not even timestamped with date/time as the docs say.

I got around it for the time being with a monkeypatch, but it's obviously not ideal.

Fallback storage

This is not a bug actually, but a suggestion to make dbbackup more "backupier" :)
In case of failing saving backup to storage, backup file will be lost. For example, dropbox api sometimes gives 500 error and no files will be saved. To prevent this fallback storage could be used and settings changed to something similar to Django's database setttings:

DBBACKUP_STORAGES = {
    'default': {
        'MODULE': 'dbbackup.storage.dropbox_storage',
        'TOKENS_FILEPATH': '<local_tokens_filepath>',
        'APP_KEY': '<dropbox_app_key>',
        'APP_SECRET': '<dropbox_app_secret>',
    },
    'fallback': {
        'MODULE': 'dbbackup.storage.s3_storage',
        'BUCKET': '<amazon_bucket_name>',
        'ACCESS_KEY': '<amazon_access_key>',
        'SECRET_KEY': '<amazon_secret_key>',
    }
}

May be also add optional arg to manage.py command to restore either from default or fallback storage:
python manage.py dbrestore fallback

As a simpler alternative use more than one storage to backup to both everytime.

DBBACKUP_STORAGES = ('dbbackup.storage.dropbox_storage', 'dbbackup.storage.s3_storage')

Dropbox - File size limit

Can you please make constant FILE_SIZE_LIMIT of Dropbox storage configurable? 145MB is too low and Dropbox allows users to upload files of size 10GB.
Thank you.

Be explicit about django version support

Just added django>=1.5 to requirements.txt, however it's unsure if this is actually the current state of things. I think we should start by stating which Django versions we want to support and then express that in our requirements and in a tox.ini

Add SFTP Support

Im just wondering, why you don't provide an SFTP storage class? Is there some reasons or was it not needed by anybody yet? Alternatively i could take a look at it and create a pull request, if this feature is wanted.

Bug: "Exception Value: SpooledTemporaryFile instance has no attribute __len__"

I failed to run dbbackup, this exception keeps getting raised. It seems you are using SpooledTemporaryFile "file like objects" and pass them directly to dropbox client "put_file" method as "body" parameter, and it only supports file_like objects with "getvalue" method (like StringIO).
i'm attaching my "requirements.txt", the exception traceback, and my solution, which is to use cStringIO for the chunks.
if it makes any difference, this happens on my development setup, using sqlite. perhaps dropbox released a new package into pip that broke compatibility?
Thank you for this very useful module, Shlomi.

NOTE: Downgrading to dropbox==1.6.0 fixed the issue for me. It might be worth pinning requirements in setup.py, Michael.

Type error with backup command

Found this error while trying to backup my database:

Backing Up Database: scing_db
Running: mysqldump --user=* --password=* --port=8001 scing_db
Traceback (most recent call last):
File "manage.py", line 10, in
execute_from_command_line(sys.argv)
File "C:\Python27\lib\site-packages\django\core\management__init__.py", line
338, in execute_from_command_line
utility.execute()
File "C:\Python27\lib\site-packages\django\core\management__init__.py", line
330, in execute
self.fetch_command(subcommand).run_from_argv(self.argv)
File "C:\Python27\lib\site-packages\django\core\management\base.py", line 390,
in run_from_argv
self.execute(_args, *_cmd_options)
File "C:\Python27\lib\site-packages\django\core\management\base.py", line 441,
in execute
output = self.handle(_args, *_options)
File "c:\users\jesus gomez\workspace\scing\src\django-dbbackup\dbbackup\utils.
py", line 62, in wrapper
body = reporter.get_traceback_html()
File "C:\Python27\lib\site-packages\django\views\debug.py", line 384, in get_t
raceback_html
return t.render(c)
File "C:\Python27\lib\site-packages\django\template\base.py", line 209, in ren
der
return self._render(context)
File "C:\Python27\lib\site-packages\django\template\base.py", line 201, in _re
nder
return self.nodelist.render(context)
File "C:\Python27\lib\site-packages\django\template\base.py", line 903, in ren
der
bit = self.render_node(node, context)
File "C:\Python27\lib\site-packages\django\template\debug.py", line 79, in ren
der_node
return node.render(context)
File "C:\Python27\lib\site-packages\django\template\debug.py", line 89, in ren
der
output = self.filter_expression.resolve(context)
File "C:\Python27\lib\site-packages\django\template\base.py", line 674, in res
olve
new_obj = func(obj, *arg_vals)
File "C:\Python27\lib\site-packages\django\template\defaultfilters.py", line 7
71, in date
return formats.date_format(value, arg)
File "C:\Python27\lib\site-packages\django\utils\formats.py", line 136, in dat
e_format
return dateformat.format(value, get_format(format or 'DATE_FORMAT', use_l10n
=use_l10n))
File "C:\Python27\lib\site-packages\django\utils\formats.py", line 110, in get
format
for module in get_format_modules(lang):
File "C:\Python27\lib\site-packages\django\utils\formats.py", line 82, in get

format_modules
modules = format_modules_cache.setdefault(lang, list(iter_format_modules(la
ng, settings.FORMAT_MODULE_PATH)))
File "C:\Python27\lib\site-packages\django\utils\formats.py", line 51, in iter
format_modules
if not check_for_language(lang):
File "C:\Python27\lib\site-packages\django\utils\translation__init
.py", lin
e 181, in check_for_language
return _trans.check_for_language(lang_code)
File "C:\Python27\lib\site-packages\django\utils\lru_cache.py", line 125, in w
rapper
result = user_function(_args, *_kwds)
File "C:\Python27\lib\site-packages\django\utils\translation\trans_real.py", l
ine 409, in check_for_language
if not language_code_re.search(lang_code):
TypeError: expected string or buffer

on a side note: pip install doesn't include all the needed dependencies when installing this package and the docs are missing the necesary "six package" for said import to work

Optional TMP directory

Hello,

Is it possible to make a setting that tells which directory we should use for temp files?
It would be helpful in case if media backup is larger than a space we have in /tmp/.

Thanks,

Backups in amazon glacier

A new module for uploading backup service Amazon glaciers, as this service is much more attractive to store backups to be aimed at maintaining long-term archives without constantly using them, and is cheaper than Amazon S3 .

KeyError: 'USER' while using SQLite

While using dbbackup and restore commands for backing up an SQLite database, a 'KeyError: 'USER'' error is shown.
There's no USER in settings.DATABASES as it is an optional setting in SQLite.

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    ๐Ÿ–– Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. ๐Ÿ“Š๐Ÿ“ˆ๐ŸŽ‰

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google โค๏ธ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.