def check_upgrade(): fix_custom_dir() fix_ccent_conf() fix_seafevents_conf() last_version = read_version_stamp() current_version = os.environ['SEAFILE_VERSION'] if last_version == current_version: fix_media_symlinks(current_version) return elif is_minor_upgrade(last_version, current_version): run_minor_upgrade(current_version) return # Now we do the major upgrade scripts_to_run = collect_upgrade_scripts(from_version=last_version, to_version=current_version) for script in scripts_to_run: loginfo('Running scripts {}'.format(script)) # Here we use a trick: use a version stamp like 6.1.0 to prevent running # all upgrade scripts before 6.1 again (because 6.1 < 6.1.0 in python) new_version = parse_upgrade_script_version(script)[1] + '.0' run_script_and_update_version_stamp(script, new_version) update_version_stamp(current_version)
def check_upgrade(): last_version = read_version_stamp() current_version = os.environ['SEAFILE_VERSION'] if last_version == current_version: return scripts_to_run = collect_upgrade_scripts(from_version=last_version, to_version=current_version) for script in scripts_to_run: loginfo('Running scripts {}'.format(script)) new_version = parse_upgrade_script_version(script)[1] + '.0' replace_file_pattern(script, 'read dummy', '') call(script) update_version_stamp(new_version) update_version_stamp(current_version)
def check_upgrade(): last_version = read_version_stamp() current_version = os.environ['SEAFILE_VERSION'] if last_version == current_version: return scripts_to_run = collect_upgrade_scripts(from_version=last_version, to_version=current_version) for script in scripts_to_run: loginfo('Running scripts {}'.format(script)) # Here we use a trick: use a version stamp like 6.1.0 to prevent running # all upgrade scripts before 6.1 again (because 6.1 < 6.1.0 in python) new_version = parse_upgrade_script_version(script)[1] + '.0' replace_file_pattern(script, 'read dummy', '') call(script) update_version_stamp(new_version) update_version_stamp(current_version)
def init_seafile_server(): version_stamp_file = get_version_stamp_file() if exists(join(shared_seafiledir, 'seafile-data')): if not exists(version_stamp_file): update_version_stamp(os.environ['SEAFILE_VERSION']) # sysbol link unlink after docker finish. latest_version_dir='/opt/seafile/seafile-server-latest' current_version_dir='/opt/seafile/' + get_conf('SEAFILE_SERVER', 'seafile-server') + '-' + read_version_stamp() if not exists(latest_version_dir): call('ln -sf ' + current_version_dir + ' ' + latest_version_dir) loginfo('Skip running setup-seafile-mysql.py because there is existing seafile-data folder.') return loginfo('Now running setup-seafile-mysql.py in auto mode.') env = { 'SERVER_NAME': 'seafile', 'SERVER_IP': get_conf('SEAFILE_SERVER_HOSTNAME', 'seafile.example.com'), 'MYSQL_USER': '******', 'MYSQL_USER_PASSWD': str(uuid.uuid4()), 'MYSQL_USER_HOST': '127.0.0.1', # Default MariaDB root user has empty password and can only connect from localhost. 'MYSQL_ROOT_PASSWD': '', } # Change the script to allow mysql root password to be empty call('''sed -i -e 's/if not mysql_root_passwd/if not mysql_root_passwd and "MYSQL_ROOT_PASSWD" not in os.environ/g' {}''' .format(get_script('setup-seafile-mysql.py'))) setup_script = get_script('setup-seafile-mysql.sh') call('{} auto -n seafile'.format(setup_script), env=env) domain = get_conf('SEAFILE_SERVER_HOSTNAME', 'seafile.example.com') proto = 'https' if is_https() else 'http' with open(join(topdir, 'conf', 'seahub_settings.py'), 'a+') as fp: fp.write('\n') fp.write("""CACHES = { 'default': { 'BACKEND': 'django_pylibmc.memcached.PyLibMCCache', 'LOCATION': '127.0.0.1:11211', }, 'locmem': { 'BACKEND': 'django.core.cache.backends.locmem.LocMemCache', }, } COMPRESS_CACHE_BACKEND = 'locmem'""") fp.write('\n') fp.write('FILE_SERVER_ROOT = "{proto}://{domain}/seafhttp"'.format(proto=proto, domain=domain)) fp.write('\n') # By default ccnet-server binds to the unix socket file # "/opt/seafile/ccnet/ccnet.sock", but /opt/seafile/ccnet/ is a mounted # volume from the docker host, and on windows and some linux environment # it's not possible to create unix sockets in an external-mounted # directories. So we change the unix socket file path to # "/opt/seafile/ccnet.sock" to avoid this problem. with open(join(topdir, 'conf', 'ccnet.conf'), 'a+') as fp: fp.write('\n') fp.write('[Client]\n') fp.write('UNIX_SOCKET = /opt/seafile/ccnet.sock\n') fp.write('\n') # After the setup script creates all the files inside the # container, we need to move them to the shared volume # # e.g move "/opt/seafile/seafile-data" to "/shared/seafile/seafile-data" files_to_copy = ['conf', 'ccnet', 'seafile-data', 'seahub-data', 'pro-data'] for fn in files_to_copy: src = join(topdir, fn) dst = join(shared_seafiledir, fn) if not exists(dst) and exists(src): shutil.move(src, shared_seafiledir) call('ln -sf ' + join(shared_seafiledir, fn) + ' ' + src) loginfo('Updating version stamp') update_version_stamp(os.environ['SEAFILE_VERSION'])
def init_seafile_server(): version_stamp_file = get_version_stamp_file() if exists(join(shared_seafiledir, 'seafile-data')): if not exists(version_stamp_file): update_version_stamp(os.environ['SEAFILE_VERSION']) # sysbol link unlink after docker finish. latest_version_dir = '/opt/seafile/seafile-server-latest' current_version_dir = '/opt/seafile/' + get_conf( 'SEAFILE_SERVER', 'seafile-server') + '-' + read_version_stamp() if not exists(latest_version_dir): call('ln -sf ' + current_version_dir + ' ' + latest_version_dir) loginfo( 'Skip running setup-seafile-mysql.py because there is existing seafile-data folder.' ) return loginfo('Now running setup-seafile-mysql.py in auto mode.') env = { 'SERVER_NAME': 'seafile', 'SERVER_IP': get_conf('SEAFILE_SERVER_HOSTNAME', 'seafile.example.com'), 'MYSQL_USER': '******', 'MYSQL_USER_PASSWD': str(uuid.uuid4()), 'MYSQL_USER_HOST': '%.%.%.%', 'MYSQL_HOST': get_conf('DB_HOST', '127.0.0.1'), # Default MariaDB root user has empty password and can only connect from localhost. 'MYSQL_ROOT_PASSWD': get_conf('DB_ROOT_PASSWD', ''), } # Change the script to allow mysql root password to be empty # call('''sed -i -e 's/if not mysql_root_passwd/if not mysql_root_passwd and "MYSQL_ROOT_PASSWD" not in os.environ/g' {}''' # .format(get_script('setup-seafile-mysql.py'))) # Change the script to disable check MYSQL_USER_HOST call( '''sed -i -e '/def validate_mysql_user_host(self, host)/a \ \ \ \ \ \ \ \ return host' {}''' .format(get_script('setup-seafile-mysql.py'))) call( '''sed -i -e '/def validate_mysql_host(self, host)/a \ \ \ \ \ \ \ \ return host' {}''' .format(get_script('setup-seafile-mysql.py'))) setup_script = get_script('setup-seafile-mysql.sh') call('{} auto -n seafile'.format(setup_script), env=env) domain = get_conf('SEAFILE_SERVER_HOSTNAME', 'seafile.example.com') proto = 'https' if is_https() else 'http' with open(join(topdir, 'conf', 'seahub_settings.py'), 'a+') as fp: fp.write('\n') fp.write("""CACHES = { 'default': { 'BACKEND': 'django_pylibmc.memcached.PyLibMCCache', 'LOCATION': 'memcached:11211', }, 'locmem': { 'BACKEND': 'django.core.cache.backends.locmem.LocMemCache', }, } COMPRESS_CACHE_BACKEND = 'locmem'""") fp.write('\n') fp.write("TIME_ZONE = '{time_zone}'".format( time_zone=os.getenv('TIME_ZONE', default='Etc/UTC'))) fp.write('\n') fp.write('FILE_SERVER_ROOT = "{proto}://{domain}/seafhttp"'.format( proto=proto, domain=domain)) fp.write('\n') # By default ccnet-server binds to the unix socket file # "/opt/seafile/ccnet/ccnet.sock", but /opt/seafile/ccnet/ is a mounted # volume from the docker host, and on windows and some linux environment # it's not possible to create unix sockets in an external-mounted # directories. So we change the unix socket file path to # "/opt/seafile/ccnet.sock" to avoid this problem. with open(join(topdir, 'conf', 'ccnet.conf'), 'a+') as fp: fp.write('\n') fp.write('[Client]\n') fp.write('UNIX_SOCKET = /opt/seafile/ccnet.sock\n') fp.write('\n') # Disabled the Elasticsearch process on Seafile-container # Connection to the Elasticsearch-container if os.path.exists(join(topdir, 'conf', 'seafevents.conf')): with open(join(topdir, 'conf', 'seafevents.conf'), 'r') as fp: fp_lines = fp.readlines() if '[INDEX FILES]\n' in fp_lines: insert_index = fp_lines.index('[INDEX FILES]\n') + 1 insert_lines = [ 'es_port = 9200\n', 'es_host = elasticsearch\n', 'external_es_server = true\n' ] for line in insert_lines: fp_lines.insert(insert_index, line) # office if '[OFFICE CONVERTER]\n' in fp_lines: insert_index = fp_lines.index('[OFFICE CONVERTER]\n') + 1 insert_lines = ['host = 127.0.0.1\n', 'port = 6000\n'] for line in insert_lines: fp_lines.insert(insert_index, line) with open(join(topdir, 'conf', 'seafevents.conf'), 'w') as fp: fp.writelines(fp_lines) # office with open(join(topdir, 'conf', 'seahub_settings.py'), 'r') as fp: fp_lines = fp.readlines() if "OFFICE_CONVERTOR_ROOT = 'http://127.0.0.1:6000/'\n" not in fp_lines: fp_lines.append( "OFFICE_CONVERTOR_ROOT = 'http://127.0.0.1:6000/'\n") with open(join(topdir, 'conf', 'seahub_settings.py'), 'w') as fp: fp.writelines(fp_lines) # After the setup script creates all the files inside the # container, we need to move them to the shared volume # # e.g move "/opt/seafile/seafile-data" to "/shared/seafile/seafile-data" files_to_copy = [ 'conf', 'ccnet', 'seafile-data', 'seahub-data', 'pro-data' ] for fn in files_to_copy: src = join(topdir, fn) dst = join(shared_seafiledir, fn) if not exists(dst) and exists(src): shutil.move(src, shared_seafiledir) call('ln -sf ' + join(shared_seafiledir, fn) + ' ' + src) loginfo('Updating version stamp') update_version_stamp(os.environ['SEAFILE_VERSION'])
def init_seafile_server(): version_stamp_file = get_version_stamp_file() if exists(join(shared_seafiledir, 'seafile-data')): if not exists(version_stamp_file): update_version_stamp(os.environ['SEAFILE_VERSION']) # sysbol link unlink after docker finish. latest_version_dir = '/opt/seafile/seafile-server-latest' current_version_dir = '/opt/seafile/' + get_conf( 'SEAFILE_SERVER', 'seafile-server') + '-' + read_version_stamp() if not exists(latest_version_dir): call('ln -sf ' + current_version_dir + ' ' + latest_version_dir) loginfo( 'Skip running setup-seafile-mysql.py because there is existing seafile-data folder.' ) return loginfo('Now running setup-seafile-mysql.py in auto mode.') env = { 'SERVER_NAME': 'seafile', 'SERVER_IP': get_conf('SEAFILE_SERVER_HOSTNAME', 'seafile.example.com'), 'MYSQL_USER': '******', 'MYSQL_USER_PASSWD': str(uuid.uuid4()), 'MYSQL_USER_HOST': '127.0.0.1', # Default MariaDB root user has empty password and can only connect from localhost. 'MYSQL_ROOT_PASSWD': '', } # Change the script to allow mysql root password to be empty call( '''sed -i -e 's/if not mysql_root_passwd/if not mysql_root_passwd and "MYSQL_ROOT_PASSWD" not in os.environ/g' {}''' .format(get_script('setup-seafile-mysql.py'))) setup_script = get_script('setup-seafile-mysql.sh') call('{} auto -n seafile'.format(setup_script), env=env) domain = get_conf('SEAFILE_SERVER_HOSTNAME', 'seafile.example.com') proto = 'https' if is_https() else 'http' with open(join(topdir, 'conf', 'seahub_settings.py'), 'a+') as fp: fp.write('\n') fp.write("""CACHES = { 'default': { 'BACKEND': 'django_pylibmc.memcached.PyLibMCCache', 'LOCATION': '127.0.0.1:11211', }, 'locmem': { 'BACKEND': 'django.core.cache.backends.locmem.LocMemCache', }, } COMPRESS_CACHE_BACKEND = 'locmem' OFFICE_CONVERTOR_ROOT = 'http://127.0.0.1:6000/'\n""") fp.write("\nFILE_SERVER_ROOT = '{proto}://{domain}/seafhttp'\n".format( proto=proto, domain=domain)) fp.write(""" TIME_ZONE = 'Europe/Berlin' SITE_BASE = 'http://127.0.0.1' SITE_NAME = 'Seafile Server' SITE_TITLE = 'Seafile Server' SITE_ROOT = '/' ENABLE_SIGNUP = False ACTIVATE_AFTER_REGISTRATION = False SEND_EMAIL_ON_ADDING_SYSTEM_MEMBER = True SEND_EMAIL_ON_RESETTING_USER_PASSWD = True CLOUD_MODE = False FILE_PREVIEW_MAX_SIZE = 30 * 1024 * 1024 SESSION_COOKIE_AGE = 60 * 60 * 24 * 7 * 2 SESSION_SAVE_EVERY_REQUEST = False SESSION_EXPIRE_AT_BROWSER_CLOSE = False\n""") # By default ccnet-server binds to the unix socket file # "/opt/seafile/ccnet/ccnet.sock", but /opt/seafile/ccnet/ is a mounted # volume from the docker host, and on windows and some linux environment # it's not possible to create unix sockets in an external-mounted # directories. So we change the unix socket file path to # "/opt/seafile/ccnet.sock" to avoid this problem. with open(join(topdir, 'conf', 'ccnet.conf'), 'a+') as fp: fp.write('\n') fp.write('[Client]\n') fp.write('UNIX_SOCKET = /opt/seafile/ccnet.sock\n') fp.write('\n') # Disabled the Elasticsearch process on Seafile-container # Connection to the Elasticsearch-container with open(join(topdir, 'conf', 'seafevents.conf'), 'r') as fp: seafevents_lines = fp.readlines() # es es_insert_index = seafevents_lines.index('[INDEX FILES]\n') + 1 es_insert_lines = [ 'external_es_server = true\n', 'es_host = 127.0.0.1\n', 'es_port = 9200\n' ] for line in es_insert_lines: seafevents_lines.insert(es_insert_index, line) # office office_insert_index = seafevents_lines.index( '[OFFICE CONVERTER]\n') + 1 office_insert_lines = ['host = 127.0.0.1\n', 'port = 6000\n'] for line in office_insert_lines: seafevents_lines.insert(office_insert_index, line) with open(join(topdir, 'conf', 'seafevents.conf'), 'w') as fp: fp.writelines(seafevents_lines) files_to_copy = [ 'conf', 'ccnet', 'seafile-data', 'seahub-data', 'pro-data' ] for fn in files_to_copy: src = join(topdir, fn) dst = join(shared_seafiledir, fn) if not exists(dst) and exists(src): shutil.move(src, shared_seafiledir) call('ln -sf ' + join(shared_seafiledir, fn) + ' ' + src) loginfo('Updating version stamp') update_version_stamp(os.environ['SEAFILE_VERSION'])
def init_seafile_server(): version_stamp_file = get_version_stamp_file() if exists(join(shared_seafiledir, 'seafile-data')): if not exists(version_stamp_file): update_version_stamp(os.environ['SEAFILE_VERSION']) # sysbol link unlink after docker finish. latest_version_dir = '/opt/seafile/seafile-server-latest' current_version_dir = '/opt/seafile/' + get_conf( 'SEAFILE_SERVER', 'seafile-server') + '-' + read_version_stamp() if not exists(latest_version_dir): call('ln -sf ' + current_version_dir + ' ' + latest_version_dir) loginfo( 'Skip running setup-seafile.sh because there is existing seafile-data folder.' ) return False loginfo('Now running setup-seafile.sh in auto mode.') env = { 'SERVER_NAME': 'seafile', 'SERVER_IP': get_conf('SEAFILE_SERVER_HOSTNAME', 'seafile.example.com'), } setup_script = get_script('setup-seafile.sh') call('{} auto -n seafile'.format(setup_script), env=env) domain = get_conf('SEAFILE_SERVER_HOSTNAME', 'seafile.example.com') proto = 'https' if is_https() else 'http' with open(join(topdir, 'conf', 'seahub_settings.py'), 'a+') as fp: fp.write('\n') fp.write("TIME_ZONE = '{time_zone}'".format( time_zone=os.getenv('TIME_ZONE', default='Etc/UTC'))) fp.write('\n') fp.write('FILE_SERVER_ROOT = "{proto}://{domain}/seafhttp"'.format( proto=proto, domain=domain)) fp.write('\n') # By default ccnet-server binds to the unix socket file # "/opt/seafile/ccnet/ccnet.sock", but /opt/seafile/ccnet/ is a mounted # volume from the docker host, and on windows and some linux environment # it's not possible to create unix sockets in an external-mounted # directories. So we change the unix socket file path to # "/opt/seafile/ccnet.sock" to avoid this problem. with open(join(topdir, 'conf', 'ccnet.conf'), 'a+') as fp: fp.write('\n') fp.write('[Client]\n') fp.write('UNIX_SOCKET = /opt/seafile/ccnet.sock\n') fp.write('\n') # After the setup script creates all the files inside the # container, we need to move them to the shared volume # # e.g move "/opt/seafile/seafile-data" to "/shared/seafile/seafile-data" files_to_copy = [ 'conf', 'ccnet', 'seafile-data', 'seahub-data', 'pro-data', 'seahub.db', 'logs' ] for fn in files_to_copy: src = join(topdir, fn) dst = join(shared_seafiledir, fn) if not exists(dst) and exists(src): shutil.move(src, shared_seafiledir) call('ln -sf ' + join(shared_seafiledir, fn) + ' ' + src) call('rsync -axk --delete --exclude "CACHE" ' + join(topdir, 'seafile-server-' + seafile_version, 'seahub', 'media') + ' ' + nginx) call('rsync -ax --delete ' + join(topdir, 'seahub-data', 'avatars') + ' ' + join(nginx, 'media')) if not exists(join(topdir, 'seahub-data', 'custom')): call('mkdir -p ' + join(topdir, 'seahub-data', 'custom')) call('rsync -ax --delete ' + join(topdir, 'seahub-data', 'custom') + ' ' + join(nginx, 'media')) if not exists(join(nginx, 'media', 'CACHE')): call('mkdir -p ' + join(nginx, 'media', 'CACHE')) if not islink( join(topdir, 'seafile-server-' + seafile_version, 'seahub', 'media', 'CACHE')): call('ln -sf ' + join(nginx, 'media', 'CACHE') + ' ' + join(topdir, 'seafile-server-' + seafile_version, 'seahub', 'media', 'CACHE')) loginfo('Updating version stamp') update_version_stamp(os.environ['SEAFILE_VERSION']) return True
def init_seafile_server(): version_stamp_file = get_version_stamp_file() if exists(join(shared_seafiledir, 'seafile-data')): if not exists(version_stamp_file): update_version_stamp(os.environ['SEAFILE_VERSION']) # sysbol link unlink after docker finish. latest_version_dir = '/opt/seafile/seafile-server-latest' current_version_dir = '/opt/seafile/' + get_conf( 'SEAFILE_SERVER', 'seafile-server') + '-' + read_version_stamp() if not exists(latest_version_dir): call('ln -sf ' + current_version_dir + ' ' + latest_version_dir) loginfo( 'Skip running setup-seafile-mysql.py because there is existing seafile-data folder.' ) return loginfo('Now running setup-seafile-mysql.py in auto mode.') env = utils.settings.from_environment() # Change the script to allow mysql root password to be empty # call('''sed -i -e 's/if not mysql_root_passwd/if not mysql_root_passwd and "MYSQL_ROOT_PASSWD" not in os.environ/g' {}''' # .format(get_script('setup-seafile-mysql.py'))) # Change the script to disable check MYSQL_USER_HOST call( '''sed -i -e '/def validate_mysql_user_host(self, host)/a \ \ \ \ \ \ \ \ return host' {}''' .format(get_script('setup-seafile-mysql.py'))) call( '''sed -i -e '/def validate_mysql_host(self, host)/a \ \ \ \ \ \ \ \ return host' {}''' .format(get_script('setup-seafile-mysql.py'))) # Change SQL for seahub db to not fail if tables or records are there. #https://github.com/haiwen/seafile-server/issues/188 call('''sed -i -Ee 's@(CREATE TABLE\s+)`@\\1 IF NOT EXISTS `@gi' {}'''. format(get_script('seahub/sql/mysql.sql'))) call('''sed -i -Ee 's@INSERT INTO\s+`@INSERT IGNORE `@gi' {}'''.format( get_script('seahub/sql/mysql.sql'))) setup_script = get_script('setup-seafile-mysql.sh') #logdbg(" env is: " + str(env)) call('{} auto -n seafile'.format(setup_script), env=env) settings = utils.settings.read_them( ) # previous call might have written something already utils.settings.update_from_env(settings, env) utils.settings.write_them(settings) # By default ccnet-server binds to the unix socket file # "/opt/seafile/ccnet/ccnet.sock", but /opt/seafile/ccnet/ is a mounted # volume from the docker host, and on windows and some linux environment # it's not possible to create unix sockets in an external-mounted # directories. So we change the unix socket file path to # "/opt/seafile/ccnet.sock" to avoid this problem. with open(join(topdir, 'conf', 'ccnet.conf'), 'a+') as fp: fp.write('\n') fp.write('[Client]\n') fp.write('UNIX_SOCKET = /opt/seafile/ccnet.sock\n') fp.write('\n') # Disabled the Elasticsearch process on Seafile-container # Connection to the Elasticsearch-container if os.path.exists(join(topdir, 'conf', 'seafevents.conf')): with open(join(topdir, 'conf', 'seafevents.conf'), 'r') as fp: fp_lines = fp.readlines() if '[INDEX FILES]\n' in fp_lines: insert_index = fp_lines.index('[INDEX FILES]\n') + 1 insert_lines = [ 'es_port = 9200\n', 'es_host = elasticsearch\n', 'external_es_server = true\n' ] for line in insert_lines: fp_lines.insert(insert_index, line) with open(join(topdir, 'conf', 'seafevents.conf'), 'w') as fp: fp.writelines(fp_lines) # After the setup script creates all the files inside the # container, we need to move them to the shared volume # # e.g move "/opt/seafile/seafile-data" to "/shared/seafile/seafile-data" files_to_copy = [ 'conf', 'ccnet', 'seafile-data', 'seahub-data', 'pro-data' ] for fn in files_to_copy: src = join(topdir, fn) dst = join(shared_seafiledir, fn) if not exists(dst) and exists(src): shutil.move(src, shared_seafiledir) call('ln -sf ' + join(shared_seafiledir, fn) + ' ' + src) loginfo('Updating version stamp') update_version_stamp(os.environ['SEAFILE_VERSION'])
def init_seafile_server(): version_stamp_file = get_version_stamp_file() if exists(join(shared_seafiledir, 'seafile-data')): if not exists(version_stamp_file): update_version_stamp(os.environ['SEAFILE_VERSION']) # sysbol link unlink after docker finish. latest_version_dir = '/opt/seafile/seafile-server-latest' current_version_dir = '/opt/seafile/' + get_conf( 'SEAFILE_SERVER', 'seafile-server') + '-' + read_version_stamp() if not exists(latest_version_dir): call('ln -sf ' + current_version_dir + ' ' + latest_version_dir) loginfo( 'Skip running setup-seafile-mysql.py because there is existing seafile-data folder.' ) log_dir = join(shared_seafiledir, 'logs') if not exists(log_dir): os.mkdir(log_dir) files_to_link = [ 'conf', 'ccnet', 'seafile-data', 'seahub-data', 'pro-data', 'logs' ] for fn in files_to_link: src = join(shared_seafiledir, fn) dst = join(topdir, fn) if not exists(dst) and exists(src): call('ln -sf ' + src + ' ' + dst) return loginfo('Now running setup-seafile-mysql.py in auto mode.') env = { 'SERVER_NAME': 'seafile', 'SERVER_IP': get_conf('SEAFILE_SERVER_HOSTNAME', '127.0.0.1'), 'MYSQL_USER': get_conf('MYSQL_USER', 'root'), 'MYSQL_USER_PASSWD': get_conf('DB_USER_PASSWD', '123'), 'MYSQL_USER_HOST': get_conf('DB_HOST', '127.0.0.1'), 'MYSQL_HOST': get_conf('DB_HOST', '127.0.0.1'), 'MYSQL_ROOT_PASSWD': get_conf('DB_ROOT_PASSWD', ''), 'USE_EXISTING_DB': get_conf('USE_EXISTING_DB', '0'), 'CCNET_DB': get_conf('CCNET_DB', 'ccnet_db'), 'SEAFILE_DB': get_conf('SEAFILE_DB', 'seafile_db'), 'SEAHUB_DB': get_conf('SEAHUB_DB', 'seahub_db') } # Change the script to allow mysql root password to be empty call( '''sed -i -e 's/if not mysql_root_passwd/if not mysql_root_passwd and "MYSQL_ROOT_PASSWD" not in os.environ/g' {}''' .format(get_script('setup-seafile-mysql.py'))) call( '''sed -i -e '/def validate_mysql_user_host(self, host)/a \ \ \ \ \ \ \ \ return host' {}''' .format(get_script('setup-seafile-mysql.py'))) call( '''sed -i -e '/def validate_mysql_host(self, host)/a \ \ \ \ \ \ \ \ return host' {}''' .format(get_script('setup-seafile-mysql.py'))) setup_script = get_script('setup-seafile-mysql.sh') call('{} auto -n seafile'.format(setup_script), env=env) domain = get_conf('SEAFILE_SERVER_HOSTNAME', 'seafile.example.com') proto = 'https' if is_https() else 'http' with open(join(topdir, 'conf', 'seahub_settings.py'), 'a+') as fp: fp.write('\n') fp.write(""" CACHES = { 'default': { 'BACKEND': 'django_pylibmc.memcached.PyLibMCCache', 'LOCATION': '%s:11211', }, 'locmem': { 'BACKEND': 'django.core.cache.backends.locmem.LocMemCache', }, } COMPRESS_CACHE_BACKEND = 'locmem' FILE_SERVER_ROOT = '%s://%s/seafhttp' """ % (get_conf('MEMCACHED', 'memcached'), proto, domain)) fp.write('\n') fp.write("TIME_ZONE = '{time_zone}'".format( time_zone=os.getenv('TIME_ZONE', default='Etc/UTC'))) fp.write('\n') # By default ccnet-server binds to the unix socket file # "/opt/seafile/ccnet/ccnet.sock", but /opt/seafile/ccnet/ is a mounted # volume from the docker host, and on windows and some linux environment # it's not possible to create unix sockets in an external-mounted # directories. So we change the unix socket file path to # "/opt/seafile/ccnet.sock" to avoid this problem. with open(join(topdir, 'conf', 'ccnet.conf'), 'a+') as fp: fp.write('\n') fp.write('[Client]\n') fp.write('UNIX_SOCKET = /opt/seafile/ccnet.sock\n') fp.write('\n') # After the setup script creates all the files inside the # container, we need to move them to the shared volume # # e.g move "/opt/seafile/seafile-data" to "/shared/seafile/seafile-data" log_dir = join(topdir, 'logs') if not exists(log_dir): os.mkdir(log_dir) files_to_copy = [ 'conf', 'ccnet', 'seafile-data', 'seahub-data', 'pro-data', 'logs' ] for fn in files_to_copy: src = join(topdir, fn) dst = join(shared_seafiledir, fn) if not exists(dst) and exists(src): shutil.move(src, shared_seafiledir) call('ln -sf ' + join(shared_seafiledir, fn) + ' ' + src) generate_seafevents_conf() loginfo('Updating version stamp') update_version_stamp(os.environ['SEAFILE_VERSION'])