Seafile
TODO - seafile 11 is in beta and mysql is required.
Seafile is a cloud storage system, similar to google drive. It stands out for being simpler and faster than it’s peers. It’s also open source.
Preparation
You’ll need a linux server. We use Debian 12 in this example and instructions are based on Seafile’s SQLite instructions, updated for the new OS.
cffi build issues[^cffi],
and a python virtual environement so apt and pip packages play nice.
# The main requirements
sudo apt install -y memcached libmemcached-dev pwgen sqlite3
sudo systemctl enable --now memcached
# Python specific things
sudo apt install -y python3 python3-setuptools python3-pip
sudo apt install python3-wheel python3-django python3-django-captcha python3-future python3-willow python3-pylibmc python3-jinja2 python3-psd-tools python3-pycryptodome python3-cffi
# cffi build requirements
sudo apt install -y build-essential libssl-dev libffi-dev python-dev-is-python3
# Install the service account and create a python virtual environment for them
sudo apt install python3-venv
sudo useradd --home-dir /opt/seafile --system --comment "Seafile Service Account" --create-home seafile
sudo -i -u seafile
python3 -m venv .venv
source .venv/bin/activate
# Install the rest of the packages from pip
pip3 install --timeout=3600 \
wheel django django-pylibmc django-simple-captcha future \
Pillow pylibmc captcha jinja2 psd-tools pycryptodome cffi
192.168.1.21:/srv/seafile /srv/seafile nfs defaults,noatime,vers=4.1 0 0
Installation
It comes with two services. Seafile, the file sync server, and Seahub, a web interface and editor.
For a small team, you can install a lightweight instance of Seafile using a single host and sqlite.
Note: There is a seafile repo, but it may be [client] only. TODO test this
As per the install [instructions] this will create several folders in seafile’s home directory and a symlink to the binaries in a version specific directory for easy upgrades.
# Contine as the seafile user - the python venv should still be in effect. If not, source as before
# Downlaod and exract the binary
wget -P /tmp https://s3.eu-central-1.amazonaws.com/download.seadrive.org/seafile-server_10.0.1_x86-64.tar.gz
tar -xzf /tmp/seafile-server_10.0.1_x86-64.tar.gz -C /opt/seafile/
rm /tmp/seafile*
# Run the setup script
cd /opt/seafile/sea*
./setup-seafile.sh
# Start seafile and seahub to answer some setup questions
./seafile.sh start
./seahub.sh start
./seahub.sh stop
./seafile.sh stop
Create systemd service files1 for the two services. (as a sudo capable user)
sudo tee /etc/systemd/system/seafile.service << EOF
[Unit]
Description=Seafile
After=network.target
[Service]
Type=forking
ExecStart=/opt/seafile/seafile-server-latest/seafile.sh start
ExecStop=/opt/seafile/seafile-server-latest/seafile.sh stop
LimitNOFILE=infinity
User=seafile
Group=seafile
[Install]
WantedBy=multi-user.target
EOF
Note: The ExecStart below is a bit cumbersome, but it saves modifying the vendor’s start script. Only the Seahub service seems to need the virtual env, though you can give both services the same treatment if you wish.
sudo tee /etc/systemd/system/seahub.service << EOF
[Unit]
Description=Seafile hub
After=network.target seafile.service
[Service]
Type=forking
ExecStart=/bin/bash -c 'source /opt/seafile/.venv/bin/activate && /opt/seafile/seafile-server-latest/seahub.sh start'
ExecStop=/bin/bash -c 'source /opt/seafile/.venv/bin/activate && /opt/seafile/seafile-server-latest/seahub.sh stop'
User=seafile
Group=seafile
[Install]
WantedBy=multi-user.target
EOF
sudo systemctl enable --now seafile.service
sudo systemctl enable --now seahub.service
Seafile and Seahub should have started without error, though by default you can only access it from locahost.
If you run into problems here make sure to start Seafile first. Expiriment with sourcing the activation file as the seafile user and running the start script directly.
Add logrotation
sudo tee /etc/logrotate.d/seafile << EOF
/opt/seafile/logs/seafile.log
/opt/seafile/logs/seahub.log
/opt/seafile/logs/file_updates_sender.log
/opt/seafile/logs/repo_old_file_auto_del_scan.log
/opt/seafile/logs/seahub_email_sender.log
/opt/seafile/logs/work_weixin_notice_sender.log
/opt/seafile/logs/index.log
/opt/seafile/logs/content_scan.log
/opt/seafile/logs/fileserver-access.log
/opt/seafile/logs/fileserver-error.log
/opt/seafile/logs/fileserver.log
{
daily
missingok
rotate 7
# compress
# delaycompress
dateext
dateformat .%Y-%m-%d
notifempty
# create 644 root root
sharedscripts
postrotate
if [ -f /opt/seafile/pids/seaf-server.pid ]; then
kill -USR1 `cat /opt/seafile/pids/seaf-server.pid`
fi
if [ -f /opt/seafile/pids/fileserver.pid ]; then
kill -USR1 `cat /opt/seafile/pids/fileserver.pid`
fi
if [ -f /opt/seafile/pids/seahub.pid ]; then
kill -HUP `cat /opt/seafile/pids/seahub.pid`
fi
find /opt/seafile/logs/ -mtime +7 -name "*.log*" -exec rm -f {} \;
endscript
}
EOF
Configuration
Seahub (the web UI) by default is bound to localhost only. Change that to all addresses so you can access it from other systems.
sudo sed -i 's/^bind.*/bind = "0.0.0.0:8000"/' /opt/seafile/conf/gunicorn.conf.py
If you’re not proxying already, check the seahub settings. You may need to add the correct internal name and port for ititial access. You should add the file server root as well so you don’t have to add it in the GUI later.
vi /opt/seafile/conf/seahub_settings.py
SERVICE_URL = "http://seafile.some.lan:8000/"
FILE_SERVER_ROOT = "http://seafile.some.lan:8082"
Add a connection to the memcache server
sudo tee -a /opt/seafile/conf/seahub_settings.py << EOF
CACHES = {
'default': {
'BACKEND': 'django_pylibmc.memcached.PyLibMCCache',
'LOCATION': '127.0.0.1:11211',
},
}
EOF
And restart to take affect
sudo systemctl restart seahub
You should now be able to login at http://some.server:8000/ with the credentials you created during the command line setup. If the web GUI works, but you can’t download files or the markdown editor doesn’t work as expected, check the FILE_SERVER_ROOT and look in the GUI’s System Admin section at those settings.
NFS Mount
Large amounts of data are best handled by a dedicated storage system and those are usually mounted over the network via NFS or a similar protocol. Seafile data should be stored in such a system, but you cannot mount the entire Seafile data folder over the network as it includes SQLite data that recommends2 against that. Nor can you mount each subdirectory seperately as they rely upon internal links that must be on the same filesystem.
The solution is to mount a network share in an alternate location and symlink the relative parts of the Seafile data directory to it.
sudo mount nfs.server:/exports/seafile /mnt/seafile
sudo systemctl stop seahub
sudo systemctl stop seafile
sudo mv /opt/seafile/seafile-data/httptemp \
/opt/seafile/seafile-data/storage \
/opt/seafile/seafile-data/tmpfiles \
/mnt/seafile/
sudo ln -s /mnt/seafile/httptemp /opt/seafile/seafile-data/
sudo ln -s /mnt/seafile/storage /opt/seafile/seafile-data/
sudo ln -s /mnt/seafile/tmpfiles /opt/seafile/seafile-data/
sudo chown -R seafile:seafile /mnt/seafile
Proxy
Say something about why caddy, then give the proxy file, then say HTTP/3 and enabling UDP 443 and seeing it in the logs. with firefox enabled. No special server config.
https://caddy.community/t/caddy-v2-and-seafile-server-on-a-root-server/9188/2
Note the change in the GUI for the 8082
https://www.seafile.com/en/download/#server
-
https://manual.seafile.com/deploy/start_seafile_at_system_bootup/ ↩︎
-
https://www.sqlite.org/faq.html#q5 [client]:https://help.seafile.com/syncing_client/install_linux_client/ [instructions]:https://manual.seafile.com/deploy/using_sqlite/ ↩︎
Feedback
Was this page helpful?
Glad to hear it! Please tell us how we can improve.
Sorry to hear that. Please tell us how we can improve.